From 13be2f9c701ba2ce05f80a43ff57c4c252a4291b Mon Sep 17 00:00:00 2001 From: Krishna Acondy Date: Fri, 9 Jul 2021 09:17:26 +0100 Subject: [PATCH] chore(*): remove unused dependencies and variables, fix imports --- package-lock.json | 46 ++++++++++++++++++++--- package.json | 3 +- src/SASViyaApiClient.ts | 12 ------ src/SASjs.ts | 8 +++- src/api/viya/executeScript.ts | 69 +++++++++++++++-------------------- src/api/viya/pollJobState.ts | 39 +++++++++++--------- tsconfig.json | 2 +- 7 files changed, 100 insertions(+), 79 deletions(-) diff --git a/package-lock.json b/package-lock.json index 059a16c..b59f89d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,8 @@ "url": "^0.11.0" }, "devDependencies": { + "@types/axios": "^0.14.0", + "@types/form-data": "^2.5.0", "@types/jest": "^26.0.23", "@types/mime": "^2.0.3", "@types/tough-cookie": "^4.0.0", @@ -24,7 +26,6 @@ "dotenv": "^10.0.0", "jest": "^27.0.6", "jest-extended": "^0.11.5", - "mime": "^2.5.2", "node-polyfill-webpack-plugin": "^1.1.4", "path": "^0.12.7", "process": "^0.11.10", @@ -1435,6 +1436,16 @@ "node": ">= 6" } }, + "node_modules/@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", + "deprecated": "This is a stub types definition for axios (https://github.com/mzabriskie/axios). axios provides its own type definitions, so you don't need @types/axios installed!", + "dev": true, + "dependencies": { + "axios": "*" + } + }, "node_modules/@types/babel__core": { "version": "7.1.14", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", @@ -1502,6 +1513,16 @@ "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", "dev": true }, + "node_modules/@types/form-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.5.0.tgz", + "integrity": "sha512-23/wYiuckYYtFpL+4RPWiWmRQH2BjFuqCUi2+N3amB1a1Drv+i/byTrGvlLwRVLFNAZbwpbQ7JvTK+VCAPMbcg==", + "deprecated": "This is a stub types definition. form-data provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "form-data": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -11155,11 +11176,6 @@ "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, "engines": { "node": ">=0.10.0" } @@ -15848,6 +15864,15 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", + "dev": true, + "requires": { + "axios": "*" + } + }, "@types/babel__core": { "version": "7.1.14", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz", @@ -15915,6 +15940,15 @@ "integrity": "sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==", "dev": true }, + "@types/form-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.5.0.tgz", + "integrity": "sha512-23/wYiuckYYtFpL+4RPWiWmRQH2BjFuqCUi2+N3amB1a1Drv+i/byTrGvlLwRVLFNAZbwpbQ7JvTK+VCAPMbcg==", + "dev": true, + "requires": { + "form-data": "*" + } + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", diff --git a/package.json b/package.json index 65fd231..471ca36 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,8 @@ }, "license": "ISC", "devDependencies": { + "@types/axios": "^0.14.0", + "@types/form-data": "^2.5.0", "@types/jest": "^26.0.23", "@types/mime": "^2.0.3", "@types/tough-cookie": "^4.0.0", @@ -46,7 +48,6 @@ "dotenv": "^10.0.0", "jest": "^27.0.6", "jest-extended": "^0.11.5", - "mime": "^2.5.2", "node-polyfill-webpack-plugin": "^1.1.4", "path": "^0.12.7", "process": "^0.11.10", diff --git a/src/SASViyaApiClient.ts b/src/SASViyaApiClient.ts index 8d33de0..78d92b5 100644 --- a/src/SASViyaApiClient.ts +++ b/src/SASViyaApiClient.ts @@ -18,7 +18,6 @@ import { SasAuthResponse, MacroVar, AuthConfig } from '@sasjs/utils/types' import { isAuthorizeFormRequired } from './auth/isAuthorizeFormRequired' import { RequestClient } from './request/RequestClient' import { prefixMessage } from '@sasjs/utils/error' -import * as mime from 'mime' import { pollJobState } from './api/viya/pollJobState' import { getAccessToken, getTokens, refreshTokens } from './auth/tokens' import { uploadTables } from './api/viya/uploadTables' @@ -334,9 +333,6 @@ export class SASViyaApiClient { const formData = new NodeFormData() formData.append('file', contentBuffer, fileName) - const mimeType = - mime.getType(fileName.match(/\.[0-9a-z]+$/i)?.[0] || '') ?? 'text/plain' - return ( await this.requestClient.post( `/files/files?parentFolderUri=${parentFolderUri}&typeDefName=file#rawUpload`, @@ -939,14 +935,6 @@ export class SASViyaApiClient { ? sourceFolder : await this.getFolderUri(sourceFolder, accessToken) - const requestInfo = { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - Authorization: 'Bearer ' + accessToken - } - } - const { result: members } = await this.requestClient.get<{ items: any[] }>( `${this.serverUrl}${sourceFolderUri}/members?limit=${limit}`, accessToken diff --git a/src/SASjs.ts b/src/SASjs.ts index d60ad27..b91e034 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -4,7 +4,12 @@ import { SASViyaApiClient } from './SASViyaApiClient' import { SAS9ApiClient } from './SAS9ApiClient' import { FileUploader } from './FileUploader' import { AuthManager } from './auth' -import { ServerType, MacroVar, AuthConfig } from '@sasjs/utils/types' +import { + ServerType, + MacroVar, + AuthConfig, + ExtraResponseAttributes +} from '@sasjs/utils/types' import { RequestClient } from './request/RequestClient' import { JobExecutor, @@ -14,7 +19,6 @@ import { Sas9JobExecutor } from './job-execution' import { ErrorResponse } from './types/errors' -import { ExtraResponseAttributes } from '@sasjs/utils/types' const defaultConfig: SASjsConfig = { serverUrl: '', diff --git a/src/api/viya/executeScript.ts b/src/api/viya/executeScript.ts index 0ea25c6..0abe466 100644 --- a/src/api/viya/executeScript.ts +++ b/src/api/viya/executeScript.ts @@ -1,10 +1,5 @@ -import { - AuthConfig, - MacroVar, - Logger, - LogLevel, - timestampToYYYYMMDDHHMMSS -} from '@sasjs/utils' +import { timestampToYYYYMMDDHHMMSS } from '@sasjs/utils/time' +import { AuthConfig, MacroVar } from '@sasjs/utils/types' import { prefixMessage } from '@sasjs/utils/error' import { PollOptions, @@ -42,7 +37,7 @@ export async function executeScript( linesOfCode: string[], contextName: string, authConfig?: AuthConfig, - data = null, + data: any = null, debug: boolean = false, expectWebout = false, waitForResult = true, @@ -80,7 +75,7 @@ export async function executeScript( ? jobPath.split(rootFolderName).join('').replace(/^\//, '') : jobPath - const logger = new Logger(debug ? LogLevel.Debug : LogLevel.Info) + const logger = process.logger || console logger.info( `Triggered '${relativeJobPath}' with PID ${ @@ -235,44 +230,40 @@ export async function executeScript( } if (jobStatus === 'failed' || jobStatus === 'error') { - return Promise.reject(new ComputeJobExecutionError(currentJob, log)) + throw new ComputeJobExecutionError(currentJob, log) } - let resultLink - - if (expectWebout) { - resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content` - } else { + if (!expectWebout) { return { job: currentJob, log } } - if (resultLink) { - jobResult = await requestClient - .get(resultLink, access_token, 'text/plain') - .catch(async (e) => { - if (e instanceof NotFoundError) { - if (logLink) { - const logUrl = `${logLink.href}/content` - const logCount = currentJob.logStatistics?.lineCount ?? 1000000 - log = await fetchLogByChunks( - requestClient, - access_token!, - logUrl, - logCount - ) + const resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content` - return Promise.reject({ - status: 500, - log - }) - } - } + jobResult = await requestClient + .get(resultLink, access_token, 'text/plain') + .catch(async (e) => { + if (e instanceof NotFoundError) { + if (logLink) { + const logUrl = `${logLink.href}/content` + const logCount = currentJob.logStatistics?.lineCount ?? 1000000 + log = await fetchLogByChunks( + requestClient, + access_token!, + logUrl, + logCount + ) - return { - result: JSON.stringify(e) + return Promise.reject({ + status: 500, + log + }) } - }) - } + } + + return { + result: JSON.stringify(e) + } + }) await sessionManager .clearSession(executionSessionId, access_token) diff --git a/src/api/viya/pollJobState.ts b/src/api/viya/pollJobState.ts index 1bd85f8..63796ce 100644 --- a/src/api/viya/pollJobState.ts +++ b/src/api/viya/pollJobState.ts @@ -1,5 +1,7 @@ -import { AuthConfig, createFile, generateTimestamp } from '@sasjs/utils' +import { AuthConfig } from '@sasjs/utils' import { prefixMessage } from '@sasjs/utils/error' +import { generateTimestamp } from '@sasjs/utils/time' +import { createFile } from '@sasjs/utils/file' import { Job, PollOptions } from '../..' import { getTokens } from '../../auth/tokens' import { RequestClient } from '../../request/RequestClient' @@ -15,17 +17,23 @@ export async function pollJobState( ) { const logger = process.logger || console - let POLL_INTERVAL = 300 - let MAX_POLL_COUNT = 1000 - let MAX_ERROR_COUNT = 5 + let pollInterval = 300 + let maxPollCount = 1000 + let maxErrorCount = 5 let access_token = (authConfig || {}).access_token + + const logFileName = `${postedJob.name || 'job'}-${generateTimestamp()}.log` + const logFilePath = `${ + pollOptions?.logFilePath || process.cwd() + }/${logFileName}` + if (authConfig) { ;({ access_token } = await getTokens(requestClient, authConfig)) } if (pollOptions) { - POLL_INTERVAL = pollOptions.pollInterval || POLL_INTERVAL - MAX_POLL_COUNT = pollOptions.maxPollCount || MAX_POLL_COUNT + pollInterval = pollOptions.pollInterval || pollInterval + maxPollCount = pollOptions.maxPollCount || maxPollCount } let postedJobState = '' @@ -89,10 +97,7 @@ export async function pollJobState( ) .catch((err) => { errorCount++ - if ( - pollCount >= MAX_POLL_COUNT || - errorCount >= MAX_ERROR_COUNT - ) { + if (pollCount >= maxPollCount || errorCount >= maxErrorCount) { throw prefixMessage( err, 'Error while getting job state after interval. ' @@ -123,11 +128,11 @@ export async function pollJobState( postedJob, requestClient, pollOptions?.streamLog || false, - pollOptions?.logFilePath, + logFilePath, access_token ) - if (pollCount >= MAX_POLL_COUNT) { + if (pollCount >= maxPollCount) { resolve(postedJobState) } } @@ -135,7 +140,7 @@ export async function pollJobState( clearInterval(interval) resolve(postedJobState) } - }, POLL_INTERVAL) + }, pollInterval) }) } @@ -143,7 +148,7 @@ async function saveLog( job: Job, requestClient: RequestClient, shouldSaveLog: boolean, - logFilePath?: string, + logFilePath: string, accessToken?: string ) { if (!shouldSaveLog) { @@ -157,8 +162,6 @@ async function saveLog( } const logger = process.logger || console - const logFileName = `${job.name || 'job'}-${generateTimestamp()}.log` - const logPath = `${logFilePath || process.cwd()}/${logFileName}` const jobLogUrl = job.links.find((l) => l.rel === 'log') if (!jobLogUrl) { @@ -173,6 +176,6 @@ async function saveLog( logCount ) - logger.info(`Writing logs to ${logPath}`) - await createFile(logPath, log) + logger.info(`Writing logs to ${logFilePath}`) + await createFile(logFilePath, log) } diff --git a/tsconfig.json b/tsconfig.json index e3dc154..36161db 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,5 +9,5 @@ "sourceMap": true }, "include": ["src"], - "exclude": ["node_modules", "**/*.spec.ts"] + "exclude": ["node_modules"] }