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

Compare commits

..

42 Commits

Author SHA1 Message Date
Krishna Acondy
85a530ae5a Merge pull request #231 from sasjs/insecure-connection
feat: enable insecure connection for accessToken
2021-01-29 12:10:41 +00:00
Saad Jutt
1fc6db114d chore: docs updated 2021-01-27 15:57:21 +05:00
Saad Jutt
8d203b8df4 chore: annotation added 2021-01-27 15:47:15 +05:00
Saad Jutt
39924ff078 chore: added 'https' 2021-01-26 18:45:21 +05:00
Saad Jutt
de25f106ec feat: enable insecure connection for accessToken 2021-01-26 17:17:46 +05:00
Yury Shkoda
c0b82c5125 Merge pull request #211 from sasjs/deps-fix
chore(deps): rolled back isomorphic-fetch
2021-01-13 15:38:27 +03:00
Yury Shkoda
1c1b5baefe chore(deps): rolled back isomorphic-fetch 2021-01-13 15:22:07 +03:00
Yury Shkoda
8b17aeaea2 Merge pull request #121 from sasjs/dependabot/npm_and_yarn/isomorphic-fetch-3.0.0
chore(deps): bump isomorphic-fetch from 2.2.1 to 3.0.0
2021-01-13 12:36:28 +03:00
Yury Shkoda
cb0d03c965 Merge branch 'master' into dependabot/npm_and_yarn/isomorphic-fetch-3.0.0 2021-01-13 12:34:40 +03:00
Yury Shkoda
9e77f3d64e Merge pull request #191 from sasjs/dependabot/npm_and_yarn/typedoc-0.19.2
chore(deps-dev): bump typedoc from 0.17.8 to 0.19.2
2021-01-13 12:34:03 +03:00
Yury Shkoda
25f61815dc Merge branch 'master' into dependabot/npm_and_yarn/typedoc-0.19.2 2021-01-13 12:30:51 +03:00
dependabot-preview[bot]
3a2252e69c chore(deps-dev): bump typedoc from 0.17.8 to 0.19.2
Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.17.8 to 0.19.2.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/0.17.8...v0.19.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 09:30:42 +00:00
dependabot-preview[bot]
8a08980e6a chore(deps): bump isomorphic-fetch from 2.2.1 to 3.0.0
Bumps [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) from 2.2.1 to 3.0.0.
- [Release notes](https://github.com/matthew-andrews/isomorphic-fetch/releases)
- [Commits](https://github.com/matthew-andrews/isomorphic-fetch/compare/v2.2.1...v3.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 09:30:40 +00:00
Yury Shkoda
d0f31771ad Merge pull request #194 from sasjs/dependabot/npm_and_yarn/semantic-release-17.3.1
chore(deps-dev): bump semantic-release from 17.3.0 to 17.3.1
2021-01-13 12:30:22 +03:00
Yury Shkoda
e9e2c9372d Merge branch 'master' into dependabot/npm_and_yarn/semantic-release-17.3.1 2021-01-13 12:28:50 +03:00
Yury Shkoda
70c4a095a0 Merge pull request #199 from sasjs/dependabot/npm_and_yarn/webpack-cli-4.3.1
chore(deps-dev): bump webpack-cli from 4.2.0 to 4.3.1
2021-01-13 12:28:29 +03:00
Yury Shkoda
82e2fc4445 Merge branch 'master' into dependabot/npm_and_yarn/webpack-cli-4.3.1 2021-01-13 12:26:22 +03:00
dependabot-preview[bot]
6661d81fdf chore(deps-dev): bump semantic-release from 17.3.0 to 17.3.1
Bumps [semantic-release](https://github.com/semantic-release/semantic-release) from 17.3.0 to 17.3.1.
- [Release notes](https://github.com/semantic-release/semantic-release/releases)
- [Commits](https://github.com/semantic-release/semantic-release/compare/v17.3.0...v17.3.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 09:26:20 +00:00
dependabot-preview[bot]
e76abaafa8 chore(deps-dev): bump webpack-cli from 4.2.0 to 4.3.1
Bumps [webpack-cli](https://github.com/webpack/webpack-cli) from 4.2.0 to 4.3.1.
- [Release notes](https://github.com/webpack/webpack-cli/releases)
- [Changelog](https://github.com/webpack/webpack-cli/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-cli/compare/webpack-cli@4.2.0...webpack-cli@4.3.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 09:26:13 +00:00
Yury Shkoda
fbfc1c05d6 Merge pull request #200 from sasjs/dependabot/npm_and_yarn/typedoc-plugin-external-module-name-4.0.6
chore(deps-dev): bump typedoc-plugin-external-module-name from 4.0.5 to 4.0.6
2021-01-13 12:25:47 +03:00
Yury Shkoda
839c211c64 Merge branch 'master' into dependabot/npm_and_yarn/typedoc-plugin-external-module-name-4.0.6 2021-01-13 12:24:19 +03:00
Yury Shkoda
f3ff82143a Merge pull request #204 from sasjs/dependabot/npm_and_yarn/ts-loader-8.0.14
chore(deps-dev): bump ts-loader from 8.0.12 to 8.0.14
2021-01-13 12:24:02 +03:00
dependabot-preview[bot]
0dd0abae87 chore(deps-dev): bump typedoc-plugin-external-module-name
Bumps [typedoc-plugin-external-module-name](https://github.com/christopherthielen/typedoc-plugin-external-module-name) from 4.0.5 to 4.0.6.
- [Release notes](https://github.com/christopherthielen/typedoc-plugin-external-module-name/releases)
- [Changelog](https://github.com/christopherthielen/typedoc-plugin-external-module-name/blob/master/CHANGELOG.md)
- [Commits](https://github.com/christopherthielen/typedoc-plugin-external-module-name/compare/4.0.5...4.0.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 09:23:15 +00:00
Yury Shkoda
13781c993e Merge branch 'master' into dependabot/npm_and_yarn/ts-loader-8.0.14 2021-01-13 12:21:25 +03:00
Yury Shkoda
7616cacbec Merge pull request #205 from sasjs/dependabot/npm_and_yarn/types/jest-26.0.20
chore(deps-dev): bump @types/jest from 26.0.19 to 26.0.20
2021-01-13 12:21:01 +03:00
dependabot-preview[bot]
cab7d3c012 chore(deps-dev): bump ts-loader from 8.0.12 to 8.0.14
Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 8.0.12 to 8.0.14.
- [Release notes](https://github.com/TypeStrong/ts-loader/releases)
- [Changelog](https://github.com/TypeStrong/ts-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TypeStrong/ts-loader/compare/v8.0.12...v8.0.14)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 09:20:57 +00:00
Yury Shkoda
dfce676fdf Merge branch 'master' into dependabot/npm_and_yarn/types/jest-26.0.20 2021-01-13 12:18:53 +03:00
dependabot-preview[bot]
1890cab623 chore(deps-dev): bump @types/jest from 26.0.19 to 26.0.20
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 26.0.19 to 26.0.20.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 09:18:44 +00:00
Yury Shkoda
4307d8fe43 Merge pull request #207 from sasjs/dependabot/npm_and_yarn/webpack-5.13.0
chore(deps-dev): bump webpack from 4.44.2 to 5.13.0
2021-01-13 12:18:17 +03:00
Yury Shkoda
8df6fdbee6 Merge branch 'master' into dependabot/npm_and_yarn/webpack-5.13.0 2021-01-13 12:16:49 +03:00
Yury Shkoda
ac5c2a3088 Merge pull request #210 from sasjs/dependabot/npm_and_yarn/sasjs/utils-2.0.2
chore(deps): bump @sasjs/utils from 1.5.0 to 2.0.2
2021-01-13 12:16:18 +03:00
dependabot-preview[bot]
0212b677ae chore(deps): bump @sasjs/utils from 1.5.0 to 2.0.2
Bumps [@sasjs/utils](https://github.com/sasjs/utils) from 1.5.0 to 2.0.2.
- [Release notes](https://github.com/sasjs/utils/releases)
- [Commits](https://github.com/sasjs/utils/compare/v1.5.0...v2.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-13 08:03:31 +00:00
Yury Shkoda
1a0d62d8f3 Merge pull request #209 from sasjs/job-status-fix
feat(*): improved session and job logging
2021-01-12 17:53:25 +03:00
Yury Shkoda
8f4d1c7aea chore(*): improved session and job state logging 2021-01-12 17:26:57 +03:00
dependabot-preview[bot]
2a4735c6f2 chore(deps-dev): bump webpack from 4.44.2 to 5.13.0
Bumps [webpack](https://github.com/webpack/webpack) from 4.44.2 to 5.13.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v4.44.2...v5.13.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2021-01-12 08:21:08 +00:00
Yury Shkoda
5a2ee88cbc fix(job-status): print job status only if it changes 2021-01-11 13:52:38 +03:00
Allan Bowe
b23f199334 Merge pull request #203 from sasjs/relative-service-paths
fix(relative-paths): process relative and absolute paths the same way
2021-01-05 21:02:45 +01:00
Krishna Acondy
ed5dabee9f fix(relative-paths): process relative and absolute paths the same way 2021-01-05 19:37:40 +00:00
Allan Bowe
0c88c5a522 Merge pull request #201 from sasjs/services-subfolder
fix(deploy-service-pack): deploy services into 'services' subfolder
2021-01-05 18:23:52 +01:00
Krishna Acondy
640e7015c8 fix(*): deploy services into 'services' subfolder 2021-01-05 17:19:05 +00:00
Yury Shkoda
2fd306f435 Merge pull request #195 from sasjs/v2-bump
test(coverage): enabled gathering coverage
2020-12-30 15:31:01 +03:00
Yury Shkoda
e3f779dbd1 test(coverage): enabled gathering coverage
BREAKING CHANGE: SASjs Adapter 2.0 - Electric Boogaloo
2020-12-30 15:04:59 +03:00
36 changed files with 1122 additions and 3073 deletions

4
.gitignore vendored
View File

@@ -1,4 +1,6 @@
node_modules
build
.env
.env
/coverage

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

3772
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
"publish:lib": "npm run build && cd build && npm publish",
"lint:fix": "npx prettier --write 'src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}'",
"lint": "npx prettier --check 'src/**/*.{ts,tsx,js,jsx,html,css,sass,less,json,yml,md,graphql}'",
"test": "jest",
"test": "jest --coverage",
"prepublishOnly": "cp -r ./build/* . && rm -rf ./build",
"postpublish": "git clean -fd",
"semantic-release": "semantic-release",
@@ -37,30 +37,31 @@
"license": "ISC",
"devDependencies": {
"@types/isomorphic-fetch": "0.0.35",
"@types/jest": "^26.0.15",
"@types/jest": "^26.0.20",
"cp": "^0.2.0",
"dotenv": "^8.2.0",
"jest": "^25.5.4",
"path": "^0.12.7",
"rimraf": "^3.0.2",
"semantic-release": "^17.3.0",
"semantic-release": "^17.3.1",
"terser-webpack-plugin": "^4.2.3",
"ts-jest": "^25.5.1",
"ts-loader": "^8.0.11",
"ts-loader": "^8.0.14",
"tslint": "^6.1.3",
"tslint-config-prettier": "^1.18.0",
"typedoc": "^0.17.8",
"typedoc": "^0.19.2",
"typedoc-neo-theme": "^1.0.10",
"typedoc-plugin-external-module-name": "^4.0.3",
"typedoc-plugin-external-module-name": "^4.0.6",
"typescript": "^3.9.7",
"webpack": "^4.44.2",
"webpack-cli": "^4.2.0"
"webpack": "^5.13.0",
"webpack-cli": "^4.3.1"
},
"main": "index.js",
"dependencies": {
"@sasjs/utils": "^1.5.0",
"@sasjs/utils": "^2.0.2",
"es6-promise": "^4.2.8",
"form-data": "^3.0.0",
"https": "^1.0.0",
"isomorphic-fetch": "^2.2.1"
}
}

View File

@@ -701,11 +701,13 @@ export class SASViyaApiClient {
* @param clientId - the client ID to authenticate with.
* @param clientSecret - the client secret to authenticate with.
* @param authCode - the auth code received from the server.
* @param insecure - this boolean tells adapter to ignore SSL errors. [Not Recommended]
*/
public async getAccessToken(
clientId: string,
clientSecret: string,
authCode: string
authCode: string,
insecure: boolean = false
) {
const url = this.serverUrl + '/SASLogon/oauth/token'
let token
@@ -729,12 +731,23 @@ export class SASViyaApiClient {
formData.append('code', authCode)
}
let moreOptions = {}
if (insecure) {
const https = require('https')
moreOptions = {
agent: new https.Agent({
rejectUnauthorized: false
})
}
}
const authResponse = await fetch(url, {
method: 'POST',
credentials: 'include',
headers,
body: formData as any,
referrerPolicy: 'same-origin'
referrerPolicy: 'same-origin',
...moreOptions
}).then((res) => res.json())
return authResponse
@@ -833,23 +846,20 @@ export class SASViyaApiClient {
)
}
if (isRelativePath(sasJob)) {
const folderName = sasJob.split('/')[0]
await this.populateFolderMap(
`${this.rootFolderName}/${folderName}`,
accessToken
)
const folderPathParts = sasJob.split('/')
const jobName = folderPathParts.pop()
const folderPath = folderPathParts.join('/')
const fullFolderPath = isRelativePath(sasJob)
? `${this.rootFolderName}/${folderPath}`
: folderPath
if (!this.folderMap.get(`${this.rootFolderName}/${folderName}`)) {
throw new Error(
`The folder '${folderName}' was not found at '${this.serverUrl}/${this.rootFolderName}'`
)
}
} else {
const folderPathParts = sasJob.split('/')
folderPathParts.pop()
const folderPath = folderPathParts.join('/')
await this.populateFolderMap(folderPath, accessToken)
await this.populateFolderMap(fullFolderPath, accessToken)
const jobFolder = this.folderMap.get(fullFolderPath)
if (!jobFolder) {
throw new Error(
`The folder '${fullFolderPath}' was not found on '${this.serverUrl}'`
)
}
const headers: any = { 'Content-Type': 'application/json' }
@@ -857,21 +867,7 @@ export class SASViyaApiClient {
headers.Authorization = `Bearer ${accessToken}`
}
let jobToExecute
if (isRelativePath(sasJob)) {
const folderName = sasJob.split('/')[0]
const jobName = sasJob.split('/')[1]
const jobFolder = this.folderMap.get(
`${this.rootFolderName}/${folderName}`
)
jobToExecute = jobFolder?.find((item) => item.name === jobName)
} else {
const folderPathParts = sasJob.split('/')
const jobName = folderPathParts.pop()
const folderPath = folderPathParts.join('/')
const jobFolder = this.folderMap.get(folderPath)
jobToExecute = jobFolder?.find((item) => item.name === jobName)
}
const jobToExecute = jobFolder?.find((item) => item.name === jobName)
if (!jobToExecute) {
throw new Error(`Job was not found.`)
@@ -937,52 +933,28 @@ export class SASViyaApiClient {
)
}
if (isRelativePath(sasJob)) {
const folderName = sasJob.split('/')[0]
await this.populateFolderMap(
`${this.rootFolderName}/${folderName}`,
accessToken
)
const folderPathParts = sasJob.split('/')
const jobName = folderPathParts.pop()
const folderPath = folderPathParts.join('/')
const fullFolderPath = isRelativePath(sasJob)
? `${this.rootFolderName}/${folderPath}`
: folderPath
await this.populateFolderMap(fullFolderPath, accessToken)
if (!this.folderMap.get(`${this.rootFolderName}/${folderName}`)) {
throw new Error(
`The folder '${folderName}' was not found at '${this.serverUrl}/${this.rootFolderName}'.`
)
}
} else {
const folderPathParts = sasJob.split('/')
folderPathParts.pop()
const folderPath = folderPathParts.join('/')
await this.populateFolderMap(folderPath, accessToken)
if (!this.folderMap.get(folderPath)) {
throw new Error(
`The folder '${folderPath}' was not found at '${this.serverUrl}'.`
)
}
const jobFolder = this.folderMap.get(fullFolderPath)
if (!jobFolder) {
throw new Error(
`The folder '${fullFolderPath}' was not found on '${this.serverUrl}'.`
)
}
const jobToExecute = jobFolder?.find((item) => item.name === jobName)
let files: any[] = []
if (data && Object.keys(data).length) {
files = await this.uploadTables(data, accessToken)
}
let jobToExecute: Job | undefined
let jobName: string | undefined
let jobPath: string | undefined
if (isRelativePath(sasJob)) {
const folderName = sasJob.split('/')[0]
jobName = sasJob.split('/')[1]
jobPath = `${this.rootFolderName}/${folderName}`
const jobFolder = this.folderMap.get(jobPath)
jobToExecute = jobFolder?.find((item) => item.name === jobName)
} else {
const folderPathParts = sasJob.split('/')
jobName = folderPathParts.pop()
jobPath = folderPathParts.join('/')
const jobFolder = this.folderMap.get(jobPath)
jobToExecute = jobFolder?.find((item) => item.name === jobName)
}
if (!jobToExecute) {
throw new Error(`Job was not found.`)
}
@@ -1007,7 +979,7 @@ export class SASViyaApiClient {
const jobArguments: { [key: string]: any } = {
_contextName: contextName,
_program: `${jobPath}/${jobName}`,
_program: `${fullFolderPath}/${jobName}`,
_webin_file_count: files.length,
_OMITJSONLISTING: true,
_OMITJSONLOG: true,
@@ -1148,6 +1120,8 @@ export class SASViyaApiClient {
}
return new Promise(async (resolve, _) => {
let printedState = ''
const interval = setInterval(async () => {
if (
postedJobState === 'running' ||
@@ -1155,9 +1129,6 @@ export class SASViyaApiClient {
postedJobState === 'pending'
) {
if (stateLink) {
if (this.debug) {
console.log('Polling job status... \n')
}
const { result: jobState } = await this.request<string>(
`${this.serverUrl}${stateLink.href}?_action=wait&wait=30`,
{
@@ -1167,10 +1138,16 @@ export class SASViyaApiClient {
)
postedJobState = jobState.trim()
if (this.debug) {
console.log(`Current state: ${postedJobState}\n`)
if (this.debug && printedState !== postedJobState) {
console.log('Polling job status...')
console.log(`Current job state: ${postedJobState}`)
printedState = postedJobState
}
pollCount++
if (pollCount >= MAX_POLL_COUNT) {
resolve(postedJobState)
}

View File

@@ -386,17 +386,26 @@ export default class SASjs {
return await this.sasViyaApiClient!.getAuthCode(clientId)
}
/**
* Exchanges the auth code for an access token for the given client.
* @param clientId - the client ID to authenticate with.
* @param clientSecret - the client secret to authenticate with.
* @param authCode - the auth code received from the server.
* @param insecure - this boolean tells adapter to ignore SSL errors. [Not Recommended]
*/
public async getAccessToken(
clientId: string,
clientSecret: string,
authCode: string
authCode: string,
insecure: boolean = false
) {
this.isMethodSupported('getAccessToken', ServerType.SASViya)
return await this.sasViyaApiClient!.getAccessToken(
clientId,
clientSecret,
authCode
authCode,
insecure
)
}
@@ -747,10 +756,7 @@ export default class SASjs {
)
}
const members =
serviceJson.members[0].name === 'services'
? serviceJson.members[0].members
: serviceJson.members
const members = serviceJson.members
await this.createFoldersAndServices(
appLoc,

View File

@@ -23,6 +23,10 @@ export class SessionManager {
private currentContext: Context | null = null
private csrfToken: CsrfToken | null = null
private _debug: boolean = false
private printedSessionState = {
printed: false,
state: ''
}
public get debug() {
return this._debug
@@ -175,8 +179,10 @@ export class SessionManager {
sessionState === ''
) {
if (stateLink) {
if (this.debug) {
console.log('Polling session status... \n')
if (this.debug && !this.printedSessionState.printed) {
console.log('Polling session status...')
this.printedSessionState.printed = true
}
const { result: state } = await this.requestSessionStatus<string>(
@@ -191,8 +197,11 @@ export class SessionManager {
sessionState = state.trim()
if (this.debug) {
console.log(`Current state is '${sessionState}'\n`)
if (this.debug && this.printedSessionState.state !== sessionState) {
console.log(`Current session state is '${sessionState}'`)
this.printedSessionState.state = sessionState
this.printedSessionState.printed = false
}
// There is an internal error present in SAS Viya 3.5

View File

@@ -26,7 +26,8 @@ const browserConfig = {
]
},
resolve: {
extensions: ['.ts', '.js']
extensions: ['.ts', '.js'],
fallback: { https: false }
},
output: {
filename: 'index.js',