diff --git a/all.sas b/all.sas
index 3db78cb..a74fcf3 100644
--- a/all.sas
+++ b/all.sas
@@ -703,39 +703,60 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex
/**
@file
@brief Assigns and returns an unused fileref
- @details
+ @details Using the native approach for assigning filerefs fails as some
+ procedures (such as proc http) do not recognise the temporary names (starting
+ with a hash), returning a message such as:
+
+ > ERROR 22-322: Expecting a name.
+
+ This macro works by attempting a random fileref (with a prefix), seeing if it
+ is already assigned, and if not - returning the fileref.
+
+ If your process can accept filerefs with the hash (#) prefix, then set
+ `prefix=0` to revert to the native approach - which is significantly faster
+ when there are a lot of filerefs in a session.
+
Use as follows:
%let fileref1=%mf_getuniquefileref();
- %let fileref2=%mf_getuniquefileref();
+ %let fileref2=%mf_getuniquefileref(prefix=0);
%put &fileref1 &fileref2;
- which returns:
+ which returns filerefs similar to:
-> mcref0 mcref1
+> _7432233 #LN00070
- @param prefix= first part of fileref. Remember that filerefs can only be 8
- characters, so a 7 letter prefix would mean that `maxtries` should be 10.
- @param maxtries= the last part of the libref. Provide an integer value.
+ @param [in] prefix= (_) first part of fileref. Remember that filerefs can only
+ be 8 characters, so a 7 letter prefix would mean `maxtries` should be 10.
+ if using zero (0) as the prefix, a native assignment is used.
+ @param [in] maxtries= (1000) the last part of the libref. Must be an integer.
@version 9.2
@author Allan Bowe
**/
-%macro mf_getuniquefileref(prefix=mcref,maxtries=1000);
- %local x fname;
- %let x=0;
- %do x=0 %to &maxtries;
- %if %sysfunc(fileref(&prefix&x)) > 0 %then %do;
- %let fname=&prefix&x;
+%macro mf_getuniquefileref(prefix=_,maxtries=1000);
+ %local rc fname;
+ %if &prefix=0 %then %do;
%let rc=%sysfunc(filename(fname,,temp));
%if &rc %then %put %sysfunc(sysmsg());
- &prefix&x
- %*put &sysmacroname: Fileref &prefix&x was assigned and returned;
- %return;
+ &fname
%end;
+ %else %do;
+ %local x len;
+ %let len=%eval(8-%length(&prefix));
+ %let x=0;
+ %do x=0 %to &maxtries;
+ %let fname=&prefix%substr(%sysfunc(ranuni(0)),3,&len);
+ %if %sysfunc(fileref(&fname)) > 0 %then %do;
+ %let rc=%sysfunc(filename(fname,,temp));
+ %if &rc %then %put %sysfunc(sysmsg());
+ &fname
+ %return;
+ %end;
+ %end;
+ %put unable to find available fileref after &maxtries attempts;
%end;
- %put unable to find available fileref in range &prefix.0-&maxtries;
%mend mf_getuniquefileref;/**
@file
@brief Returns an unused libref
@@ -7523,6 +7544,63 @@ alter table &libds modify &var char(&len);
%mend mp_validatecol;
/**
+ @file
+ @brief Fix the `_WEBIN` variables provided to SAS web services
+ @details When uploading files to SAS Stored Processes or Viya Jobs a number
+ of global macro variables are automatically created - however there are some
+ differences in behaviour both between SAS 9 and Viya, and also between a
+ single file upload and a multi-file upload.
+
+ This macro "straightens" up the global macro variables to make it easier /
+ simpler to write code that works in both environments and with a variable
+ number of file inputs.
+
+ After running this macro, the following global variables will *always* exist:
+ @li `_WEBIN_FILE_COUNT`
+ @li `_WEBIN_FILENAME1`
+ @li `_WEBIN_FILEREF1`
+ @li `_WEBIN_NAME1`
+
+ Usage:
+
+ %mp_webin()
+
+ This was created as a macro procedure (over a macro function) as it will also
+ use the filename statement in Viya environments (where `_webin_fileuri` is
+ provided).
+
+
SAS Macros
+ @li mf_getplatform.sas
+
+**/
+
+%macro mp_webin();
+
+/* prepare global variables */
+%global _webin_file_count
+ _webin_filename _webin_filename1
+ _webin_fileref _webin_fileref1
+ _webin_fileuri _webin_fileuri1
+ _webin_name _webin_name1
+ ;
+
+/* create initial versions */
+%let _webin_file_count=%eval(&_webin_file_count+0);
+%let _webin_filename1=%sysfunc(coalescec(&_webin_filename1,&_webin_filename));
+%let _webin_fileref1=%sysfunc(coalescec(&_webin_fileref1,&_webin_fileref));
+%let _webin_fileuri1=%sysfunc(coalescec(&_webin_fileuri1,&_webin_fileuri));
+%let _webin_name1=%sysfunc(coalescec(&_webin_name1,&_webin_name));
+
+
+/* If Viya, create temporary fileref(s) */
+%local i;
+%if %mf_getplatform()=SASVIYA %then %do i=1 %to &_webin_file_count;
+ %let _webin_fileref&i=%mf_getuniquefileref(prefix=0);
+ filename &&_webin_fileref&i filesrvc "&&_webin_fileuri&i";
+%end;
+
+
+%mend mp_webin;/**
@file
@brief Creates a zip file
@details For DIRECTORY usage, will ignore subfolders. For DATASET usage,
diff --git a/base/mf_getuniquefileref.sas b/base/mf_getuniquefileref.sas
index 01c3dd0..8c11725 100644
--- a/base/mf_getuniquefileref.sas
+++ b/base/mf_getuniquefileref.sas
@@ -1,37 +1,58 @@
/**
@file
@brief Assigns and returns an unused fileref
- @details
+ @details Using the native approach for assigning filerefs fails as some
+ procedures (such as proc http) do not recognise the temporary names (starting
+ with a hash), returning a message such as:
+
+ > ERROR 22-322: Expecting a name.
+
+ This macro works by attempting a random fileref (with a prefix), seeing if it
+ is already assigned, and if not - returning the fileref.
+
+ If your process can accept filerefs with the hash (#) prefix, then set
+ `prefix=0` to revert to the native approach - which is significantly faster
+ when there are a lot of filerefs in a session.
+
Use as follows:
%let fileref1=%mf_getuniquefileref();
- %let fileref2=%mf_getuniquefileref();
+ %let fileref2=%mf_getuniquefileref(prefix=0);
%put &fileref1 &fileref2;
- which returns:
+ which returns filerefs similar to:
-> mcref0 mcref1
+> _7432233 #LN00070
- @param prefix= first part of fileref. Remember that filerefs can only be 8
- characters, so a 7 letter prefix would mean that `maxtries` should be 10.
- @param maxtries= the last part of the libref. Provide an integer value.
+ @param [in] prefix= (_) first part of fileref. Remember that filerefs can only
+ be 8 characters, so a 7 letter prefix would mean `maxtries` should be 10.
+ if using zero (0) as the prefix, a native assignment is used.
+ @param [in] maxtries= (1000) the last part of the libref. Must be an integer.
@version 9.2
@author Allan Bowe
**/
-%macro mf_getuniquefileref(prefix=mcref,maxtries=1000);
- %local x fname;
- %let x=0;
- %do x=0 %to &maxtries;
- %if %sysfunc(fileref(&prefix&x)) > 0 %then %do;
- %let fname=&prefix&x;
+%macro mf_getuniquefileref(prefix=_,maxtries=1000);
+ %local rc fname;
+ %if &prefix=0 %then %do;
%let rc=%sysfunc(filename(fname,,temp));
%if &rc %then %put %sysfunc(sysmsg());
- &prefix&x
- %*put &sysmacroname: Fileref &prefix&x was assigned and returned;
- %return;
+ &fname
%end;
+ %else %do;
+ %local x len;
+ %let len=%eval(8-%length(&prefix));
+ %let x=0;
+ %do x=0 %to &maxtries;
+ %let fname=&prefix%substr(%sysfunc(ranuni(0)),3,&len);
+ %if %sysfunc(fileref(&fname)) > 0 %then %do;
+ %let rc=%sysfunc(filename(fname,,temp));
+ %if &rc %then %put %sysfunc(sysmsg());
+ &fname
+ %return;
+ %end;
+ %end;
+ %put unable to find available fileref after &maxtries attempts;
%end;
- %put unable to find available fileref in range &prefix.0-&maxtries;
%mend mf_getuniquefileref;
\ No newline at end of file
diff --git a/base/mp_webin.sas b/base/mp_webin.sas
new file mode 100644
index 0000000..1c6675f
--- /dev/null
+++ b/base/mp_webin.sas
@@ -0,0 +1,58 @@
+/**
+ @file
+ @brief Fix the `_WEBIN` variables provided to SAS web services
+ @details When uploading files to SAS Stored Processes or Viya Jobs a number
+ of global macro variables are automatically created - however there are some
+ differences in behaviour both between SAS 9 and Viya, and also between a
+ single file upload and a multi-file upload.
+
+ This macro "straightens" up the global macro variables to make it easier /
+ simpler to write code that works in both environments and with a variable
+ number of file inputs.
+
+ After running this macro, the following global variables will *always* exist:
+ @li `_WEBIN_FILE_COUNT`
+ @li `_WEBIN_FILENAME1`
+ @li `_WEBIN_FILEREF1`
+ @li `_WEBIN_NAME1`
+
+ Usage:
+
+ %mp_webin()
+
+ This was created as a macro procedure (over a macro function) as it will also
+ use the filename statement in Viya environments (where `_webin_fileuri` is
+ provided).
+
+ SAS Macros
+ @li mf_getplatform.sas
+
+**/
+
+%macro mp_webin();
+
+/* prepare global variables */
+%global _webin_file_count
+ _webin_filename _webin_filename1
+ _webin_fileref _webin_fileref1
+ _webin_fileuri _webin_fileuri1
+ _webin_name _webin_name1
+ ;
+
+/* create initial versions */
+%let _webin_file_count=%eval(&_webin_file_count+0);
+%let _webin_filename1=%sysfunc(coalescec(&_webin_filename1,&_webin_filename));
+%let _webin_fileref1=%sysfunc(coalescec(&_webin_fileref1,&_webin_fileref));
+%let _webin_fileuri1=%sysfunc(coalescec(&_webin_fileuri1,&_webin_fileuri));
+%let _webin_name1=%sysfunc(coalescec(&_webin_name1,&_webin_name));
+
+
+/* If Viya, create temporary fileref(s) */
+%local i;
+%if %mf_getplatform()=SASVIYA %then %do i=1 %to &_webin_file_count;
+ %let _webin_fileref&i=%mf_getuniquefileref(prefix=0);
+ filename &&_webin_fileref&i filesrvc "&&_webin_fileuri&i";
+%end;
+
+
+%mend mp_webin;
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index c17710b..70483f1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,13 +7,13 @@
"name": "@sasjs/core",
"license": "MIT",
"devDependencies": {
- "@sasjs/cli": "^2.37.2"
+ "@sasjs/cli": "^2.37.8"
}
},
"node_modules/@sasjs/adapter": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-2.10.0.tgz",
- "integrity": "sha512-GbvyIgbODnAJaBaz/Tz8/IwcujNOsZcwzbIuKQtG5y13BzgVPtx/e7b2TAhdoBqd+8uVh0CdrSDfOV/SuvPurg==",
+ "version": "2.10.4",
+ "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-2.10.4.tgz",
+ "integrity": "sha512-9b3WGZUzRgszZVyPfrabSx6TycL4JFFXQR/RQKsFCDDwT8UgLGfJ4JmgaGCSmGCcsqML/Q41QipdgWu1M/QA3g==",
"dev": true,
"dependencies": {
"@sasjs/utils": "^2.27.1",
@@ -28,23 +28,23 @@
}
},
"node_modules/@sasjs/cli": {
- "version": "2.37.2",
- "resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-2.37.2.tgz",
- "integrity": "sha512-Bcm8UFN9Y/ZON4T31Gu9mf1REn1pZoStHFVrix/yp7mchFt5rrrY5RbIqO/AI1jzhShSVg9P7oU4VPJrqki+SA==",
+ "version": "2.37.8",
+ "resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-2.37.8.tgz",
+ "integrity": "sha512-V1FGK0ByS5v5+xOX5J1rlQDOXSA37YLL18etEUQOmWK5X9R5tbK4LPIx/pEjLyfZcCHddrm+0nGzRroC715Ilg==",
"dev": true,
"dependencies": {
- "@sasjs/adapter": "2.10.0",
- "@sasjs/core": "2.35.4",
+ "@sasjs/adapter": "2.10.4",
+ "@sasjs/core": "2.42.0",
"@sasjs/lint": "1.11.2",
- "@sasjs/utils": "2.27.1",
- "chalk": "4.1.1",
+ "@sasjs/utils": "2.28.0",
+ "chalk": "4.1.2",
"csv-stringify": "5.6.2",
"dotenv": "10.0.0",
"esm": "3.2.25",
"find": "0.3.0",
"get-installed-path": "4.0.8",
"js-base64": "3.6.1",
- "jsdom": "16.6.0",
+ "jsdom": "17.0.0",
"jwt-decode": "3.1.2",
"lodash.groupby": "4.6.0",
"lodash.uniqby": "4.7.0",
@@ -52,16 +52,17 @@
"ora": "5.4.1",
"rimraf": "3.0.2",
"shelljs": "0.8.4",
- "xml": "1.0.1"
+ "xml": "1.0.1",
+ "yargs": "17.1.1"
},
"bin": {
"sasjs": "build/index.js"
}
},
"node_modules/@sasjs/core": {
- "version": "2.35.4",
- "resolved": "https://registry.npmjs.org/@sasjs/core/-/core-2.35.4.tgz",
- "integrity": "sha512-Exr3+yRdvacKvbXQoi1RfGHi5NtZUkc7RwFNkemHTFXLYaIzPI8CGSCaQmKkwM1UteOJly2e2pw2YT6kHNY1NA==",
+ "version": "2.42.0",
+ "resolved": "https://registry.npmjs.org/@sasjs/core/-/core-2.42.0.tgz",
+ "integrity": "sha512-EISPPCEv+vB3Nqp03NUaIvMZwEnggzGJeEpVfm2Sb504ySN1I2xiJ8bOHXIzvvYP5N/V9X8bXe1raLYnnt8HGA==",
"dev": true
},
"node_modules/@sasjs/lint": {
@@ -74,9 +75,9 @@
}
},
"node_modules/@sasjs/utils": {
- "version": "2.27.1",
- "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.27.1.tgz",
- "integrity": "sha512-CYTQwEj89cc7H3tGiQQcyDkZYaWRc1HZJpOF8o2RHYS37fIAOy0SyyJdq6mcQ74Nb1u5AmFXPFIvnRCMEcTYeQ==",
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.28.0.tgz",
+ "integrity": "sha512-aZAbBDSjvW2TCY1lkuGqqiyWtR4W8GFpCNCUKa72VIkl4zwTE/pnSHQ+v8QilGDSHSPbPEsJGaBaldMGwoI12w==",
"dev": true,
"dependencies": {
"@types/fs-extra": "^9.0.11",
@@ -141,9 +142,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz",
- "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==",
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
+ "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -226,12 +227,12 @@
"dev": true
},
"node_modules/axios": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
- "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"dev": true,
"dependencies": {
- "follow-redirects": "^1.10.0"
+ "follow-redirects": "^1.14.0"
}
},
"node_modules/axios-cookiejar-support": {
@@ -330,9 +331,9 @@
}
},
"node_modules/chalk": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"dependencies": {
"ansi-styles": "^4.1.0",
@@ -381,6 +382,17 @@
"node": ">= 0.2.0"
}
},
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
"node_modules/clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
@@ -442,9 +454,9 @@
"dev": true
},
"node_modules/cssom": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
- "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
"dev": true
},
"node_modules/cssstyle": {
@@ -472,23 +484,23 @@
"dev": true
},
"node_modules/data-urls": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
- "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.0.tgz",
+ "integrity": "sha512-4AefxbTTdFtxDUdh0BuMBs2qJVL25Mow2zlcuuePegQwgD6GEmQao42LLEeksOui8nL4RcNEugIpFP7eRd33xg==",
"dev": true,
"dependencies": {
"abab": "^2.0.3",
"whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^8.0.0"
+ "whatwg-url": "^9.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
"node_modules/debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -503,15 +515,15 @@
}
},
"node_modules/decimal.js": {
- "version": "10.2.1",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz",
- "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==",
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
"dev": true
},
"node_modules/deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
"node_modules/defaults": {
@@ -562,6 +574,21 @@
"node": ">=10"
}
},
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escodegen": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
@@ -652,9 +679,9 @@
}
},
"node_modules/follow-redirects": {
- "version": "1.14.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz",
- "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==",
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz",
+ "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==",
"dev": true,
"funding": [
{
@@ -711,6 +738,15 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/get-installed-path": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-4.0.8.tgz",
@@ -934,6 +970,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -992,21 +1037,21 @@
"dev": true
},
"node_modules/jsdom": {
- "version": "16.6.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz",
- "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==",
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-17.0.0.tgz",
+ "integrity": "sha512-MUq4XdqwtNurZDVeKScENMPHnkgmdIvMzZ1r1NSwHkDuaqI6BouPjr+17COo4/19oLNnmdpFDPOHVpgIZmZ+VA==",
"dev": true,
"dependencies": {
"abab": "^2.0.5",
- "acorn": "^8.2.4",
+ "acorn": "^8.4.1",
"acorn-globals": "^6.0.0",
- "cssom": "^0.4.4",
+ "cssom": "^0.5.0",
"cssstyle": "^2.3.0",
- "data-urls": "^2.0.0",
- "decimal.js": "^10.2.1",
+ "data-urls": "^3.0.0",
+ "decimal.js": "^10.3.1",
"domexception": "^2.0.1",
"escodegen": "^2.0.0",
- "form-data": "^3.0.0",
+ "form-data": "^4.0.0",
"html-encoding-sniffer": "^2.0.1",
"http-proxy-agent": "^4.0.1",
"https-proxy-agent": "^5.0.0",
@@ -1021,12 +1066,12 @@
"webidl-conversions": "^6.1.0",
"whatwg-encoding": "^1.0.5",
"whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^8.5.0",
- "ws": "^7.4.5",
+ "whatwg-url": "^9.0.0",
+ "ws": "^8.0.0",
"xml-name-validator": "^3.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"peerDependencies": {
"canvas": "^2.5.0"
@@ -1037,20 +1082,6 @@
}
}
},
- "node_modules/jsdom/node_modules/form-data": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
- "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -1091,12 +1122,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
"node_modules/lodash.groupby": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
@@ -1126,21 +1151,21 @@
}
},
"node_modules/mime-db": {
- "version": "1.48.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
- "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==",
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
+ "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
- "version": "2.1.31",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
- "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
+ "version": "2.1.32",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
+ "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
"dev": true,
"dependencies": {
- "mime-db": "1.48.0"
+ "mime-db": "1.49.0"
},
"engines": {
"node": ">= 0.6"
@@ -1354,6 +1379,15 @@
"node": ">= 0.10"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
@@ -1494,6 +1528,20 @@
"safe-buffer": "~5.2.0"
}
},
+ "node_modules/string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -1653,17 +1701,16 @@
"dev": true
},
"node_modules/whatwg-url": {
- "version": "8.6.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz",
- "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==",
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz",
+ "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==",
"dev": true,
"dependencies": {
- "lodash": "^4.7.0",
"tr46": "^2.1.0",
"webidl-conversions": "^6.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
}
},
"node_modules/which": {
@@ -1687,6 +1734,23 @@
"node": ">=0.10.0"
}
},
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -1694,12 +1758,12 @@
"dev": true
},
"node_modules/ws": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
- "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.1.tgz",
+ "integrity": "sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ==",
"dev": true,
"engines": {
- "node": ">=8.3.0"
+ "node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
@@ -1731,13 +1795,49 @@
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
+ "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
}
},
"dependencies": {
"@sasjs/adapter": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-2.10.0.tgz",
- "integrity": "sha512-GbvyIgbODnAJaBaz/Tz8/IwcujNOsZcwzbIuKQtG5y13BzgVPtx/e7b2TAhdoBqd+8uVh0CdrSDfOV/SuvPurg==",
+ "version": "2.10.4",
+ "resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-2.10.4.tgz",
+ "integrity": "sha512-9b3WGZUzRgszZVyPfrabSx6TycL4JFFXQR/RQKsFCDDwT8UgLGfJ4JmgaGCSmGCcsqML/Q41QipdgWu1M/QA3g==",
"dev": true,
"requires": {
"@sasjs/utils": "^2.27.1",
@@ -1749,23 +1849,23 @@
}
},
"@sasjs/cli": {
- "version": "2.37.2",
- "resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-2.37.2.tgz",
- "integrity": "sha512-Bcm8UFN9Y/ZON4T31Gu9mf1REn1pZoStHFVrix/yp7mchFt5rrrY5RbIqO/AI1jzhShSVg9P7oU4VPJrqki+SA==",
+ "version": "2.37.8",
+ "resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-2.37.8.tgz",
+ "integrity": "sha512-V1FGK0ByS5v5+xOX5J1rlQDOXSA37YLL18etEUQOmWK5X9R5tbK4LPIx/pEjLyfZcCHddrm+0nGzRroC715Ilg==",
"dev": true,
"requires": {
- "@sasjs/adapter": "2.10.0",
- "@sasjs/core": "2.35.4",
+ "@sasjs/adapter": "2.10.4",
+ "@sasjs/core": "2.42.0",
"@sasjs/lint": "1.11.2",
- "@sasjs/utils": "2.27.1",
- "chalk": "4.1.1",
+ "@sasjs/utils": "2.28.0",
+ "chalk": "4.1.2",
"csv-stringify": "5.6.2",
"dotenv": "10.0.0",
"esm": "3.2.25",
"find": "0.3.0",
"get-installed-path": "4.0.8",
"js-base64": "3.6.1",
- "jsdom": "16.6.0",
+ "jsdom": "17.0.0",
"jwt-decode": "3.1.2",
"lodash.groupby": "4.6.0",
"lodash.uniqby": "4.7.0",
@@ -1773,13 +1873,14 @@
"ora": "5.4.1",
"rimraf": "3.0.2",
"shelljs": "0.8.4",
- "xml": "1.0.1"
+ "xml": "1.0.1",
+ "yargs": "17.1.1"
}
},
"@sasjs/core": {
- "version": "2.35.4",
- "resolved": "https://registry.npmjs.org/@sasjs/core/-/core-2.35.4.tgz",
- "integrity": "sha512-Exr3+yRdvacKvbXQoi1RfGHi5NtZUkc7RwFNkemHTFXLYaIzPI8CGSCaQmKkwM1UteOJly2e2pw2YT6kHNY1NA==",
+ "version": "2.42.0",
+ "resolved": "https://registry.npmjs.org/@sasjs/core/-/core-2.42.0.tgz",
+ "integrity": "sha512-EISPPCEv+vB3Nqp03NUaIvMZwEnggzGJeEpVfm2Sb504ySN1I2xiJ8bOHXIzvvYP5N/V9X8bXe1raLYnnt8HGA==",
"dev": true
},
"@sasjs/lint": {
@@ -1792,9 +1893,9 @@
}
},
"@sasjs/utils": {
- "version": "2.27.1",
- "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.27.1.tgz",
- "integrity": "sha512-CYTQwEj89cc7H3tGiQQcyDkZYaWRc1HZJpOF8o2RHYS37fIAOy0SyyJdq6mcQ74Nb1u5AmFXPFIvnRCMEcTYeQ==",
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.28.0.tgz",
+ "integrity": "sha512-aZAbBDSjvW2TCY1lkuGqqiyWtR4W8GFpCNCUKa72VIkl4zwTE/pnSHQ+v8QilGDSHSPbPEsJGaBaldMGwoI12w==",
"dev": true,
"requires": {
"@types/fs-extra": "^9.0.11",
@@ -1853,9 +1954,9 @@
"dev": true
},
"acorn": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz",
- "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==",
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
+ "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
"dev": true
},
"acorn-globals": {
@@ -1913,12 +2014,12 @@
"dev": true
},
"axios": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
- "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"dev": true,
"requires": {
- "follow-redirects": "^1.10.0"
+ "follow-redirects": "^1.14.0"
}
},
"axios-cookiejar-support": {
@@ -1981,9 +2082,9 @@
}
},
"chalk": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -2014,6 +2115,17 @@
"colors": "1.0.3"
}
},
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
"clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
@@ -2063,9 +2175,9 @@
"dev": true
},
"cssom": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
- "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
"dev": true
},
"cssstyle": {
@@ -2092,35 +2204,35 @@
"dev": true
},
"data-urls": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
- "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.0.tgz",
+ "integrity": "sha512-4AefxbTTdFtxDUdh0BuMBs2qJVL25Mow2zlcuuePegQwgD6GEmQao42LLEeksOui8nL4RcNEugIpFP7eRd33xg==",
"dev": true,
"requires": {
"abab": "^2.0.3",
"whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^8.0.0"
+ "whatwg-url": "^9.0.0"
}
},
"debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"decimal.js": {
- "version": "10.2.1",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz",
- "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==",
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz",
+ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==",
"dev": true
},
"deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
"defaults": {
@@ -2161,6 +2273,18 @@
"integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==",
"dev": true
},
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
"escodegen": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
@@ -2223,9 +2347,9 @@
}
},
"follow-redirects": {
- "version": "1.14.2",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz",
- "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==",
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz",
+ "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==",
"dev": true
},
"form-data": {
@@ -2262,6 +2386,12 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
"get-installed-path": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-4.0.8.tgz",
@@ -2427,6 +2557,12 @@
"has": "^1.0.3"
}
},
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
"is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -2470,21 +2606,21 @@
"dev": true
},
"jsdom": {
- "version": "16.6.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz",
- "integrity": "sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg==",
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-17.0.0.tgz",
+ "integrity": "sha512-MUq4XdqwtNurZDVeKScENMPHnkgmdIvMzZ1r1NSwHkDuaqI6BouPjr+17COo4/19oLNnmdpFDPOHVpgIZmZ+VA==",
"dev": true,
"requires": {
"abab": "^2.0.5",
- "acorn": "^8.2.4",
+ "acorn": "^8.4.1",
"acorn-globals": "^6.0.0",
- "cssom": "^0.4.4",
+ "cssom": "^0.5.0",
"cssstyle": "^2.3.0",
- "data-urls": "^2.0.0",
- "decimal.js": "^10.2.1",
+ "data-urls": "^3.0.0",
+ "decimal.js": "^10.3.1",
"domexception": "^2.0.1",
"escodegen": "^2.0.0",
- "form-data": "^3.0.0",
+ "form-data": "^4.0.0",
"html-encoding-sniffer": "^2.0.1",
"http-proxy-agent": "^4.0.1",
"https-proxy-agent": "^5.0.0",
@@ -2499,22 +2635,9 @@
"webidl-conversions": "^6.1.0",
"whatwg-encoding": "^1.0.5",
"whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^8.5.0",
- "ws": "^7.4.5",
+ "whatwg-url": "^9.0.0",
+ "ws": "^8.0.0",
"xml-name-validator": "^3.0.0"
- },
- "dependencies": {
- "form-data": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
- "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- }
}
},
"jsonfile": {
@@ -2549,12 +2672,6 @@
"type-check": "~0.3.2"
}
},
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true
- },
"lodash.groupby": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
@@ -2578,18 +2695,18 @@
}
},
"mime-db": {
- "version": "1.48.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz",
- "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==",
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
+ "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==",
"dev": true
},
"mime-types": {
- "version": "2.1.31",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz",
- "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==",
+ "version": "2.1.32",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
+ "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
"dev": true,
"requires": {
- "mime-db": "1.48.0"
+ "mime-db": "1.49.0"
}
},
"mimic-fn": {
@@ -2752,6 +2869,12 @@
"resolve": "^1.1.6"
}
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
"resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
@@ -2851,6 +2974,17 @@
"safe-buffer": "~5.2.0"
}
},
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -2985,12 +3119,11 @@
"dev": true
},
"whatwg-url": {
- "version": "8.6.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz",
- "integrity": "sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw==",
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz",
+ "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==",
"dev": true,
"requires": {
- "lodash": "^4.7.0",
"tr46": "^2.1.0",
"webidl-conversions": "^6.1.0"
}
@@ -3010,6 +3143,17 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true
},
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -3017,9 +3161,9 @@
"dev": true
},
"ws": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.0.tgz",
- "integrity": "sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==",
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.1.tgz",
+ "integrity": "sha512-XkgWpJU3sHU7gX8f13NqTn6KQ85bd1WU7noBHTT8fSohx7OS1TPY8k+cyRPCzFkia7C4mM229yeHr1qK9sM4JQ==",
"dev": true,
"requires": {}
},
@@ -3040,6 +3184,33 @@
"resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "17.1.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
+ "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index e4a838e..2e523d5 100644
--- a/package.json
+++ b/package.json
@@ -33,6 +33,6 @@
"prepare": "git rev-parse --git-dir && git config core.hooksPath ./.git-hooks || true"
},
"devDependencies": {
- "@sasjs/cli": "^2.37.2"
+ "@sasjs/cli": "^2.37.8"
}
}
diff --git a/tests/crossplatform/mf_getuniquefileref.test.sas b/tests/crossplatform/mf_getuniquefileref.test.sas
new file mode 100644
index 0000000..04331fb
--- /dev/null
+++ b/tests/crossplatform/mf_getuniquefileref.test.sas
@@ -0,0 +1,36 @@
+/**
+ @file
+ @brief Testing mf_getuniquefileref macro
+ @details To test performance you can also use the following macro:
+
+ %macro x(prefix);
+ %let now=%sysfunc(datetime());
+ %do x=1 %to 1000;
+ %let rc=%mf_getuniquefileref(prefix=&prefix);
+ %end;
+ %put %sysevalf(%sysfunc(datetime())-&now);
+ %mend;
+ %x(_)
+ %x(0)
+
+ SAS Macros
+ @li mf_getuniquefileref.sas
+ @li mp_assert.sas
+
+**/
+
+%mp_assert(
+ iftrue=(
+ "%substr(%mf_getuniquefileref(prefix=0),1,1)"="#"
+ ),
+ desc=Checking for a natively assigned fileref,
+ outds=work.test_results
+)
+
+%mp_assert(
+ iftrue=(
+ "%substr(%mf_getuniquefileref(),1,1)"="_"
+ ),
+ desc=Checking for a default fileref,
+ outds=work.test_results
+)
diff --git a/tests/crossplatform/mp_webin.test.sas b/tests/crossplatform/mp_webin.test.sas
new file mode 100644
index 0000000..18cf2b5
--- /dev/null
+++ b/tests/crossplatform/mp_webin.test.sas
@@ -0,0 +1,39 @@
+/**
+ @file
+ @brief Testing mp_webin macro
+
+ SAS Macros
+ @li mp_webin.sas
+ @li mp_assert.sas
+
+**/
+
+/* force SAS9 tests as we don't have a valid URI available */
+%macro mf_getplatform();
+ SAS9
+%mend mf_getplatform;
+
+/* TEST 1 */
+%let _webin_file_count=1;
+%let _webin_filename=test;
+%mp_webin()
+
+%mp_assert(
+ iftrue=(
+ %symexist(_WEBIN_FILEREF1)
+ ),
+ desc=Checking if the macvar exists,
+ outds=work.test_results
+)
+
+/* TEST 2 */
+%global _WEBIN_FILENAME1;
+%mp_assert(
+ iftrue=(
+ %str(&_WEBIN_FILENAME1)=%str(test)
+ ),
+ desc=Checking if the macvar exists,
+ outds=work.test_results
+)
+
+