@auxilium/datalynk-client 0.4.8 → 0.5.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.
- package/dist/api.d.ts +7 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/auth.d.ts +50 -10
- package/dist/auth.d.ts.map +1 -1
- package/dist/files.d.ts +50 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/index.cjs +173 -15
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +174 -16
- package/dist/slice.d.ts +1 -1
- package/dist/slice.d.ts.map +1 -1
- package/dist/socket.d.ts +1 -1
- package/dist/socket.d.ts.map +1 -1
- package/dist/superuser.d.ts +23 -0
- package/dist/superuser.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/api.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { BehaviorSubject } from 'rxjs';
|
|
2
2
|
import { Auth } from './auth';
|
|
3
|
+
import { Files } from './files';
|
|
3
4
|
import { Slice, SliceMeta } from './slice';
|
|
4
5
|
import { Socket } from './socket';
|
|
6
|
+
import { Superuser } from './superuser';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* Function definition for API callbacks
|
|
@@ -53,8 +55,12 @@ export declare class Api {
|
|
|
53
55
|
private pending;
|
|
54
56
|
/** Authentication helpers */
|
|
55
57
|
readonly auth: Auth;
|
|
58
|
+
/** File helpers */
|
|
59
|
+
readonly files: Files;
|
|
56
60
|
/** Socket object */
|
|
57
61
|
readonly socket: Socket;
|
|
62
|
+
/** Superuser helpers */
|
|
63
|
+
readonly superuser: Superuser;
|
|
58
64
|
/** API endpoint */
|
|
59
65
|
readonly url: string;
|
|
60
66
|
/** API Session token */
|
|
@@ -81,7 +87,7 @@ export declare class Api {
|
|
|
81
87
|
* @param {number} slice ID of the slice to use
|
|
82
88
|
* @returns {Slice<T extends SliceMeta>} Slice object to create query
|
|
83
89
|
*/
|
|
84
|
-
slice<T extends SliceMeta>(slice: number): Slice<T>;
|
|
90
|
+
slice<T extends SliceMeta>(slice: number | string): Slice<T>;
|
|
85
91
|
/**
|
|
86
92
|
* Send a request and automatically log the output
|
|
87
93
|
* @param {object | string} data request
|
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;
|
|
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;AAE9B,OAAO,EAAC,KAAK,EAAE,SAAS,EAAC,MAAM,SAAS,CAAC;AACzC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACxB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,oCAAoC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,0BAA0B;AAC1B,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,KAAK,CAAC,EAAE,GAAG,CAAC;CACZ;AAED;;GAEG;AACH,qBAAa,GAAG;aA+B0B,OAAO,EAAE,UAAU;IA9B5D,8BAA8B;IAC9B,OAAO,CAAC,MAAM,CAAwD;IACtE,gCAAgC;IAChC,OAAO,CAAC,aAAa,CAAkB;IACvC,6CAA6C;IAC7C,OAAO,CAAC,eAAe,CAAoB;IAC3C,uBAAuB;IACvB,OAAO,CAAC,OAAO,CAA8B;IAE7C,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,OAAkB;IAC/B,mBAAmB;IACnB,QAAQ,CAAC,KAAK,QAAmB;IACjC,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAG,MAAM,CAAC;IACzB,wBAAwB;IACxB,QAAQ,CAAC,SAAS,YAAuB;IACzC,mBAAmB;IACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,wBAAwB;IACxB,MAAM,iCAA4C;IAClD,IAAI,KAAK,IACQ,MAAM,GAAG,IAAI,CADgB;IAC9C,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAA8B;IAE5D;;;;OAIG;gBACS,GAAG,EAAE,MAAM,EAAkB,OAAO,GAAE,UAAe;IAyBjE,OAAO,CAAC,QAAQ;IAqBhB,OAAO,CAAC,MAAM,CAAC,eAAe;IAsB9B;;;;;OAKG;IACI,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,CAAC,CAAC;IAmC/E;;;;OAIG;IACI,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAIxD;;;;;OAKG;IACI,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,CAAC,CAAC;CAU5E"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -22,11 +22,6 @@ export type User = {
|
|
|
22
22
|
*/
|
|
23
23
|
export declare class Auth {
|
|
24
24
|
private readonly api;
|
|
25
|
-
/**
|
|
26
|
-
* Check whether user has a token
|
|
27
|
-
* @return {boolean}
|
|
28
|
-
*/
|
|
29
|
-
get isAuthenticated(): boolean;
|
|
30
25
|
user$: BehaviorSubject<User | null>;
|
|
31
26
|
get user(): User | null;
|
|
32
27
|
set user(user: User | null);
|
|
@@ -45,12 +40,30 @@ export declare class Auth {
|
|
|
45
40
|
*/
|
|
46
41
|
handleLogin(spoke: string, options?: LoginPromptOptions): Promise<void>;
|
|
47
42
|
/**
|
|
48
|
-
*
|
|
49
|
-
* @
|
|
50
|
-
* @param {LoginPromptOptions} options Aesthetic options
|
|
51
|
-
* @return {Promise<void>} Login complete
|
|
43
|
+
* Check whether user has a token
|
|
44
|
+
* @return {boolean} True if session token authenticated
|
|
52
45
|
*/
|
|
53
|
-
|
|
46
|
+
isAuthenticated(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Check if the current user is a guest
|
|
49
|
+
* @return {boolean} True if guest
|
|
50
|
+
*/
|
|
51
|
+
isGuest(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Check if user is a system administrator
|
|
54
|
+
* @return {Promise<boolean>} True if system administrator
|
|
55
|
+
*/
|
|
56
|
+
isSysAdmin(): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Check if user is a table administrator
|
|
59
|
+
* @return {Promise<boolean>} True if table administrator
|
|
60
|
+
*/
|
|
61
|
+
isTableAdmin(): Promise<boolean>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if user is a user administrator
|
|
64
|
+
* @return {Promise<boolean>} True if user administrator
|
|
65
|
+
*/
|
|
66
|
+
isUserAdmin(): Promise<boolean>;
|
|
54
67
|
/**
|
|
55
68
|
* Perform login and save the session token
|
|
56
69
|
* @param {string} login Login username or email
|
|
@@ -60,6 +73,18 @@ export declare class Auth {
|
|
|
60
73
|
* @returns {Promise<any>} Session information returned from login request
|
|
61
74
|
*/
|
|
62
75
|
login(spoke: string, login: string, password: string, twoFactor?: string): Promise<any>;
|
|
76
|
+
/**
|
|
77
|
+
* Login as guest user
|
|
78
|
+
* @return {Promise<any>}
|
|
79
|
+
*/
|
|
80
|
+
loginGuest(): Promise<any>;
|
|
81
|
+
/**
|
|
82
|
+
* Create Login UI
|
|
83
|
+
* @param {string} spoke Desired spoke
|
|
84
|
+
* @param {LoginPromptOptions} options Aesthetic options
|
|
85
|
+
* @return {Promise<void>} Login complete
|
|
86
|
+
*/
|
|
87
|
+
loginPrompt(spoke: string, options?: LoginPromptOptions): Promise<void>;
|
|
63
88
|
/**
|
|
64
89
|
* Logout current user
|
|
65
90
|
* @return {Promise<{closed: string, new: string}>}
|
|
@@ -68,5 +93,20 @@ export declare class Auth {
|
|
|
68
93
|
closed: string;
|
|
69
94
|
new: string;
|
|
70
95
|
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Reset user account password
|
|
98
|
+
* @param {string} login User login
|
|
99
|
+
* @param {string} newPassword New password
|
|
100
|
+
* @param {string} code Reset code sent with `resetRequest`
|
|
101
|
+
* @return {Promise<any>} New session
|
|
102
|
+
*/
|
|
103
|
+
reset(login: string, newPassword: string, code?: string): Promise<any>;
|
|
104
|
+
/**
|
|
105
|
+
* Request reset code for user
|
|
106
|
+
* @param {string} login User to reset
|
|
107
|
+
* @param {"email" | "sms" | "voice"} mode Method of sending reset code
|
|
108
|
+
* @return {Promise<any>} Unknown
|
|
109
|
+
*/
|
|
110
|
+
resetRequest(login: string, mode: 'email' | 'sms' | 'voice'): Promise<any>;
|
|
71
111
|
}
|
|
72
112
|
//# sourceMappingURL=auth.d.ts.map
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAc,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAE/D,WAAW;AACX,MAAM,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACd,CAAA;AAED;;GAEG;AACH,qBAAa,IAAI;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAc,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAE/D,WAAW;AACX,MAAM,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACd,CAAA;AAED;;GAEG;AACH,qBAAa,IAAI;IAMJ,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJhC,KAAK,+BAA0C;IAC/C,IAAI,IAAI,IACO,IAAI,GAAG,IAAI,CADkB;IAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAA4B;gBAEzB,GAAG,EAAE,GAAG;IAErC;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAW/B;;;;;;OAMG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7E;;;OAGG;IACH,eAAe;IAEf;;;OAGG;IACH,OAAO;IAEP;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAOpC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAOtC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAOrC;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAkBvF;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IAS1B;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE;;;OAGG;IACH,MAAM;gBAC6B,MAAM;aAAO,MAAM;;IAOtD;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAWvD;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO;CAI3D"}
|
package/dist/files.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Api } from './api';
|
|
2
|
+
|
|
3
|
+
export interface UploadedFile {
|
|
4
|
+
id: number;
|
|
5
|
+
name: string;
|
|
6
|
+
size: number;
|
|
7
|
+
extension: string;
|
|
8
|
+
mime: string;
|
|
9
|
+
url?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Handle uploading & fetching files from Datalynk
|
|
13
|
+
*/
|
|
14
|
+
export declare class Files {
|
|
15
|
+
private readonly api;
|
|
16
|
+
readonly url: string;
|
|
17
|
+
constructor(api: Api);
|
|
18
|
+
/**
|
|
19
|
+
* Associate an existing file with an existing row
|
|
20
|
+
* @param {number | number[]} fileIds Existing files to associate
|
|
21
|
+
* @param {number} slice Target slice
|
|
22
|
+
* @param {number} rowId Target slice record
|
|
23
|
+
* @param {string} field Record filed file should be added to
|
|
24
|
+
* @param {true} chain Submit request automatically if falsy, returns as a chained command otherwise
|
|
25
|
+
* @return {any} Unknown
|
|
26
|
+
*/
|
|
27
|
+
associate(fileIds: number | number[], slice: number, rowId: number, field: string, chain: true): {
|
|
28
|
+
[key: string]: any;
|
|
29
|
+
};
|
|
30
|
+
associate(fileIds: number | number[], slice: number, rowId: number, field: string): Promise<any>;
|
|
31
|
+
/**
|
|
32
|
+
* Get an authenticated URL to fetch files from
|
|
33
|
+
* @param {number} id File ID
|
|
34
|
+
* @param {boolean} ignoreToken Ignore authentication
|
|
35
|
+
* @return {string} URL file can be viewed at
|
|
36
|
+
*/
|
|
37
|
+
get(id: number, ignoreToken?: boolean): string;
|
|
38
|
+
/**
|
|
39
|
+
* Upload file(s) to the API & optionally associate them with a row
|
|
40
|
+
* @param {FileList | File | File[]} files Files to be uploaded
|
|
41
|
+
* @param {{slice: number, row: any, field: string, pk?: string}} associate Row to associate with
|
|
42
|
+
*/
|
|
43
|
+
upload(files: FileList | File | File[], associate?: {
|
|
44
|
+
slice: number;
|
|
45
|
+
row: number | any;
|
|
46
|
+
field: string;
|
|
47
|
+
pk?: string;
|
|
48
|
+
}): Promise<UploadedFile[]>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,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;;;;;;;;OAQG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC;IACrH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAOhG;;;;;OAKG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM;IAI9C;;;;OAIG;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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1427,13 +1427,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
1427
1427
|
__publicField(this, "user$", new BehaviorSubject(null));
|
|
1428
1428
|
this.api = api;
|
|
1429
1429
|
}
|
|
1430
|
-
/**
|
|
1431
|
-
* Check whether user has a token
|
|
1432
|
-
* @return {boolean}
|
|
1433
|
-
*/
|
|
1434
|
-
get isAuthenticated() {
|
|
1435
|
-
return !!this.user;
|
|
1436
|
-
}
|
|
1437
1430
|
get user() {
|
|
1438
1431
|
return this.user$.getValue();
|
|
1439
1432
|
}
|
|
@@ -1466,19 +1459,51 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
1466
1459
|
if (urlToken) {
|
|
1467
1460
|
this.api.token = urlToken;
|
|
1468
1461
|
location.href = location.href.replace(/datalynkToken.*?(&|$)/gm, "");
|
|
1469
|
-
} else if (
|
|
1462
|
+
} else if (this.api.token) {
|
|
1463
|
+
await this.current().catch(() => {
|
|
1464
|
+
this.api.token = null;
|
|
1465
|
+
location.reload();
|
|
1466
|
+
});
|
|
1467
|
+
} else {
|
|
1470
1468
|
await this.loginPrompt(spoke, options);
|
|
1471
1469
|
location.reload();
|
|
1472
1470
|
}
|
|
1473
1471
|
}
|
|
1474
1472
|
/**
|
|
1475
|
-
*
|
|
1476
|
-
* @
|
|
1477
|
-
* @param {LoginPromptOptions} options Aesthetic options
|
|
1478
|
-
* @return {Promise<void>} Login complete
|
|
1473
|
+
* Check whether user has a token
|
|
1474
|
+
* @return {boolean} True if session token authenticated
|
|
1479
1475
|
*/
|
|
1480
|
-
|
|
1481
|
-
return
|
|
1476
|
+
isAuthenticated() {
|
|
1477
|
+
return !!this.user && !this.user.guest;
|
|
1478
|
+
}
|
|
1479
|
+
/**
|
|
1480
|
+
* Check if the current user is a guest
|
|
1481
|
+
* @return {boolean} True if guest
|
|
1482
|
+
*/
|
|
1483
|
+
isGuest() {
|
|
1484
|
+
var _a;
|
|
1485
|
+
return !!((_a = this.user) == null ? void 0 : _a.guest);
|
|
1486
|
+
}
|
|
1487
|
+
/**
|
|
1488
|
+
* Check if user is a system administrator
|
|
1489
|
+
* @return {Promise<boolean>} True if system administrator
|
|
1490
|
+
*/
|
|
1491
|
+
async isSysAdmin() {
|
|
1492
|
+
return !!(await this.api.slice("sysadmin").select().where("auth_ref", "==", "$viewer").exec().keys()).length;
|
|
1493
|
+
}
|
|
1494
|
+
/**
|
|
1495
|
+
* Check if user is a table administrator
|
|
1496
|
+
* @return {Promise<boolean>} True if table administrator
|
|
1497
|
+
*/
|
|
1498
|
+
async isTableAdmin() {
|
|
1499
|
+
return !!(await this.api.slice("tableadmins").select().where("auth_ref", "==", "$viewer").exec().keys()).length;
|
|
1500
|
+
}
|
|
1501
|
+
/**
|
|
1502
|
+
* Check if user is a user administrator
|
|
1503
|
+
* @return {Promise<boolean>} True if user administrator
|
|
1504
|
+
*/
|
|
1505
|
+
async isUserAdmin() {
|
|
1506
|
+
return !!(await this.api.slice("useradmins").select().where("auth_ref", "==", "$viewer").exec().keys()).length;
|
|
1482
1507
|
}
|
|
1483
1508
|
/**
|
|
1484
1509
|
* Perform login and save the session token
|
|
@@ -1500,11 +1525,32 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
1500
1525
|
}))
|
|
1501
1526
|
}).then(async (resp) => {
|
|
1502
1527
|
const data = await resp.json().catch(() => ({}));
|
|
1503
|
-
if (!resp.ok) throw Dt(resp.status, data.error);
|
|
1528
|
+
if (!resp.ok || data["error"]) throw Object.assign(Dt(resp.status, data.error) || {}, data);
|
|
1504
1529
|
this.api.token = data["token"];
|
|
1505
1530
|
return data;
|
|
1506
1531
|
});
|
|
1507
1532
|
}
|
|
1533
|
+
/**
|
|
1534
|
+
* Login as guest user
|
|
1535
|
+
* @return {Promise<any>}
|
|
1536
|
+
*/
|
|
1537
|
+
loginGuest() {
|
|
1538
|
+
return fetch(`${this.api.url}guest`).then(async (resp) => {
|
|
1539
|
+
const data = await resp.json().catch(() => ({}));
|
|
1540
|
+
if (!resp.ok || data["error"]) throw Object.assign(Dt(resp.status, data.error) || {}, data);
|
|
1541
|
+
this.api.token = data["token"];
|
|
1542
|
+
return data;
|
|
1543
|
+
});
|
|
1544
|
+
}
|
|
1545
|
+
/**
|
|
1546
|
+
* Create Login UI
|
|
1547
|
+
* @param {string} spoke Desired spoke
|
|
1548
|
+
* @param {LoginPromptOptions} options Aesthetic options
|
|
1549
|
+
* @return {Promise<void>} Login complete
|
|
1550
|
+
*/
|
|
1551
|
+
loginPrompt(spoke, options) {
|
|
1552
|
+
return new LoginPrompt(this.api, spoke, options).wait;
|
|
1553
|
+
}
|
|
1508
1554
|
/**
|
|
1509
1555
|
* Logout current user
|
|
1510
1556
|
* @return {Promise<{closed: string, new: string}>}
|
|
@@ -1515,6 +1561,84 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
1515
1561
|
return resp;
|
|
1516
1562
|
});
|
|
1517
1563
|
}
|
|
1564
|
+
/**
|
|
1565
|
+
* Reset user account password
|
|
1566
|
+
* @param {string} login User login
|
|
1567
|
+
* @param {string} newPassword New password
|
|
1568
|
+
* @param {string} code Reset code sent with `resetRequest`
|
|
1569
|
+
* @return {Promise<any>} New session
|
|
1570
|
+
*/
|
|
1571
|
+
reset(login, newPassword, code) {
|
|
1572
|
+
return this.api.request({ "$/auth/mobile/rescue": {
|
|
1573
|
+
user: login,
|
|
1574
|
+
password: newPassword,
|
|
1575
|
+
pin: code
|
|
1576
|
+
} }).then((resp) => {
|
|
1577
|
+
if (resp.token) this.api.token = resp.token;
|
|
1578
|
+
return resp;
|
|
1579
|
+
});
|
|
1580
|
+
}
|
|
1581
|
+
/**
|
|
1582
|
+
* Request reset code for user
|
|
1583
|
+
* @param {string} login User to reset
|
|
1584
|
+
* @param {"email" | "sms" | "voice"} mode Method of sending reset code
|
|
1585
|
+
* @return {Promise<any>} Unknown
|
|
1586
|
+
*/
|
|
1587
|
+
resetRequest(login, mode) {
|
|
1588
|
+
if (mode == "email") return this.api.request({ "$/auth/rescue_email": { user: { $or: { login, email: login } } } });
|
|
1589
|
+
return this.api.request({ "$/auth/mobile/generate": { user: login, method: mode } });
|
|
1590
|
+
}
|
|
1591
|
+
}
|
|
1592
|
+
class Files {
|
|
1593
|
+
constructor(api) {
|
|
1594
|
+
__publicField(this, "url");
|
|
1595
|
+
this.api = api;
|
|
1596
|
+
this.url = `${this.api.url}file`;
|
|
1597
|
+
}
|
|
1598
|
+
associate(fileIds, slice, rowId, field, chain) {
|
|
1599
|
+
const req = { [`${chain ? "!" : "$"}/tools/file/update`]: { row: rowId, field, slice, ids: fileIds } };
|
|
1600
|
+
if (!chain) return this.api.request(req);
|
|
1601
|
+
return req;
|
|
1602
|
+
}
|
|
1603
|
+
/**
|
|
1604
|
+
* Get an authenticated URL to fetch files from
|
|
1605
|
+
* @param {number} id File ID
|
|
1606
|
+
* @param {boolean} ignoreToken Ignore authentication
|
|
1607
|
+
* @return {string} URL file can be viewed at
|
|
1608
|
+
*/
|
|
1609
|
+
get(id, ignoreToken) {
|
|
1610
|
+
return `${this.url}?id=${id}${ignoreToken ? "" : `&token=${this.api.token}`}`;
|
|
1611
|
+
}
|
|
1612
|
+
/**
|
|
1613
|
+
* Upload file(s) to the API & optionally associate them with a row
|
|
1614
|
+
* @param {FileList | File | File[]} files Files to be uploaded
|
|
1615
|
+
* @param {{slice: number, row: any, field: string, pk?: string}} associate Row to associate with
|
|
1616
|
+
*/
|
|
1617
|
+
upload(files, associate) {
|
|
1618
|
+
let f = [];
|
|
1619
|
+
if (files instanceof FileList) f = Array.from(files);
|
|
1620
|
+
else f = Array.isArray(files) ? files : [files];
|
|
1621
|
+
return Promise.all(f.map((file) => {
|
|
1622
|
+
const data = new FormData();
|
|
1623
|
+
data.append("", file, file.name);
|
|
1624
|
+
return fetch(this.url, {
|
|
1625
|
+
method: "POST",
|
|
1626
|
+
headers: rt({ "Authorization": this.api.token ? `Bearer ${this.api.token}` : "" }),
|
|
1627
|
+
body: data
|
|
1628
|
+
}).then(async (resp) => {
|
|
1629
|
+
const data2 = await resp.json().catch(() => ({}));
|
|
1630
|
+
if (!resp.ok || data2["error"]) throw Object.assign(Dt(resp.status, data2.error) || {}, data2);
|
|
1631
|
+
return resp;
|
|
1632
|
+
});
|
|
1633
|
+
})).then(async (files2) => {
|
|
1634
|
+
if (associate) {
|
|
1635
|
+
let id = typeof associate.row == "number" ? associate.row : associate.row[associate.pk || "id"];
|
|
1636
|
+
if (!id) id = await this.api.slice(associate.slice).insert(associate.row).exec().key();
|
|
1637
|
+
await this.associate(files2.map((f2) => f2.id), associate == null ? void 0 : associate.slice, associate == null ? void 0 : associate.row, associate == null ? void 0 : associate.field);
|
|
1638
|
+
}
|
|
1639
|
+
return files2;
|
|
1640
|
+
});
|
|
1641
|
+
}
|
|
1518
1642
|
}
|
|
1519
1643
|
const Serializer = {
|
|
1520
1644
|
/**
|
|
@@ -2007,6 +2131,34 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
2007
2131
|
};
|
|
2008
2132
|
}
|
|
2009
2133
|
}
|
|
2134
|
+
class Superuser {
|
|
2135
|
+
constructor(api) {
|
|
2136
|
+
this.api = api;
|
|
2137
|
+
}
|
|
2138
|
+
/**
|
|
2139
|
+
* Switch to another user by ID
|
|
2140
|
+
* @param {number} userId User ID
|
|
2141
|
+
* @return {Promise<any>} New session
|
|
2142
|
+
*/
|
|
2143
|
+
assume(userId) {
|
|
2144
|
+
return this.api.request({ "$/report/users/become": { id: userId } }).then((resp) => {
|
|
2145
|
+
if (resp.token) this.api.token = resp.token;
|
|
2146
|
+
return resp;
|
|
2147
|
+
});
|
|
2148
|
+
}
|
|
2149
|
+
/**
|
|
2150
|
+
* Turn on the superuser flag, required to make any of the requests in the module
|
|
2151
|
+
* @param {string} username Superuser account
|
|
2152
|
+
* @param {string} password Superuser password
|
|
2153
|
+
* @return {Promise<any>} Unknown
|
|
2154
|
+
*/
|
|
2155
|
+
on(username, password) {
|
|
2156
|
+
return this.api.request({ "$/superuser/validate": {
|
|
2157
|
+
name: username,
|
|
2158
|
+
password
|
|
2159
|
+
} });
|
|
2160
|
+
}
|
|
2161
|
+
}
|
|
2010
2162
|
class Api {
|
|
2011
2163
|
/**
|
|
2012
2164
|
* Object to handle communications between the app and Datalynk
|
|
@@ -2025,8 +2177,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
2025
2177
|
// Cache for ongoing requests
|
|
2026
2178
|
/** Authentication helpers */
|
|
2027
2179
|
__publicField(this, "auth", new Auth(this));
|
|
2180
|
+
/** File helpers */
|
|
2181
|
+
__publicField(this, "files", new Files(this));
|
|
2028
2182
|
/** Socket object */
|
|
2029
2183
|
__publicField(this, "socket");
|
|
2184
|
+
/** Superuser helpers */
|
|
2185
|
+
__publicField(this, "superuser", new Superuser(this));
|
|
2030
2186
|
/** API endpoint */
|
|
2031
2187
|
__publicField(this, "url");
|
|
2032
2188
|
// API URL endpoint for requests
|
|
@@ -2154,10 +2310,12 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
2154
2310
|
}
|
|
2155
2311
|
exports2.Api = Api;
|
|
2156
2312
|
exports2.Auth = Auth;
|
|
2313
|
+
exports2.Files = Files;
|
|
2157
2314
|
exports2.LoginPrompt = LoginPrompt;
|
|
2158
2315
|
exports2.Serializer = Serializer;
|
|
2159
2316
|
exports2.Slice = Slice;
|
|
2160
2317
|
exports2.SlicePromise = SlicePromise;
|
|
2161
2318
|
exports2.Socket = Socket;
|
|
2319
|
+
exports2.Superuser = Superuser;
|
|
2162
2320
|
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
2163
2321
|
});
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export * from './api';
|
|
2
2
|
export * from './auth';
|
|
3
|
+
export * from './files';
|
|
3
4
|
export * from './login-prompt';
|
|
4
5
|
export * from './serializer';
|
|
5
6
|
export * from './slice';
|
|
6
7
|
export * from './socket';
|
|
8
|
+
export * from './superuser';
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
|
package/dist/index.mjs
CHANGED
|
@@ -1423,13 +1423,6 @@ class Auth {
|
|
|
1423
1423
|
__publicField(this, "user$", new BehaviorSubject(null));
|
|
1424
1424
|
this.api = api;
|
|
1425
1425
|
}
|
|
1426
|
-
/**
|
|
1427
|
-
* Check whether user has a token
|
|
1428
|
-
* @return {boolean}
|
|
1429
|
-
*/
|
|
1430
|
-
get isAuthenticated() {
|
|
1431
|
-
return !!this.user;
|
|
1432
|
-
}
|
|
1433
1426
|
get user() {
|
|
1434
1427
|
return this.user$.getValue();
|
|
1435
1428
|
}
|
|
@@ -1462,19 +1455,51 @@ class Auth {
|
|
|
1462
1455
|
if (urlToken) {
|
|
1463
1456
|
this.api.token = urlToken;
|
|
1464
1457
|
location.href = location.href.replace(/datalynkToken.*?(&|$)/gm, "");
|
|
1465
|
-
} else if (
|
|
1458
|
+
} else if (this.api.token) {
|
|
1459
|
+
await this.current().catch(() => {
|
|
1460
|
+
this.api.token = null;
|
|
1461
|
+
location.reload();
|
|
1462
|
+
});
|
|
1463
|
+
} else {
|
|
1466
1464
|
await this.loginPrompt(spoke, options);
|
|
1467
1465
|
location.reload();
|
|
1468
1466
|
}
|
|
1469
1467
|
}
|
|
1470
1468
|
/**
|
|
1471
|
-
*
|
|
1472
|
-
* @
|
|
1473
|
-
* @param {LoginPromptOptions} options Aesthetic options
|
|
1474
|
-
* @return {Promise<void>} Login complete
|
|
1469
|
+
* Check whether user has a token
|
|
1470
|
+
* @return {boolean} True if session token authenticated
|
|
1475
1471
|
*/
|
|
1476
|
-
|
|
1477
|
-
return
|
|
1472
|
+
isAuthenticated() {
|
|
1473
|
+
return !!this.user && !this.user.guest;
|
|
1474
|
+
}
|
|
1475
|
+
/**
|
|
1476
|
+
* Check if the current user is a guest
|
|
1477
|
+
* @return {boolean} True if guest
|
|
1478
|
+
*/
|
|
1479
|
+
isGuest() {
|
|
1480
|
+
var _a;
|
|
1481
|
+
return !!((_a = this.user) == null ? void 0 : _a.guest);
|
|
1482
|
+
}
|
|
1483
|
+
/**
|
|
1484
|
+
* Check if user is a system administrator
|
|
1485
|
+
* @return {Promise<boolean>} True if system administrator
|
|
1486
|
+
*/
|
|
1487
|
+
async isSysAdmin() {
|
|
1488
|
+
return !!(await this.api.slice("sysadmin").select().where("auth_ref", "==", "$viewer").exec().keys()).length;
|
|
1489
|
+
}
|
|
1490
|
+
/**
|
|
1491
|
+
* Check if user is a table administrator
|
|
1492
|
+
* @return {Promise<boolean>} True if table administrator
|
|
1493
|
+
*/
|
|
1494
|
+
async isTableAdmin() {
|
|
1495
|
+
return !!(await this.api.slice("tableadmins").select().where("auth_ref", "==", "$viewer").exec().keys()).length;
|
|
1496
|
+
}
|
|
1497
|
+
/**
|
|
1498
|
+
* Check if user is a user administrator
|
|
1499
|
+
* @return {Promise<boolean>} True if user administrator
|
|
1500
|
+
*/
|
|
1501
|
+
async isUserAdmin() {
|
|
1502
|
+
return !!(await this.api.slice("useradmins").select().where("auth_ref", "==", "$viewer").exec().keys()).length;
|
|
1478
1503
|
}
|
|
1479
1504
|
/**
|
|
1480
1505
|
* Perform login and save the session token
|
|
@@ -1496,11 +1521,32 @@ class Auth {
|
|
|
1496
1521
|
}))
|
|
1497
1522
|
}).then(async (resp) => {
|
|
1498
1523
|
const data = await resp.json().catch(() => ({}));
|
|
1499
|
-
if (!resp.ok) throw Dt(resp.status, data.error);
|
|
1524
|
+
if (!resp.ok || data["error"]) throw Object.assign(Dt(resp.status, data.error) || {}, data);
|
|
1500
1525
|
this.api.token = data["token"];
|
|
1501
1526
|
return data;
|
|
1502
1527
|
});
|
|
1503
1528
|
}
|
|
1529
|
+
/**
|
|
1530
|
+
* Login as guest user
|
|
1531
|
+
* @return {Promise<any>}
|
|
1532
|
+
*/
|
|
1533
|
+
loginGuest() {
|
|
1534
|
+
return fetch(`${this.api.url}guest`).then(async (resp) => {
|
|
1535
|
+
const data = await resp.json().catch(() => ({}));
|
|
1536
|
+
if (!resp.ok || data["error"]) throw Object.assign(Dt(resp.status, data.error) || {}, data);
|
|
1537
|
+
this.api.token = data["token"];
|
|
1538
|
+
return data;
|
|
1539
|
+
});
|
|
1540
|
+
}
|
|
1541
|
+
/**
|
|
1542
|
+
* Create Login UI
|
|
1543
|
+
* @param {string} spoke Desired spoke
|
|
1544
|
+
* @param {LoginPromptOptions} options Aesthetic options
|
|
1545
|
+
* @return {Promise<void>} Login complete
|
|
1546
|
+
*/
|
|
1547
|
+
loginPrompt(spoke, options) {
|
|
1548
|
+
return new LoginPrompt(this.api, spoke, options).wait;
|
|
1549
|
+
}
|
|
1504
1550
|
/**
|
|
1505
1551
|
* Logout current user
|
|
1506
1552
|
* @return {Promise<{closed: string, new: string}>}
|
|
@@ -1511,6 +1557,84 @@ class Auth {
|
|
|
1511
1557
|
return resp;
|
|
1512
1558
|
});
|
|
1513
1559
|
}
|
|
1560
|
+
/**
|
|
1561
|
+
* Reset user account password
|
|
1562
|
+
* @param {string} login User login
|
|
1563
|
+
* @param {string} newPassword New password
|
|
1564
|
+
* @param {string} code Reset code sent with `resetRequest`
|
|
1565
|
+
* @return {Promise<any>} New session
|
|
1566
|
+
*/
|
|
1567
|
+
reset(login, newPassword, code) {
|
|
1568
|
+
return this.api.request({ "$/auth/mobile/rescue": {
|
|
1569
|
+
user: login,
|
|
1570
|
+
password: newPassword,
|
|
1571
|
+
pin: code
|
|
1572
|
+
} }).then((resp) => {
|
|
1573
|
+
if (resp.token) this.api.token = resp.token;
|
|
1574
|
+
return resp;
|
|
1575
|
+
});
|
|
1576
|
+
}
|
|
1577
|
+
/**
|
|
1578
|
+
* Request reset code for user
|
|
1579
|
+
* @param {string} login User to reset
|
|
1580
|
+
* @param {"email" | "sms" | "voice"} mode Method of sending reset code
|
|
1581
|
+
* @return {Promise<any>} Unknown
|
|
1582
|
+
*/
|
|
1583
|
+
resetRequest(login, mode) {
|
|
1584
|
+
if (mode == "email") return this.api.request({ "$/auth/rescue_email": { user: { $or: { login, email: login } } } });
|
|
1585
|
+
return this.api.request({ "$/auth/mobile/generate": { user: login, method: mode } });
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
class Files {
|
|
1589
|
+
constructor(api) {
|
|
1590
|
+
__publicField(this, "url");
|
|
1591
|
+
this.api = api;
|
|
1592
|
+
this.url = `${this.api.url}file`;
|
|
1593
|
+
}
|
|
1594
|
+
associate(fileIds, slice, rowId, field, chain) {
|
|
1595
|
+
const req = { [`${chain ? "!" : "$"}/tools/file/update`]: { row: rowId, field, slice, ids: fileIds } };
|
|
1596
|
+
if (!chain) return this.api.request(req);
|
|
1597
|
+
return req;
|
|
1598
|
+
}
|
|
1599
|
+
/**
|
|
1600
|
+
* Get an authenticated URL to fetch files from
|
|
1601
|
+
* @param {number} id File ID
|
|
1602
|
+
* @param {boolean} ignoreToken Ignore authentication
|
|
1603
|
+
* @return {string} URL file can be viewed at
|
|
1604
|
+
*/
|
|
1605
|
+
get(id, ignoreToken) {
|
|
1606
|
+
return `${this.url}?id=${id}${ignoreToken ? "" : `&token=${this.api.token}`}`;
|
|
1607
|
+
}
|
|
1608
|
+
/**
|
|
1609
|
+
* Upload file(s) to the API & optionally associate them with a row
|
|
1610
|
+
* @param {FileList | File | File[]} files Files to be uploaded
|
|
1611
|
+
* @param {{slice: number, row: any, field: string, pk?: string}} associate Row to associate with
|
|
1612
|
+
*/
|
|
1613
|
+
upload(files, associate) {
|
|
1614
|
+
let f = [];
|
|
1615
|
+
if (files instanceof FileList) f = Array.from(files);
|
|
1616
|
+
else f = Array.isArray(files) ? files : [files];
|
|
1617
|
+
return Promise.all(f.map((file) => {
|
|
1618
|
+
const data = new FormData();
|
|
1619
|
+
data.append("", file, file.name);
|
|
1620
|
+
return fetch(this.url, {
|
|
1621
|
+
method: "POST",
|
|
1622
|
+
headers: rt({ "Authorization": this.api.token ? `Bearer ${this.api.token}` : "" }),
|
|
1623
|
+
body: data
|
|
1624
|
+
}).then(async (resp) => {
|
|
1625
|
+
const data2 = await resp.json().catch(() => ({}));
|
|
1626
|
+
if (!resp.ok || data2["error"]) throw Object.assign(Dt(resp.status, data2.error) || {}, data2);
|
|
1627
|
+
return resp;
|
|
1628
|
+
});
|
|
1629
|
+
})).then(async (files2) => {
|
|
1630
|
+
if (associate) {
|
|
1631
|
+
let id = typeof associate.row == "number" ? associate.row : associate.row[associate.pk || "id"];
|
|
1632
|
+
if (!id) id = await this.api.slice(associate.slice).insert(associate.row).exec().key();
|
|
1633
|
+
await this.associate(files2.map((f2) => f2.id), associate == null ? void 0 : associate.slice, associate == null ? void 0 : associate.row, associate == null ? void 0 : associate.field);
|
|
1634
|
+
}
|
|
1635
|
+
return files2;
|
|
1636
|
+
});
|
|
1637
|
+
}
|
|
1514
1638
|
}
|
|
1515
1639
|
const Serializer = {
|
|
1516
1640
|
/**
|
|
@@ -2003,6 +2127,34 @@ class Socket {
|
|
|
2003
2127
|
};
|
|
2004
2128
|
}
|
|
2005
2129
|
}
|
|
2130
|
+
class Superuser {
|
|
2131
|
+
constructor(api) {
|
|
2132
|
+
this.api = api;
|
|
2133
|
+
}
|
|
2134
|
+
/**
|
|
2135
|
+
* Switch to another user by ID
|
|
2136
|
+
* @param {number} userId User ID
|
|
2137
|
+
* @return {Promise<any>} New session
|
|
2138
|
+
*/
|
|
2139
|
+
assume(userId) {
|
|
2140
|
+
return this.api.request({ "$/report/users/become": { id: userId } }).then((resp) => {
|
|
2141
|
+
if (resp.token) this.api.token = resp.token;
|
|
2142
|
+
return resp;
|
|
2143
|
+
});
|
|
2144
|
+
}
|
|
2145
|
+
/**
|
|
2146
|
+
* Turn on the superuser flag, required to make any of the requests in the module
|
|
2147
|
+
* @param {string} username Superuser account
|
|
2148
|
+
* @param {string} password Superuser password
|
|
2149
|
+
* @return {Promise<any>} Unknown
|
|
2150
|
+
*/
|
|
2151
|
+
on(username, password) {
|
|
2152
|
+
return this.api.request({ "$/superuser/validate": {
|
|
2153
|
+
name: username,
|
|
2154
|
+
password
|
|
2155
|
+
} });
|
|
2156
|
+
}
|
|
2157
|
+
}
|
|
2006
2158
|
class Api {
|
|
2007
2159
|
/**
|
|
2008
2160
|
* Object to handle communications between the app and Datalynk
|
|
@@ -2021,8 +2173,12 @@ class Api {
|
|
|
2021
2173
|
// Cache for ongoing requests
|
|
2022
2174
|
/** Authentication helpers */
|
|
2023
2175
|
__publicField(this, "auth", new Auth(this));
|
|
2176
|
+
/** File helpers */
|
|
2177
|
+
__publicField(this, "files", new Files(this));
|
|
2024
2178
|
/** Socket object */
|
|
2025
2179
|
__publicField(this, "socket");
|
|
2180
|
+
/** Superuser helpers */
|
|
2181
|
+
__publicField(this, "superuser", new Superuser(this));
|
|
2026
2182
|
/** API endpoint */
|
|
2027
2183
|
__publicField(this, "url");
|
|
2028
2184
|
// API URL endpoint for requests
|
|
@@ -2151,9 +2307,11 @@ class Api {
|
|
|
2151
2307
|
export {
|
|
2152
2308
|
Api,
|
|
2153
2309
|
Auth,
|
|
2310
|
+
Files,
|
|
2154
2311
|
LoginPrompt,
|
|
2155
2312
|
Serializer,
|
|
2156
2313
|
Slice,
|
|
2157
2314
|
SlicePromise,
|
|
2158
|
-
Socket
|
|
2315
|
+
Socket,
|
|
2316
|
+
Superuser
|
|
2159
2317
|
};
|
package/dist/slice.d.ts
CHANGED
|
@@ -96,7 +96,7 @@ export declare class Slice<T extends SliceMeta> {
|
|
|
96
96
|
* @param {number} slice Slice ID to interact with
|
|
97
97
|
* @param {Api} api Api to send the requests through
|
|
98
98
|
*/
|
|
99
|
-
constructor(slice: number, api: Api);
|
|
99
|
+
constructor(slice: number | string, api: Api);
|
|
100
100
|
/**
|
|
101
101
|
* Whitelist and alias fields. Alias for the fields functions
|
|
102
102
|
* @param {object} aliasKeyVals List of properties to whitelist and what to rename them to
|
package/dist/slice.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../src/slice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,MAAM,CAAC;AACrC,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,WAAW,EAAC,MAAM,UAAU,CAAC;AAEvD,MAAM,WAAW,SAAS;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,SAAS;aAOhB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;aAAkB,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAL/F;;;;OAIG;gBACyB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAkB,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAE/F;;OAEG;IACH,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;IAKxB;;OAEG;IACG,MAAM;IAKZ;;OAEG;IACG,OAAO;IAKb;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/B;;OAEG;IACG,OAAO;IAKb;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;IAIvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAK1B;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAItC;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;CAIpC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS;IACjD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;CACX;AAED;;GAEG;AACH,qBAAa,KAAK,CAAC,CAAC,SAAS,SAAS;IAqBzB,OAAO,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../src/slice.ts"],"names":[],"mappings":"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"}
|
package/dist/socket.d.ts
CHANGED
|
@@ -51,6 +51,6 @@ export declare class Socket {
|
|
|
51
51
|
* @param {SocketListener<SocketEventSlice>} callback Function to run on changes
|
|
52
52
|
* @return {Unsubscribe} Run returned function to unsubscribe callback
|
|
53
53
|
*/
|
|
54
|
-
sliceEvents(slice: number | number[], callback: SocketListener<SocketEventSlice>): Unsubscribe;
|
|
54
|
+
sliceEvents(slice: number | number[] | string | string[], callback: SocketListener<SocketEventSlice>): Unsubscribe;
|
|
55
55
|
}
|
|
56
56
|
//# sourceMappingURL=socket.d.ts.map
|
package/dist/socket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAA;CACP,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC;AACrE,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,qBAAa,MAAM;IAON,OAAO,CAAC,QAAQ,CAAC,GAAG;aAAuB,OAAO,EAAE,aAAa;IAN7E,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAa;IAE3B,IAAI,IAAI,YAA0C;gBAErB,GAAG,EAAE,GAAG,EAAkB,OAAO,GAAE,aAAkB;IAUlF;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,cAAc,GAAG,WAAW;IAK5C;;OAEG;IACH,KAAK;IAKL;;;OAGG;IACH,OAAO,CAAC,OAAO,SAAQ;IA8BvB;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,GAAG;IAIjB;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAA;CACP,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC;AACrE,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,qBAAa,MAAM;IAON,OAAO,CAAC,QAAQ,CAAC,GAAG;aAAuB,OAAO,EAAE,aAAa;IAN7E,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAa;IAE3B,IAAI,IAAI,YAA0C;gBAErB,GAAG,EAAE,GAAG,EAAkB,OAAO,GAAE,aAAkB;IAUlF;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,cAAc,GAAG,WAAW;IAK5C;;OAEG;IACH,KAAK;IAKL;;;OAGG;IACH,OAAO,CAAC,OAAO,SAAQ;IA8BvB;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,GAAG;IAIjB;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,WAAW;CAelH"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Api } from './api';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Superuser helpers
|
|
5
|
+
*/
|
|
6
|
+
export declare class Superuser {
|
|
7
|
+
private readonly api;
|
|
8
|
+
constructor(api: Api);
|
|
9
|
+
/**
|
|
10
|
+
* Switch to another user by ID
|
|
11
|
+
* @param {number} userId User ID
|
|
12
|
+
* @return {Promise<any>} New session
|
|
13
|
+
*/
|
|
14
|
+
assume(userId: number): Promise<any>;
|
|
15
|
+
/**
|
|
16
|
+
* Turn on the superuser flag, required to make any of the requests in the module
|
|
17
|
+
* @param {string} username Superuser account
|
|
18
|
+
* @param {string} password Superuser password
|
|
19
|
+
* @return {Promise<any>} Unknown
|
|
20
|
+
*/
|
|
21
|
+
on(username: string, password: string): Promise<any>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=superuser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"superuser.d.ts","sourceRoot":"","sources":["../src/superuser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,qBAAa,SAAS;IAET,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,GAAG;IAErC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM;IAOrB;;;;;OAKG;IACH,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAMrC"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@auxilium/datalynk-client",
|
|
3
3
|
"description": "Datalynk client library",
|
|
4
4
|
"repository": "https://gitlab.auxiliumgroup.com/ztimson/datalynk-client",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.5.1",
|
|
6
6
|
"author": "Zak Timson",
|
|
7
7
|
"private": false,
|
|
8
8
|
"main": "./dist/index.cjs",
|