@sasjs/adapter 3.8.0 → 3.8.3
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/SASjs.d.ts +8 -8
- package/SASjsApiClient.d.ts +4 -6
- package/index.js +2 -2
- package/node/SASjs.d.ts +8 -8
- package/node/SASjsApiClient.d.ts +4 -6
- package/node/index.js +2 -2
- package/node/types/index.d.ts +0 -1
- package/package.json +2 -2
- package/src/SASjs.ts +11 -23
- package/src/SASjsApiClient.ts +8 -19
- package/src/file/generateFileUploadForm.ts +11 -4
- package/src/types/index.ts +0 -1
- package/src/utils/parseViyaDebugResponse.ts +7 -2
- package/types/index.d.ts +0 -1
- package/node/types/FileTree.d.ts +0 -18
- package/src/types/FileTree.ts +0 -47
- package/types/FileTree.d.ts +0 -18
package/node/types/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -72,12 +72,12 @@
|
|
|
72
72
|
},
|
|
73
73
|
"main": "index.js",
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@sasjs/utils": "2.
|
|
75
|
+
"@sasjs/utils": "2.42.0",
|
|
76
76
|
"axios": "0.26.0",
|
|
77
77
|
"axios-cookiejar-support": "1.0.1",
|
|
78
78
|
"form-data": "4.0.0",
|
|
79
79
|
"https": "1.0.0",
|
|
80
80
|
"tough-cookie": "4.0.0"
|
|
81
81
|
},
|
|
82
|
-
"version": "3.8.
|
|
82
|
+
"version": "3.8.3"
|
|
83
83
|
}
|
package/src/SASjs.ts
CHANGED
|
@@ -5,8 +5,7 @@ import {
|
|
|
5
5
|
EditContextInput,
|
|
6
6
|
PollOptions,
|
|
7
7
|
LoginMechanism,
|
|
8
|
-
ExecutionQuery
|
|
9
|
-
FileTree
|
|
8
|
+
ExecutionQuery
|
|
10
9
|
} from './types'
|
|
11
10
|
import { SASViyaApiClient } from './SASViyaApiClient'
|
|
12
11
|
import { SAS9ApiClient } from './SAS9ApiClient'
|
|
@@ -18,7 +17,7 @@ import {
|
|
|
18
17
|
AuthConfig,
|
|
19
18
|
ExtraResponseAttributes,
|
|
20
19
|
SasAuthResponse,
|
|
21
|
-
|
|
20
|
+
ServicePackSASjs
|
|
22
21
|
} from '@sasjs/utils/types'
|
|
23
22
|
import { RequestClient } from './request/RequestClient'
|
|
24
23
|
import { SasjsRequestClient } from './request/SasjsRequestClient'
|
|
@@ -889,27 +888,21 @@ export default class SASjs {
|
|
|
889
888
|
|
|
890
889
|
/**
|
|
891
890
|
* Creates the folders and services at the given location `appLoc` on the given server `serverUrl`.
|
|
892
|
-
* @param
|
|
893
|
-
*
|
|
894
|
-
*
|
|
895
|
-
*
|
|
896
|
-
* @param authConfig - a valid client, secret, refresh and access tokens that are authorised to execute compute jobs.
|
|
891
|
+
* @param dataJson - the JSON specifying the folders and files to be created, can also includes
|
|
892
|
+
* appLoc, streamServiceName, streamWebFolder, streamLogo
|
|
893
|
+
* @param appLoc - (optional) the base folder in which to create the new folders and
|
|
894
|
+
* services. If not provided, is taken from SASjsConfig. Precedence will be of appLoc present in dataJson.
|
|
895
|
+
* @param authConfig - (optional) a valid client, secret, refresh and access tokens that are authorised to execute compute jobs.
|
|
897
896
|
*/
|
|
898
897
|
public async deployToSASjs(
|
|
899
|
-
|
|
898
|
+
dataJson: ServicePackSASjs,
|
|
900
899
|
appLoc?: string,
|
|
901
|
-
streamConfig?: StreamConfig,
|
|
902
900
|
authConfig?: AuthConfig
|
|
903
901
|
) {
|
|
904
902
|
if (!appLoc) {
|
|
905
903
|
appLoc = this.sasjsConfig.appLoc
|
|
906
904
|
}
|
|
907
|
-
return await this.sasJSApiClient?.deploy(
|
|
908
|
-
members,
|
|
909
|
-
appLoc,
|
|
910
|
-
streamConfig,
|
|
911
|
-
authConfig
|
|
912
|
-
)
|
|
905
|
+
return await this.sasJSApiClient?.deploy(dataJson, appLoc, authConfig)
|
|
913
906
|
}
|
|
914
907
|
|
|
915
908
|
public async executeJobSASjs(query: ExecutionQuery) {
|
|
@@ -1102,13 +1095,8 @@ export default class SASjs {
|
|
|
1102
1095
|
}
|
|
1103
1096
|
|
|
1104
1097
|
if (this.sasjsConfig.serverType === ServerType.Sasjs) {
|
|
1105
|
-
if (this.sasJSApiClient) {
|
|
1106
|
-
this.sasJSApiClient
|
|
1107
|
-
} else {
|
|
1108
|
-
this.sasJSApiClient = new SASjsApiClient(
|
|
1109
|
-
this.sasjsConfig.serverUrl,
|
|
1110
|
-
this.requestClient
|
|
1111
|
-
)
|
|
1098
|
+
if (!this.sasJSApiClient) {
|
|
1099
|
+
this.sasJSApiClient = new SASjsApiClient(this.requestClient)
|
|
1112
1100
|
}
|
|
1113
1101
|
}
|
|
1114
1102
|
|
package/src/SASjsApiClient.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AuthConfig, ServerType,
|
|
2
|
-
import {
|
|
1
|
+
import { AuthConfig, ServerType, ServicePackSASjs } from '@sasjs/utils/types'
|
|
2
|
+
import { ExecutionQuery } from './types'
|
|
3
3
|
import { RequestClient } from './request/RequestClient'
|
|
4
4
|
import { getAccessTokenForSasjs } from './auth/getAccessTokenForSasjs'
|
|
5
5
|
import { refreshTokensForSasjs } from './auth/refreshTokensForSasjs'
|
|
@@ -8,19 +8,11 @@ import { parseWeboutResponse } from './utils'
|
|
|
8
8
|
import { getTokens } from './auth/getTokens'
|
|
9
9
|
|
|
10
10
|
export class SASjsApiClient {
|
|
11
|
-
constructor(
|
|
12
|
-
private serverUrl: string,
|
|
13
|
-
private requestClient: RequestClient
|
|
14
|
-
) {}
|
|
15
|
-
|
|
16
|
-
public setConfig(serverUrl: string) {
|
|
17
|
-
if (serverUrl) this.serverUrl = serverUrl
|
|
18
|
-
}
|
|
11
|
+
constructor(private requestClient: RequestClient) {}
|
|
19
12
|
|
|
20
13
|
public async deploy(
|
|
21
|
-
|
|
14
|
+
dataJson: ServicePackSASjs,
|
|
22
15
|
appLoc: string,
|
|
23
|
-
streamConfig?: StreamConfig,
|
|
24
16
|
authConfig?: AuthConfig
|
|
25
17
|
) {
|
|
26
18
|
let access_token = (authConfig || {}).access_token
|
|
@@ -31,6 +23,9 @@ export class SASjsApiClient {
|
|
|
31
23
|
ServerType.Sasjs
|
|
32
24
|
))
|
|
33
25
|
}
|
|
26
|
+
|
|
27
|
+
dataJson.appLoc = dataJson.appLoc || appLoc
|
|
28
|
+
|
|
34
29
|
const { result } = await this.requestClient.post<{
|
|
35
30
|
status: string
|
|
36
31
|
message: string
|
|
@@ -38,13 +33,7 @@ export class SASjsApiClient {
|
|
|
38
33
|
example?: {}
|
|
39
34
|
}>(
|
|
40
35
|
'SASjsApi/drive/deploy',
|
|
41
|
-
|
|
42
|
-
fileTree: members,
|
|
43
|
-
appLoc: appLoc,
|
|
44
|
-
streamServiceName: streamConfig?.streamServiceName,
|
|
45
|
-
streamWebFolder: streamConfig?.streamWebFolder,
|
|
46
|
-
streamLogo: streamConfig?.streamLogo
|
|
47
|
-
},
|
|
36
|
+
dataJson,
|
|
48
37
|
access_token,
|
|
49
38
|
undefined,
|
|
50
39
|
{},
|
|
@@ -26,11 +26,18 @@ export const generateFileUploadForm = (
|
|
|
26
26
|
)
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
if (typeof FormData === 'undefined' && formData instanceof NodeFormData) {
|
|
30
|
+
formData.append(name, csv, {
|
|
31
|
+
filename: `${name}.csv`,
|
|
32
|
+
contentType: 'application/csv'
|
|
33
|
+
})
|
|
34
|
+
} else {
|
|
35
|
+
const file = new Blob([csv], {
|
|
36
|
+
type: 'application/csv'
|
|
37
|
+
})
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
formData.append(name, file, `${name}.csv`)
|
|
40
|
+
}
|
|
34
41
|
}
|
|
35
42
|
|
|
36
43
|
return formData
|
package/src/types/index.ts
CHANGED
|
@@ -16,10 +16,15 @@ export const parseSasViyaDebugResponse = async (
|
|
|
16
16
|
requestClient: RequestClient,
|
|
17
17
|
serverUrl: string
|
|
18
18
|
) => {
|
|
19
|
+
// On viya 3.5, iframe is like <iframe style="width: 99%; height: 500px" src="..."></iframe>
|
|
20
|
+
// On viya 4, iframe is like <iframe style="width: 99%; height: 500px; background-color:Canvas;" src=...></iframe>
|
|
21
|
+
|
|
19
22
|
const iframeStart = response.split(
|
|
20
|
-
|
|
23
|
+
/<iframe style="width: 99%; height: 500px" src="|<iframe style="width: 99%; height: 500px; background-color:Canvas;" src=/
|
|
21
24
|
)[1]
|
|
22
|
-
const jsonUrl = iframeStart
|
|
25
|
+
const jsonUrl = iframeStart
|
|
26
|
+
? iframeStart.split(/"><\/iframe>|><\/iframe>/)[0]
|
|
27
|
+
: null
|
|
23
28
|
if (!jsonUrl) {
|
|
24
29
|
throw new Error('Unable to find webout file URL.')
|
|
25
30
|
}
|
package/types/index.d.ts
CHANGED
package/node/types/FileTree.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface FileTree {
|
|
2
|
-
members: [FolderMember, ServiceMember];
|
|
3
|
-
}
|
|
4
|
-
export declare enum MemberType {
|
|
5
|
-
folder = "folder",
|
|
6
|
-
service = "service"
|
|
7
|
-
}
|
|
8
|
-
export interface FolderMember {
|
|
9
|
-
name: string;
|
|
10
|
-
type: MemberType.folder;
|
|
11
|
-
members: [FolderMember, ServiceMember];
|
|
12
|
-
}
|
|
13
|
-
export interface ServiceMember {
|
|
14
|
-
name: string;
|
|
15
|
-
type: MemberType.service;
|
|
16
|
-
code: string;
|
|
17
|
-
}
|
|
18
|
-
export declare const isFileTree: (arg: any) => arg is FileTree;
|
package/src/types/FileTree.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
export interface FileTree {
|
|
2
|
-
members: [FolderMember, ServiceMember]
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export enum MemberType {
|
|
6
|
-
folder = 'folder',
|
|
7
|
-
service = 'service'
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface FolderMember {
|
|
11
|
-
name: string
|
|
12
|
-
type: MemberType.folder
|
|
13
|
-
members: [FolderMember, ServiceMember]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface ServiceMember {
|
|
17
|
-
name: string
|
|
18
|
-
type: MemberType.service
|
|
19
|
-
code: string
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const isFileTree = (arg: any): arg is FileTree =>
|
|
23
|
-
arg &&
|
|
24
|
-
arg.members &&
|
|
25
|
-
Array.isArray(arg.members) &&
|
|
26
|
-
arg.members.filter(
|
|
27
|
-
(member: FolderMember | ServiceMember) =>
|
|
28
|
-
!isFolderMember(member) && !isServiceMember(member)
|
|
29
|
-
).length === 0
|
|
30
|
-
|
|
31
|
-
const isFolderMember = (arg: any): arg is FolderMember =>
|
|
32
|
-
arg &&
|
|
33
|
-
typeof arg.name === 'string' &&
|
|
34
|
-
arg.type === MemberType.folder &&
|
|
35
|
-
arg.members &&
|
|
36
|
-
Array.isArray(arg.members) &&
|
|
37
|
-
arg.members.filter(
|
|
38
|
-
(member: FolderMember | ServiceMember) =>
|
|
39
|
-
!isFolderMember(member) && !isServiceMember(member)
|
|
40
|
-
).length === 0
|
|
41
|
-
|
|
42
|
-
const isServiceMember = (arg: any): arg is ServiceMember =>
|
|
43
|
-
arg &&
|
|
44
|
-
typeof arg.name === 'string' &&
|
|
45
|
-
arg.type === MemberType.service &&
|
|
46
|
-
arg.code &&
|
|
47
|
-
typeof arg.code === 'string'
|
package/types/FileTree.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface FileTree {
|
|
2
|
-
members: [FolderMember, ServiceMember];
|
|
3
|
-
}
|
|
4
|
-
export declare enum MemberType {
|
|
5
|
-
folder = "folder",
|
|
6
|
-
service = "service"
|
|
7
|
-
}
|
|
8
|
-
export interface FolderMember {
|
|
9
|
-
name: string;
|
|
10
|
-
type: MemberType.folder;
|
|
11
|
-
members: [FolderMember, ServiceMember];
|
|
12
|
-
}
|
|
13
|
-
export interface ServiceMember {
|
|
14
|
-
name: string;
|
|
15
|
-
type: MemberType.service;
|
|
16
|
-
code: string;
|
|
17
|
-
}
|
|
18
|
-
export declare const isFileTree: (arg: any) => arg is FileTree;
|