basant307/AI_Governance_Project
048
1/*2Language: PowerShell3Description: PowerShell is a task-based command-line shell and scripting language built on .NET.4Author: David Mohundro <david@mohundro.com>5Contributors: Nicholas Blumhardt <nblumhardt@nblumhardt.com>, Victor Zhou <OiCMudkips@users.noreply.github.com>, Nicolas Le Gall <contact@nlegall.fr>6Website: https://docs.microsoft.com/en-us/powershell/7Category: scripting8*/9 10function powershell(hljs) {11 const TYPES = [12 "string",13 "char",14 "byte",15 "int",16 "long",17 "bool",18 "decimal",19 "single",20 "double",21 "DateTime",22 "xml",23 "array",24 "hashtable",25 "void"26 ];27 28 // https://docs.microsoft.com/en-us/powershell/scripting/developer/cmdlet/approved-verbs-for-windows-powershell-commands29 const VALID_VERBS =30 'Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|'31 + 'Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|'32 + 'Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|'33 + 'Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|'34 + 'ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|'35 + 'Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|'36 + 'Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|'37 + 'Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|'38 + 'Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|'39 + 'Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|'40 + 'Unprotect|Use|ForEach|Sort|Tee|Where';41 42 const COMPARISON_OPERATORS =43 '-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|'44 + '-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|'45 + '-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|'46 + '-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|'47 + '-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|'48 + '-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|'49 + '-split|-wildcard|-xor';50 51 const KEYWORDS = {52 $pattern: /-?[A-z\.\-]+\b/,53 keyword:54 'if else foreach return do while until elseif begin for trap data dynamicparam '55 + 'end break throw param continue finally in switch exit filter try process catch '56 + 'hidden static parameter',57 // "echo" relevance has been set to 0 to avoid auto-detect conflicts with shell transcripts58 built_in:59 'ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp '60 + 'cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx '61 + 'fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group '62 + 'gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi '63 + 'iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh '64 + 'popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp '65 + 'rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp '66 + 'spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write'67 // TODO: 'validate[A-Z]+' can't work in keywords68 };69 70 const TITLE_NAME_RE = /\w[\w\d]*((-)[\w\d]+)*/;71 72 const BACKTICK_ESCAPE = {73 begin: '`[\\s\\S]',74 relevance: 075 };76 77 const VAR = {78 className: 'variable',79 variants: [80 { begin: /\$\B/ },81 {82 className: 'keyword',83 begin: /\$this/84 },85 { begin: /\$[\w\d][\w\d_:]*/ }86 ]87 };88 89 const LITERAL = {90 className: 'literal',91 begin: /\$(null|true|false)\b/92 };93 94 const QUOTE_STRING = {95 className: "string",96 variants: [97 {98 begin: /"/,99 end: /"/100 },101 {102 begin: /@"/,103 end: /^"@/104 }105 ],106 contains: [107 BACKTICK_ESCAPE,108 VAR,109 {110 className: 'variable',111 begin: /\$[A-z]/,112 end: /[^A-z]/113 }114 ]115 };116 117 const APOS_STRING = {118 className: 'string',119 variants: [120 {121 begin: /'/,122 end: /'/123 },124 {125 begin: /@'/,126 end: /^'@/127 }128 ]129 };130 131 const PS_HELPTAGS = {132 className: "doctag",133 variants: [134 /* no paramater help tags */135 { begin: /\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/ },136 /* one parameter help tags */137 { begin: /\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/ }138 ]139 };140 141 const PS_COMMENT = hljs.inherit(142 hljs.COMMENT(null, null),143 {144 variants: [145 /* single-line comment */146 {147 begin: /#/,148 end: /$/149 },150 /* multi-line comment */151 {152 begin: /<#/,153 end: /#>/154 }155 ],156 contains: [ PS_HELPTAGS ]157 }158 );159 160 const CMDLETS = {161 className: 'built_in',162 variants: [ { begin: '('.concat(VALID_VERBS, ')+(-)[\\w\\d]+') } ]163 };164 165 const PS_CLASS = {166 className: 'class',167 beginKeywords: 'class enum',168 end: /\s*[{]/,169 excludeEnd: true,170 relevance: 0,171 contains: [ hljs.TITLE_MODE ]172 };173 174 const PS_FUNCTION = {175 className: 'function',176 begin: /function\s+/,177 end: /\s*\{|$/,178 excludeEnd: true,179 returnBegin: true,180 relevance: 0,181 contains: [182 {183 begin: "function",184 relevance: 0,185 className: "keyword"186 },187 {188 className: "title",189 begin: TITLE_NAME_RE,190 relevance: 0191 },192 {193 begin: /\(/,194 end: /\)/,195 className: "params",196 relevance: 0,197 contains: [ VAR ]198 }199 // CMDLETS200 ]201 };202 203 // Using statment, plus type, plus assembly name.204 const PS_USING = {205 begin: /using\s/,206 end: /$/,207 returnBegin: true,208 contains: [209 QUOTE_STRING,210 APOS_STRING,211 {212 className: 'keyword',213 begin: /(using|assembly|command|module|namespace|type)/214 }215 ]216 };217 218 // Comperison operators & function named parameters.219 const PS_ARGUMENTS = { variants: [220 // PS literals are pretty verbose so it's a good idea to accent them a bit.221 {222 className: 'operator',223 begin: '('.concat(COMPARISON_OPERATORS, ')\\b')224 },225 {226 className: 'literal',227 begin: /(-){1,2}[\w\d-]+/,228 relevance: 0229 }230 ] };231 232 const HASH_SIGNS = {233 className: 'selector-tag',234 begin: /@\B/,235 relevance: 0236 };237 238 // It's a very general rule so I'll narrow it a bit with some strict boundaries239 // to avoid any possible false-positive collisions!240 const PS_METHODS = {241 className: 'function',242 begin: /\[.*\]\s*[\w]+[ ]??\(/,243 end: /$/,244 returnBegin: true,245 relevance: 0,246 contains: [247 {248 className: 'keyword',249 begin: '('.concat(250 KEYWORDS.keyword.toString().replace(/\s/g, '|'251 ), ')\\b'),252 endsParent: true,253 relevance: 0254 },255 hljs.inherit(hljs.TITLE_MODE, { endsParent: true })256 ]257 };258 259 const GENTLEMANS_SET = [260 // STATIC_MEMBER,261 PS_METHODS,262 PS_COMMENT,263 BACKTICK_ESCAPE,264 hljs.NUMBER_MODE,265 QUOTE_STRING,266 APOS_STRING,267 // PS_NEW_OBJECT_TYPE,268 CMDLETS,269 VAR,270 LITERAL,271 HASH_SIGNS272 ];273 274 const PS_TYPE = {275 begin: /\[/,276 end: /\]/,277 excludeBegin: true,278 excludeEnd: true,279 relevance: 0,280 contains: [].concat(281 'self',282 GENTLEMANS_SET,283 {284 begin: "(" + TYPES.join("|") + ")",285 className: "built_in",286 relevance: 0287 },288 {289 className: 'type',290 begin: /[\.\w\d]+/,291 relevance: 0292 }293 )294 };295 296 PS_METHODS.contains.unshift(PS_TYPE);297 298 return {299 name: 'PowerShell',300 aliases: [301 "pwsh",302 "ps",303 "ps1"304 ],305 case_insensitive: true,306 keywords: KEYWORDS,307 contains: GENTLEMANS_SET.concat(308 PS_CLASS,309 PS_FUNCTION,310 PS_USING,311 PS_ARGUMENTS,312 PS_TYPE313 )314 };315}316 317export { powershell as default };318 