@auxilium/datalynk-client 0.9.12 → 1.0.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.
- package/README.md +22 -15
- package/dist/api.d.ts +16 -19
- package/dist/api.d.ts.map +1 -1
- package/dist/auth.d.ts +0 -1
- package/dist/files.d.ts +8 -4
- package/dist/files.d.ts.map +1 -1
- package/dist/index.cjs +265 -323
- package/dist/index.mjs +265 -323
- package/dist/login-prompt.d.ts +0 -1
- package/dist/pdf.d.ts +0 -1
- package/dist/slice.d.ts +56 -102
- package/dist/slice.d.ts.map +1 -1
- package/dist/socket.d.ts +1 -2
- package/dist/socket.d.ts.map +1 -1
- package/dist/superuser.d.ts +0 -1
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -157,7 +157,7 @@ import {Contact} from 'models/contact'; // Import model for slice we will be usi
|
|
|
157
157
|
|
|
158
158
|
const contacts: Contact[] = await api.slice<Contact>(Slices.Contact)
|
|
159
159
|
.select()
|
|
160
|
-
.
|
|
160
|
+
.rows().exec();
|
|
161
161
|
```
|
|
162
162
|
|
|
163
163
|
</details>
|
|
@@ -167,6 +167,15 @@ const contacts: Contact[] = await api.slice<Contact>(Slices.Contact)
|
|
|
167
167
|
<h3 id="authentication" style="display: inline">Authentication</h3>
|
|
168
168
|
</summary>
|
|
169
169
|
|
|
170
|
+
#### Guest
|
|
171
|
+
|
|
172
|
+
Login as the guest account
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
const guest = await api.auth.loginGuest();
|
|
176
|
+
console.log(api.auth.isGuest()) // True
|
|
177
|
+
```
|
|
178
|
+
|
|
170
179
|
#### Login flow
|
|
171
180
|
|
|
172
181
|
This library comes with some logic to automatically handle the login flow & should be called at the startup of your application:
|
|
@@ -212,7 +221,7 @@ const user = await api.auth.login('spoke', 'username', 'password', '2faCode');
|
|
|
212
221
|
Multiple requests can be chained together to run them in order. The last request's response will be returned
|
|
213
222
|
|
|
214
223
|
```js
|
|
215
|
-
const report = await api.chain({'$/auth/current': {}}, api.slice(12345).select());
|
|
224
|
+
const report = await api.chain({'$/auth/current': {}}, api.slice(12345).select().rows());
|
|
216
225
|
```
|
|
217
226
|
|
|
218
227
|
All results can be returned together by using the `chainMap`
|
|
@@ -220,7 +229,7 @@ All results can be returned together by using the `chainMap`
|
|
|
220
229
|
```js
|
|
221
230
|
const {user, report} = await api.chainMap({
|
|
222
231
|
user: {'$/auth/current': {}},
|
|
223
|
-
report: api.slice(52131).select()
|
|
232
|
+
report: api.slice(52131).select().rows()
|
|
224
233
|
});
|
|
225
234
|
```
|
|
226
235
|
|
|
@@ -239,12 +248,12 @@ This library comes with LINQ style query language to help make interacting with
|
|
|
239
248
|
// Get a single record
|
|
240
249
|
const row = await api.slice<T>(12345)
|
|
241
250
|
.select(12345)
|
|
242
|
-
.
|
|
251
|
+
.row().exec();
|
|
243
252
|
|
|
244
253
|
// Get all slice records
|
|
245
254
|
const rows = await api.slice<T>(12345)
|
|
246
255
|
.select()
|
|
247
|
-
.
|
|
256
|
+
.rows().exec();
|
|
248
257
|
|
|
249
258
|
// Advanced queries
|
|
250
259
|
const rows = await api.slice<T>(12345)
|
|
@@ -255,7 +264,7 @@ const rows = await api.slice<T>(12345)
|
|
|
255
264
|
.where({field1: 0, field2: false})
|
|
256
265
|
.order('field2', true) // ascending
|
|
257
266
|
.limit(10)
|
|
258
|
-
.
|
|
267
|
+
.rows().exec();
|
|
259
268
|
```
|
|
260
269
|
|
|
261
270
|
#### Count
|
|
@@ -264,7 +273,7 @@ const rows = await api.slice<T>(12345)
|
|
|
264
273
|
const count = await api.slice(12345)
|
|
265
274
|
.count()
|
|
266
275
|
.where({field1: 'value'})
|
|
267
|
-
.
|
|
276
|
+
.count().exec();
|
|
268
277
|
```
|
|
269
278
|
|
|
270
279
|
#### Insert
|
|
@@ -273,7 +282,7 @@ const count = await api.slice(12345)
|
|
|
273
282
|
// Insert record
|
|
274
283
|
const key = await api.slice<Contact>(12345)
|
|
275
284
|
.insert({first: 'Bilbo', last: 'Baggins'})
|
|
276
|
-
.
|
|
285
|
+
.id().exec();
|
|
277
286
|
|
|
278
287
|
// Insert multiple rows
|
|
279
288
|
const keys = await api.slice<Contacts>(12345)
|
|
@@ -281,7 +290,7 @@ const keys = await api.slice<Contacts>(12345)
|
|
|
281
290
|
{first: 'Darth', last: 'Vader'},
|
|
282
291
|
{first: 'John', last: 'Snow'}
|
|
283
292
|
])
|
|
284
|
-
.
|
|
293
|
+
.ids().exec();
|
|
285
294
|
```
|
|
286
295
|
|
|
287
296
|
#### Update
|
|
@@ -290,13 +299,13 @@ const keys = await api.slice<Contacts>(12345)
|
|
|
290
299
|
// Update a record
|
|
291
300
|
const success = await api.slice(12345)
|
|
292
301
|
.update({id: 1, first: 'James', last: 'Kirk'})
|
|
293
|
-
.
|
|
302
|
+
.id().exec();
|
|
294
303
|
|
|
295
304
|
// Update multiple rows with where
|
|
296
305
|
await api.slice(12345)
|
|
297
306
|
.update({evil: true})
|
|
298
307
|
.where({first: 'Darth'})
|
|
299
|
-
.
|
|
308
|
+
.ids().exec();
|
|
300
309
|
```
|
|
301
310
|
|
|
302
311
|
#### Delete
|
|
@@ -305,13 +314,13 @@ await api.slice(12345)
|
|
|
305
314
|
// Delete a record
|
|
306
315
|
const success = await api.slice(12345)
|
|
307
316
|
.delete(12345)
|
|
308
|
-
.
|
|
317
|
+
.id().exec();
|
|
309
318
|
|
|
310
319
|
// Dlete multiple rows with where
|
|
311
320
|
await api.slice(12345)
|
|
312
321
|
.delete()
|
|
313
322
|
.where({first: 'Darth'})
|
|
314
|
-
.
|
|
323
|
+
.ids().exec();
|
|
315
324
|
```
|
|
316
325
|
|
|
317
326
|
</details>
|
|
@@ -363,8 +372,6 @@ api.socket.addListener(callbackFn(event)); // listen to all socket events
|
|
|
363
372
|
|
|
364
373
|
</details>
|
|
365
374
|
|
|
366
|
-
</details>
|
|
367
|
-
|
|
368
375
|
<details>
|
|
369
376
|
<summary>
|
|
370
377
|
<h3 id="uploads" style="display: inline">Uploads</h3>
|
package/dist/api.d.ts
CHANGED
|
@@ -2,10 +2,9 @@ import { BehaviorSubject } from 'rxjs';
|
|
|
2
2
|
import { Auth } from './auth';
|
|
3
3
|
import { Files } from './files';
|
|
4
4
|
import { Pdf } from './pdf';
|
|
5
|
-
import { Slice
|
|
5
|
+
import { Slice } from './slice';
|
|
6
6
|
import { Socket } from './socket';
|
|
7
7
|
import { Superuser } from './superuser';
|
|
8
|
-
|
|
9
8
|
export type JwtPayload = {
|
|
10
9
|
aud: string;
|
|
11
10
|
email: string;
|
|
@@ -37,12 +36,10 @@ export type ApiOptions = {
|
|
|
37
36
|
* Possible options for API calls
|
|
38
37
|
*/
|
|
39
38
|
export interface ApiRequestOptions {
|
|
40
|
-
/** Skip
|
|
41
|
-
|
|
39
|
+
/** Skip bundling & caching */
|
|
40
|
+
noOptimize?: boolean;
|
|
42
41
|
/** Skip the token translating step */
|
|
43
42
|
raw?: boolean;
|
|
44
|
-
/** Skip wrapping IDs in an array */
|
|
45
|
-
rawUpload?: boolean;
|
|
46
43
|
}
|
|
47
44
|
/** API error response */
|
|
48
45
|
export interface ApiError {
|
|
@@ -66,7 +63,7 @@ export declare class Api {
|
|
|
66
63
|
private bundleOngoing;
|
|
67
64
|
/** LocalStorage key for persisting logins */
|
|
68
65
|
private localStorageKey;
|
|
69
|
-
/** Pending requests */
|
|
66
|
+
/** Pending requests cache */
|
|
70
67
|
private pending;
|
|
71
68
|
/** Authentication helpers */
|
|
72
69
|
readonly auth: Auth;
|
|
@@ -78,7 +75,7 @@ export declare class Api {
|
|
|
78
75
|
readonly socket: Socket;
|
|
79
76
|
/** Superuser helpers */
|
|
80
77
|
readonly superuser: Superuser;
|
|
81
|
-
/** API endpoint */
|
|
78
|
+
/** API URL endpoint */
|
|
82
79
|
readonly url: string;
|
|
83
80
|
/** API Session token */
|
|
84
81
|
token$: BehaviorSubject<string | null>;
|
|
@@ -110,7 +107,7 @@ export declare class Api {
|
|
|
110
107
|
/**
|
|
111
108
|
* Chain multiple requests to execute together
|
|
112
109
|
* @param {Slice<any>} requests List of requests to chain
|
|
113
|
-
* @return {Promise<
|
|
110
|
+
* @return {Promise<any>} API Response
|
|
114
111
|
*/
|
|
115
112
|
chain(...requests: (any | Slice<any>)[]): Promise<any>;
|
|
116
113
|
/**
|
|
@@ -121,6 +118,14 @@ export declare class Api {
|
|
|
121
118
|
chainMap(request: {
|
|
122
119
|
[key: string]: any;
|
|
123
120
|
}): Promise<any>;
|
|
121
|
+
/**
|
|
122
|
+
* Exact same as `request` method, but logs the response in the console automatically
|
|
123
|
+
*
|
|
124
|
+
* @param {object | string} data Datalynk request as object or string
|
|
125
|
+
* @param {ApiRequestOptions} options
|
|
126
|
+
* @returns {Promise<any>} Datalynk response
|
|
127
|
+
*/
|
|
128
|
+
debug<T = any>(data: any, options?: ApiRequestOptions): Promise<T>;
|
|
124
129
|
/**
|
|
125
130
|
* Send a request to Datalynk
|
|
126
131
|
*
|
|
@@ -145,16 +150,8 @@ export declare class Api {
|
|
|
145
150
|
* ```
|
|
146
151
|
*
|
|
147
152
|
* @param {number} slice Slice number the object will target
|
|
148
|
-
* @returns {Slice<T
|
|
149
|
-
*/
|
|
150
|
-
slice<T extends SliceMeta>(slice: number | string): Slice<T>;
|
|
151
|
-
/**
|
|
152
|
-
* Exact same as `request` method, but logs the response in the console automatically
|
|
153
|
-
*
|
|
154
|
-
* @param {object | string} data Datalynk request as object or string
|
|
155
|
-
* @param {ApiRequestOptions} options
|
|
156
|
-
* @returns {Promise<any>} Datalynk response
|
|
153
|
+
* @returns {Slice<T = any>} Object for making requests & caching rows
|
|
157
154
|
*/
|
|
158
|
-
|
|
155
|
+
slice<T = any>(slice: number | string): Slice<T>;
|
|
159
156
|
}
|
|
160
157
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAuB,MAAM,MAAM,CAAC;AAC3D,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
CHANGED
package/dist/files.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Api } from './api';
|
|
2
|
-
|
|
3
2
|
/**
|
|
4
3
|
* Metadata for an uploaded file in Datalynk
|
|
5
4
|
*/
|
|
@@ -34,10 +33,15 @@ export declare class Files {
|
|
|
34
33
|
* @param {boolean} execute Will run request by default, passing false will return the API request instead
|
|
35
34
|
* @return {any} The API response by default, or the raw API request if execute is false
|
|
36
35
|
*/
|
|
37
|
-
associate(fileIds: number | number[], slice: number, row: number, field: string, execute
|
|
38
|
-
|
|
36
|
+
associate(fileIds: number | number[], slice: number, row: number, field: string, execute?: true): Promise<any>;
|
|
37
|
+
associate(fileIds: number | number[], slice: number, row: number, field: string, execute: false): {
|
|
38
|
+
'!/tools/file/update': {
|
|
39
|
+
slice: number;
|
|
40
|
+
row: number;
|
|
41
|
+
field: string;
|
|
42
|
+
ids: number[];
|
|
43
|
+
};
|
|
39
44
|
};
|
|
40
|
-
associate(fileIds: number | number[], slice: number, row: number, field: string): Promise<any>;
|
|
41
45
|
/**
|
|
42
46
|
* Get an authenticated URL to fetch files from
|
|
43
47
|
*
|
package/dist/files.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,KAAK;IAGL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,QAAQ,CAAC,GAAG,EAAG,MAAM,CAAA;gBAEQ,GAAG,EAAE,GAAG;IAIrC;;;;;;;;;OASG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,qBAAa,KAAK;IAGL,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,QAAQ,CAAC,GAAG,EAAG,MAAM,CAAA;gBAEQ,GAAG,EAAE,GAAG;IAIrC;;;;;;;;;OASG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;IAC9G,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG;QAAC,qBAAqB,EAAE;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,EAAE,CAAA;SAAC,CAAA;KAAC;IAOrL;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM;IAI9C;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAyB5I"}
|