From 34fef124a1cb0e0fadd17979efbef18cbd5f4b23 Mon Sep 17 00:00:00 2001 From: Venelin Bakalov Date: Wed, 10 Apr 2024 09:40:46 +0300 Subject: [PATCH 1/6] IAC-807 - Add missing safety checks that sometimes resulted in failing to generate actions.pb file --- .../request/collection/WorkspaceCollection.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts b/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts index 64edabd6..28ac4459 100644 --- a/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts +++ b/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts @@ -3,14 +3,9 @@ * SPDX-License-Identifier: MIT */ -import * as path from "path" import * as os from "os" +import * as path from "path" -import { parse } from "comment-parser" -import * as protobuf from "protobufjs" -import { v4 as uuidv4 } from "uuid" -import * as fs from "fs-extra" -import * as _ from "lodash" import { ActionParameters, AutoWire, @@ -20,11 +15,16 @@ import { PomFile, WorkspaceFolder } from "@vmware/vrdt-common" +import { parse } from "comment-parser" +import * as fs from "fs-extra" +import * as _ from "lodash" +import * as protobuf from "protobufjs" +import { v4 as uuidv4 } from "uuid" import { FileChangeType } from "vscode-languageserver" +import { ActionsPackProto, Timeout } from "../../../constants" import { Environment, FileChangeEventParams, HintLookup, WorkspaceFilesWatcher } from "../../core" import { FileSavedEventParams, WorkspaceDocumentWatcher } from "../../core/WorkspaceDocumentWatcher" -import { ActionsPackProto, Timeout } from "../../../constants" @AutoWire export class WorkspaceCollection { @@ -145,12 +145,12 @@ export class WorkspaceCollection { .replace(/[\/\\]$/, "") // remove trailing slash or backslash .replace(/[\/\\]/g, ".") // replace remaining slashes or backslashes with dots - parsedActions[0].tags.forEach(tag => { + parsedActions[0]?.tags.forEach(tag => { if (tag.tag === "param") { const actionParams: ActionParameters = { name: tag.name, type: tag.type, - description: tag.description + description: tag?.description } parameters.push(actionParams) } @@ -164,7 +164,7 @@ export class WorkspaceCollection { name: actionName, moduleName: moduleName, returnType: returnType, - description: parsedActions[0].description, + description: parsedActions[0]?.description, parameters: parameters } actions.push(actionObj) From 796a7f0e4def73ddb253665887c5b7135427c095 Mon Sep 17 00:00:00 2001 From: Venelin Bakalov Date: Wed, 10 Apr 2024 09:41:06 +0300 Subject: [PATCH 2/6] IAC-807 - Add hinting for all plugin objects --- .../request/collection/ServerCollection.ts | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts index 21304fc5..a15f5e01 100644 --- a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts +++ b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts @@ -3,14 +3,14 @@ * SPDX-License-Identifier: MIT */ -import { CancellationToken } from "vscode-languageserver" import { AutoWire, HintAction, HintModule, HintPlugin, Logger, sleep, VroRestClient } from "@vmware/vrdt-common" +import { CancellationToken } from "vscode-languageserver" +import { Timeout } from "../../../constants" +import { vmw } from "../../../proto" import { remote } from "../../../public" import { ConnectionLocator, Environment, HintLookup, Settings } from "../../core" import { WorkspaceCollection } from "./WorkspaceCollection" -import { vmw } from "../../../proto" -import { Timeout } from "../../../constants" @AutoWire export class CollectionStatus { @@ -141,6 +141,13 @@ export class ServerCollection { }) } + /** + * Collect all vRO Scripting API (Plugin) objects like VcPlugin, ActiveDirectory, etc. + * Function is asynchronous and usually take 5-10 mins since the full list of plugin details + * is huge (approximately 370 000 lines of JSON definitions) + * + * @returns vmw.pscoe.hints.IClass[] + */ async getVroObjects() { this.logger.info("Collecting vRO objects...") @@ -164,9 +171,14 @@ export class ServerCollection { } const parsedLink = link[0].substring(9).toString() // always retrieve and parse the first occurrence const pluginDetails = await this.restClient.getPluginDetails(parsedLink) + for (const pluginObject of pluginDetails["objects"]) { const object: vmw.pscoe.hints.IClass = { - name: pluginObject["name"] + name: pluginObject["name"], + description: pluginObject["description"], + constructors: pluginObject["constructors"], + properties: pluginObject["attributes"], + methods: pluginObject["methods"] } allObjects.push(object) } From e1747587082334affbdcb45b3feb008173ed532b Mon Sep 17 00:00:00 2001 From: Venelin Bakalov Date: Wed, 10 Apr 2024 10:58:32 +0300 Subject: [PATCH 3/6] IAC-807 - Update documentation and samples --- .../request/collection/ServerCollection.ts | 2 +- wiki/Using-the-VS-Code-Extension.md | 22 ++++++++++++++++++ wiki/images/js-code-hinting.png | Bin 0 -> 56384 bytes wiki/images/js-plugin-hinting.png | Bin 0 -> 20041 bytes 4 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 wiki/images/js-code-hinting.png create mode 100644 wiki/images/js-plugin-hinting.png diff --git a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts index a15f5e01..ba6fc60a 100644 --- a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts +++ b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts @@ -143,7 +143,7 @@ export class ServerCollection { /** * Collect all vRO Scripting API (Plugin) objects like VcPlugin, ActiveDirectory, etc. - * Function is asynchronous and usually take 5-10 mins since the full list of plugin details + * Function is asynchronous and usually takes approximately 10 mins since the full list of plugin details * is huge (approximately 370 000 lines of JSON definitions) * * @returns vmw.pscoe.hints.IClass[] diff --git a/wiki/Using-the-VS-Code-Extension.md b/wiki/Using-the-VS-Code-Extension.md index af4afb9e..fd85de07 100644 --- a/wiki/Using-the-VS-Code-Extension.md +++ b/wiki/Using-the-VS-Code-Extension.md @@ -96,3 +96,25 @@ The `vrdev.tasks.exclude` setting can be used to _exclude_ certain projects from "my.example.library:util" // Exclude util library (:) ] ``` + +#### Display Hints in Java Script Projects + +The VS Code plugin supports displaying action hints for modules and actions that are present in vRO along with the modules and actions that are part of the currently opened project. If you type: + +```javascript +System.getModule("com.module.path."). +``` + +or + +```javascript +Class.load("com.module.path."). +``` + +a list of hints with modules available on vRO and in locally opened projects would be presented as list, furthermore methods and parameters would be also present as hints, as shown in the example below: + +./images/js-code-hinting.png + +The hinting functionality also supports displaying hints for constructors, methods and attributes of all Scripting API (vRO plugin) objects available on the vRO server, as shown in the example below: + +./images/js-plugin-hinting.png diff --git a/wiki/images/js-code-hinting.png b/wiki/images/js-code-hinting.png new file mode 100644 index 0000000000000000000000000000000000000000..bfeb50923dcc4b7a42594ab4e4850760638b0f70 GIT binary patch literal 56384 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
g@0863r$4I(KUjd|HE{2>)c#t2e&V!uykpP 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

P7#x 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 literal 0 HcmV?d00001 diff --git a/wiki/images/js-plugin-hinting.png b/wiki/images/js-plugin-hinting.png new file mode 100644 index 0000000000000000000000000000000000000000..c52765d73a3ea0cb9cd72238b1ea80a05a22657d GIT binary patch literal 20041 zcmb5W1yEeu(gunpI0SbO!9BPJm*DOe+}$-uf+o1T53a!p?moB%9~=g^H#s@y-gEy~ z^{O6K!``!(_mbUT_t*1PNkIw~i4X}23JO(5T3iJR3I+hV|AO!u^1rJsPXuy-c2SWM zg{mAUK7f2NG1HPUmzRg4hukATL5EvG!Trtx`4B=rP*8AjVNmdpD<s;RS?nZ1jpgDVwnU?HU7oRylEtCsvnK2rxf zX5&u|CT7f@c8FVmp$HL;_;lb>|!R+8{!NSJN z%ge&b&ce>l1j)hV;$`n@?8#*BLiMMTf9er8b1`+ca&)zFuqXdrud#`Po2wutpiVFOG%BN)IX=bY}Ze<4%52OttHV!U< zzw-aTQvTcGze;NTwX(lH*PCKQwil#KWXHBac{On6^x_4$4>X=#VIB1lZ&HBqSu ztv7J5UMY(!bp=;xy?OI9m_)h8m;4J-1cEfq8>JSoLBUN3E{u${Lr9lLcI&A547bzI zw;4SS9_IGx{4dn46B#}ynV8%Ox%dmcU$NLe4Sq9mq;^IW6+u9NrXYt434HSg=5$qQzvJ{RJ%buUbXB zK6Y8xcEdnNR;SO(F;jaUvbPWt`o!m7fr`RL7I>DC`iS|J847MHsGB zBXxnPLG}N6{x}aOUj96v9hmVyb4V@)L#g2+PDSt^Y5o?}3nygdyj;(js?~ESS~A-5c$eU*q8=qs(iHw=l0_ z|J{A15=1SM*N*yvl5UHj&p(Ry<{bg|guxS%DJ)0M;u#92E$8?C{qJ1-omTJGU!IdC z&iu}P!k1`P8Du3tj&e-oh=0YrSFbUVh$802%+1YhF_4u-dcNBu`Uw^9m;z{4J!&v0dG*^|=&bqO=rihk@&=_&DcO5TrUu*Zjiran#J|I-_wG3KyByGIi;XAKx2p4kt34Pl}{N?HWTadTR0C%=YavdiU~KD!GK89n4Ji@{#B3l3Kp}07!q$HEUeFC>D>7) zd*k;h!Qf?wPKgSghI;r!%I{+9Va+Wq-4hdvJ{H+NC%hlC1QrK}oro|ogNx+TgV!_( z+Y6FJzxm}_%=h%bI<%dKG5hR}61e!-EjLPpqmgu7YA*%9LY^#EBolZzs%tq3gobrI zn5G_~9f$$Wi~4`UAR}{N4*1oJ=;w!w$NZjSH(Ju1 z-~C7{Y~rm;2Ql)0w%i<6wN81`m6IyWEX911O(OwpEJ*BpJ96d?Y3egowoM^r#=*hC zSD%w+_<)zErj7{t^pCmdc1!hB19j$O-QOt0&K@r(K8x;!;u(n8+S(>DbhsZA($+F= z@z!Ctq<+iDDBqH&E4KuLPF9*P&6&Y>p!uq*S5%>lrmETltPy~ppW!Xe`J5N4*8Lw) zp`oF*I(&J#Y!{4T(m6r9^@Y{x92RH_nS7yZ?LPT($;?K2N1Zh*_hJ~UW$FyyE<5}l zM4;C?0|NY7`lE?V&wurKf=Y|K(h*NC`(zY$h7)J997p_})QomVQ%m%k*^`*{Bc}4D z4!^zfcW2Nj@1n`}HDOkW`E)^Q|Lbw5MMNj0ISjZRuc)6+5%)n{HWvJty z9nK#Fd1Y{NFVtCMcf91WxWBmIu1_qa=q8%P4^RX|5H7X29fBu2K7W>( zg~;v3^J0jG&31uRt;&ETN);6eiQSN2!Z?;xP^rV$i^+4{`;f`S;DbBu8#=v%gMx2F zoYrbd=KDLSC@7NR{U ztia(!-2c8R?`7K=3v{nP_?cTpBG{&SWhee8M% zfOZ`0oELkCp;4E{LYa@r>I7QHzml~`VARg*%49&o;Z+UTpUnLd6El~^<-LNE@0qVP zHdLljQPzicsH&GluTEc_r%^aFBAw5Z4=hm@bExpkzs)PjcftwImx|Rf~&{T!W3?cML|I!))*fj zFJ#VGSXajp{Q2|P9k%BCBIRnG-Be^8$M9Sv@WS*yFZld?>H&{guM46WIX&JwF~!hL z5?C93Y?%q2C3>*q#Tb*`<7yHZaqjP^s;XKm+-vzXbOaBNKa!S|WUe-)d);h4mWD6v z--g=+wyn}{)j(gag9_#9;Y2ajg6*>~H(d~O?*~$Zp_8Glg*Z~fv;F5p-dM*Pd`=b$ zcb_o$5sZwN?{?BWNqd&kXzGA)P0SO%ouJnKvI<7EoG@fW1Z0EDB}%@#bVT{R0ZYj`PxV-C&9;+A$H9A8p|3>gv^Y?np9=O>B{Jc6`G^ zxT5frnvX>1J&1wo(9l6uRrP!`oD7t_V`_)0Jp8_c7Osw?--*3H9;=r5uN9KY9 z?XBho8<)*#PiF#9D-AaEzmteG-pZ)O`R^iCAU8B=ux~{_>%zhUFScAi;R+Oy@Vg-% zx5i4P@=<~L%E3hn_h7_K51KY7M23Dr_UGAY1Fsz%!Je!;cXxMh+zyHo=L-a#xjj~) zEvnP@8v`aK-uz6`9>|fqFQW@)b&g9eluu#(fF8>cmcW+&o+|9RINN{vYLWC|r1ADw z0gJs$UB<3Q&W@It+0z%zdM)B+{Z{>v{qdmcdyh#-K4z+Cz#oEhmO+l zQ-WgIcl`w%NrkjKj)LuDpC+igEyGv~MYuHVjMl9(68eUW^~`c~8m#%o&fXn6;Da?AAg2stH7baynC@fLbfmM_yBcwsEFy zaaivNy>J46ADv$FTPzWE*90b8RZ0d8-Krop97Xk96LH(m)@@H@@+a$Kq!&$Hj<^uQ zEEYxYP2%^_^}HGELXaEGwd{x^2pCP#^)7pfCdiwU3@~{qVo=fiThSKzPHj{dsKRWs z12Ty)WvqQ~uRK7YONfteIWy-HkzPQPWD+UI=`@WskJL`GySwYouModU3|4UQ)6`u) z#$IVWX|1P$`=f^C{J^MA)nc+YiU3`)`X_O$9_;8f+7j@5mHYTFwO%4oqy`I+6dw=) z3cql;msiZ+nJGPSC4C7itN;yL7%{|6|E>0}e1*H<{0UNkdppngcN2dhm9upWT8%9A zeya$?pl;Ew6s^9UmLGAScdTE97RFAa|Fg4RLyy1O6brHyoandg%vm;})<8!3074AX zl?W7V7=Ey@SHGOD{6`BR!s7Y7!A7eVtlkY}`-mauBH9%PC0J(ikJ=i68Pt8fZ01r! znD{Mfzjr$ioGNV?+QmdgF80!dQt|%p4mN!eF@89%u`kKtKpuK~Q7f3s#VyA+xTwo}doV zlbuvQI+isODW=~Ag-`UFTy7##FnHgeEtdMs}pFXu2C7 zjhAlCdb(7VrOP6_DG#pF$QtO|2XGyKe*f-|3?Z*ax3TX=DA}!qf@!m}Ccq0DetAI| z%gKp=jpr8invKGN_w$qco|_DCAzcCDIbKW-VEgRnu8@UZwK^>~=jxGf9{V3ZzOK3N zu^D@_e;7e!VR}Bi-M;VPUoueqr$ zrCdwDaE9k6YPHAN5y)V}gobvpOaSM&jf;EY*^Zi2ckSC>q{#_29QzvTi9BtmjWeHp z;R6yb9lN9gQhuE*&tHhcs_!my=I(kg9;-1O!YShU90|JExOVZlQF&cBWBO}3ct@6%{G|P}p>^=JFb~YFy zrhQ@WAu8b@)#hvHHM)usqfg<~^ZQ^KIGqB)G^3DxaF)b2CJZC!$3{92`=vR8Bfs+S!jOHQ`{NqA_9YKhN+ewp9FU`XKvheffYW&5AaoEvM+2+ zWpUV;FrgVDFJv($z+Bp^o78g$pV3naPn!>{JUYe;`kaDOwQ2k9p!Nid^28v1(12n>FAEhPi8JJ!2<*VLiXcDG1Q;hFL`{Zaf9gJZZxcG7+q}| z39S5hmt{8(=LXB}{oejCacC$+gyL-%zv(<47v+x5{X$6lJ^K-`jWNu<3@U87jqmWS zdq&LXrySIKBomsZv2)pX9oQitX!|9OE@RNv-qsn&!^i1r$xW{HuES&Oe>Zk`FEP^Aj)EKP2;m==C+Cl1V%FliI z`SXR60H=Lxv*7x)LdvzbOZlP?B35!n@4ztCGWjGHHSlXsg4A_1*~^r!#;vQ7*!z-S zU)yQ&->9|MKYuW59~xng7-BKBjMBkb;SA4Jy*_ZED_HcVxTUK1wS-+!okw;DWq`}- z$y(8qOoUeF;4*d2dV9y`^$~c5hxX!`6&E+|q%-mCRxL{1;HQhM=M=s*W_eq#2k;E4-7ova3(d#* zT+bg^OgNnEJ{yo9Ko;G9liK#JMVVo(vh1{sMmMpiHh_{N!Tfe)i)nZ>=yf5)pz~_I z0vYI+IotVqnC_>ggC?f1ur3h|a2=QpPwBSEy_?0=^z*cvo3y-y*AY9v^FG~~*({uw zpV@|OELa|P^-Sy1`HP~0SWiUdQaYcve|0nJiKE)*fbg)Jo7tUDkLw_0g5k6NJA%I3 zN)RdNloMK*9v36RL81SY{5g8vu=BkrC3_5-TlrQf&8*wH(u@C^E8?<3AIRJpWMf1? z(^k~6JmSMkE<}y$FpkU>Fc1aOLFDw!WOH1q$!LkA$lO~9VE$kQa6LV52R$5S@f9lT zc-7MVvaoB7+Igtj$P8!Lnhb?g`ZnWPsX9y~=wUIH0Z#WvPK1_uM$1bG6vQU16hc8~ z^lONHuJQ6XzklSUEDY@;5e>`|LXzXYdNs^agSDk&WW+Dr*2DuRY=<-hWBp5&(=|2Y z*IQII;>yl9-$O_SD#_KqX7MEooP8P?mb~sf2iTP?1{E!*qHa(f^l zOzIP%R-;N7M2=N}?xSF$Uvnic{UxIcoHXH8q{&qH4m!}0MOO8;*LHBt=CjlT$_027 z6zPX|VmcY3+Lw=9jxDc#h}=kO@cUK}_LvVukIudsBic_dTszfNY)bv+i|X*?+ohK* zT=vPfZB5N^ss6@WO_Juy^u4ZMb3pYrN?DRi_bJOf$NY%h-m*U@7=3)hFvjMmmGd8U&*X&|gQu|+@dlL?C*Q2oR2SS8nj^qrf)$kvdK6(WY zytt8S;vm=jlGqsR6IZ)-QhAYD0f!0}*{i7nZ-R{L8V&lFk;TC4FFt}W(Vx_m#SZm} zyiB*w@jtHn%B&)!)zz-%4ti@ok!7^7p`e$(IDjK?d!KoU(DB0K_LW8$#IAmlz@FuR zCbk=L?@u47sEe!&%U+t`S>95LuKFt5zO?avMC`zxz4m~17$txo?;N@=6ZCNF8F_iY z){qj#N~~j$MR(x<2Wn_Mt0L8H&Lvcf*w9u(-I-Ny%Y&0m6w0tokHADFro-=R9Zp$CjRvw&7gu9t$VqFQV>5Bbj zL|dLHN}bg2`zLNxva|>TY;@MKL43Ig9oom*W5-JZnexJ-EbGg9KV7@)=+$zTx$B&G zxjyu@{@B$}zX<6fk=xi`*wqOXyxoC5_S<@cE67-wAoZ)y2ZnWf9?PqifY(j9r2#BO za21MEB~G}de5igsSeM25YVO&E0KEw*FdH*Dj15iWsgYdZ-7AjyOo@1F15Xk8?UrIE z-eXSvwkw$3&Q;0Csis6D0TT0jr(Ev(vTOh-ou)&BGJ&oBQ0<}KuQ>0#S04SuW|+bE zQIt3-V1d+3fcS&44Z%&zgE;nDMx)`pi@LCD{~2*rtNbdvEL4$k*KMXZ0J)Sq!ou4F zg(K{>4@0cHS}@XArJlTcpM-&s><dM=EprFY!Qb`vKs~fRtL>wgENV0ri7( zDBW8N3&-+{^5mbNWf`YbcRf`R2<9g)W)cEx``up;0x9li=6tclxt;4 zXkurJ6@OWX4-s{qr>c<5R|6ex>cCc72c}oe##D)ua&2kn{S}!=%9HUD0RlxD!?+l^}dpOtjld9}(qMn$!xsa8G?0-h}8_l|U+h@KzCwE^I zoTWix(W>tk07y^J@n=qR%D7O7_fY0c{{pNfeV1IH-%ckv_Tgz^y0XYj7*1QwSf(>H zkO|T8ON^mGXSPj&0#)OO#U*W_>(we2+F^)|d#N4@L(;4DPQD2YTWr??#@y z_qkoPd6}2sa8JK>9ippst#Y>~f|I8Eugl8X&5=FA4;Om5fE>>O0y$xU6>MR+j&MPw zB5O*hnqoU`h~t)FE5j*it5a$_-`hG3td3VXFESIG+yEE5c0$G={+WEByrqJ>L1>3- z*g`#gvzj-K*e0o=^dtTB=Y2{lVVGKBczO{soZ%Sw zc65EaP%0({IZD7)eQ|5}&=ql}YuRlvmE6WWY3FXmfsncdQB~#90$rin#-GzJ2 zVB8}9l%tfQMp8o(31r0xZ!`g}`WkTMsOI2GCg;VUZ}1bSCOpT6LR~3yD`BU!Ih7U(+@?me9naynTSa;8+ImIs zMc~Qt7j-yzGQ(5jGeu`fgMJ{{C2Y+>^f^9O=wTCh?hkHvHMa#h4{{?Ph_LxGdOf86@BZ zah#F+z!(A+dd0}NrI0zB0}TTsfyr|%-=o2JMm-+xW`;wQoNB0?GkPS)4Fk1y?d66G z7R>3r27Bhux3{UU3Fb6+J~8Teky#w)`t1$1+%H_%jo;TLh3mXw52|}2Q;IJlEajOg zK1HA1gpvHv-!k1VppJf8%A*nnHOW7`$ua)Eh=x<)E9Z%!23zI(2$Q9^oOFkK#!TQd z($Mm$fXvj9Wlo%BUjI!eCVxPQBkTyLxl38&vsQf?!mq#&$4~WA4f^s`j0U4uvaZty zmwi~kjVgaep6{kjX{>!@W@t|wF=x@t2j>oLk_y2Gc>=V=&-jPVTFmWRONf(|UV`dc=U}d~4=W_g zhBS6oW=yM)W|g4n6|^=Zw7Ru-?6Ho?yRp?XYgKMJ}Vy@m)9+AJ&k$u_$`JXyV_RNjMG~@39sdxhG124AwLb0`!ROyYz}M(X zMCAc1n))ucb`ryxs#&dfE}>xOW={y4NbCZ ztb2S5eLwX93@#6-tBF{bLs#C2HCv~Xa=p7WY@Dt!z45b;Xa{};MH@5@4bPY?m~pP) z7bGpRo7hIXF5)`CfY~q1cpvp98Lri_5}5&rF^vz26H8dnBu==UW{l=@Dqh8BlHUSM zv8$Sf@yXJb>7i05M!p(sE}n6C@sT(|91A9>y8dWw-^V7JIc^Hc2Oe#IbPpDTd?L9i z?rQ8lXHM3dJtxbLPVio+&J~$(3ez;YX=4By-_aj028)>2c!TPaynjU6CF55M&8s?Q zsuSX!R$ljC6OX9upCfZn&TSWt*5sga(E0-In{x{=7cFMvYiOD6jCb0I6E_;Ug}b_N z?RJ5$w?6WY2C$~{Os{~ZFV&l)@(pC)wK{`)ofi_E!t`qU3G=0`)TZPI(pFE%xNPoe z%plfHT0%I__%%cMqfaF;J!2O(q4MSCBo>3GI5J)kb7T2CCBJQVL6^BSq<%htS6``< z`SUSXgsJKNTGAd@=&O~r!%f2PBF_^;+T9NmJH)!9g{Bt|x9Vt-_QILM=wF!b?%Z!(A=JB_m@mHe007Ge$!{Gu*LSj+OqiulJas#JmiaeH^|xXh8D z{@m{LFkN3{Ehkx16og+^H5^U2@;QUprfT&Tl9XX*yBC^XprN(-C=o?B(5N7c2prwd z@`|Cq3Y*G)y*9kU7bDap(DI%H4=RyrYAPC+6_YY)VMkA38x~de$uaq_=7tHZHPiZs zO92@+>5pLMT(I?kXL_<^rTCw;j$|| zn#+wiXwQGIsWRao7R9&JKwy?SSyOsX2%=2t@}OfI)orkMo2EbuS9unNJ{n~GK#dRR z_v~PBZW=kIOMm#WZ%N#-N)V0tBWQx}E-$qcD^Ds-lHsva;5$`|M^e^6Tf3&?2SKLN zHt)8*tq*ISr$3RZHDf<89h;!zUEPi!MR}1bEbbBP^lYit>}t&w(~%&^_YO+zRV#m; z7Wr)!ZDPsl1Q0*-yopxS2&1pE&a=-ODKNb!*vl4BgGPR74(z&Bmmmx z(msX)YqLa#Ns zY@vq6^h*!256Q2An>)Wg+2PR9z@5;-xKl&%Q@_JfaoE`Nn@VZpKmxXru$EPDGxrwe z?qyu=tIv~cC0dS+JPTojkGlydYYVRXpFh+3HglnPsJltgBwjm2v*mDjNai?PvhNm| z#LrAx{ZhUve>n6kQYWzG!-+Mfw9D>6cGTwtjlYY-TfNN|s4(451=qG=6Kn04wuThZO60%9N@HYrvs; z+qglq^$DKGyUNZG#Y8Rhl5PZ?C6RP~4`%;|V{RrTK|#S9Yao5yo)+FW?muS*Ef~%g zWbj4dWB;%Afip{`W6^-k=?@fVhFAz`&V+`xUwc_%;f&6)aFmu7Ne_dux_Cy(ZVD6w zhbyuDN|{5*XT-;7HuH(QX!>6FdAw={J?u~gR> zXkd@sp^c*vB>nOZN8k0_X_#YpD<`6|glr@4P}xYs*N5f4jAv#BgRVu7$&lu;Em{;; z>&4p6mQY73QlnAk6i^uLRW0BjQ2BaSSQnP+lp9fH_f#l7P+4v~S3M^k_eYE@@l2(m zCUgsTh40-3K93{$(a}-V+eIYkzfKGcawF9VQ0)`V&s(57Cp}IOgsp%S^pYe}f`sV# zBZ(+W8#{uX+5HE8cGzCJ_pg_h+uYsWcrSNm8N}HnL*iM=Z=nZ?1y1;@xYr{3EI)XY zdQmvvJ1p?x*o)}?IF0ZpIIyTn2`P5U@Y2;qR9VV<(geHfIufUq$|%2&utht()WcEN zg04`<(InA$L+GL&3R6&}Hdz$WI=+`4kK{xSE5~05=Q!LzL_d+R)b8V9yHE`cVbO%8 zrxQWk#xce{VcHts{r;Y}ZMcga?e;e$;gM5CJC342p;#un>ucEkVCQSJix0DV@@!?QEyYuT(jTOd zV<+g1GUZaoe^Oi@jVc5EB)t@yLJL@e)K7}YPi98p13EPZ9`7alV$HcmhO`@e<%8qn z8%dQYkdAIBcX;g#7S+SWS+5hVl)o1FlOoE^jU_5mz$ESFybCw8D1WKA_{ILX(bLJC z66xvbxe-q0FQTP|4`GIc->mtd!=n+i?v4EI{loT$xl>8}2T%Y&H(Qiv3)MZjn>>WL zU&GU9+2cMzJX9jga0b=}gku2+{mc!cs-H{M zTOlN^{@gi7G6JbTzPUotlOkYva{#TU@C`okCDn0IXRvM{y=l2Mk!YfNP9fyY} zXTq0stl;>~A)Udb)@H8q@zI^JfiY6W(&|?chSwI!NXR*M>m4L}9WSJ!OYd=xTri>ek3L=D<#GM!QqXa0}rd@q>YvX%~%6e1C zP}+3*pvLBYZqn+^lLN=|(5ETEIciuDMMVf`{9z6K%FI`maE>$;cH`mg&a4)d22a#M!*%Fnm&U3aD!T4#N@3#9{D zLN8`CNo3}H7Z|q8Uvtczml>LjWjVxy%sQ5eto=(-5Hxg*CIwwvrkvT3^M+Op7} zr`cDnYD!IdKN`C%dmRf1^W!@_ISEyna19B&PPsB&-WUuuwnI3cJ*%sNJ%^bdYeS9Y zW|XO90-kR;%tyN{vi;0c6U|<3)&m9-=u~S9h zi>AM&e9QjYYQD;Xjsc>2E6}iBMXP^_mhK(Y7MubHfwUc2kH;1TF+8XdRl_PLN#_|u zZNE9{KlzPk@@x8>vU7XTQ%VRECLRQk#;{qSw-2CO2-`+M-uz=${R+$0Cwval@P<@F zZSu+W!#?G34j*im} zGQ9c&Xu8B9Ns<%pEC5XR)e_q#Qtcln#rtw~9RQQxa==9%9+tPwvyKj&CL*jVm7 z9w!;&3JMDSt*0H4W$J*m%PM^iFV5_MXRmsPb%W%?sr+#Jtw@#**0jF<_#&c7F7?%V zOVpV6UY?n9iQ-mxK5nYk%+_nhJW!W4rMn}U+lj(=T-ss+nfbvD<-zy2d)-2{s zFVaRfrzdJPlFL~CW8UO*4jI|@7@7c~(h;V*HzW4;_Oyl_ZFf5dR!ET%k&!)+UY4ZJ zSLze3`(8%3Y)T7TgpKPE7Zer!8slD{z0zs2kM?`G*4~DBEI)1DBRw8#e>iEa@i<*W zxq~bn;orKT!0pE8meH5z8{y0ecd1y?=+~%(`(XRkmLL<|zqmR|Y6#oU0Fxc{vmk+0 z!nrO`&riN0PI@-PF+f67Z6h`oj0Z0Cb9+?Q4gQLs-kI0SdX4X}eZkuz(EP=z`{t#8 zXAf|MAb(e=D9bbPLA88;44~V@jLW1`5S~ouNULI%?SD_llkf;3^={4^2K2RgU7kU% z2W=4M*2Zs&)&qn^%L(CxezwT+k|evdJ9diac9ZrI&TKqSkZDUp#&#?gLq$L0&xRU# z1I@*$j5w~S5z;-8kKMuzo?Ba?@#ia*w6M>qZK6t3b7af@{@}|?r<_q9vVHx{Q$J?& z72SNLX@F&(eP>%T>}$Ye(7L-+p0~CI>!;1n!Ymub6`Q+_3LyYvFLnRfIF}sOs_o;z zFP`x^78F3@*JA?F!f4|87F*L0#4)1haRmbEB&eiZn612xBH_nP=d$aD&?0|M>>W3) zzaH5&JDjVSaeJqj6$PQvZcPZkyw_~@y<_KdKl-9kp<_If#FUe=gBo7Q)@B5O-z~(; z))2b%c+pJ;rTg{KB9HGaD=CBk4(P2jTmFN-Z&?tv1b@;uDV(TdRjz4+xivc0@YF|= zG}eHhJxzvTNIHkBp?(t#*)biR-9+Ypj!iaNkUU;(8ASP+2-(vbYqXlZLP=kPE%aMu z*BIQTWoO51^*HTE7k&&R83`-guSEge%T3`p`2u?ES$C%O;rLOj{Dd zi|aDedJ{u3Eik(rL!c{$LGw{07_zQ>#?xCtyQ=W&uCD}hGZuhm(`>$z6)?f-nYH$X z-^w&JjS$3gFk24|0TrV0m3dPOu(xJXZ?jqf84zYbIk5^+h5EWBcAKukz~NKXy#DNR zF3A(?qd`EsLz|OyC#2*36vV{D;OFj8WH&~~VuegFn*$uJz`@<<*j$xiY&fYm0@!uN z^Rw|n9JL&nxqZJ_FidF01o_h-!N{Eyir31eyK;T7ipoO-kfKXWlX1PzjMZ*IF zQ^iR?iHjRS_|SZrSiwB7f-K7c6d31p^FLEx+KaPh z`!q?v&aKJu6ET)@=BN|+-p;?;k#L(_Q?7iE>D-5Hes-3yMbLs*_Rbv0n0%??c?Fxn z=Aro3oz_@x84z;Vm!kF_upO+_Q20vSSwdzfw^FBHnJgQH`>Tha<7IUB3aivZIjlm4 zK+>xC5WdT{sI^~3S zSdmn9AS&c}H!=(U(4u`bj|P>?)0n4v#E{yKSz$7}fDjJ+tYb4<&9KB(GHzwqC<7qZ zMQ-a%AlhqDd*a<1e)BCcet?c}mjtrR7O@=sd`NnHsa=?tId0j!nk}FZc*ViQ&^M$R z%XK|h( zb9^=j98l*&W`w?A^iAtJ6IS_q5{QFE8_{u4m}LYIRaM0Tq4dX|Zw+kSo^N?;Em+0} z7b#{7@hO}`Y$JTBd0$DndNMLIe|49Y?~4J$r73DSeMP`M=- z(aYAsDjn=B;);%WQZv=`LhsObf2iY~L#$$23bG~yhBqn%Cc>$6`QK&W6qK+s(EwkS z1?B?@ihm;Nhbd1^!}6Oidig0R_?8{pU;?CAsEr+$opsb^81$sRE5GgT7A-`9dH zUJMluib&hNnDbXx8lUOIu8+ryZXf3HGStxphrDXjr_kmVGKB*=VvGx$T#uI;ESDQA zzE?Cw37Yw`_3->iqOTAON8>BHU8pf#Xm+u9%|b7R08#bX+(2q1b3Z51vU(8CCsDW0 z8vP#JSMfA8HS2AyE>wEN3L)p%6n7Jj#;4RIN}^?FJUH^|2vO z>R5u$JS;|+AvF69KcOb`Y~+189od3!EHe7+hjvGQj@(*LV%G0#U|lcDw|8o%aNN$9 zYk!7BpLCy<5!A$I`(Av#9#zJlnjyr-hC|Yj+xo`Z?goC%KKC8wTipQxk&ePwSsg&S z*!H19fnu%q6KMcRPs_C@bm^cc6PfObc^w^El4$rA>y56&sGVC=ziw{kGSaMYd2 zldd_6l&5B2nNXhib_5mM?Rv%={a8|se1Sv%B5@8HdB0|^kJ%i|yr?*G#Z^kv^?8w5 zZ~JPo0p$-{@#^(Cg%$};B?1FVKo6T}WpwO$GGVn3$eXdix2!t$Yx0#{T~}%ccSZ2= z+^Fr|SHq67VYY2obGm%~3y^r5aGMp6b-yLCaY)eE{ho!j79=Ex)o$s1dkbuPxv$^j z`GB_hl?69NYYM^`|p4u>yoDvp{r`}vOZ4@4K{k`3QRPg z23y&7%Z`$e#aEXwp84nc_x+WU5)wgKT4E5D9IwbPVrRr@exvZ6wo_hW1>;9~kh2>j zqKDLSL#pQbZS^ZWJUmByA>n@SLb>Fy{QMy?JMHB7LQyd>x7L0*-jTw};|3odeU zsO#&yi09!_85xNEH3uJS<4Xn`rYb(OYDWW7PcgaQk1d4vZTxTCbToU*vTsTY%W%7C zx?tylM^_|rvAN9`Z5Kh%XbN60Ue2j+6}rzaF1klkInKc|iWbI0GMv6RuePcKcJZ}z z!Rc})tM>T=_2fyqg5Iti1D!f9Xkor;Wokodc`AQd>6P{owx4XY_FEW9Fk$*Wi_q=t z_?(3n(KF_})=*dm;J$Rm_@8=+HxC!}?Nl_&GP~7741ooOg$F|%Npf`Bs)ob=M1ayB zLE`vuuN9^5HIEPzN;iUN)*PkK&P455+I&(P zqVb!%xFNdUNM?G#fB;m`P8(ZcfTmjG;EQH^!Z2i_FnIzPVURl(VE7yMUoH*ZVL}hP zS(;3i$p)ruw20Ko)15XSy8}0*wJ@Uwl52(afv`|fQi%o{u^g*}w%)`XmpbZBGsqy9 z&XQCoCSM*=!GPvFX6x*1FoaYe^h=@(#2Uyc6?}f5p%GKtry+c4l)@ms64CMjSd8@d3XAqwxn=b zbM8hj!zHz=_ZKsw623>!3lZW6JZ<{_Kwl2cMIKM73wWVHQj`}q^Ve@rdX{(8Lew4+ z5Zaxs{x9@Yu)hIf)RP7*(8ldu-!1<1JdC~cN~)6x5(9m&YD>EFsanY6wG#V-{GVSz z1Ny9$r~_J5I_2v;+Rlj zUUk37la*w>f}dH-SjBSEjAJ$1M>=*IQyF}X=u0@g((E!eQPgC6p(c*REN%#t`3q5^ z{{KOgDt||-MzBJ9SQeYkkwH=$fD~0+mw%D;HkGZHCf$FVa%*O0G!-J+6Gxc67)kQ& zF0;pHphj;9&8OU-f8#`uF|?KTFg{|d`?2Wd?%0*f`nuO1NxjWH8bq;}SsWS~y4Su? z2WW8aUDlMp7lJS(AFjPSAxNnunx*4b6aq-LhIrc7i^|e*D}H`|ht87Cs=m}mO7Bb& z$wnOL#a#B${`#`<3*%y`6*sH98SVbq6t;LQTF3q0dvz)kyeM} zX0ZAG>1ows$IJ7BWc)udHbhv1Pnvzh@eNhl1lUD0T*p0)Gka`qTL$_Z%y)CB#yX3f zbnoDhNP;k_1E(%YKexsr3!T33Cn+vQC-ka4={&D8U)=)NH$gj5$}VJLh`8f@zYWol zz&VqtJP97pGxF=>W%vlSB?w@PSPyt1fdmPW_&;4~j;3>?2RvORj}vj2qxjz+(6ql? z%^RAIXYhLNrdoj6*5^pMy;Q^Nxdqu>x9H+MIq_&W6v7Ef7d(WZlPF+pt@AK5vda-( zkwq@G=W_3l`TZ)6-zXRxUWsnT~^Cot4AktLP4Tr$$4*s7UoogX6IMBjkZ4_qg1Lg z5OhiZC%nCp+UN=nu%aMW#XzGrw$MVRI(I6$o`mZ7o>4{P)gWrx_UaT|h91eJn~g$m&h1NfQ0x za=6k`cWgG6bHHS(v#&Gz4EX;Weo1O#s7>L3L!3=ClVt|ZJ~SaAXt)ixB#K%uxiNXe zCNAi|=-7pb8%X5Wz@Lr8NDFvq^12YMX!90u=>R&WXg!-Uxa6@PyjLYMx$5)D!qyL~ zZtmP6QL{K%POyctiK2=0>PnE1JeREB_Ca#EkU%@c1@ZD)xtqDtJi`^kfFl%c+O4D$ z)G5RZh+S0VHB6S7{`qZ5qiprbR2J~0s($oa_VUl)psA7KJwP2`&P)mk0lvNU6#pAD zL89D9%!ap_cp&y#ao=G#$K8O_QX03_M5(-no9Xe_a@MGp>aWS3-9C6Jlhk`8Fhqyw zu|;-{M-sNcr&R zMQB6?bB77Q%iD5fTiSL)_$zcDsFdD%GJL{;H5%U)%ORSh zg;niQ-O~WD9_1zL-waqv<*=x?NYL$}{b-fR@6nIU(q{D5qLuTPR`lo<_m(={JJrPG zM1x@nqn}tw?6AL=9uH`!^MjDRsyu9*DZ1zK{jQmXV7jO2_AeKsN2@0&Jf^qNE{r64 zSoR7PRPgdJ<1#~rwmNxy%FVo*F# z?Ac4(z|7arPr1|Ik0~jJOgQE%7EM|@#H;)E9(?e5vCd-aHuAB%i5&F7rVo}Tq=x{lp>rit_KUim${)v~$%>@3raTU%C& z`S_F-82o)(m@(_{KVVax$#$)yqvL{vttNgKW*H5+?ebmWX#SDwC#5PH|QE!)`2Dr$Y8_eIETkA@$Mh0^s+ zOTQLtJy3Ej@lArZUd` z+$&D@<$M0yyuA20MN3~_|I8dqVc;g-l4+ZF?%dh9eo=zVxAQX0+1+);o;uOeGe4_B z=a#llbGWy^ZTq)Bmv#y4Namap6t|B(KBG%4Hap?zmc3aY|G$3mz0Q5g>NlCDlR@KP ztHahhMMX)8=|nWlGR=;P4d;SPoC8-sae?{-t^S_BBGw@K1lc6^34o!nqeZ0s#Zg!b zUWAqD&)G-$;fb3LU7dZ%#qF08OO8W>x6{XqbCe=-8G>g)r^2GW8uo`mRn{C`vutJS z8Rf^q4}tRqyK_R!#SeCQdp5RD&J6r;sAS7Y`4P9U1?>zW!P5bhZ9s zyybGpR?j;-SzZJ#4R{K))@b$7S9@aHKVH1#>*29;mH3}}lNDz7UfsI($Kxt+((A*m zeC^V@Tzh$+%3ZU62Civ+*|b#O=|P$B1Nqv---q|#<#|#A>*a8H0bBhH?AF#kRjau9 zY78Xy^StVljQ*Z{_2K1TdpyH~Ki>JWwBqf*X*Yg6Gq!rW_vmZxTk0!e8)u=@cqX7$ z_jk3e1>s-2UPa#hmJxDMTsE7%>0ZdKXOo|Q{dRKN*T79KoHD%KS1JuXHLYUr!9o&J ztvWb@&Z*Ir?)To;C3|oo$EuvFV`ULOHmjz5Y+Af`E|=(yj^nehUp}h*NJw`z{KN!E zjVy3Nys@S`)Nj$R5Bv8&r*#GOEoeYgT=eGm6K;iqeHOG(lm$^uZt~Dx; z6jfl(LE798^uP&u(9q!hGMPjD(%+MgZMJ>z{$-lo8OcxDtcI)p8)j{PZD1F* zi<46`{Nbw?4erfZkJqltP0UZfw7cEuuwm-oJe~XXLh)br$pd#A@48w$9lHJsn&!JK zK^?i~xw2}uS6LmW{w=i85wcZ3>)fry_~Oz6t92?W3xBs*R%}YG)lE72IqJ;+>nENf zjX69p69i6Dmu>$r#cb7!?!K+e8{cJgh^>C-$9KaftD&yyYSdIU*i<{z#vDh5c*E7l zI3G`1pX6S!;@c*pwNpOrI+Yy8YX$2#K|*GOC@@D{l{RnS|9_*wLEisMR@CvZzZ1|; dRT5+R&p$h$+eyb|K_3GUc)I$ztaD0e0stm2;Qjyr literal 0 HcmV?d00001 From 7f76ca5e8d4d7521f0ee95ef7bf12054541440ca Mon Sep 17 00:00:00 2001 From: Alexander Kantchev Date: Wed, 10 Apr 2024 15:14:32 +0300 Subject: [PATCH 4/6] [Task IAC-807] Improvements in the server / workspace collections null checks Signed-off-by: Alexander Kantchev "wq --- package.json | 720 ++++++++---------- .../src/server/core/HintLookup.ts | 8 +- .../request/collection/ServerCollection.ts | 2 + .../request/collection/WorkspaceCollection.ts | 23 +- 4 files changed, 318 insertions(+), 435 deletions(-) diff --git a/package.json b/package.json index dba3843c..8b632d59 100644 --- a/package.json +++ b/package.json @@ -19,430 +19,328 @@ "npm": ">=8.0.0", "vscode": "^1.54.0" }, - "categories": [ - "Programming Languages" - ], - "keywords": [ - "vRealize", - "vRO", - "vRA" - ], - "activationEvents": [ - "onLanguage:javascript", - "onLanguage:typescript", - "workspaceContains:.o11n/", - "onView:vrdev.views.explorer", - "onCommand:vrdev.new.project", - "onCommand:vrdev.change.profile", - "onCommand:vrdev.open.action", - "onCommand:vrdev.open.workflow", - "onCommand:vrdev.open.config", - "onCommand:vrdev.open.resource", - "onCommand:vrdev.run.action", - "onCommand:vrdev.toggle.typescript", - "onCommand:vrdev.vra.auth.configure", - "onCommand:vrdev.blueprint.create", - "onCommand:vrdev.blueprint.fetch", - "onCommand:vrdev.blueprint.upload", - "onCommand:vrdev.blueprint.deploy" - ], - "main": "./extension/out/extension", + "categories": ["Programming Languages"], + "keywords": ["vRealize", "vRO", "vRA"], + "activationEvents": ["onLanguage:javascript", "onLanguage:typescript", "workspaceContains:.o11n/", "onView:vrdev.views.explorer", "onCommand:vrdev.new.project", "onCommand:vrdev.change.profile", "onCommand:vrdev.open.action", "onCommand:vrdev.open.workflow", "onCommand:vrdev.open.config", "onCommand:vrdev.open.resource", "onCommand:vrdev.run.action", "onCommand:vrdev.toggle.typescript", "onCommand:vrdev.vra.auth.configure", "onCommand:vrdev.blueprint.create", "onCommand:vrdev.blueprint.fetch", "onCommand:vrdev.blueprint.upload", "onCommand:vrdev.blueprint.deploy"], + "main": "./extension/dist/extension", "icon": "assets/logo.png", "contributes": { "viewsContainers": { - "activitybar": [ - { - "id": "vro-explorer", - "title": "vRealize Developer Tools", - "icon": "assets/icons/explorer.svg" - } - ] + "activitybar": [{ + "id": "vro-explorer", + "title": "vRealize Developer Tools", + "icon": "assets/icons/explorer.svg" + }] }, "views": { - "vro-explorer": [ - { - "id": "vrdev.views.explorer", - "name": "Explorer" - }, - { - "id": "vrdev.views.properties", - "name": "Properties" - } - ] + "vro-explorer": [{ + "id": "vrdev.views.explorer", + "name": "Explorer" + }, { + "id": "vrdev.views.properties", + "name": "Properties" + }] }, - "viewsWelcome": [ - { - "view": "vrdev.views.explorer", - "contents": "Connect to vRealize Orchetsrator by selecting a maven profile.\n\n[Select Profile](command:vrdev.change.profile)" - }, - { - "view": "vrdev.views.properties", - "contents": "Select a node in the Explorer to view its properties." + "viewsWelcome": [{ + "view": "vrdev.views.explorer", + "contents": "Connect to vRealize Orchetsrator by selecting a maven profile.\n\n[Select Profile](command:vrdev.change.profile)" + }, { + "view": "vrdev.views.properties", + "contents": "Select a node in the Explorer to view its properties." + }], + "commands": [{ + "command": "vrdev.views.explorer.refresh", + "title": "Refresh", + "category": "vRealize", + "icon": { + "light": "assets/icons/light/refresh.svg", + "dark": "assets/icons/dark/refresh.svg" + } + }, { + "command": "vrdev.views.explorer.revealItem", + "title": "Reveal Item in Explorer", + "category": "vRealize" + }, { + "command": "vrdev.views.properties.show", + "title": "Show Properties", + "category": "vRealize" + }, { + "command": "vrdev.views.properties.copy", + "title": "Copy Value", + "category": "vRealize", + "icon": { + "light": "assets/icons/light/clipboard.svg", + "dark": "assets/icons/dark/clipboard.svg" + } + }, { + "command": "vrdev.views.properties.locateItem", + "title": "Locate Item in Explorer", + "category": "vRealize", + "icon": { + "light": "assets/icons/light/location.svg", + "dark": "assets/icons/dark/location.svg" + } + }, { + "command": "vrdev.fetchRemoteElement", + "title": "Fetch from Remote", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/link-external.svg", + "light": "assets/icons/light/link-external.svg" + } + }, { + "command": "vrdev.workflow.fetchSchema", + "title": "Open Workflow Schema", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/circuit-board.svg", + "light": "assets/icons/light/circuit-board.svg" + } + }, { + "command": "vrdev.package.delete", + "title": "Delete", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/trash.svg", + "light": "assets/icons/light/trash.svg" + } + }, { + "command": "vrdev.change.profile", + "title": "Change Active Profile", + "category": "vRealize" + }, { + "command": "vrdev.open.action", + "title": "Open vRO Action", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/search.svg", + "light": "assets/icons/light/search.svg" + } + }, { + "command": "vrdev.open.workflow", + "title": "Open vRO Workflow", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/search.svg", + "light": "assets/icons/light/search.svg" + } + }, { + "command": "vrdev.open.config", + "title": "Open vRO Configuration", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/search.svg", + "light": "assets/icons/light/search.svg" + } + }, { + "command": "vrdev.open.resource", + "title": "Open vRO Resource", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/search.svg", + "light": "assets/icons/light/search.svg" } - ], - "commands": [ - { + }, { + "command": "vrdev.new.project", + "title": "New Project", + "category": "vRealize" + }, { + "command": "vrdev.run.action", + "title": "Run vRO Action", + "category": "vRealize", + "icon": { + "light": "assets/icons/light/zap.svg", + "dark": "assets/icons/dark/zap.svg" + } + }, { + "command": "vrdev.toggle.typescript", + "title": "Toggle TypeScript Support (Experimental)", + "category": "vRealize" + }, { + "command": "vrdev.vra.auth.configure", + "title": "Configure vRA Authentication", + "category": "vRealize" + }, { + "command": "vrdev.blueprint.create", + "title": "Create vRA Blueprint", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/circuit-board.svg", + "light": "assets/icons/light/circuit-board.svg" + } + }, { + "command": "vrdev.blueprint.upload", + "title": "Upload vRA Blueprint", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/circuit-board.svg", + "light": "assets/icons/light/circuit-board.svg" + } + }, { + "command": "vrdev.blueprint.fetch", + "title": "Fetch vRA Blueprint", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/circuit-board.svg", + "light": "assets/icons/light/circuit-board.svg" + } + }, { + "command": "vrdev.blueprint.deploy", + "title": "Deploy vRA Blueprint", + "category": "vRealize", + "icon": { + "dark": "assets/icons/dark/circuit-board.svg", + "light": "assets/icons/light/circuit-board.svg" + } + }], + "menus": { + "view/title": [{ + "when": "view =~ /^vrdev\\.views\\.explorer/", "command": "vrdev.views.explorer.refresh", - "title": "Refresh", - "category": "vRealize", - "icon": { - "light": "assets/icons/light/refresh.svg", - "dark": "assets/icons/dark/refresh.svg" - } - }, - { - "command": "vrdev.views.explorer.revealItem", - "title": "Reveal Item in Explorer", - "category": "vRealize" - }, - { - "command": "vrdev.views.properties.show", - "title": "Show Properties", - "category": "vRealize" - }, - { - "command": "vrdev.views.properties.copy", - "title": "Copy Value", - "category": "vRealize", - "icon": { - "light": "assets/icons/light/clipboard.svg", - "dark": "assets/icons/dark/clipboard.svg" - } - }, - { + "group": "navigation@1" + }, { + "when": "!vrdev:properties:empty && view =~ /^vrdev\\.views\\.properties/", "command": "vrdev.views.properties.locateItem", - "title": "Locate Item in Explorer", - "category": "vRealize", - "icon": { - "light": "assets/icons/light/location.svg", - "dark": "assets/icons/dark/location.svg" - } - }, - { + "group": "navigation@1" + }], + "view/item/context": [{ "command": "vrdev.fetchRemoteElement", - "title": "Fetch from Remote", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/link-external.svg", - "light": "assets/icons/light/link-external.svg" - } - }, - { + "when": "viewItem =~ /vrdev:element:kind:(action|workflow|config|resource)\\b/", + "group": "inline@98" + }, { + "command": "vrdev.fetchRemoteElement", + "when": "viewItem =~ /vrdev:element:kind:(action|workflow|config|resource)\\b/", + "group": "1_vrdevs@1" + }, { "command": "vrdev.workflow.fetchSchema", - "title": "Open Workflow Schema", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/circuit-board.svg", - "light": "assets/icons/light/circuit-board.svg" - } - }, - { + "when": "viewItem =~ /vrdev:element:kind:workflow\\b/", + "group": "inline@95" + }, { + "command": "vrdev.workflow.fetchSchema", + "when": "viewItem =~ /vrdev:element:kind:workflow\\b/", + "group": "1_vrdevs@2" + }, { "command": "vrdev.package.delete", - "title": "Delete", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/trash.svg", - "light": "assets/icons/light/trash.svg" - } - }, - { - "command": "vrdev.change.profile", - "title": "Change Active Profile", - "category": "vRealize" - }, - { + "when": "viewItem =~ /vrdev:element:kind:package\\b/", + "group": "inline@95" + }, { + "command": "vrdev.package.delete", + "when": "viewItem =~ /vrdev:element:kind:package\\b/", + "group": "1_vrdevs@1" + }, { "command": "vrdev.open.action", - "title": "Open vRO Action", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/search.svg", - "light": "assets/icons/light/search.svg" - } - }, - { + "when": "viewItem =~ /vrdev:element:kind:actions\\b/", + "group": "inline@95" + }, { + "command": "vrdev.open.action", + "when": "viewItem =~ /vrdev:element:kind:actions\\b/", + "group": "1_vrdevs@1" + }, { "command": "vrdev.open.workflow", - "title": "Open vRO Workflow", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/search.svg", - "light": "assets/icons/light/search.svg" - } - }, - { + "when": "viewItem =~ /vrdev:element:kind:workflows\\b/", + "group": "inline@95" + }, { + "command": "vrdev.open.workflow", + "when": "viewItem =~ /vrdev:element:kind:workflows\\b/", + "group": "1_vrdevs@1" + }, { "command": "vrdev.open.config", - "title": "Open vRO Configuration", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/search.svg", - "light": "assets/icons/light/search.svg" - } - }, - { + "when": "viewItem =~ /vrdev:element:kind:configs\\b/", + "group": "inline@95" + }, { + "command": "vrdev.open.config", + "when": "viewItem =~ /vrdev:element:kind:configs\\b/", + "group": "1_vrdevs@1" + }, { "command": "vrdev.open.resource", - "title": "Open vRO Resource", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/search.svg", - "light": "assets/icons/light/search.svg" - } - }, - { - "command": "vrdev.new.project", - "title": "New Project", - "category": "vRealize" - }, - { - "command": "vrdev.run.action", - "title": "Run vRO Action", - "category": "vRealize", - "icon": { - "light": "assets/icons/light/zap.svg", - "dark": "assets/icons/dark/zap.svg" - } - }, - { - "command": "vrdev.toggle.typescript", - "title": "Toggle TypeScript Support (Experimental)", - "category": "vRealize" - }, - { - "command": "vrdev.vra.auth.configure", - "title": "Configure vRA Authentication", - "category": "vRealize" - }, - { + "when": "viewItem =~ /vrdev:element:kind:resources\\b/", + "group": "inline@95" + }, { + "command": "vrdev.open.resource", + "when": "viewItem =~ /vrdev:element:kind:resources\\b/", + "group": "1_vrdevs@1" + }, { + "command": "vrdev.views.properties.copy", + "when": "viewItem =~ /vrdev:element:kind:property\\b(?!.*?\\+multi\\b)\\b/", + "group": "inline@95" + }, { + "command": "vrdev.views.properties.copy", + "when": "viewItem =~ /vrdev:element:kind:property\\b(?!.*?\\+multi\\b)\\b/", + "group": "1_vrdevs@1" + }, { "command": "vrdev.blueprint.create", - "title": "Create vRA Blueprint", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/circuit-board.svg", - "light": "assets/icons/light/circuit-board.svg" - } - }, - { + "when": "viewItem =~ /vrdev:element:kind:blueprint\\b/", + "group": "inline@95" + }, { + "command": "vrdev.blueprint.create", + "when": "viewItem =~ /vrdev:element:kind:blueprint\\b/", + "group": "1_vrdevs@1" + }], + "editor/title": [{ + "when": "resourceLangId == javascript || resourceLangId == typescript", + "command": "vrdev.run.action", + "group": "navigation" + }, { + "when": "resourceLangId == yaml", "command": "vrdev.blueprint.upload", - "title": "Upload vRA Blueprint", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/circuit-board.svg", - "light": "assets/icons/light/circuit-board.svg" - } - }, - { - "command": "vrdev.blueprint.fetch", - "title": "Fetch vRA Blueprint", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/circuit-board.svg", - "light": "assets/icons/light/circuit-board.svg" - } - }, - { + "group": "navigation" + }, { + "when": "resourceLangId == yaml", "command": "vrdev.blueprint.deploy", - "title": "Deploy vRA Blueprint", - "category": "vRealize", - "icon": { - "dark": "assets/icons/dark/circuit-board.svg", - "light": "assets/icons/light/circuit-board.svg" - } - } - ], - "menus": { - "view/title": [ - { - "when": "view =~ /^vrdev\\.views\\.explorer/", - "command": "vrdev.views.explorer.refresh", - "group": "navigation@1" - }, - { - "when": "!vrdev:properties:empty && view =~ /^vrdev\\.views\\.properties/", - "command": "vrdev.views.properties.locateItem", - "group": "navigation@1" - } - ], - "view/item/context": [ - { - "command": "vrdev.fetchRemoteElement", - "when": "viewItem =~ /vrdev:element:kind:(action|workflow|config|resource)\\b/", - "group": "inline@98" - }, - { - "command": "vrdev.fetchRemoteElement", - "when": "viewItem =~ /vrdev:element:kind:(action|workflow|config|resource)\\b/", - "group": "1_vrdevs@1" - }, - { - "command": "vrdev.workflow.fetchSchema", - "when": "viewItem =~ /vrdev:element:kind:workflow\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.workflow.fetchSchema", - "when": "viewItem =~ /vrdev:element:kind:workflow\\b/", - "group": "1_vrdevs@2" - }, - { - "command": "vrdev.package.delete", - "when": "viewItem =~ /vrdev:element:kind:package\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.package.delete", - "when": "viewItem =~ /vrdev:element:kind:package\\b/", - "group": "1_vrdevs@1" - }, - { - "command": "vrdev.open.action", - "when": "viewItem =~ /vrdev:element:kind:actions\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.open.action", - "when": "viewItem =~ /vrdev:element:kind:actions\\b/", - "group": "1_vrdevs@1" - }, - { - "command": "vrdev.open.workflow", - "when": "viewItem =~ /vrdev:element:kind:workflows\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.open.workflow", - "when": "viewItem =~ /vrdev:element:kind:workflows\\b/", - "group": "1_vrdevs@1" - }, - { - "command": "vrdev.open.config", - "when": "viewItem =~ /vrdev:element:kind:configs\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.open.config", - "when": "viewItem =~ /vrdev:element:kind:configs\\b/", - "group": "1_vrdevs@1" - }, - { - "command": "vrdev.open.resource", - "when": "viewItem =~ /vrdev:element:kind:resources\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.open.resource", - "when": "viewItem =~ /vrdev:element:kind:resources\\b/", - "group": "1_vrdevs@1" - }, - { - "command": "vrdev.views.properties.copy", - "when": "viewItem =~ /vrdev:element:kind:property\\b(?!.*?\\+multi\\b)\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.views.properties.copy", - "when": "viewItem =~ /vrdev:element:kind:property\\b(?!.*?\\+multi\\b)\\b/", - "group": "1_vrdevs@1" - }, - { - "command": "vrdev.blueprint.create", - "when": "viewItem =~ /vrdev:element:kind:blueprint\\b/", - "group": "inline@95" - }, - { - "command": "vrdev.blueprint.create", - "when": "viewItem =~ /vrdev:element:kind:blueprint\\b/", - "group": "1_vrdevs@1" - } - ], - "editor/title": [ - { - "when": "resourceLangId == javascript || resourceLangId == typescript", - "command": "vrdev.run.action", - "group": "navigation" - }, - { - "when": "resourceLangId == yaml", - "command": "vrdev.blueprint.upload", - "group": "navigation" - }, - { - "when": "resourceLangId == yaml", - "command": "vrdev.blueprint.deploy", - "group": "navigation" - } - ], - "commandPalette": [ - { - "command": "vrdev.fetchRemoteElement", - "when": "false" - }, - { - "command": "vrdev.workflow.fetchSchema", - "when": "false" - }, - { - "command": "vrdev.package.delete", - "when": "false" - }, - { - "command": "vrdev.views.properties.show", - "when": "false" - }, - { - "command": "vrdev.views.properties.copy", - "when": "false" - }, - { - "command": "vrdev.views.properties.locateItem", - "when": "false" - }, - { - "command": "vrdev.views.explorer.revealItem", - "when": "false" - }, - { - "command": "vrdev.views.explorer.refresh", - "when": "false" - } - ] + "group": "navigation" + }], + "commandPalette": [{ + "command": "vrdev.fetchRemoteElement", + "when": "false" + }, { + "command": "vrdev.workflow.fetchSchema", + "when": "false" + }, { + "command": "vrdev.package.delete", + "when": "false" + }, { + "command": "vrdev.views.properties.show", + "when": "false" + }, { + "command": "vrdev.views.properties.copy", + "when": "false" + }, { + "command": "vrdev.views.properties.locateItem", + "when": "false" + }, { + "command": "vrdev.views.explorer.revealItem", + "when": "false" + }, { + "command": "vrdev.views.explorer.refresh", + "when": "false" + }] }, - "taskDefinitions": [ - { - "type": "vRealize", - "required": [ - "label", - "command" - ], - "properties": { - "label": { - "type": "string" - }, - "command": { - "type": "string", - "description": "The command to execute" - } + "taskDefinitions": [{ + "type": "vRealize", + "required": ["label", "command"], + "properties": { + "label": { + "type": "string" + }, + "command": { + "type": "string", + "description": "The command to execute" } } - ], + }], "configuration": { "type": "object", "title": "vRealize Developer Tools", "properties": { "vrdev.log": { "type": "string", - "enum": [ - "off", - "info", - "debug" - ], + "enum": ["off", "info", "debug"], "default": "info", "description": "Enables logging of the vRealize Developer Tools to the OUTPUT panel. This log can be used to diagnose vRealize Developer Tools issues. The log may contain file paths, source code, and other potentially sensitive information from your project." }, "vrdev.trace": { "type": "string", - "enum": [ - "off", - "messages", - "verbose" - ], + "enum": ["off", "messages", "verbose"], "default": "off", "description": "Enables tracing of messages exchanged between the vRealize Developer Tools extension and the vRO language server. This trace can be used to diagnose extension issues. The trace may contain file paths, source code, and other potentially sensitive information from your project." }, @@ -481,10 +379,7 @@ }, "vrdev.vra.auth.type": { "type": "string", - "enum": [ - "refresh_token", - "password" - ], + "enum": ["refresh_token", "password"], "description": "Method for authetication towards vRealize Automation 8", "scope": "window" }, @@ -509,16 +404,8 @@ "vrdev.views.explorer.actions.layout": { "type": "string", "default": "compact", - "enum": [ - "tree", - "compact", - "flat" - ], - "enumDescriptions": [ - "Displays action packages as a tree", - "Displays action packages as a tree, but flattens any folders that have no children", - "Displays action packages as a list" - ], + "enum": ["tree", "compact", "flat"], + "enumDescriptions": ["Displays action packages as a tree", "Displays action packages as a tree, but flattens any folders that have no children", "Displays action packages as a list"], "markdownDescription": "Specifies how the _Explorer_ view will display vRO action packages", "scope": "window" }, @@ -530,16 +417,13 @@ } } }, - "snippets": [ - { - "language": "javascript", - "path": "./extension/snippets/vro.json" - }, - { - "language": "yaml", - "path": "./extension/snippets/vra-blueprint.json" - } - ] + "snippets": [{ + "language": "javascript", + "path": "./extension/snippets/vro.json" + }, { + "language": "yaml", + "path": "./extension/snippets/vra-blueprint.json" + }] }, "devDependencies": { "@types/adm-zip": "^0.4.33", @@ -619,11 +503,9 @@ "glob-stream": "^7.0.0", "ansi-regex": "^5.0.1" }, - "workspaces": [ - "packages/node/*" - ], + "workspaces": ["packages/node/*"], "scripts": { "preinstall": "node build/preinstall.js", "vscode:prepublish": "webpack --mode production --config ./extension/webpack.config.js && webpack --mode production --config ./packages/node/vro-language-server/webpack.config.js" } -} +} \ No newline at end of file diff --git a/packages/node/vro-language-server/src/server/core/HintLookup.ts b/packages/node/vro-language-server/src/server/core/HintLookup.ts index 03865524..24a59648 100644 --- a/packages/node/vro-language-server/src/server/core/HintLookup.ts +++ b/packages/node/vro-language-server/src/server/core/HintLookup.ts @@ -100,7 +100,7 @@ export class HintLookup implements Disposable { const module = this.getActionModules(workspaceFolder).find(module => module.name === moduleName) this.logger.debug(`Module hint: ${JSON.stringify(module, null, 4)}`) - if (module && module.actions) { + if (module?.actions) { return module.actions.filter(action => !!action) } @@ -122,7 +122,7 @@ export class HintLookup implements Disposable { getConfigElementsIn(categoryPath: string, workspaceFolder?: WorkspaceFolder): vmw.pscoe.hints.IConfig[] { const module = this.getConfigCategories(workspaceFolder).find(category => category.path === categoryPath) - if (module && module.configurations) { + if (module?.configurations) { return module.configurations.filter(config => !!config) } @@ -139,9 +139,7 @@ export class HintLookup implements Disposable { for (const api of this.scriptingApi.global) { for (const cls of api.classes) { const hasConstructors = !!cls.constructors && cls.constructors.length > 0 - if (filter.isInstantiable === undefined) { - result.push(cls) - } else if (hasConstructors === filter.isInstantiable) { + if (filter.isInstantiable === undefined || hasConstructors === filter.isInstantiable) { result.push(cls) } } diff --git a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts index ba6fc60a..84285e3b 100644 --- a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts +++ b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts @@ -134,6 +134,7 @@ export class ServerCollection { collectObjects() { this.getVroObjects() .then(objects => { + // todo merge both in same actions.pb file this.hints.collectVroObjects(objects) }) .catch(error => { @@ -173,6 +174,7 @@ export class ServerCollection { const pluginDetails = await this.restClient.getPluginDetails(parsedLink) for (const pluginObject of pluginDetails["objects"]) { + // enrich the object with vRO plugin object properties const object: vmw.pscoe.hints.IClass = { name: pluginObject["name"], description: pluginObject["description"], diff --git a/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts b/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts index 28ac4459..dcb53828 100644 --- a/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts +++ b/packages/node/vro-language-server/src/server/request/collection/WorkspaceCollection.ts @@ -89,7 +89,7 @@ export class WorkspaceCollection { const payload = this.collectLocalData(modulesPath) this.generateActionsPbFiles(payload, outputDir, workspaceFolder) } catch (error) { - this.logger.warn(`Error occurred: ${JSON.stringify(error)}`) + this.logger.warn(`Error occurred: ${error}`) } this.logger.info("Workspace hint collection has finished") } @@ -104,22 +104,23 @@ export class WorkspaceCollection { fs.writeFileSync(actionPackProtoFile, ActionsPackProto) protobuf.load(actionPackProtoFile, function (err, root) { - if (err) throw err - if (!root) throw new Error("Root namespace not loaded") - + if (err) { + throw err + } + if (!root) { + throw new Error("Root namespace not loaded") + } // Obtain a message type const ActionsPack = root.lookupType("vmw.pscoe.hints.ActionsPack") - // Verify the payload (i.e. incomplete or invalid) const errMsg = ActionsPack.verify(payload) - if (errMsg) throw Error(errMsg) - + if (errMsg) { + throw Error(errMsg) + } // Create a new message const message = ActionsPack.create(payload) - // Encode a message to a Buffer const buffer = ActionsPack.encode(message).finish() - fs.writeFileSync(outputFile, buffer) }) } @@ -155,7 +156,7 @@ export class WorkspaceCollection { parameters.push(actionParams) } if (tag.tag === "return") { - returnType = tag.type + returnType = tag?.type } }) @@ -182,7 +183,7 @@ export class WorkspaceCollection { modules.forEach(module => { actions.forEach(action => { - if (action.moduleName === module.name) { + if (action?.moduleName === module?.name) { module.actions.push(action) } }) From a27c569338736de135c7191cb9aee817a53c7a09 Mon Sep 17 00:00:00 2001 From: Venelin Bakalov Date: Wed, 10 Apr 2024 16:02:16 +0300 Subject: [PATCH 5/6] Update if condition --- .../node/vro-language-server/src/server/core/HintLookup.ts | 4 ++-- .../src/server/request/collection/ServerCollection.ts | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/node/vro-language-server/src/server/core/HintLookup.ts b/packages/node/vro-language-server/src/server/core/HintLookup.ts index 24a59648..9bf39acc 100644 --- a/packages/node/vro-language-server/src/server/core/HintLookup.ts +++ b/packages/node/vro-language-server/src/server/core/HintLookup.ts @@ -5,9 +5,9 @@ import * as fs from "fs" +import { AutoWire, HintModule, Logger, WorkspaceFolder } from "@vmware/vrdt-common" import * as _ from "lodash" import { v4 as uuidv4 } from "uuid" -import { AutoWire, HintModule, Logger, WorkspaceFolder } from "@vmware/vrdt-common" import { Disposable, WorkspaceFoldersChangeEvent } from "vscode-languageserver" import { vmw } from "../../proto" @@ -139,7 +139,7 @@ export class HintLookup implements Disposable { for (const api of this.scriptingApi.global) { for (const cls of api.classes) { const hasConstructors = !!cls.constructors && cls.constructors.length > 0 - if (filter.isInstantiable === undefined || hasConstructors === filter.isInstantiable) { + if ((filter.isInstantiable === undefined) || (hasConstructors === filter.isInstantiable)) { result.push(cls) } } diff --git a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts index 84285e3b..18ecc321 100644 --- a/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts +++ b/packages/node/vro-language-server/src/server/request/collection/ServerCollection.ts @@ -134,7 +134,6 @@ export class ServerCollection { collectObjects() { this.getVroObjects() .then(objects => { - // todo merge both in same actions.pb file this.hints.collectVroObjects(objects) }) .catch(error => { From 9cae94b0ae1285441c3c438ae879e0cbfd473272 Mon Sep 17 00:00:00 2001 From: Alexander Kantchev Date: Wed, 10 Apr 2024 16:32:57 +0300 Subject: [PATCH 6/6] [Task (IAC-807] Fixed lint errors. Signed-off-by: Alexander Kantchev --- .../node/vro-language-server/src/server/core/HintLookup.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node/vro-language-server/src/server/core/HintLookup.ts b/packages/node/vro-language-server/src/server/core/HintLookup.ts index 9bf39acc..fb4794ed 100644 --- a/packages/node/vro-language-server/src/server/core/HintLookup.ts +++ b/packages/node/vro-language-server/src/server/core/HintLookup.ts @@ -101,7 +101,7 @@ export class HintLookup implements Disposable { this.logger.debug(`Module hint: ${JSON.stringify(module, null, 4)}`) if (module?.actions) { - return module.actions.filter(action => !!action) + return module.actions.filter((action: any) => !!action) } return [] @@ -139,7 +139,7 @@ export class HintLookup implements Disposable { for (const api of this.scriptingApi.global) { for (const cls of api.classes) { const hasConstructors = !!cls.constructors && cls.constructors.length > 0 - if ((filter.isInstantiable === undefined) || (hasConstructors === filter.isInstantiable)) { + if (filter.isInstantiable === undefined || hasConstructors === filter.isInstantiable) { result.push(cls) } }