diff --git a/package-lock.json b/package-lock.json index 3324bf6..adf8140 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1103,9 +1103,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -1648,9 +1648,9 @@ } }, "@types/jest": { - "version": "26.0.10", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.10.tgz", - "integrity": "sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q==", + "version": "26.0.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.13.tgz", + "integrity": "sha512-sCzjKow4z9LILc6DhBvn5AkIfmQzDZkgtVVKmGwVrs5tuid38ws281D4l+7x1kP487+FlKDh5kfMZ8WSPAdmdA==", "dev": true, "requires": { "jest-diff": "^25.2.1", @@ -5904,9 +5904,9 @@ "dev": true }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" diff --git a/package.json b/package.json index 3e38466..5e9edce 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "license": "ISC", "devDependencies": { "@types/isomorphic-fetch": "0.0.35", - "@types/jest": "^26.0.10", + "@types/jest": "^26.0.13", "cp": "^0.2.0", "jest": "^25.5.4", "path": "^0.12.7", diff --git a/src/FileUploader.ts b/src/FileUploader.ts index 8bd62be..c7be45a 100644 --- a/src/FileUploader.ts +++ b/src/FileUploader.ts @@ -1,4 +1,4 @@ -import { isLogInRequired, needsRetry } from './utils' +import { isLogInRequired, needsRetry, isUrl } from './utils' import { CsrfToken } from './types/CsrfToken' import { UploadFile } from './types/UploadFile' @@ -11,7 +11,10 @@ export class FileUploader { private jobsPath: string, private setCsrfTokenWeb: any, private csrfToken: CsrfToken | null = null - ) {} + ) { + if (serverUrl) isUrl(serverUrl) + } + private retryCount = 0 public uploadFile(sasJob: string, files: UploadFile[], params: any) { diff --git a/src/SAS9ApiClient.ts b/src/SAS9ApiClient.ts index 010d63a..40ffb09 100644 --- a/src/SAS9ApiClient.ts +++ b/src/SAS9ApiClient.ts @@ -1,9 +1,13 @@ +import { isUrl } from './utils' + /** * A client for interfacing with the SAS9 REST API * */ export class SAS9ApiClient { - constructor(private serverUrl: string) {} + constructor(private serverUrl: string) { + if (serverUrl) isUrl(serverUrl) + } /** * returns on object containing the server URL diff --git a/src/SASViyaApiClient.ts b/src/SASViyaApiClient.ts index e1a222a..b1084e3 100644 --- a/src/SASViyaApiClient.ts +++ b/src/SASViyaApiClient.ts @@ -2,7 +2,8 @@ import { isAuthorizeFormRequired, parseAndSubmitAuthorizeForm, convertToCSV, - makeRequest + makeRequest, + isUrl } from './utils' import * as NodeFormData from 'form-data' import * as path from 'path' @@ -26,7 +27,10 @@ export class SASViyaApiClient { if (!rootFolderName) { throw new Error('Root folder must be provided.') } + + if (serverUrl) isUrl(serverUrl) } + private csrfToken: CsrfToken | null = null private rootFolder: Folder | null = null private sessionManager = new SessionManager( diff --git a/src/SASjs.ts b/src/SASjs.ts index b901917..2e0c812 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -883,7 +883,7 @@ export default class SASjs { ) { if (this.retryCountWeb < requestRetryLimit) { this.retryCountWeb++ - this.request(sasJob, data).then( + this.request(sasJob, data, config, loginRequiredCallback).then( (res: any) => resolve(res), (err: any) => reject(err) ) diff --git a/src/SessionManager.ts b/src/SessionManager.ts index 5a782c2..a0c6fb9 100644 --- a/src/SessionManager.ts +++ b/src/SessionManager.ts @@ -1,5 +1,5 @@ import { Session, Context, CsrfToken } from './types' -import { asyncForEach, makeRequest } from './utils' +import { asyncForEach, makeRequest, isUrl } from './utils' const MAX_SESSION_COUNT = 1 @@ -8,7 +8,10 @@ export class SessionManager { private serverUrl: string, private contextName: string, private setCsrfToken: (csrfToken: CsrfToken) => void - ) {} + ) { + if (serverUrl) isUrl(serverUrl) + } + private sessions: Session[] = [] private currentContext: Context | null = null private csrfToken: CsrfToken | null = null diff --git a/src/utils/index.ts b/src/utils/index.ts index 6a15042..0eb205b 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -13,3 +13,4 @@ export * from './parseSasViyaLog' export * from './serialize' export * from './splitChunks' export * from './parseWeboutResponse' +export * from './isUrl' diff --git a/src/utils/isUrl.ts b/src/utils/isUrl.ts new file mode 100644 index 0000000..1e64fa7 --- /dev/null +++ b/src/utils/isUrl.ts @@ -0,0 +1,12 @@ +export const isUrl = (url: string): boolean => { + const pattern = new RegExp( + '^(http://|https://)[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$', + 'gi' + ) + + if (pattern.test(url)) return true + else + throw new Error( + `'${url}' is not a valid url. An example of a valid url is 'http://valid-url.com'.` + ) +}