diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index b83ef2a..4dfe98f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,3 +15,4 @@ What code changes have been made to achieve the intent. - [ ] Code is formatted correctly (`sasjs lint`). - [ ] Any new functionality has been unit tested. - [ ] All unit tests are passing (`sasjs test`). +- [ ] `all.sas` has been regenerated (`python3 build.py`) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index d87a78b..ced41c5 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -51,7 +51,7 @@ jobs: run: npm ci - name: Check code style (aborts if errors found) - run: sasjs lint + run: npx sasjs lint - name: Add client run: echo "CLIENT=${{secrets.SAS9_4GL_IO_CLIENT}}"> .env.server @@ -60,10 +60,10 @@ jobs: run: echo "ACCESS_TOKEN=${{secrets.SAS9_4GL_IO_ACCESS_TOKEN}}" >> .env.server - name: Build & Deploy Project to SAS server - run: sasjs cbd -t server + run: npx sasjs cbd -t server - name: Run all tests - run: sasjs test -t server + run: npx sasjs test -t server env: CI: true CLIENT: ${{secrets.CLIENT}} diff --git a/all.sas b/all.sas index 2e580d4..99df58a 100644 --- a/all.sas +++ b/all.sas @@ -2658,6 +2658,100 @@ and %superq(SYSPROCESSNAME) ne %str(Compute Server) %mend mp_abort; /** @endcond */ +/** + @file + @brief Apply leading blanks to align numbers vertically in a char variable + @details This is particularly useful when storing numbers (as character) that + need to be sorted. + + It works by splitting the number left and right of the decimal place, and + aligning it accordingly. A temporary variable is created as part of this + process (which is automatically dropped) + + The macro can be used only in data step, eg as follows: + + data _null_; + length myvar $50; + do i=1 to 1000 by 50; + if mod(i,2)=0 then j=ranuni(0)*i*100; + else j=i*100; + + %mp_aligndecimal(myvar,width=7) + + leading_spaces=length(myvar)-length(cats(myvar)); + putlog +leading_spaces myvar; + end; + run; + + The generated code will look something like this: + + length aligndp4e49996 $7; + if index(myvar,'.') then do; + aligndp4e49996=cats(scan(myvar,1,'.')); + aligndp4e49996=right(aligndp4e49996); + myvar=aligndp4e49996!!'.'!!cats(scan(myvar,2,'.')); + end; + else do; + aligndp4e49996=myvar; + aligndp4e49996=right(aligndp4e49996); + myvar=aligndp4e49996; + end; + + Results (myvar variable): + + 0.7683559324 + 122.8232796 + 99419.50552 + 42938.5143414 + 763.3799189 + 15170.606073 + 15083.285773 + 85443.198707 + 2022999.2251 + 12038.658867 + 1350582.6734 + 52777.258221 + 11723.347628 + 33101.268376 + 6181622.8603 + 7390614.0669 + 73384.537893 + 1788362.1016 + 2774586.2219 + 7998580.8415 + + + @param var The (data step) variable to create + @param width= (8) The number of characters BEFORE the decimal point + +

SAS Macros

+ @li mf_getuniquename.sas + +

Related Programs

+ @li mp_aligndecimal.test.sas + + @version 9.2 + @author Allan Bowe +**/ + +%macro mp_aligndecimal(var,width=8); + + %local tmpvar; + %let tmpvar=%mf_getuniquename(prefix=aligndp); + length &tmpvar $&width; + if index(&var,'.') then do; + &tmpvar=cats(scan(&var,1,'.')); + &tmpvar=right(&tmpvar); + &var=&tmpvar!!'.'!!cats(scan(&var,2,'.')); + end; + else do; + &tmpvar=cats(&var); + &tmpvar=right(&tmpvar); + &var=&tmpvar; + end; + drop &tmpvar; + +%mend mp_aligndecimal; /** @file @brief Append (concatenate) two or more files. @@ -3137,6 +3231,7 @@ run; @param [in] test= (ALLVALS) The test to apply. Valid values are: @li ALLVALS - Test is a PASS if ALL values have a match in checkvals @li ANYVAL - Test is a PASS if at least 1 value has a match in checkvals + @li NOVAL - Test is a PASS if there are NO matches in checkvals @param [out] outds= (work.test_results) The output dataset to contain the results. If it does not exist, it will be created, with the following format: |TEST_DESCRIPTION:$256|TEST_RESULT:$4|TEST_COMMENTS:$256| @@ -3192,7 +3287,7 @@ run; %let test=%upcase(&test); - %if &test ne ALLVALS and &test ne ANYVAL %then %do; + %if &test ne ALLVALS and &test ne ANYVAL and &test ne NOVAL %then %do; %mp_abort( mac=&sysmacroname, msg=%str(Invalid test - &test) @@ -3203,12 +3298,12 @@ run; %let result=-1; %let orig=-1; proc sql noprint; - select count(*) into: result + select count(*) into: result trimmed from &lib..&ds where &col not in ( select &ccol from &clib..&cds ); - select count(*) into: orig from &lib..&ds; + select count(*) into: orig trimmed from &lib..&ds; quit; %local notfound tmp1 tmp2; @@ -3240,7 +3335,7 @@ run; length test_description $256 test_result $4 test_comments $256; test_description=symget('desc'); test_result='FAIL'; - test_comments="&sysmacroname: &lib..&ds..&col has &result values " + test_comments="&sysmacroname: &lib..&ds..&col has &result/&orig values " !!"not in &clib..&cds..&ccol.. First 10 vals:"!!symget('notfound'); %if &test=ANYVAL %then %do; if &result < &orig then test_result='PASS'; @@ -3248,6 +3343,9 @@ run; %else %if &test=ALLVALS %then %do; if &result=0 then test_result='PASS'; %end; + %else %if &test=NOVAL %then %do; + if &result=&orig then test_result='PASS'; + %end; %else %do; test_comments="&sysmacroname: Unsatisfied test condition - &test"; %end; @@ -4023,6 +4121,7 @@ run;

Related Macros

@li mf_getvarformat.sas + @li mp_aligndecimal.sas @li mp_getformats.sas @li mp_loadformat.sas @li mp_ds2fmtds.sas @@ -4064,13 +4163,13 @@ run; data &cntlout; if 0 then set &ddlds; set &cntlds; - if type="N" then do; - start=cats(start); - end=cats(end); + if type in ("I","N") then do; /* numeric (in)format */ + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) end; run; proc sort; - by fmtname start; + by type fmtname start; run; proc sql; @@ -10030,6 +10129,7 @@ select distinct lowcase(memname)

Related Macros

@li mddl_dc_difftable.sas @li mddl_dc_locktable.sas + @li mp_aligndecimal.sas @li mp_loadformat.test.sas @li mp_lockanytable.sas @li mp_stackdiffs.sas @@ -10119,7 +10219,16 @@ run; * First, extract only relevant formats from the catalog */ proc sql noprint; -select distinct upcase(fmtname) into: fmtlist separated by ' ' from &libds; +select distinct + case + when type='N' then upcase(fmtname) + when type='C' then cats('$',upcase(fmtname)) + when type='I' then cats('@',upcase(fmtname)) + when type='J' then cats('@$',upcase(fmtname)) + else "&sysmacroname:UNHANDLED" + end + into: fmtlist separated by ' ' + from &libds; %mp_cntlout(libcat=&libcat,fmtlist=&fmtlist,cntlout=&base_fmts) @@ -10131,16 +10240,24 @@ select distinct upcase(fmtname) into: fmtlist separated by ' ' from &libds; data &inlibds; length &delete_col $3; if 0 then set &template; + length start end $10000; set &libds; if &delete_col='' then &delete_col='No'; fmtname=upcase(fmtname); + type=upcase(type); if missing(type) then do; - if substr(fmtname,1,1)='$' then type='C'; - else type='N'; + if substr(fmtname,1,1)='@' then do; + if substr(fmtname,2,1)='$' then type='J'; + else type='I'; + end; + else do; + if substr(fmtname,1,1)='$' then type='C'; + else type='N'; + end; end; - if type='N' then do; - start=cats(start); - end=cats(end); + if type in ('N','I') then do; + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) end; run; @@ -10154,9 +10271,10 @@ create table &outds_add(drop=&delete_col) as left join &base_fmts b on a.fmtname=b.fmtname and a.start=b.start + and a.type=b.type where b.fmtname is null and upcase(a.&delete_col) ne "YES" - order by fmtname, start;; + order by type, fmtname, start; /** * Identify deleted records @@ -10167,8 +10285,9 @@ create table &outds_del(drop=&delete_col) as inner join &base_fmts b on a.fmtname=b.fmtname and a.start=b.start + and a.type=b.type where upcase(a.&delete_col)="YES" - order by fmtname, start; + order by type, fmtname, start; /** * Identify modified records @@ -10179,8 +10298,9 @@ create table &outds_mod (drop=&delete_col) as inner join &base_fmts b on a.fmtname=b.fmtname and a.start=b.start + and a.type=b.type where upcase(a.&delete_col) ne "YES" - order by fmtname, start; + order by type, fmtname, start; options ibufsize=&ibufsize; @@ -10197,13 +10317,13 @@ options ibufsize=&ibufsize; &outds_add(in=add) &outds_del(in=del); if not del and not mod; - by fmtname start; + by type fmtname start; run; data &stagedata; set &ds1 &outds_mod; run; proc sort; - by fmtname start; + by type fmtname start; run; %end; /* mp abort needs to run outside of conditional blocks */ @@ -10251,7 +10371,7 @@ options ibufsize=&ibufsize; %mp_storediffs(&libcat-FC ,&base_fmts - ,FMTNAME START + ,TYPE FMTNAME START ,delds=&outds_del ,modds=&outds_mod ,appds=&outds_add @@ -13956,14 +14076,20 @@ ods package close; proc sql; create table &libds( - FMTNAME char(32) label='Format name' + TYPE char(1) label='Type of format' + ,FMTNAME char(32) label='Format name' /* to accommodate larger START values, mp_loadformat.sas will need the SQL dependency removed (proc sql needs to accommodate 3 index values in a 32767 ibufsize limit) */ ,START char(10000) label='Starting value for format' - ,END char(32767) label='Ending value for format' + /* + Keep lengths of START and END the same to avoid this err: + "Start is greater than end: -<." + Similar usage note: https://support.sas.com/kb/69/330.html + */ + ,END char(10000) label='Ending value for format' ,LABEL char(32767) label='Format value label' ,MIN num length=3 label='Minimum length' ,MAX num length=3 label='Maximum length' @@ -13974,7 +14100,6 @@ create table &libds( ,MULT num label='Multiplier' ,FILL char(1) label='Fill character' ,NOEDIT num length=3 label='Is picture string noedit?' - ,TYPE char(1) label='Type of format' ,SEXCL char(1) label='Start exclusion' ,EEXCL char(1) label='End exclusion' ,HLO char(13) label='Additional information' diff --git a/base/mp_aligndecimal.sas b/base/mp_aligndecimal.sas new file mode 100644 index 0000000..35ef8e2 --- /dev/null +++ b/base/mp_aligndecimal.sas @@ -0,0 +1,94 @@ +/** + @file + @brief Apply leading blanks to align numbers vertically in a char variable + @details This is particularly useful when storing numbers (as character) that + need to be sorted. + + It works by splitting the number left and right of the decimal place, and + aligning it accordingly. A temporary variable is created as part of this + process (which is automatically dropped) + + The macro can be used only in data step, eg as follows: + + data _null_; + length myvar $50; + do i=1 to 1000 by 50; + if mod(i,2)=0 then j=ranuni(0)*i*100; + else j=i*100; + + %mp_aligndecimal(myvar,width=7) + + leading_spaces=length(myvar)-length(cats(myvar)); + putlog +leading_spaces myvar; + end; + run; + + The generated code will look something like this: + + length aligndp4e49996 $7; + if index(myvar,'.') then do; + aligndp4e49996=cats(scan(myvar,1,'.')); + aligndp4e49996=right(aligndp4e49996); + myvar=aligndp4e49996!!'.'!!cats(scan(myvar,2,'.')); + end; + else do; + aligndp4e49996=myvar; + aligndp4e49996=right(aligndp4e49996); + myvar=aligndp4e49996; + end; + + Results (myvar variable): + + 0.7683559324 + 122.8232796 + 99419.50552 + 42938.5143414 + 763.3799189 + 15170.606073 + 15083.285773 + 85443.198707 + 2022999.2251 + 12038.658867 + 1350582.6734 + 52777.258221 + 11723.347628 + 33101.268376 + 6181622.8603 + 7390614.0669 + 73384.537893 + 1788362.1016 + 2774586.2219 + 7998580.8415 + + + @param var The (data step) variable to create + @param width= (8) The number of characters BEFORE the decimal point + +

SAS Macros

+ @li mf_getuniquename.sas + +

Related Programs

+ @li mp_aligndecimal.test.sas + + @version 9.2 + @author Allan Bowe +**/ + +%macro mp_aligndecimal(var,width=8); + + %local tmpvar; + %let tmpvar=%mf_getuniquename(prefix=aligndp); + length &tmpvar $&width; + if index(&var,'.') then do; + &tmpvar=cats(scan(&var,1,'.')); + &tmpvar=right(&tmpvar); + &var=&tmpvar!!'.'!!cats(scan(&var,2,'.')); + end; + else do; + &tmpvar=cats(&var); + &tmpvar=right(&tmpvar); + &var=&tmpvar; + end; + drop &tmpvar; + +%mend mp_aligndecimal; diff --git a/base/mp_assertcolvals.sas b/base/mp_assertcolvals.sas index 7176782..8dc36c9 100644 --- a/base/mp_assertcolvals.sas +++ b/base/mp_assertcolvals.sas @@ -42,6 +42,7 @@ @param [in] test= (ALLVALS) The test to apply. Valid values are: @li ALLVALS - Test is a PASS if ALL values have a match in checkvals @li ANYVAL - Test is a PASS if at least 1 value has a match in checkvals + @li NOVAL - Test is a PASS if there are NO matches in checkvals @param [out] outds= (work.test_results) The output dataset to contain the results. If it does not exist, it will be created, with the following format: |TEST_DESCRIPTION:$256|TEST_RESULT:$4|TEST_COMMENTS:$256| @@ -97,7 +98,7 @@ %let test=%upcase(&test); - %if &test ne ALLVALS and &test ne ANYVAL %then %do; + %if &test ne ALLVALS and &test ne ANYVAL and &test ne NOVAL %then %do; %mp_abort( mac=&sysmacroname, msg=%str(Invalid test - &test) @@ -108,12 +109,12 @@ %let result=-1; %let orig=-1; proc sql noprint; - select count(*) into: result + select count(*) into: result trimmed from &lib..&ds where &col not in ( select &ccol from &clib..&cds ); - select count(*) into: orig from &lib..&ds; + select count(*) into: orig trimmed from &lib..&ds; quit; %local notfound tmp1 tmp2; @@ -145,7 +146,7 @@ length test_description $256 test_result $4 test_comments $256; test_description=symget('desc'); test_result='FAIL'; - test_comments="&sysmacroname: &lib..&ds..&col has &result values " + test_comments="&sysmacroname: &lib..&ds..&col has &result/&orig values " !!"not in &clib..&cds..&ccol.. First 10 vals:"!!symget('notfound'); %if &test=ANYVAL %then %do; if &result < &orig then test_result='PASS'; @@ -153,6 +154,9 @@ %else %if &test=ALLVALS %then %do; if &result=0 then test_result='PASS'; %end; + %else %if &test=NOVAL %then %do; + if &result=&orig then test_result='PASS'; + %end; %else %do; test_comments="&sysmacroname: Unsatisfied test condition - &test"; %end; diff --git a/base/mp_cntlout.sas b/base/mp_cntlout.sas index 357b630..5a8e69a 100644 --- a/base/mp_cntlout.sas +++ b/base/mp_cntlout.sas @@ -28,6 +28,7 @@

Related Macros

@li mf_getvarformat.sas + @li mp_aligndecimal.sas @li mp_getformats.sas @li mp_loadformat.sas @li mp_ds2fmtds.sas @@ -69,13 +70,13 @@ run; data &cntlout; if 0 then set &ddlds; set &cntlds; - if type="N" then do; - start=cats(start); - end=cats(end); + if type in ("I","N") then do; /* numeric (in)format */ + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) end; run; proc sort; - by fmtname start; + by type fmtname start; run; proc sql; diff --git a/base/mp_loadformat.sas b/base/mp_loadformat.sas index 44f4371..cb33ff4 100644 --- a/base/mp_loadformat.sas +++ b/base/mp_loadformat.sas @@ -45,6 +45,7 @@

Related Macros

@li mddl_dc_difftable.sas @li mddl_dc_locktable.sas + @li mp_aligndecimal.sas @li mp_loadformat.test.sas @li mp_lockanytable.sas @li mp_stackdiffs.sas @@ -134,7 +135,16 @@ run; * First, extract only relevant formats from the catalog */ proc sql noprint; -select distinct upcase(fmtname) into: fmtlist separated by ' ' from &libds; +select distinct + case + when type='N' then upcase(fmtname) + when type='C' then cats('$',upcase(fmtname)) + when type='I' then cats('@',upcase(fmtname)) + when type='J' then cats('@$',upcase(fmtname)) + else "&sysmacroname:UNHANDLED" + end + into: fmtlist separated by ' ' + from &libds; %mp_cntlout(libcat=&libcat,fmtlist=&fmtlist,cntlout=&base_fmts) @@ -146,16 +156,24 @@ select distinct upcase(fmtname) into: fmtlist separated by ' ' from &libds; data &inlibds; length &delete_col $3; if 0 then set &template; + length start end $10000; set &libds; if &delete_col='' then &delete_col='No'; fmtname=upcase(fmtname); + type=upcase(type); if missing(type) then do; - if substr(fmtname,1,1)='$' then type='C'; - else type='N'; + if substr(fmtname,1,1)='@' then do; + if substr(fmtname,2,1)='$' then type='J'; + else type='I'; + end; + else do; + if substr(fmtname,1,1)='$' then type='C'; + else type='N'; + end; end; - if type='N' then do; - start=cats(start); - end=cats(end); + if type in ('N','I') then do; + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) end; run; @@ -169,9 +187,10 @@ create table &outds_add(drop=&delete_col) as left join &base_fmts b on a.fmtname=b.fmtname and a.start=b.start + and a.type=b.type where b.fmtname is null and upcase(a.&delete_col) ne "YES" - order by fmtname, start;; + order by type, fmtname, start; /** * Identify deleted records @@ -182,8 +201,9 @@ create table &outds_del(drop=&delete_col) as inner join &base_fmts b on a.fmtname=b.fmtname and a.start=b.start + and a.type=b.type where upcase(a.&delete_col)="YES" - order by fmtname, start; + order by type, fmtname, start; /** * Identify modified records @@ -194,8 +214,9 @@ create table &outds_mod (drop=&delete_col) as inner join &base_fmts b on a.fmtname=b.fmtname and a.start=b.start + and a.type=b.type where upcase(a.&delete_col) ne "YES" - order by fmtname, start; + order by type, fmtname, start; options ibufsize=&ibufsize; @@ -212,13 +233,13 @@ options ibufsize=&ibufsize; &outds_add(in=add) &outds_del(in=del); if not del and not mod; - by fmtname start; + by type fmtname start; run; data &stagedata; set &ds1 &outds_mod; run; proc sort; - by fmtname start; + by type fmtname start; run; %end; /* mp abort needs to run outside of conditional blocks */ @@ -266,7 +287,7 @@ options ibufsize=&ibufsize; %mp_storediffs(&libcat-FC ,&base_fmts - ,FMTNAME START + ,TYPE FMTNAME START ,delds=&outds_del ,modds=&outds_mod ,appds=&outds_add diff --git a/ddl/mddl_sas_cntlout.sas b/ddl/mddl_sas_cntlout.sas index 3b4ffc4..18ce174 100644 --- a/ddl/mddl_sas_cntlout.sas +++ b/ddl/mddl_sas_cntlout.sas @@ -12,14 +12,20 @@ proc sql; create table &libds( - FMTNAME char(32) label='Format name' + TYPE char(1) label='Type of format' + ,FMTNAME char(32) label='Format name' /* to accommodate larger START values, mp_loadformat.sas will need the SQL dependency removed (proc sql needs to accommodate 3 index values in a 32767 ibufsize limit) */ ,START char(10000) label='Starting value for format' - ,END char(32767) label='Ending value for format' + /* + Keep lengths of START and END the same to avoid this err: + "Start is greater than end: -<." + Similar usage note: https://support.sas.com/kb/69/330.html + */ + ,END char(10000) label='Ending value for format' ,LABEL char(32767) label='Format value label' ,MIN num length=3 label='Minimum length' ,MAX num length=3 label='Maximum length' @@ -30,7 +36,6 @@ create table &libds( ,MULT num label='Multiplier' ,FILL char(1) label='Fill character' ,NOEDIT num length=3 label='Is picture string noedit?' - ,TYPE char(1) label='Type of format' ,SEXCL char(1) label='Start exclusion' ,EEXCL char(1) label='End exclusion' ,HLO char(13) label='Additional information' diff --git a/package-lock.json b/package-lock.json index 33c52f5..e79f72b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -176,9 +176,9 @@ } }, "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, "node_modules/@types/prompts": { @@ -198,9 +198,9 @@ "peer": true }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "node_modules/accumulate-stream": { @@ -220,9 +220,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -310,7 +310,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "node_modules/axios": { @@ -470,9 +470,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, "engines": { "node": ">=6" @@ -510,7 +510,7 @@ "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "engines": { "node": ">=0.8" @@ -558,7 +558,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/consola": { @@ -598,14 +598,27 @@ "dev": true }, "node_modules/data-urls": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", - "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, "dependencies": { - "abab": "^2.0.3", + "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0" + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" }, "engines": { "node": ">=12" @@ -629,9 +642,9 @@ } }, "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, "node_modules/deep-is": { @@ -641,18 +654,21 @@ "dev": true }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -765,7 +781,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/find": { @@ -828,7 +844,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/function-bind": { @@ -847,15 +863,15 @@ } }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -867,9 +883,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/has": { @@ -926,9 +942,9 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", @@ -982,7 +998,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -1005,9 +1021,9 @@ } }, "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -1179,7 +1195,7 @@ "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -1192,13 +1208,13 @@ "node_modules/lodash.groupby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==", "dev": true }, "node_modules/lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "dev": true }, "node_modules/log-symbols": { @@ -1266,10 +1282,16 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1294,15 +1316,15 @@ } }, "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", "dev": true }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" @@ -1418,7 +1440,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -1445,7 +1467,7 @@ "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -1465,24 +1487,24 @@ } }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -1496,7 +1518,7 @@ "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { "resolve": "^1.1.6" @@ -1515,12 +1537,12 @@ } }, "node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -1615,9 +1637,9 @@ } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sisteransi": { @@ -1760,7 +1782,7 @@ "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -1781,7 +1803,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/valid-url": { @@ -1794,6 +1816,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, "dependencies": { "browser-process-hrtime": "^1.0.0" @@ -1814,7 +1837,7 @@ "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "dependencies": { "defaults": "^1.0.3" @@ -1892,20 +1915,20 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -1919,7 +1942,7 @@ "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", "dev": true }, "node_modules/xml-name-validator": { @@ -2122,9 +2145,9 @@ } }, "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "version": "20.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", + "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", "dev": true }, "@types/prompts": { @@ -2144,9 +2167,9 @@ "peer": true }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "accumulate-stream": { @@ -2168,9 +2191,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true }, "acorn-globals": { @@ -2230,7 +2253,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "axios": { @@ -2342,9 +2365,9 @@ } }, "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true }, "cli-table": { @@ -2370,7 +2393,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "color-convert": { @@ -2406,7 +2429,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "consola": { @@ -2445,14 +2468,26 @@ "dev": true }, "data-urls": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", - "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, "requires": { - "abab": "^2.0.3", + "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0" + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } } }, "debug": { @@ -2465,9 +2500,9 @@ } }, "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, "deep-is": { @@ -2477,9 +2512,9 @@ "dev": true }, "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" @@ -2488,7 +2523,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "domexception": { @@ -2564,7 +2599,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "find": { @@ -2607,7 +2642,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "function-bind": { @@ -2623,23 +2658,23 @@ "dev": true }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "has": { @@ -2684,9 +2719,9 @@ "dev": true }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", @@ -2717,7 +2752,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "requires": { "once": "^1.3.0", @@ -2737,9 +2772,9 @@ "dev": true }, "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "requires": { "has": "^1.0.3" @@ -2862,7 +2897,7 @@ "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -2872,13 +2907,13 @@ "lodash.groupby": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==", "dev": true }, "lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "dev": true }, "log-symbols": { @@ -2928,9 +2963,9 @@ "dev": true }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "node-graphviz": { @@ -2950,15 +2985,15 @@ } }, "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", "dev": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "requires": { "wrappy": "1" @@ -3046,7 +3081,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true }, "path-parse": { @@ -3064,7 +3099,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "prompts": { @@ -3078,21 +3113,21 @@ } }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -3103,7 +3138,7 @@ "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "requires": { "resolve": "^1.1.6" @@ -3116,12 +3151,12 @@ "dev": true }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -3178,9 +3213,9 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sisteransi": { @@ -3298,7 +3333,7 @@ "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" @@ -3313,7 +3348,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "valid-url": { @@ -3343,7 +3378,7 @@ "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" @@ -3400,20 +3435,20 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "requires": {} }, "xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", "dev": true }, "xml-name-validator": { diff --git a/tests/base/mp_aligndecimal.test.sas b/tests/base/mp_aligndecimal.test.sas new file mode 100644 index 0000000..721f340 --- /dev/null +++ b/tests/base/mp_aligndecimal.test.sas @@ -0,0 +1,46 @@ +/** + @file + @brief Testing mp_aligndecimal macro + @details Creates an aligned variable and checks the number of leading blanks + +

SAS Macros

+ @li mp_aligndecimal.sas + @li mp_assertcolvals.sas + @li mp_assertscope.sas + +**/ + + + +/* target values */ +data work.checkds; + do checkval=' 0.56',' 123.45',' 123.4 ',' 1.2 ',' 0'; + output; + end; +run; + +/* raw values */ +data work.rawds; + set work.checkds; + tgtvar=cats(checkval); + drop checkval; +run; +%mp_assertcolvals(work.rawds.tgtvar, + checkvals=work.checkds.checkval, + desc=No values match (ready to align), + test=NOVAL +) + +/* aligned values */ +%mp_assertscope(SNAPSHOT) +data work.finalds; + set work.rawds; + %mp_aligndecimal(tgtvar,width=4) +run; +%mp_assertscope(COMPARE) + +%mp_assertcolvals(work.finalds.tgtvar, + checkvals=work.checkds.checkval, + desc=All values match (aligned), + test=ALLVALS +) diff --git a/tests/base/mp_loadformat.test.sas b/tests/base/mp_loadformat.test.sas index 9c9be6d..9925784 100644 --- a/tests/base/mp_loadformat.test.sas +++ b/tests/base/mp_loadformat.test.sas @@ -1,9 +1,11 @@ /** @file @brief Testing mp_loadformat.sas macro + @details first test regular formats, then informats

SAS Macros

@li mddl_dc_difftable.sas + @li mp_aligndecimal.sas @li mp_loadformat.sas @li mp_assert.sas @li mp_assertscope.sas @@ -15,8 +17,10 @@ libname perm (work); %mddl_dc_difftable(libds=perm.audit) +/* set up regular formats */ data work.loadfmts; - length fmtname $32; + /* matching start / end lengths (to baseds) are important */ + length fmtname $32 start end $10000; eexcl='Y'; type='N'; do i=1 to 100; @@ -24,7 +28,9 @@ data work.loadfmts; do j=1 to 100; start=cats(j); end=cats(j+1); - label= cats('Dummy ',start); + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) + label= cats('Numeric Format ',start); output; end; end; @@ -42,6 +48,8 @@ data work.stagedata; else if _n_<350 then do; start=cats(_n_); end=cats(_n_+1); + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) label='newval'!!cats(_N_); end; else stop; @@ -91,3 +99,118 @@ run; desc=Test 1 - diffs were found, outds=work.test_results ) + +/* set up a mix of formats */ +data work.loadfmts2; + length fmtname $32 start end $10000; + eexcl='Y'; + type='J'; + do i=1 to 3; + fmtname=cats('SASJS_CI_',i,'X'); + do j=1 to 4; + start=cats(j); + end=start; + label= cats('Char INFORMAT ',start); + output; + end; + end; + type='I'; + do i=1 to 3; + fmtname=cats('SASJS_NI_',i,'X'); + do j=1 to 4; + start=cats(j); + end=cats(j+1); + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) + label= cats(ranuni(0)); + output; + end; + end; + type='N'; + do i=1 to 3; + fmtname=cats('SASJS_NF_',i,'X'); + do j=1 to 4; + start=cats(j); + end=cats(j+1); + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) + label= cats('Numeric Format ',start); + output; + end; + end; + type='C'; + do i=1 to 3; + fmtname=cats('SASJS_CF_',i,'X'); + do j=1 to 4; + start=cats(j); + end=start; + label= cats('Char Format ',start); + output; + end; + end; + drop i j; +run; +proc format cntlin=work.loadfmts2 library=perm.testcat2; +run; + +/* make some test data */ +data work.stagedata2; + set work.loadfmts2; + where type in ('I','J'); + eexcl='Y'; + if type='I' then do; + i+1; + if i<3 then deleteme='Yes'; + else if i<7 then label= cats(ranuni(0)*100); + else if i<12 then do; + /* new values */ + z=ranuni(0)*1000000; + start=cats(z); + end=cats(z+1); + %mp_aligndecimal(start,width=16) + %mp_aligndecimal(end,width=16) + label= cats(ranuni(0)*100); + end; + if i<12 then output; + end; + else do; + j+1; + if j<3 then deleteme='Yes'; + else if j<7 then label= cats(ranuni(0)*100); + else if j<12 then do; + start= cats("NEWVAL",start); + end=start; + label= "NEWVAL "||cats(ranuni(0)*100); + end; + if j<12 then output; + end; + +run; + +%mp_loadformat(perm.testcat2 + ,work.stagedata2 + ,loadtarget=YES + ,auditlibds=perm.audit + ,locklibds=0 + ,delete_col=deleteme + ,outds_add=add_test2 + ,outds_del=del_test2 + ,outds_mod=mod_test2 + ,mdebug=1 +) + +%mp_assert( + iftrue=(%mf_nobs(del_test2)=4), + desc=Test 2 - delete obs, + outds=work.test_results +) +%mp_assert( + iftrue=(%mf_nobs(mod_test2)=8), + desc=Test 2 - mod obs, + outds=work.test_results +) +%mp_assert( + iftrue=(%mf_nobs(add_test2)=10), + desc=Test 2 - add obs, + outds=work.test_results +)