diff --git a/.gitignore b/.gitignore index 943b952..41db3ac 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ build /coverage -.DS_Store \ No newline at end of file +.DS_Store diff --git a/package-lock.json b/package-lock.json index b4017ef..fd434d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1013,15 +1013,16 @@ } }, "@sasjs/utils": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.30.0.tgz", - "integrity": "sha512-LgE73ytysdgVzleZI1Y/irpsTm/dBlYe6BK5pbc9Pk92CdTEin4wLpfb791FZV9vEZ457G/jBRZ0Fv/rGYHMYg==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.32.0.tgz", + "integrity": "sha512-xnvdEuI4PhTtulcdDEIMK7IxVj9bOMU1JTnxRuSEKWcsclY9P9Fw3cnMOOEgXCDffrOPn3f54DP7Wb1GXd+f8g==", "requires": { "@types/fs-extra": "^9.0.11", "@types/prompts": "^2.0.13", "chalk": "^4.1.1", "cli-table": "^0.3.6", "consola": "^2.15.0", + "csv-stringify": "^5.6.5", "fs-extra": "^10.0.0", "jwt-decode": "^3.1.2", "prompts": "^2.4.1", @@ -1234,9 +1235,9 @@ } }, "@types/fs-extra": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", - "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "requires": { "@types/node": "*" } @@ -2726,6 +2727,11 @@ } } }, + "csv-stringify": { + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", + "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==" + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -6916,12 +6922,12 @@ "dependencies": { "@gar/promisify": { "version": "1.1.2", - "bundled": true, + "resolved": false, "dev": true }, "@npmcli/arborist": { "version": "2.8.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/installed-package-contents": "^1.0.7", @@ -6959,12 +6965,12 @@ }, "@npmcli/ci-detect": { "version": "1.3.0", - "bundled": true, + "resolved": false, "dev": true }, "@npmcli/config": { "version": "2.2.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ini": "^2.0.0", @@ -6976,7 +6982,7 @@ }, "@npmcli/disparity-colors": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ansi-styles": "^4.3.0" @@ -6984,7 +6990,7 @@ }, "@npmcli/fs": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@gar/promisify": "^1.0.1", @@ -6993,7 +6999,7 @@ }, "@npmcli/git": { "version": "2.1.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/promise-spawn": "^1.3.2", @@ -7008,7 +7014,7 @@ }, "@npmcli/installed-package-contents": { "version": "1.0.7", - "bundled": true, + "resolved": false, "dev": true, "requires": { "npm-bundled": "^1.1.1", @@ -7017,7 +7023,7 @@ }, "@npmcli/map-workspaces": { "version": "1.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/name-from-folder": "^1.0.1", @@ -7028,7 +7034,7 @@ }, "@npmcli/metavuln-calculator": { "version": "1.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "cacache": "^15.0.5", @@ -7038,7 +7044,7 @@ }, "@npmcli/move-file": { "version": "1.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "mkdirp": "^1.0.4", @@ -7047,17 +7053,17 @@ }, "@npmcli/name-from-folder": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "@npmcli/node-gyp": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true }, "@npmcli/package-json": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.1" @@ -7065,7 +7071,7 @@ }, "@npmcli/promise-spawn": { "version": "1.3.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "infer-owner": "^1.0.4" @@ -7073,7 +7079,7 @@ }, "@npmcli/run-script": { "version": "1.8.6", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/node-gyp": "^1.0.2", @@ -7084,17 +7090,17 @@ }, "@tootallnate/once": { "version": "1.1.2", - "bundled": true, + "resolved": false, "dev": true }, "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": false, "dev": true }, "agent-base": { "version": "6.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "debug": "4" @@ -7102,7 +7108,7 @@ }, "agentkeepalive": { "version": "4.1.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "debug": "^4.1.0", @@ -7112,7 +7118,7 @@ }, "aggregate-error": { "version": "3.1.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "clean-stack": "^2.0.0", @@ -7121,7 +7127,7 @@ }, "ajv": { "version": "6.12.6", - "bundled": true, + "resolved": false, "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -7132,12 +7138,12 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, "dev": true }, "ansi-styles": { "version": "4.3.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "color-convert": "^2.0.1" @@ -7145,27 +7151,27 @@ }, "ansicolors": { "version": "0.3.2", - "bundled": true, + "resolved": false, "dev": true }, "ansistyles": { "version": "0.1.3", - "bundled": true, + "resolved": false, "dev": true }, "aproba": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "delegates": "^1.0.0", @@ -7174,12 +7180,12 @@ }, "asap": { "version": "2.0.6", - "bundled": true, + "resolved": false, "dev": true }, "asn1": { "version": "0.2.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -7187,32 +7193,32 @@ }, "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": false, "dev": true }, "aws-sign2": { "version": "0.7.0", - "bundled": true, + "resolved": false, "dev": true }, "aws4": { "version": "1.11.0", - "bundled": true, + "resolved": false, "dev": true }, "balanced-match": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "tweetnacl": "^0.14.3" @@ -7220,7 +7226,7 @@ }, "bin-links": { "version": "2.2.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "cmd-shim": "^4.0.1", @@ -7233,12 +7239,12 @@ }, "binary-extensions": { "version": "2.2.0", - "bundled": true, + "resolved": false, "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -7247,12 +7253,12 @@ }, "builtins": { "version": "1.0.3", - "bundled": true, + "resolved": false, "dev": true }, "cacache": { "version": "15.3.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/fs": "^1.0.0", @@ -7277,12 +7283,12 @@ }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": false, "dev": true }, "chalk": { "version": "4.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7291,12 +7297,12 @@ }, "chownr": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "cidr-regex": { "version": "3.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ip-regex": "^4.1.0" @@ -7304,12 +7310,12 @@ }, "clean-stack": { "version": "2.2.0", - "bundled": true, + "resolved": false, "dev": true }, "cli-columns": { "version": "3.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "string-width": "^2.0.0", @@ -7318,7 +7324,7 @@ }, "cli-table3": { "version": "0.6.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "colors": "^1.1.2", @@ -7328,17 +7334,17 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "bundled": true, + "resolved": false, "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", - "bundled": true, + "resolved": false, "dev": true }, "string-width": { "version": "4.2.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -7348,7 +7354,7 @@ }, "strip-ansi": { "version": "6.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ansi-regex": "^5.0.0" @@ -7358,12 +7364,12 @@ }, "clone": { "version": "1.0.4", - "bundled": true, + "resolved": false, "dev": true }, "cmd-shim": { "version": "4.1.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "mkdirp-infer-owner": "^2.0.0" @@ -7371,12 +7377,12 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, "dev": true }, "color-convert": { "version": "2.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "color-name": "~1.1.4" @@ -7384,23 +7390,23 @@ }, "color-name": { "version": "1.1.4", - "bundled": true, + "resolved": false, "dev": true }, "color-support": { "version": "1.1.3", - "bundled": true, + "resolved": false, "dev": true }, "colors": { "version": "1.4.0", - "bundled": true, + "resolved": false, "dev": true, "optional": true }, "columnify": { "version": "1.5.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "strip-ansi": "^3.0.0", @@ -7409,7 +7415,7 @@ }, "combined-stream": { "version": "1.0.8", - "bundled": true, + "resolved": false, "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -7417,27 +7423,27 @@ }, "common-ancestor-path": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": false, "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -7445,7 +7451,7 @@ }, "debug": { "version": "4.3.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ms": "2.1.2" @@ -7453,19 +7459,19 @@ "dependencies": { "ms": { "version": "2.1.2", - "bundled": true, + "resolved": false, "dev": true } } }, "debuglog": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "defaults": { "version": "1.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "clone": "^1.0.2" @@ -7473,22 +7479,22 @@ }, "delayed-stream": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "depd": { "version": "1.1.2", - "bundled": true, + "resolved": false, "dev": true }, "dezalgo": { "version": "1.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "asap": "^2.0.0", @@ -7497,12 +7503,12 @@ }, "diff": { "version": "5.0.0", - "bundled": true, + "resolved": false, "dev": true }, "ecc-jsbn": { "version": "0.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "jsbn": "~0.1.0", @@ -7511,12 +7517,12 @@ }, "emoji-regex": { "version": "8.0.0", - "bundled": true, + "resolved": false, "dev": true }, "encoding": { "version": "0.1.13", - "bundled": true, + "resolved": false, "dev": true, "optional": true, "requires": { @@ -7525,47 +7531,47 @@ }, "env-paths": { "version": "2.2.1", - "bundled": true, + "resolved": false, "dev": true }, "err-code": { "version": "2.0.3", - "bundled": true, + "resolved": false, "dev": true }, "extend": { "version": "3.0.2", - "bundled": true, + "resolved": false, "dev": true }, "extsprintf": { "version": "1.3.0", - "bundled": true, + "resolved": false, "dev": true }, "fast-deep-equal": { "version": "3.1.3", - "bundled": true, + "resolved": false, "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", - "bundled": true, + "resolved": false, "dev": true }, "fastest-levenshtein": { "version": "1.0.12", - "bundled": true, + "resolved": false, "dev": true }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": false, "dev": true }, "fs-minipass": { "version": "2.1.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minipass": "^3.0.0" @@ -7573,17 +7579,17 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "function-bind": { "version": "1.1.1", - "bundled": true, + "resolved": false, "dev": true }, "gauge": { "version": "3.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", @@ -7599,7 +7605,7 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": false, "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -7607,7 +7613,7 @@ }, "glob": { "version": "7.1.7", - "bundled": true, + "resolved": false, "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -7620,17 +7626,17 @@ }, "graceful-fs": { "version": "4.2.8", - "bundled": true, + "resolved": false, "dev": true }, "har-schema": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "har-validator": { "version": "5.1.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ajv": "^6.12.3", @@ -7639,7 +7645,7 @@ }, "has": { "version": "1.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "function-bind": "^1.1.1" @@ -7647,17 +7653,17 @@ }, "has-flag": { "version": "4.0.0", - "bundled": true, + "resolved": false, "dev": true }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": false, "dev": true }, "hosted-git-info": { "version": "4.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -7665,12 +7671,12 @@ }, "http-cache-semantics": { "version": "4.1.0", - "bundled": true, + "resolved": false, "dev": true }, "http-proxy-agent": { "version": "4.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@tootallnate/once": "1", @@ -7680,7 +7686,7 @@ }, "http-signature": { "version": "1.2.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -7690,7 +7696,7 @@ }, "https-proxy-agent": { "version": "5.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "agent-base": "6", @@ -7699,7 +7705,7 @@ }, "humanize-ms": { "version": "1.2.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ms": "^2.0.0" @@ -7707,7 +7713,7 @@ }, "iconv-lite": { "version": "0.6.3", - "bundled": true, + "resolved": false, "dev": true, "optional": true, "requires": { @@ -7716,7 +7722,7 @@ }, "ignore-walk": { "version": "3.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minimatch": "^3.0.4" @@ -7724,22 +7730,22 @@ }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": false, "dev": true }, "indent-string": { "version": "4.0.0", - "bundled": true, + "resolved": false, "dev": true }, "infer-owner": { "version": "1.0.4", - "bundled": true, + "resolved": false, "dev": true }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, "dev": true, "requires": { "once": "^1.3.0", @@ -7748,17 +7754,17 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, + "resolved": false, "dev": true }, "ini": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "init-package-json": { "version": "2.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "glob": "^7.1.1", @@ -7773,17 +7779,17 @@ }, "ip": { "version": "1.1.5", - "bundled": true, + "resolved": false, "dev": true }, "ip-regex": { "version": "4.3.0", - "bundled": true, + "resolved": false, "dev": true }, "is-cidr": { "version": "4.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "cidr-regex": "^3.1.1" @@ -7791,7 +7797,7 @@ }, "is-core-module": { "version": "2.6.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "has": "^1.0.3" @@ -7799,72 +7805,72 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "is-lambda": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": false, "dev": true }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": false, "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", - "bundled": true, + "resolved": false, "dev": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": false, "dev": true }, "json-schema-traverse": { "version": "0.4.1", - "bundled": true, + "resolved": false, "dev": true }, "json-stringify-nice": { "version": "1.1.4", - "bundled": true, + "resolved": false, "dev": true }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": false, "dev": true }, "jsonparse": { "version": "1.3.1", - "bundled": true, + "resolved": false, "dev": true }, "jsprim": { "version": "1.4.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "assert-plus": "1.0.0", @@ -7875,17 +7881,17 @@ }, "just-diff": { "version": "3.1.1", - "bundled": true, + "resolved": false, "dev": true }, "just-diff-apply": { "version": "3.0.0", - "bundled": true, + "resolved": false, "dev": true }, "libnpmaccess": { "version": "4.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aproba": "^2.0.0", @@ -7896,7 +7902,7 @@ }, "libnpmdiff": { "version": "2.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/disparity-colors": "^1.0.1", @@ -7911,7 +7917,7 @@ }, "libnpmexec": { "version": "2.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/arborist": "^2.3.0", @@ -7929,7 +7935,7 @@ }, "libnpmfund": { "version": "1.1.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/arborist": "^2.5.0" @@ -7937,7 +7943,7 @@ }, "libnpmhook": { "version": "6.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aproba": "^2.0.0", @@ -7946,7 +7952,7 @@ }, "libnpmorg": { "version": "2.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aproba": "^2.0.0", @@ -7955,7 +7961,7 @@ }, "libnpmpack": { "version": "2.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/run-script": "^1.8.3", @@ -7965,7 +7971,7 @@ }, "libnpmpublish": { "version": "4.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "normalize-package-data": "^3.0.2", @@ -7977,7 +7983,7 @@ }, "libnpmsearch": { "version": "3.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "npm-registry-fetch": "^11.0.0" @@ -7985,7 +7991,7 @@ }, "libnpmteam": { "version": "2.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aproba": "^2.0.0", @@ -7994,7 +8000,7 @@ }, "libnpmversion": { "version": "1.2.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/git": "^2.0.7", @@ -8006,7 +8012,7 @@ }, "lru-cache": { "version": "6.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "yallist": "^4.0.0" @@ -8014,7 +8020,7 @@ }, "make-fetch-happen": { "version": "9.1.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "agentkeepalive": "^4.1.3", @@ -8037,12 +8043,12 @@ }, "mime-db": { "version": "1.49.0", - "bundled": true, + "resolved": false, "dev": true }, "mime-types": { "version": "2.1.32", - "bundled": true, + "resolved": false, "dev": true, "requires": { "mime-db": "1.49.0" @@ -8050,7 +8056,7 @@ }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -8058,7 +8064,7 @@ }, "minipass": { "version": "3.1.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "yallist": "^4.0.0" @@ -8066,7 +8072,7 @@ }, "minipass-collect": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minipass": "^3.0.0" @@ -8074,7 +8080,7 @@ }, "minipass-fetch": { "version": "1.3.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "encoding": "^0.1.12", @@ -8085,7 +8091,7 @@ }, "minipass-flush": { "version": "1.0.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minipass": "^3.0.0" @@ -8093,7 +8099,7 @@ }, "minipass-json-stream": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "jsonparse": "^1.3.1", @@ -8102,7 +8108,7 @@ }, "minipass-pipeline": { "version": "1.2.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minipass": "^3.0.0" @@ -8110,7 +8116,7 @@ }, "minipass-sized": { "version": "1.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minipass": "^3.0.0" @@ -8118,7 +8124,7 @@ }, "minizlib": { "version": "2.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minipass": "^3.0.0", @@ -8127,12 +8133,12 @@ }, "mkdirp": { "version": "1.0.4", - "bundled": true, + "resolved": false, "dev": true }, "mkdirp-infer-owner": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "chownr": "^2.0.0", @@ -8142,22 +8148,22 @@ }, "ms": { "version": "2.1.3", - "bundled": true, + "resolved": false, "dev": true }, "mute-stream": { "version": "0.0.8", - "bundled": true, + "resolved": false, "dev": true }, "negotiator": { "version": "0.6.2", - "bundled": true, + "resolved": false, "dev": true }, "node-gyp": { "version": "7.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "env-paths": "^2.2.0", @@ -8174,12 +8180,12 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, "dev": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aproba": "^1.0.3", @@ -8194,7 +8200,7 @@ }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -8202,7 +8208,7 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -8213,7 +8219,7 @@ }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -8225,7 +8231,7 @@ }, "nopt": { "version": "5.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "abbrev": "1" @@ -8233,7 +8239,7 @@ }, "normalize-package-data": { "version": "3.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "hosted-git-info": "^4.0.1", @@ -8244,7 +8250,7 @@ }, "npm-audit-report": { "version": "2.1.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "chalk": "^4.0.0" @@ -8252,7 +8258,7 @@ }, "npm-bundled": { "version": "1.1.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" @@ -8260,7 +8266,7 @@ }, "npm-install-checks": { "version": "4.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "semver": "^7.1.1" @@ -8268,12 +8274,12 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "npm-package-arg": { "version": "8.1.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "hosted-git-info": "^4.0.1", @@ -8283,7 +8289,7 @@ }, "npm-packlist": { "version": "2.2.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "glob": "^7.1.6", @@ -8294,7 +8300,7 @@ }, "npm-pick-manifest": { "version": "6.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "npm-install-checks": "^4.0.0", @@ -8305,7 +8311,7 @@ }, "npm-profile": { "version": "5.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "npm-registry-fetch": "^11.0.0" @@ -8313,7 +8319,7 @@ }, "npm-registry-fetch": { "version": "11.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "make-fetch-happen": "^9.0.1", @@ -8326,12 +8332,12 @@ }, "npm-user-validate": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "npmlog": { "version": "5.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "are-we-there-yet": "^1.1.5", @@ -8342,22 +8348,22 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "oauth-sign": { "version": "0.9.0", - "bundled": true, + "resolved": false, "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": false, "dev": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "wrappy": "1" @@ -8365,12 +8371,12 @@ }, "opener": { "version": "1.5.2", - "bundled": true, + "resolved": false, "dev": true }, "p-map": { "version": "4.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -8378,7 +8384,7 @@ }, "pacote": { "version": "11.3.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "@npmcli/git": "^2.1.0", @@ -8404,7 +8410,7 @@ }, "parse-conflict-json": { "version": "1.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.0", @@ -8414,42 +8420,42 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "performance-now": { "version": "2.1.0", - "bundled": true, + "resolved": false, "dev": true }, "proc-log": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "process-nextick-args": { "version": "2.0.1", - "bundled": true, + "resolved": false, "dev": true }, "promise-all-reject-late": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "promise-call-limit": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "promise-inflight": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "promise-retry": { "version": "2.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "err-code": "^2.0.2", @@ -8458,7 +8464,7 @@ }, "promzard": { "version": "0.3.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "read": "1" @@ -8466,27 +8472,27 @@ }, "psl": { "version": "1.8.0", - "bundled": true, + "resolved": false, "dev": true }, "punycode": { "version": "2.1.1", - "bundled": true, + "resolved": false, "dev": true }, "qrcode-terminal": { "version": "0.12.0", - "bundled": true, + "resolved": false, "dev": true }, "qs": { "version": "6.5.2", - "bundled": true, + "resolved": false, "dev": true }, "read": { "version": "1.0.7", - "bundled": true, + "resolved": false, "dev": true, "requires": { "mute-stream": "~0.0.4" @@ -8494,12 +8500,12 @@ }, "read-cmd-shim": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "read-package-json": { "version": "4.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "glob": "^7.1.1", @@ -8510,7 +8516,7 @@ }, "read-package-json-fast": { "version": "2.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.0", @@ -8519,7 +8525,7 @@ }, "readable-stream": { "version": "2.3.7", - "bundled": true, + "resolved": false, "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -8533,7 +8539,7 @@ }, "readdir-scoped-modules": { "version": "1.1.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "debuglog": "^1.0.1", @@ -8544,7 +8550,7 @@ }, "request": { "version": "2.88.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -8571,7 +8577,7 @@ "dependencies": { "form-data": { "version": "2.3.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "asynckit": "^0.4.0", @@ -8581,7 +8587,7 @@ }, "tough-cookie": { "version": "2.5.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "psl": "^1.1.28", @@ -8592,12 +8598,12 @@ }, "retry": { "version": "0.12.0", - "bundled": true, + "resolved": false, "dev": true }, "rimraf": { "version": "3.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "glob": "^7.1.3" @@ -8605,17 +8611,17 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": false, "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": false, "dev": true }, "semver": { "version": "7.3.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -8623,22 +8629,22 @@ }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, "dev": true }, "signal-exit": { "version": "3.0.3", - "bundled": true, + "resolved": false, "dev": true }, "smart-buffer": { "version": "4.2.0", - "bundled": true, + "resolved": false, "dev": true }, "socks": { "version": "2.6.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ip": "^1.1.5", @@ -8647,7 +8653,7 @@ }, "socks-proxy-agent": { "version": "6.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "agent-base": "^6.0.2", @@ -8657,7 +8663,7 @@ }, "spdx-correct": { "version": "3.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -8666,12 +8672,12 @@ }, "spdx-exceptions": { "version": "2.3.0", - "bundled": true, + "resolved": false, "dev": true }, "spdx-expression-parse": { "version": "3.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -8680,12 +8686,12 @@ }, "spdx-license-ids": { "version": "3.0.10", - "bundled": true, + "resolved": false, "dev": true }, "sshpk": { "version": "1.16.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "asn1": "~0.2.3", @@ -8701,7 +8707,7 @@ }, "ssri": { "version": "8.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "minipass": "^3.1.1" @@ -8709,7 +8715,7 @@ }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -8718,12 +8724,12 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": false, "dev": true }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -8733,7 +8739,7 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -8741,12 +8747,12 @@ }, "stringify-package": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -8754,7 +8760,7 @@ }, "supports-color": { "version": "7.2.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "has-flag": "^4.0.0" @@ -8762,7 +8768,7 @@ }, "tar": { "version": "6.1.11", - "bundled": true, + "resolved": false, "dev": true, "requires": { "chownr": "^2.0.0", @@ -8775,22 +8781,22 @@ }, "text-table": { "version": "0.2.0", - "bundled": true, + "resolved": false, "dev": true }, "tiny-relative-date": { "version": "1.3.0", - "bundled": true, + "resolved": false, "dev": true }, "treeverse": { "version": "1.0.4", - "bundled": true, + "resolved": false, "dev": true }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -8798,12 +8804,12 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": false, "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", - "bundled": true, + "resolved": false, "dev": true, "requires": { "is-typedarray": "^1.0.0" @@ -8811,7 +8817,7 @@ }, "unique-filename": { "version": "1.1.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "unique-slug": "^2.0.0" @@ -8819,7 +8825,7 @@ }, "unique-slug": { "version": "2.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -8827,7 +8833,7 @@ }, "uri-js": { "version": "4.4.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "punycode": "^2.1.0" @@ -8835,17 +8841,17 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true }, "uuid": { "version": "3.4.0", - "bundled": true, + "resolved": false, "dev": true }, "validate-npm-package-license": { "version": "3.0.4", - "bundled": true, + "resolved": false, "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -8854,7 +8860,7 @@ }, "validate-npm-package-name": { "version": "3.0.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "builtins": "^1.0.3" @@ -8862,7 +8868,7 @@ }, "verror": { "version": "1.10.0", - "bundled": true, + "resolved": false, "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -8872,12 +8878,12 @@ }, "walk-up-path": { "version": "1.0.0", - "bundled": true, + "resolved": false, "dev": true }, "wcwidth": { "version": "1.0.1", - "bundled": true, + "resolved": false, "dev": true, "requires": { "defaults": "^1.0.3" @@ -8885,7 +8891,7 @@ }, "which": { "version": "2.0.2", - "bundled": true, + "resolved": false, "dev": true, "requires": { "isexe": "^2.0.0" @@ -8893,7 +8899,7 @@ }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "string-width": "^1.0.2 || 2" @@ -8901,12 +8907,12 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, "dev": true }, "write-file-atomic": { "version": "3.0.3", - "bundled": true, + "resolved": false, "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -8917,7 +8923,7 @@ }, "yallist": { "version": "4.0.0", - "bundled": true, + "resolved": false, "dev": true } } diff --git a/package.json b/package.json index fcf32f6..c26bdad 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ }, "main": "index.js", "dependencies": { - "@sasjs/utils": "^2.30.0", + "@sasjs/utils": "^2.32.0", "axios": "^0.21.4", "axios-cookiejar-support": "^1.0.1", "form-data": "^4.0.0", diff --git a/src/SASjs.ts b/src/SASjs.ts index 74831a5..2a3a12f 100644 --- a/src/SASjs.ts +++ b/src/SASjs.ts @@ -4,10 +4,14 @@ import { UploadFile, EditContextInput, PollOptions, - LoginMechanism + LoginMechanism, + FolderMember, + ServiceMember, + ExecutionQuery } from './types' import { SASViyaApiClient } from './SASViyaApiClient' import { SAS9ApiClient } from './SAS9ApiClient' +import { SASjsApiClient } from './SASjsApiClient' import { AuthManager } from './auth' import { ServerType, @@ -49,6 +53,7 @@ export default class SASjs { private jobsPath: string = '' private sasViyaApiClient: SASViyaApiClient | null = null private sas9ApiClient: SAS9ApiClient | null = null + private SASjsApiClient: SASjsApiClient | null = null private fileUploader: FileUploader | null = null private authManager: AuthManager | null = null private requestClient: RequestClient | null = null @@ -824,6 +829,14 @@ export default class SASjs { ) } + public async deployToSASjs(members: [FolderMember, ServiceMember]) { + return await this.SASjsApiClient?.deploy(members, this.sasjsConfig.appLoc) + } + + public async executeJobSASjs(query: ExecutionQuery) { + return await this.SASjsApiClient?.executeJob(query) + } + /** * Kicks off execution of the given job via the compute API. * @returns an object representing the compute session created for the given job. @@ -973,30 +986,44 @@ export default class SASjs { ) if (this.sasjsConfig.serverType === ServerType.SasViya) { - if (this.sasViyaApiClient) + if (this.sasViyaApiClient) { this.sasViyaApiClient!.setConfig( this.sasjsConfig.serverUrl, this.sasjsConfig.appLoc ) - else + } else { this.sasViyaApiClient = new SASViyaApiClient( this.sasjsConfig.serverUrl, this.sasjsConfig.appLoc, this.sasjsConfig.contextName, this.requestClient ) + } this.sasViyaApiClient.debug = this.sasjsConfig.debug } + if (this.sasjsConfig.serverType === ServerType.Sas9) { - if (this.sas9ApiClient) + if (this.sas9ApiClient) { this.sas9ApiClient!.setConfig(this.sasjsConfig.serverUrl) - else + } else { this.sas9ApiClient = new SAS9ApiClient( this.sasjsConfig.serverUrl, this.jobsPath, this.sasjsConfig.allowInsecureRequests ) + } + } + + if (this.sasjsConfig.serverType === ServerType.Sasjs) { + if (this.SASjsApiClient) { + this.SASjsApiClient.setConfig(this.sasjsConfig.serverUrl) + } else { + this.SASjsApiClient = new SASjsApiClient( + this.sasjsConfig.serverUrl, + this.requestClient + ) + } } this.fileUploader = new FileUploader( diff --git a/src/SASjsApiClient.ts b/src/SASjsApiClient.ts new file mode 100644 index 0000000..7ae4208 --- /dev/null +++ b/src/SASjsApiClient.ts @@ -0,0 +1,39 @@ +import { FolderMember, ServiceMember, ExecutionQuery } from './types' +import { RequestClient } from './request/RequestClient' + +export class SASjsApiClient { + constructor( + private serverUrl: string, + private requestClient: RequestClient + ) {} + + public setConfig(serverUrl: string) { + if (serverUrl) this.serverUrl = serverUrl + } + + public async deploy(members: [FolderMember, ServiceMember], appLoc: string) { + const { result } = await this.requestClient.post<{ + status: string + message: string + example?: {} + }>( + 'SASjsApi/drive/deploy', + { fileTree: members, appLoc: appLoc }, + undefined + ) + + return Promise.resolve(result) + } + + public async executeJob(query: ExecutionQuery) { + const { result } = await this.requestClient.post<{ + status: string + message: string + log?: string + logPath?: string + error?: {} + }>('SASjsApi/stp/execute', query, undefined) + + return Promise.resolve(result) + } +} diff --git a/src/auth/AuthManager.ts b/src/auth/AuthManager.ts index 288d4ae..f050949 100644 --- a/src/auth/AuthManager.ts +++ b/src/auth/AuthManager.ts @@ -256,6 +256,8 @@ export class AuthManager { .split(' ') .map((name: string) => name.slice(0, 3).toLowerCase()) .join('') + default: + return '' } } diff --git a/src/request/RequestClient.ts b/src/request/RequestClient.ts index c84face..d987019 100644 --- a/src/request/RequestClient.ts +++ b/src/request/RequestClient.ts @@ -527,7 +527,7 @@ export class RequestClient implements HttpClient { } this.httpClient.defaults.validateStatus = (status) => - status >= 200 && status < 305 + status >= 200 && status < 401 } } diff --git a/src/types/ExecuteScript.ts b/src/types/ExecuteScript.ts new file mode 100644 index 0000000..7edb6aa --- /dev/null +++ b/src/types/ExecuteScript.ts @@ -0,0 +1,5 @@ +export interface ExecutionQuery { + _program: string + _debug?: number + _log?: boolean +} diff --git a/src/types/FileTree.ts b/src/types/FileTree.ts new file mode 100644 index 0000000..548bc5a --- /dev/null +++ b/src/types/FileTree.ts @@ -0,0 +1,47 @@ +export interface FileTree { + members: [FolderMember, ServiceMember] +} + +export enum MemberType { + folder = 'folder', + service = 'service' +} + +export interface FolderMember { + name: string + type: MemberType.folder + members: [FolderMember, ServiceMember] +} + +export interface ServiceMember { + name: string + type: MemberType.service + code: string +} + +export const isFileTree = (arg: any): arg is FileTree => + arg && + arg.members && + Array.isArray(arg.members) && + arg.members.filter( + (member: FolderMember | ServiceMember) => + !isFolderMember(member) && !isServiceMember(member) + ).length === 0 + +const isFolderMember = (arg: any): arg is FolderMember => + arg && + typeof arg.name === 'string' && + arg.type === MemberType.folder && + arg.members && + Array.isArray(arg.members) && + arg.members.filter( + (member: FolderMember | ServiceMember) => + !isFolderMember(member) && !isServiceMember(member) + ).length === 0 + +const isServiceMember = (arg: any): arg is ServiceMember => + arg && + typeof arg.name === 'string' && + arg.type === MemberType.service && + arg.code && + typeof arg.code === 'string' diff --git a/src/types/index.ts b/src/types/index.ts index 2303619..97f5406 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -12,3 +12,5 @@ export * from './Session' export * from './UploadFile' export * from './PollOptions' export * from './WriteStream' +export * from './FileTree' +export * from './ExecuteScript'