@boltstore/client 0.5.2 → 0.6.1

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 (54) hide show
  1. package/README.md +76 -74
  2. package/dist/api/auth.d.ts +17 -0
  3. package/dist/api/auth.d.ts.map +1 -0
  4. package/dist/api/auth.js +63 -0
  5. package/dist/api/auth.js.map +1 -0
  6. package/dist/api/collections.d.ts +7 -0
  7. package/dist/api/collections.d.ts.map +1 -0
  8. package/dist/api/collections.js +13 -0
  9. package/dist/api/collections.js.map +1 -0
  10. package/dist/api/health.d.ts +6 -0
  11. package/dist/api/health.d.ts.map +1 -0
  12. package/dist/api/health.js +9 -0
  13. package/dist/api/health.js.map +1 -0
  14. package/dist/api/records.d.ts +16 -0
  15. package/dist/api/records.d.ts.map +1 -0
  16. package/dist/api/records.js +100 -0
  17. package/dist/api/records.js.map +1 -0
  18. package/dist/client.d.ts +38 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +136 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/errors.d.ts +7 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +10 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +12 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +10 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/jwt.d.ts +5 -0
  31. package/dist/jwt.d.ts.map +1 -0
  32. package/dist/jwt.js +13 -0
  33. package/dist/jwt.js.map +1 -0
  34. package/dist/typed-collection.d.ts +34 -0
  35. package/dist/typed-collection.d.ts.map +1 -0
  36. package/dist/typed-collection.js +103 -0
  37. package/dist/typed-collection.js.map +1 -0
  38. package/dist/types.d.ts +68 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +14 -33
  43. package/src/adapters/node.ts +0 -61
  44. package/src/adapters/react-native.ts +0 -74
  45. package/src/adapters/web.ts +0 -103
  46. package/src/auth.ts +0 -225
  47. package/src/client.ts +0 -247
  48. package/src/collections.ts +0 -88
  49. package/src/index.ts +0 -102
  50. package/src/realtime.ts +0 -194
  51. package/src/records.ts +0 -291
  52. package/src/storage.ts +0 -243
  53. package/src/sync.ts +0 -546
  54. package/src/typegen/cli.ts +0 -162
package/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # @boltstore/client
2
2
 
3
- TypeScript SDK for Boltstore. Works in Bun, Node 18+, browsers, and React Native.
4
-
5
- **Zero external dependencies** (only `@boltstore/utils` for types).
3
+ JavaScript/TypeScript SDK for Boltstore. Works in the browser, Node.js, and React Native.
6
4
 
7
5
  ## Installation
8
6
 
@@ -10,106 +8,110 @@ TypeScript SDK for Boltstore. Works in Bun, Node 18+, browsers, and React Native
10
8
  npm install @boltstore/client
11
9
  ```
12
10
 
13
- ## Quick Start
11
+ ## Quick start
14
12
 
15
- ```ts
16
- import { BoltstoreClient, login, listRecords } from "@boltstore/client";
13
+ ```typescript
14
+ import { BoltStoreClient } from "@boltstore/client";
17
15
 
18
- const client = new BoltstoreClient({
19
- url: "http://localhost:8090",
16
+ const client = new BoltStoreClient({
17
+ url: "http://localhost:8080",
20
18
  });
21
19
 
22
- // Authenticate
23
- await login(client, {
24
- email: "alice@example.com",
25
- password: "secret123",
20
+ // Collections
21
+ const collections = await client.collections.list();
22
+
23
+ // Records
24
+ const records = await client.records.list("posts", {
25
+ filter: "status:eq:published",
26
+ sort: ["created_at:desc"],
27
+ pagination: { page: 1, perPage: 20 },
26
28
  });
27
29
 
28
- // Query records
29
- const todos = await listRecords(client, "todos", {
30
- filter: "status = 'active'",
31
- sort: "-created",
32
- perPage: 50,
30
+ const record = await client.records.create("posts", {
31
+ title: "Hello World",
32
+ content: "My first post",
33
33
  });
34
34
 
35
- console.log(todos.items);
36
- ```
35
+ const updated = await client.records.update("posts", record.id, {
36
+ title: "Updated title",
37
+ });
37
38
 
38
- ## Features
39
+ await client.records.delete("posts", record.id);
39
40
 
40
- | Module | Description |
41
- |--------|-------------|
42
- | `client.ts` | Main client — auth state, request helpers, auto-refresh |
43
- | `auth.ts` | Login, register, refresh, logout, OAuth2 |
44
- | `records.ts` | CRUD operations, filtering, sorting, pagination |
45
- | `collections.ts` | Read/write collection schemas |
46
- | `realtime.ts` | WebSocket subscriptions, auto-reconnect |
47
- | `sync.ts` | Offline-first sync engine with conflict resolution |
48
- | `storage.ts` | File upload, download, presigned URLs |
49
- | `adapters/` | Platform adapters: Node/Bun, Web, React Native |
50
- | `typegen/` | CLI to generate TypeScript types from your schema |
41
+ // Auth (Phase 2)
42
+ const { token, user } = await client.auth.login({
43
+ email: "user@example.com",
44
+ password: "secret",
45
+ });
51
46
 
52
- ## Platform Adapters
47
+ // Realtime (Phase 3)
48
+ const unsubscribe = client.realtime.subscribe("posts", (event) => {
49
+ console.log("Change:", event);
50
+ });
53
51
 
54
- ```ts
55
- // Node / Bun (auto-detected)
56
- import { createNodeAdapter } from "@boltstore/client/adapters/node";
52
+ // Sync (Phase 4)
53
+ client.sync.start({ collections: ["posts"] });
54
+ ```
57
55
 
58
- // Browser
59
- import { createWebAdapter } from "@boltstore/client/adapters/web";
56
+ ## API
60
57
 
61
- // React Native
62
- import { createReactNativeAdapter } from "@boltstore/client/adapters/react-native";
58
+ ### Client
63
59
 
64
- // Or auto-detect
65
- import { autoDetectAdapter } from "@boltstore/client/adapters/web";
60
+ ```typescript
61
+ const client = new BoltStoreClient({ url: string, token?: string });
62
+ client.setToken(token: string);
63
+ client.onTokenExpired(callback: () => Promise<string>);
66
64
  ```
67
65
 
68
- ## Realtime Subscriptions
69
-
70
- ```ts
71
- import { connectRealtime } from "@boltstore/client";
66
+ ### Collections
72
67
 
73
- const rt = connectRealtime(client);
68
+ ```typescript
69
+ client.collections.list(): Promise<Collection[]>
70
+ client.collections.get(name: string): Promise<Collection>
71
+ ```
74
72
 
75
- const unsub = rt.subscribe("table:app_123:todos", (event) => {
76
- console.log(`${event.type}:`, event.record);
77
- });
73
+ ### Records
78
74
 
79
- // Later: unsub(); to stop receiving events
75
+ ```typescript
76
+ client.records.list(collection: string, options?: QueryOptions): Promise<PaginatedResponse>
77
+ client.records.get(collection: string, id: string): Promise<Record>
78
+ client.records.create(collection: string, data: object): Promise<Record>
79
+ client.records.update(collection: string, id: string, data: object): Promise<Record>
80
+ client.records.delete(collection: string, id: string): Promise<void>
81
+ client.records.count(collection: string, filter?: string): Promise<number>
80
82
  ```
81
83
 
82
- ## Offline Sync
83
-
84
- ```ts
85
- import { enableSync } from "@boltstore/client";
84
+ ### Query Options
85
+
86
+ ```typescript
87
+ interface QueryOptions {
88
+ filter?: string;
89
+ sort?: string[];
90
+ page?: number;
91
+ perPage?: number;
92
+ cursor?: string;
93
+ limit?: number;
94
+ fields?: string[];
95
+ expand?: string[];
96
+ search?: string;
97
+ }
98
+ ```
86
99
 
87
- const sync = enableSync(client, {
88
- collections: ["todos", "notes"],
89
- onConflict: (local, server, strategy) => {
90
- // Custom conflict resolution
91
- return server; // server-wins default
92
- },
93
- });
100
+ ## Development
94
101
 
95
- // Track local changes
96
- sync.trackLocalChange({
97
- rowId: "rec_123",
98
- collection: "todos",
99
- operation: "update",
100
- field: "title",
101
- newValue: "Updated offline",
102
- });
102
+ ```bash
103
+ bun install
104
+ bun run build # compile TypeScript
105
+ bun test # run tests
106
+ bun run dev # watch mode
103
107
  ```
104
108
 
105
- ## Type Generation
106
-
107
- Generate TypeScript types from your Boltstore schema:
109
+ ## Publishing
108
110
 
109
111
  ```bash
110
- boltstore typegen --url http://localhost:8090 --output types.ts
112
+ npm publish
111
113
  ```
112
114
 
113
115
  ## License
114
116
 
115
- MIT
117
+ MIT
@@ -0,0 +1,17 @@
1
+ import type { BoltstoreClient } from "../client";
2
+ import type { UserProfile, TokenPair, OAuthProvider } from "../types";
3
+ export declare function createAuthApi(client: BoltstoreClient): {
4
+ register: (email: string, password: string) => Promise<UserProfile>;
5
+ login: (email: string, password: string) => Promise<TokenPair>;
6
+ refresh: (refreshToken?: string) => Promise<TokenPair>;
7
+ autoRefresh: (thresholdSeconds?: number) => Promise<TokenPair | null>;
8
+ logout: () => Promise<void>;
9
+ me: () => Promise<UserProfile>;
10
+ updateProfile: (data: {
11
+ email?: string;
12
+ password?: string;
13
+ }) => Promise<UserProfile>;
14
+ oauthUrl: (provider: OAuthProvider, redirectUri: string) => Promise<string>;
15
+ oauthExchange: (provider: OAuthProvider, code: string, redirectUri: string) => Promise<TokenPair>;
16
+ };
17
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAItE,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe;sBAEzB,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,WAAW,CAAC;mBAKlD,MAAM,YAAY,MAAM,KAAG,OAAO,CAAC,SAAS,CAAC;6BAOnC,MAAM,KAAG,OAAO,CAAC,SAAS,CAAC;gDASd,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;kBASnD,OAAO,CAAC,IAAI,CAAC;cAMjB,OAAO,CAAC,WAAW,CAAC;0BAKN;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,WAAW,CAAC;yBAK7D,aAAa,eAAe,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC;8BAQ/C,aAAa,QAAQ,MAAM,eAAe,MAAM,KAAG,OAAO,CAAC,SAAS,CAAC;EAUxG"}
@@ -0,0 +1,63 @@
1
+ import { decodeJwtPayload } from "../jwt";
2
+ import { BoltstoreError } from "../errors";
3
+ export function createAuthApi(client) {
4
+ return {
5
+ register: async (email, password) => {
6
+ const res = await client.request("POST", client.dbPath("/auth/register"), { email, password });
7
+ return res.data;
8
+ },
9
+ login: async (email, password) => {
10
+ const res = await client.request("POST", client.dbPath("/auth/login"), { email, password });
11
+ client.setToken(res.data.accessToken);
12
+ client.setRefreshToken(res.data.refreshToken);
13
+ return res.data;
14
+ },
15
+ refresh: async (refreshToken) => {
16
+ const token = refreshToken || client.getRefreshToken();
17
+ if (!token)
18
+ throw new BoltstoreError(400, "MISSING_REFRESH_TOKEN", "No refresh token available.");
19
+ const res = await client.request("POST", client.dbPath("/auth/refresh"), { refreshToken: token });
20
+ client.setToken(res.data.accessToken);
21
+ client.setRefreshToken(res.data.refreshToken);
22
+ return res.data;
23
+ },
24
+ autoRefresh: async (thresholdSeconds = 60) => {
25
+ if (!client.getToken() || !client.getRefreshToken())
26
+ return null;
27
+ const payload = decodeJwtPayload(client.getToken());
28
+ if (!payload || !payload.exp)
29
+ return null;
30
+ const nowSec = Math.floor(Date.now() / 1000);
31
+ if (payload.exp - nowSec > thresholdSeconds)
32
+ return null;
33
+ return client.auth.refresh();
34
+ },
35
+ logout: async () => {
36
+ await client.request("POST", client.dbPath("/auth/logout"));
37
+ client.setToken(undefined);
38
+ client.setRefreshToken(undefined);
39
+ },
40
+ me: async () => {
41
+ const res = await client.request("GET", client.dbPath("/auth/me"));
42
+ return res.data;
43
+ },
44
+ updateProfile: async (data) => {
45
+ const res = await client.request("PATCH", client.dbPath("/auth/me"), data);
46
+ return res.data;
47
+ },
48
+ oauthUrl: async (provider, redirectUri) => {
49
+ const res = await client.request("GET", client.dbPath(`/auth/oauth/${provider}/url?redirect_uri=${encodeURIComponent(redirectUri)}`));
50
+ return res.data.url;
51
+ },
52
+ oauthExchange: async (provider, code, redirectUri) => {
53
+ const res = await client.request("POST", client.dbPath(`/auth/oauth/${provider}`), {
54
+ code,
55
+ redirect_uri: redirectUri,
56
+ });
57
+ client.setToken(res.data.accessToken);
58
+ client.setRefreshToken(res.data.refreshToken);
59
+ return res.data;
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BoltstoreClient } from "../client";
2
+ import type { CollectionInfo } from "@boltstore/utils";
3
+ export declare function createCollectionsApi(client: BoltstoreClient): {
4
+ list: () => Promise<CollectionInfo[]>;
5
+ get: (name: string) => Promise<CollectionInfo>;
6
+ };
7
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/api/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe;gBAExC,OAAO,CAAC,cAAc,EAAE,CAAC;gBAKvB,MAAM,KAAG,OAAO,CAAC,cAAc,CAAC;EAKrD"}
@@ -0,0 +1,13 @@
1
+ export function createCollectionsApi(client) {
2
+ return {
3
+ list: async () => {
4
+ const res = await client.request("GET", client.dbPath("/collections"));
5
+ return res.data ?? [];
6
+ },
7
+ get: async (name) => {
8
+ const res = await client.request("GET", client.dbPath(`/collections/${name}`));
9
+ return res.data;
10
+ },
11
+ };
12
+ }
13
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/api/collections.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAAC,MAAuB;IAC1D,OAAO;QACL,IAAI,EAAE,KAAK,IAA+B,EAAE;YAC1C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAmB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;YACzF,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,GAAG,EAAE,KAAK,EAAE,IAAY,EAA2B,EAAE;YACnD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAiB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/F,OAAO,GAAG,CAAC,IAAK,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { BoltstoreClient } from "../client";
2
+ import type { HealthCheck } from "../types";
3
+ export declare function createHealthApi(client: BoltstoreClient): {
4
+ check: () => Promise<HealthCheck>;
5
+ };
6
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/api/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe;iBAElC,OAAO,CAAC,WAAW,CAAC;EAKxC"}
@@ -0,0 +1,9 @@
1
+ export function createHealthApi(client) {
2
+ return {
3
+ check: async () => {
4
+ const res = await client.request("GET", "/api/health");
5
+ return res.data ?? { status: "unknown", version: "", uptime: 0, timestamp: "" };
6
+ },
7
+ };
8
+ }
9
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/api/health.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAO;QACL,KAAK,EAAE,KAAK,IAA0B,EAAE;YACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAc,KAAK,EAAE,aAAa,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAClF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { BoltstoreClient } from "../client";
2
+ import type { BoltstoreRecord, ListOptions, BatchOperation, BatchResult } from "@boltstore/utils";
3
+ import type { PaginateOptions, PaginatedResult } from "../types";
4
+ export declare function createRecordsApi(client: BoltstoreClient): {
5
+ create: (collection: string, data: Record<string, unknown>) => Promise<BoltstoreRecord>;
6
+ list: (collection: string, options?: ListOptions) => Promise<BoltstoreRecord[]>;
7
+ get: (collection: string, id: string) => Promise<BoltstoreRecord>;
8
+ update: (collection: string, id: string, data: Record<string, unknown>) => Promise<BoltstoreRecord>;
9
+ delete: (collection: string, id: string) => Promise<void>;
10
+ count: (collection: string, filter?: Record<string, unknown>) => Promise<number>;
11
+ distinct: (collection: string, field: string) => Promise<unknown[]>;
12
+ batch: (collection: string, operations: BatchOperation[]) => Promise<BatchResult>;
13
+ paginate: (collection: string, options: PaginateOptions) => Promise<PaginatedResult<BoltstoreRecord>>;
14
+ listAll: (collection: string, options?: Omit<PaginateOptions, "page">) => Promise<BoltstoreRecord[]>;
15
+ };
16
+ //# sourceMappingURL=records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/api/records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAChH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGjE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe;yBAEzB,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,eAAe,CAAC;uBAKlE,MAAM,YAAY,WAAW,KAAG,OAAO,CAAC,eAAe,EAAE,CAAC;sBAM3D,MAAM,MAAM,MAAM,KAAG,OAAO,CAAC,eAAe,CAAC;yBAK1C,MAAM,MAAM,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,eAAe,CAAC;yBAK5E,MAAM,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;wBAInC,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,MAAM,CAAC;2BAiBvD,MAAM,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,EAAE,CAAC;wBAQ7C,MAAM,cAAc,cAAc,EAAE,KAAG,OAAO,CAAC,WAAW,CAAC;2BAKxD,MAAM,WAAW,eAAe,KAAG,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;0BA+B7E,MAAM,YAAY,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,KAAG,OAAO,CAAC,eAAe,EAAE,CAAC;EAiB3G"}
@@ -0,0 +1,100 @@
1
+ import { BoltstoreError } from "../errors";
2
+ export function createRecordsApi(client) {
3
+ return {
4
+ create: async (collection, data) => {
5
+ const res = await client.request("POST", client.dbPath(`/collections/${collection}/records`), data);
6
+ return res.data;
7
+ },
8
+ list: async (collection, options) => {
9
+ const path = client.buildListPath(collection, options);
10
+ const res = await client.request("GET", path);
11
+ return res.data ?? [];
12
+ },
13
+ get: async (collection, id) => {
14
+ const res = await client.request("GET", client.dbPath(`/collections/${collection}/records/${id}`));
15
+ return res.data;
16
+ },
17
+ update: async (collection, id, data) => {
18
+ const res = await client.request("PATCH", client.dbPath(`/collections/${collection}/records/${id}`), data);
19
+ return res.data;
20
+ },
21
+ delete: async (collection, id) => {
22
+ await client.request("DELETE", client.dbPath(`/collections/${collection}/records/${id}`));
23
+ },
24
+ count: async (collection, filter) => {
25
+ const params = new URLSearchParams();
26
+ if (filter) {
27
+ for (const [k, v] of Object.entries(filter)) {
28
+ if (v === null || v === undefined)
29
+ continue;
30
+ if (typeof v === "object" && !Array.isArray(v)) {
31
+ throw new BoltstoreError(400, "INVALID_FILTER", `Filter value for "${k}" must be a scalar or array.`);
32
+ }
33
+ params.set(k, Array.isArray(v) ? v.join(",") : String(v));
34
+ }
35
+ }
36
+ const qs = params.toString();
37
+ const path = client.dbPath(`/collections/${collection}/records/count`) + (qs ? `?${qs}` : "");
38
+ const res = await client.request("GET", path);
39
+ return res.data?.count ?? 0;
40
+ },
41
+ distinct: async (collection, field) => {
42
+ const res = await client.request("GET", client.dbPath(`/collections/${collection}/records/distinct?field=${encodeURIComponent(field)}`));
43
+ return res.data?.values ?? [];
44
+ },
45
+ batch: async (collection, operations) => {
46
+ const res = await client.request("POST", client.dbPath(`/collections/${collection}/records/batch`), operations);
47
+ return res.data;
48
+ },
49
+ paginate: async (collection, options) => {
50
+ const perPage = options.perPage ?? 50;
51
+ const params = new URLSearchParams();
52
+ params.set("page", String(options.page));
53
+ params.set("per_page", String(perPage));
54
+ if (options.sort)
55
+ params.set("sort", options.sort);
56
+ if (options.direction)
57
+ params.set("direction", options.direction);
58
+ if (options.filter) {
59
+ for (const [k, v] of Object.entries(options.filter)) {
60
+ if (v === null || v === undefined)
61
+ continue;
62
+ if (typeof v === "object" && !Array.isArray(v)) {
63
+ throw new BoltstoreError(400, "INVALID_FILTER", `Filter value for "${k}" must be a scalar or array.`);
64
+ }
65
+ params.set(k, Array.isArray(v) ? v.join(",") : String(v));
66
+ }
67
+ }
68
+ const qs = params.toString();
69
+ const path = client.dbPath(`/collections/${collection}/records`) + (qs ? `?${qs}` : "");
70
+ const res = await client.request("GET", path);
71
+ const meta = res.meta ?? {};
72
+ return {
73
+ data: res.data ?? [],
74
+ meta: {
75
+ page: meta.page ?? options.page,
76
+ per_page: meta.per_page ?? perPage,
77
+ total: meta.total ?? (res.data?.length ?? 0),
78
+ total_pages: meta.total_pages ?? 1,
79
+ },
80
+ };
81
+ },
82
+ listAll: async (collection, options) => {
83
+ const perPage = options?.perPage ?? 100;
84
+ const maxPages = 1000;
85
+ const all = [];
86
+ let page = 1;
87
+ while (true) {
88
+ const result = await client.records.paginate(collection, { ...options, page, perPage });
89
+ all.push(...result.data);
90
+ if (page >= result.meta.total_pages)
91
+ break;
92
+ if (page >= maxPages)
93
+ throw new BoltstoreError(400, "TOO_MANY_PAGES", `listAll stopped after ${maxPages} pages.`);
94
+ page++;
95
+ }
96
+ return all;
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/api/records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { ApiResponse, BoltstoreRecord, ListOptions, QueryOptions } from "@boltstore/utils";
2
+ import { BoltstoreError } from "./errors";
3
+ import type { TypedCollection } from "./types";
4
+ import type { HttpMethod, TokenPair, UserProfile, OAuthProvider, ClientConfig, HealthCheck, PaginatedResult, TypedRecord, TypedBatchOperation, PaginateOptions } from "./types";
5
+ import { createAuthApi } from "./api/auth";
6
+ import { createHealthApi } from "./api/health";
7
+ import { createCollectionsApi } from "./api/collections";
8
+ import { createRecordsApi } from "./api/records";
9
+ export { BoltstoreError };
10
+ export { TypedCollectionImpl } from "./typed-collection";
11
+ export type { TypedCollection } from "./typed-collection";
12
+ export type { TokenPair, UserProfile, OAuthProvider, ClientConfig, HealthCheck, PaginatedResult, PaginateOptions, TypedRecord, TypedBatchOperation, };
13
+ export declare class BoltstoreClient {
14
+ private baseUrl;
15
+ private database;
16
+ private databaseId;
17
+ private token;
18
+ private refreshToken;
19
+ auth: ReturnType<typeof createAuthApi>;
20
+ health: ReturnType<typeof createHealthApi>;
21
+ collections: ReturnType<typeof createCollectionsApi>;
22
+ records: ReturnType<typeof createRecordsApi>;
23
+ constructor(config: ClientConfig);
24
+ collection<Fields = Record<string, unknown>>(name: string): TypedCollection<Fields>;
25
+ setToken(token: string | undefined): void;
26
+ getToken(): string | undefined;
27
+ setRefreshToken(token: string | undefined): void;
28
+ getRefreshToken(): string | undefined;
29
+ query(options: QueryOptions): Promise<{
30
+ data: BoltstoreRecord[];
31
+ meta: Record<string, unknown>;
32
+ }>;
33
+ request<T = unknown>(method: HttpMethod, path: string, body?: unknown, retries?: number): Promise<ApiResponse<T>>;
34
+ dbPath(path: string): string;
35
+ buildListPath(collection: string, options?: ListOptions): string;
36
+ }
37
+ export default BoltstoreClient;
38
+ //# 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,EACV,WAAW,EAEX,eAAe,EACf,WAAW,EAGX,YAAY,EACb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,WAAW,EACX,mBAAmB,EACnB,eAAe,EAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,eAAe,EACf,WAAW,EACX,mBAAmB,GACpB,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,YAAY,CAAqB;IAEzC,IAAI,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IACvC,MAAM,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC3C,WAAW,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;IACrD,OAAO,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;gBAEjC,MAAM,EAAE,YAAY;IAwBhC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;IAInF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIzC,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIhD,eAAe,IAAI,MAAM,GAAG,SAAS;IAI/B,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAKjG,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,SAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAkDlH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAM5B,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM;CAoBjE;AAED,eAAe,eAAe,CAAC"}