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

Compare commits

...

18 Commits

Author SHA1 Message Date
Allan Bowe
57d0b30f47 Merge pull request #52 from sasjs/deploy-issue
fix: members of type folder should be processed first on service pack deploy.
2020-08-28 20:00:43 +02:00
0d5af2487d fix: members of type folder should be proccessed first on service pack deploy 2020-08-28 15:30:53 +03:00
1ea163fd03 fix: members of type folder should be proccessed first on service pack deploy 2020-08-28 14:31:35 +03:00
Allan Bowe
f27444bc52 Merge pull request #48 from sasjs/issue47
fix: login not working on non english browsers
2020-08-23 18:24:36 +02:00
Mihajlo Medjedovic
de426c9a92 fix: login not working on non english browsers 2020-08-23 18:17:35 +02:00
Allan Bowe
a006ead205 Merge pull request #46 from sasjs/issue45
fix: jobViaWeb config override
2020-08-23 17:07:47 +02:00
Mihajlo Medjedovic
422c2a1fd5 fix: jobViaWeb config override 2020-08-23 17:04:39 +02:00
Krishna Acondy
0c6409e402 Merge pull request #44 from sasjs/session-expiry-retry
fix(session-expiry-retry): retry job with new session on expiry
2020-08-18 21:45:47 +01:00
Krishna Acondy
68b864cf75 fix(session-expiry): discard and create new session if expired 2020-08-18 21:35:02 +01:00
Krishna Acondy
75a11cdff4 fix(session-expiry-retry): retry job with new session when current session has expired 2020-08-18 20:23:59 +01:00
Allan Bowe
4e2b6d32cc Merge pull request #43 from sasjs/parse-compute-log
fix(log): use compute log directly when available
2020-08-18 18:21:56 +02:00
Krishna Acondy
cd9757b383 Merge branch 'master' into parse-compute-log 2020-08-18 17:01:33 +01:00
Mihajlo Medjedovic
fb727788d0 fix: log capture if job fails, test framework update, added test for log capture 2020-08-18 17:36:25 +02:00
Allan Bowe
35eb6c4935 Merge pull request #40 from sasjs/dependabot/npm_and_yarn/types/jest-26.0.10
chore(deps-dev): bump @types/jest from 26.0.9 to 26.0.10
2020-08-18 13:26:57 +02:00
Mihajlo Medjedovic
ea0f338b90 Merge branch 'master' into parse-compute-log 2020-08-18 13:26:16 +02:00
Allan Bowe
b6a17b39b9 Merge branch 'master' into dependabot/npm_and_yarn/types/jest-26.0.10 2020-08-18 13:25:28 +02:00
Krishna Acondy
98c9cb78ff fix(log): use compute log as-is when available 2020-08-18 10:05:34 +01:00
dependabot-preview[bot]
c28a8ebf15 chore(deps-dev): bump @types/jest from 26.0.9 to 26.0.10
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 26.0.9 to 26.0.10.
- [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>
2020-08-17 13:19:21 +00:00
9 changed files with 424 additions and 359 deletions

429
package-lock.json generated
View File

@@ -1648,9 +1648,9 @@
} }
}, },
"@types/jest": { "@types/jest": {
"version": "26.0.9", "version": "26.0.10",
"resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.9.tgz", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.10.tgz",
"integrity": "sha512-k4qFfJ5AUKrWok5KYXp2EPm89b0P/KZpl7Vg4XuOTVVQEhLDBDBU3iBFrjjdgd8fLw96aAtmnwhXHl63bWeBQQ==", "integrity": "sha512-i2m0oyh8w/Lum7wWK/YOZJakYF8Mx08UaKA1CtbmFeDquVhAEdA7znacsVSf2hJ1OQ/OfVMGN90pw/AtzF8s/Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"jest-diff": "^25.2.1", "jest-diff": "^25.2.1",
@@ -3076,13 +3076,13 @@
"dev": true "dev": true
}, },
"compare-func": { "compare-func": {
"version": "1.3.4", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
"integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
"dev": true, "dev": true,
"requires": { "requires": {
"array-ify": "^1.0.0", "array-ify": "^1.0.0",
"dot-prop": "^3.0.0" "dot-prop": "^5.1.0"
} }
}, },
"component-emitter": { "component-emitter": {
@@ -3122,22 +3122,49 @@
"dev": true "dev": true
}, },
"conventional-changelog-angular": { "conventional-changelog-angular": {
"version": "5.0.10", "version": "5.0.11",
"resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz", "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz",
"integrity": "sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA==", "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==",
"dev": true, "dev": true,
"requires": { "requires": {
"compare-func": "^1.3.1", "compare-func": "^2.0.0",
"q": "^1.5.1" "q": "^1.5.1"
},
"dependencies": {
"compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
"integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==",
"dev": true,
"requires": {
"array-ify": "^1.0.0",
"dot-prop": "^5.1.0"
}
},
"dot-prop": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
"integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
"dev": true,
"requires": {
"is-obj": "^2.0.0"
}
},
"is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true
}
} }
}, },
"conventional-changelog-writer": { "conventional-changelog-writer": {
"version": "4.0.16", "version": "4.0.17",
"resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz", "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz",
"integrity": "sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ==", "integrity": "sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw==",
"dev": true, "dev": true,
"requires": { "requires": {
"compare-func": "^1.3.1", "compare-func": "^2.0.0",
"conventional-commits-filter": "^2.0.6", "conventional-commits-filter": "^2.0.6",
"dateformat": "^3.0.0", "dateformat": "^3.0.0",
"handlebars": "^4.7.6", "handlebars": "^4.7.6",
@@ -3580,12 +3607,12 @@
} }
}, },
"dot-prop": { "dot-prop": {
"version": "3.0.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
"integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
"dev": true, "dev": true,
"requires": { "requires": {
"is-obj": "^1.0.0" "is-obj": "^2.0.0"
} }
}, },
"duplexer2": { "duplexer2": {
@@ -5170,9 +5197,9 @@
"dev": true "dev": true
}, },
"is-obj": { "is-obj": {
"version": "1.0.1", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
"dev": true "dev": true
}, },
"is-plain-obj": { "is-plain-obj": {
@@ -8487,9 +8514,9 @@
"dev": true "dev": true
}, },
"npm": { "npm": {
"version": "6.14.6", "version": "6.14.8",
"resolved": "https://registry.npmjs.org/npm/-/npm-6.14.6.tgz", "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.8.tgz",
"integrity": "sha512-axnz6iHFK6WPE0js/+mRp+4IOwpHn5tJEw5KB6FiCU764zmffrhsYHbSHi2kKqNkRBt53XasXjngZfBD3FQzrQ==", "integrity": "sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A==",
"dev": true, "dev": true,
"requires": { "requires": {
"JSONStream": "^1.3.5", "JSONStream": "^1.3.5",
@@ -8498,7 +8525,7 @@
"ansistyles": "~0.1.3", "ansistyles": "~0.1.3",
"aproba": "^2.0.0", "aproba": "^2.0.0",
"archy": "~1.0.0", "archy": "~1.0.0",
"bin-links": "^1.1.7", "bin-links": "^1.1.8",
"bluebird": "^3.5.5", "bluebird": "^3.5.5",
"byte-size": "^5.0.1", "byte-size": "^5.0.1",
"cacache": "^12.0.3", "cacache": "^12.0.3",
@@ -8519,7 +8546,7 @@
"find-npm-prefix": "^1.0.2", "find-npm-prefix": "^1.0.2",
"fs-vacuum": "~1.2.10", "fs-vacuum": "~1.2.10",
"fs-write-stream-atomic": "~1.0.10", "fs-write-stream-atomic": "~1.0.10",
"gentle-fs": "^2.3.0", "gentle-fs": "^2.3.1",
"glob": "^7.1.6", "glob": "^7.1.6",
"graceful-fs": "^4.2.4", "graceful-fs": "^4.2.4",
"has-unicode": "~2.0.1", "has-unicode": "~2.0.1",
@@ -8534,14 +8561,14 @@
"is-cidr": "^3.0.0", "is-cidr": "^3.0.0",
"json-parse-better-errors": "^1.0.2", "json-parse-better-errors": "^1.0.2",
"lazy-property": "~1.0.0", "lazy-property": "~1.0.0",
"libcipm": "^4.0.7", "libcipm": "^4.0.8",
"libnpm": "^3.0.1", "libnpm": "^3.0.1",
"libnpmaccess": "^3.0.2", "libnpmaccess": "^3.0.2",
"libnpmhook": "^5.0.3", "libnpmhook": "^5.0.3",
"libnpmorg": "^1.0.1", "libnpmorg": "^1.0.1",
"libnpmsearch": "^2.0.2", "libnpmsearch": "^2.0.2",
"libnpmteam": "^1.0.2", "libnpmteam": "^1.0.2",
"libnpx": "^10.2.2", "libnpx": "^10.2.4",
"lock-verify": "^2.1.0", "lock-verify": "^2.1.0",
"lockfile": "^1.0.4", "lockfile": "^1.0.4",
"lodash._baseindexof": "*", "lodash._baseindexof": "*",
@@ -8556,22 +8583,22 @@
"lodash.uniq": "~4.5.0", "lodash.uniq": "~4.5.0",
"lodash.without": "~4.4.0", "lodash.without": "~4.4.0",
"lru-cache": "^5.1.1", "lru-cache": "^5.1.1",
"meant": "~1.0.1", "meant": "^1.0.2",
"mississippi": "^3.0.0", "mississippi": "^3.0.0",
"mkdirp": "^0.5.5", "mkdirp": "^0.5.5",
"move-concurrently": "^1.0.1", "move-concurrently": "^1.0.1",
"node-gyp": "^5.1.0", "node-gyp": "^5.1.0",
"nopt": "^4.0.3", "nopt": "^4.0.3",
"normalize-package-data": "^2.5.0", "normalize-package-data": "^2.5.0",
"npm-audit-report": "^1.3.2", "npm-audit-report": "^1.3.3",
"npm-cache-filename": "~1.0.2", "npm-cache-filename": "~1.0.2",
"npm-install-checks": "^3.0.2", "npm-install-checks": "^3.0.2",
"npm-lifecycle": "^3.1.4", "npm-lifecycle": "^3.1.5",
"npm-package-arg": "^6.1.1", "npm-package-arg": "^6.1.1",
"npm-packlist": "^1.4.8", "npm-packlist": "^1.4.8",
"npm-pick-manifest": "^3.0.2", "npm-pick-manifest": "^3.0.2",
"npm-profile": "^4.0.4", "npm-profile": "^4.0.4",
"npm-registry-fetch": "^4.0.5", "npm-registry-fetch": "^4.0.7",
"npm-user-validate": "~1.0.0", "npm-user-validate": "~1.0.0",
"npmlog": "~4.1.2", "npmlog": "~4.1.2",
"once": "~1.4.0", "once": "~1.4.0",
@@ -8780,7 +8807,7 @@
} }
}, },
"bin-links": { "bin-links": {
"version": "1.1.7", "version": "1.1.8",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -8935,26 +8962,41 @@
} }
}, },
"cliui": { "cliui": {
"version": "4.1.0", "version": "5.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
"string-width": "^2.1.1", "string-width": "^3.1.0",
"strip-ansi": "^4.0.0", "strip-ansi": "^5.2.0",
"wrap-ansi": "^2.0.0" "wrap-ansi": "^5.1.0"
}, },
"dependencies": { "dependencies": {
"ansi-regex": { "ansi-regex": {
"version": "3.0.0", "version": "4.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"strip-ansi": { "is-fullwidth-code-point": {
"version": "4.0.0", "version": "2.0.0",
"bundled": true,
"dev": true
},
"string-width": {
"version": "3.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
"ansi-regex": "^3.0.0" "emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"bundled": true,
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
} }
} }
} }
@@ -9069,11 +9111,11 @@
} }
}, },
"configstore": { "configstore": {
"version": "3.1.2", "version": "3.1.5",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
"dot-prop": "^4.1.0", "dot-prop": "^4.2.1",
"graceful-fs": "^4.1.2", "graceful-fs": "^4.1.2",
"make-dir": "^1.0.0", "make-dir": "^1.0.0",
"unique-string": "^1.0.0", "unique-string": "^1.0.0",
@@ -9249,7 +9291,7 @@
} }
}, },
"dot-prop": { "dot-prop": {
"version": "4.2.0", "version": "4.2.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -9316,6 +9358,11 @@
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"emoji-regex": {
"version": "7.0.3",
"bundled": true,
"dev": true
},
"encoding": { "encoding": {
"version": "0.1.12", "version": "0.1.12",
"bundled": true, "bundled": true,
@@ -9441,14 +9488,6 @@
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"find-up": {
"version": "2.1.0",
"bundled": true,
"dev": true,
"requires": {
"locate-path": "^2.0.0"
}
},
"flush-write-stream": { "flush-write-stream": {
"version": "1.0.3", "version": "1.0.3",
"bundled": true, "bundled": true,
@@ -9647,7 +9686,7 @@
"dev": true "dev": true
}, },
"gentle-fs": { "gentle-fs": {
"version": "2.3.0", "version": "2.3.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -9677,7 +9716,7 @@
} }
}, },
"get-caller-file": { "get-caller-file": {
"version": "1.0.3", "version": "2.0.5",
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
@@ -9901,11 +9940,6 @@
"validate-npm-package-name": "^3.0.0" "validate-npm-package-name": "^3.0.0"
} }
}, },
"invert-kv": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
"ip": { "ip": {
"version": "1.1.5", "version": "1.1.5",
"bundled": true, "bundled": true,
@@ -10090,16 +10124,8 @@
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"lcid": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"requires": {
"invert-kv": "^2.0.0"
}
},
"libcipm": { "libcipm": {
"version": "4.0.7", "version": "4.0.8",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -10109,7 +10135,7 @@
"find-npm-prefix": "^1.0.2", "find-npm-prefix": "^1.0.2",
"graceful-fs": "^4.1.11", "graceful-fs": "^4.1.11",
"ini": "^1.3.5", "ini": "^1.3.5",
"lock-verify": "^2.0.2", "lock-verify": "^2.1.0",
"mkdirp": "^0.5.1", "mkdirp": "^0.5.1",
"npm-lifecycle": "^3.0.0", "npm-lifecycle": "^3.0.0",
"npm-logical-tree": "^1.2.1", "npm-logical-tree": "^1.2.1",
@@ -10268,7 +10294,7 @@
} }
}, },
"libnpx": { "libnpx": {
"version": "10.2.2", "version": "10.2.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -10279,16 +10305,7 @@
"update-notifier": "^2.3.0", "update-notifier": "^2.3.0",
"which": "^1.3.0", "which": "^1.3.0",
"y18n": "^4.0.0", "y18n": "^4.0.0",
"yargs": "^11.0.0" "yargs": "^14.2.3"
}
},
"locate-path": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"requires": {
"p-locate": "^2.0.0",
"path-exists": "^3.0.0"
} }
}, },
"lock-verify": { "lock-verify": {
@@ -10419,36 +10436,11 @@
"ssri": "^6.0.0" "ssri": "^6.0.0"
} }
}, },
"map-age-cleaner": {
"version": "0.1.3",
"bundled": true,
"dev": true,
"requires": {
"p-defer": "^1.0.0"
}
},
"meant": { "meant": {
"version": "1.0.1", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"mem": {
"version": "4.3.0",
"bundled": true,
"dev": true,
"requires": {
"map-age-cleaner": "^0.1.1",
"mimic-fn": "^2.0.0",
"p-is-promise": "^2.0.0"
},
"dependencies": {
"mimic-fn": {
"version": "2.1.0",
"bundled": true,
"dev": true
}
}
},
"mime-db": { "mime-db": {
"version": "1.35.0", "version": "1.35.0",
"bundled": true, "bundled": true,
@@ -10470,6 +10462,11 @@
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": {
"version": "1.2.5",
"bundled": true,
"dev": true
},
"minizlib": { "minizlib": {
"version": "1.3.3", "version": "1.3.3",
"bundled": true, "bundled": true,
@@ -10551,11 +10548,6 @@
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"nice-try": {
"version": "1.0.5",
"bundled": true,
"dev": true
},
"node-fetch-npm": { "node-fetch-npm": {
"version": "2.0.2", "version": "2.0.2",
"bundled": true, "bundled": true,
@@ -10615,7 +10607,7 @@
} }
}, },
"npm-audit-report": { "npm-audit-report": {
"version": "1.3.2", "version": "1.3.3",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -10645,7 +10637,7 @@
} }
}, },
"npm-lifecycle": { "npm-lifecycle": {
"version": "3.1.4", "version": "3.1.5",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -10711,7 +10703,7 @@
} }
}, },
"npm-registry-fetch": { "npm-registry-fetch": {
"version": "4.0.5", "version": "4.0.7",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@@ -10802,44 +10794,6 @@
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"os-locale": {
"version": "3.1.0",
"bundled": true,
"dev": true,
"requires": {
"execa": "^1.0.0",
"lcid": "^2.0.0",
"mem": "^4.0.0"
},
"dependencies": {
"cross-spawn": {
"version": "6.0.5",
"bundled": true,
"dev": true,
"requires": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
},
"execa": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"requires": {
"cross-spawn": "^6.0.0",
"get-stream": "^4.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
"signal-exit": "^3.0.0",
"strip-eof": "^1.0.0"
}
}
}
},
"os-tmpdir": { "os-tmpdir": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
@@ -10854,42 +10808,11 @@
"os-tmpdir": "^1.0.0" "os-tmpdir": "^1.0.0"
} }
}, },
"p-defer": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"p-finally": { "p-finally": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
"p-is-promise": {
"version": "2.1.0",
"bundled": true,
"dev": true
},
"p-limit": {
"version": "1.2.0",
"bundled": true,
"dev": true,
"requires": {
"p-try": "^1.0.0"
}
},
"p-locate": {
"version": "2.0.0",
"bundled": true,
"dev": true,
"requires": {
"p-limit": "^1.1.0"
}
},
"p-try": {
"version": "1.0.0",
"bundled": true,
"dev": true
},
"package-json": { "package-json": {
"version": "4.0.1", "version": "4.0.1",
"bundled": true, "bundled": true,
@@ -11154,13 +11077,6 @@
"ini": "~1.3.0", "ini": "~1.3.0",
"minimist": "^1.2.0", "minimist": "^1.2.0",
"strip-json-comments": "~2.0.1" "strip-json-comments": "~2.0.1"
},
"dependencies": {
"minimist": {
"version": "1.2.5",
"bundled": true,
"dev": true
}
} }
}, },
"read": { "read": {
@@ -11286,7 +11202,7 @@
"dev": true "dev": true
}, },
"require-main-filename": { "require-main-filename": {
"version": "1.0.1", "version": "2.0.0",
"bundled": true, "bundled": true,
"dev": true "dev": true
}, },
@@ -11936,22 +11852,41 @@
} }
}, },
"wrap-ansi": { "wrap-ansi": {
"version": "2.1.0", "version": "5.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
"string-width": "^1.0.1", "ansi-styles": "^3.2.0",
"strip-ansi": "^3.0.1" "string-width": "^3.0.0",
"strip-ansi": "^5.0.0"
}, },
"dependencies": { "dependencies": {
"ansi-regex": {
"version": "4.1.0",
"bundled": true,
"dev": true
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
"string-width": { "string-width": {
"version": "1.0.2", "version": "3.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^3.0.0" "strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"bundled": true,
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
} }
} }
} }
@@ -11992,37 +11927,105 @@
"dev": true "dev": true
}, },
"yargs": { "yargs": {
"version": "11.1.1", "version": "14.2.3",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
"cliui": "^4.0.0", "cliui": "^5.0.0",
"decamelize": "^1.1.1", "decamelize": "^1.2.0",
"find-up": "^2.1.0", "find-up": "^3.0.0",
"get-caller-file": "^1.0.1", "get-caller-file": "^2.0.1",
"os-locale": "^3.1.0",
"require-directory": "^2.1.1", "require-directory": "^2.1.1",
"require-main-filename": "^1.0.1", "require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0", "set-blocking": "^2.0.0",
"string-width": "^2.0.0", "string-width": "^3.0.0",
"which-module": "^2.0.0", "which-module": "^2.0.0",
"y18n": "^3.2.1", "y18n": "^4.0.0",
"yargs-parser": "^9.0.2" "yargs-parser": "^15.0.1"
}, },
"dependencies": { "dependencies": {
"y18n": { "ansi-regex": {
"version": "3.2.1", "version": "4.1.0",
"bundled": true, "bundled": true,
"dev": true "dev": true
},
"find-up": {
"version": "3.0.0",
"bundled": true,
"dev": true,
"requires": {
"locate-path": "^3.0.0"
}
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"bundled": true,
"dev": true
},
"locate-path": {
"version": "3.0.0",
"bundled": true,
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"p-limit": {
"version": "2.3.0",
"bundled": true,
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"bundled": true,
"dev": true,
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.2.0",
"bundled": true,
"dev": true
},
"string-width": {
"version": "3.1.0",
"bundled": true,
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
}
},
"strip-ansi": {
"version": "5.2.0",
"bundled": true,
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
} }
} }
}, },
"yargs-parser": { "yargs-parser": {
"version": "9.0.2", "version": "15.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
"camelcase": "^4.1.0" "camelcase": "^5.0.0",
"decamelize": "^1.2.0"
},
"dependencies": {
"camelcase": {
"version": "5.3.1",
"bundled": true,
"dev": true
}
} }
} }
} }

View File

@@ -37,7 +37,7 @@
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@types/isomorphic-fetch": "0.0.35", "@types/isomorphic-fetch": "0.0.35",
"@types/jest": "^26.0.9", "@types/jest": "^26.0.10",
"cp": "^0.2.0", "cp": "^0.2.0",
"jest": "^25.5.4", "jest": "^25.5.4",
"path": "^0.12.7", "path": "^0.12.7",

View File

@@ -1357,9 +1357,9 @@
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
}, },
"@sasjs/adapter": { "@sasjs/adapter": {
"version": "1.2.0", "version": "1.3.6",
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-1.3.6.tgz",
"integrity": "sha512-PcQcmb7TsfPJ94tzFnvycm+tMYD3wKx2a6niwHfsV9+g6XHtmwReVV3EPZZ5XB4s565vU6Qc+ZnFbMIAeik8QA==", "integrity": "sha512-d2B+cTII+vabKCU8mJy90mEz3tCWw2pEp4qIBGsDamJiTS0Rx69dgXGHuRUm8KtjLDHHrzwXATsqviU3dnU0QQ==",
"requires": { "requires": {
"es6-promise": "^4.2.8", "es6-promise": "^4.2.8",
"form-data": "^3.0.0", "form-data": "^3.0.0",
@@ -1379,9 +1379,9 @@
} }
}, },
"@sasjs/test-framework": { "@sasjs/test-framework": {
"version": "1.3.3", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/@sasjs/test-framework/-/test-framework-1.3.3.tgz", "resolved": "https://registry.npmjs.org/@sasjs/test-framework/-/test-framework-1.4.0.tgz",
"integrity": "sha512-Ou4UXlxBAVR8jv7boVvJ/eKLHRTQvDi9LouPAasLCO2EC4AD0wX1hLMwVhmydCvsdgVEeXs6InvX3ROHiKSADg==", "integrity": "sha512-Pd8PUH5B5RO6q4w3OQXX7aWicvA/CJMXA/FCf2xp332ZTKBb/5uV+HphAOFKpCh58y+ykYYVSV0ZaDO/4t1h3A==",
"requires": { "requires": {
"@types/react-highlight.js": "^1.0.0", "@types/react-highlight.js": "^1.0.0",
"immer": "^7.0.7", "immer": "^7.0.7",
@@ -12234,9 +12234,9 @@
} }
}, },
"semantic-ui-react": { "semantic-ui-react": {
"version": "1.1.1", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-1.1.1.tgz", "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-1.2.0.tgz",
"integrity": "sha512-QtzLNkK4MUe1HQo4S7/tIkSp4NFtxSGDzTMKxmvztMJ6jt+nKGmMyjpyxJsrm3ohU8Z3sTyBUyiBsDYW4jNtjw==", "integrity": "sha512-9tNL94nEy16RdupTQNiURyemWUIxtTpQgFimCbOOHRBOe1ApsFz3FWFsrGjv9zFtE7dQMslLYov9BQOelTCVwA==",
"requires": { "requires": {
"@babel/runtime": "^7.10.5", "@babel/runtime": "^7.10.5",
"@semantic-ui-react/event-stack": "^3.1.0", "@semantic-ui-react/event-stack": "^3.1.0",
@@ -12260,9 +12260,9 @@
} }
}, },
"lodash": { "lodash": {
"version": "4.17.19", "version": "4.17.20",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
} }
} }
}, },

View File

@@ -4,8 +4,8 @@
"homepage": ".", "homepage": ".",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@sasjs/adapter": "^1.2.0", "@sasjs/adapter": "^1.3.6",
"@sasjs/test-framework": "^1.3.3", "@sasjs/test-framework": "^1.4.0",
"@testing-library/jest-dom": "^4.2.4", "@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.5.0", "@testing-library/react": "^9.5.0",
"@testing-library/user-event": "^7.2.1", "@testing-library/user-event": "^7.2.1",

View File

@@ -21,5 +21,26 @@ export const sasjsRequestTests = (adapter: SASjs): TestSuite => ({
} }
}, },
}, },
{
title: "Make error and capture log",
description: "Should make an error and capture log",
test: async () => {
return new Promise( async (resolve, reject) => {
adapter.request("common/makeErr", data)
.then((res) => {
//no action here, this request must throw error
})
.catch((err) => {
let sasRequests = adapter.getSasRequests();
let makeErrRequest = sasRequests.find(req => req.serviceLink.includes('makeErr')) || null;
resolve(!!makeErrRequest);
})
})
},
assertion: (response) => {
return response;
},
},
], ],
}); });

View File

@@ -206,137 +206,149 @@ export class SASViyaApiClient {
silent = false, silent = false,
data = null, data = null,
debug = false debug = false
) { ): Promise<any> {
silent = !debug; silent = !debug;
try {
const headers: any = { const headers: any = {
"Content-Type": "application/json", "Content-Type": "application/json",
}; };
if (accessToken) { if (accessToken) {
headers.Authorization = `Bearer ${accessToken}`; headers.Authorization = `Bearer ${accessToken}`;
} }
let executionSessionId: string; let executionSessionId: string;
const session = await this.sessionManager.getSession(accessToken); const session = await this.sessionManager.getSession(accessToken);
executionSessionId = session!.id; executionSessionId = session!.id;
const jobArguments: { [key: string]: any } = { const jobArguments: { [key: string]: any } = {
_contextName: contextName, _contextName: contextName,
_OMITJSONLISTING: true, _OMITJSONLISTING: true,
_OMITJSONLOG: true, _OMITJSONLOG: true,
_OMITSESSIONRESULTS: true, _OMITSESSIONRESULTS: true,
_OMITTEXTLISTING: true, _OMITTEXTLISTING: true,
_OMITTEXTLOG: true, _OMITTEXTLOG: true,
}; };
if (debug) { if (debug) {
jobArguments["_OMITTEXTLOG"] = false; jobArguments["_OMITTEXTLOG"] = false;
jobArguments["_OMITSESSIONRESULTS"] = false; jobArguments["_OMITSESSIONRESULTS"] = false;
jobArguments["_DEBUG"] = 131; jobArguments["_DEBUG"] = 131;
} }
const fileName = `exec-${ const fileName = `exec-${
jobName.includes("/") ? jobName.split("/")[1] : jobName jobName.includes("/") ? jobName.split("/")[1] : jobName
}`; }`;
let jobVariables: any = { let jobVariables: any = {
SYS_JES_JOB_URI: "", SYS_JES_JOB_URI: "",
_program: this.rootFolderName + "/" + jobName, _program: this.rootFolderName + "/" + jobName,
}; };
let files: any[] = []; let files: any[] = [];
if (data) { if (data) {
if (JSON.stringify(data).includes(";")) { if (JSON.stringify(data).includes(";")) {
files = await this.uploadTables(data, accessToken); files = await this.uploadTables(data, accessToken);
jobVariables["_webin_file_count"] = files.length; jobVariables["_webin_file_count"] = files.length;
files.forEach((fileInfo, index) => { files.forEach((fileInfo, index) => {
jobVariables[ jobVariables[
`_webin_fileuri${index + 1}` `_webin_fileuri${index + 1}`
] = `/files/files/${fileInfo.file.id}`; ] = `/files/files/${fileInfo.file.id}`;
jobVariables[`_webin_name${index + 1}`] = fileInfo.tableName; jobVariables[`_webin_name${index + 1}`] = fileInfo.tableName;
}); });
} else {
jobVariables = { ...jobVariables, ...formatDataForRequest(data) };
}
}
// Execute job in session
const postJobRequest = {
method: "POST",
headers,
body: JSON.stringify({
name: fileName,
description: "Powered by SASjs",
code: linesOfCode,
variables: jobVariables,
arguments: jobArguments,
}),
};
const { result: postedJob, etag } = await this.request<Job>(
`${this.serverUrl}/compute/sessions/${executionSessionId}/jobs`,
postJobRequest
);
if (!silent) {
console.log(`Job has been submitted for ${fileName}`);
console.log(
`You can monitor the job progress at ${this.serverUrl}${
postedJob.links.find((l: any) => l.rel === "state")!.href
}`
);
}
const jobStatus = await this.pollJobState(
postedJob,
etag,
accessToken,
silent
);
const { result: currentJob } = await this.request<Job>(
`${this.serverUrl}/compute/sessions/${executionSessionId}/jobs/${postedJob.id}`,
{ headers }
);
let jobResult, log;
const logLink = currentJob.links.find((l) => l.rel === "log");
if (true && logLink) {
log = await this.request<any>(
`${this.serverUrl}${logLink.href}/content?limit=10000`,
{
headers,
}
).then((res: any) =>
res.result.items.map((i: any) => i.line).join("\n")
);
}
if (jobStatus === "failed" || jobStatus === "error") {
return Promise.reject({ error: currentJob.error, log: log });
}
const resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`;
if (resultLink) {
jobResult = await this.request<any>(
`${this.serverUrl}${resultLink}`,
{ headers },
"text"
).catch((e) => ({
result: JSON.stringify(e),
}));
}
await this.sessionManager.clearSession(executionSessionId, accessToken);
return { result: jobResult?.result, log };
} catch (e) {
if (e && e.status === 404) {
return this.executeScript(
jobName,
linesOfCode,
contextName,
accessToken,
silent,
data,
debug
);
} else { } else {
jobVariables = { ...jobVariables, ...formatDataForRequest(data) }; throw e;
} }
} }
// Execute job in session
const postJobRequest = {
method: "POST",
headers,
body: JSON.stringify({
name: fileName,
description: "Powered by SASjs",
code: linesOfCode,
variables: jobVariables,
arguments: jobArguments,
}),
};
const { result: postedJob, etag } = await this.request<Job>(
`${this.serverUrl}/compute/sessions/${executionSessionId}/jobs`,
postJobRequest
);
if (!silent) {
console.log(`Job has been submitted for ${fileName}`);
console.log(
`You can monitor the job progress at ${this.serverUrl}${
postedJob.links.find((l: any) => l.rel === "state")!.href
}`
);
}
const jobStatus = await this.pollJobState(
postedJob,
etag,
accessToken,
silent
);
const { result: currentJob } = await this.request<Job>(
`${this.serverUrl}/compute/sessions/${executionSessionId}/jobs/${postedJob.id}`,
{ headers }
);
let jobResult, log;
if (jobStatus === "failed" || jobStatus === "error") {
return Promise.reject(currentJob.error);
}
const resultLink = `/compute/sessions/${executionSessionId}/filerefs/_webout/content`;
const logLink = currentJob.links.find((l) => l.rel === "log");
if (resultLink) {
jobResult = await this.request<any>(
`${this.serverUrl}${resultLink}`,
{ headers },
"text"
).catch((e) => ({
result: JSON.stringify(e),
}));
}
if (true && logLink) {
log = await this.request<any>(
`${this.serverUrl}${logLink.href}/content?limit=10000`,
{
headers,
}
).then((res: any) => res.result.items.map((i: any) => i.line).join("\n"));
}
await this.sessionManager.clearSession(executionSessionId, accessToken);
return { result: jobResult?.result, log };
// } else {
// console.error(
// `Unable to find execution context ${contextName}.\nPlease check the contextName in the tgtDeployVars and try again.`
// );
// console.error("Response from server: ", JSON.stringify(this.contexts));
// }
} }
/** /**
@@ -718,12 +730,12 @@ export class SASViyaApiClient {
`The job ${sasJob} was not found in ${this.rootFolderName}` `The job ${sasJob} was not found in ${this.rootFolderName}`
); );
} }
let files: any[] = []; let files: any[] = [];
if (data && Object.keys(data).length) { if (data && Object.keys(data).length) {
files = await this.uploadTables(data, accessToken); files = await this.uploadTables(data, accessToken);
} }
const jobName = path.basename(sasJob); const jobName = path.basename(sasJob);
const jobFolder = sasJob.replace(`/${jobName}`, ""); const jobFolder = sasJob.replace(`/${jobName}`, "");
const allJobsInFolder = this.rootFolderMap.get(jobFolder.replace("/", "")); const allJobsInFolder = this.rootFolderMap.get(jobFolder.replace("/", ""));

View File

@@ -291,7 +291,7 @@ export default class SASjs {
public async checkSession() { public async checkSession() {
const loginResponse = await fetch(this.loginUrl.replace(".do", "")); const loginResponse = await fetch(this.loginUrl.replace(".do", ""));
const responseText = await loginResponse.text(); const responseText = await loginResponse.text();
const isLoggedIn = /You have signed in./gm.test(responseText); const isLoggedIn = /<button.+onClick.+logout/gm.test(responseText);
return Promise.resolve({ return Promise.resolve({
isLoggedIn, isLoggedIn,
@@ -523,10 +523,17 @@ export default class SASjs {
serverUrl = sasClientConfig.serverUrl; serverUrl = sasClientConfig.serverUrl;
appLoc = sasClientConfig.rootFolderName as string; appLoc = sasClientConfig.rootFolderName as string;
} }
// members of type 'folder' should be processed first
if (serviceJson.members[0].members) {
serviceJson.members[0].members.sort((member: {type: string}) => member.type === 'folder' ? -1 : 1)
}
const members = const members =
serviceJson.members[0].name === "services" serviceJson.members[0].name === "services"
? serviceJson.members[0].members ? serviceJson.members[0].members
: serviceJson.members; : serviceJson.members
await this.createFoldersAndServices( await this.createFoldersAndServices(
appLoc, appLoc,
members, members,
@@ -579,8 +586,10 @@ export default class SASjs {
resolve(responseJson); resolve(responseJson);
}) })
.catch(async (e) => { .catch(async (response) => {
if (needsRetry(JSON.stringify(e))) { let error = response.error || response;
if (needsRetry(JSON.stringify(error))) {
if (this.retryCountComputeApi < requestRetryLimit) { if (this.retryCountComputeApi < requestRetryLimit) {
let retryResponse = await this.executeJobViaComputeApi( let retryResponse = await this.executeJobViaComputeApi(
sasJob, sasJob,
@@ -599,15 +608,17 @@ export default class SASjs {
} }
} }
if (e && e.status === 401) { if (error && error.status === 401) {
if (loginRequiredCallback) loginRequiredCallback(true); if (loginRequiredCallback) loginRequiredCallback(true);
sasjsWaitingRequest.requestPromise.resolve = resolve; sasjsWaitingRequest.requestPromise.resolve = resolve;
sasjsWaitingRequest.requestPromise.reject = reject; sasjsWaitingRequest.requestPromise.reject = reject;
sasjsWaitingRequest.config = config; sasjsWaitingRequest.config = config;
this.sasjsWaitingRequests.push(sasjsWaitingRequest); this.sasjsWaitingRequests.push(sasjsWaitingRequest);
} else { } else {
reject({ MESSAGE: e || "Job execution failed" }); reject({ MESSAGE: error || "Job execution failed" });
} }
this.appendSasjsRequest(response.log, sasJob, null);
}); });
} }
); );
@@ -726,7 +737,7 @@ export default class SASjs {
}`; }`;
const requestParams = { const requestParams = {
...this.getRequestParamsWeb(), ...this.getRequestParamsWeb(config),
}; };
const formData = new FormData(); const formData = new FormData();
@@ -937,14 +948,14 @@ export default class SASjs {
this.sasjsWaitingRequests = []; this.sasjsWaitingRequests = [];
} }
private getRequestParamsWeb(): any { private getRequestParamsWeb(config: any): any {
const requestParams: any = {}; const requestParams: any = {};
if (this.csrfTokenWeb) { if (this.csrfTokenWeb) {
requestParams["_csrf"] = this.csrfTokenWeb.value; requestParams["_csrf"] = this.csrfTokenWeb.value;
} }
if (this.sasjsConfig.debug) { if (config.debug) {
requestParams["_omittextlog"] = "false"; requestParams["_omittextlog"] = "false";
requestParams["_omitsessionresults"] = "false"; requestParams["_omitsessionresults"] = "false";
@@ -1067,7 +1078,11 @@ export default class SASjs {
generatedCode = parseGeneratedCode(response.log); generatedCode = parseGeneratedCode(response.log);
if (this.sasjsConfig.debug) { if (this.sasjsConfig.debug) {
sasWork = JSON.parse(parseWeboutResponse(response.result)).WORK; if (response.log) {
sasWork = response.log;
} else {
sasWork = JSON.parse(parseWeboutResponse(response.result)).WORK;
}
} else { } else {
sasWork = JSON.parse(response.result).WORK; sasWork = JSON.parse(response.result).WORK;
} }

View File

@@ -17,6 +17,16 @@ export class SessionManager {
await this.createSessions(accessToken); await this.createSessions(accessToken);
this.createAndWaitForSession(accessToken); this.createAndWaitForSession(accessToken);
const session = this.sessions.pop(); const session = this.sessions.pop();
const secondsSinceSessionCreation =
(new Date().getTime() - new Date(session!.creationTimeStamp).getTime()) /
1000;
if (
secondsSinceSessionCreation >= session!.attributes.sessionInactiveTimeout
) {
await this.createSessions(accessToken);
const freshSession = this.sessions.pop();
return freshSession;
}
return session; return session;
} }

View File

@@ -4,4 +4,8 @@ export interface Session {
id: string; id: string;
state: string; state: string;
links: Link[]; links: Link[];
attributes: {
sessionInactiveTimeout: number;
};
creationTimeStamp: string;
} }