diff --git a/package-lock.json b/package-lock.json index 786d6fe..ced13f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1005,11 +1005,11 @@ } }, "@sasjs/utils": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.18.0.tgz", - "integrity": "sha512-6VTbRP1KU0gGi1mSIHl+XyL9Vqk8rBW7a7VQOF6vzD+AVgfgYd0t76djAUCcA7Dos8NJXAoDUuah+iNvXJY+cw==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.20.1.tgz", + "integrity": "sha512-Wer6RrGPowBgvgJ2Hdk2nrdA9mIsG4AKI50s/cEWKfzMnQRQVrCNmVUyZlM5I8/pZRzsMzwq7PLaxjAADYUCuQ==", "requires": { - "@types/prompts": "^2.0.11", + "@types/prompts": "^2.0.13", "chalk": "^4.1.1", "cli-table": "^0.3.6", "consola": "^2.15.0", diff --git a/package.json b/package.json index c226a51..e4eba45 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ }, "main": "index.js", "dependencies": { - "@sasjs/utils": "^2.18.0", + "@sasjs/utils": "^2.20.1", "axios": "^0.21.1", "axios-cookiejar-support": "^1.0.1", "form-data": "^4.0.0", diff --git a/sasjs-tests/src/testSuites/Basic.ts b/sasjs-tests/src/testSuites/Basic.ts index e1b5887..457f1a2 100644 --- a/sasjs-tests/src/testSuites/Basic.ts +++ b/sasjs-tests/src/testSuites/Basic.ts @@ -145,6 +145,33 @@ export const basicTests = ( sasjsConfig.debug === false ) } + }, + { + title: 'Request with extra attributes on JES approach', + description: + 'Should complete successful request with extra attributes present in response', + test: async () => { + const config = { + useComputeApi: false + } + + return await adapter.request( + 'common/sendArr', + stringData, + config, + undefined, + undefined, + ['output', 'file', 'data'] + ) + }, + assertion: (response: any) => { + const responseKeys: any = Object.keys(response) + return ( + responseKeys.includes('file') && + responseKeys.includes('output') && + responseKeys.includes('data') + ) + } } ] }) diff --git a/src/SASjs.ts b/src/SASjs.ts index 4a40c0a..85c6b38 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -14,6 +14,7 @@ import { Sas9JobExecutor } from './job-execution' import { ErrorResponse } from './types/errors' +import { ExtraResponseAttributes } from '@sasjs/utils/types' const defaultConfig: SASjsConfig = { serverUrl: '', @@ -540,13 +541,17 @@ export default class SASjs { * `await request(sasJobPath, data, config, () => setIsLoggedIn(false))` * If you are not passing in any data and configuration, it will look like so: * `await request(sasJobPath, {}, {}, () => setIsLoggedIn(false))` + * @param extraResponseAttributes - a array of predefined values that are used + * to provide extra attributes (same names as those values) to be added in response + * Supported values are declared in ExtraResponseAttributes type. */ public async request( sasJob: string, data: { [key: string]: any }, config: { [key: string]: any } = {}, loginRequiredCallback?: () => any, - accessToken?: string + accessToken?: string, + extraResponseAttributes: ExtraResponseAttributes[] = [] ) { config = { ...this.sasjsConfig, @@ -585,7 +590,9 @@ export default class SASjs { sasJob, data, config, - loginRequiredCallback + loginRequiredCallback, + accessToken, + extraResponseAttributes ) } } else { diff --git a/src/job-execution/JesJobExecutor.ts b/src/job-execution/JesJobExecutor.ts index 42d22a4..ce82083 100644 --- a/src/job-execution/JesJobExecutor.ts +++ b/src/job-execution/JesJobExecutor.ts @@ -5,6 +5,7 @@ import { JobExecutionError, LoginRequiredError } from '../types/errors' +import { ExtraResponseAttributes } from '@sasjs/utils/types' import { BaseJobExecutor } from './JobExecutor' export class JesJobExecutor extends BaseJobExecutor { @@ -17,7 +18,8 @@ export class JesJobExecutor extends BaseJobExecutor { data: any, config: any, loginRequiredCallback?: any, - accessToken?: string + accessToken?: string, + extraResponseAttributes: ExtraResponseAttributes[] = [] ) { const loginCallback = loginRequiredCallback || (() => Promise.resolve()) @@ -30,10 +32,26 @@ export class JesJobExecutor extends BaseJobExecutor { data, accessToken ) - .then((response) => { + .then((response: any) => { this.appendRequest(response, sasJob, config.debug) - resolve(response) + let responseObject = {} + + if (extraResponseAttributes && extraResponseAttributes.length > 0) { + const extraAttributes = extraResponseAttributes.reduce( + (map: any, obj: any) => ((map[obj] = response[obj]), map), + {} + ) + + responseObject = { + result: response.result, + ...extraAttributes + } + } else { + responseObject = response.result + } + + resolve(responseObject) }) .catch(async (e: Error) => { if (e instanceof JobExecutionError) { @@ -50,7 +68,9 @@ export class JesJobExecutor extends BaseJobExecutor { sasJob, data, config, - loginRequiredCallback + loginRequiredCallback, + accessToken, + extraResponseAttributes ).then( (res: any) => { resolve(res) diff --git a/src/job-execution/JobExecutor.ts b/src/job-execution/JobExecutor.ts index df75cb6..48b2dd9 100644 --- a/src/job-execution/JobExecutor.ts +++ b/src/job-execution/JobExecutor.ts @@ -1,5 +1,6 @@ import { ServerType } from '@sasjs/utils/types' import { SASjsRequest } from '../types' +import { ExtraResponseAttributes } from '@sasjs/utils/types' import { asyncForEach, parseGeneratedCode, parseSourceCode } from '../utils' export type ExecuteFunction = () => Promise @@ -10,7 +11,8 @@ export interface JobExecutor { data: any, config: any, loginRequiredCallback?: any, - accessToken?: string + accessToken?: string, + extraResponseAttributes?: ExtraResponseAttributes[] ) => Promise resendWaitingRequests: () => Promise getRequests: () => SASjsRequest[] @@ -28,7 +30,8 @@ export abstract class BaseJobExecutor implements JobExecutor { data: any, config: any, loginRequiredCallback?: any, - accessToken?: string | undefined + accessToken?: string | undefined, + extraResponseAttributes?: ExtraResponseAttributes[] ): Promise resendWaitingRequests = async () => {