@ragestudio/scylla-odm 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +246 -0
- package/_virtual/_rolldown/runtime.js +1 -26
- package/client.d.ts +1 -2
- package/client.js +1 -119
- package/cql_gen/create_keyspace.d.ts +1 -2
- package/cql_gen/create_keyspace.js +1 -14
- package/cql_gen/create_table.d.ts +1 -2
- package/cql_gen/create_table.js +1 -38
- package/document/index.d.ts +1 -2
- package/document/index.js +1 -63
- package/driver/index.d.ts +13 -10
- package/driver/index.js +1 -53
- package/driver/lib/auth/base-dse-authenticator.js +1 -58
- package/driver/lib/auth/dse-gssapi-auth-provider.js +1 -177
- package/driver/lib/auth/dse-plain-text-auth-provider.js +1 -90
- package/driver/lib/auth/gssapi-client.js +1 -113
- package/driver/lib/auth/index.d.ts +2 -3
- package/driver/lib/auth/index.js +1 -31
- package/driver/lib/auth/no-auth-provider.js +1 -52
- package/driver/lib/auth/plain-text-auth-provider.js +1 -66
- package/driver/lib/auth/provider.js +1 -59
- package/driver/lib/client-options.js +1 -230
- package/driver/lib/client.js +1 -982
- package/driver/lib/concurrent/index.d.ts +25 -1
- package/driver/lib/concurrent/index.js +1 -244
- package/driver/lib/connection.js +1 -578
- package/driver/lib/control-connection.js +1 -765
- package/driver/lib/datastax/graph/complex-type-helper.js +1 -60
- package/driver/lib/datastax/graph/custom-type-serializers.js +1 -279
- package/driver/lib/datastax/graph/graph-executor.js +1 -182
- package/driver/lib/datastax/graph/graph-serializer.js +1 -196
- package/driver/lib/datastax/graph/index.d.ts +63 -0
- package/driver/lib/datastax/graph/index.js +1 -67
- package/driver/lib/datastax/graph/options.js +1 -232
- package/driver/lib/datastax/graph/result-set.js +1 -125
- package/driver/lib/datastax/graph/structure.js +1 -147
- package/driver/lib/datastax/graph/type-serializers.js +1 -380
- package/driver/lib/datastax/graph/wrappers.js +1 -80
- package/driver/lib/datastax/index.d.ts +7 -0
- package/driver/lib/datastax/search/date-range.js +1 -380
- package/driver/lib/datastax/search/index.d.ts +49 -0
- package/driver/lib/datastax/search/index.js +1 -21
- package/driver/lib/encoder.js +1 -1584
- package/driver/lib/errors.js +1 -155
- package/driver/lib/execution-options.js +1 -453
- package/driver/lib/execution-profile.js +1 -222
- package/driver/lib/geometry/geometry.js +1 -101
- package/driver/lib/geometry/index.d.ts +49 -0
- package/driver/lib/geometry/index.js +1 -25
- package/driver/lib/geometry/line-string.js +1 -150
- package/driver/lib/geometry/point.js +1 -108
- package/driver/lib/geometry/polygon.js +1 -196
- package/driver/lib/host-connection-pool.js +1 -338
- package/driver/lib/host.js +1 -517
- package/driver/lib/insights-client.js +1 -355
- package/driver/lib/mapping/cache.js +1 -143
- package/driver/lib/mapping/doc-info-adapter.js +1 -123
- package/driver/lib/mapping/index.d.ts +2 -3
- package/driver/lib/mapping/index.js +1 -30
- package/driver/lib/mapping/mapper.js +1 -149
- package/driver/lib/mapping/mapping-handler.js +1 -258
- package/driver/lib/mapping/model-batch-item.js +1 -168
- package/driver/lib/mapping/model-batch-mapper.js +1 -113
- package/driver/lib/mapping/model-mapper.js +1 -276
- package/driver/lib/mapping/model-mapping-info.js +1 -120
- package/driver/lib/mapping/object-selector.js +1 -162
- package/driver/lib/mapping/q.js +1 -105
- package/driver/lib/mapping/query-generator.js +9 -285
- package/driver/lib/mapping/result-mapper.js +4 -73
- package/driver/lib/mapping/result.js +1 -103
- package/driver/lib/mapping/table-mappings.js +1 -103
- package/driver/lib/mapping/tree.js +1 -109
- package/driver/lib/metadata/aggregate.js +1 -69
- package/driver/lib/metadata/client-state.js +1 -80
- package/driver/lib/metadata/data-collection.js +1 -171
- package/driver/lib/metadata/event-debouncer.js +1 -113
- package/driver/lib/metadata/index.d.ts +2 -3
- package/driver/lib/metadata/index.js +1 -810
- package/driver/lib/metadata/materialized-view.js +1 -40
- package/driver/lib/metadata/schema-function.js +1 -88
- package/driver/lib/metadata/schema-index.js +1 -121
- package/driver/lib/metadata/schema-parser.js +1 -928
- package/driver/lib/metadata/table-metadata.js +1 -66
- package/driver/lib/metrics/client-metrics.js +1 -102
- package/driver/lib/metrics/default-metrics.js +1 -168
- package/driver/lib/metrics/index.d.ts +2 -3
- package/driver/lib/metrics/index.js +1 -20
- package/driver/lib/operation-state.js +1 -144
- package/driver/lib/policies/address-resolution.js +1 -108
- package/driver/lib/policies/index.d.ts +2 -3
- package/driver/lib/policies/index.js +1 -75
- package/driver/lib/policies/load-balancing.js +1 -630
- package/driver/lib/policies/reconnection.js +1 -118
- package/driver/lib/policies/retry.js +1 -226
- package/driver/lib/policies/speculative-execution.js +1 -102
- package/driver/lib/policies/timestamp-generation.js +1 -131
- package/driver/lib/prepare-handler.js +1 -203
- package/driver/lib/promise-utils.js +1 -125
- package/driver/lib/readers.js +1 -429
- package/driver/lib/request-execution.js +1 -301
- package/driver/lib/request-handler.js +1 -201
- package/driver/lib/requests.js +1 -390
- package/driver/lib/stream-id-stack.js +1 -154
- package/driver/lib/streams.js +1 -528
- package/driver/lib/token.js +1 -231
- package/driver/lib/tokenizer.js +1 -392
- package/driver/lib/tracker/index.d.ts +2 -3
- package/driver/lib/tracker/index.js +1 -17
- package/driver/lib/tracker/request-logger.js +1 -195
- package/driver/lib/tracker/request-tracker.js +1 -55
- package/driver/lib/types/big-decimal.js +1 -210
- package/driver/lib/types/duration.js +1 -415
- package/driver/lib/types/index.d.ts +2 -3
- package/driver/lib/types/index.js +1 -560
- package/driver/lib/types/inet-address.js +1 -179
- package/driver/lib/types/integer.js +1 -579
- package/driver/lib/types/local-date.js +1 -191
- package/driver/lib/types/local-time.js +1 -235
- package/driver/lib/types/mutable-long.js +1 -252
- package/driver/lib/types/protocol-version.js +1 -281
- package/driver/lib/types/result-set.js +1 -224
- package/driver/lib/types/result-stream.js +1 -105
- package/driver/lib/types/row.js +1 -64
- package/driver/lib/types/time-uuid.js +1 -326
- package/driver/lib/types/tuple.js +1 -77
- package/driver/lib/types/uuid.js +1 -112
- package/driver/lib/types/vector.js +1 -88
- package/driver/lib/types/version-number.js +1 -71
- package/driver/lib/utils.js +4 -1020
- package/driver/lib/writers.js +1 -256
- package/index.js +1 -11
- package/logger/index.d.ts +1 -2
- package/logger/index.js +1 -17
- package/model/index.d.ts +1 -2
- package/model/index.js +1 -44
- package/operations/countAll.d.ts +1 -2
- package/operations/countAll.js +1 -16
- package/operations/delete.d.ts +1 -2
- package/operations/delete.js +1 -11
- package/operations/find.d.ts +1 -2
- package/operations/find.js +1 -22
- package/operations/findOne.d.ts +1 -2
- package/operations/findOne.js +1 -17
- package/operations/sync.d.ts +1 -2
- package/operations/sync.js +1 -16
- package/operations/tableExists.d.ts +1 -2
- package/operations/tableExists.js +2 -15
- package/operations/update.d.ts +1 -2
- package/operations/update.js +1 -16
- package/package.js +1 -29
- package/package.json +2 -2
- package/schema/index.d.ts +1 -2
- package/schema/index.js +1 -16
- package/types.d.ts +1 -2
- package/types.js +1 -34
- package/utils/buildMapper.d.ts +1 -2
- package/utils/buildMapper.js +1 -13
- package/utils/delay.d.ts +1 -2
- package/utils/delay.js +1 -8
- package/utils/fillDefaults.d.ts +1 -2
- package/utils/fillDefaults.js +1 -18
- package/utils/loadModels.d.ts +1 -2
- package/utils/loadModels.js +1 -30
- package/utils/queryParser.d.ts +1 -2
- package/utils/queryParser.js +1 -94
- package/utils/typeChecker.d.ts +1 -2
- package/utils/typeChecker.js +1 -64
- package/client.js.map +0 -1
- package/cql_gen/create_keyspace.js.map +0 -1
- package/cql_gen/create_table.js.map +0 -1
- package/document/index.js.map +0 -1
- package/driver/index.js.map +0 -1
- package/driver/lib/auth/base-dse-authenticator.js.map +0 -1
- package/driver/lib/auth/dse-gssapi-auth-provider.js.map +0 -1
- package/driver/lib/auth/dse-plain-text-auth-provider.js.map +0 -1
- package/driver/lib/auth/gssapi-client.js.map +0 -1
- package/driver/lib/auth/index.js.map +0 -1
- package/driver/lib/auth/no-auth-provider.js.map +0 -1
- package/driver/lib/auth/plain-text-auth-provider.js.map +0 -1
- package/driver/lib/auth/provider.js.map +0 -1
- package/driver/lib/client-options.js.map +0 -1
- package/driver/lib/client.js.map +0 -1
- package/driver/lib/concurrent/index.js.map +0 -1
- package/driver/lib/connection.js.map +0 -1
- package/driver/lib/control-connection.js.map +0 -1
- package/driver/lib/datastax/graph/complex-type-helper.js.map +0 -1
- package/driver/lib/datastax/graph/custom-type-serializers.js.map +0 -1
- package/driver/lib/datastax/graph/graph-executor.js.map +0 -1
- package/driver/lib/datastax/graph/graph-serializer.js.map +0 -1
- package/driver/lib/datastax/graph/index.js.map +0 -1
- package/driver/lib/datastax/graph/options.js.map +0 -1
- package/driver/lib/datastax/graph/result-set.js.map +0 -1
- package/driver/lib/datastax/graph/structure.js.map +0 -1
- package/driver/lib/datastax/graph/type-serializers.js.map +0 -1
- package/driver/lib/datastax/graph/wrappers.js.map +0 -1
- package/driver/lib/datastax/search/date-range.js.map +0 -1
- package/driver/lib/datastax/search/index.js.map +0 -1
- package/driver/lib/encoder.js.map +0 -1
- package/driver/lib/errors.js.map +0 -1
- package/driver/lib/execution-options.js.map +0 -1
- package/driver/lib/execution-profile.js.map +0 -1
- package/driver/lib/geometry/geometry.js.map +0 -1
- package/driver/lib/geometry/index.js.map +0 -1
- package/driver/lib/geometry/line-string.js.map +0 -1
- package/driver/lib/geometry/point.js.map +0 -1
- package/driver/lib/geometry/polygon.js.map +0 -1
- package/driver/lib/host-connection-pool.js.map +0 -1
- package/driver/lib/host.js.map +0 -1
- package/driver/lib/insights-client.js.map +0 -1
- package/driver/lib/mapping/cache.js.map +0 -1
- package/driver/lib/mapping/doc-info-adapter.js.map +0 -1
- package/driver/lib/mapping/index.js.map +0 -1
- package/driver/lib/mapping/mapper.js.map +0 -1
- package/driver/lib/mapping/mapping-handler.js.map +0 -1
- package/driver/lib/mapping/model-batch-item.js.map +0 -1
- package/driver/lib/mapping/model-batch-mapper.js.map +0 -1
- package/driver/lib/mapping/model-mapper.js.map +0 -1
- package/driver/lib/mapping/model-mapping-info.js.map +0 -1
- package/driver/lib/mapping/object-selector.js.map +0 -1
- package/driver/lib/mapping/q.js.map +0 -1
- package/driver/lib/mapping/query-generator.js.map +0 -1
- package/driver/lib/mapping/result-mapper.js.map +0 -1
- package/driver/lib/mapping/result.js.map +0 -1
- package/driver/lib/mapping/table-mappings.js.map +0 -1
- package/driver/lib/mapping/tree.js.map +0 -1
- package/driver/lib/metadata/aggregate.js.map +0 -1
- package/driver/lib/metadata/client-state.js.map +0 -1
- package/driver/lib/metadata/data-collection.js.map +0 -1
- package/driver/lib/metadata/event-debouncer.js.map +0 -1
- package/driver/lib/metadata/index.js.map +0 -1
- package/driver/lib/metadata/materialized-view.js.map +0 -1
- package/driver/lib/metadata/schema-function.js.map +0 -1
- package/driver/lib/metadata/schema-index.js.map +0 -1
- package/driver/lib/metadata/schema-parser.js.map +0 -1
- package/driver/lib/metadata/table-metadata.js.map +0 -1
- package/driver/lib/metrics/client-metrics.js.map +0 -1
- package/driver/lib/metrics/default-metrics.js.map +0 -1
- package/driver/lib/metrics/index.js.map +0 -1
- package/driver/lib/operation-state.js.map +0 -1
- package/driver/lib/policies/address-resolution.js.map +0 -1
- package/driver/lib/policies/index.js.map +0 -1
- package/driver/lib/policies/load-balancing.js.map +0 -1
- package/driver/lib/policies/reconnection.js.map +0 -1
- package/driver/lib/policies/retry.js.map +0 -1
- package/driver/lib/policies/speculative-execution.js.map +0 -1
- package/driver/lib/policies/timestamp-generation.js.map +0 -1
- package/driver/lib/prepare-handler.js.map +0 -1
- package/driver/lib/promise-utils.js.map +0 -1
- package/driver/lib/readers.js.map +0 -1
- package/driver/lib/request-execution.js.map +0 -1
- package/driver/lib/request-handler.js.map +0 -1
- package/driver/lib/requests.js.map +0 -1
- package/driver/lib/stream-id-stack.js.map +0 -1
- package/driver/lib/streams.js.map +0 -1
- package/driver/lib/token.js.map +0 -1
- package/driver/lib/tokenizer.js.map +0 -1
- package/driver/lib/tracker/index.js.map +0 -1
- package/driver/lib/tracker/request-logger.js.map +0 -1
- package/driver/lib/tracker/request-tracker.js.map +0 -1
- package/driver/lib/types/big-decimal.js.map +0 -1
- package/driver/lib/types/duration.js.map +0 -1
- package/driver/lib/types/index.js.map +0 -1
- package/driver/lib/types/inet-address.js.map +0 -1
- package/driver/lib/types/integer.js.map +0 -1
- package/driver/lib/types/local-date.js.map +0 -1
- package/driver/lib/types/local-time.js.map +0 -1
- package/driver/lib/types/mutable-long.js.map +0 -1
- package/driver/lib/types/protocol-version.js.map +0 -1
- package/driver/lib/types/result-set.js.map +0 -1
- package/driver/lib/types/result-stream.js.map +0 -1
- package/driver/lib/types/row.js.map +0 -1
- package/driver/lib/types/time-uuid.js.map +0 -1
- package/driver/lib/types/tuple.js.map +0 -1
- package/driver/lib/types/uuid.js.map +0 -1
- package/driver/lib/types/vector.js.map +0 -1
- package/driver/lib/types/version-number.js.map +0 -1
- package/driver/lib/utils.js.map +0 -1
- package/driver/lib/writers.js.map +0 -1
- package/index.js.map +0 -1
- package/logger/index.js.map +0 -1
- package/model/index.js.map +0 -1
- package/operations/countAll.js.map +0 -1
- package/operations/delete.js.map +0 -1
- package/operations/find.js.map +0 -1
- package/operations/findOne.js.map +0 -1
- package/operations/sync.js.map +0 -1
- package/operations/tableExists.js.map +0 -1
- package/operations/update.js.map +0 -1
- package/package.js.map +0 -1
- package/schema/index.js.map +0 -1
- package/types.js.map +0 -1
- package/utils/buildMapper.js.map +0 -1
- package/utils/delay.js.map +0 -1
- package/utils/fillDefaults.js.map +0 -1
- package/utils/loadModels.js.map +0 -1
- package/utils/queryParser.js.map +0 -1
- package/utils/typeChecker.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# @ragestudio/scylla-odm
|
|
2
|
+
|
|
3
|
+
> A lightweight ODM for ScyllaDB and Cassandra.
|
|
4
|
+
|
|
5
|
+
> **Warning:** under active development, not production-ready.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## why this exists
|
|
10
|
+
|
|
11
|
+
Most of (not existent) Node.js ODMs for ScyllaDB/Cassandra rely on the official `cassandra-driver`.
|
|
12
|
+
|
|
13
|
+
The official `cassandra-driver` ships a built-in mapper, but it has no
|
|
14
|
+
TypeScript support or a friendly interface.
|
|
15
|
+
You define your columns with plain strings and get
|
|
16
|
+
plain objects back — no autocomplete, no type checking, no safety net.
|
|
17
|
+
|
|
18
|
+
This ODM is built on top of a modified `cassandra-driver` and adds:
|
|
19
|
+
|
|
20
|
+
- **Type-safe schemas** — your column types are inferred, so `find`,
|
|
21
|
+
`create`, and `save` all know the shape of your data
|
|
22
|
+
- **ODM Methods** — easier & friendly API for interacting with your data
|
|
23
|
+
- **Full TypeScript support** — autocomplete, type checking, and inference
|
|
24
|
+
from schema to model to document
|
|
25
|
+
- **MongoDB-style query operators** — `$gt`, `$in`, `$lte`, etc., all typed
|
|
26
|
+
|
|
27
|
+
We also stripped out everything you probably never use (DataStax Insights,
|
|
28
|
+
metrics, heavy dependencies, and other services) and applied a bunch of performance patches on
|
|
29
|
+
top of the driver itself.
|
|
30
|
+
|
|
31
|
+
The result is a leaner driver with less overhead, fewer timers, and better
|
|
32
|
+
memory usage.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## install
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm install @ragestudio/scylla-odm
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## quick start
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import Client, { Schema, Model, ColumnTypes } from "@ragestudio/scylla-odm";
|
|
48
|
+
import type { Column } from "@ragestudio/scylla-odm/types";
|
|
49
|
+
|
|
50
|
+
// 1. define a schema
|
|
51
|
+
const userSchema = new Schema(
|
|
52
|
+
{
|
|
53
|
+
table_name: "users",
|
|
54
|
+
keys: ["id"], // partition key and clustering keys
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: { type: ColumnTypes.Int, required: true } as Column<number>,
|
|
58
|
+
name: { type: ColumnTypes.Text, required: true } as Column<string>,
|
|
59
|
+
email: { type: ColumnTypes.Text, required: true } as Column<string>,
|
|
60
|
+
age: { type: ColumnTypes.Int } as Column<number>,
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// 2. create a model
|
|
65
|
+
const User = new Model("User", userSchema);
|
|
66
|
+
|
|
67
|
+
// 3. create a client
|
|
68
|
+
const client = new Client({
|
|
69
|
+
contactPoints: ["127.0.0.1"],
|
|
70
|
+
localDataCenter: "datacenter1",
|
|
71
|
+
keyspace: "myapp",
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// 4. initialize and connect
|
|
75
|
+
await client.initialize();
|
|
76
|
+
|
|
77
|
+
// 4. create and save documents
|
|
78
|
+
const user = User.create({
|
|
79
|
+
id: 1234,
|
|
80
|
+
name: "Alice",
|
|
81
|
+
email: "alice@example.com",
|
|
82
|
+
age: 30,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
await user.save();
|
|
86
|
+
|
|
87
|
+
// 5. query
|
|
88
|
+
const found = await User.findOne({ id: 1234 });
|
|
89
|
+
console.log(found?.name); // "Alice"
|
|
90
|
+
|
|
91
|
+
// 6. shutdown
|
|
92
|
+
await client.shutdown();
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## schema
|
|
98
|
+
|
|
99
|
+
A schema describes a table: its name, primary keys, and columns.
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
const productSchema = new Schema(
|
|
103
|
+
{
|
|
104
|
+
table_name: "products",
|
|
105
|
+
keys: [["category"], "id"], // compound partition key
|
|
106
|
+
clustering_order: { created_at: "desc" }, // optional
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
category: { type: ColumnTypes.Text, required: true } as Column<string>,
|
|
110
|
+
id: { type: ColumnTypes.Uuid, required: true } as Column<string>,
|
|
111
|
+
title: { type: ColumnTypes.Text, required: true } as Column<string>,
|
|
112
|
+
price: { type: ColumnTypes.Double, required: true } as Column<number>,
|
|
113
|
+
created_at: { type: ColumnTypes.Timestamp } as Column<Date>,
|
|
114
|
+
},
|
|
115
|
+
);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## model
|
|
121
|
+
|
|
122
|
+
A model wraps a schema and provides the query interface.
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
const Product = new Model("Product", productSchema);
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### methods
|
|
129
|
+
|
|
130
|
+
| method | description |
|
|
131
|
+
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
132
|
+
| `create(data)` / `obj()` | create a new document (not persisted yet) |
|
|
133
|
+
| `find(query, options?)` | find documents matching the query, returns an array of documents |
|
|
134
|
+
| `findOne(query, options?)` | find a single document, if no document is found, returns `null`. Due the mapper limitation, note that all partition and clustering keys must be defined in order to use this method. |
|
|
135
|
+
| |
|
|
136
|
+
| `update(query)` | update documents matching the query |
|
|
137
|
+
| `delete(query)` | delete documents matching the query |
|
|
138
|
+
| `countAll()` | count all documents in the table |
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## document
|
|
143
|
+
|
|
144
|
+
Documents are the objects you work with. They carry the data and a few helpers.
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
const product = Product.create({
|
|
148
|
+
category: "books",
|
|
149
|
+
id: uuid(),
|
|
150
|
+
title: "ODM 101",
|
|
151
|
+
price: 29.99,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
await product.save(); // persist to ScyllaDB
|
|
155
|
+
await product.delete(); // delete from ScyllaDB
|
|
156
|
+
product.toRaw(); // plain object without internal fields
|
|
157
|
+
product.getChangedFields(original); // diff between current and original data
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## query operators
|
|
163
|
+
|
|
164
|
+
Use MongoDB-style operators in your queries:
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
// exact match
|
|
168
|
+
await User.find({ name: "Alice" });
|
|
169
|
+
|
|
170
|
+
// comparison operators
|
|
171
|
+
await Product.find({ price: { $gt: 10, $lte: 50 } });
|
|
172
|
+
|
|
173
|
+
// list matching
|
|
174
|
+
await User.find({ age: { $in: [25, 30, 35] } });
|
|
175
|
+
|
|
176
|
+
// sorting
|
|
177
|
+
await Product.find({ category: "books" }, { $orderby: { created_at: "desc" } });
|
|
178
|
+
|
|
179
|
+
// raw results (skip document wrapping)
|
|
180
|
+
const raw = await Product.find({ category: "books" }, { raw: true });
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## configuration
|
|
186
|
+
|
|
187
|
+
```ts
|
|
188
|
+
const client = new Client({
|
|
189
|
+
modelsPath: "./db",
|
|
190
|
+
contactPoints: ["127.0.0.1"],
|
|
191
|
+
localDataCenter: "datacenter1",
|
|
192
|
+
keyspace: "myapp",
|
|
193
|
+
port: 9042,
|
|
194
|
+
maxRetries: 3,
|
|
195
|
+
retryDelay: 1000,
|
|
196
|
+
pooling: {
|
|
197
|
+
coreConnectionsPerHost: {
|
|
198
|
+
local: 2,
|
|
199
|
+
},
|
|
200
|
+
maxRequestsPerConnection: 1024,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
You can also configure via environment variables:
|
|
206
|
+
|
|
207
|
+
| variable | default |
|
|
208
|
+
| -------------------------- | ------------------ |
|
|
209
|
+
| `SCYLLA_CONTACT_POINTS` | `127.0.0.1` |
|
|
210
|
+
| `SCYLLA_LOCAL_DATA_CENTER` | `datacenter1` |
|
|
211
|
+
| `SCYLLA_KEYSPACE` | `default_keyspace` |
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## about the driver
|
|
216
|
+
|
|
217
|
+
This package ships a modified version of the `cassandra-driver`
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## license
|
|
222
|
+
|
|
223
|
+
This project is licensed under the [MIT license](https://opensource.org/licenses/MIT).
|
|
224
|
+
|
|
225
|
+
The bundled `cassandra-driver` is licensed under the
|
|
226
|
+
[Apache License, Version 2.0](src/driver/LICENSE.txt).
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
Apache Cassandra NodeJS Driver
|
|
230
|
+
Copyright 2013 The Apache Software Foundation
|
|
231
|
+
|
|
232
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
233
|
+
you may not use this file except in compliance with the License.
|
|
234
|
+
You may obtain a copy of the License at
|
|
235
|
+
|
|
236
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
237
|
+
|
|
238
|
+
Unless required by applicable law or agreed to in writing, software
|
|
239
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
240
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
241
|
+
See the License for the specific language governing permissions and
|
|
242
|
+
limitations under the License.
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
See [`src/driver/LICENSE.txt`](src/driver/LICENSE.txt) and
|
|
246
|
+
[`src/driver/NOTICE.txt`](src/driver/NOTICE.txt) for the full legal text.
|
|
@@ -1,26 +1 @@
|
|
|
1
|
-
|
|
2
|
-
//#region \0rolldown/runtime.js
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
12
|
-
key = keys[i];
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
14
|
-
get: ((k) => from[k]).bind(null, key),
|
|
15
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
21
|
-
value: mod,
|
|
22
|
-
enumerable: true
|
|
23
|
-
}) : target, mod));
|
|
24
|
-
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
25
|
-
//#endregion
|
|
26
|
-
export { __commonJSMin, __require, __toESM };
|
|
1
|
+
var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};export{t as __exportAll};
|
package/client.d.ts
CHANGED
package/client.js
CHANGED
|
@@ -1,119 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { require_driver } from "./driver/index.js";
|
|
3
|
-
import { Model } from "./model/index.js";
|
|
4
|
-
import { Logger } from "./logger/index.js";
|
|
5
|
-
import loadModels_default from "./utils/loadModels.js";
|
|
6
|
-
import buildMapper_default from "./utils/buildMapper.js";
|
|
7
|
-
import delay from "./utils/delay.js";
|
|
8
|
-
import path from "node:path";
|
|
9
|
-
//#region src/client.ts
|
|
10
|
-
var import_driver = /* @__PURE__ */ __toESM(require_driver(), 1);
|
|
11
|
-
const DEFAULT_MAX_RETRIES = 3;
|
|
12
|
-
const DEFAULT_RETRY_DELAY = 1e3;
|
|
13
|
-
const { SCYLLA_CONTACT_POINTS, SCYLLA_LOCAL_DATA_CENTER, SCYLLA_KEYSPACE } = process.env;
|
|
14
|
-
var Client = class {
|
|
15
|
-
constructor(config = {}) {
|
|
16
|
-
if (globalThis.__scylla_client) throw new Error("An instance of Scylla Client is already initialized");
|
|
17
|
-
this.config = {
|
|
18
|
-
modelsPath: path.resolve(process.cwd(), "db"),
|
|
19
|
-
contactPoints: config.contactPoints ?? SCYLLA_CONTACT_POINTS?.split(",") ?? ["127.0.0.1"],
|
|
20
|
-
localDataCenter: config.localDataCenter ?? SCYLLA_LOCAL_DATA_CENTER ?? "datacenter1",
|
|
21
|
-
keyspace: config.keyspace ?? SCYLLA_KEYSPACE ?? "default_keyspace",
|
|
22
|
-
port: 9042,
|
|
23
|
-
maxRetries: DEFAULT_MAX_RETRIES,
|
|
24
|
-
retryDelay: DEFAULT_RETRY_DELAY,
|
|
25
|
-
...config
|
|
26
|
-
};
|
|
27
|
-
const clientOptions = {
|
|
28
|
-
contactPoints: this.config.contactPoints,
|
|
29
|
-
localDataCenter: this.config.localDataCenter,
|
|
30
|
-
keyspace: this.config.keyspace,
|
|
31
|
-
protocolOptions: { port: this.config.port }
|
|
32
|
-
};
|
|
33
|
-
if (this.config.pooling) clientOptions.pooling = this.config.pooling;
|
|
34
|
-
this.driver = new import_driver.Client(clientOptions);
|
|
35
|
-
}
|
|
36
|
-
config;
|
|
37
|
-
driver;
|
|
38
|
-
mapper;
|
|
39
|
-
models = /* @__PURE__ */ new Map();
|
|
40
|
-
model(name) {
|
|
41
|
-
return this.models.get(name);
|
|
42
|
-
}
|
|
43
|
-
logger = new Logger();
|
|
44
|
-
async initialize(options = {}) {
|
|
45
|
-
let models;
|
|
46
|
-
try {
|
|
47
|
-
models = await loadModels_default(this.config.modelsPath);
|
|
48
|
-
} catch (error) {
|
|
49
|
-
throw new Error(`Failed to load models: ${error.message}`);
|
|
50
|
-
}
|
|
51
|
-
models = models.filter((schema) => schema instanceof Model);
|
|
52
|
-
this.mapper = new import_driver.mapping.Mapper(this.driver, { models: buildMapper_default(models) });
|
|
53
|
-
globalThis.__scylla_client = this;
|
|
54
|
-
this.logger.log("Connecting...");
|
|
55
|
-
await this.connectWithRetry();
|
|
56
|
-
this.logger.log("Connected");
|
|
57
|
-
for (let model of models) {
|
|
58
|
-
this.models.set(model.name, model);
|
|
59
|
-
if (options?.sync === true) await model._sync();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async shutdown() {
|
|
63
|
-
try {
|
|
64
|
-
await this.driver.shutdown();
|
|
65
|
-
this.logger.log("connection closed");
|
|
66
|
-
delete globalThis.__scylla_client;
|
|
67
|
-
} catch (error) {
|
|
68
|
-
this.logger.error("error shutting down connection:", error);
|
|
69
|
-
throw error;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
async connectWithRetry() {
|
|
73
|
-
let lastError = null;
|
|
74
|
-
for (let attempt = 1; attempt <= this.config.maxRetries; attempt++) try {
|
|
75
|
-
await this.driver.connect();
|
|
76
|
-
return;
|
|
77
|
-
} catch (error) {
|
|
78
|
-
lastError = error;
|
|
79
|
-
this.logger.warn(`Connection attempt ${attempt} failed: ${error.message}`);
|
|
80
|
-
if (attempt < this.config.maxRetries) {
|
|
81
|
-
this.logger.log(`Retrying in ${this.config.retryDelay}ms...`);
|
|
82
|
-
await delay(this.config.retryDelay);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
throw new Error(`Failed to connect to ScyllaDB after ${this.config.maxRetries} attempts: ${lastError?.message}`);
|
|
86
|
-
}
|
|
87
|
-
async executeWithRetry(operation, operationName = "operation") {
|
|
88
|
-
let lastError = null;
|
|
89
|
-
for (let attempt = 1; attempt <= this.config.maxRetries; attempt++) try {
|
|
90
|
-
return await operation();
|
|
91
|
-
} catch (error) {
|
|
92
|
-
lastError = error;
|
|
93
|
-
if (this.isRetryableError(error) && attempt < this.config.maxRetries) {
|
|
94
|
-
this.logger.warn(`Operation ${operationName} attempt ${attempt} failed: ${error.message}`);
|
|
95
|
-
this.logger.log(`Retrying in ${this.config.retryDelay}ms...`);
|
|
96
|
-
await delay(this.config.retryDelay);
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
throw error;
|
|
100
|
-
}
|
|
101
|
-
throw new Error(`Operation ${operationName} failed after ${this.config.maxRetries} attempts: ${lastError?.message}`);
|
|
102
|
-
}
|
|
103
|
-
isRetryableError(error) {
|
|
104
|
-
const retryableMessages = [
|
|
105
|
-
"timeout",
|
|
106
|
-
"connection",
|
|
107
|
-
"network",
|
|
108
|
-
"unavailable",
|
|
109
|
-
"overloaded",
|
|
110
|
-
"no hosts available"
|
|
111
|
-
];
|
|
112
|
-
const errorMessage = error.message?.toLowerCase() || "";
|
|
113
|
-
return retryableMessages.some((msg) => errorMessage.includes(msg));
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
//#endregion
|
|
117
|
-
export { Client, Client as default };
|
|
118
|
-
|
|
119
|
-
//# sourceMappingURL=client.js.map
|
|
1
|
+
import e from"./driver/index.js";import{Model as t}from"./model/index.js";import{Logger as n}from"./logger/index.js";import r from"./utils/loadModels.js";import i from"./utils/buildMapper.js";import a from"./utils/delay.js";import o from"node:path";const{SCYLLA_CONTACT_POINTS:s,SCYLLA_LOCAL_DATA_CENTER:c,SCYLLA_KEYSPACE:l}=process.env;var u=class{constructor(t={}){if(globalThis.__scylla_client)throw Error(`An instance of Scylla Client is already initialized`);this.config={modelsPath:o.resolve(process.cwd(),`db`),contactPoints:t.contactPoints??s?.split(`,`)??[`127.0.0.1`],localDataCenter:t.localDataCenter??c??`datacenter1`,keyspace:t.keyspace??l??`default_keyspace`,port:9042,maxRetries:3,retryDelay:1e3,...t};let n={contactPoints:this.config.contactPoints,localDataCenter:this.config.localDataCenter,keyspace:this.config.keyspace,protocolOptions:{port:this.config.port}};this.config.pooling&&(n.pooling=this.config.pooling),this.driver=new e.Client(n)}config;driver;mapper;models=new Map;model(e){return this.models.get(e)}logger=new n;async initialize(n={}){let a;try{a=await r(this.config.modelsPath)}catch(e){throw Error(`Failed to load models: ${e.message}`)}a=a.filter(e=>e instanceof t),this.mapper=new e.mapping.Mapper(this.driver,{models:i(a)}),globalThis.__scylla_client=this,this.logger.log(`Connecting...`),await this.connectWithRetry(),this.logger.log(`Connected`);for(let e of a)this.models.set(e.name,e),n?.sync===!0&&await e._sync()}async shutdown(){try{await this.driver.shutdown(),this.logger.log(`connection closed`),delete globalThis.__scylla_client}catch(e){throw this.logger.error(`error shutting down connection:`,e),e}}async connectWithRetry(){let e=null;for(let t=1;t<=this.config.maxRetries;t++)try{await this.driver.connect();return}catch(n){e=n,this.logger.warn(`Connection attempt ${t} failed: ${n.message}`),t<this.config.maxRetries&&(this.logger.log(`Retrying in ${this.config.retryDelay}ms...`),await a(this.config.retryDelay))}throw Error(`Failed to connect to ScyllaDB after ${this.config.maxRetries} attempts: ${e?.message}`)}async executeWithRetry(e,t=`operation`){let n=null;for(let r=1;r<=this.config.maxRetries;r++)try{return await e()}catch(e){if(n=e,this.isRetryableError(e)&&r<this.config.maxRetries){this.logger.warn(`Operation ${t} attempt ${r} failed: ${e.message}`),this.logger.log(`Retrying in ${this.config.retryDelay}ms...`),await a(this.config.retryDelay);continue}throw e}throw Error(`Operation ${t} failed after ${this.config.maxRetries} attempts: ${n?.message}`)}isRetryableError(e){let t=[`timeout`,`connection`,`network`,`unavailable`,`overloaded`,`no hosts available`],n=e.message?.toLowerCase()||``;return t.some(e=>n.includes(e))}};export{u as Client,u as default};
|
|
@@ -1,14 +1 @@
|
|
|
1
|
-
|
|
2
|
-
function createKeyspace(options) {
|
|
3
|
-
let clause = {};
|
|
4
|
-
if (options.replication) clause = options.replication;
|
|
5
|
-
else clause = {
|
|
6
|
-
strategy: "SimpleStrategy",
|
|
7
|
-
options: { replication_factor: "1" }
|
|
8
|
-
};
|
|
9
|
-
return `CREATE KEYSPACE IF NOT EXISTS ${options.keyspace} WITH REPLICATION = ${JSON.stringify(clause)};`;
|
|
10
|
-
}
|
|
11
|
-
//#endregion
|
|
12
|
-
export { createKeyspace as default };
|
|
13
|
-
|
|
14
|
-
//# sourceMappingURL=create_keyspace.js.map
|
|
1
|
+
function e(e){let t={};return t=e.replication?e.replication:{strategy:`SimpleStrategy`,options:{replication_factor:`1`}},`CREATE KEYSPACE IF NOT EXISTS ${e.keyspace} WITH REPLICATION = ${JSON.stringify(t)};`}export{e as default};
|
|
@@ -3,5 +3,4 @@ import { Model } from "../model/index.js";
|
|
|
3
3
|
//#region src/cql_gen/create_table.d.ts
|
|
4
4
|
declare function export_default(model: Model): string;
|
|
5
5
|
//#endregion
|
|
6
|
-
export { export_default as default };
|
|
7
|
-
//# sourceMappingURL=create_table.d.ts.map
|
|
6
|
+
export { export_default as default };
|
package/cql_gen/create_table.js
CHANGED
|
@@ -1,38 +1 @@
|
|
|
1
|
-
|
|
2
|
-
function create_table_default(model) {
|
|
3
|
-
const desc = model.schema;
|
|
4
|
-
const tableName = desc.table_name;
|
|
5
|
-
const keyspace = model.client.config.keyspace;
|
|
6
|
-
const fields = desc.fields;
|
|
7
|
-
const key = desc.keys;
|
|
8
|
-
const clusteringOrder = desc.clustering_order;
|
|
9
|
-
let columnsDef = "";
|
|
10
|
-
for (const fieldName in fields) {
|
|
11
|
-
const field = fields[fieldName];
|
|
12
|
-
const typeStr = typeof field === "string" ? field : field?.type;
|
|
13
|
-
if (!typeStr) throw new Error(`Invalid field type for "${fieldName}" in model "${tableName}"`);
|
|
14
|
-
columnsDef += `"${fieldName}" ${typeStr.toUpperCase()}, `;
|
|
15
|
-
}
|
|
16
|
-
let pkDef = "";
|
|
17
|
-
if (typeof key === "string") pkDef = `"${key}"`;
|
|
18
|
-
else if (Array.isArray(key) && key.length > 0) {
|
|
19
|
-
const first = key[0];
|
|
20
|
-
if (Array.isArray(first)) pkDef = `(${first.map((k) => `"${k}"`).join(", ")})`;
|
|
21
|
-
else pkDef = `"${first}"`;
|
|
22
|
-
for (let i = 1; i < key.length; i++) pkDef += `, "${key[i]}"`;
|
|
23
|
-
} else throw new Error(`Missing or invalid primary key in model "${tableName}"`);
|
|
24
|
-
let clusterClause = "";
|
|
25
|
-
if (clusteringOrder) {
|
|
26
|
-
let orderDef = "";
|
|
27
|
-
for (const col in clusteringOrder) {
|
|
28
|
-
if (orderDef !== "") orderDef += ", ";
|
|
29
|
-
orderDef += `"${col}" ${clusteringOrder[col].toUpperCase()}`;
|
|
30
|
-
}
|
|
31
|
-
if (orderDef !== "") clusterClause = ` WITH CLUSTERING ORDER BY (${orderDef})`;
|
|
32
|
-
}
|
|
33
|
-
return `CREATE TABLE IF NOT EXISTS ${keyspace}.${tableName} (${columnsDef}PRIMARY KEY (${pkDef}))${clusterClause}`;
|
|
34
|
-
}
|
|
35
|
-
//#endregion
|
|
36
|
-
export { create_table_default as default };
|
|
37
|
-
|
|
38
|
-
//# sourceMappingURL=create_table.js.map
|
|
1
|
+
function e(e){let t=e.schema,n=t.table_name,r=e.client.config.keyspace,i=t.fields,a=t.keys,o=t.clustering_order,s=``;for(let e in i){let t=i[e],r=typeof t==`string`?t:t?.type;if(!r)throw Error(`Invalid field type for "${e}" in model "${n}"`);s+=`"${e}" ${r.toUpperCase()}, `}let c=``;if(typeof a==`string`)c=`"${a}"`;else if(Array.isArray(a)&&a.length>0){let e=a[0];c=Array.isArray(e)?`(${e.map(e=>`"${e}"`).join(`, `)})`:`"${e}"`;for(let e=1;e<a.length;e++)c+=`, "${a[e]}"`}else throw Error(`Missing or invalid primary key in model "${n}"`);let l=``;if(o){let e=``;for(let t in o)e!==``&&(e+=`, `),e+=`"${t}" ${o[t].toUpperCase()}`;e!==``&&(l=` WITH CLUSTERING ORDER BY (${e})`)}return`CREATE TABLE IF NOT EXISTS ${r}.${n} (${s}PRIMARY KEY (${c}))${l}`}export{e as default};
|
package/document/index.d.ts
CHANGED
package/document/index.js
CHANGED
|
@@ -1,63 +1 @@
|
|
|
1
|
-
|
|
2
|
-
var Document = class {
|
|
3
|
-
constructor(data, model) {
|
|
4
|
-
if (data == null) throw new Error("Cannot create Document with null or undefined data");
|
|
5
|
-
if (typeof data !== "object" || Array.isArray(data)) throw new Error("Document data must be an object");
|
|
6
|
-
Object.assign(this, data);
|
|
7
|
-
Object.defineProperty(this, "_model", {
|
|
8
|
-
value: model,
|
|
9
|
-
enumerable: false,
|
|
10
|
-
writable: false,
|
|
11
|
-
configurable: false
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
_model;
|
|
15
|
-
async save() {
|
|
16
|
-
try {
|
|
17
|
-
const data = this.toRaw();
|
|
18
|
-
return await this._model.update(data);
|
|
19
|
-
} catch (error) {
|
|
20
|
-
throw new Error(`Failed to save document: ${error.message}`);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
async delete() {
|
|
24
|
-
try {
|
|
25
|
-
return await this._model.delete(this.toRaw());
|
|
26
|
-
} catch (error) {
|
|
27
|
-
throw new Error(`Failed to delete document: ${error.message}`);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
toRaw() {
|
|
31
|
-
const raw = {};
|
|
32
|
-
for (const key in this) {
|
|
33
|
-
if (key === "_model") continue;
|
|
34
|
-
if (this.propertyIsEnumerable(key)) {
|
|
35
|
-
const value = this[key];
|
|
36
|
-
try {
|
|
37
|
-
JSON.stringify(value);
|
|
38
|
-
raw[key] = value;
|
|
39
|
-
} catch (error) {
|
|
40
|
-
raw[key] = String(value);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return raw;
|
|
45
|
-
}
|
|
46
|
-
isValid() {
|
|
47
|
-
try {
|
|
48
|
-
return true;
|
|
49
|
-
} catch {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
getChangedFields(original) {
|
|
54
|
-
const current = this.toRaw();
|
|
55
|
-
const changed = [];
|
|
56
|
-
for (const key in current) if (!(key in original) || current[key] !== original[key]) changed.push(key);
|
|
57
|
-
return changed;
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
//#endregion
|
|
61
|
-
export { Document, Document as default };
|
|
62
|
-
|
|
63
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
var e=class{constructor(e,t){if(e==null)throw Error(`Cannot create Document with null or undefined data`);if(typeof e!=`object`||Array.isArray(e))throw Error(`Document data must be an object`);Object.assign(this,e),Object.defineProperty(this,`_model`,{value:t,enumerable:!1,writable:!1,configurable:!1})}_model;async save(){try{let e=this.toRaw();return await this._model.update(e)}catch(e){throw Error(`Failed to save document: ${e.message}`)}}async delete(){try{return await this._model.delete(this.toRaw())}catch(e){throw Error(`Failed to delete document: ${e.message}`)}}toRaw(){let e={};for(let t in this)if(t!==`_model`&&this.propertyIsEnumerable(t)){let n=this[t];try{JSON.stringify(n),e[t]=n}catch{e[t]=String(n)}}return e}isValid(){try{return!0}catch{return!1}}getChangedFields(e){let t=this.toRaw(),n=[];for(let r in t)(!(r in e)||t[r]!==e[r])&&n.push(r);return n}};export{e as Document,e as default};
|
package/driver/index.d.ts
CHANGED
|
@@ -4,17 +4,21 @@ import { policies } from "./lib/policies/index.js";
|
|
|
4
4
|
import { metrics } from "./lib/metrics/index.js";
|
|
5
5
|
import { tracker } from "./lib/tracker/index.js";
|
|
6
6
|
import { metadata } from "./lib/metadata/index.js";
|
|
7
|
+
import { concurrent } from "./lib/concurrent/index.js";
|
|
7
8
|
import { mapping } from "./lib/mapping/index.js";
|
|
8
|
-
import
|
|
9
|
-
import * as
|
|
9
|
+
import { geometry } from "./lib/geometry/index.js";
|
|
10
|
+
import * as events$1 from "events";
|
|
11
|
+
import * as tls$1 from "tls";
|
|
10
12
|
|
|
11
|
-
//#region driver/index.d.ts
|
|
13
|
+
//#region src/driver/index.d.ts
|
|
14
|
+
declare const version: number;
|
|
15
|
+
declare function defaultOptions(): ClientOptions;
|
|
12
16
|
type ValueCallback<T> = (err: Error, val: T) => void;
|
|
13
17
|
type EmptyCallback = (err: Error) => void;
|
|
14
18
|
type ArrayOrObject = any[] | {
|
|
15
19
|
[key: string]: any;
|
|
16
20
|
};
|
|
17
|
-
declare class Client extends events.EventEmitter {
|
|
21
|
+
declare class Client extends events$1.EventEmitter {
|
|
18
22
|
hosts: HostMap;
|
|
19
23
|
keyspace: string;
|
|
20
24
|
metadata: metadata.Metadata;
|
|
@@ -39,7 +43,7 @@ declare class Client extends events.EventEmitter {
|
|
|
39
43
|
eachRow(query: string, params: ArrayOrObject, options: QueryOptions, rowCallback: (n: number, row: types.Row) => void, callback?: ValueCallback<types.ResultSet>): void;
|
|
40
44
|
eachRow(query: string, params: ArrayOrObject, rowCallback: (n: number, row: types.Row) => void, callback?: ValueCallback<types.ResultSet>): void;
|
|
41
45
|
eachRow(query: string, rowCallback: (n: number, row: types.Row) => void): void;
|
|
42
|
-
stream(query: string, params?: ArrayOrObject, options?: QueryOptions, callback?: EmptyCallback): events.EventEmitter;
|
|
46
|
+
stream(query: string, params?: ArrayOrObject, options?: QueryOptions, callback?: EmptyCallback): events$1.EventEmitter;
|
|
43
47
|
batch(queries: Array<string | {
|
|
44
48
|
query: string;
|
|
45
49
|
params?: ArrayOrObject;
|
|
@@ -57,14 +61,14 @@ declare class Client extends events.EventEmitter {
|
|
|
57
61
|
getReplicas(keyspace: string, token: Buffer): Host[];
|
|
58
62
|
getState(): metadata.ClientState;
|
|
59
63
|
}
|
|
60
|
-
interface HostMap extends events.EventEmitter {
|
|
64
|
+
interface HostMap extends events$1.EventEmitter {
|
|
61
65
|
length: number;
|
|
62
66
|
forEach(callback: (value: Host, key: string) => void): void;
|
|
63
67
|
get(key: string): Host;
|
|
64
68
|
keys(): string[];
|
|
65
69
|
values(): Host[];
|
|
66
70
|
}
|
|
67
|
-
interface Host extends events.EventEmitter {
|
|
71
|
+
interface Host extends events$1.EventEmitter {
|
|
68
72
|
address: string;
|
|
69
73
|
cassandraVersion: string;
|
|
70
74
|
datacenter: string;
|
|
@@ -159,7 +163,7 @@ interface ClientOptions {
|
|
|
159
163
|
readTimeout?: number;
|
|
160
164
|
tcpNoDelay?: boolean;
|
|
161
165
|
};
|
|
162
|
-
sslOptions?: tls.ConnectionOptions;
|
|
166
|
+
sslOptions?: tls$1.ConnectionOptions;
|
|
163
167
|
}
|
|
164
168
|
interface QueryOptions {
|
|
165
169
|
autoPage?: boolean;
|
|
@@ -297,5 +301,4 @@ declare namespace token {
|
|
|
297
301
|
}
|
|
298
302
|
}
|
|
299
303
|
//#endregion
|
|
300
|
-
export { Client, ClientOptions, EmptyCallback, ExecutionOptions, Host, HostMap, ValueCallback, errors, token };
|
|
301
|
-
//# sourceMappingURL=index.d.ts.map
|
|
304
|
+
export { ArrayOrObject, Client, ClientOptions, DseClientOptions, EmptyCallback, ExecutionOptions, ExecutionProfile, GraphOptions, GraphQueryOptions, Host, HostMap, QueryOptions, ValueCallback, auth, concurrent, defaultOptions, errors, geometry, mapping, metadata, metrics, policies, token, tracker, types, version };
|
package/driver/index.js
CHANGED
|
@@ -1,53 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { require_errors } from "./lib/errors.js";
|
|
3
|
-
import { require_types } from "./lib/types/index.js";
|
|
4
|
-
import { require_policies } from "./lib/policies/index.js";
|
|
5
|
-
import { require_tracker } from "./lib/tracker/index.js";
|
|
6
|
-
import { require_metrics } from "./lib/metrics/index.js";
|
|
7
|
-
import { require_auth } from "./lib/auth/index.js";
|
|
8
|
-
import { require_client_options } from "./lib/client-options.js";
|
|
9
|
-
import { require_execution_profile } from "./lib/execution-profile.js";
|
|
10
|
-
import { require_execution_options } from "./lib/execution-options.js";
|
|
11
|
-
import { require_package } from "../package.js";
|
|
12
|
-
import { require_token } from "./lib/token.js";
|
|
13
|
-
import { require_geometry } from "./lib/geometry/index.js";
|
|
14
|
-
import { require_encoder } from "./lib/encoder.js";
|
|
15
|
-
import { require_metadata } from "./lib/metadata/index.js";
|
|
16
|
-
import { require_client } from "./lib/client.js";
|
|
17
|
-
import { require_mapping } from "./lib/mapping/index.js";
|
|
18
|
-
import { require_concurrent } from "./lib/concurrent/index.js";
|
|
19
|
-
//#region driver/index.js
|
|
20
|
-
var require_driver = /* @__PURE__ */ __commonJSMin(((exports) => {
|
|
21
|
-
const clientOptions = require_client_options();
|
|
22
|
-
exports.Client = require_client();
|
|
23
|
-
exports.ExecutionProfile = require_execution_profile().ExecutionProfile;
|
|
24
|
-
exports.ExecutionOptions = require_execution_options().ExecutionOptions;
|
|
25
|
-
exports.types = require_types();
|
|
26
|
-
exports.errors = require_errors();
|
|
27
|
-
exports.policies = require_policies();
|
|
28
|
-
exports.auth = require_auth();
|
|
29
|
-
exports.mapping = require_mapping();
|
|
30
|
-
exports.tracker = require_tracker();
|
|
31
|
-
exports.metrics = require_metrics();
|
|
32
|
-
exports.concurrent = require_concurrent();
|
|
33
|
-
const token = require_token();
|
|
34
|
-
exports.token = {
|
|
35
|
-
Token: token.Token,
|
|
36
|
-
TokenRange: token.TokenRange
|
|
37
|
-
};
|
|
38
|
-
exports.metadata = { Metadata: require_metadata() };
|
|
39
|
-
exports.Encoder = require_encoder();
|
|
40
|
-
exports.geometry = require_geometry();
|
|
41
|
-
/**
|
|
42
|
-
* Returns a new instance of the default [options]{@link ClientOptions} used by the driver.
|
|
43
|
-
*/
|
|
44
|
-
exports.defaultOptions = function() {
|
|
45
|
-
return clientOptions.defaultOptions();
|
|
46
|
-
};
|
|
47
|
-
exports.version = require_package().version;
|
|
48
|
-
}));
|
|
49
|
-
//#endregion
|
|
50
|
-
export default require_driver();
|
|
51
|
-
export { require_driver };
|
|
52
|
-
|
|
53
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import e from"./lib/errors.js";import t from"./lib/types/index.js";import n from"./lib/policies/index.js";import r from"./lib/tracker/index.js";import i from"./lib/metrics/index.js";import a from"./lib/auth/index.js";import o from"./lib/client-options.js";import{ExecutionProfile as s}from"./lib/execution-profile.js";import{ExecutionOptions as c}from"./lib/execution-options.js";import{version as l}from"../package.js";import{Token as u,TokenRange as d}from"./lib/token.js";import f from"./lib/geometry/index.js";import p from"./lib/encoder.js";import m from"./lib/metadata/index.js";import h from"./lib/client.js";import g from"./lib/mapping/index.js";import _ from"./lib/concurrent/index.js";const v={Token:u,TokenRange:d},y={Metadata:m};function b(){return o.defaultOptions()}const x={Client:h,ExecutionProfile:s,ExecutionOptions:c,types:t,errors:e,policies:n,auth:a,mapping:g,tracker:r,metrics:i,concurrent:_,token:v,metadata:y,Encoder:p,geometry:f,defaultOptions:b,version:l};export{x as default};
|