@ragestudio/scylla-odm 0.22.0 → 0.22.2

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.
Files changed (196) hide show
  1. package/batch/index.d.ts +19 -21
  2. package/batch/index.d.ts.map +1 -0
  3. package/batch/index.js +37 -1
  4. package/batch/index.js.map +1 -0
  5. package/client.d.ts +24 -27
  6. package/client.d.ts.map +1 -0
  7. package/client.js +190 -1
  8. package/client.js.map +1 -0
  9. package/cql_gen/create_keyspace.d.ts +8 -9
  10. package/cql_gen/create_keyspace.d.ts.map +1 -0
  11. package/cql_gen/create_keyspace.js +14 -1
  12. package/cql_gen/create_keyspace.js.map +1 -0
  13. package/cql_gen/create_table.d.ts +3 -6
  14. package/cql_gen/create_table.d.ts.map +1 -0
  15. package/cql_gen/create_table.js +51 -1
  16. package/cql_gen/create_table.js.map +1 -0
  17. package/document/index.d.ts +11 -14
  18. package/document/index.d.ts.map +1 -0
  19. package/document/index.js +76 -1
  20. package/document/index.js.map +1 -0
  21. package/global.d.ts +6 -0
  22. package/global.d.ts.map +1 -0
  23. package/global.js +2 -0
  24. package/global.js.map +1 -0
  25. package/index.d.ts +9 -7
  26. package/index.d.ts.map +1 -0
  27. package/index.js +9 -1
  28. package/index.js.map +1 -0
  29. package/logger/index.d.ts +7 -8
  30. package/logger/index.d.ts.map +1 -0
  31. package/logger/index.js +14 -1
  32. package/logger/index.js.map +1 -0
  33. package/migrate/index.d.ts +12 -14
  34. package/migrate/index.d.ts.map +1 -0
  35. package/migrate/index.js +254 -4
  36. package/migrate/index.js.map +1 -0
  37. package/model/index.d.ts +64 -67
  38. package/model/index.d.ts.map +1 -0
  39. package/model/index.js +71 -1
  40. package/model/index.js.map +1 -0
  41. package/operations/countAll.d.ts +3 -6
  42. package/operations/countAll.d.ts.map +1 -0
  43. package/operations/countAll.js +13 -1
  44. package/operations/countAll.js.map +1 -0
  45. package/operations/delete.d.ts +5 -8
  46. package/operations/delete.d.ts.map +1 -0
  47. package/operations/delete.js +23 -1
  48. package/operations/delete.js.map +1 -0
  49. package/operations/find.d.ts +4 -7
  50. package/operations/find.d.ts.map +1 -0
  51. package/operations/find.js +19 -1
  52. package/operations/find.js.map +1 -0
  53. package/operations/findOne.d.ts +4 -7
  54. package/operations/findOne.d.ts.map +1 -0
  55. package/operations/findOne.js +21 -1
  56. package/operations/findOne.js.map +1 -0
  57. package/operations/insert.d.ts +5 -8
  58. package/operations/insert.d.ts.map +1 -0
  59. package/operations/insert.js +24 -1
  60. package/operations/insert.js.map +1 -0
  61. package/operations/sync.d.ts +3 -6
  62. package/operations/sync.d.ts.map +1 -0
  63. package/operations/sync.js +16 -1
  64. package/operations/sync.js.map +1 -0
  65. package/operations/tableExists.d.ts +3 -6
  66. package/operations/tableExists.d.ts.map +1 -0
  67. package/operations/tableExists.js +15 -2
  68. package/operations/tableExists.js.map +1 -0
  69. package/operations/update.d.ts +5 -8
  70. package/operations/update.d.ts.map +1 -0
  71. package/operations/update.js +35 -1
  72. package/operations/update.js.map +1 -0
  73. package/package.json +13 -3
  74. package/schema/index.d.ts +13 -15
  75. package/schema/index.d.ts.map +1 -0
  76. package/schema/index.js +23 -1
  77. package/schema/index.js.map +1 -0
  78. package/types.d.ts +98 -84
  79. package/types.d.ts.map +1 -0
  80. package/types.js +33 -1
  81. package/types.js.map +1 -0
  82. package/utils/buildMapper.d.ts +12 -4
  83. package/utils/buildMapper.d.ts.map +1 -0
  84. package/utils/buildMapper.js +11 -1
  85. package/utils/buildMapper.js.map +1 -0
  86. package/utils/delay.d.ts +3 -4
  87. package/utils/delay.d.ts.map +1 -0
  88. package/utils/delay.js +5 -1
  89. package/utils/delay.js.map +1 -0
  90. package/utils/fillDefaults.d.ts +2 -4
  91. package/utils/fillDefaults.d.ts.map +1 -0
  92. package/utils/fillDefaults.js +24 -1
  93. package/utils/fillDefaults.js.map +1 -0
  94. package/utils/isPlainObject.d.ts +3 -4
  95. package/utils/isPlainObject.d.ts.map +1 -0
  96. package/utils/isPlainObject.js +11 -1
  97. package/utils/isPlainObject.js.map +1 -0
  98. package/utils/loadModels.d.ts +3 -4
  99. package/utils/loadModels.d.ts.map +1 -0
  100. package/utils/loadModels.js +29 -1
  101. package/utils/loadModels.js.map +1 -0
  102. package/utils/queryParser.d.ts +5 -8
  103. package/utils/queryParser.d.ts.map +1 -0
  104. package/utils/queryParser.js +102 -1
  105. package/utils/queryParser.js.map +1 -0
  106. package/utils/typeChecker.d.ts +3 -6
  107. package/utils/typeChecker.d.ts.map +1 -0
  108. package/utils/typeChecker.js +90 -1
  109. package/utils/typeChecker.js.map +1 -0
  110. package/driver/auth/index.d.ts +0 -34
  111. package/driver/auth/index.js +0 -1
  112. package/driver/auth/no-auth-provider.js +0 -1
  113. package/driver/auth/plain-text-auth-provider.js +0 -1
  114. package/driver/auth/provider.js +0 -1
  115. package/driver/client-options.js +0 -1
  116. package/driver/client.js +0 -1
  117. package/driver/concurrent/index.d.ts +0 -1
  118. package/driver/concurrent/index.js +0 -1
  119. package/driver/connection.js +0 -1
  120. package/driver/control-connection.js +0 -1
  121. package/driver/encoder.js +0 -1
  122. package/driver/errors.js +0 -1
  123. package/driver/execution-options.js +0 -1
  124. package/driver/execution-profile.js +0 -1
  125. package/driver/host-connection-pool.js +0 -1
  126. package/driver/host.js +0 -1
  127. package/driver/index.d.ts +0 -212
  128. package/driver/index.js +0 -1
  129. package/driver/mapping/cache.js +0 -1
  130. package/driver/mapping/doc-info-adapter.js +0 -1
  131. package/driver/mapping/index.d.ts +0 -142
  132. package/driver/mapping/index.js +0 -1
  133. package/driver/mapping/mapper.js +0 -1
  134. package/driver/mapping/mapping-handler.js +0 -1
  135. package/driver/mapping/model-batch-item.js +0 -1
  136. package/driver/mapping/model-batch-mapper.js +0 -1
  137. package/driver/mapping/model-mapper.js +0 -1
  138. package/driver/mapping/model-mapping-info.js +0 -1
  139. package/driver/mapping/object-selector.js +0 -1
  140. package/driver/mapping/q.js +0 -1
  141. package/driver/mapping/query-generator.js +0 -9
  142. package/driver/mapping/result-mapper.js +0 -4
  143. package/driver/mapping/result.js +0 -1
  144. package/driver/mapping/table-mappings.js +0 -1
  145. package/driver/mapping/tree.js +0 -1
  146. package/driver/metadata/aggregate.js +0 -1
  147. package/driver/metadata/client-state.js +0 -1
  148. package/driver/metadata/data-collection.js +0 -1
  149. package/driver/metadata/event-debouncer.js +0 -1
  150. package/driver/metadata/index.d.ts +0 -184
  151. package/driver/metadata/index.js +0 -1
  152. package/driver/metadata/materialized-view.js +0 -1
  153. package/driver/metadata/schema-function.js +0 -1
  154. package/driver/metadata/schema-index.js +0 -1
  155. package/driver/metadata/schema-parser.js +0 -1
  156. package/driver/metadata/table-metadata.js +0 -1
  157. package/driver/operation-state.js +0 -1
  158. package/driver/policies/address-resolution.js +0 -1
  159. package/driver/policies/index.d.ts +0 -135
  160. package/driver/policies/index.js +0 -1
  161. package/driver/policies/load-balancing.js +0 -1
  162. package/driver/policies/reconnection.js +0 -1
  163. package/driver/policies/retry.js +0 -1
  164. package/driver/policies/speculative-execution.js +0 -1
  165. package/driver/policies/timestamp-generation.js +0 -1
  166. package/driver/prepare-handler.js +0 -1
  167. package/driver/promise-utils.js +0 -1
  168. package/driver/readers.js +0 -1
  169. package/driver/request-execution.js +0 -1
  170. package/driver/request-handler.js +0 -1
  171. package/driver/requests.js +0 -1
  172. package/driver/stream-id-stack.js +0 -1
  173. package/driver/streams.js +0 -1
  174. package/driver/token.js +0 -1
  175. package/driver/tokenizer.js +0 -1
  176. package/driver/types/big-decimal.js +0 -1
  177. package/driver/types/duration.js +0 -1
  178. package/driver/types/index.d.ts +0 -320
  179. package/driver/types/index.js +0 -1
  180. package/driver/types/inet-address.js +0 -1
  181. package/driver/types/integer.js +0 -1
  182. package/driver/types/local-date.js +0 -1
  183. package/driver/types/local-time.js +0 -1
  184. package/driver/types/mutable-long.js +0 -1
  185. package/driver/types/protocol-version.js +0 -1
  186. package/driver/types/result-set.js +0 -1
  187. package/driver/types/result-stream.js +0 -1
  188. package/driver/types/row.js +0 -1
  189. package/driver/types/time-uuid.js +0 -1
  190. package/driver/types/tuple.js +0 -1
  191. package/driver/types/uuid.js +0 -1
  192. package/driver/types/vector.js +0 -1
  193. package/driver/types/version-number.js +0 -1
  194. package/driver/utils.js +0 -4
  195. package/driver/writers.js +0 -1
  196. package/package.js +0 -1
package/batch/index.d.ts CHANGED
@@ -1,24 +1,22 @@
1
- import { types } from "../driver/types/index.js";
2
- import { mapping } from "../driver/mapping/index.js";
3
- import { Client } from "../client.js";
4
-
5
- //#region src/batch/index.d.ts
1
+ import type Client from "../client";
2
+ import type { mapping } from "../driver/mapping";
3
+ import type { types } from "../driver/types";
6
4
  type Long = types.Long;
7
- type BatchExecutionOptions = {
8
- logged?: boolean;
9
- timestamp?: number | Long;
10
- executionProfile?: string;
5
+ export type BatchExecutionOptions = {
6
+ logged?: boolean;
7
+ timestamp?: number | Long;
8
+ executionProfile?: string;
11
9
  };
12
- declare class Batch {
13
- private _items;
14
- private _client;
15
- private _logged;
16
- constructor(client: Client, logged?: boolean);
17
- add(item: mapping.ModelBatchItem): this;
18
- execute(options?: BatchExecutionOptions): Promise<mapping.Result>;
19
- get size(): number;
20
- clear(): void;
21
- logged(value: boolean): this;
10
+ export declare class Batch {
11
+ private _items;
12
+ private _client;
13
+ private _logged;
14
+ constructor(client: Client, logged?: boolean);
15
+ add(item: mapping.ModelBatchItem): this;
16
+ execute(options?: BatchExecutionOptions): Promise<mapping.Result>;
17
+ get size(): number;
18
+ clear(): void;
19
+ logged(value: boolean): this;
22
20
  }
23
- //#endregion
24
- export { Batch, Batch as default, BatchExecutionOptions };
21
+ export default Batch;
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/batch/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;AAEtB,MAAM,MAAM,qBAAqB,GAAG;IACnC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,qBAAa,KAAK;IACjB,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAc,EAGjD;IAED,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,GAAG,IAAI,CAGtC;IAEK,OAAO,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAkBtE;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAG3B;CACD;eAEc,KAAK"}
package/batch/index.js CHANGED
@@ -1 +1,37 @@
1
- var Batch=class{_items=[];_client;_logged;constructor(e,t=!0){this._client=e,this._logged=t}add(e){return this._items.push(e),this}async execute(e){if(this._items.length===0)throw Error(`Cannot execute an empty batch`);let t=this._items;this._items=[];let n={logged:this._logged,...e};return this._client.executeWithRetry(async()=>await this._client.mapper.batch(t,n),`batch`)}get size(){return this._items.length}clear(){this._items=[]}logged(e){return this._logged=e,this}};export{Batch,Batch as default};
1
+ export class Batch {
2
+ _items = [];
3
+ _client;
4
+ _logged;
5
+ constructor(client, logged = true) {
6
+ this._client = client;
7
+ this._logged = logged;
8
+ }
9
+ add(item) {
10
+ this._items.push(item);
11
+ return this;
12
+ }
13
+ async execute(options) {
14
+ if (this._items.length === 0) {
15
+ throw new Error("Cannot execute an empty batch");
16
+ }
17
+ const items = this._items;
18
+ this._items = [];
19
+ const executionOptions = {
20
+ logged: this._logged,
21
+ ...options,
22
+ };
23
+ return this._client.executeWithRetry(async () => await this._client.mapper.batch(items, executionOptions), "batch");
24
+ }
25
+ get size() {
26
+ return this._items.length;
27
+ }
28
+ clear() {
29
+ this._items = [];
30
+ }
31
+ logged(value) {
32
+ this._logged = value;
33
+ return this;
34
+ }
35
+ }
36
+ export default Batch;
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/batch/index.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,KAAK;IACT,MAAM,GAA6B,EAAE,CAAA;IACrC,OAAO,CAAQ;IACf,OAAO,CAAS;IAExB,YAAY,MAAc,EAAE,MAAM,GAAY,IAAI;QACjD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,GAAG,CAAC,IAA4B;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA+B;QAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;QACjD,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;QAEhB,MAAM,gBAAgB,GAAG;YACxB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,GAAG,OAAO;SACV,CAAA;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CACnC,KAAK,IAAI,EAAE,CACV,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,gBAAgB,CAAC,EACzD,OAAO,CACP,CAAA;IACF,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;IAC1B,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,KAAc;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,OAAO,IAAI,CAAA;IACZ,CAAC;CACD;AAED,eAAe,KAAK,CAAA"}
package/client.d.ts CHANGED
@@ -1,28 +1,25 @@
1
- import { mapping } from "./driver/mapping/index.js";
2
- import { Client as Client$1 } from "./driver/index.js";
3
- import { Model } from "./model/index.js";
4
- import { ClientConfig } from "./types.js";
5
- import { Logger } from "./logger/index.js";
6
- import { Batch } from "./batch/index.js";
7
-
8
- //#region src/client.d.ts
9
- declare class Client {
10
- constructor(config?: ClientConfig);
11
- config: ClientConfig;
12
- driver: Client$1;
13
- mapper: mapping.Mapper;
14
- models: Map<string, Model<any>>;
15
- model(name: string): Model<any> | undefined;
16
- logger: Logger;
17
- initialize(options?: {
18
- sync?: boolean;
19
- }): Promise<void>;
20
- batch(logged?: boolean): Batch;
21
- migrate(modelName?: string): Promise<void>;
22
- shutdown(): Promise<void>;
23
- private connectWithRetry;
24
- executeWithRetry<T>(operation: () => Promise<T>, operationName?: string): Promise<T>;
25
- private isRetryableError;
1
+ import type { Client as T_CassandraClient, mapping as T_CassandraMapping } from "./driver";
2
+ import type { ClientConfig } from "./types";
3
+ import Model from "./model";
4
+ import Logger from "./logger";
5
+ import { Batch } from "./batch";
6
+ export declare class Client {
7
+ constructor(config?: ClientConfig);
8
+ config: ClientConfig;
9
+ driver: T_CassandraClient;
10
+ mapper: T_CassandraMapping.Mapper;
11
+ models: Map<string, Model<any>>;
12
+ model(name: string): Model<any> | undefined;
13
+ logger: Logger;
14
+ initialize(options?: {
15
+ sync?: boolean;
16
+ }): Promise<void>;
17
+ batch(logged?: boolean): Batch;
18
+ migrate(modelName?: string): Promise<void>;
19
+ shutdown(): Promise<void>;
20
+ private connectWithRetry;
21
+ executeWithRetry<T>(operation: () => Promise<T>, operationName?: string): Promise<T>;
22
+ private isRetryableError;
26
23
  }
27
- //#endregion
28
- export { Client, Client as default };
24
+ export default Client;
25
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,MAAM,IAAI,iBAAiB,EAE3B,OAAO,IAAI,kBAAkB,EAC7B,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAM3C,OAAO,KAAK,MAAM,SAAS,CAAA;AAC3B,OAAO,MAAM,MAAM,UAAU,CAAA;AAK7B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAc/B,qBAAa,MAAM;IAClB,YAAY,MAAM,GAAE,YAAiB,EAoCpC;IAED,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,iBAAiB,CAAA;IACzB,MAAM,EAAG,kBAAkB,CAAC,MAAM,CAAA;IAClC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAY;IAE3C,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAE1C;IAED,MAAM,EAAE,MAAM,CAAe;IAEvB,UAAU,CAAC,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAO,iBA8BhD;IAED,KAAK,CAAC,MAAM,GAAE,OAAc,GAAG,KAAK,CAEnC;IAEK,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD/C;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAW9B;YAEa,gBAAgB;IA2BxB,gBAAgB,CAAC,CAAC,EACvB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,aAAa,GAAE,MAAoB,GACjC,OAAO,CAAC,CAAC,CAAC,CAiCZ;IAED,OAAO,CAAC,gBAAgB;CAexB;eAEc,MAAM"}
package/client.js CHANGED
@@ -1 +1,190 @@
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{Batch as o}from"./batch/index.js";import{executeMigration as s,executeResetMigration as c,migrateModel as l,promptMigration as u,promptResetMigration as d}from"./migrate/index.js";import f from"node:path";const{SCYLLA_CONTACT_POINTS:p,SCYLLA_LOCAL_DATA_CENTER:m,SCYLLA_KEYSPACE:h}=process.env;var Client=class{constructor(t={}){if(globalThis.__scylla_client)throw Error(`An instance of Scylla Client is already initialized`);this.config={modelsPath:f.resolve(process.cwd(),`db`),contactPoints:t.contactPoints??p?.split(`,`)??[`127.0.0.1`],localDataCenter:t.localDataCenter??m??`datacenter1`,keyspace:t.keyspace??h??`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()}batch(e=!0){return new o(this,e)}async migrate(e){if(!this.models.size)throw Error(`no models loaded, call initialize() first`);let t;if(e){let n=this.models.get(e);if(!n)throw Error(`model "${e}" not found, available: [${[...this.models.keys()].join(`, `)}]`);t=[n]}else t=[...this.models.values()];for(let e of t){let t=await l(e);if(t.type===`none`){this.logger.log(`[${e.name}] schema is up to date, nothing to migrate`);continue}if(t.errors.length){await d(e.name,t)?(await c(e,t),this.logger.log(`[${e.name}] table reset successfully`)):this.logger.log(`[${e.name}] migration skipped`);continue}await u(e.name,t)?(await s(e,t),this.logger.log(`[${e.name}] migration applied successfully`)):this.logger.log(`[${e.name}] migration skipped`)}}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{Client,Client as default};
1
+ //@ts-ignore
2
+ import path from "node:path";
3
+ //@ts-ignore
4
+ import Cassandra from "./driver";
5
+ import Model from "./model";
6
+ import Logger from "./logger";
7
+ import loadModels from "./utils/loadModels";
8
+ import buildMapper from "./utils/buildMapper";
9
+ import delay from "./utils/delay";
10
+ import { Batch } from "./batch";
11
+ import { migrateModel, promptMigration, executeMigration, promptResetMigration, executeResetMigration, } from "./migrate";
12
+ const DEFAULT_MAX_RETRIES = 3;
13
+ const DEFAULT_RETRY_DELAY = 1000;
14
+ const { SCYLLA_CONTACT_POINTS, SCYLLA_LOCAL_DATA_CENTER, SCYLLA_KEYSPACE } = process.env;
15
+ export class Client {
16
+ constructor(config = {}) {
17
+ if (globalThis.__scylla_client) {
18
+ throw new Error("An instance of Scylla Client is already initialized");
19
+ }
20
+ this.config = {
21
+ modelsPath: path.resolve(process.cwd(), "db"),
22
+ contactPoints: config.contactPoints ??
23
+ SCYLLA_CONTACT_POINTS?.split(",") ?? ["127.0.0.1"],
24
+ localDataCenter: config.localDataCenter ??
25
+ SCYLLA_LOCAL_DATA_CENTER ??
26
+ "datacenter1",
27
+ keyspace: config.keyspace ?? SCYLLA_KEYSPACE ?? "default_keyspace",
28
+ port: 9042,
29
+ maxRetries: DEFAULT_MAX_RETRIES,
30
+ retryDelay: DEFAULT_RETRY_DELAY,
31
+ ...config,
32
+ };
33
+ const clientOptions = {
34
+ contactPoints: this.config.contactPoints,
35
+ localDataCenter: this.config.localDataCenter,
36
+ keyspace: this.config.keyspace,
37
+ protocolOptions: {
38
+ port: this.config.port,
39
+ },
40
+ };
41
+ if (this.config.pooling) {
42
+ clientOptions.pooling = this.config.pooling;
43
+ }
44
+ this.driver = new Cassandra.Client(clientOptions);
45
+ }
46
+ config;
47
+ driver;
48
+ mapper;
49
+ models = new Map();
50
+ model(name) {
51
+ return this.models.get(name);
52
+ }
53
+ logger = new Logger();
54
+ async initialize(options = {}) {
55
+ let models;
56
+ try {
57
+ models = await loadModels(this.config.modelsPath);
58
+ }
59
+ catch (error) {
60
+ throw new Error(`Failed to load models: ${error.message}`);
61
+ }
62
+ models = models.filter((schema) => schema instanceof Model);
63
+ this.mapper = new Cassandra.mapping.Mapper(this.driver, {
64
+ models: buildMapper(models),
65
+ });
66
+ globalThis.__scylla_client = this;
67
+ this.logger.log("Connecting...");
68
+ await this.connectWithRetry();
69
+ this.logger.log("Connected");
70
+ for (let model of models) {
71
+ this.models.set(model.name, model);
72
+ if (options?.sync === true) {
73
+ await model._sync();
74
+ }
75
+ }
76
+ }
77
+ batch(logged = true) {
78
+ return new Batch(this, logged);
79
+ }
80
+ async migrate(modelName) {
81
+ if (!this.models.size) {
82
+ throw new Error("no models loaded, call initialize() first");
83
+ }
84
+ let models;
85
+ if (modelName) {
86
+ const model = this.models.get(modelName);
87
+ if (!model) {
88
+ throw new Error(`model "${modelName}" not found, ` +
89
+ `available: [${[...this.models.keys()].join(", ")}]`);
90
+ }
91
+ models = [model];
92
+ }
93
+ else {
94
+ models = [...this.models.values()];
95
+ }
96
+ for (const model of models) {
97
+ const result = await migrateModel(model);
98
+ if (result.type === "none") {
99
+ this.logger.log(`[${model.name}] schema is up to date, nothing to migrate`);
100
+ continue;
101
+ }
102
+ if (result.errors.length) {
103
+ const shouldReset = await promptResetMigration(model.name, result);
104
+ if (shouldReset) {
105
+ await executeResetMigration(model, result);
106
+ this.logger.log(`[${model.name}] table reset successfully`);
107
+ }
108
+ else {
109
+ this.logger.log(`[${model.name}] migration skipped`);
110
+ }
111
+ continue;
112
+ }
113
+ const shouldApply = await promptMigration(model.name, result);
114
+ if (shouldApply) {
115
+ await executeMigration(model, result);
116
+ this.logger.log(`[${model.name}] migration applied successfully`);
117
+ }
118
+ else {
119
+ this.logger.log(`[${model.name}] migration skipped`);
120
+ }
121
+ }
122
+ }
123
+ async shutdown() {
124
+ try {
125
+ await this.driver.shutdown();
126
+ this.logger.log("connection closed");
127
+ // @ts-ignore
128
+ delete globalThis.__scylla_client;
129
+ }
130
+ catch (error) {
131
+ this.logger.error("error shutting down connection:", error);
132
+ throw error;
133
+ }
134
+ }
135
+ async connectWithRetry() {
136
+ let lastError = null;
137
+ for (let attempt = 1; attempt <= this.config.maxRetries; attempt++) {
138
+ try {
139
+ await this.driver.connect();
140
+ return;
141
+ }
142
+ catch (error) {
143
+ lastError = error;
144
+ this.logger.warn(`Connection attempt ${attempt} failed: ${error.message}`);
145
+ if (attempt < this.config.maxRetries) {
146
+ this.logger.log(`Retrying in ${this.config.retryDelay}ms...`);
147
+ await delay(this.config.retryDelay);
148
+ }
149
+ }
150
+ }
151
+ throw new Error(`Failed to connect to ScyllaDB after ${this.config.maxRetries} attempts: ${lastError?.message}`);
152
+ }
153
+ async executeWithRetry(operation, operationName = "operation") {
154
+ let lastError = null;
155
+ for (let attempt = 1; attempt <= this.config.maxRetries; attempt++) {
156
+ try {
157
+ return await operation();
158
+ }
159
+ catch (error) {
160
+ lastError = error;
161
+ // check if error is retryable
162
+ if (this.isRetryableError(error) &&
163
+ attempt < this.config.maxRetries) {
164
+ this.logger.warn(`Operation ${operationName} attempt ${attempt} failed: ${error.message}`);
165
+ this.logger.log(`Retrying in ${this.config.retryDelay}ms...`);
166
+ await delay(this.config.retryDelay);
167
+ continue;
168
+ }
169
+ // if not retryable or last attempt, throw
170
+ throw error;
171
+ }
172
+ }
173
+ throw new Error(`Operation ${operationName} failed after ${this.config.maxRetries} attempts: ${lastError?.message}`);
174
+ }
175
+ isRetryableError(error) {
176
+ // retry on network errors, timeouts, and certain ScyllaDB errors
177
+ const retryableMessages = [
178
+ "timeout",
179
+ "connection",
180
+ "network",
181
+ "unavailable",
182
+ "overloaded",
183
+ "no hosts available",
184
+ ];
185
+ const errorMessage = error.message?.toLowerCase() || "";
186
+ return retryableMessages.some((msg) => errorMessage.includes(msg));
187
+ }
188
+ }
189
+ export default Client;
190
+ //# sourceMappingURL=client.js.map
package/client.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,10 @@
1
- //#region src/cql_gen/create_keyspace.d.ts
2
1
  type KeyspaceCreateOptions = {
3
- keyspace: string;
4
- replication?: {
5
- strategy: string;
6
- options: Record<string, string>;
7
- };
2
+ keyspace: string;
3
+ replication?: {
4
+ strategy: string;
5
+ options: Record<string, string>;
6
+ };
8
7
  };
9
- declare function createKeyspace(options: KeyspaceCreateOptions): string;
10
- //#endregion
11
- export { createKeyspace as default };
8
+ export default function createKeyspace(options: KeyspaceCreateOptions): string;
9
+ export {};
10
+ //# sourceMappingURL=create_keyspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_keyspace.d.ts","sourceRoot":"","sources":["../../src/cql_gen/create_keyspace.ts"],"names":[],"mappings":"AAAA,KAAK,qBAAqB,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAC/B,CAAA;CACD,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAa7E"}
@@ -1 +1,14 @@
1
- function createKeyspace(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{createKeyspace as default};
1
+ export default function createKeyspace(options) {
2
+ let clause = {};
3
+ if (options.replication) {
4
+ clause = options.replication;
5
+ }
6
+ else {
7
+ clause = {
8
+ strategy: "SimpleStrategy",
9
+ options: { replication_factor: "1" },
10
+ };
11
+ }
12
+ return `CREATE KEYSPACE IF NOT EXISTS ${options.keyspace} WITH REPLICATION = ${JSON.stringify(clause)};`;
13
+ }
14
+ //# sourceMappingURL=create_keyspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_keyspace.js","sourceRoot":"","sources":["../../src/cql_gen/create_keyspace.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAA8B;IACpE,IAAI,MAAM,GAAG,EAAE,CAAA;IAEf,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,GAAG,OAAO,CAAC,WAAW,CAAA;IAC7B,CAAC;SAAM,CAAC;QACP,MAAM,GAAG;YACR,QAAQ,EAAE,gBAAgB;YAC1B,OAAO,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE;SACpC,CAAA;IACF,CAAC;IAED,OAAO,iCAAiC,OAAO,CAAC,QAAQ,uBAAuB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAA;AACzG,CAAC"}
@@ -1,6 +1,3 @@
1
- import { Model } from "../model/index.js";
2
-
3
- //#region src/cql_gen/create_table.d.ts
4
- declare function export_default(model: Model): string;
5
- //#endregion
6
- export { export_default as default };
1
+ import type Model from "../model";
2
+ export default function (model: Model): string;
3
+ //# sourceMappingURL=create_table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_table.d.ts","sourceRoot":"","sources":["../../src/cql_gen/create_table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAEjC,MAAM,CAAC,OAAO,WAAW,KAAK,EAAE,KAAK,GAAG,MAAM,CA+D7C"}
@@ -1 +1,51 @@
1
- function create_table_default(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=>`"${String(e)}"`).join(`, `)})`:`"${String(e)}"`;for(let e=1;e<a.length;e++)c+=`, "${String(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{create_table_default as default};
1
+ export default function (model) {
2
+ const desc = model.schema;
3
+ const tableName = desc.table_name;
4
+ const keyspace = model.client.config.keyspace;
5
+ const fields = desc.fields;
6
+ const key = desc.keys;
7
+ const clusteringOrder = desc.clustering_order;
8
+ let columnsDef = "";
9
+ for (const fieldName in fields) {
10
+ const field = fields[fieldName];
11
+ const typeStr = typeof field === "string" ? field : field?.type;
12
+ if (!typeStr) {
13
+ throw new Error(`Invalid field type for "${fieldName}" in model "${tableName}"`);
14
+ }
15
+ columnsDef += `"${fieldName}" ${typeStr.toUpperCase()}, `;
16
+ }
17
+ let pkDef = "";
18
+ if (typeof key === "string") {
19
+ pkDef = `"${key}"`;
20
+ }
21
+ else if (Array.isArray(key) && key.length > 0) {
22
+ const first = key[0];
23
+ if (Array.isArray(first)) {
24
+ pkDef = `(${first.map((k) => `"${String(k)}"`).join(", ")})`;
25
+ }
26
+ else {
27
+ pkDef = `"${String(first)}"`;
28
+ }
29
+ for (let i = 1; i < key.length; i++) {
30
+ pkDef += `, "${String(key[i])}"`;
31
+ }
32
+ }
33
+ else {
34
+ throw new Error(`Missing or invalid primary key in model "${tableName}"`);
35
+ }
36
+ let clusterClause = "";
37
+ if (clusteringOrder) {
38
+ let orderDef = "";
39
+ for (const col in clusteringOrder) {
40
+ if (orderDef !== "") {
41
+ orderDef += ", ";
42
+ }
43
+ orderDef += `"${col}" ${clusteringOrder[col].toUpperCase()}`;
44
+ }
45
+ if (orderDef !== "") {
46
+ clusterClause = ` WITH CLUSTERING ORDER BY (${orderDef})`;
47
+ }
48
+ }
49
+ return `CREATE TABLE IF NOT EXISTS ${keyspace}.${tableName} (${columnsDef}PRIMARY KEY (${pkDef}))${clusterClause}`;
50
+ }
51
+ //# sourceMappingURL=create_table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_table.js","sourceRoot":"","sources":["../../src/cql_gen/create_table.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,WAAW,KAAY;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAA;IACzB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAA;IACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAA;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAA;IACrB,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAA;IAE7C,IAAI,UAAU,GAAG,EAAE,CAAA;IAEnB,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;QAC/B,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,KAAa,EAAE,IAAI,CAAA;QAExE,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACd,2BAA2B,SAAS,eAAe,SAAS,GAAG,CAC/D,CAAA;QACF,CAAC;QAED,UAAU,IAAI,IAAI,SAAS,KAAK,OAAO,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1D,CAAC;IAED,IAAI,KAAK,GAAG,EAAE,CAAA;IAEd,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,KAAK,GAAG,IAAI,GAAG,GAAG,CAAA;IACnB,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAEpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;QAC7D,CAAC;aAAM,CAAC;YACP,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAA;QAC7B,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,KAAK,IAAI,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACjC,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACd,4CAA4C,SAAS,GAAG,CACxD,CAAA;IACF,CAAC;IAED,IAAI,aAAa,GAAG,EAAE,CAAA;IAEtB,IAAI,eAAe,EAAE,CAAC;QACrB,IAAI,QAAQ,GAAG,EAAE,CAAA;QAEjB,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACnC,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gBACrB,QAAQ,IAAI,IAAI,CAAA;YACjB,CAAC;YAED,QAAQ,IAAI,IAAI,GAAG,KAAM,eAAe,CAAC,GAAG,CAAY,CAAC,WAAW,EAAE,EAAE,CAAA;QACzE,CAAC;QACD,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YACrB,aAAa,GAAG,8BAA8B,QAAQ,GAAG,CAAA;QAC1D,CAAC;IACF,CAAC;IAED,OAAO,8BAA8B,QAAQ,IAAI,SAAS,KAAK,UAAU,gBAAgB,KAAK,KAAK,aAAa,EAAE,CAAA;AACnH,CAAC"}
@@ -1,15 +1,12 @@
1
- import { Model } from "../model/index.js";
2
- import { Doc } from "../types.js";
3
-
4
- //#region src/document/index.d.ts
5
- declare class Document<TDoc = any> {
6
- constructor(data: TDoc, model: Model<any, TDoc>);
7
- _model: Model<any, TDoc>;
8
- save(): Promise<Doc<TDoc>[]>;
9
- delete(): Promise<Doc<TDoc>[]>;
10
- toRaw(): TDoc;
11
- isValid(): boolean;
12
- getChangedFields(original: Partial<TDoc>): (keyof TDoc)[];
1
+ import type { Model } from "../model";
2
+ export declare class Document<TDoc = any> {
3
+ constructor(data: TDoc, model: Model<any, TDoc>);
4
+ _model: Model<any, TDoc>;
5
+ save(): Promise<import("../types").Doc<TDoc>[]>;
6
+ delete(): Promise<import("../types").Doc<TDoc>[]>;
7
+ toRaw(): TDoc;
8
+ isValid(): boolean;
9
+ getChangedFields(original: Partial<TDoc>): (keyof TDoc)[];
13
10
  }
14
- //#endregion
15
- export { Document, Document as default };
11
+ export default Document;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/document/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAGrC,qBAAa,QAAQ,CAAC,IAAI,GAAG,GAAG;IAC/B,YAAY,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,EAmB9C;IAED,MAAM,EAAG,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAEnB,IAAI,4CAUT;IAEK,MAAM,4CAMX;IAED,KAAK,IAAI,IAAI,CAmBZ;IAED,OAAO,IAAI,OAAO,CAOjB;IAED,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAWxD;CACD;eAEc,QAAQ"}
package/document/index.js CHANGED
@@ -1 +1,76 @@
1
- var Document=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{Document,Document as default};
1
+ //import typeChecker from "../utils/typeChecker"
2
+ export class Document {
3
+ constructor(data, model) {
4
+ if (data == null) {
5
+ throw new Error("Cannot create Document with null or undefined data");
6
+ }
7
+ if (typeof data !== "object" || Array.isArray(data)) {
8
+ throw new Error("Document data must be an object");
9
+ }
10
+ Object.assign(this, data);
11
+ Object.defineProperty(this, "_model", {
12
+ value: model,
13
+ enumerable: false,
14
+ writable: false,
15
+ configurable: false,
16
+ });
17
+ }
18
+ _model;
19
+ async save() {
20
+ try {
21
+ const data = this.toRaw();
22
+ //typeChecker(this._model, data)
23
+ return await this._model.update(data);
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Failed to save document: ${error.message}`);
27
+ }
28
+ }
29
+ async delete() {
30
+ try {
31
+ return await this._model.delete(this.toRaw());
32
+ }
33
+ catch (error) {
34
+ throw new Error(`Failed to delete document: ${error.message}`);
35
+ }
36
+ }
37
+ toRaw() {
38
+ const raw = {};
39
+ for (const key in this) {
40
+ if (key === "_model")
41
+ continue;
42
+ if (this.propertyIsEnumerable(key)) {
43
+ const value = this[key];
44
+ try {
45
+ JSON.stringify(value);
46
+ raw[key] = value;
47
+ }
48
+ catch (error) {
49
+ raw[key] = String(value);
50
+ }
51
+ }
52
+ }
53
+ return raw;
54
+ }
55
+ isValid() {
56
+ try {
57
+ //typeChecker(this._model, this.toRaw())
58
+ return true;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ getChangedFields(original) {
65
+ const current = this.toRaw();
66
+ const changed = [];
67
+ for (const key in current) {
68
+ if (!(key in original) || current[key] !== original[key]) {
69
+ changed.push(key);
70
+ }
71
+ }
72
+ return changed;
73
+ }
74
+ }
75
+ export default Document;
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/document/index.ts"],"names":[],"mappings":"AACA,gDAAgD;AAEhD,MAAM,OAAO,QAAQ;IACpB,YAAY,IAAU,EAAE,KAAuB;QAC9C,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACd,oDAAoD,CACpD,CAAA;QACF,CAAC;QAED,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACnD,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAEzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE;YACrC,KAAK,EAAE,KAAK;YACZ,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,KAAK;SACnB,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAmB;IAEzB,KAAK,CAAC,IAAI;QACT,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;YAEzB,gCAAgC;YAEhC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAW,CAAC,CAAA;QAC7C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7D,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM;QACX,IAAI,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAS,CAAC,CAAA;QACrD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/D,CAAC;IACF,CAAC;IAED,KAAK;QACJ,MAAM,GAAG,GAAQ,EAAE,CAAA;QAEnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,GAAG,KAAK,QAAQ;gBAAE,SAAQ;YAE9B,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAI,IAAY,CAAC,GAAG,CAAC,CAAA;gBAEhC,IAAI,CAAC;oBACJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;oBACrB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACjB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;gBACzB,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,GAAW,CAAA;IACnB,CAAC;IAED,OAAO;QACN,IAAI,CAAC;YACJ,wCAAwC;YACxC,OAAO,IAAI,CAAA;QACZ,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,KAAK,CAAA;QACb,CAAC;IACF,CAAC;IAED,gBAAgB,CAAC,QAAuB;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAyB,CAAA;QACnD,MAAM,OAAO,GAAmB,EAAE,CAAA;QAElC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAM,QAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,GAAiB,CAAC,CAAA;YAChC,CAAC;QACF,CAAC;QAED,OAAO,OAAO,CAAA;IACf,CAAC;CACD;AAED,eAAe,QAAQ,CAAA"}
package/global.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { Client } from "./client";
2
+ declare global {
3
+ var __scylla_client: Client;
4
+ }
5
+ export {};
6
+ //# sourceMappingURL=global.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEtC,OAAO,CAAC,MAAM,CAAC;IACd,IAAI,eAAe,EAAE,MAAM,CAAA;CAC3B;AAED,OAAO,EAAE,CAAA"}
package/global.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=global.js.map
package/global.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.js","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":""}
package/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
- import { Schema } from "./schema/index.js";
2
- import { Model } from "./model/index.js";
3
- import { Document } from "./document/index.js";
4
- import { ColumnTypes } from "./types.js";
5
- import { Client } from "./client.js";
6
- import { Batch } from "./batch/index.js";
7
- export { Batch, Client, Client as default, ColumnTypes, Model, Document as Result, Schema };
1
+ import Client from "./client";
2
+ import Model from "./model";
3
+ import Schema from "./schema";
4
+ import Document from "./document";
5
+ import { Batch } from "./batch";
6
+ import { ColumnTypes } from "./types";
7
+ export default Client;
8
+ export { Client, Batch, Model, Schema, Document as Result, ColumnTypes };
9
+ //# sourceMappingURL=index.d.ts.map