1
0
mirror of https://github.com/sasjs/adapter.git synced 2026-01-10 05:40:06 +00:00

chore: Merge branch 'deps-fix' into critical-deps-issues

This commit is contained in:
Yury Shkoda
2022-06-24 16:13:43 +03:00
28 changed files with 7512 additions and 3892 deletions

View File

@@ -11,10 +11,19 @@ on:
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy:
matrix:
node-version: [lts/fermium]
steps: steps:
- name: Checkout - uses: actions/checkout@v2
uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: npm
- name: Install Dependencies - name: Install Dependencies
run: npm ci run: npm ci
@@ -23,7 +32,7 @@ jobs:
- name: Build Project - name: Build Project
run: npm run build run: npm run build
- name: Semantic Release - name: Semantic Release
uses: cycjimmy/semantic-release-action@v2 uses: cycjimmy/semantic-release-action@v2
env: env:

7185
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -43,10 +43,10 @@
}, },
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@types/form-data": "2.5.0",
"@cypress/webpack-preprocessor": "5.9.1", "@cypress/webpack-preprocessor": "5.9.1",
"@types/axios": "0.14.0", "@types/axios": "0.14.0",
"@types/express": "4.17.13", "@types/express": "4.17.13",
"@types/form-data": "2.5.0",
"@types/jest": "27.4.0", "@types/jest": "27.4.0",
"@types/mime": "2.0.3", "@types/mime": "2.0.3",
"@types/pem": "1.9.6", "@types/pem": "1.9.6",
@@ -61,10 +61,10 @@
"node-polyfill-webpack-plugin": "1.1.4", "node-polyfill-webpack-plugin": "1.1.4",
"path": "0.12.7", "path": "0.12.7",
"pem": "1.14.6", "pem": "1.14.6",
"prettier": "2.6.2", "prettier": "2.7.1",
"process": "0.11.10", "process": "0.11.10",
"rimraf": "3.0.2", "rimraf": "3.0.2",
"semantic-release": "19.0.2", "semantic-release": "19.0.3",
"terser-webpack-plugin": "5.3.1", "terser-webpack-plugin": "5.3.1",
"ts-jest": "27.1.3", "ts-jest": "27.1.3",
"ts-loader": "9.2.6", "ts-loader": "9.2.6",

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
"private": true, "private": true,
"dependencies": { "dependencies": {
"@sasjs/adapter": "file:../build/sasjs-adapter-5.0.0.tgz", "@sasjs/adapter": "file:../build/sasjs-adapter-5.0.0.tgz",
"@sasjs/test-framework": "^1.2.0", "@sasjs/test-framework": "^1.5.6",
"@types/jest": "^26.0.20", "@types/jest": "^26.0.20",
"@types/node": "^14.14.41", "@types/node": "^14.14.41",
"@types/react": "^17.0.1", "@types/react": "^17.0.1",

View File

@@ -9,7 +9,7 @@ const Login = (): ReactElement<{}> => {
const appContext = useContext(AppContext) const appContext = useContext(AppContext)
const handleSubmit = useCallback( const handleSubmit = useCallback(
(e) => { (e: any) => {
e.preventDefault() e.preventDefault()
appContext.adapter.logIn(username, password).then((res) => { appContext.adapter.logIn(username, password).then((res) => {
appContext.setIsLoggedIn(res.isLoggedIn) appContext.setIsLoggedIn(res.isLoggedIn)
@@ -28,7 +28,7 @@ const Login = (): ReactElement<{}> => {
placeholder="User Name" placeholder="User Name"
value={username} value={username}
required required
onChange={(e) => setUsername(e.target.value)} onChange={(e: any) => setUsername(e.target.value)}
/> />
</div> </div>
<div className="row"> <div className="row">
@@ -38,7 +38,7 @@ const Login = (): ReactElement<{}> => {
type="password" type="password"
value={password} value={password}
required required
onChange={(e) => setPassword(e.target.value)} onChange={(e: any) => setPassword(e.target.value)}
/> />
</div> </div>
<button type="submit" className="submit-button"> <button type="submit" className="submit-button">

View File

@@ -86,7 +86,7 @@ export const sendArrTests = (adapter: SASjs): TestSuite => ({
'Should error out with long string values over 32765 characters', 'Should error out with long string values over 32765 characters',
test: () => { test: () => {
const data = getLongStringData(32767) const data = getLongStringData(32767)
return adapter.request('common/sendArr', data).catch((e) => e) return adapter.request('common/sendArr', data).catch((e: any) => e)
}, },
assertion: (error: any) => { assertion: (error: any) => {
return !!error && !!error.error && !!error.error.message return !!error && !!error.error && !!error.error.message
@@ -182,7 +182,9 @@ export const sendObjTests = (adapter: SASjs): TestSuite => ({
const invalidData: any = { const invalidData: any = {
'1InvalidTable': [{ col1: 42 }] '1InvalidTable': [{ col1: 42 }]
} }
return adapter.request('common/sendObj', invalidData).catch((e) => e) return adapter
.request('common/sendObj', invalidData)
.catch((e: any) => e)
}, },
assertion: (error: any) => assertion: (error: any) =>
!!error && !!error.error && !!error.error.message !!error && !!error.error && !!error.error.message
@@ -194,7 +196,9 @@ export const sendObjTests = (adapter: SASjs): TestSuite => ({
const invalidData: any = { const invalidData: any = {
'an invalidTable': [{ col1: 42 }] 'an invalidTable': [{ col1: 42 }]
} }
return adapter.request('common/sendObj', invalidData).catch((e) => e) return adapter
.request('common/sendObj', invalidData)
.catch((e: any) => e)
}, },
assertion: (error: any) => assertion: (error: any) =>
!!error && !!error.error && !!error.error.message !!error && !!error.error && !!error.error.message
@@ -206,7 +210,9 @@ export const sendObjTests = (adapter: SASjs): TestSuite => ({
const invalidData: any = { const invalidData: any = {
'anInvalidTable#': [{ col1: 42 }] 'anInvalidTable#': [{ col1: 42 }]
} }
return adapter.request('common/sendObj', invalidData).catch((e) => e) return adapter
.request('common/sendObj', invalidData)
.catch((e: any) => e)
}, },
assertion: (error: any) => assertion: (error: any) =>
!!error && !!error.error && !!error.error.message !!error && !!error.error && !!error.error.message
@@ -219,7 +225,9 @@ export const sendObjTests = (adapter: SASjs): TestSuite => ({
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: [{ col1: 42 }] xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: [{ col1: 42 }]
} }
return adapter.request('common/sendObj', invalidData).catch((e) => e) return adapter
.request('common/sendObj', invalidData)
.catch((e: any) => e)
}, },
assertion: (error: any) => assertion: (error: any) =>
!!error && !!error.error && !!error.error.message !!error && !!error.error && !!error.error.message
@@ -231,7 +239,9 @@ export const sendObjTests = (adapter: SASjs): TestSuite => ({
const invalidData: any = { const invalidData: any = {
inData: [[{ data: 'value' }]] inData: [[{ data: 'value' }]]
} }
return adapter.request('common/sendObj', invalidData).catch((e) => e) return adapter
.request('common/sendObj', invalidData)
.catch((e: any) => e)
}, },
assertion: (error: any) => assertion: (error: any) =>
!!error && !!error.error && !!error.error.message !!error && !!error.error && !!error.error.message
@@ -265,7 +275,7 @@ export const sendObjTests = (adapter: SASjs): TestSuite => ({
test: () => { test: () => {
return adapter return adapter
.request('common/sendObj', getLongStringData(32767)) .request('common/sendObj', getLongStringData(32767))
.catch((e) => e) .catch((e: any) => e)
}, },
assertion: (error: any) => { assertion: (error: any) => {
return !!error && !!error.error && !!error.error.message return !!error && !!error.error && !!error.error.message

View File

@@ -9,7 +9,7 @@ export const assert = (
} else { } else {
result = expression() result = expression()
} }
} catch (e) { } catch (e: any) {
console.error(message) console.error(message)
throw new Error(message) throw new Error(message)
} }

View File

@@ -31,7 +31,7 @@ describe('SASViyaApiClient', () => {
.mockImplementation(() => Promise.reject('Not Found')) .mockImplementation(() => Promise.reject('Not Found'))
const error = await sasViyaApiClient const error = await sasViyaApiClient
.createFolder('test', '/foo') .createFolder('test', '/foo')
.catch((e) => e) .catch((e: any) => e)
expect(error).toBeInstanceOf(RootFolderNotFoundError) expect(error).toBeInstanceOf(RootFolderNotFoundError)
}) })
}) })

View File

@@ -240,7 +240,7 @@ export async function executeScript(
jobResult = await requestClient jobResult = await requestClient
.get<any>(resultLink, access_token, 'text/plain') .get<any>(resultLink, access_token, 'text/plain')
.catch(async (e) => { .catch(async (e: any) => {
if (e instanceof NotFoundError) { if (e instanceof NotFoundError) {
if (logLink) { if (logLink) {
const logUrl = `${logLink.href}/content` const logUrl = `${logLink.href}/content`
@@ -271,7 +271,7 @@ export async function executeScript(
}) })
return { result: jobResult?.result, log } return { result: jobResult?.result, log }
} catch (e) { } catch (e: any) {
interface HttpError { interface HttpError {
status: number status: number
} }

View File

@@ -80,7 +80,7 @@ describe('executeScript', () => {
'test', 'test',
['%put hello'], ['%put hello'],
'test context' 'test context'
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while getting session.') expect(error).toContain('Error while getting session.')
}) })
@@ -128,7 +128,7 @@ describe('executeScript', () => {
false, false,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while getting session variable.') expect(error).toContain('Error while getting session variable.')
}) })
@@ -297,7 +297,7 @@ describe('executeScript', () => {
false, false,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while posting job') expect(error).toContain('Error while posting job')
}) })
@@ -367,7 +367,7 @@ describe('executeScript', () => {
true, true,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while polling job status.') expect(error).toContain('Error while polling job status.')
}) })
@@ -393,7 +393,7 @@ describe('executeScript', () => {
true, true,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(fetchLogsModule.fetchLogByChunks).toHaveBeenCalledWith( expect(fetchLogsModule.fetchLogByChunks).toHaveBeenCalledWith(
requestClient, requestClient,
@@ -468,7 +468,7 @@ describe('executeScript', () => {
true, true,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(fetchLogsModule.fetchLogByChunks).toHaveBeenCalledWith( expect(fetchLogsModule.fetchLogByChunks).toHaveBeenCalledWith(
requestClient, requestClient,
@@ -501,7 +501,7 @@ describe('executeScript', () => {
true, true,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(fetchLogsModule.fetchLogByChunks).toHaveBeenCalledWith( expect(fetchLogsModule.fetchLogByChunks).toHaveBeenCalledWith(
requestClient, requestClient,
@@ -561,7 +561,7 @@ describe('executeScript', () => {
true, true,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(requestClient.get).toHaveBeenCalledWith( expect(requestClient.get).toHaveBeenCalledWith(
`/compute/sessions/${mockSession.id}/filerefs/_webout/content`, `/compute/sessions/${mockSession.id}/filerefs/_webout/content`,
@@ -622,7 +622,7 @@ describe('executeScript', () => {
true, true,
defaultPollOptions, defaultPollOptions,
true true
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while clearing session.') expect(error).toContain('Error while clearing session.')
}) })

View File

@@ -59,7 +59,7 @@ describe('pollJobState', () => {
false, false,
undefined, undefined,
defaultPollOptions defaultPollOptions
).catch((e) => e) ).catch((e: any) => e)
expect((error as Error).message).toContain('Job state link was not found.') expect((error as Error).message).toContain('Job state link was not found.')
}) })
@@ -238,7 +238,7 @@ describe('pollJobState', () => {
false, false,
undefined, undefined,
defaultPollOptions defaultPollOptions
).catch((e) => e) ).catch((e: any) => e)
expect(error.message).toEqual( expect(error.message).toEqual(
'Error while polling job state for job j0b: Status Error' 'Error while polling job state for job j0b: Status Error'

View File

@@ -17,7 +17,7 @@ describe('saveLog', () => {
it('should throw an error when a valid access token is not provided', async () => { it('should throw an error when a valid access token is not provided', async () => {
const error = await saveLog(mockJob, requestClient, 0, 100, stream).catch( const error = await saveLog(mockJob, requestClient, 0, 100, stream).catch(
(e) => e (e: any) => e
) )
expect(error.message).toContain( expect(error.message).toContain(
@@ -33,7 +33,7 @@ describe('saveLog', () => {
100, 100,
stream, stream,
't0k3n' 't0k3n'
).catch((e) => e) ).catch((e: any) => e)
expect(error.message).toContain( expect(error.message).toContain(
`Log URL for job ${mockJob.id} was not found.` `Log URL for job ${mockJob.id} was not found.`

View File

@@ -30,7 +30,7 @@ describe('uploadTables', () => {
.mockImplementation(() => 'ERROR: LARGE STRING LENGTH') .mockImplementation(() => 'ERROR: LARGE STRING LENGTH')
const error = await uploadTables(requestClient, data, 't0k3n').catch( const error = await uploadTables(requestClient, data, 't0k3n').catch(
(e) => e (e: any) => e
) )
expect(requestClient.uploadFile).not.toHaveBeenCalled() expect(requestClient.uploadFile).not.toHaveBeenCalled()
@@ -46,7 +46,7 @@ describe('uploadTables', () => {
.mockImplementation(() => Promise.reject('Upload Error')) .mockImplementation(() => Promise.reject('Upload Error'))
const error = await uploadTables(requestClient, data, 't0k3n').catch( const error = await uploadTables(requestClient, data, 't0k3n').catch(
(e) => e (e: any) => e
) )
expect(error).toContain('Error while uploading file.') expect(error).toContain('Error while uploading file.')

View File

@@ -28,7 +28,7 @@ describe('writeStream', () => {
jest jest
.spyOn(stream, 'write') .spyOn(stream, 'write')
.mockImplementation((_, callback) => callback(new Error('Test Error'))) .mockImplementation((_, callback) => callback(new Error('Test Error')))
const error = await writeStream(stream, content).catch((e) => e) const error = await writeStream(stream, content).catch((e: any) => e)
expect(error.message).toEqual('Test Error') expect(error.message).toEqual('Test Error')
}) })

View File

@@ -4,7 +4,7 @@ export const writeStream = async (
stream: WriteStream, stream: WriteStream,
content: string content: string
): Promise<void> => ): Promise<void> =>
stream.write(content + '\n', (e) => { stream.write(content + '\n', (e: any) => {
if (e) return Promise.reject(e) if (e) return Promise.reject(e)
return Promise.resolve() return Promise.resolve()

View File

@@ -53,7 +53,7 @@ describe('getAccessTokenForSasjs', () => {
requestClient, requestClient,
authConfig.client, authConfig.client,
authConfig.refresh_token authConfig.refresh_token
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while getting access token') expect(error).toContain('Error while getting access token')
}) })

View File

@@ -64,7 +64,7 @@ describe('getAccessTokenForViya', () => {
authConfig.client, authConfig.client,
authConfig.secret, authConfig.secret,
authConfig.refresh_token authConfig.refresh_token
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while getting access token') expect(error).toContain('Error while getting access token')
}) })

View File

@@ -62,7 +62,9 @@ describe('getTokens', () => {
const expectedError = const expectedError =
'Unable to obtain new access token. Your refresh token has expired.' 'Unable to obtain new access token. Your refresh token has expired.'
const error = await getTokens(requestClient, authConfig).catch((e) => e) const error = await getTokens(requestClient, authConfig).catch(
(e: any) => e
)
expect(error.message).toEqual(expectedError) expect(error.message).toEqual(expectedError)
}) })

View File

@@ -35,7 +35,7 @@ describe('refreshTokensForSasjs', () => {
const error = await refreshTokensForSasjs( const error = await refreshTokensForSasjs(
requestClient, requestClient,
refresh_token refresh_token
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while refreshing tokens') expect(error).toContain('Error while refreshing tokens')
}) })

View File

@@ -63,7 +63,7 @@ describe('refreshTokensForViya', () => {
authConfig.client, authConfig.client,
authConfig.secret, authConfig.secret,
authConfig.refresh_token authConfig.refresh_token
).catch((e) => e) ).catch((e: any) => e)
expect(error).toContain('Error while refreshing tokens') expect(error).toContain('Error while refreshing tokens')
}) })

View File

@@ -7,7 +7,6 @@ describe('generateFileUploadForm', () => {
} }
const BlobMock = jest.fn() const BlobMock = jest.fn()
;(global as any).FormData = FormDataMock ;(global as any).FormData = FormDataMock
;(global as any).Blob = BlobMock ;(global as any).Blob = BlobMock
}) })

View File

@@ -169,15 +169,23 @@ export class WebJobExecutor extends BaseJobExecutor {
? res.result.log.map((logLine: any) => logLine.line).join('\n') ? res.result.log.map((logLine: any) => logLine.line).join('\n')
: res.result.log : res.result.log
const resObj = res const resObj =
this.serverType === ServerType.Sasjs
? {
result: res.result._webout,
log: parsedSasjsServerLog
}
: res
if (this.serverType === ServerType.Sasjs) { if (
if (res.result._webout.length < 1) this.serverType === ServerType.Sasjs &&
throw new JobExecutionError( res.result._webout.length < 1
0, ) {
'Job execution failed', throw new JobExecutionError(
parsedSasjsServerLog 0,
) `No webout was returned by job ${program}. Server type is SASJS and the calling function is WebJobExecutor. Please check the SAS log for more info.`,
parsedSasjsServerLog
)
} }
this.requestClient!.appendRequest(resObj, sasJob, config.debug) this.requestClient!.appendRequest(resObj, sasJob, config.debug)

View File

@@ -207,7 +207,7 @@ export class RequestClient implements HttpClient {
return this.parseResponse<T>(response) return this.parseResponse<T>(response)
}) })
.catch(async (e) => { .catch(async (e: any) => {
return await this.handleError( return await this.handleError(
e, e,
() => () =>
@@ -248,7 +248,7 @@ export class RequestClient implements HttpClient {
return this.parseResponse<T>(response) return this.parseResponse<T>(response)
}) })
.catch(async (e) => { .catch(async (e: any) => {
return await this.handleError(e, () => return await this.handleError(e, () =>
this.post<T>(url, data, accessToken, contentType, overrideHeaders) this.post<T>(url, data, accessToken, contentType, overrideHeaders)
) )
@@ -272,7 +272,7 @@ export class RequestClient implements HttpClient {
throwIfError(response) throwIfError(response)
return this.parseResponse<T>(response) return this.parseResponse<T>(response)
}) })
.catch(async (e) => { .catch(async (e: any) => {
return await this.handleError(e, () => return await this.handleError(e, () =>
this.put<T>(url, data, accessToken, overrideHeaders) this.put<T>(url, data, accessToken, overrideHeaders)
) )
@@ -291,7 +291,7 @@ export class RequestClient implements HttpClient {
throwIfError(response) throwIfError(response)
return this.parseResponse<T>(response) return this.parseResponse<T>(response)
}) })
.catch(async (e) => { .catch(async (e: any) => {
return await this.handleError(e, () => this.delete<T>(url, accessToken)) return await this.handleError(e, () => this.delete<T>(url, accessToken))
}) })
} }
@@ -309,7 +309,7 @@ export class RequestClient implements HttpClient {
throwIfError(response) throwIfError(response)
return this.parseResponse<T>(response) return this.parseResponse<T>(response)
}) })
.catch(async (e) => { .catch(async (e: any) => {
return await this.handleError(e, () => return await this.handleError(e, () =>
this.patch<T>(url, data, accessToken) this.patch<T>(url, data, accessToken)
) )

View File

@@ -68,7 +68,7 @@ export class Sas9RequestClient extends RequestClient {
throwIfError(response) throwIfError(response)
return this.parseResponse<T>(response) return this.parseResponse<T>(response)
}) })
.catch(async (e) => { .catch(async (e: any) => {
return await this.handleError( return await this.handleError(
e, e,
() => () =>
@@ -113,7 +113,7 @@ export class Sas9RequestClient extends RequestClient {
throwIfError(response) throwIfError(response)
return this.parseResponse<T>(response) return this.parseResponse<T>(response)
}) })
.catch(async (e) => { .catch(async (e: any) => {
return await this.handleError(e, () => return await this.handleError(e, () =>
this.post<T>(url, data, accessToken, contentType, overrideHeaders) this.post<T>(url, data, accessToken, contentType, overrideHeaders)
) )

View File

@@ -15,7 +15,7 @@ export const getValidJson = (str: string | object): object => {
if (str === '') return {} if (str === '') return {}
return JSON.parse(str) return JSON.parse(str)
} catch (e) { } catch (e: any) {
if (e instanceof JsonParseArrayError) throw e if (e instanceof JsonParseArrayError) throw e
throw new InvalidJsonError() throw new InvalidJsonError()
} }

View File

@@ -4,7 +4,7 @@ export const parseSasViyaLog = (logResponse: { items: any[] }) => {
log = logResponse.items log = logResponse.items
? logResponse.items.map((i) => i.line).join('\n') ? logResponse.items.map((i) => i.line).join('\n')
: JSON.stringify(logResponse) : JSON.stringify(logResponse)
} catch (e) { } catch (e: any) {
console.error('An error has occurred while parsing the log response', e) console.error('An error has occurred while parsing the log response', e)
log = logResponse log = logResponse
} }

View File

@@ -8,7 +8,7 @@ export const parseWeboutResponse = (response: string, url?: string): string => {
sasResponse = response sasResponse = response
.split('>>weboutBEGIN<<')[1] .split('>>weboutBEGIN<<')[1]
.split('>>weboutEND<<')[0] .split('>>weboutEND<<')[0]
} catch (e) { } catch (e: any) {
if (url) throw new WeboutResponseError(url) if (url) throw new WeboutResponseError(url)
sasResponse = '' sasResponse = ''