diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..a3847b4 --- /dev/null +++ b/404.html @@ -0,0 +1,29 @@ + + + + + + 404 | Robo + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..afcdf77 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +robo.li diff --git a/assets/app.B2PGvPb_.js b/assets/app.B2PGvPb_.js new file mode 100644 index 0000000..38b2e9a --- /dev/null +++ b/assets/app.B2PGvPb_.js @@ -0,0 +1 @@ +import{t as i}from"./chunks/theme.mcvFSWbF.js";import{R as o,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,ac as v,d as P,u as y,v as C,s as b,ad as w,ae as R,af as E,ag as S}from"./chunks/framework.DptEmx5X.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{b(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&w(),R(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp}; diff --git a/assets/chunks/@localSearchIndexroot.BFE0kuj6.js b/assets/chunks/@localSearchIndexroot.BFE0kuj6.js new file mode 100644 index 0000000..929f21a --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.BFE0kuj6.js @@ -0,0 +1 @@ +const e='{"documentCount":154,"nextId":154,"documentIds":{"0":"/collections.html#collection-builders","1":"/collections.html#collections-api","2":"/collections.html#taskinterface-objects","3":"/collections.html#functions","4":"/collections.html#closures","5":"/collections.html#methods","6":"/collections.html#using-a-collection-builder","7":"/collections.html#rollbacks-and-completions","8":"/collections.html#completion-tasks","9":"/collections.html#rollback-tasks","10":"/collections.html#rollback-and-completion-methods","11":"/collections.html#rollback-and-completion-callbacks","12":"/collections.html#temporary-objects","13":"/collections.html#temporary-directories","14":"/collections.html#temporary-files","15":"/collections.html#the-temporary-global-collection","16":"/collections.html#chained-state","17":"/collections.html#implicitly-passing-state","18":"/collections.html#explicitly-passing-state","19":"/collections.html#named-tasks","20":"/extending.html#extending","21":"/extending.html#including-additional-tasks","22":"/extending.html#register-command-files-via-psr-4-autoloading","23":"/extending.html#creating-a-robo-extension","24":"/extending.html#create-your-composer-json-file","25":"/extending.html#create-the-tasks-php-trait","26":"/extending.html#task-implementation","27":"/extending.html#taskio","28":"/extending.html#tasks-that-use-tasks","29":"/extending.html#testing-extensions","30":"/framework.html#robo-as-a-framework","31":"/framework.html#creating-a-standalone-phar-with-robo","32":"/framework.html#using-multiple-robofiles-in-a-standalone-application","33":"/framework.html#using-your-own-dependency-injection-container-with-robo-advanced","34":"/framework.html#using-a-custom-configuration-loader","35":"/getting-started.html#getting-started","36":"/getting-started.html#commands","37":"/getting-started.html#arguments","38":"/getting-started.html#options","39":"/getting-started.html#load-from-other-robofile","40":"/getting-started.html#pass-through-arguments","41":"/getting-started.html#help","42":"/getting-started.html#ignored-methods","43":"/getting-started.html#tasks","44":"/getting-started.html#shortcuts","45":"/getting-started.html#result","46":"/getting-started.html#stack","47":"/getting-started.html#global-stoponfail","48":"/getting-started.html#progress","49":"/getting-started.html#configuration","50":"/getting-started.html#configuration-for-command-options","51":"/getting-started.html#configuration-for-task-settings","52":"/getting-started.html#accessing-configuration-directly","53":"/getting-started.html#providing-default-configuration-in-code","54":"/getting-started.html#loading-configuration-from-another-source","55":"/getting-started.html#io","56":"/getting-started.html#formatters","57":"/getting-started.html#working-with-composer","58":"/getting-started.html#adding-a-robofile-to-your-project","59":"/getting-started.html#implementing-composer-scripts-with-robo","60":"/getting-started.html#robo-as-a-framework","61":"/#automate-common-tasks","62":"/#installing","63":"/#phar","64":"/#composer","65":"/#usage","66":"/#examples","67":"/#we-need-more-tasks","68":"/#credits","69":"/links.html#robo-documentation","70":"/links.html#tasks","71":"/tasks/ApiGen.html#apigen-tasks","72":"/tasks/ApiGen.html#apigen","73":"/tasks/Archive.html#archive-tasks","74":"/tasks/Archive.html#extract","75":"/tasks/Archive.html#pack","76":"/tasks/Assets.html#assets-tasks","77":"/tasks/Assets.html#imageminify","78":"/tasks/Assets.html#less","79":"/tasks/Assets.html#minify","80":"/tasks/Assets.html#scss","81":"/tasks/Base.html#base-tasks","82":"/tasks/Base.html#exec","83":"/tasks/Base.html#execstack","84":"/tasks/Base.html#parallelexec","85":"/tasks/Base.html#symfonycommand","86":"/tasks/Base.html#watch","87":"/tasks/Bower.html#bower-tasks","88":"/tasks/Bower.html#install","89":"/tasks/Bower.html#update","90":"/tasks/Composer.html#composer-tasks","91":"/tasks/Composer.html#checkplatformreqs","92":"/tasks/Composer.html#config","93":"/tasks/Composer.html#createproject","94":"/tasks/Composer.html#dumpautoload","95":"/tasks/Composer.html#init","96":"/tasks/Composer.html#install","97":"/tasks/Composer.html#remove","98":"/tasks/Composer.html#requiredependency","99":"/tasks/Composer.html#update","100":"/tasks/Composer.html#validate","101":"/tasks/Development.html#development-tasks","102":"/tasks/Development.html#changelog","103":"/tasks/Development.html#generatemarkdowndoc","104":"/tasks/Development.html#generate","105":"/tasks/Development.html#githubrelease","106":"/tasks/Development.html#openbrowser","107":"/tasks/Development.html#packphar","108":"/tasks/Development.html#phpserver","109":"/tasks/Development.html#semver","110":"/tasks/Docker.html#docker-tasks","111":"/tasks/Docker.html#build","112":"/tasks/Docker.html#commit","113":"/tasks/Docker.html#exec","114":"/tasks/Docker.html#pull","115":"/tasks/Docker.html#remove","116":"/tasks/Docker.html#run","117":"/tasks/Docker.html#start","118":"/tasks/Docker.html#stop","119":"/tasks/File.html#file-tasks","120":"/tasks/File.html#concat","121":"/tasks/File.html#replace","122":"/tasks/File.html#tmpfile","123":"/tasks/File.html#write","124":"/tasks/Filesystem.html#filesystem-tasks","125":"/tasks/Filesystem.html#cleandir","126":"/tasks/Filesystem.html#copydir","127":"/tasks/Filesystem.html#deletedir","128":"/tasks/Filesystem.html#filesystemstack","129":"/tasks/Filesystem.html#flattendir","130":"/tasks/Filesystem.html#mirrordir","131":"/tasks/Filesystem.html#tmpdir","132":"/tasks/Filesystem.html#workdir","133":"/tasks/Gulp.html#gulp-tasks","134":"/tasks/Gulp.html#run","135":"/tasks/Logfile.html#logfile-tasks","136":"/tasks/Logfile.html#rotatelog","137":"/tasks/Logfile.html#truncatelog","138":"/tasks/Npm.html#npm-tasks","139":"/tasks/Npm.html#install","140":"/tasks/Npm.html#update","141":"/tasks/Remote.html#remote-tasks","142":"/tasks/Remote.html#rsync","143":"/tasks/Remote.html#ssh","144":"/tasks/Testing.html#testing-tasks","145":"/tasks/Testing.html#atoum","146":"/tasks/Testing.html#behat","147":"/tasks/Testing.html#codecept","148":"/tasks/Testing.html#phpunit","149":"/tasks/Testing.html#phpspec","150":"/tasks/Vcs.html#vcs-tasks","151":"/tasks/Vcs.html#gitstack","152":"/tasks/Vcs.html#hgstack","153":"/tasks/Vcs.html#svnstack"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,92],"1":[2,2,38],"2":[2,4,9],"3":[1,4,7],"4":[1,4,12],"5":[1,4,8],"6":[4,2,111],"7":[3,2,33],"8":[2,5,59],"9":[2,5,53],"10":[4,5,65],"11":[4,5,26],"12":[2,2,40],"13":[2,4,185],"14":[2,4,45],"15":[4,4,98],"16":[2,2,49],"17":[3,4,86],"18":[3,4,149],"19":[2,2,109],"20":[1,1,106],"21":[3,1,97],"22":[7,1,93],"23":[4,1,40],"24":[5,5,69],"25":[5,5,68],"26":[2,5,122],"27":[1,5,76],"28":[3,5,44],"29":[2,5,118],"30":[4,1,34],"31":[6,4,200],"32":[7,4,105],"33":[10,4,130],"34":[5,4,122],"35":[2,1,42],"36":[1,2,104],"37":[1,3,62],"38":[1,3,121],"39":[4,3,65],"40":[3,3,90],"41":[1,3,93],"42":[2,3,43],"43":[1,2,67],"44":[1,3,34],"45":[1,3,179],"46":[1,3,46],"47":[2,3,29],"48":[1,3,129],"49":[1,2,92],"50":[4,3,91],"51":[4,3,95],"52":[3,3,65],"53":[5,3,63],"54":[5,3,61],"55":[1,2,68],"56":[1,3,57],"57":[3,2,1],"58":[6,5,49],"59":[5,5,154],"60":[4,2,24],"61":[4,1,24],"62":[1,1,1],"63":[1,1,31],"64":[1,1,14],"65":[1,1,30],"66":[1,1,176],"67":[5,1,23],"68":[1,1,16],"69":[2,1,9],"70":[1,2,16],"71":[2,1,1],"72":[1,2,163],"73":[2,1,1],"74":[1,2,99],"75":[1,2,86],"76":[2,1,1],"77":[1,2,125],"78":[1,2,80],"79":[1,2,66],"80":[1,2,71],"81":[2,1,1],"82":[1,2,104],"83":[1,2,69],"84":[1,2,41],"85":[1,2,38],"86":[1,2,80],"87":[2,1,1],"88":[1,2,101],"89":[1,2,101],"90":[2,1,1],"91":[1,2,129],"92":[1,2,145],"93":[1,2,140],"94":[1,2,139],"95":[1,2,154],"96":[1,2,136],"97":[1,2,135],"98":[1,2,148],"99":[1,2,136],"100":[1,2,137],"101":[2,1,1],"102":[1,2,64],"103":[1,2,162],"104":[1,2,27],"105":[1,2,69],"106":[1,2,42],"107":[1,2,60],"108":[1,2,100],"109":[1,2,33],"110":[2,1,1],"111":[1,2,96],"112":[1,2,103],"113":[1,2,111],"114":[1,2,85],"115":[1,2,84],"116":[1,2,159],"117":[1,2,84],"118":[1,2,84],"119":[2,1,1],"120":[1,2,33],"121":[1,2,75],"122":[1,2,114],"123":[1,2,78],"124":[2,1,1],"125":[1,2,28],"126":[1,2,51],"127":[1,2,20],"128":[1,2,86],"129":[1,2,138],"130":[1,2,25],"131":[1,2,82],"132":[1,2,71],"133":[2,1,1],"134":[1,2,95],"135":[2,1,1],"136":[1,2,30],"137":[1,2,28],"138":[2,1,1],"139":[1,2,94],"140":[1,2,94],"141":[2,1,1],"142":[1,2,186],"143":[1,2,159],"144":[2,1,1],"145":[1,2,116],"146":[1,2,101],"147":[1,2,145],"148":[1,2,112],"149":[1,2,100],"150":[2,1,1],"151":[1,2,109],"152":[1,2,103],"153":[1,2,96]},"averageFieldLength":[1.9090909090909098,2.3051948051948057,73.5909090909091],"storedFields":{"0":{"title":"Collection Builders","titles":[]},"1":{"title":"Collections API","titles":["Collection Builders"]},"2":{"title":"TaskInterface Objects","titles":["Collection Builders","Collections API"]},"3":{"title":"Functions","titles":["Collection Builders","Collections API"]},"4":{"title":"Closures","titles":["Collection Builders","Collections API"]},"5":{"title":"Methods","titles":["Collection Builders","Collections API"]},"6":{"title":"Using a Collection Builder","titles":["Collection Builders"]},"7":{"title":"Rollbacks and Completions","titles":["Collection Builders"]},"8":{"title":"Completion Tasks","titles":["Collection Builders","Rollbacks and Completions"]},"9":{"title":"Rollback Tasks","titles":["Collection Builders","Rollbacks and Completions"]},"10":{"title":"Rollback and Completion Methods","titles":["Collection Builders","Rollbacks and Completions"]},"11":{"title":"Rollback and Completion Callbacks","titles":["Collection Builders","Rollbacks and Completions"]},"12":{"title":"Temporary Objects","titles":["Collection Builders"]},"13":{"title":"Temporary Directories","titles":["Collection Builders","Temporary Objects"]},"14":{"title":"Temporary Files","titles":["Collection Builders","Temporary Objects"]},"15":{"title":"The Temporary Global Collection","titles":["Collection Builders","Temporary Objects"]},"16":{"title":"Chained State","titles":["Collection Builders"]},"17":{"title":"Implicitly Passing State","titles":["Collection Builders","Chained State"]},"18":{"title":"Explicitly Passing State","titles":["Collection Builders","Chained State"]},"19":{"title":"Named Tasks","titles":["Collection Builders"]},"20":{"title":"Extending","titles":[]},"21":{"title":"Including Additional Tasks","titles":["Extending"]},"22":{"title":"Register command files via PSR-4 autoloading","titles":["Extending"]},"23":{"title":"Creating a Robo Extension","titles":["Extending"]},"24":{"title":"Create your composer.json File","titles":["Extending","Creating a Robo Extension"]},"25":{"title":"Create the Tasks.php Trait","titles":["Extending","Creating a Robo Extension"]},"26":{"title":"Task implementation","titles":["Extending","Creating a Robo Extension"]},"27":{"title":"TaskIO","titles":["Extending","Creating a Robo Extension"]},"28":{"title":"Tasks That Use Tasks","titles":["Extending","Creating a Robo Extension"]},"29":{"title":"Testing Extensions","titles":["Extending","Creating a Robo Extension"]},"30":{"title":"Robo as a Framework","titles":[]},"31":{"title":"Creating a Standalone Phar with Robo","titles":["Robo as a Framework"]},"32":{"title":"Using Multiple RoboFiles in a Standalone Application","titles":["Robo as a Framework"]},"33":{"title":"Using Your Own Dependency Injection Container with Robo (Advanced)","titles":["Robo as a Framework"]},"34":{"title":"Using a Custom Configuration Loader","titles":["Robo as a Framework"]},"35":{"title":"Getting Started","titles":[]},"36":{"title":"Commands","titles":["Getting Started"]},"37":{"title":"Arguments","titles":["Getting Started","Commands"]},"38":{"title":"Options","titles":["Getting Started","Commands"]},"39":{"title":"Load From Other Robofile","titles":["Getting Started","Commands"]},"40":{"title":"Pass-Through Arguments","titles":["Getting Started","Commands"]},"41":{"title":"Help","titles":["Getting Started","Commands"]},"42":{"title":"Ignored methods","titles":["Getting Started","Commands"]},"43":{"title":"Tasks","titles":["Getting Started"]},"44":{"title":"Shortcuts","titles":["Getting Started","Tasks"]},"45":{"title":"Result","titles":["Getting Started","Tasks"]},"46":{"title":"Stack","titles":["Getting Started","Tasks"]},"47":{"title":"Global StopOnFail","titles":["Getting Started","Tasks"]},"48":{"title":"Progress","titles":["Getting Started","Tasks"]},"49":{"title":"Configuration","titles":["Getting Started"]},"50":{"title":"Configuration for Command Options","titles":["Getting Started","Configuration"]},"51":{"title":"Configuration for Task Settings","titles":["Getting Started","Configuration"]},"52":{"title":"Accessing Configuration Directly","titles":["Getting Started","Configuration"]},"53":{"title":"Providing Default Configuration in Code","titles":["Getting Started","Configuration"]},"54":{"title":"Loading Configuration From Another Source","titles":["Getting Started","Configuration"]},"55":{"title":"IO","titles":["Getting Started"]},"56":{"title":"Formatters","titles":["Getting Started","IO"]},"57":{"title":"Working with Composer","titles":["Getting Started"]},"58":{"title":"Adding a RoboFile to your Project","titles":["Getting Started","Working with Composer"]},"59":{"title":"Implementing Composer Scripts with Robo","titles":["Getting Started","Working with Composer"]},"60":{"title":"Robo as a Framework","titles":["Getting Started"]},"61":{"title":"Automate common tasks:","titles":[]},"62":{"title":"Installing","titles":[]},"63":{"title":"Phar","titles":["Installing"]},"64":{"title":"Composer","titles":["Installing"]},"65":{"title":"Usage","titles":[]},"66":{"title":"Examples","titles":[]},"67":{"title":"We need more tasks!","titles":[]},"68":{"title":"Credits","titles":[]},"69":{"title":"Robo Documentation","titles":[]},"70":{"title":"Tasks","titles":["Robo Documentation"]},"71":{"title":"ApiGen Tasks","titles":[]},"72":{"title":"ApiGen","titles":["ApiGen Tasks"]},"73":{"title":"Archive Tasks","titles":[]},"74":{"title":"Extract","titles":["Archive Tasks"]},"75":{"title":"Pack","titles":["Archive Tasks"]},"76":{"title":"Assets Tasks","titles":[]},"77":{"title":"ImageMinify","titles":["Assets Tasks"]},"78":{"title":"Less","titles":["Assets Tasks"]},"79":{"title":"Minify","titles":["Assets Tasks"]},"80":{"title":"Scss","titles":["Assets Tasks"]},"81":{"title":"Base Tasks","titles":[]},"82":{"title":"Exec","titles":["Base Tasks"]},"83":{"title":"ExecStack","titles":["Base Tasks"]},"84":{"title":"ParallelExec","titles":["Base Tasks"]},"85":{"title":"SymfonyCommand","titles":["Base Tasks"]},"86":{"title":"Watch","titles":["Base Tasks"]},"87":{"title":"Bower Tasks","titles":[]},"88":{"title":"Install","titles":["Bower Tasks"]},"89":{"title":"Update","titles":["Bower Tasks"]},"90":{"title":"Composer Tasks","titles":[]},"91":{"title":"CheckPlatformReqs","titles":["Composer Tasks"]},"92":{"title":"Config","titles":["Composer Tasks"]},"93":{"title":"CreateProject","titles":["Composer Tasks"]},"94":{"title":"DumpAutoload","titles":["Composer Tasks"]},"95":{"title":"Init","titles":["Composer Tasks"]},"96":{"title":"Install","titles":["Composer Tasks"]},"97":{"title":"Remove","titles":["Composer Tasks"]},"98":{"title":"RequireDependency","titles":["Composer Tasks"]},"99":{"title":"Update","titles":["Composer Tasks"]},"100":{"title":"Validate","titles":["Composer Tasks"]},"101":{"title":"Development Tasks","titles":[]},"102":{"title":"Changelog","titles":["Development Tasks"]},"103":{"title":"GenerateMarkdownDoc","titles":["Development Tasks"]},"104":{"title":"Generate","titles":["Development Tasks"]},"105":{"title":"GitHubRelease","titles":["Development Tasks"]},"106":{"title":"OpenBrowser","titles":["Development Tasks"]},"107":{"title":"PackPhar","titles":["Development Tasks"]},"108":{"title":"PhpServer","titles":["Development Tasks"]},"109":{"title":"SemVer","titles":["Development Tasks"]},"110":{"title":"Docker Tasks","titles":[]},"111":{"title":"Build","titles":["Docker Tasks"]},"112":{"title":"Commit","titles":["Docker Tasks"]},"113":{"title":"Exec","titles":["Docker Tasks"]},"114":{"title":"Pull","titles":["Docker Tasks"]},"115":{"title":"Remove","titles":["Docker Tasks"]},"116":{"title":"Run","titles":["Docker Tasks"]},"117":{"title":"Start","titles":["Docker Tasks"]},"118":{"title":"Stop","titles":["Docker Tasks"]},"119":{"title":"File Tasks","titles":[]},"120":{"title":"Concat","titles":["File Tasks"]},"121":{"title":"Replace","titles":["File Tasks"]},"122":{"title":"TmpFile","titles":["File Tasks"]},"123":{"title":"Write","titles":["File Tasks"]},"124":{"title":"Filesystem Tasks","titles":[]},"125":{"title":"CleanDir","titles":["Filesystem Tasks"]},"126":{"title":"CopyDir","titles":["Filesystem Tasks"]},"127":{"title":"DeleteDir","titles":["Filesystem Tasks"]},"128":{"title":"FilesystemStack","titles":["Filesystem Tasks"]},"129":{"title":"FlattenDir","titles":["Filesystem Tasks"]},"130":{"title":"MirrorDir","titles":["Filesystem Tasks"]},"131":{"title":"TmpDir","titles":["Filesystem Tasks"]},"132":{"title":"WorkDir","titles":["Filesystem Tasks"]},"133":{"title":"Gulp Tasks","titles":[]},"134":{"title":"Run","titles":["Gulp Tasks"]},"135":{"title":"Logfile Tasks","titles":[]},"136":{"title":"RotateLog","titles":["Logfile Tasks"]},"137":{"title":"TruncateLog","titles":["Logfile Tasks"]},"138":{"title":"Npm Tasks","titles":[]},"139":{"title":"Install","titles":["Npm Tasks"]},"140":{"title":"Update","titles":["Npm Tasks"]},"141":{"title":"Remote Tasks","titles":[]},"142":{"title":"Rsync","titles":["Remote Tasks"]},"143":{"title":"Ssh","titles":["Remote Tasks"]},"144":{"title":"Testing Tasks","titles":[]},"145":{"title":"Atoum","titles":["Testing Tasks"]},"146":{"title":"Behat","titles":["Testing Tasks"]},"147":{"title":"Codecept","titles":["Testing Tasks"]},"148":{"title":"PHPUnit","titles":["Testing Tasks"]},"149":{"title":"Phpspec","titles":["Testing Tasks"]},"150":{"title":"Vcs Tasks","titles":[]},"151":{"title":"GitStack","titles":["Vcs Tasks"]},"152":{"title":"HgStack","titles":["Vcs Tasks"]},"153":{"title":"SvnStack","titles":["Vcs Tasks"]}},"dirtCount":0,"index":[["6",{"2":{"151":2,"152":2}}],["│",{"2":{"129":2}}],["├──",{"2":{"129":3}}],["└──",{"2":{"129":4}}],["8080",{"2":{"116":1}}],["80",{"2":{"116":1}}],["8000",{"2":{"66":2,"108":3}}],["8",{"2":{"98":1}}],["zopflipng",{"2":{"77":1}}],["zip",{"2":{"74":1,"75":2}}],["^",{"2":{"98":1}}],["^3",{"2":{"64":1,"79":1}}],["^2",{"2":{"31":1,"58":1,"59":1,"79":1}}],["999999",{"2":{"49":1}}],["|commandinterface",{"2":{"83":1,"143":1,"151":1,"152":1,"153":1}}],["|",{"2":{"41":38}}],["+x",{"2":{"63":2}}],["++$i",{"2":{"48":1}}],["+",{"2":{"41":22}}],["~^service",{"2":{"121":1}}],["~0",{"2":{"78":1}}],["~",{"2":{"36":1,"66":1,"84":3,"121":1}}],["~1",{"2":{"24":1,"78":1,"80":1}}],["➜",{"2":{"36":1,"37":2,"38":1}}],["junit",{"2":{"147":1,"148":1}}],["just",{"2":{"35":1,"45":1,"142":2}}],["jsqueeze",{"2":{"79":1}}],["js",{"2":{"79":4,"129":9}}],["json",{"0":{"24":1},"2":{"21":1,"22":2,"24":1,"31":2,"40":1,"56":1,"58":1,"59":3,"66":2,"67":1,"86":1,"147":2,"148":2}}],["jpegoptim",{"2":{"77":1}}],["jpegtran",{"2":{"77":4}}],["jpeg",{"2":{"77":2}}],["jpg",{"2":{"77":4}}],["java",{"2":{"66":1}}],["jar",{"2":{"66":3}}],["jonsa",{"2":{"41":1}}],["jon",{"2":{"37":2}}],["x26",{"2":{"63":4}}],["xml",{"2":{"34":1,"147":4,"148":1}}],["x3c",{"2":{"2":1,"3":1,"4":1,"5":1,"6":1,"11":1,"13":2,"15":1,"17":2,"18":2,"19":3,"22":1,"26":1,"31":1,"33":2,"35":1,"36":1,"37":2,"38":2,"40":1,"41":1,"42":1,"44":1,"45":1,"48":2,"50":1,"66":3,"72":1,"74":1,"75":2,"78":2,"79":1,"80":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":2,"103":2,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"111":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":3,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1,"139":1,"140":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["quiet",{"2":{"72":1,"143":1,"149":1}}],["query",{"2":{"27":1}}],["quot",{"2":{"6":4,"16":2,"18":2,"25":2,"31":4,"46":2,"48":4,"56":4,"59":2,"67":4,"77":4}}],["3306",{"2":{"116":1}}],["39",{"2":{"66":1}}],["3",{"2":{"27":2,"121":1}}],["`composer",{"2":{"66":1}}],["`",{"2":{"26":1}}],["`task",{"2":{"26":1}}],["5",{"2":{"24":3,"78":2}}],["123456",{"2":{"116":1}}],["123",{"2":{"105":1}}],["11+",{"2":{"63":2}}],["10",{"2":{"48":1,"63":2}}],["1",{"2":{"22":1,"38":2,"102":1,"105":1,"121":1,"129":4,"151":1}}],["4",{"0":{"22":1},"2":{"22":3,"24":1,"31":1,"98":1}}],["0000",{"2":{"128":1}}],["0777",{"2":{"128":1}}],["0",{"2":{"20":1,"24":2,"48":2,"66":1,"79":2,"80":2,"102":2,"105":2,"108":8,"121":4,"129":1,"151":4,"152":4}}],["2",{"2":{"20":1,"22":2,"66":1,"98":1,"121":1}}],["yell",{"2":{"36":1}}],["yamlconfigloader",{"2":{"34":2}}],["yml",{"2":{"31":1,"33":1,"34":3,"40":2,"44":2,"49":4,"50":1,"53":2,"54":2,"121":1,"147":1}}],["y",{"2":{"13":2,"29":1,"121":2,"122":1,"123":1,"142":2}}],["you",{"2":{"10":2,"11":1,"17":2,"19":1,"20":2,"21":7,"22":2,"24":1,"26":3,"27":1,"29":1,"32":7,"33":4,"34":7,"35":2,"36":2,"37":1,"38":1,"39":1,"40":1,"43":1,"45":1,"50":2,"51":1,"54":1,"55":3,"58":2,"59":7,"63":1,"66":5,"68":1,"77":1,"78":1,"80":1,"83":1,"103":1,"112":1,"129":6,"131":1,"142":2,"143":2,"147":3,"151":1,"152":1,"153":1}}],["your",{"0":{"24":1,"33":1,"58":1},"2":{"0":1,"15":1,"20":7,"21":3,"22":4,"23":1,"24":3,"25":1,"26":3,"27":1,"29":3,"30":1,"31":9,"32":3,"33":6,"34":1,"35":2,"36":1,"40":1,"42":1,"54":1,"55":1,"58":3,"59":16,"60":1,"65":1,"67":1,"78":1,"80":1}}],["hgsubversion",{"2":{"152":1}}],["hgstack",{"0":{"152":1}}],["hg",{"2":{"142":1,"152":8}}],["humanreadable",{"2":{"142":1}}],["html",{"2":{"142":2,"143":2,"147":3}}],["http",{"2":{"106":3,"153":2}}],["https",{"2":{"63":1,"106":1,"152":1}}],["hostname",{"2":{"143":1}}],["host",{"2":{"108":1,"142":2}}],["hosted",{"2":{"31":1}}],["homecommand",{"2":{"106":1}}],["homepage",{"2":{"95":1}}],["hoy",{"2":{"84":1}}],["however",{"2":{"47":1,"52":1}}],["how",{"2":{"23":1,"29":1,"43":1,"53":1,"55":1,"60":1,"121":1,"129":1}}],["higher",{"2":{"24":1}}],["hey",{"2":{"84":1}}],["here",{"2":{"66":1}}],["hello",{"2":{"36":4,"37":9,"38":8,"50":6,"55":1}}],["helps",{"2":{"102":1,"109":1}}],["help",{"0":{"41":1},"2":{"22":2,"41":5,"59":1}}],["helpful",{"2":{"18":1}}],["head",{"2":{"6":1}}],["hand",{"2":{"74":1}}],["handle",{"2":{"45":1}}],["happen",{"2":{"59":1}}],["have",{"2":{"17":1,"19":1,"21":2,"22":1,"25":1,"28":1,"32":1,"36":1,"38":1,"44":1,"45":1,"50":1,"54":1,"59":1}}],["has",{"2":{"13":1,"16":1,"19":1,"21":1,"27":1,"32":1,"36":1,"39":3,"51":1,"75":1}}],["===",{"2":{"142":1}}],["===0",{"2":{"103":1}}],["=>",{"2":{"38":2,"41":1,"48":1,"50":1,"77":2,"78":2,"80":1,"126":1,"129":2,"130":1}}],["=",{"2":{"6":2,"13":4,"15":4,"17":3,"18":1,"24":1,"25":1,"26":3,"29":3,"31":13,"32":3,"33":13,"34":3,"37":1,"38":8,"39":1,"41":1,"45":2,"48":4,"50":1,"55":1,"66":3,"72":5,"74":1,"77":1,"78":1,"80":1,"82":5,"83":1,"85":1,"86":2,"88":5,"89":5,"91":13,"92":15,"93":15,"94":14,"95":14,"96":14,"97":17,"98":15,"99":14,"100":18,"102":1,"107":5,"108":5,"109":2,"111":5,"112":6,"113":6,"114":5,"115":5,"116":11,"117":5,"118":5,"122":3,"123":1,"126":1,"128":13,"131":4,"132":3,"134":5,"139":5,"140":5,"142":7,"143":7,"145":5,"146":6,"147":12,"148":8,"149":6,"151":12,"152":9,"153":4}}],["lurker",{"2":{"86":5}}],["level",{"2":{"74":2}}],["lesscompilers",{"2":{"78":1}}],["lessphp",{"2":{"78":2}}],["less",{"0":{"78":1},"2":{"61":1,"74":1,"78":9}}],["leafo",{"2":{"78":1}}],["learn",{"2":{"66":1}}],["league",{"2":{"29":2,"33":2}}],["least",{"2":{"9":1}}],["legacy",{"2":{"20":1}}],["logfile",{"0":{"135":1},"1":{"136":1,"137":1},"2":{"136":2,"137":2}}],["log",{"2":{"102":1,"127":1,"128":3,"131":2,"132":2,"136":3,"137":3,"148":2}}],["logs",{"2":{"66":3,"125":1,"128":4,"143":1}}],["logger",{"2":{"27":2}}],["localhost",{"2":{"106":3,"121":1,"142":1}}],["local",{"2":{"59":1,"63":2,"66":1,"77":1}}],["locate",{"2":{"32":1}}],["located",{"2":{"31":1,"39":1}}],["location",{"2":{"13":2,"31":2,"74":1,"132":1}}],["lock",{"2":{"40":1}}],["loop",{"2":{"33":1}}],["lookup",{"2":{"33":1,"78":1}}],["look",{"2":{"24":1,"41":2,"45":1,"56":1,"66":1}}],["looks",{"2":{"15":1,"25":1}}],["loadconfiguration",{"2":{"54":1}}],["loaded",{"2":{"49":1,"54":2}}],["loaders",{"2":{"34":1}}],["loader",{"0":{"34":1},"2":{"34":5,"94":1}}],["loadshortcuts",{"2":{"45":1}}],["load",{"0":{"39":1},"2":{"31":2,"39":2,"49":1,"59":1}}],["loading",{"0":{"54":1},"2":{"25":1,"66":1}}],["loadtasks",{"2":{"20":1}}],["lot",{"2":{"13":1,"32":1}}],["longcamelcased",{"2":{"36":1}}],["longer",{"2":{"13":1,"48":1}}],["long",{"2":{"8":1,"36":1,"48":1}}],["la",{"2":{"143":1}}],["launching",{"2":{"84":1}}],["launches",{"2":{"66":1}}],["large",{"2":{"32":1}}],["latest",{"2":{"31":1,"88":1,"89":1}}],["later",{"2":{"8":1,"10":1,"16":1,"34":1}}],["last",{"2":{"13":1,"38":1}}],["light",{"2":{"145":1}}],["lightreport",{"2":{"145":1}}],["limit",{"2":{"121":1}}],["limited",{"2":{"39":1}}],["linked",{"2":{"116":1}}],["link",{"2":{"116":2}}],["lines",{"2":{"122":2,"123":2}}],["line",{"2":{"38":1,"40":1,"44":1,"50":1,"79":1,"122":2,"123":2,"128":1}}],["linear",{"2":{"0":1}}],["li",{"2":{"63":1}}],["library2",{"2":{"129":2}}],["library1",{"2":{"129":6}}],["library",{"2":{"59":1,"86":1}}],["libraries",{"2":{"31":1}}],["license",{"2":{"40":1,"95":1}}],["lists",{"2":{"22":1}}],["list",{"2":{"21":1,"22":1,"32":1,"59":2,"66":1,"75":2,"126":1}}],["like",{"2":{"10":2,"14":1,"15":1,"18":1,"24":1,"41":2,"45":2,"59":2,"75":1,"122":1}}],["ls",{"2":{"2":1,"40":4,"143":1}}],[">update",{"2":{"153":1}}],[">uri",{"2":{"105":1}}],[">xml",{"2":{"147":1}}],[">group",{"2":{"147":1,"148":1}}],[">getpath",{"2":{"122":1,"131":1,"132":1}}],[">getcid",{"2":{"116":1}}],[">getcommand",{"2":{"29":1}}],[">getcontainer",{"2":{"29":1}}],[">getname",{"2":{"103":1}}],[">getresource",{"2":{"86":1}}],[">getrealpath",{"2":{"66":1,"107":2}}],[">getrelativepathname",{"2":{"66":1,"107":2}}],[">getexecutiontime",{"2":{"48":1}}],[">get",{"2":{"33":1}}],[">hgstack",{"2":{"152":1}}],[">html",{"2":{"147":1}}],[">humanreadable",{"2":{"142":1}}],[">host",{"2":{"108":1}}],[">format",{"2":{"146":1,"149":1}}],[">frompath",{"2":{"142":2}}],[">from",{"2":{"121":3}}],[">filtermethods",{"2":{"103":1}}],[">files",{"2":{"17":3,"66":1,"107":1,"145":1}}],[">verbose",{"2":{"142":1}}],[">version",{"2":{"102":2}}],[">volume",{"2":{"116":1}}],[">env",{"2":{"116":2,"147":1}}],[">exec",{"2":{"83":2,"112":1,"113":2,"116":1,"143":3}}],[">executable",{"2":{"66":1}}],[">execute",{"2":{"31":1}}],[">excludevcs",{"2":{"142":2}}],[">exclude",{"2":{"75":1}}],[">extrapolated",{"2":{"51":1}}],[">extend",{"2":{"34":2}}],[">export",{"2":{"34":1}}],[">nointeraction",{"2":{"146":1,"149":1}}],[">nodev",{"2":{"88":1,"89":1,"94":1,"139":1,"140":1}}],[">name",{"2":{"66":1,"103":2,"107":2,"112":2,"116":3}}],[">optimizeautoloader",{"2":{"96":1,"99":1}}],[">optimize",{"2":{"94":2}}],[">opt",{"2":{"85":1}}],[">bootstrap",{"2":{"148":1}}],[">background",{"2":{"66":2,"82":1,"108":1}}],[">before",{"2":{"19":1}}],[">isprotected",{"2":{"103":1}}],[">ispublic",{"2":{"103":1}}],[">includeparents",{"2":{"129":1}}],[">increment",{"2":{"109":1}}],[">interactive",{"2":{"113":2}}],[">in",{"2":{"66":1,"107":2}}],[">ignorevcs",{"2":{"66":1}}],[">io",{"2":{"55":1}}],[">importdir",{"2":{"78":1,"80":1}}],[">import",{"2":{"34":1}}],[">wholefile",{"2":{"142":1}}],[">wipeout",{"2":{"72":1}}],[">wassuccessful",{"2":{"45":2,"82":1}}],[">workdir",{"2":{"13":1,"132":1}}],[">link",{"2":{"116":1}}],[">line",{"2":{"13":6,"122":3,"123":3}}],[">load",{"2":{"34":2}}],[">dryrun",{"2":{"142":1}}],[">drush",{"2":{"29":1}}],[">dockercommit",{"2":{"112":1}}],[">docclass",{"2":{"103":3}}],[">detached",{"2":{"113":1,"116":2}}],[">description",{"2":{"105":1}}],[">dependency",{"2":{"98":1}}],[">defer",{"2":{"18":1}}],[">defertaskconfiguration",{"2":{"18":1}}],[">dir",{"2":{"51":1,"66":1,"108":1}}],[">discover",{"2":{"32":1}}],[">silent",{"2":{"134":1}}],[">symlink",{"2":{"128":1}}],[">suite",{"2":{"113":1,"147":1}}],[">source",{"2":{"93":1}}],[">stats",{"2":{"142":2}}],[">startprogressindicator",{"2":{"48":1}}],[">stub",{"2":{"107":1}}],[">steps",{"2":{"48":2}}],[">stopprogressindicator",{"2":{"48":1}}],[">stoponfail",{"2":{"47":1,"83":1,"151":2,"153":1}}],[">storestate",{"2":{"18":2}}],[">say",{"2":{"36":1,"37":2,"38":2,"45":1,"50":1,"55":1,"82":1,"116":1}}],[">set",{"2":{"92":1}}],[">setexecutabledir",{"2":{"77":1}}],[">setsearchpattern",{"2":{"32":1}}],[">setselfupdaterepository",{"2":{"31":1,"33":1}}],[">setclassloader",{"2":{"31":1}}],[">setconfig",{"2":{"33":1}}],[">setconfigurationfilename",{"2":{"31":1}}],[">setcontainer",{"2":{"29":1,"33":1}}],[">push",{"2":{"151":3,"152":2}}],[">pull",{"2":{"143":1,"152":1}}],[">publish",{"2":{"116":2}}],[">parentdir",{"2":{"129":1}}],[">path",{"2":{"26":1}}],[">progress",{"2":{"142":2}}],[">processmethoddocblock",{"2":{"103":1}}],[">processmethodsignature",{"2":{"103":1}}],[">processclassdocblock",{"2":{"103":1}}],[">processclasssignature",{"2":{"103":1}}],[">processclass",{"2":{"103":1}}],[">process",{"2":{"84":3}}],[">preferdist",{"2":{"94":1,"96":1,"99":1}}],[">preservetopdirectory",{"2":{"74":1}}],[">printtaskinfo",{"2":{"27":1}}],[">printoutput",{"2":{"18":2}}],[">=5",{"2":{"24":1}}],[">archive",{"2":{"142":1}}],[">arg",{"2":{"66":1,"82":1,"85":2}}],[">args",{"2":{"40":1}}],[">askforchanges",{"2":{"102":1}}],[">ask",{"2":{"55":1,"142":1}}],[">assertequals",{"2":{"29":1}}],[">advanceprogressindicator",{"2":{"48":1}}],[">addstripped",{"2":{"107":1}}],[">addfile",{"2":{"66":2,"75":1,"107":1}}],[">addcode",{"2":{"3":1,"4":1,"5":1,"19":1}}],[">add",{"2":{"2":1,"33":1,"75":2,"151":2,"152":1,"153":1}}],[">after",{"2":{"19":1}}],[">minifier",{"2":{"77":2}}],[">monitor",{"2":{"66":1,"86":4}}],[">mkdir",{"2":{"18":1,"128":1,"131":1,"132":1}}],[">merge",{"2":{"6":1}}],[">tag",{"2":{"111":1,"151":1,"152":1}}],[">target",{"2":{"93":1}}],[">taskphpspec",{"2":{"149":1}}],[">taskphpunit",{"2":{"148":1}}],[">taskparallelexec",{"2":{"84":1}}],[">taskpack",{"2":{"75":1}}],[">taskpackphar",{"2":{"66":1,"107":1}}],[">taskbehat",{"2":{"146":1}}],[">taskbowerupdate",{"2":{"89":2}}],[">taskbowerinstall",{"2":{"88":2}}],[">taskatoum",{"2":{"145":1}}],[">taskapigen",{"2":{"72":1}}],[">tasknpmupdate",{"2":{"140":2}}],[">tasknpminstall",{"2":{"139":2}}],[">tasktruncatelog",{"2":{"137":1}}],[">tasktmpfile",{"2":{"122":1}}],[">taskrsync",{"2":{"142":2}}],[">taskrotatelog",{"2":{"136":1}}],[">taskreplaceinfile",{"2":{"121":4}}],[">taskflattendir",{"2":{"129":3}}],[">taskfilesystemstack",{"2":{"6":2,"13":1,"18":2,"128":1,"131":1,"132":1}}],[">taskopenbrowser",{"2":{"106":2}}],[">taskmirrordir",{"2":{"130":1}}],[">taskminify",{"2":{"79":1}}],[">taskmyoperation",{"2":{"51":1}}],[">taskless",{"2":{"78":2}}],[">taskimageminify",{"2":{"77":4}}],[">taskdockerstop",{"2":{"118":1}}],[">taskdockerstart",{"2":{"117":1}}],[">taskdockerremove",{"2":{"115":1}}],[">taskdockerrun",{"2":{"112":1,"113":1,"116":5}}],[">taskdockerpull",{"2":{"114":1}}],[">taskdockerexec",{"2":{"113":2}}],[">taskdockercommit",{"2":{"112":1,"116":1}}],[">taskdockerbuild",{"2":{"111":2}}],[">taskdeletedir",{"2":{"66":1,"127":1}}],[">taskdrushstack",{"2":{"29":1}}],[">taskcopydir",{"2":{"126":1}}],[">taskconcat",{"2":{"120":1}}],[">taskcodecept",{"2":{"113":1,"147":1}}],[">taskcomposerrequire",{"2":{"98":1}}],[">taskcomposerremove",{"2":{"97":1}}],[">taskcomposerinit",{"2":{"95":1}}],[">taskcomposerinstall",{"2":{"51":1,"96":3}}],[">taskcomposerdumpautoload",{"2":{"94":4}}],[">taskcomposercreateproject",{"2":{"93":1}}],[">taskcomposerconfig",{"2":{"92":1}}],[">taskcomposervalidate",{"2":{"91":1,"100":1}}],[">taskcomposerupdate",{"2":{"66":1,"86":1,"99":3}}],[">taskchangelog",{"2":{"102":2}}],[">taskcleandir",{"2":{"66":1,"125":1}}],[">taskwatch",{"2":{"66":1,"86":2}}],[">taskwritetofile",{"2":{"13":2,"123":1}}],[">tasksvnstack",{"2":{"153":2}}],[">tasksshexec",{"2":{"143":2}}],[">tasksemver",{"2":{"109":1}}],[">taskserver",{"2":{"66":1,"108":3}}],[">taskscss",{"2":{"80":1}}],[">tasksymfonycommand",{"2":{"66":1,"85":2}}],[">task",{"2":{"25":1,"26":1}}],[">taskextract",{"2":{"74":1}}],[">taskexecstack",{"2":{"83":1}}],[">taskexec",{"2":{"2":1,"6":1,"18":2,"40":1,"66":1,"82":3,"86":1}}],[">taskencrypt",{"2":{"17":2}}],[">taskgulprun",{"2":{"134":2}}],[">taskgithubrelease",{"2":{"105":1}}],[">taskgitstack",{"2":{"6":2,"143":1,"151":2}}],[">taskgendoc",{"2":{"103":2}}],[">taskgeneratetask",{"2":{"104":1}}],[">taskgenerate",{"2":{"17":2}}],[">templateconfig",{"2":{"72":1}}],[">title",{"2":{"55":1}}],[">topath",{"2":{"142":2}}],[">touser",{"2":{"142":1}}],[">touch",{"2":{"128":1,"131":1,"132":1}}],[">tohost",{"2":{"142":1}}],[">to",{"2":{"26":1,"74":1,"77":4,"120":1,"121":4,"129":1}}],[">tmpdir",{"2":{"13":1,"131":1}}],[">runner",{"2":{"33":4}}],[">run",{"2":{"13":2,"17":3,"18":2,"33":2,"40":1,"51":2,"66":8,"72":1,"74":1,"75":1,"77":4,"78":2,"79":1,"80":1,"82":3,"83":1,"84":1,"85":2,"86":4,"88":2,"89":2,"91":1,"92":1,"93":1,"94":4,"95":1,"96":3,"97":1,"98":1,"99":3,"100":1,"102":2,"103":2,"104":1,"105":1,"106":2,"107":1,"108":3,"109":1,"111":2,"112":3,"113":3,"114":1,"115":1,"116":6,"117":1,"118":1,"120":1,"121":4,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":3,"130":1,"131":2,"132":1,"134":2,"136":1,"137":1,"139":2,"140":2,"142":3,"143":2,"145":1,"146":1,"147":1,"148":1,"149":1,"151":2,"152":1,"153":2}}],[">recursive",{"2":{"142":1}}],[">remotedir",{"2":{"143":2}}],[">remoteshell",{"2":{"142":1}}],[">remove",{"2":{"6":1}}],[">regex",{"2":{"121":1}}],[">rename",{"2":{"13":1}}],[">rollbackcode",{"2":{"11":1}}],[">clonerepo",{"2":{"152":1}}],[">checksum",{"2":{"142":1}}],[">checkout",{"2":{"6":2,"143":1,"153":1}}],[">chgrp",{"2":{"128":1}}],[">change",{"2":{"102":1,"105":2}}],[">commit",{"2":{"151":2,"152":1,"153":1}}],[">compress",{"2":{"107":1}}],[">compiler",{"2":{"78":1}}],[">completioncode",{"2":{"11":1}}],[">completion",{"2":{"6":2}}],[">configfile",{"2":{"145":1}}],[">config",{"2":{"72":1}}],[">copy",{"2":{"6":1}}],[">collectionbuilder",{"2":{"6":1,"13":2,"17":1,"18":2,"66":8,"122":1,"131":1,"132":1}}],[">",{"2":{"2":1,"3":1,"4":1,"5":1,"6":1,"11":1,"13":2,"15":1,"17":2,"18":2,"19":3,"26":1,"35":1,"36":1,"37":2,"38":2,"40":1,"41":1,"42":1,"44":3,"45":3,"48":1,"50":1,"72":1,"74":1,"75":1,"78":2,"79":1,"80":1,"82":2,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":2,"105":1,"107":2,"108":1,"109":1,"111":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":2,"126":2,"127":2,"128":3,"129":4,"130":2,"131":2,"132":1,"134":1,"136":2,"137":2,"139":1,"140":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":2}}],["$xml",{"2":{"147":1}}],["$gittask",{"2":{"143":1}}],["$group",{"2":{"128":1,"147":3,"148":4}}],["$groups",{"2":{"72":2}}],["$graphic",{"2":{"41":1}}],["$html",{"2":{"147":1}}],["$hostname",{"2":{"143":2}}],["$host",{"2":{"108":2}}],["$homepage",{"2":{"95":2}}],["$home",{"2":{"49":1}}],["$header",{"2":{"102":2}}],["$nocheckpublish",{"2":{"100":2}}],["$nochecklock",{"2":{"100":2}}],["$nocheckall",{"2":{"100":2}}],["$noupdate",{"2":{"97":2}}],["$noprogress",{"2":{"97":2}}],["$nosuggest",{"2":{"96":1,"98":1,"99":1}}],["$noinstall",{"2":{"93":2}}],["$name",{"2":{"55":1,"72":2,"105":2,"112":2,"116":4,"122":1,"123":1}}],["$val",{"2":{"122":1,"123":1}}],["$value",{"2":{"42":1,"72":2,"82":2,"85":2,"88":2,"89":2,"91":2,"92":3,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"108":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"126":1,"134":2,"139":2,"140":2,"142":2,"143":2,"145":2,"146":2,"147":2,"148":2,"149":2}}],["$version",{"2":{"93":2,"95":1,"98":1,"102":5,"109":2}}],["$umask",{"2":{"128":1}}],["$user",{"2":{"105":2,"116":2,"128":1,"143":2}}],["$useglobal",{"2":{"92":1}}],["$updatewithdependencies",{"2":{"97":2}}],["$updatenodev",{"2":{"97":2}}],["$uri",{"2":{"92":1,"105":2}}],["$keep",{"2":{"93":2,"136":2}}],["$keepimportantcomments",{"2":{"79":1}}],["$key",{"2":{"92":1}}],["$message",{"2":{"151":2,"152":2,"153":1}}],["$mode",{"2":{"128":1}}],["$mysql",{"2":{"116":2}}],["$myobject",{"2":{"5":1,"11":2}}],["$minifier",{"2":{"77":1}}],["$failgroup",{"2":{"147":2}}],["$force",{"2":{"128":2}}],["$formater",{"2":{"146":2,"149":2}}],["$format",{"2":{"109":2}}],["$formattername",{"2":{"78":2,"80":1}}],["$fromhost",{"2":{"142":2}}],["$fromuser",{"2":{"142":2}}],["$from",{"2":{"116":2,"121":1,"128":4}}],["$finder",{"2":{"107":4}}],["$filter",{"2":{"148":2}}],["$filterproperties",{"2":{"103":1}}],["$filterclasses",{"2":{"103":1}}],["$filtermethods",{"2":{"103":1}}],["$file",{"2":{"66":3,"107":10,"128":5,"142":4,"145":2,"147":4,"148":9}}],["$filesystemlocation",{"2":{"75":2}}],["$files",{"2":{"66":2,"107":2,"145":1,"148":1}}],["$filename",{"2":{"15":2,"26":2,"102":2,"103":2,"121":2,"122":3,"123":3,"143":2}}],["$fn",{"2":{"74":1}}],["$quiet",{"2":{"72":2}}],["$what",{"2":{"109":2}}],["$withdependencies",{"2":{"100":2}}],["$wipeout",{"2":{"72":2}}],["$waitinterval",{"2":{"84":2}}],["$world",{"2":{"36":2,"37":4}}],["$workingpath",{"2":{"132":3}}],["$work",{"2":{"4":2,"13":6,"19":6}}],["$zipped",{"2":{"72":2}}],["$level",{"2":{"146":2,"149":2}}],["$levels",{"2":{"72":2}}],["$lines",{"2":{"122":1,"123":1}}],["$line",{"2":{"122":1,"123":1}}],["$limit",{"2":{"121":1}}],["$license",{"2":{"95":2}}],["$loader",{"2":{"34":3}}],["$dryrun",{"2":{"142":2}}],["$draft",{"2":{"105":2}}],["$data",{"2":{"102":2,"109":2}}],["$dst",{"2":{"79":1,"120":1}}],["$disable",{"2":{"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2}}],["$discovery",{"2":{"32":2}}],["$directories",{"2":{"145":1}}],["$directory",{"2":{"77":1}}],["$dirs",{"2":{"78":2,"80":2}}],["$dir",{"2":{"72":1,"78":1,"80":1,"82":1,"83":1,"88":1,"89":1,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"111":1,"112":1,"113":1,"114":1,"115":1,"116":5,"117":1,"118":1,"128":1,"129":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":2,"148":1,"149":1,"151":1,"152":1,"153":1}}],["$description",{"2":{"95":2,"105":4}}],["$destination",{"2":{"74":1}}],["$dest",{"2":{"72":2}}],["$dev",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":2,"98":1,"99":1,"100":1}}],["$debug",{"2":{"72":2}}],["$depth",{"2":{"151":1}}],["$dep",{"2":{"72":2}}],["$branch",{"2":{"151":6,"152":2,"153":1}}],["$body",{"2":{"102":1}}],["$bar",{"2":{"72":2}}],["$baseurl",{"2":{"72":2}}],["$basedir",{"2":{"15":2}}],["$builddir",{"2":{"51":1}}],["$origin",{"2":{"151":2}}],["$overwrite",{"2":{"126":1}}],["$owner",{"2":{"105":2}}],["$optimize",{"2":{"91":1,"92":1,"93":1,"94":3,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["$option",{"2":{"72":2,"82":2,"85":1,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"108":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"134":2,"139":2,"140":2,"142":2,"143":2,"145":2,"146":2,"147":2,"148":2,"149":2}}],["$options",{"2":{"38":2,"72":1,"77":1,"78":1,"80":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"128":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["$opts",{"2":{"38":5,"41":2,"50":2}}],["$output",{"2":{"31":2,"33":6,"72":1,"74":1,"75":1,"77":1,"78":1,"79":1,"80":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["$rsync",{"2":{"142":2}}],["$run",{"2":{"116":2}}],["$runner",{"2":{"31":3,"33":1}}],["$r",{"2":{"103":10}}],["$revision",{"2":{"152":1}}],["$remotedir",{"2":{"143":1}}],["$recursive",{"2":{"128":3}}],["$replacement",{"2":{"122":2,"123":2}}],["$repo",{"2":{"105":2,"151":2,"152":1}}],["$repository",{"2":{"93":2,"95":2}}],["$repotype",{"2":{"92":1}}],["$regex",{"2":{"121":1}}],["$reorderproperties",{"2":{"103":2}}],["$reordermethods",{"2":{"103":1}}],["$reorder",{"2":{"103":1}}],["$resource",{"2":{"86":2}}],["$res2",{"2":{"45":2}}],["$res1",{"2":{"45":2}}],["$result",{"2":{"17":3,"45":1,"83":1,"112":2,"116":4,"151":1,"152":1,"153":1}}],["$atime",{"2":{"128":1}}],["$alias",{"2":{"116":1}}],["$anchor",{"2":{"102":2}}],["$ansi",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["$author",{"2":{"95":2}}],["$autoloaderpath",{"2":{"31":4}}],["$archivefile",{"2":{"75":2}}],["$archivepath",{"2":{"74":2}}],["$arg",{"2":{"72":2,"82":2,"85":2,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"108":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"134":2,"139":2,"140":2,"142":2,"143":2,"145":2,"146":2,"147":2,"148":2,"149":2}}],["$args",{"2":{"40":2,"72":1,"74":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["$argv",{"2":{"31":1,"33":1}}],["$append",{"2":{"103":1,"122":2,"123":2}}],["$application",{"2":{"33":2}}],["$app",{"2":{"33":2}}],["$appversion",{"2":{"31":2}}],["$appname",{"2":{"31":2}}],["$permission",{"2":{"129":1}}],["$permissions",{"2":{"128":1}}],["$portto",{"2":{"116":1}}],["$port",{"2":{"116":2,"143":2}}],["$placementlocation",{"2":{"75":2}}],["$phartask",{"2":{"107":4}}],["$pharpath",{"2":{"31":3}}],["$php",{"2":{"72":2}}],["$processpropertydocblock",{"2":{"103":1}}],["$processpropertysignature",{"2":{"103":1}}],["$processproperty",{"2":{"103":1}}],["$processmethoddocblock",{"2":{"103":1}}],["$processmethodsignature",{"2":{"103":1}}],["$processmethod",{"2":{"103":1}}],["$processclassdocblock",{"2":{"103":1}}],["$processclasssignature",{"2":{"103":1}}],["$processclass",{"2":{"103":1}}],["$processor",{"2":{"34":6}}],["$project",{"2":{"95":1,"98":1}}],["$projectname",{"2":{"95":2}}],["$prerelease",{"2":{"105":2}}],["$prepend",{"2":{"103":1}}],["$preferdist",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["$prefix",{"2":{"72":2}}],["$preserve",{"2":{"74":2}}],["$parents",{"2":{"129":1}}],["$pattern",{"2":{"122":3,"123":3,"142":6,"151":1,"153":1}}],["$paths",{"2":{"86":2}}],["$path",{"2":{"26":5,"36":1,"58":1,"59":1,"72":4,"107":4,"108":2,"142":2,"153":1}}],["$pathtocompileassets",{"2":{"26":1}}],["$pathtodrush",{"2":{"25":3}}],["$password",{"2":{"105":2}}],["$packer",{"2":{"66":3}}],["$events",{"2":{"86":1}}],["$event",{"2":{"86":3}}],["$errormessage",{"2":{"48":2}}],["$executable",{"2":{"83":2,"151":2,"152":2,"153":2}}],["$exclude",{"2":{"72":2,"126":1,"152":1}}],["$exts",{"2":{"72":2}}],["$extension",{"2":{"15":2}}],["$exitcode",{"2":{"45":2,"48":2}}],["$emptyrobofile",{"2":{"29":2}}],["$",{"2":{"21":2,"22":2,"58":4,"59":4}}],["$suite",{"2":{"146":2,"147":2}}],["$shouldchangeworkingdirectory",{"2":{"131":1,"132":1}}],["$source",{"2":{"93":2}}],["$sources",{"2":{"17":2}}],["$specialvarrx",{"2":{"79":1}}],["$singleline",{"2":{"79":1}}],["$separator",{"2":{"72":3,"82":3,"88":3,"89":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"108":3,"109":4,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":3,"149":3}}],["$seleniumpath",{"2":{"66":2}}],["$selfupdaterepository",{"2":{"31":2}}],["$src",{"2":{"72":4}}],["$stop",{"2":{"128":2}}],["$stoponfail",{"2":{"83":2,"143":1,"151":2,"152":2,"153":2}}],["$string",{"2":{"122":1,"123":1}}],["$strict",{"2":{"100":2}}],["$stub",{"2":{"107":2}}],["$steps",{"2":{"41":2,"48":1}}],["$stability",{"2":{"93":2,"95":2}}],["$start",{"2":{"41":2}}],["$status",{"2":{"33":4}}],["$statuscode",{"2":{"31":2}}],["$state",{"2":{"18":2}}],["$system",{"2":{"18":2}}],["$tmppath",{"2":{"131":4}}],["$tmpfilepath",{"2":{"122":1}}],["$time",{"2":{"128":1}}],["$title",{"2":{"72":2,"122":1,"123":1}}],["$testname",{"2":{"147":2}}],["$test",{"2":{"113":3}}],["$text",{"2":{"103":9,"122":3,"123":3}}],["$templateconfig",{"2":{"72":2}}],["$type",{"2":{"79":1,"95":2}}],["$types",{"2":{"72":2}}],["$tree",{"2":{"72":2}}],["$trackingcode",{"2":{"72":2}}],["$tag",{"2":{"105":2,"109":2,"111":2,"151":1,"152":1}}],["$tags",{"2":{"72":2,"145":1}}],["$target",{"2":{"77":1,"93":2,"129":1}}],["$task",{"2":{"18":2,"112":1}}],["$tohost",{"2":{"142":2}}],["$touser",{"2":{"142":2}}],["$token",{"2":{"105":2}}],["$todo",{"2":{"72":2}}],["$to",{"2":{"26":1,"74":1,"116":1,"121":1,"128":4,"151":2,"152":1}}],["$this",{"2":{"2":1,"6":3,"13":4,"14":2,"17":3,"18":2,"25":2,"26":5,"27":1,"28":1,"29":4,"33":5,"40":2,"44":2,"45":5,"47":1,"48":10,"51":2,"55":3,"66":8,"72":1,"74":1,"75":1,"78":2,"79":1,"80":1,"82":5,"83":1,"84":1,"85":2,"86":4,"88":2,"89":2,"91":1,"92":1,"93":1,"94":4,"95":1,"96":3,"97":1,"98":1,"99":3,"100":1,"102":2,"103":2,"104":1,"105":1,"106":2,"107":2,"108":3,"109":1,"111":3,"112":2,"113":5,"114":1,"115":1,"116":9,"117":1,"118":1,"120":1,"121":5,"122":1,"123":1,"125":2,"126":2,"127":2,"128":13,"129":4,"130":2,"131":2,"132":1,"134":2,"136":2,"137":2,"139":2,"140":2,"142":17,"143":6,"145":1,"146":5,"147":4,"148":2,"149":3,"151":2,"152":1,"153":3}}],["$iterator",{"2":{"128":1}}],["$item",{"2":{"75":1,"102":2,"103":3}}],["$ignore",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["$ignorelist",{"2":{"75":1}}],["$id",{"2":{"72":2,"92":8}}],["$i",{"2":{"48":2,"102":2}}],["$include",{"2":{"152":1}}],["$includerandompart",{"2":{"15":2}}],["$interaction",{"2":{"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2}}],["$internal",{"2":{"72":2}}],["$input",{"2":{"33":6,"72":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["$io",{"2":{"6":2,"13":4,"17":1,"18":2,"21":1,"22":2,"36":2,"37":4,"38":4,"40":1,"41":1,"42":1,"45":2,"50":2,"66":12}}],["$cidorresult",{"2":{"117":1,"118":1}}],["$callable",{"2":{"86":1}}],["$chmod",{"2":{"136":2,"137":2}}],["$changes",{"2":{"105":1}}],["$change",{"2":{"102":2,"105":2}}],["$charset",{"2":{"72":2}}],["$check",{"2":{"72":2}}],["$classloader",{"2":{"31":2}}],["$cov",{"2":{"147":1}}],["$copyonwindows",{"2":{"128":1}}],["$code",{"2":{"107":1}}],["$compress",{"2":{"107":2}}],["$compiler",{"2":{"78":1,"80":1}}],["$comittish",{"2":{"105":2}}],["$commandclasses",{"2":{"31":2,"32":4}}],["$command",{"2":{"29":2,"83":2,"84":2,"113":2,"142":2,"143":2,"151":2,"152":2,"153":2}}],["$colors",{"2":{"72":2}}],["$collection",{"2":{"0":1,"2":1,"3":1,"4":1,"5":1,"6":3,"10":2,"11":2,"13":9,"17":2,"19":5,"122":3,"131":5,"132":4}}],["$context",{"2":{"82":1,"108":1,"143":1}}],["$containerid",{"2":{"112":1}}],["$container",{"2":{"29":2,"33":4,"115":1}}],["$config",{"2":{"33":6,"34":4,"72":2,"146":2,"149":2}}],["$configurationfilename",{"2":{"31":2}}],["$current",{"2":{"6":2}}],["keyword",{"2":{"95":1,"98":1}}],["keys",{"2":{"38":1}}],["key",{"2":{"16":1,"18":1,"49":2,"51":2,"52":1,"59":1,"129":1,"142":1}}],["keepvcs",{"2":{"93":1}}],["keepimportantcomments",{"2":{"79":2}}],["keeping",{"2":{"59":1}}],["keep",{"2":{"0":1,"15":1,"74":1,"136":1}}],["kinds",{"2":{"1":1,"12":1}}],["flexible",{"2":{"142":1}}],["flatten",{"2":{"129":2}}],["flattendir",{"0":{"129":1},"2":{"129":1}}],["flag",{"2":{"38":1,"131":1,"132":1}}],["frobulation",{"2":{"105":1}}],["fromhost",{"2":{"142":1}}],["fromuser",{"2":{"142":1}}],["frompath",{"2":{"142":1}}],["from",{"0":{"39":1,"54":1},"2":{"6":1,"16":1,"17":3,"18":2,"19":1,"21":1,"27":1,"29":1,"31":1,"36":2,"39":4,"40":1,"41":4,"43":1,"45":2,"49":1,"51":1,"52":2,"53":1,"55":2,"59":1,"66":1,"75":2,"77":1,"79":1,"102":1,"103":1,"106":1,"112":1,"113":1,"114":1,"121":1,"122":1,"123":1,"125":1,"129":3}}],["framework",{"0":{"30":1,"60":1},"1":{"31":1,"32":1,"33":1,"34":1},"2":{"29":1,"31":1,"54":1,"60":1,"69":1}}],["full",{"2":{"142":2}}],["future",{"2":{"21":1,"143":1}}],["function",{"2":{"1":2,"4":1,"6":1,"13":2,"15":1,"18":1,"19":4,"21":1,"22":2,"25":4,"26":4,"29":3,"33":2,"36":1,"37":2,"38":2,"40":1,"41":1,"42":1,"45":1,"48":2,"50":1,"53":1,"54":1,"66":4,"86":5,"103":10,"106":1}}],["functions",{"0":{"3":1},"2":{"1":1,"11":1,"19":1,"43":1}}],["few",{"2":{"30":1,"36":1}}],["feature",{"2":{"19":1}}],["fetch",{"2":{"13":2,"52":1}}],["faster",{"2":{"30":1}}],["false",{"2":{"18":3,"38":4,"41":1,"51":3,"74":1,"103":10,"128":6,"143":1}}],["factored",{"2":{"41":1}}],["fact",{"2":{"13":1}}],["failgroup",{"2":{"147":1}}],["failed",{"2":{"45":1}}],["failure",{"2":{"12":1,"13":1,"43":1,"47":1}}],["failures",{"2":{"9":1}}],["fails",{"2":{"6":1,"8":1,"9":1,"10":1,"143":1}}],["fail",{"2":{"0":1,"83":1,"128":1,"151":1,"152":1,"153":1}}],["folder",{"2":{"74":1,"75":1,"126":1,"129":2}}],["followed",{"2":{"49":1}}],["follow",{"2":{"26":1,"55":1,"68":1}}],["follows",{"2":{"17":1,"50":1,"51":1}}],["following",{"2":{"0":1,"13":1,"17":2,"22":1,"33":1,"34":1,"40":1,"50":2,"51":1,"59":1,"77":2,"80":1,"129":1}}],["fopen",{"2":{"72":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["four",{"2":{"48":1}}],["foo=0",{"2":{"38":1}}],["foo",{"2":{"38":2,"39":2,"50":7,"93":1,"98":1}}],["forcepseudotty",{"2":{"143":1}}],["force",{"2":{"88":1,"89":1}}],["forcelatest",{"2":{"88":1,"89":1}}],["form",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["format",{"2":{"56":1,"146":1,"147":2,"149":1}}],["formats",{"2":{"56":1}}],["formatter",{"2":{"56":1,"80":1}}],["formatters",{"0":{"56":1},"2":{"45":1,"56":2}}],["formatted",{"2":{"36":2}}],["foreach",{"2":{"66":1,"107":2}}],["for",{"0":{"50":1,"51":1},"2":{"12":1,"13":1,"14":1,"15":2,"17":1,"18":2,"19":3,"20":7,"21":3,"22":2,"23":2,"24":1,"25":2,"30":1,"31":3,"32":2,"34":1,"35":1,"36":2,"38":8,"40":1,"41":1,"43":1,"45":3,"48":3,"49":1,"50":5,"51":4,"53":1,"55":1,"56":2,"59":2,"60":1,"66":2,"68":1,"75":1,"77":3,"78":1,"79":3,"80":1,"103":1,"116":1,"120":1,"126":1,"128":1,"129":2,"143":1}}],["fix",{"2":{"105":1}}],["fields",{"2":{"91":1,"92":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["filterproperties",{"2":{"103":1}}],["filterclasses",{"2":{"103":1}}],["filtermethods",{"2":{"103":1}}],["filter",{"2":{"77":1,"103":3,"142":1,"145":1,"148":1}}],["filename",{"2":{"39":2,"86":1,"102":1,"103":1,"121":1,"122":2,"123":1}}],["filenames",{"2":{"32":1}}],["file",{"0":{"24":1,"119":1},"1":{"120":1,"121":1,"122":1,"123":1},"2":{"13":2,"15":1,"21":1,"24":1,"25":1,"31":8,"32":1,"33":1,"36":1,"39":2,"49":4,"50":1,"51":2,"53":2,"54":2,"58":1,"59":2,"70":1,"75":6,"79":1,"86":3,"102":2,"103":3,"109":1,"120":1,"122":4,"123":2,"136":1,"137":1,"145":3,"146":2,"147":3,"148":3,"149":2}}],["filesfrom",{"2":{"142":1}}],["files",{"0":{"14":1,"22":1},"2":{"12":1,"14":1,"15":1,"17":6,"22":3,"32":3,"34":3,"66":1,"74":2,"75":1,"77":3,"78":1,"80":1,"103":1,"120":1,"121":1,"125":2,"126":3,"129":3,"145":2,"148":2,"151":1,"152":1,"153":1}}],["filesystemstack",{"0":{"128":1},"2":{"104":1}}],["filesystemevent",{"2":{"86":4}}],["filesystem",{"0":{"124":1},"1":{"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1},"2":{"6":1,"8":2,"13":1,"61":1,"70":1,"86":1,"104":2,"128":1}}],["fibonacci",{"2":{"41":4}}],["finder",{"2":{"32":1,"66":1,"107":3}}],["find",{"2":{"20":1,"31":1,"34":1,"58":1}}],["finishes",{"2":{"15":1,"108":1}}],["finalizecontainer",{"2":{"33":1}}],["final",{"2":{"13":3,"45":1,"132":2}}],["first",{"2":{"0":1,"8":1,"17":1,"18":1,"31":1,"43":1,"47":1,"83":1,"128":1,"142":1,"151":1,"152":1,"153":1}}],["volume",{"2":{"116":1}}],["vcs",{"0":{"150":1},"1":{"151":1,"152":1,"153":1},"2":{"70":1}}],["verbose",{"2":{"142":1,"143":1,"146":1,"149":1}}],["verify",{"2":{"107":1}}],["version",{"2":{"24":1,"31":2,"33":1,"49":1,"74":1,"93":1,"102":2,"109":1,"121":1}}],["very",{"2":{"23":1,"26":1,"34":1,"74":1}}],["vendor",{"2":{"21":1,"22":1,"31":3,"40":1,"58":2,"59":1,"64":1,"72":2,"77":2,"107":2}}],["via",{"0":{"22":1},"2":{"0":2,"6":1,"13":2,"14":1,"15":1,"18":1,"21":2,"22":1,"26":1,"28":2,"38":1,"45":1,"48":2,"49":1,"52":1,"53":1,"55":1,"56":1,"63":1}}],["var",{"2":{"77":1,"128":1,"142":2,"143":2}}],["variable",{"2":{"13":1,"18":1,"32":1,"37":2,"38":2,"45":2,"49":2,"74":1}}],["variables",{"2":{"0":2,"31":1,"49":1}}],["validation",{"2":{"79":1}}],["validate",{"0":{"100":1},"2":{"34":1,"100":1}}],["value",{"2":{"16":1,"18":2,"29":1,"37":1,"38":13,"45":1,"50":5,"51":1,"53":3,"72":3,"82":3,"88":3,"89":3,"91":3,"92":4,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"108":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"121":1,"122":3,"123":3,"129":3,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":3,"149":3}}],["values",{"2":{"0":1,"34":3,"37":1,"38":2,"45":1,"49":4,"51":2,"52":1,"53":2,"72":2,"82":2,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"108":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"134":2,"139":2,"140":2,"142":2,"143":2,"145":2,"146":2,"147":2,"148":2,"149":2}}],["nginx",{"2":{"128":1}}],["n$text",{"2":{"103":1}}],["natxet",{"2":{"79":1}}],["namespace",{"2":{"20":1,"22":4,"25":2,"26":4,"31":2,"32":1,"39":1,"51":6}}],["names",{"2":{"19":1,"25":1,"32":1,"36":1,"38":1}}],["named",{"0":{"19":1},"2":{"18":2,"19":4,"20":1,"74":1,"78":1,"80":1}}],["name",{"2":{"1":2,"13":3,"14":1,"18":6,"19":2,"20":1,"22":1,"24":2,"25":3,"31":1,"33":2,"39":2,"42":1,"46":1,"55":1,"59":1,"66":1,"78":1,"80":1,"85":1,"95":1,"98":1,"105":1,"112":1,"116":3,"147":2,"151":1,"152":1}}],["npm",{"0":{"138":1},"1":{"139":1,"140":1},"2":{"70":1,"139":3,"140":3}}],["numbers",{"2":{"41":1}}],["number",{"2":{"32":1,"41":4,"48":3,"129":1}}],["null|int",{"2":{"116":1}}],["nulloutput",{"2":{"29":2}}],["null",{"2":{"26":1,"29":2,"33":2,"38":1,"45":1,"72":5,"74":1,"77":1,"82":5,"83":1,"85":1,"86":1,"88":5,"89":5,"91":13,"92":15,"93":15,"94":14,"95":14,"96":14,"97":17,"98":15,"99":14,"100":18,"107":1,"108":5,"109":2,"111":5,"112":5,"113":5,"114":5,"115":5,"116":8,"117":5,"118":5,"122":1,"123":1,"126":1,"128":4,"131":1,"132":1,"134":5,"139":5,"140":5,"142":5,"143":6,"145":5,"146":6,"147":12,"148":8,"149":6,"151":12,"152":9,"153":4}}],["n",{"2":{"18":4,"103":6,"142":1}}],["noexit",{"2":{"147":1}}],["norebuild",{"2":{"147":1}}],["nocodegeneration",{"2":{"149":1}}],["nocolors",{"2":{"146":1}}],["nocolor",{"2":{"134":1}}],["nocheckpublish",{"2":{"100":1}}],["nochecklock",{"2":{"100":1}}],["nocheckall",{"2":{"100":1}}],["noupdatewithdependencies",{"2":{"97":1}}],["noupdate",{"2":{"97":1}}],["noprogress",{"2":{"97":1}}],["nosuggest",{"2":{"96":1,"98":1,"99":1}}],["noscripts",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["noinstall",{"2":{"93":1}}],["nointeraction",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"146":1,"149":1}}],["noansi",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"149":1}}],["nodev",{"2":{"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"139":1,"140":1}}],["none",{"2":{"77":2}}],["now",{"2":{"22":1,"38":1,"41":1,"63":1}}],["no",{"2":{"9":1,"13":2,"38":4,"59":1,"77":1,"91":3,"92":3,"93":3,"94":4,"95":3,"96":4,"97":3,"98":4,"99":4,"100":3,"134":1}}],["noticed",{"2":{"55":1}}],["notes",{"2":{"39":1}}],["note",{"2":{"18":1,"20":1,"21":1,"22":1,"25":1,"31":1,"36":2,"40":1,"45":1,"47":1,"48":1,"54":1,"59":1,"74":1,"131":1}}],["not",{"2":{"0":1,"9":1,"13":2,"14":1,"15":2,"17":1,"21":1,"27":1,"31":3,"36":1,"38":2,"39":1,"42":1,"44":1,"45":4,"48":1,"52":1,"58":1,"59":1,"77":1,"103":1,"129":1,"131":1,"143":1}}],["net",{"2":{"153":2}}],["negative",{"2":{"129":1}}],["neon",{"2":{"72":2}}],["nested",{"2":{"34":1,"129":1}}],["next",{"2":{"31":1,"45":1}}],["newer",{"2":{"126":1}}],["new",{"2":{"15":1,"18":1,"20":1,"22":1,"29":3,"31":3,"32":1,"33":5,"34":3,"35":1,"45":2,"48":1,"66":2,"85":2,"105":1,"129":1}}],["necessary",{"2":{"0":1,"18":2,"24":2,"29":1,"43":1,"52":1}}],["needs",{"2":{"28":1,"43":1}}],["needed",{"2":{"13":1,"18":1,"19":1,"24":1,"43":1}}],["need",{"0":{"67":1},"2":{"0":1,"21":1,"26":1,"34":1,"35":1,"40":1,"43":1,"105":1}}],["dbhost",{"2":{"121":1}}],["dbname",{"2":{"121":1}}],["db",{"2":{"112":1,"116":5}}],["dryrun",{"2":{"142":1}}],["dry",{"2":{"142":1}}],["draft",{"2":{"105":1}}],["drushstacktest",{"2":{"29":1}}],["drushstack",{"2":{"25":1}}],["drush",{"2":{"21":2,"24":3,"25":2,"29":2}}],["durin42",{"2":{"152":1}}],["during",{"2":{"6":1,"16":1}}],["dump",{"2":{"94":4}}],["dumpautoload",{"0":{"94":1}}],["daemons",{"2":{"61":1}}],["dashes",{"2":{"49":1}}],["davert",{"2":{"36":2,"37":2}}],["database",{"2":{"103":1,"111":1,"112":3,"116":1}}],["data",{"2":{"16":1,"18":2,"19":1,"42":1,"45":4,"56":3,"116":3,"128":1}}],["date",{"2":{"13":2,"74":1,"121":2,"122":1,"123":1}}],["d",{"2":{"13":2,"49":1,"122":1,"123":1}}],["divide",{"2":{"43":1}}],["di",{"2":{"33":1}}],["disablerepository",{"2":{"92":1}}],["disable",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["disableplugins",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["disabled",{"2":{"38":1,"59":1}}],["dist",{"2":{"77":5,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":2,"97":1,"98":1,"99":2,"100":1,"126":2,"129":7,"130":2,"139":1,"140":1}}],["distributions",{"2":{"31":1,"74":1}}],["display",{"2":{"41":2,"48":1,"56":2,"145":2}}],["displays",{"2":{"22":1}}],["discovery",{"2":{"32":2}}],["die",{"2":{"31":1}}],["dirpermissions",{"2":{"126":1,"129":1}}],["dirs",{"2":{"66":1,"129":1}}],["dir",{"2":{"31":5,"51":3,"52":2,"54":1,"59":1,"66":2,"72":1,"75":3,"82":1,"83":1,"86":1,"88":1,"89":1,"91":2,"92":3,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"108":1,"111":2,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"125":1,"126":1,"127":1,"134":1,"139":1,"140":1,"142":1,"143":2,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["direction",{"2":{"129":1}}],["directed",{"2":{"91":1,"92":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["directly",{"0":{"52":1},"2":{"27":1,"34":1,"48":1,"52":1,"56":1}}],["directory",{"2":{"13":14,"15":1,"18":1,"21":1,"31":1,"35":2,"36":1,"39":3,"49":4,"53":1,"72":1,"74":3,"75":2,"77":4,"78":2,"80":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"129":10,"130":1,"131":5,"132":6,"134":1,"139":1,"140":1,"142":1,"143":3,"145":2,"146":1,"147":1,"148":2,"149":1,"151":1,"152":1,"153":1}}],["directories",{"0":{"13":1},"2":{"12":1,"13":3,"15":1,"34":1,"74":1,"78":2,"80":2,"129":3,"145":2}}],["different",{"2":{"1":1,"32":1,"39":3,"56":1}}],["down",{"2":{"103":1}}],["downloads",{"2":{"66":1}}],["download",{"2":{"63":1,"72":1,"77":1}}],["downloading",{"2":{"36":1,"77":1}}],["doptions",{"2":{"49":1}}],["dots",{"2":{"49":1}}],["doing",{"2":{"31":1,"56":1}}],["docclass",{"2":{"103":1}}],["docblock",{"2":{"103":4}}],["docblocks",{"2":{"103":1}}],["dockerhub",{"2":{"114":1}}],["dockerrun",{"2":{"112":1}}],["docker",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1},"2":{"61":1,"70":1,"111":2,"112":1,"113":1,"115":1,"116":2,"117":1,"118":1}}],["doc",{"2":{"41":2,"151":2,"153":2}}],["documented",{"2":{"103":4}}],["document",{"2":{"31":1,"43":1}}],["documentation",{"0":{"69":1},"1":{"70":1},"2":{"26":1,"28":1,"30":1,"40":1,"43":1,"45":1,"55":1,"72":1,"103":5}}],["docs",{"2":{"6":2,"8":3,"40":1}}],["doesn",{"2":{"126":1}}],["does",{"2":{"9":1,"31":2,"44":1,"45":1,"129":1}}],["done",{"2":{"8":1,"10":1,"18":1,"19":1,"21":1,"23":1,"43":1,"45":2,"54":1}}],["do",{"2":{"0":1,"4":1,"13":4,"17":1,"19":3,"28":1,"29":1,"32":1,"33":1,"34":1,"36":1,"45":1,"48":1,"52":1,"53":1,"58":1,"86":2,"131":1,"142":2}}],["demos",{"2":{"84":3}}],["demonstrates",{"2":{"53":1}}],["debug",{"2":{"72":1,"85":1,"145":2,"147":1,"148":1}}],["declared",{"2":{"59":1}}],["declare",{"2":{"40":1}}],["delay=999999",{"2":{"49":2}}],["delay",{"2":{"49":1}}],["delimiter",{"2":{"40":1}}],["delegate",{"2":{"33":1}}],["deletes",{"2":{"125":1,"127":1}}],["deletedir",{"0":{"127":1},"2":{"127":1}}],["deleted",{"2":{"13":2,"14":2,"122":1,"131":3,"132":1}}],["delete",{"2":{"8":1,"86":1,"122":1,"131":2,"132":1,"142":1}}],["depth",{"2":{"142":1,"151":1}}],["deprecated",{"2":{"40":1,"72":1}}],["dependency",{"0":{"33":1},"2":{"29":1,"95":1,"98":1}}],["deployment",{"2":{"61":1}}],["deploycommands",{"2":{"32":1}}],["deploy",{"2":{"6":1,"19":1}}],["detached",{"2":{"113":1,"116":1}}],["details",{"2":{"27":1,"43":1,"56":1}}],["determines",{"2":{"43":1}}],["determine",{"2":{"0":1}}],["detection",{"2":{"0":1,"45":1}}],["development",{"0":{"101":1},"1":{"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1},"2":{"70":1}}],["dev",{"2":{"19":1,"22":1,"59":1,"91":3,"92":3,"93":3,"94":4,"95":3,"96":3,"97":2,"98":3,"99":3,"100":3,"142":1,"145":1}}],["designed",{"2":{"58":1}}],["desired",{"2":{"52":1,"55":1,"132":1}}],["desirable",{"2":{"17":1,"59":1}}],["description",{"2":{"24":1,"95":1,"105":1}}],["described",{"2":{"20":1,"31":1,"33":1,"52":1}}],["destination",{"2":{"13":2,"17":1,"72":1,"79":1,"120":1,"126":2,"129":1,"132":1}}],["defining",{"2":{"59":1}}],["definition",{"2":{"51":1}}],["define",{"2":{"19":1,"26":2,"29":1,"31":1,"38":3,"50":1,"54":1,"59":1,"129":1}}],["defined",{"2":{"0":1,"21":1,"50":1,"65":1}}],["defer",{"2":{"18":3,"26":1}}],["defers",{"2":{"18":1}}],["defertaskconfiguration",{"2":{"18":3}}],["deferred",{"2":{"0":1}}],["defaults",{"2":{"34":1}}],["default",{"0":{"53":1},"2":{"10":1,"20":1,"29":1,"37":2,"38":5,"52":1,"53":2,"54":1,"74":2,"77":2,"78":4,"80":2,"86":1,"103":1,"106":1,"126":1,"129":1,"143":1,"147":1,"151":1}}],["people",{"2":{"105":1}}],["per",{"2":{"143":1}}],["permissions",{"2":{"126":1,"129":1}}],["perofrom",{"2":{"36":1}}],["persist",{"2":{"13":2}}],["performs",{"2":{"116":1,"121":1,"151":1,"152":1}}],["performed",{"2":{"19":1}}],["perform",{"2":{"13":1,"19":1,"41":2,"59":1}}],["pngout",{"2":{"77":1}}],["pngquant",{"2":{"77":1}}],["pngcrush",{"2":{"77":2}}],["png",{"2":{"77":2}}],["pwd",{"2":{"59":1}}],["ps",{"2":{"44":1}}],["psr",{"0":{"22":1},"2":{"22":3,"24":1,"27":2,"31":1}}],["platform",{"2":{"61":1,"91":2,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["placeholder",{"2":{"122":2,"123":2}}],["placed",{"2":{"22":1}}],["place",{"2":{"10":1,"25":1,"29":1,"34":1,"122":1,"123":1}}],["please",{"2":{"22":1,"30":1,"79":1}}],["plugins",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["plugin",{"2":{"22":3}}],["push",{"2":{"151":2,"152":2}}],["pulls",{"2":{"114":1}}],["pull",{"0":{"114":1},"2":{"67":1,"151":2,"152":2}}],["puts",{"2":{"75":3}}],["put",{"2":{"63":1,"103":1}}],["purposes",{"2":{"20":1,"26":1}}],["public",{"2":{"6":1,"21":1,"22":2,"29":2,"33":2,"36":1,"41":1,"48":2,"53":1,"54":1,"59":1,"65":1,"66":1,"103":2,"108":2,"142":1}}],["publishes",{"2":{"105":1}}],["publish",{"2":{"6":2,"116":1}}],["practice",{"2":{"45":1}}],["pr",{"2":{"41":1}}],["privileged",{"2":{"116":1}}],["private",{"2":{"33":1,"54":1}}],["printtaskerror",{"2":{"27":1}}],["printtasksuccess",{"2":{"27":1}}],["printtaskinfo",{"2":{"27":1}}],["print",{"2":{"27":1,"45":1,"50":2,"55":1,"120":1}}],["printoutput",{"2":{"18":1}}],["primary",{"2":{"19":1,"46":1,"59":1}}],["prior",{"2":{"18":1}}],["pretty",{"2":{"146":1,"149":1}}],["preparing",{"2":{"120":1}}],["prepare",{"2":{"112":1,"116":1}}],["prepend",{"2":{"103":1}}],["prerelease",{"2":{"105":1,"109":1}}],["precidence",{"2":{"50":1}}],["precedence",{"2":{"49":1,"53":1,"54":1}}],["preceding",{"2":{"13":1}}],["presuming",{"2":{"51":1}}],["presumed",{"2":{"42":1}}],["presumes",{"2":{"34":1}}],["preservetopdirectory",{"2":{"74":2}}],["preserved",{"2":{"20":1}}],["presented",{"2":{"30":1}}],["prefersource",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["preferdist",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["prefer",{"2":{"88":1,"89":1,"91":2,"92":2,"93":2,"94":2,"95":2,"96":3,"97":2,"98":2,"99":3,"100":2,"139":1,"140":1}}],["preferred",{"2":{"40":1,"47":1,"50":1}}],["preferable",{"2":{"18":1,"52":1,"56":1}}],["prefixed",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["prefix",{"2":{"20":1,"65":1}}],["previous",{"2":{"13":1,"18":2,"34":1,"52":1}}],["program",{"2":{"131":1}}],["progressive",{"2":{"77":2}}],["progressindicatorawaretrait",{"2":{"48":1}}],["progressindicatorsteps",{"2":{"48":4}}],["progressbar",{"2":{"48":2,"72":1}}],["progress",{"0":{"48":1},"2":{"48":7,"49":3,"59":1,"142":1}}],["properties",{"2":{"103":2}}],["property",{"2":{"53":1,"103":3}}],["production",{"2":{"88":1,"89":1,"139":1,"140":1}}],["produces",{"2":{"34":2}}],["produced",{"2":{"17":1,"41":1}}],["providing",{"0":{"53":1},"2":{"22":1}}],["provide",{"2":{"11":1,"19":1,"24":1,"29":1,"31":2,"32":1,"38":2,"43":1,"50":1,"53":1,"59":2,"103":8}}],["provided",{"2":{"1":1,"12":1,"15":1,"23":1,"26":1,"32":2,"34":2,"38":3,"39":1,"41":2,"45":1,"50":2,"72":3,"82":3,"88":3,"89":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"108":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"122":4,"123":4,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":4,"149":3}}],["provides",{"2":{"0":1,"7":1,"12":1,"14":1,"20":2,"34":1,"59":1,"74":1,"147":1}}],["projecttype",{"2":{"95":1}}],["projectname",{"2":{"95":1}}],["project",{"0":{"58":1},"2":{"22":7,"24":1,"30":1,"31":5,"32":1,"33":2,"35":2,"41":1,"56":1,"58":1,"59":4,"66":1,"75":3,"78":1,"80":1}}],["projects",{"2":{"20":1,"21":3,"24":1,"59":2}}],["processpropertydocblock",{"2":{"103":1}}],["processpropertysignature",{"2":{"103":1}}],["processproperty",{"2":{"103":1}}],["processmethoddocblock",{"2":{"103":1}}],["processmethodsignature",{"2":{"103":1}}],["processmethod",{"2":{"103":1}}],["processclassdocblock",{"2":{"103":1}}],["processclasssignature",{"2":{"103":1}}],["processclass",{"2":{"103":1}}],["processconfiguration",{"2":{"34":1}}],["processed",{"2":{"103":1}}],["processes",{"2":{"27":1}}],["processlogrow",{"2":{"102":1}}],["processor",{"2":{"34":2}}],["process",{"2":{"17":1,"27":1,"34":1,"39":1,"72":1,"82":1,"83":1,"84":2,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"103":10,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["processing",{"2":{"6":1,"27":1,"61":1,"84":1}}],["protected",{"2":{"15":1,"25":1,"26":3,"48":1,"65":1,"103":1}}],["point",{"2":{"151":1,"152":1,"153":1}}],["pointers",{"2":{"1":1}}],["post",{"2":{"103":12}}],["possible",{"2":{"13":1,"16":1,"19":3,"21":1,"27":1,"31":1,"32":1,"33":1,"54":1}}],["port",{"2":{"66":1,"143":1}}],["populated",{"2":{"41":1}}],["phar",{"0":{"31":1,"63":1},"2":{"21":1,"31":6,"36":2,"40":1,"59":5,"63":7,"66":2,"72":1,"94":3,"96":2,"99":2,"107":4}}],["phase",{"2":{"0":1}}],["phases",{"2":{"0":1}}],["phpspec",{"0":{"149":1},"2":{"149":1}}],["phpserver",{"0":{"108":1}}],["php$gittask",{"2":{"143":1}}],["php$rsync",{"2":{"142":1}}],["php$this",{"2":{"77":4,"142":1}}],["php$discovery",{"2":{"32":1}}],["phpfunction",{"2":{"66":1}}],["phpunit",{"0":{"148":1},"2":{"29":2,"45":2,"82":1,"86":1,"148":1}}],["phpclass",{"2":{"21":1}}],["php",{"0":{"25":1},"2":{"2":2,"3":2,"4":2,"5":2,"6":2,"11":2,"13":4,"15":2,"17":4,"18":4,"19":6,"22":4,"24":3,"25":1,"26":2,"31":10,"32":2,"33":4,"35":3,"36":2,"37":4,"38":4,"39":3,"40":3,"41":2,"42":2,"44":2,"45":2,"48":2,"50":2,"59":2,"65":1,"66":9,"68":1,"72":3,"74":2,"75":2,"78":5,"79":2,"80":2,"82":2,"83":2,"84":8,"85":2,"86":2,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"102":4,"103":4,"104":2,"105":2,"106":3,"107":6,"108":3,"109":2,"111":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"120":2,"121":2,"122":2,"123":2,"125":2,"126":2,"127":2,"128":2,"129":6,"130":2,"131":2,"132":2,"134":2,"136":2,"137":2,"139":2,"140":2,"143":3,"145":4,"146":2,"147":2,"148":3,"149":2,"151":2,"152":2,"153":2}}],["pairs",{"2":{"129":1}}],["packed",{"2":{"107":1}}],["packphar",{"0":{"107":1}}],["pack",{"0":{"75":1}}],["packaging",{"2":{"59":1}}],["packagist",{"2":{"20":1,"23":1,"67":1}}],["packaged",{"2":{"74":1}}],["packages",{"2":{"67":1,"79":1}}],["package",{"2":{"23":2,"30":1,"74":1,"107":3,"111":1}}],["password",{"2":{"105":1,"116":1,"153":1}}],["passing",{"0":{"17":1,"18":1},"2":{"18":1,"31":1,"66":1}}],["pass",{"0":{"40":1},"2":{"16":1,"18":1,"31":1,"32":1,"36":1,"37":2,"40":1,"72":7,"82":7,"83":1,"86":1,"88":7,"89":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":7,"97":7,"98":7,"99":7,"100":7,"108":7,"111":7,"112":7,"113":7,"114":7,"115":7,"116":7,"117":7,"118":7,"134":7,"139":7,"140":7,"142":7,"143":7,"145":7,"146":7,"147":10,"148":7,"149":7,"151":1,"152":1,"153":1}}],["passed",{"2":{"13":1,"40":2,"45":2,"66":1,"82":1,"103":1}}],["patchwork",{"2":{"79":1}}],["paths",{"2":{"24":1,"58":1}}],["path",{"2":{"13":4,"39":2,"45":1,"49":1,"51":2,"58":1,"66":2,"88":2,"89":2,"94":6,"96":4,"99":4,"111":1,"116":1,"129":4,"131":1,"132":1,"139":2,"140":2,"142":6,"145":3}}],["patterns",{"2":{"26":1,"75":1}}],["pattern",{"2":{"0":1,"12":1,"13":1,"32":1,"151":1,"152":1,"153":1}}],["parentdir",{"2":{"129":2}}],["parent",{"2":{"129":9}}],["parts",{"2":{"129":1}}],["partial",{"2":{"51":2}}],["particular",{"2":{"31":1}}],["part",{"2":{"15":1,"103":1,"122":2,"131":1}}],["parallel",{"2":{"84":1}}],["parallelexectask",{"2":{"84":1}}],["parallelexec",{"0":{"84":1}}],["params",{"2":{"26":1}}],["parameter",{"2":{"25":1,"31":1,"36":1,"37":2,"38":1,"40":1,"51":1,"72":1,"75":1,"82":1,"86":2,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["parameters",{"2":{"0":1,"13":1,"37":1,"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["param",{"2":{"25":1,"26":1,"41":3,"72":32,"74":1,"75":1,"78":1,"83":3,"84":1,"85":1,"86":1,"91":1,"92":5,"93":8,"94":2,"95":9,"96":1,"97":6,"98":1,"99":1,"100":6,"102":8,"103":4,"105":14,"107":6,"108":2,"109":7,"111":1,"112":1,"113":1,"116":8,"121":1,"122":2,"123":2,"128":1,"136":2,"137":1,"142":10,"143":5,"146":4,"147":4,"148":6,"149":3,"151":3,"152":3,"153":3}}],["paradigm",{"2":{"13":1}}],["parse",{"2":{"6":1}}],["g+x",{"2":{"143":1}}],["guess",{"2":{"79":1}}],["gulp",{"0":{"133":1},"1":{"134":1},"2":{"70":1,"129":2,"134":4}}],["green",{"2":{"50":2}}],["graphically",{"2":{"41":2}}],["graphic",{"2":{"41":5}}],["groups",{"2":{"43":1,"50":1,"72":1}}],["group",{"2":{"32":1,"45":1,"142":1,"147":2,"148":1}}],["g1a",{"2":{"30":1}}],["getpath",{"2":{"122":1,"123":1,"131":1,"132":1}}],["getuniqid",{"2":{"116":1}}],["gettmpdir",{"2":{"116":1}}],["getting",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1},"2":{"69":1}}],["getchanges",{"2":{"102":1}}],["getconfigvalue",{"2":{"52":1}}],["getbuilttask",{"2":{"74":1}}],["get",{"2":{"29":1,"31":1,"42":2,"52":1,"131":1,"132":1}}],["generator",{"2":{"103":1}}],["generatemarkdowndoc",{"0":{"103":1}}],["generate",{"0":{"104":1},"2":{"72":1,"104":1,"147":5}}],["generates",{"2":{"17":1,"103":1}}],["generated",{"2":{"13":2,"16":1}}],["general",{"2":{"18":1,"52":1}}],["g",{"2":{"19":2,"31":1,"40":1,"48":1,"59":1}}],["give",{"2":{"129":2}}],["given",{"2":{"14":1,"19":2,"22":1,"25":1,"50":1,"51":1,"122":1,"143":1}}],["gifsicle",{"2":{"77":2}}],["gif",{"2":{"77":1}}],["gitstack",{"0":{"151":1}}],["gitkeep",{"2":{"66":1}}],["gitignore",{"2":{"40":1,"66":1,"128":2}}],["githubrelease",{"0":{"105":1}}],["github",{"2":{"31":2,"102":1,"105":1,"106":1}}],["git",{"2":{"6":2,"40":1,"125":1,"142":1,"151":10}}],["globally",{"2":{"63":1}}],["global",{"0":{"15":1,"47":1},"2":{"12":1,"15":2,"47":1,"92":1}}],["gh",{"2":{"6":1}}],["gou",{"2":{"84":1}}],["googleanalytics",{"2":{"72":1}}],["googlecseid",{"2":{"72":1}}],["go",{"2":{"0":1}}],["gt",{"2":{"0":1,"13":2,"14":2,"18":1,"19":2,"24":1,"25":1,"28":1,"34":4,"38":3,"39":1,"40":1,"48":3,"52":1,"63":1,"121":1}}],["svncheckout",{"2":{"153":1}}],["svnstack",{"0":{"153":1}}],["svn",{"2":{"142":1,"153":9}}],["svgo",{"2":{"77":2}}],["svg",{"2":{"77":1}}],["skip",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"103":8}}],["skipdocprefix",{"2":{"72":1}}],["skipdocpath",{"2":{"72":1}}],["slashes",{"2":{"75":1}}],["snippets",{"2":{"66":1}}],["sftp",{"2":{"61":1}}],["srv",{"2":{"53":1}}],["src",{"2":{"22":2,"24":1,"31":2,"40":1,"86":1,"106":1,"107":2,"142":2}}],["ssh",{"0":{"143":1},"2":{"53":3,"61":1,"142":1}}],["switch",{"2":{"49":1}}],["switched",{"2":{"39":1}}],["spec",{"2":{"142":2}}],["specifiy",{"2":{"77":1}}],["specified",{"2":{"38":1,"74":1,"77":2,"86":1,"125":1}}],["specific",{"2":{"23":1,"48":1,"51":1}}],["specifically",{"2":{"19":1}}],["specifying",{"2":{"129":1}}],["specify",{"2":{"31":1,"39":1,"78":1,"129":1}}],["specialvarrx",{"2":{"79":2}}],["special",{"2":{"7":1,"15":1,"38":1,"40":1}}],["splfileinfo",{"2":{"107":1}}],["spaces",{"2":{"49":1}}],["sh",{"2":{"112":1,"116":1}}],["shell",{"2":{"82":1}}],["share",{"2":{"33":1,"50":2,"51":1}}],["shortcuts",{"0":{"44":1},"2":{"44":1}}],["shortcut",{"2":{"13":2,"38":1,"45":2,"82":1,"125":1,"126":1,"127":1,"129":1,"130":1,"131":1,"136":1,"137":1}}],["should",{"2":{"13":1,"20":3,"24":2,"26":2,"27":3,"28":2,"31":1,"33":1,"34":1,"36":1,"38":3,"45":1,"48":1,"49":2,"56":2,"59":1,"66":1,"129":1,"131":1,"132":1,"151":1,"152":1,"153":1}}],["shown",{"2":{"6":1,"8":1,"11":1,"22":1,"29":1,"31":2,"32":2,"34":1,"40":1,"41":1,"48":3}}],["screen",{"2":{"120":1}}],["scripts",{"0":{"59":1},"2":{"13":1,"30":1,"31":2,"55":1,"58":1,"59":5,"60":1,"61":1,"74":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["script",{"2":{"0":1,"13":1,"14":1,"15":2,"31":1,"59":2,"60":1,"82":1,"84":3,"116":1}}],["scsscompilers",{"2":{"80":1}}],["scssphp",{"2":{"80":3}}],["scss",{"0":{"80":1},"2":{"80":4}}],["schema",{"2":{"34":1}}],["scaffold",{"2":{"29":1}}],["symlink",{"2":{"128":1}}],["symfonycommand",{"0":{"85":1}}],["symfonystyle",{"2":{"36":1}}],["symfony",{"2":{"22":1,"29":2,"31":1,"32":1,"33":5,"34":2,"36":2,"48":2,"55":1,"66":2,"85":2,"86":1,"104":1,"107":1,"128":1}}],["syntax",{"2":{"34":1,"129":1}}],["system",{"2":{"0":2,"9":1,"18":5,"26":1,"77":1}}],["sass",{"2":{"61":1}}],["say",{"2":{"27":1,"36":1,"55":1}}],["saves",{"2":{"103":1}}],["save",{"2":{"13":1,"103":1,"147":2}}],["safely",{"2":{"13":1}}],["same",{"2":{"6":1,"13":2,"15":1,"18":1,"25":2,"26":1,"32":1,"33":1,"39":1,"51":1,"75":1,"129":1}}],["signature",{"2":{"103":5}}],["situations",{"2":{"43":1}}],["site",{"2":{"6":1,"55":1,"83":2,"143":1}}],["silent|s",{"2":{"38":1}}],["silent",{"2":{"38":5,"134":1}}],["simulate",{"2":{"82":1,"108":1,"143":1}}],["simplify",{"2":{"59":1}}],["simple",{"2":{"34":1,"48":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"103":1,"134":3,"139":1,"140":1}}],["simply",{"2":{"18":1,"32":1,"33":1,"50":1,"58":1,"59":1,"63":1}}],["similar",{"2":{"31":1,"32":1,"34":1,"46":1,"129":1}}],["singleline",{"2":{"79":1}}],["single",{"2":{"18":1,"40":1,"44":1,"45":1,"79":1,"148":1}}],["since",{"2":{"12":1}}],["semver",{"0":{"109":1},"2":{"109":2}}],["separation",{"2":{"59":1}}],["separate",{"2":{"32":2}}],["second",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["seconds",{"2":{"48":1,"49":1,"84":1}}],["sections",{"2":{"33":1,"59":1}}],["section",{"2":{"7":1,"17":1,"20":2,"21":1,"26":1,"31":3,"59":1,"60":1}}],["sequence",{"2":{"41":3}}],["sequenced",{"2":{"19":1}}],["selenium",{"2":{"66":5}}],["select",{"2":{"56":1}}],["selected",{"2":{"21":1}}],["self",{"2":{"31":2,"33":2}}],["send",{"2":{"27":1,"67":1}}],["services",{"2":{"121":1}}],["service",{"2":{"25":2,"59":1}}],["server",{"2":{"27":1,"66":7,"108":3,"143":1}}],["serve",{"2":{"11":1}}],["seeded",{"2":{"34":1}}],["see",{"2":{"20":1,"21":1,"23":1,"30":1,"32":1,"40":1,"43":2,"45":2,"56":1,"59":1,"60":1,"66":1}}],["searches",{"2":{"129":1}}],["search",{"2":{"20":1,"32":2,"121":1,"129":1}}],["setprereleaseseparator",{"2":{"109":1}}],["setprocessinput",{"2":{"72":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["setmetadataseparator",{"2":{"109":1}}],["setformat",{"2":{"109":1}}],["setformatter",{"2":{"78":1,"80":1}}],["setheader",{"2":{"102":1}}],["setbody",{"2":{"102":1}}],["setimportpaths",{"2":{"78":1,"80":1}}],["setexecutabledir",{"2":{"77":1}}],["setoutput",{"2":{"72":1,"74":1,"75":1,"77":1,"78":1,"79":1,"80":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["settings",{"0":{"51":1},"2":{"51":5,"52":1}}],["setter",{"2":{"18":1,"51":1}}],["sets",{"2":{"43":1,"72":1,"74":1,"75":1,"77":4,"78":4,"79":3,"80":5,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":2,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":1,"126":2,"127":1,"128":1,"129":5,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["setalignment",{"2":{"42":1}}],["setup",{"2":{"29":1}}],["set",{"2":{"17":2,"18":1,"19":2,"20":1,"29":1,"31":1,"33":1,"34":1,"42":3,"45":1,"49":4,"51":1,"53":2,"59":1,"79":1,"86":1,"92":2,"116":1,"120":1,"121":1,"147":1}}],["soon",{"2":{"122":1}}],["sourcecode",{"2":{"72":1}}],["source",{"0":{"54":1},"2":{"17":1,"32":1,"72":1,"91":1,"92":1,"93":2,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"103":1,"126":1}}],["so",{"2":{"9":1,"28":1,"29":1,"34":1,"48":1,"52":1,"53":1,"66":1,"95":1,"98":1,"131":1,"132":1}}],["sometimes",{"2":{"17":1,"40":1,"54":1}}],["something",{"2":{"4":1,"19":3,"24":1,"86":2}}],["some",{"2":{"6":1,"18":1,"21":1,"26":1,"29":1,"31":1,"33":1,"44":1,"45":1,"46":1,"53":1,"59":1,"66":2,"143":1}}],["substitute",{"2":{"122":1,"123":1}}],["subclass",{"2":{"34":1}}],["suite",{"2":{"66":1,"85":1,"146":1,"147":1}}],["suits",{"2":{"48":1}}],["sudo",{"2":{"63":2}}],["suggest",{"2":{"59":1,"96":1,"98":1,"99":1}}],["suggests",{"2":{"21":1}}],["suppliment",{"2":{"20":1}}],["supported",{"2":{"45":1}}],["support",{"2":{"12":1}}],["supports",{"2":{"9":1,"24":1,"32":1,"48":2,"77":1}}],["success",{"2":{"45":1}}],["successful",{"2":{"45":2,"131":1}}],["succeeds",{"2":{"19":1}}],["succeed",{"2":{"7":1,"8":1,"9":2,"13":2,"132":1}}],["such",{"2":{"1":1,"27":1,"36":1,"40":1,"56":1,"74":1,"129":3}}],["s",{"2":{"6":1,"16":1,"18":2,"21":1,"22":1,"29":1,"31":2,"34":1,"38":3,"45":1,"49":2,"59":1,"106":1,"116":1,"121":2,"145":1}}],["stub",{"2":{"107":2}}],["stuff",{"2":{"105":1}}],["structure",{"2":{"129":2}}],["strpos",{"2":{"103":1}}],["strict",{"2":{"100":1}}],["string|array|",{"2":{"128":6}}],["string|",{"2":{"84":1,"113":1,"116":2}}],["string|string",{"2":{"83":1,"86":1,"143":1,"151":1,"152":1,"153":1}}],["string",{"2":{"1":1,"25":1,"26":1,"38":1,"49":1,"72":12,"75":1,"78":2,"79":1,"82":3,"83":2,"85":1,"86":1,"88":3,"89":3,"91":3,"92":7,"93":8,"94":3,"95":11,"96":3,"97":3,"98":3,"99":3,"100":3,"102":7,"103":3,"105":12,"107":4,"108":5,"109":7,"111":4,"112":4,"113":3,"114":3,"115":3,"116":10,"117":3,"118":3,"121":3,"122":5,"123":5,"128":10,"134":3,"139":3,"140":3,"142":10,"143":6,"145":3,"146":7,"147":7,"148":9,"149":6,"151":2,"152":2,"153":2}}],["stops",{"2":{"108":1,"118":1}}],["stopped",{"2":{"66":1,"83":1,"128":1}}],["stopprogressindicator",{"2":{"48":1}}],["stop",{"0":{"118":1},"2":{"46":1,"47":1,"143":1}}],["stoponfail",{"0":{"47":1},"2":{"46":1,"47":1,"83":2,"128":2,"143":2,"146":1,"149":1,"151":2,"152":2,"153":2}}],["storestate",{"2":{"18":1}}],["store",{"2":{"16":1,"18":2,"74":2}}],["stored",{"2":{"13":1,"18":1,"19":1,"50":1,"51":1}}],["step",{"2":{"44":1,"45":1,"48":1}}],["steps",{"2":{"15":1,"41":4,"48":3}}],["style",{"2":{"55":2,"120":1}}],["styles",{"2":{"36":1,"80":1}}],["styling",{"2":{"36":1}}],["still",{"2":{"13":1,"17":1}}],["stability",{"2":{"93":1,"95":1}}],["standard",{"2":{"54":1,"86":1}}],["standalone",{"0":{"31":1,"32":1},"2":{"31":1,"60":1,"66":1}}],["stats",{"2":{"142":1}}],["static",{"2":{"52":1}}],["state",{"0":{"16":1,"17":1,"18":1},"1":{"17":1,"18":1},"2":{"0":1,"9":1,"16":4,"17":3,"18":6,"26":1,"43":1}}],["starting",{"2":{"129":1}}],["startprogressindicator",{"2":{"48":1}}],["started",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1},"2":{"66":1,"69":1}}],["starter",{"2":{"30":1}}],["starts",{"2":{"34":1,"117":1}}],["startup",{"2":{"31":1,"33":1,"49":1}}],["start",{"0":{"117":1},"2":{"20":1,"25":1,"30":1,"35":1,"41":4,"49":1,"65":1}}],["stage",{"2":{"19":1,"34":1}}],["stack",{"0":{"46":1},"2":{"8":2,"46":4,"83":2,"128":1,"151":2,"152":2,"153":2}}],["uri",{"2":{"105":1}}],["uploads",{"2":{"66":1}}],["uppercase",{"2":{"49":1}}],["updated",{"2":{"151":1,"153":1}}],["updatenodev",{"2":{"97":1}}],["updatecheck",{"2":{"72":1}}],["updates",{"2":{"68":1,"102":1,"153":1}}],["update`",{"2":{"66":1}}],["update",{"0":{"89":1,"99":1,"140":1},"2":{"31":3,"59":1,"89":1,"99":1,"140":1,"153":2}}],["up",{"2":{"1":1,"9":1,"12":1,"13":1,"15":1,"25":1,"29":1,"31":1,"33":1,"43":1,"51":1,"53":1,"56":1,"59":1,"122":1,"131":1}}],["unpacking",{"2":{"74":1}}],["unknown",{"2":{"50":1}}],["unsuccessful",{"2":{"46":1}}],["unrecognized",{"2":{"34":1}}],["unit",{"2":{"29":1,"45":1}}],["unless",{"2":{"19":1,"38":1,"51":1,"122":1,"123":1,"143":1}}],["uname",{"2":{"18":4}}],["underscores",{"2":{"49":1}}],["understand",{"2":{"0":1}}],["under",{"2":{"7":1,"19":1,"22":2}}],["until",{"2":{"0":1,"18":1,"26":1}}],["usr",{"2":{"31":1,"63":4}}],["usable",{"2":{"26":1,"27":1,"29":1}}],["usage",{"0":{"65":1},"2":{"22":1,"41":1}}],["useglobal",{"2":{"92":1}}],["username",{"2":{"153":1}}],["users",{"2":{"34":1}}],["user",{"2":{"27":1,"38":1,"49":2,"56":1,"85":1,"103":3,"105":1,"106":1,"116":1,"142":2,"143":2}}],["useful",{"2":{"19":1,"59":1,"74":2,"77":1}}],["used",{"2":{"8":1,"9":1,"14":1,"15":1,"18":2,"20":1,"25":1,"26":1,"29":1,"31":1,"34":1,"38":2,"45":1,"46":1,"47":1,"48":1,"49":1,"59":2,"120":1,"121":1}}],["uses",{"2":{"6":1,"13":1,"52":1,"86":1}}],["use",{"0":{"28":1},"2":{"0":1,"4":1,"6":1,"10":1,"18":1,"19":4,"20":4,"21":3,"22":1,"26":2,"27":2,"28":2,"29":13,"30":1,"31":2,"32":2,"33":11,"34":4,"36":1,"38":1,"42":1,"45":5,"48":1,"50":1,"52":1,"54":1,"56":1,"58":2,"63":1,"64":1,"66":2,"74":1,"75":1,"77":2,"78":1,"79":1,"80":1,"82":1,"103":2,"113":1,"129":1,"130":1,"131":1,"136":1,"137":1,"145":1,"151":1,"152":1,"153":1}}],["using",{"0":{"6":1,"32":1,"33":1,"34":1},"2":{"0":1,"12":1,"16":1,"17":1,"18":1,"20":1,"21":1,"25":1,"31":1,"32":1,"33":2,"41":2,"45":1,"47":1,"48":1,"54":1,"59":2,"66":1,"75":1,"103":3,"122":1,"123":1,"145":2}}],["browser",{"2":{"106":3}}],["brought",{"2":{"68":1}}],["branching",{"2":{"13":1}}],["branch",{"2":{"6":2}}],["blogpost",{"2":{"123":1}}],["blob",{"2":{"106":1}}],["block",{"2":{"41":2}}],["blue",{"2":{"50":2}}],["bitbucket",{"2":{"152":1}}],["bill",{"2":{"37":2}}],["bin",{"2":{"22":1,"31":1,"36":1,"58":2,"59":1,"63":4,"64":1,"77":3,"92":2}}],["baz",{"2":{"50":2}}],["bars",{"2":{"59":1}}],["bar",{"2":{"48":1,"49":1,"50":2,"93":1,"98":1}}],["basic",{"2":{"26":1,"66":1}}],["baseurl",{"2":{"72":1}}],["based",{"2":{"58":1,"77":2}}],["basetask",{"2":{"26":1,"27":1,"48":1,"52":1}}],["base",{"0":{"81":1},"1":{"82":1,"83":1,"84":1,"85":1,"86":1},"2":{"19":1,"32":1,"45":1,"70":1}}],["background",{"2":{"27":1,"66":2,"82":1,"108":1}}],["backwards",{"2":{"20":1}}],["back",{"2":{"13":2,"122":1}}],["bottom",{"2":{"129":1}}],["both",{"2":{"17":1,"49":2,"78":1,"103":1}}],["body",{"2":{"102":1}}],["bool",{"2":{"74":1,"83":1,"91":1,"92":1,"93":3,"94":2,"95":1,"96":1,"97":6,"98":1,"99":1,"100":6,"105":2,"107":1,"122":2,"123":2,"128":7,"151":1,"152":1,"153":1}}],["bool|string",{"2":{"72":12}}],["boolean|string",{"2":{"72":1}}],["boolean",{"2":{"38":2}}],["bootstrap",{"2":{"72":1,"145":2,"148":2}}],["bower",{"0":{"87":1},"1":{"88":1,"89":1},"2":{"70":1,"88":6,"89":6}}],["boz",{"2":{"50":3}}],["bob",{"2":{"37":2}}],["boedah",{"2":{"21":2,"24":2,"25":1,"29":1}}],["box2",{"2":{"31":1}}],["box",{"2":{"12":1,"31":1,"121":1}}],["buffer",{"2":{"122":2,"123":2}}],["bufferedoutput",{"2":{"29":1}}],["bundled",{"2":{"35":1}}],["builds",{"2":{"111":1}}],["buildcommand",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["buildcommands",{"2":{"32":1,"59":1}}],["buildphar",{"2":{"66":1}}],["building",{"2":{"59":1,"66":1}}],["build",{"0":{"111":1},"2":{"55":1,"59":4,"111":1,"132":1}}],["builderawaretrait",{"2":{"28":1}}],["builderawareinterface",{"2":{"28":1}}],["builder",{"0":{"6":1},"2":{"0":2,"6":3,"16":2,"18":1,"26":1,"28":1,"29":4,"40":1,"74":1}}],["builders",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1},"2":{"6":1,"26":1,"29":1}}],["built",{"2":{"12":1,"20":1,"25":1}}],["but",{"2":{"8":1,"13":2,"18":1,"33":1,"38":2,"45":1,"74":1}}],["by",{"2":{"6":1,"8":1,"9":1,"10":1,"13":2,"15":1,"17":3,"18":2,"20":3,"22":2,"23":1,"24":1,"25":1,"36":1,"39":1,"41":2,"43":1,"48":2,"49":3,"51":1,"54":2,"59":1,"65":1,"66":3,"68":1,"74":3,"77":2,"78":1,"80":1,"83":1,"86":1,"103":1,"122":1,"123":1,"129":1,"152":1}}],["behat",{"0":{"146":1},"2":{"146":1}}],["behavior",{"2":{"34":1}}],["behave",{"2":{"15":1}}],["best",{"2":{"45":1,"48":1,"66":1}}],["becomes",{"2":{"37":1}}],["because",{"2":{"8":1}}],["beginning",{"2":{"103":1}}],["begins",{"2":{"42":1}}],["begin",{"2":{"35":1,"48":1}}],["better",{"2":{"30":1}}],["between",{"2":{"18":1,"41":1}}],["been",{"2":{"21":1}}],["benefits",{"2":{"19":1}}],["before",{"2":{"7":1,"8":1,"9":1,"18":1,"19":4,"84":1,"143":1}}],["below",{"2":{"1":1,"6":2,"7":1,"11":1,"13":1,"18":2,"20":1,"22":1,"23":1,"24":1,"26":1,"29":1,"30":1,"31":1,"41":1,"45":1,"48":1,"51":1,"53":1}}],["be",{"2":{"0":3,"6":1,"8":1,"9":1,"10":1,"12":1,"13":4,"14":1,"15":2,"16":1,"17":3,"18":5,"19":4,"20":3,"21":3,"22":2,"24":1,"26":1,"27":1,"31":2,"34":2,"35":1,"36":5,"38":9,"39":4,"40":1,"41":1,"42":1,"43":1,"44":1,"45":3,"46":1,"47":1,"48":2,"49":5,"50":2,"52":1,"53":1,"54":1,"56":1,"59":1,"65":2,"66":3,"72":4,"75":1,"77":2,"82":4,"83":2,"88":4,"89":4,"91":4,"92":4,"93":4,"94":4,"95":5,"96":4,"97":4,"98":5,"99":4,"100":4,"102":1,"103":6,"108":4,"111":4,"112":4,"113":4,"114":4,"115":4,"116":4,"117":4,"118":4,"121":4,"122":2,"123":1,"128":1,"129":7,"131":1,"134":4,"139":4,"140":4,"142":6,"143":4,"145":4,"146":4,"147":5,"148":4,"149":4,"151":2,"152":2,"153":2}}],["wp",{"2":{"116":1}}],["wget",{"2":{"63":1}}],["www",{"2":{"53":1,"77":1,"128":2,"142":2,"143":2}}],["web",{"2":{"66":3,"79":1,"120":4}}],["we",{"0":{"67":1},"2":{"29":1,"31":2,"36":1,"45":1,"131":1,"132":1}}],["well",{"2":{"21":1,"47":1,"58":1}}],["writing",{"2":{"61":1}}],["writes",{"2":{"103":1,"123":1}}],["write",{"0":{"123":1},"2":{"20":1}}],["wrapper",{"2":{"20":1,"104":1,"128":1}}],["wrap",{"2":{"15":3}}],["wait",{"2":{"84":1}}],["waitinterval",{"2":{"84":1}}],["watchcomposer",{"2":{"66":1}}],["watch",{"0":{"86":1},"2":{"66":1,"82":3,"86":1}}],["watching",{"2":{"61":1}}],["wassuccessful",{"2":{"45":1}}],["was",{"2":{"41":1,"45":1,"46":1,"51":1,"86":1,"129":1}}],["want",{"2":{"34":1,"54":1,"58":1,"59":1,"103":1,"131":1,"142":1}}],["ways",{"2":{"30":1}}],["way",{"2":{"13":1,"15":1,"29":1,"40":1,"54":1,"59":1,"66":1}}],["warrant",{"2":{"13":1}}],["won",{"2":{"103":3}}],["world",{"2":{"37":2,"38":3,"50":2}}],["wordpress",{"2":{"114":1,"116":1}}],["word",{"2":{"25":1}}],["workers",{"2":{"61":1}}],["works",{"2":{"18":2,"31":1}}],["workdir",{"0":{"132":1},"2":{"13":2,"131":1}}],["workingdir",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["working",{"0":{"57":1},"1":{"58":1,"59":1},"2":{"13":2,"31":1,"49":3,"72":1,"82":1,"83":1,"88":1,"89":1,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"132":4,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["work",{"2":{"10":1,"13":2,"43":1,"58":2}}],["wouldchange",{"2":{"122":1,"123":1}}],["would",{"2":{"10":1,"19":1,"51":1,"59":1,"129":2}}],["windows",{"2":{"106":1}}],["window",{"2":{"106":1}}],["widgets",{"2":{"105":1}}],["wipeout",{"2":{"72":1}}],["wish",{"2":{"21":1,"29":1,"32":4,"34":3,"45":1,"48":1,"53":1,"56":1}}],["withdependencies",{"2":{"100":1}}],["within",{"2":{"22":1,"31":1,"52":1}}],["without",{"2":{"13":1,"37":1,"40":2,"75":1,"77":1,"129":1}}],["with",{"0":{"31":1,"33":1,"57":1,"59":1},"1":{"58":1,"59":1},"2":{"1":1,"4":1,"17":1,"19":4,"20":1,"25":1,"26":1,"27":1,"31":3,"33":2,"34":2,"38":1,"39":1,"41":1,"42":1,"44":1,"49":3,"51":5,"58":1,"59":1,"61":1,"65":1,"66":3,"67":1,"72":3,"74":1,"77":1,"79":1,"82":3,"83":1,"86":1,"88":4,"89":4,"91":3,"92":3,"93":3,"94":6,"95":3,"96":5,"97":3,"98":3,"99":5,"100":3,"102":1,"103":2,"108":4,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"121":1,"122":3,"123":3,"128":1,"129":3,"134":4,"139":4,"140":4,"142":3,"143":5,"145":3,"146":3,"147":4,"148":3,"149":3,"151":4,"152":3,"153":3}}],["will",{"2":{"0":4,"7":1,"10":1,"13":5,"15":2,"18":2,"20":1,"21":1,"24":1,"26":1,"28":1,"31":1,"32":2,"35":2,"36":3,"37":1,"38":2,"39":1,"40":1,"41":2,"45":8,"48":3,"49":2,"50":4,"51":2,"53":1,"54":1,"59":3,"66":3,"72":1,"74":1,"77":6,"82":1,"84":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"121":1,"129":6,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["wholefile",{"2":{"142":1}}],["whole",{"2":{"58":1}}],["who=everyone",{"2":{"50":1}}],["who",{"2":{"50":5}}],["whose",{"2":{"42":1}}],["what",{"2":{"43":1,"55":1}}],["while",{"2":{"28":1}}],["which",{"2":{"0":1,"7":1,"8":1,"35":2,"38":4,"41":1,"43":2,"46":1,"50":1,"55":1,"56":1,"129":2,"143":1}}],["whether",{"2":{"143":1}}],["where",{"2":{"18":1,"27":1,"38":1,"39":1,"74":1,"77":1,"129":1}}],["whenever",{"2":{"8":1,"13":1,"38":1}}],["when",{"2":{"0":2,"6":3,"9":1,"13":2,"14":2,"15":2,"16":1,"21":1,"29":1,"31":2,"36":2,"38":1,"45":3,"48":2,"59":5,"66":1,"74":2,"77":3,"82":1,"86":1,"108":1,"122":2,"131":3,"132":1}}],["oyejorge",{"2":{"78":1}}],["osx",{"2":{"63":2}}],["omitted",{"2":{"36":1,"48":1}}],["our",{"2":{"29":1,"31":1,"37":1,"68":1,"122":1,"131":1,"132":2}}],["outfile",{"2":{"77":1}}],["outputinterface",{"2":{"33":3}}],["output",{"2":{"18":2,"27":1,"29":4,"31":1,"33":2,"36":2,"41":2,"55":1,"56":1,"59":2,"72":1,"74":1,"75":1,"77":1,"78":1,"79":1,"80":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["out",{"2":{"12":1,"35":1,"41":1,"59":1,"103":3}}],["obtained",{"2":{"45":1}}],["obtain",{"2":{"28":1}}],["objects",{"0":{"2":1,"12":1},"1":{"13":1,"14":1,"15":1},"2":{"12":2,"15":2,"45":2}}],["object",{"2":{"1":1,"15":1,"16":1,"19":1,"28":1,"34":1,"45":5,"86":1}}],["overwrite",{"2":{"126":1}}],["overwritten",{"2":{"13":1,"126":1}}],["overloading",{"2":{"78":1,"80":1}}],["overridden",{"2":{"53":1}}],["override",{"2":{"48":1,"129":1}}],["over",{"2":{"49":1,"50":1,"54":1}}],["overview",{"2":{"23":1,"60":1}}],["open",{"2":{"106":2}}],["opens",{"2":{"106":1}}],["openbrowser",{"0":{"106":1},"2":{"106":1}}],["operate",{"2":{"92":1}}],["operations",{"2":{"6":1,"13":2,"19":2,"26":1,"59":1}}],["operation",{"2":{"0":1,"6":1,"46":1,"48":2}}],["optimizeautoloader",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["optimize",{"2":{"77":1,"91":1,"92":1,"93":1,"94":4,"95":1,"96":2,"97":1,"98":1,"99":2,"100":1}}],["optipng",{"2":{"77":2}}],["optionlist",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["option",{"2":{"38":8,"39":1,"41":1,"50":4,"51":1,"52":1,"56":1,"59":1,"72":3,"79":3,"82":3,"88":7,"89":7,"91":13,"92":13,"93":13,"94":13,"95":13,"96":14,"97":12,"98":14,"99":14,"100":13,"108":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"128":1,"134":7,"139":4,"140":4,"142":3,"143":3,"145":3,"146":3,"147":5,"148":5,"149":3}}],["optionally",{"2":{"31":1}}],["optional",{"2":{"31":1,"33":1,"37":1,"38":1}}],["options",{"0":{"38":1,"50":1},"2":{"22":1,"32":1,"38":4,"41":2,"49":1,"50":5,"53":1,"72":3,"77":1,"82":3,"88":3,"89":3,"91":4,"92":4,"93":3,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"108":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":3,"149":3}}],["opt",{"2":{"34":1,"85":1}}],["occur",{"2":{"10":1}}],["otherwise",{"2":{"10":1,"38":1,"52":1}}],["other",{"0":{"39":1},"2":{"6":1,"12":1,"13":1,"19":2,"28":1,"31":1,"33":1,"38":1,"39":1,"46":1,"53":1,"113":1,"136":1,"137":1,"143":1,"147":1}}],["owner",{"2":{"105":1,"142":1}}],["own",{"0":{"33":1},"2":{"6":1,"15":1,"20":2,"23":1,"30":1,"33":4,"54":2,"59":1,"66":1,"67":1}}],["origin",{"2":{"151":2}}],["originalcontents",{"2":{"122":1,"123":1}}],["original",{"2":{"0":1,"13":1,"19":1}}],["org",{"2":{"31":1,"33":1,"105":1,"152":1}}],["order",{"2":{"18":1}}],["or",{"2":{"1":1,"6":1,"8":1,"10":4,"11":1,"13":2,"19":4,"22":2,"26":1,"27":2,"31":4,"32":2,"34":2,"38":1,"39":1,"42":2,"43":1,"45":3,"48":1,"49":2,"52":1,"53":1,"58":1,"59":2,"66":2,"67":1,"72":2,"74":2,"75":5,"78":1,"79":1,"82":3,"83":1,"86":1,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"102":1,"103":2,"108":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"122":1,"129":2,"130":1,"131":1,"134":2,"136":2,"137":2,"139":2,"140":2,"142":4,"143":3,"145":5,"146":2,"147":2,"148":3,"149":2,"151":1,"152":1,"153":1}}],["on",{"2":{"10":1,"12":1,"13":1,"14":1,"23":2,"31":1,"38":3,"43":2,"47":1,"49":1,"50":1,"55":1,"56":1,"59":1,"60":1,"66":1,"67":1,"77":2,"83":1,"92":1,"116":1,"128":1,"131":2,"143":1,"151":1,"152":1,"153":1}}],["only",{"2":{"7":1,"8":2,"24":1,"31":1,"77":1}}],["once",{"2":{"0":1,"15":1,"21":2,"59":1,"122":1,"131":1,"132":1}}],["one",{"2":{"0":1,"9":1,"13":1,"16":1,"17":3,"18":1,"19":1,"22":3,"28":1,"31":1,"37":1,"38":2,"43":1,"45":1,"46":2,"48":1,"78":1,"83":2,"106":1,"120":1,"126":1,"128":1,"143":1}}],["often",{"2":{"74":1}}],["offline",{"2":{"88":2,"89":2}}],["off",{"2":{"34":1}}],["of",{"2":{"0":3,"1":4,"6":4,"7":1,"8":2,"9":3,"10":1,"12":3,"13":7,"15":4,"16":1,"17":3,"18":6,"19":3,"20":2,"21":4,"23":1,"24":2,"25":2,"26":3,"29":3,"30":1,"31":3,"32":3,"34":6,"35":1,"36":2,"38":1,"39":1,"40":1,"41":2,"42":1,"43":1,"45":4,"46":2,"47":1,"48":4,"49":1,"50":1,"51":2,"52":2,"55":2,"59":7,"66":2,"72":1,"74":2,"75":3,"78":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"103":4,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"122":4,"123":2,"129":2,"131":2,"132":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":3,"148":2,"149":1,"151":1,"152":1,"153":1}}],["i",{"2":{"142":1}}],["ip",{"2":{"108":1}}],["ignoring",{"2":{"66":1,"125":1}}],["ignore",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["ignoreplatformrequirements",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["ignores",{"2":{"42":1}}],["ignored",{"0":{"42":1}}],["illustrate",{"2":{"45":1}}],["identityfile",{"2":{"143":1}}],["identical",{"2":{"13":1}}],["idea",{"2":{"40":1}}],["io",{"0":{"55":1},"1":{"56":1},"2":{"27":3,"55":1,"56":1}}],["image",{"2":{"111":1,"112":1,"114":1,"116":1}}],["imagemin",{"2":{"77":2}}],["imageminify",{"0":{"77":1}}],["images",{"2":{"77":12}}],["important",{"2":{"116":1}}],["importdir",{"2":{"78":1,"80":1}}],["imports",{"2":{"78":1}}],["import",{"2":{"34":1,"78":3,"80":3}}],["implode",{"2":{"37":1}}],["implicitly",{"0":{"17":1}}],["implementing",{"0":{"59":1},"2":{"31":1}}],["implemented",{"2":{"18":2,"31":1,"51":2}}],["implementations",{"2":{"26":1,"32":1}}],["implementation",{"0":{"26":1},"2":{"15":1,"20":1,"25":1,"26":1,"28":1,"52":1}}],["implement",{"2":{"10":2,"15":1,"17":1,"26":1,"28":1,"42":1,"78":1,"80":1,"143":1}}],["implements",{"2":{"1":1,"17":1,"20":1,"26":1,"29":1}}],["immediately",{"2":{"18":2}}],["itemizechanges",{"2":{"142":1}}],["item",{"2":{"75":1}}],["items",{"2":{"25":1,"142":1}}],["it",{"2":{"6":1,"8":1,"9":2,"13":3,"15":1,"16":1,"17":1,"18":5,"19":5,"20":1,"21":2,"25":1,"27":1,"28":3,"29":2,"31":3,"32":3,"33":1,"36":2,"38":1,"39":1,"44":1,"45":2,"48":1,"49":1,"50":1,"52":2,"54":1,"56":1,"59":1,"63":1,"65":1,"66":2,"75":1,"77":3,"79":1,"82":1,"95":1,"98":1,"103":1,"108":1,"122":3,"126":1,"129":1,"131":1,"132":1}}],["itself",{"2":{"13":1,"52":1,"59":1}}],["its",{"2":{"0":1,"10":1,"13":6,"15":1,"26":2,"46":1,"48":1,"51":1,"54":1,"66":1,"72":2,"82":2,"86":1,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"108":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"132":2,"134":2,"139":2,"140":2,"142":2,"143":2,"145":2,"146":2,"147":2,"148":2,"149":2}}],["inject",{"2":{"52":1,"78":1,"80":1}}],["injected",{"2":{"51":2}}],["injection",{"0":{"33":1},"2":{"29":1}}],["invoke",{"2":{"45":1}}],["increment",{"2":{"109":1}}],["incorrect",{"2":{"38":1}}],["including",{"0":{"21":1},"2":{"20":1,"26":1,"27":1,"39":1,"51":1}}],["includefilter",{"2":{"142":1}}],["includeparents",{"2":{"129":2}}],["includes",{"2":{"35":1}}],["included",{"2":{"21":1,"31":1,"59":1,"129":1}}],["include",{"2":{"20":1,"21":2,"31":1,"59":1,"103":1}}],["individual",{"2":{"49":1}}],["indicated",{"2":{"48":1}}],["indicates",{"2":{"38":4}}],["indicator",{"2":{"48":4}}],["indicators",{"2":{"48":2}}],["independently",{"2":{"17":1}}],["initially",{"2":{"41":1}}],["initialize",{"2":{"29":2}}],["initializer",{"2":{"26":1}}],["initialization",{"2":{"18":1}}],["init",{"0":{"95":1},"2":{"35":2,"65":1,"95":1}}],["inputoption",{"2":{"38":1}}],["inputinterface",{"2":{"33":3}}],["input",{"2":{"33":2,"55":1,"72":1,"77":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["inherit",{"2":{"27":1}}],["inspired",{"2":{"106":1,"129":1}}],["inspecting",{"2":{"43":1}}],["inside",{"2":{"27":1,"39":1,"75":2,"113":1,"116":1,"121":1,"129":1}}],["inserts",{"2":{"103":2}}],["insert",{"2":{"19":2}}],["instructions",{"2":{"23":1}}],["installing",{"0":{"62":1},"1":{"63":1,"64":1}}],["install",{"0":{"88":1,"96":1,"139":1},"2":{"31":1,"63":1,"79":1,"88":1,"96":1,"139":1}}],["installed",{"2":{"21":1,"36":1,"77":1}}],["instance",{"2":{"45":3}}],["instances",{"2":{"18":1}}],["instantiate",{"2":{"33":1}}],["instantiates",{"2":{"20":1}}],["instead",{"2":{"13":1,"18":1,"31":1,"38":1,"45":1,"51":1,"56":1,"74":1,"129":1}}],["information",{"2":{"18":1,"32":1,"45":1,"56":1,"74":2}}],["int",{"2":{"41":2,"128":5,"136":2,"137":1,"143":1}}],["into",{"2":{"19":1,"21":1,"32":1,"40":2,"43":1,"45":1,"56":1,"60":1,"66":1,"74":1,"77":1,"91":1,"92":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"120":1,"126":1,"132":1}}],["introducing",{"2":{"13":1}}],["integration",{"2":{"45":1}}],["interaction",{"2":{"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2}}],["internal",{"2":{"39":1,"72":1}}],["interface",{"2":{"17":1,"103":1}}],["interrupted",{"2":{"9":1}}],["intended",{"2":{"8":1}}],["inline",{"2":{"1":1}}],["in",{"0":{"32":1,"53":1},"2":{"0":2,"6":1,"8":1,"9":1,"10":1,"12":1,"13":8,"15":1,"16":2,"17":1,"18":4,"19":2,"20":11,"21":3,"22":3,"25":4,"26":4,"27":2,"28":1,"29":5,"30":1,"31":7,"32":1,"33":1,"34":4,"35":1,"36":2,"37":2,"38":1,"39":2,"41":2,"45":2,"46":2,"48":2,"49":5,"50":2,"51":3,"52":3,"53":4,"54":3,"55":1,"58":1,"59":8,"63":2,"65":3,"66":4,"67":1,"72":2,"74":1,"75":4,"77":2,"78":1,"80":1,"82":3,"83":1,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"102":1,"103":1,"106":1,"108":4,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"128":1,"129":4,"131":1,"132":1,"134":2,"139":2,"140":2,"142":3,"143":2,"145":2,"146":2,"147":4,"148":2,"149":2,"151":1,"152":1,"153":1}}],["if",{"2":{"0":1,"7":1,"8":1,"9":2,"10":4,"13":5,"14":1,"15":1,"17":2,"18":1,"19":2,"21":1,"24":1,"26":1,"28":1,"29":1,"31":4,"32":5,"33":2,"34":3,"37":1,"38":3,"43":1,"44":1,"45":6,"46":1,"48":2,"49":2,"50":3,"52":1,"53":1,"54":1,"55":1,"58":1,"59":3,"66":1,"82":1,"83":1,"121":1,"122":1,"123":1,"126":1,"129":4,"131":1,"132":2,"142":1,"143":1}}],["isa",{"2":{"36":1}}],["is",{"2":{"0":2,"6":2,"8":6,"9":2,"10":2,"12":1,"13":7,"15":4,"16":2,"18":6,"19":6,"20":2,"21":1,"23":2,"25":1,"26":3,"27":1,"28":1,"29":3,"31":4,"32":1,"33":1,"34":1,"38":4,"39":1,"40":2,"41":2,"45":5,"47":2,"48":2,"50":2,"51":2,"52":2,"53":1,"54":1,"55":2,"56":1,"58":1,"59":3,"66":1,"74":1,"77":5,"86":1,"95":1,"98":1,"103":1,"104":1,"107":1,"122":6,"131":5,"132":4,"143":1}}],["cssmin",{"2":{"79":1}}],["css",{"2":{"78":4,"79":2,"80":2,"120":4}}],["credits",{"0":{"68":1}}],["creation",{"2":{"14":1}}],["creating",{"0":{"23":1,"31":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1},"2":{"14":1,"20":1,"22":1,"23":2,"30":1,"40":1,"66":1}}],["createproject",{"0":{"93":1},"2":{"93":1}}],["createcontainer",{"2":{"33":1}}],["createconfiguration",{"2":{"33":1,"34":1}}],["creates",{"2":{"13":1,"75":1,"102":1,"107":1}}],["createdefaultcontainer",{"2":{"29":2}}],["created",{"2":{"6":2,"12":1,"13":3,"14":1,"23":1,"65":1,"72":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"122":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["create",{"0":{"24":1,"25":1},"2":{"0":2,"13":2,"15":1,"18":1,"19":1,"20":3,"29":2,"31":4,"33":3,"35":2,"54":1,"66":1,"67":2,"86":1,"107":2,"122":1,"131":1,"132":1}}],["cross",{"2":{"61":1}}],["cid",{"2":{"116":1}}],["ci",{"2":{"59":1}}],["circumstances",{"2":{"7":1}}],["c",{"2":{"40":2,"66":1,"147":1}}],["cwd",{"2":{"39":1,"75":1,"131":2,"132":2}}],["cp",{"2":{"36":1}}],["certain",{"2":{"34":1,"59":1}}],["cube",{"2":{"41":2}}],["custom",{"0":{"34":1},"2":{"33":2,"43":1,"88":1,"89":1,"94":3,"96":2,"99":2,"139":1,"140":1}}],["customization",{"2":{"31":1}}],["customize",{"2":{"24":1,"26":1,"34":1}}],["current",{"2":{"17":1,"31":1,"39":1,"43":1,"49":3,"53":1,"102":1,"129":1}}],["cd",{"2":{"21":1,"35":1,"58":1,"59":1,"83":1}}],["case",{"2":{"75":1,"77":1}}],["cased",{"2":{"36":2}}],["cache",{"2":{"66":3,"125":1}}],["came",{"2":{"39":1}}],["camel",{"2":{"36":2}}],["camelcased",{"2":{"36":2}}],["capable",{"2":{"34":1}}],["capability",{"2":{"21":1}}],["cannot",{"2":{"95":1,"98":1}}],["cancel",{"2":{"10":1}}],["can",{"2":{"9":1,"12":1,"16":1,"18":2,"19":1,"20":1,"22":3,"29":1,"32":1,"36":1,"38":2,"39":3,"43":1,"44":1,"45":1,"46":1,"47":1,"49":2,"50":1,"53":1,"54":1,"55":2,"56":1,"63":1,"65":2,"66":2,"72":3,"77":1,"78":1,"80":1,"82":3,"83":2,"88":3,"89":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"102":1,"103":2,"108":3,"111":3,"112":4,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"128":1,"129":3,"134":3,"139":3,"140":3,"142":5,"143":5,"145":3,"146":3,"147":4,"148":3,"149":3,"151":2,"152":2,"153":2}}],["calculate",{"2":{"41":1}}],["calculated",{"2":{"0":1,"129":1}}],["callback",{"2":{"103":3}}],["callbacks",{"0":{"11":1},"2":{"10":1}}],["caller",{"2":{"19":1}}],["called",{"2":{"0":1,"6":1,"10":1,"15":3,"18":1,"20":1,"36":1,"46":1,"147":1}}],["calling",{"2":{"18":1,"29":1}}],["call",{"2":{"18":1,"25":1,"34":2,"45":1,"48":3,"59":2,"83":1}}],["calls",{"2":{"18":1,"20":1,"143":1}}],["callables",{"2":{"11":1}}],["callable",{"2":{"1":1,"18":1,"86":1,"103":1}}],["cloneshallow",{"2":{"151":1}}],["clonerepo",{"2":{"151":1,"152":1}}],["clone",{"2":{"142":2,"151":2,"152":1}}],["closes",{"2":{"82":1}}],["closures",{"0":{"4":1}}],["closure",{"2":{"1":1}}],["cli",{"2":{"36":2,"37":1}}],["cleandir",{"0":{"125":1},"2":{"125":1}}],["cleaning",{"2":{"66":1}}],["cleans",{"2":{"13":1,"66":1}}],["cleaned",{"2":{"12":1,"15":1,"122":1,"131":1}}],["clean",{"2":{"9":1,"34":1,"66":2,"134":2}}],["classname",{"2":{"51":2}}],["classes",{"2":{"22":2,"31":2,"32":1,"33":1,"34":1,"103":3}}],["class",{"2":{"6":1,"13":3,"20":2,"22":1,"26":4,"27":1,"29":1,"31":3,"32":7,"33":3,"35":2,"36":3,"39":2,"45":2,"46":1,"48":3,"51":3,"53":2,"54":1,"66":3,"84":1,"91":1,"92":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"103":10,"104":1,"111":1}}],["chrome",{"2":{"147":1}}],["chown",{"2":{"128":1}}],["choosing",{"2":{"31":1}}],["choose",{"2":{"26":1}}],["chgrp",{"2":{"128":1}}],["chmod",{"2":{"63":2,"128":1,"136":1,"137":1,"143":1}}],["chain",{"2":{"143":2}}],["chained",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"6":1,"17":2,"18":1,"20":1,"26":1}}],["charset",{"2":{"72":1}}],["characters",{"2":{"40":1}}],["character",{"2":{"38":1}}],["changed",{"2":{"59":1,"77":1,"86":2,"152":1}}],["changes",{"2":{"43":1,"61":1,"66":1,"72":1,"82":1,"83":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":3,"105":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":2,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["change",{"2":{"9":1,"40":1,"66":1,"102":1,"105":1}}],["changelog",{"0":{"102":1},"2":{"6":3,"8":3,"40":1,"102":3}}],["chandelog",{"2":{"8":1}}],["checkout",{"2":{"151":2,"153":2}}],["checksum",{"2":{"142":1}}],["checkplatformreqs",{"0":{"91":1}}],["check",{"2":{"0":1,"45":1,"91":1}}],["cov",{"2":{"147":1}}],["coveragehtml",{"2":{"147":1}}],["coveragexml",{"2":{"147":1}}],["coverage",{"2":{"147":3}}],["collab",{"2":{"153":2}}],["collect",{"2":{"18":1,"147":3}}],["collectionbuilder",{"2":{"13":1,"28":3,"29":4,"66":1}}],["collections",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1},"2":{"0":2,"1":1,"19":1,"26":1,"28":1,"40":1,"43":1,"45":1,"47":1,"48":1,"69":1}}],["collection",{"0":{"0":1,"6":1,"15":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1},"2":{"0":1,"1":1,"6":7,"7":1,"8":2,"10":1,"12":1,"13":7,"14":2,"15":7,"16":1,"18":1,"19":2,"26":1,"28":1,"29":4,"45":2,"48":2,"74":1,"122":3,"131":2,"132":1}}],["colors",{"2":{"72":1,"146":1}}],["colored",{"2":{"59":1}}],["color",{"2":{"50":3,"134":3}}],["copydir",{"0":{"126":1},"2":{"126":1}}],["copy",{"2":{"44":1,"59":1,"77":2,"91":1,"92":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"128":1,"129":1}}],["copied",{"2":{"36":1,"77":1,"129":1}}],["copies",{"2":{"8":1,"126":1,"129":1}}],["correctly",{"2":{"45":1,"107":1}}],["corresponding",{"2":{"41":1,"51":1}}],["core",{"2":{"20":1,"59":1,"148":1}}],["counts",{"2":{"121":1}}],["count",{"2":{"48":1}}],["could",{"2":{"17":1,"18":1,"31":1,"51":1,"142":1}}],["couple",{"2":{"6":1}}],["concat",{"0":{"120":1}}],["concept",{"2":{"12":1}}],["confirm",{"2":{"55":1}}],["configfile",{"2":{"145":1,"147":1,"148":1}}],["configruation",{"2":{"51":1}}],["configprocessor",{"2":{"34":3}}],["config",{"0":{"92":1},"2":{"33":2,"34":10,"44":2,"49":1,"52":1,"72":2,"92":1,"121":1,"126":4,"130":4,"145":2,"146":1,"147":2,"149":1}}],["configawaretrait",{"2":{"33":2,"52":1}}],["configuraiton",{"2":{"34":1}}],["configuration",{"0":{"34":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1},"1":{"50":1,"51":1,"52":1,"53":1,"54":1},"2":{"17":1,"18":1,"20":1,"26":1,"34":10,"44":1,"49":6,"50":7,"51":6,"52":4,"53":4,"54":3,"92":1}}],["configured",{"2":{"65":1}}],["configure",{"2":{"18":1,"33":1,"51":1,"53":1,"143":2}}],["converted",{"2":{"49":1,"56":1}}],["convert",{"2":{"45":1}}],["convenient",{"2":{"59":1}}],["convenience",{"2":{"13":1}}],["convention",{"2":{"20":1}}],["connecting",{"2":{"17":1}}],["consider",{"2":{"34":1}}],["const",{"2":{"33":2}}],["constructor",{"2":{"31":1,"32":2,"53":1,"54":1}}],["construct",{"2":{"26":2,"33":1,"53":1,"54":1}}],["constant",{"2":{"25":1}}],["consoleoutput",{"2":{"31":1,"33":1}}],["console",{"2":{"29":2,"31":1,"33":5,"55":2,"72":1,"74":1,"75":1,"77":1,"78":1,"79":1,"80":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":2,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["consoleio",{"2":{"6":1,"13":2,"21":1,"22":3,"36":3,"37":2,"38":2,"40":1,"41":1,"42":1,"45":1,"50":1,"66":4}}],["consolidation",{"2":{"24":1,"31":1,"32":1,"34":2,"41":1,"56":1,"58":1,"59":1,"64":1,"68":1,"105":1}}],["consumer",{"2":{"17":2}}],["contributors",{"2":{"68":1}}],["control",{"2":{"54":1}}],["contract",{"2":{"10":2,"15":1,"26":1,"84":1,"113":1,"116":1}}],["contents",{"2":{"31":1,"75":1,"103":3}}],["context",{"2":{"27":1}}],["contain",{"2":{"45":1,"46":2,"74":1}}],["containing",{"2":{"38":1,"40":1}}],["containerworkdir",{"2":{"116":1}}],["containers",{"2":{"116":1}}],["containerawaretrait",{"2":{"29":2}}],["containerawareinterface",{"2":{"29":2}}],["container",{"0":{"33":1},"2":{"29":4,"33":6,"112":1,"113":1,"115":1,"116":5,"117":1,"118":1}}],["contains",{"2":{"16":1,"29":1,"42":1,"45":1,"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["continue",{"2":{"10":1}}],["condition",{"2":{"0":1}}],["comands",{"2":{"128":1}}],["com",{"2":{"106":1,"142":1,"143":2}}],["comittish",{"2":{"105":1}}],["combined",{"2":{"143":1}}],["combines",{"2":{"103":1}}],["combine",{"2":{"33":1,"43":1}}],["combination",{"2":{"1":1}}],["compass",{"2":{"82":3}}],["compatibility",{"2":{"20":1}}],["compress",{"2":{"77":1,"107":1,"142":1}}],["component",{"2":{"29":2,"31":1,"33":5,"51":1,"104":1,"107":1,"128":1}}],["composer",{"0":{"24":1,"57":1,"59":1,"64":1,"90":1},"1":{"58":1,"59":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1},"2":{"20":1,"21":6,"22":1,"23":2,"24":1,"31":3,"40":2,"58":6,"59":14,"64":1,"66":2,"67":1,"70":1,"79":2,"86":1,"91":11,"92":11,"93":11,"94":14,"95":11,"96":14,"97":10,"98":12,"99":14,"100":11,"106":3}}],["compiler",{"2":{"78":2,"80":3}}],["compilers",{"2":{"78":2,"80":1}}],["compiles",{"2":{"78":1,"80":1}}],["compiled",{"2":{"45":2}}],["compile",{"2":{"26":1,"45":1}}],["compileassets",{"2":{"26":4,"45":1}}],["complex",{"2":{"18":2}}],["completed",{"2":{"48":1}}],["completely",{"2":{"33":1}}],["completes",{"2":{"6":1,"8":1,"13":2,"14":1,"122":3,"131":2}}],["complete",{"2":{"6":1,"15":2,"122":1,"131":1,"132":1}}],["completioninterface",{"2":{"10":1,"15":1}}],["completions",{"0":{"7":1},"1":{"8":1,"9":1,"10":1,"11":1},"2":{"6":1,"7":1,"8":1,"9":1,"10":2}}],["completion",{"0":{"8":1,"10":1,"11":1},"2":{"6":1,"8":1,"10":1,"11":1,"131":1}}],["commits",{"2":{"112":1}}],["commit",{"0":{"112":1},"2":{"151":2,"152":2,"153":2}}],["comment",{"2":{"41":1}}],["comments",{"2":{"41":1}}],["common",{"0":{"61":1},"2":{"12":1,"13":1,"27":1,"33":1,"45":1,"50":1}}],["commandinterface",{"2":{"84":1,"113":1,"116":1,"143":1}}],["commandfilediscovery",{"2":{"32":2}}],["commandline",{"2":{"30":1,"38":2,"49":1,"50":1,"53":1,"59":1}}],["commandtwo",{"2":{"22":1}}],["commandone",{"2":{"22":1}}],["commandstack",{"2":{"24":1}}],["commands",{"0":{"36":1},"1":{"37":1,"38":1,"39":1,"40":1,"41":1,"42":1},"2":{"21":1,"22":7,"31":5,"32":7,"36":4,"39":1,"42":1,"43":1,"45":2,"46":1,"50":2,"56":1,"59":6,"66":1,"83":1,"113":1,"143":4,"151":1,"152":1,"153":1}}],["command",{"0":{"22":1,"50":1},"2":{"6":1,"18":1,"22":12,"27":1,"29":3,"31":3,"32":7,"33":1,"37":1,"38":3,"40":2,"41":2,"42":3,"43":2,"45":4,"47":1,"49":1,"50":7,"55":1,"66":2,"72":3,"82":1,"83":1,"85":4,"88":1,"89":1,"91":2,"92":2,"93":1,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"106":1,"111":1,"112":1,"113":2,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":2,"145":1,"146":1,"147":1,"148":1,"149":1,"151":7,"152":6,"153":5}}],["come",{"2":{"8":1,"9":2}}],["codecoverage",{"2":{"147":1}}],["codecept",{"0":{"147":1},"2":{"107":2}}],["codeception",{"2":{"40":1,"66":2,"85":1,"147":2}}],["code",{"0":{"53":1},"2":{"0":1,"13":1,"19":1,"33":4,"34":1,"45":2,"53":1,"106":1,"129":1,"147":2}}],["t",{"2":{"103":3,"126":1}}],["txt",{"2":{"75":3,"121":1,"131":1,"132":1}}],["title",{"2":{"72":1}}],["times",{"2":{"38":1,"48":1,"142":1,"147":1}}],["time",{"2":{"13":1,"48":1}}],["turn",{"2":{"60":1}}],["typically",{"2":{"43":1}}],["types",{"2":{"86":1}}],["typehint",{"2":{"37":1}}],["type",{"2":{"20":1,"23":1,"24":2,"58":1,"67":1,"79":3}}],["tap",{"2":{"145":2,"147":2,"148":1}}],["tags",{"2":{"145":2}}],["tag",{"2":{"105":1,"111":1,"145":1,"151":2,"152":2}}],["target",{"2":{"77":2,"93":1,"129":5}}],["tar",{"2":{"74":1,"75":1}}],["table",{"2":{"56":1}}],["taken",{"2":{"55":1}}],["take",{"2":{"50":1,"53":1,"54":1,"66":1,"103":2,"112":1}}],["takes",{"2":{"17":1,"32":1,"38":1,"48":1,"75":1,"86":1,"103":1}}],["taking",{"2":{"49":1}}],["taskgroup",{"2":{"51":4,"52":1}}],["taskmyoperation",{"2":{"51":1,"52":1}}],["taskpackphar",{"2":{"31":1}}],["taskaccessor",{"2":{"29":3}}],["taskio",{"0":{"27":1},"2":{"27":1}}],["taskinterface",{"0":{"2":1},"2":{"1":1,"20":1,"26":1,"45":1}}],["taskcompileassets",{"2":{"26":1}}],["taskdrushstack",{"2":{"25":1}}],["taskname",{"2":{"19":5}}],["taskfilesystemstack",{"2":{"18":1}}],["taskexec",{"2":{"18":2,"40":1}}],["taskwrite",{"2":{"14":1,"122":1}}],["tasktmpfile",{"2":{"14":1,"15":2}}],["tasktmpdir",{"2":{"13":2}}],["tasks",{"0":{"8":1,"9":1,"19":1,"21":1,"25":1,"28":2,"43":1,"61":1,"67":1,"70":1,"71":1,"73":1,"76":1,"81":1,"87":1,"90":1,"101":1,"110":1,"119":1,"124":1,"133":1,"135":1,"138":1,"141":1,"144":1,"150":1},"1":{"44":1,"45":1,"46":1,"47":1,"48":1,"72":1,"74":1,"75":1,"77":1,"78":1,"79":1,"80":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"120":1,"121":1,"122":1,"123":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1},"2":{"0":6,"1":2,"6":8,"7":3,"8":1,"9":5,"10":1,"13":5,"15":2,"16":1,"17":3,"18":2,"19":6,"20":12,"21":5,"22":1,"23":2,"24":3,"25":2,"26":6,"27":4,"28":1,"29":5,"35":3,"36":1,"40":2,"43":4,"44":1,"45":2,"46":4,"48":2,"51":2,"59":1,"64":1,"65":3,"66":3,"67":2,"113":1,"132":1,"134":1,"143":1}}],["task",{"0":{"26":1,"51":1},"2":{"0":4,"1":1,"8":4,"9":1,"10":2,"13":2,"15":2,"16":3,"17":8,"18":4,"19":5,"20":5,"21":1,"23":1,"24":2,"25":7,"26":9,"27":4,"28":2,"29":2,"31":1,"40":1,"44":1,"45":11,"46":1,"47":1,"48":2,"51":8,"52":3,"53":3,"65":1,"66":4,"77":4,"78":1,"79":1,"80":1,"86":1,"103":1,"104":1,"108":1,"111":1,"112":1,"116":1,"122":1,"129":1,"131":1,"134":1,"142":1}}],["trunk",{"2":{"153":2}}],["truncates",{"2":{"137":1}}],["truncatelog",{"0":{"137":1},"2":{"137":1}}],["true",{"2":{"15":1,"31":1,"38":4,"47":1,"66":1,"72":1,"74":1}}],["try",{"2":{"77":1}}],["tree",{"2":{"72":1}}],["treated",{"2":{"36":1,"37":1}}],["tries",{"2":{"79":1}}],["trim",{"2":{"31":1}}],["triggered",{"2":{"20":1}}],["traversable",{"2":{"72":3,"128":7}}],["travis",{"2":{"40":1}}],["transformed",{"2":{"36":1}}],["traits",{"2":{"20":2,"65":1}}],["trait",{"0":{"25":1},"2":{"20":3,"25":2,"26":2,"27":1,"29":2,"55":1,"103":1}}],["track",{"2":{"15":1}}],["tmpfile",{"0":{"122":1},"2":{"15":1}}],["tmp",{"2":{"15":1,"66":1,"77":1,"125":1,"127":2}}],["tmpdir",{"0":{"131":1},"2":{"13":3,"116":1,"131":1}}],["two",{"2":{"15":1,"19":1,"22":2,"41":1,"48":1,"106":1}}],["templateconfig",{"2":{"72":1}}],["templates",{"2":{"72":1}}],["temporary",{"0":{"12":1,"13":1,"14":1,"15":1},"1":{"13":1,"14":1,"15":1},"2":{"12":4,"13":14,"14":1,"15":13,"122":2,"131":3,"132":3}}],["team",{"2":{"68":1}}],["terminated",{"2":{"151":1,"152":1,"153":1}}],["terminates",{"2":{"13":1,"14":1,"15":2}}],["terminal",{"2":{"59":1}}],["textfromfile",{"2":{"122":1,"123":1}}],["textforclass",{"2":{"103":1}}],["text",{"2":{"41":2,"55":1,"102":1,"103":3,"122":5,"123":5}}],["testacceptance",{"2":{"66":1}}],["testyesisassumed",{"2":{"29":1}}],["testcase",{"2":{"29":1}}],["tests",{"2":{"29":3,"40":1,"45":4,"61":1,"66":1,"82":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["testing",{"0":{"29":1,"144":1},"1":{"145":1,"146":1,"147":1,"148":1,"149":1},"2":{"59":1,"70":1}}],["test",{"2":{"21":1,"29":1,"45":1,"59":5,"66":4,"77":3,"113":1,"116":2,"145":4,"147":1,"148":4}}],["thus",{"2":{"50":1}}],["than",{"2":{"48":1,"54":1,"126":1}}],["that",{"0":{"28":1},"2":{"7":1,"8":1,"9":2,"10":1,"12":1,"13":7,"15":2,"16":1,"17":4,"18":3,"19":2,"20":4,"21":2,"24":1,"25":2,"26":2,"27":1,"29":2,"31":2,"32":1,"34":3,"36":1,"38":7,"42":1,"43":1,"45":4,"47":2,"48":2,"50":1,"51":1,"52":1,"53":2,"54":1,"56":1,"59":3,"65":1,"74":1,"77":2,"103":3,"104":1,"122":1,"129":1,"131":4,"132":3,"151":1,"152":1,"153":1}}],["third",{"2":{"86":1}}],["thing",{"2":{"13":1}}],["this",{"2":{"0":1,"8":3,"10":1,"13":4,"15":2,"16":1,"18":1,"19":3,"20":1,"21":2,"23":1,"25":1,"27":1,"29":1,"31":3,"32":1,"33":1,"34":1,"36":2,"37":1,"45":8,"48":1,"50":1,"54":3,"55":1,"56":1,"59":2,"66":2,"74":1,"77":3,"78":1,"79":1,"80":1,"103":2,"122":2,"131":2,"142":2}}],["thrown",{"2":{"13":1}}],["throw",{"2":{"10":1}}],["through",{"0":{"40":1},"2":{"0":1,"27":1,"55":1,"86":1}}],["three",{"2":{"0":1}}],["therefore",{"2":{"36":1,"74":1}}],["there",{"2":{"15":1,"18":1,"26":1,"30":1,"35":1,"47":1,"55":1,"66":1,"78":1,"80":1,"132":1}}],["they",{"2":{"13":1,"14":5,"43":1,"46":1,"56":1}}],["theme",{"2":{"79":1,"120":1}}],["themselves",{"2":{"21":1}}],["them",{"2":{"7":1,"12":1,"19":1,"22":1,"33":1,"36":1,"66":1,"67":1,"78":1,"80":1,"129":2}}],["these",{"2":{"6":1,"7":1,"15":1,"17":1,"20":1,"21":1,"25":1,"26":1,"42":1,"46":1}}],["then",{"2":{"0":1,"9":1,"10":1,"13":3,"14":1,"15":1,"17":1,"18":2,"19":2,"20":1,"21":2,"26":2,"28":1,"31":1,"32":1,"33":3,"37":1,"43":1,"45":2,"48":1,"49":1,"50":2,"51":2,"53":1,"56":1,"59":1,"129":3,"132":1,"147":1}}],["the",{"0":{"15":1,"25":1},"2":{"0":11,"6":9,"7":4,"8":4,"9":4,"10":3,"12":3,"13":35,"14":1,"15":13,"16":3,"17":11,"18":22,"19":6,"20":10,"21":8,"22":2,"23":1,"24":4,"25":11,"26":11,"27":4,"28":2,"29":6,"30":3,"31":20,"32":13,"33":5,"34":12,"36":7,"37":1,"38":22,"39":13,"40":4,"41":6,"42":1,"43":6,"45":21,"46":2,"48":15,"49":16,"50":10,"51":13,"52":4,"53":7,"54":3,"55":5,"56":4,"58":1,"59":13,"60":2,"66":2,"72":4,"74":11,"75":7,"77":22,"78":4,"79":4,"80":6,"82":4,"83":2,"84":1,"85":1,"86":4,"88":4,"89":4,"91":4,"92":5,"93":4,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"102":2,"103":4,"104":1,"105":1,"106":2,"107":1,"108":4,"111":4,"112":5,"113":4,"114":4,"115":4,"116":4,"117":4,"118":4,"120":2,"121":1,"122":11,"123":9,"125":1,"126":3,"127":1,"128":1,"129":28,"130":1,"131":7,"132":8,"134":4,"136":1,"137":1,"139":4,"140":4,"142":5,"143":7,"145":8,"146":4,"147":4,"148":5,"149":4,"151":2,"152":2,"153":2}}],["their",{"2":{"0":1,"8":1,"13":1,"14":1,"22":1,"34":1,"46":1,"59":1,"103":1}}],["tohost",{"2":{"142":1}}],["touser",{"2":{"142":1}}],["touch",{"2":{"128":2}}],["tostring",{"2":{"79":1,"109":1}}],["topath",{"2":{"142":1}}],["top",{"2":{"74":2,"129":3}}],["topmost",{"2":{"74":1}}],["todo",{"2":{"72":1}}],["tools",{"2":{"60":1}}],["tool",{"2":{"59":1}}],["together",{"2":{"17":2,"32":1,"45":1,"143":1}}],["to",{"0":{"58":1},"2":{"0":6,"1":1,"6":4,"7":2,"8":5,"9":2,"10":1,"11":1,"13":12,"14":1,"15":4,"16":3,"17":1,"18":9,"19":8,"20":8,"21":4,"25":2,"26":5,"27":3,"28":4,"29":9,"30":2,"31":13,"32":9,"33":5,"34":13,"35":2,"36":3,"37":2,"38":3,"39":6,"40":2,"41":4,"42":2,"43":6,"45":9,"46":1,"47":1,"48":6,"49":5,"50":5,"51":2,"52":4,"53":3,"54":4,"55":2,"56":2,"58":7,"59":7,"60":1,"63":1,"64":1,"66":5,"68":1,"72":8,"74":5,"75":4,"77":4,"78":1,"79":3,"80":1,"82":7,"83":1,"86":3,"88":12,"89":12,"91":17,"92":17,"93":17,"94":20,"95":17,"96":20,"97":16,"98":18,"99":20,"100":17,"102":2,"103":13,"105":1,"108":7,"109":1,"111":8,"112":8,"113":7,"114":7,"115":7,"116":9,"117":7,"118":7,"120":1,"121":5,"122":2,"123":3,"126":1,"129":8,"130":1,"131":4,"132":4,"134":10,"139":9,"140":9,"142":8,"143":9,"145":13,"146":7,"147":9,"148":9,"149":7,"151":3,"152":3,"153":3}}],["escaped",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["everything",{"2":{"131":1,"151":1}}],["everyone",{"2":{"50":1}}],["events",{"2":{"86":1}}],["event",{"2":{"33":1,"86":4}}],["even",{"2":{"10":1,"54":1,"143":1}}],["effect",{"2":{"49":1}}],["equal",{"2":{"48":1}}],["either",{"2":{"45":1,"142":2}}],["eg",{"2":{"39":2}}],["empty",{"2":{"34":1,"35":1,"38":1}}],["embedded",{"2":{"21":1}}],["elseif",{"2":{"31":1}}],["else",{"2":{"31":2}}],["eligible",{"2":{"7":1}}],["e",{"2":{"19":2,"31":1,"40":1,"48":1,"59":1}}],["enclosed",{"2":{"122":1,"123":1}}],["enclosing",{"2":{"75":1}}],["encrypt",{"2":{"17":2}}],["encrypts",{"2":{"17":1}}],["entire",{"2":{"75":1}}],["ensure",{"2":{"34":1,"45":1,"59":1}}],["ensures",{"2":{"25":1}}],["enablebuildkit",{"2":{"111":1}}],["enablerepository",{"2":{"92":1}}],["enable",{"2":{"31":1}}],["environment",{"2":{"49":3}}],["environments",{"2":{"19":1}}],["env",{"2":{"31":1,"44":2,"113":1}}],["end",{"2":{"22":1,"66":1,"103":1,"122":2,"123":2,"131":1}}],["enough",{"2":{"8":1,"13":1}}],["each",{"2":{"16":2,"20":2,"26":1,"38":1,"45":1,"46":1,"48":1,"50":1,"51":2,"84":1,"103":1}}],["easiest",{"2":{"29":1}}],["easier",{"2":{"0":1}}],["easily",{"2":{"12":1,"13":1}}],["easy",{"2":{"0":1,"15":1}}],["edit",{"2":{"13":2}}],["exits",{"2":{"131":1}}],["exit",{"2":{"31":1,"33":1,"45":2}}],["existing",{"2":{"20":1,"104":1}}],["exists",{"2":{"13":2,"31":2,"49":1,"75":1}}],["exist",{"2":{"8":1,"49":1,"126":1,"129":1}}],["excludegroup",{"2":{"147":1,"148":1}}],["excludefrom",{"2":{"142":1}}],["excludes",{"2":{"142":1}}],["excludevcs",{"2":{"142":1}}],["excluded",{"2":{"75":2}}],["exclude",{"2":{"72":1,"75":1,"126":2,"142":1}}],["exclusively",{"2":{"27":1}}],["except",{"2":{"14":1,"18":1,"45":1}}],["exception",{"2":{"10":2}}],["extracting",{"2":{"74":1}}],["extracted",{"2":{"74":2}}],["extracts",{"2":{"74":1}}],["extract",{"0":{"74":1},"2":{"74":1}}],["extrapolated",{"2":{"51":2}}],["extra",{"2":{"22":2,"77":1}}],["external",{"2":{"21":1,"59":2}}],["extension",{"0":{"23":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1},"2":{"20":2,"21":2,"23":1,"77":3}}],["extensions",{"0":{"29":1},"2":{"20":1,"23":1,"24":1,"26":1,"32":1,"36":1,"72":1}}],["extend",{"2":{"21":1,"26":1,"34":1}}],["extending",{"0":{"20":1},"1":{"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1},"2":{"31":1,"43":1,"69":1,"78":1,"80":1}}],["extends",{"2":{"6":1,"13":2,"21":1,"22":1,"26":1,"29":1,"35":2,"36":1,"48":1,"52":1,"66":3}}],["expression",{"2":{"122":1,"123":1}}],["export",{"2":{"34":1,"49":1}}],["exposed",{"2":{"22":1}}],["expose",{"2":{"22":1}}],["explicitly",{"0":{"18":1},"2":{"10":1,"17":1}}],["explains",{"2":{"7":1}}],["explained",{"2":{"6":1,"17":1,"26":2,"28":1}}],["exacatly",{"2":{"122":1}}],["exactly",{"2":{"10":1,"14":1,"18":1}}],["example",{"2":{"6":1,"8":2,"13":3,"15":2,"17":1,"18":5,"21":1,"22":2,"24":1,"26":3,"29":1,"34":3,"36":1,"37":1,"38":1,"41":1,"44":1,"45":2,"48":1,"49":1,"50":2,"51":2,"52":1,"53":1,"59":1,"60":1,"66":2,"129":2,"131":1,"142":1,"143":2}}],["examples",{"0":{"66":1},"2":{"1":1,"26":1,"66":1}}],["execstack",{"0":{"83":1}}],["exectask",{"2":{"40":1}}],["executables",{"2":{"77":1}}],["executable",{"2":{"72":6,"82":6,"83":1,"88":6,"89":6,"91":6,"92":6,"93":6,"94":6,"95":6,"96":6,"97":6,"98":6,"99":6,"100":6,"107":1,"108":6,"111":6,"112":6,"113":6,"114":6,"115":6,"116":6,"117":6,"118":6,"134":6,"139":6,"140":6,"142":6,"143":6,"145":6,"146":6,"147":6,"148":6,"149":6,"151":1,"152":1,"153":1}}],["executing",{"2":{"61":1}}],["execution",{"2":{"0":1,"6":1,"9":1,"18":1,"20":1,"45":1,"46":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"134":1,"139":1,"140":1}}],["execute",{"2":{"31":1,"39":1,"46":1,"64":1,"66":2,"77":1,"83":1,"108":1,"116":1}}],["executes",{"2":{"19":2,"43":1,"46":1,"72":1,"82":1,"85":1,"113":1,"142":1,"146":1,"147":1,"149":1,"151":8,"152":6,"153":3}}],["executed",{"2":{"9":2,"38":1,"44":1,"45":1,"65":1,"66":3,"128":1}}],["exec",{"0":{"82":1,"113":1},"2":{"6":1,"18":1,"44":1,"45":3,"58":2,"82":1,"83":1,"107":1,"113":1,"116":1,"143":2,"151":1,"152":1,"153":1}}],["errors",{"2":{"0":1,"10":1,"13":1,"34":1}}],["error",{"2":{"0":1,"9":1,"13":1,"45":3,"128":2,"131":1,"132":1}}],["rsync",{"0":{"142":1},"2":{"142":3}}],["raw",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":2,"148":1,"149":1}}],["rawarg",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["ran",{"2":{"59":1}}],["random",{"2":{"14":1,"122":1}}],["retrieve",{"2":{"116":1}}],["returned",{"2":{"16":1,"18":1,"19":1,"48":1}}],["return",{"2":{"6":1,"13":2,"15":1,"19":1,"25":2,"26":4,"29":1,"31":1,"32":1,"33":1,"45":9,"48":3,"56":1,"79":1,"102":1,"103":5,"109":1,"111":1,"113":1,"116":4,"122":3,"123":3,"142":15,"143":3,"146":4,"147":3,"148":1,"149":2}}],["returns",{"2":{"0":1,"13":1,"45":1}}],["reorderproperties",{"2":{"103":1}}],["reordermethods",{"2":{"103":1}}],["reorder",{"2":{"103":3}}],["recursive",{"2":{"142":1}}],["recent",{"2":{"102":1}}],["recompress",{"2":{"77":1}}],["recommended",{"2":{"13":1,"19":1,"25":1,"27":1,"33":1,"45":1}}],["recover",{"2":{"43":1}}],["recovery",{"2":{"0":1,"13":1}}],["reqs",{"2":{"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1}}],["requests",{"2":{"67":1}}],["request",{"2":{"29":1}}],["requirements",{"2":{"91":1}}],["requires",{"2":{"37":1}}],["require",{"2":{"21":4,"24":2,"31":3,"44":1,"58":1,"59":4,"64":1,"79":2,"95":1,"98":2}}],["requiredependency",{"0":{"98":1}}],["required",{"2":{"15":1,"24":1,"37":1,"38":2,"77":1}}],["regular",{"2":{"122":1,"123":1}}],["regexreplace",{"2":{"122":1,"123":1}}],["regexp",{"2":{"121":1}}],["regex",{"2":{"75":3,"121":2}}],["register",{"0":{"22":1}}],["released",{"2":{"102":1}}],["release",{"2":{"74":1,"105":1}}],["relative",{"2":{"22":1,"58":1,"129":2}}],["relationship",{"2":{"18":1}}],["representation",{"2":{"41":2}}],["repeat",{"2":{"34":1}}],["replacement",{"2":{"121":1}}],["replaced",{"2":{"51":1,"121":3}}],["replace",{"0":{"121":1},"2":{"33":2,"34":1,"59":1,"121":1,"122":3,"123":3}}],["repos",{"2":{"153":2}}],["repository",{"2":{"31":1,"33":2,"77":1,"92":2,"93":1,"95":1}}],["repo",{"2":{"105":1}}],["reporter",{"2":{"145":2}}],["report",{"2":{"0":1,"72":1,"147":5}}],["re",{"2":{"31":1}}],["remoteshell",{"2":{"142":1}}],["remote",{"0":{"141":1},"1":{"142":1,"143":1},"2":{"53":2,"70":1,"143":4}}],["remotedir",{"2":{"53":3,"143":2}}],["removerepository",{"2":{"92":1}}],["remove",{"0":{"97":1,"115":1},"2":{"13":1,"51":1,"74":1,"97":1,"115":1,"128":1}}],["removed",{"2":{"13":1,"51":1}}],["remain",{"2":{"25":1}}],["read",{"2":{"50":1}}],["readme",{"2":{"13":2,"40":1,"75":2,"121":1,"129":2}}],["reason",{"2":{"19":1}}],["resource",{"2":{"72":1,"82":1,"83":1,"86":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1,"151":1,"152":1,"153":1}}],["respectively",{"2":{"59":1}}],["reside",{"2":{"27":1}}],["resultdata",{"2":{"45":3}}],["resulting",{"2":{"32":1,"129":2}}],["results",{"2":{"17":1,"19":1,"45":1,"147":2}}],["result",{"0":{"45":1},"2":{"16":2,"17":1,"18":1,"19":2,"31":1,"34":1,"45":16,"48":2,"83":1,"112":1,"116":1,"145":2,"151":1,"152":1,"153":1}}],["restore",{"2":{"0":1}}],["renames",{"2":{"13":1}}],["renamed",{"2":{"13":1,"20":1,"132":1}}],["rename",{"2":{"13":2,"128":1}}],["reflectionclass",{"2":{"103":2}}],["reflectionmethod",{"2":{"103":3}}],["ref",{"2":{"6":1}}],["references",{"2":{"32":1}}],["reference",{"2":{"1":1,"45":1,"131":1,"132":1}}],["rev",{"2":{"6":1}}],["rotates",{"2":{"136":1}}],["rotatelog",{"0":{"136":1},"2":{"136":1}}],["root",{"2":{"31":1,"39":1,"75":1,"88":1,"89":1,"116":1}}],["roles",{"2":{"13":1}}],["rolls",{"2":{"13":1,"122":1}}],["rollbackinterface",{"2":{"10":1}}],["rollbacks",{"0":{"7":1},"1":{"8":1,"9":1,"10":1,"11":1},"2":{"7":1,"9":1,"10":2}}],["rollback",{"0":{"9":1,"10":1,"11":1},"2":{"0":1,"6":1,"9":3,"10":2,"11":1,"43":1,"45":1,"131":1,"132":2}}],["roborunner",{"2":{"33":2}}],["robofiles",{"0":{"32":1},"2":{"20":2,"53":1}}],["robofile",{"0":{"39":1,"58":1},"2":{"6":2,"13":2,"20":2,"21":2,"26":1,"31":5,"35":4,"36":3,"39":5,"40":1,"41":1,"42":1,"45":1,"52":1,"53":1,"54":2,"59":2,"65":1,"66":6}}],["robo",{"0":{"23":1,"30":1,"31":1,"33":1,"59":1,"60":1,"69":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"31":1,"32":1,"33":1,"34":1,"70":1},"2":{"0":3,"6":2,"7":1,"9":1,"10":3,"12":1,"13":3,"14":1,"15":3,"16":1,"17":1,"20":9,"21":7,"22":10,"23":3,"24":7,"25":1,"26":4,"27":2,"29":12,"30":1,"31":13,"32":3,"33":13,"34":4,"35":6,"36":8,"37":3,"38":3,"39":2,"40":5,"41":2,"42":1,"43":2,"45":9,"48":1,"49":10,"50":2,"51":1,"52":4,"53":3,"54":4,"55":3,"58":8,"59":11,"60":3,"63":11,"64":3,"65":1,"66":13,"67":1,"68":1,"69":1,"84":1,"104":1,"105":1,"111":1,"113":1,"116":2,"121":2}}],["runtests",{"2":{"113":1}}],["runs",{"2":{"86":1,"108":1,"143":1,"145":1,"148":1,"151":1,"152":1,"153":1}}],["runner",{"2":{"24":1,"31":3,"32":2,"33":3,"148":1}}],["running",{"2":{"15":1,"17":1,"28":1,"31":2,"40":1,"48":2,"59":1,"61":1,"65":1,"66":4,"82":1,"113":1,"116":1,"143":1}}],["run",{"0":{"116":1,"134":1},"2":{"0":5,"6":5,"7":2,"8":1,"10":1,"13":1,"16":1,"18":2,"20":1,"26":3,"31":2,"33":1,"35":1,"36":2,"38":1,"39":1,"45":1,"48":2,"50":1,"58":1,"59":1,"64":1,"66":4,"77":1,"85":2,"108":2,"116":1,"134":2,"142":2,"145":2,"148":1}}],["mv",{"2":{"63":2}}],["min",{"2":{"129":9}}],["minimisation",{"2":{"79":3}}],["minify",{"0":{"79":1}}],["minifiers",{"2":{"77":3}}],["minifier",{"2":{"77":5}}],["minifies",{"2":{"77":1,"79":1}}],["minification",{"2":{"61":1,"77":1}}],["mirrors",{"2":{"130":1}}],["mirrordir",{"0":{"130":1},"2":{"130":1}}],["mirror",{"2":{"128":1}}],["migrations",{"2":{"86":1}}],["might",{"2":{"19":1,"21":1,"32":2,"34":1,"54":1,"59":1}}],["mixed",{"2":{"72":1}}],["much",{"2":{"74":1,"129":1}}],["multi",{"2":{"44":1,"45":1}}],["multiple",{"0":{"32":1},"2":{"13":1,"30":1,"37":1,"38":1,"72":2,"82":2,"88":2,"89":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":2,"98":2,"99":2,"100":2,"108":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"134":2,"139":2,"140":2,"142":2,"143":3,"145":2,"146":2,"147":3,"148":2,"149":2}}],["must",{"2":{"20":2,"21":1,"22":2,"25":2,"26":2,"38":2,"45":1,"122":1,"123":1}}],["monitor",{"2":{"86":2}}],["move",{"2":{"51":1,"132":1}}],["modify",{"2":{"86":1}}],["modifications",{"2":{"19":1}}],["model",{"2":{"103":6}}],["models",{"2":{"103":2}}],["modelgeneratorcommand",{"2":{"85":1}}],["mode",{"2":{"31":1,"38":1,"82":1,"145":1}}],["moment",{"2":{"21":1}}],["more",{"0":{"67":1},"2":{"18":3,"19":2,"22":1,"31":1,"32":2,"34":1,"43":1,"45":1,"51":1,"54":1,"122":1,"123":1,"129":1}}],["most",{"2":{"13":1}}],["mkdir",{"2":{"18":2,"83":1,"128":2}}],["mkdocs",{"2":{"6":1,"8":1}}],["m",{"2":{"13":2,"122":1,"123":1}}],["md",{"2":{"6":3,"8":4,"13":2,"40":2,"75":1,"102":1,"103":2,"121":1,"123":1,"129":2}}],["mysql",{"2":{"116":4}}],["mysite2",{"2":{"106":1}}],["mysite",{"2":{"106":1}}],["mybar",{"2":{"93":1}}],["mytask",{"2":{"48":1}}],["mytaskfunction",{"2":{"3":1}}],["myapplication",{"2":{"33":2}}],["myappname",{"2":{"31":1}}],["myassettasks",{"2":{"26":3}}],["myorg",{"2":{"31":2,"51":1,"59":1}}],["myoperation",{"2":{"13":2,"51":3,"52":1}}],["my",{"2":{"22":5,"33":2,"39":1,"51":2,"88":1,"89":1,"94":3,"96":2,"99":2,"112":2,"116":2,"139":1,"140":1}}],["mycustomservice",{"2":{"33":1}}],["mycustomcommands",{"2":{"22":1}}],["mycommand",{"2":{"58":2}}],["mycompletion",{"2":{"11":1}}],["myconf",{"2":{"33":1,"34":1,"54":1}}],["myconfig",{"2":{"31":1}}],["myproject",{"2":{"21":1,"22":2,"31":5,"32":4,"35":1,"58":1,"59":2}}],["myrollback",{"2":{"11":1}}],["mymethod",{"2":{"5":1}}],["match",{"2":{"121":1}}],["matching",{"2":{"32":1}}],["markdown",{"2":{"103":3}}],["maintain",{"2":{"109":1}}],["maintains",{"2":{"15":1}}],["mainprojectnameprefix",{"2":{"72":1}}],["main",{"2":{"33":1}}],["manner",{"2":{"142":1}}],["manipulated",{"2":{"122":1}}],["manually",{"2":{"59":1}}],["many",{"2":{"26":2,"32":1,"121":1}}],["managed",{"2":{"15":1}}],["manage",{"2":{"6":1,"102":1}}],["makes",{"2":{"55":1}}],["make",{"2":{"18":1,"43":1}}],["making",{"2":{"0":1,"45":1}}],["master",{"2":{"6":1,"106":1,"143":1,"151":1}}],["made",{"2":{"1":1,"16":1}}],["may",{"2":{"0":1,"10":2,"11":1,"13":1,"14":1,"17":3,"18":2,"21":3,"24":1,"33":1,"34":4,"35":1,"36":1,"38":3,"41":1,"44":1,"45":6,"48":1,"49":1,"50":2,"51":1,"52":2,"53":1,"56":1,"58":1,"66":1,"74":1,"77":1,"122":1,"147":3}}],["merge",{"2":{"151":2,"152":2}}],["merges",{"2":{"120":1}}],["metadata",{"2":{"109":1}}],["methods",{"0":{"5":1,"10":1,"42":1},"2":{"6":1,"11":1,"17":1,"26":1,"27":2,"29":1,"36":4,"42":1,"46":1,"51":1,"55":2,"59":1,"65":2,"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"103":5,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["method",{"2":{"0":2,"1":3,"6":1,"10":1,"13":3,"15":2,"16":1,"18":6,"20":3,"26":1,"27":1,"28":1,"29":1,"31":1,"34":1,"36":1,"37":1,"38":1,"42":1,"45":2,"46":1,"47":1,"48":2,"50":1,"52":1,"53":1,"55":2,"78":2,"80":2,"95":1,"98":1,"103":5,"105":1,"129":3}}],["message",{"2":{"16":1,"18":1,"45":3,"151":1,"152":1,"153":1}}],["means",{"2":{"0":1}}],["amp",{"2":{"143":4}}],["awesome",{"2":{"68":1}}],["author",{"2":{"95":1}}],["auto",{"2":{"94":1}}],["autocomplete",{"2":{"72":1}}],["automate",{"0":{"61":1}}],["automatically",{"2":{"13":2,"15":1,"18":1,"31":1,"48":1,"51":1,"59":1,"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"122":1,"131":1,"132":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["autoloader",{"2":{"31":2,"91":1,"92":1,"93":1,"94":3,"95":1,"96":2,"97":1,"98":1,"99":2,"100":1}}],["autoload",{"2":{"22":1,"24":2,"31":8,"94":1}}],["autoloading",{"0":{"22":1}}],["aux",{"2":{"44":1}}],["actual",{"2":{"43":1}}],["achieved",{"2":{"49":1}}],["achieve",{"2":{"31":1}}],["accomplish",{"2":{"43":1}}],["accomplishing",{"2":{"13":1}}],["acceptance",{"2":{"66":5,"85":1,"113":1,"147":1}}],["accept",{"2":{"37":1}}],["accepts",{"2":{"17":1}}],["accesstoken",{"2":{"105":1}}],["accesslevels",{"2":{"72":1}}],["accessing",{"0":{"52":1}}],["accessed",{"2":{"45":1,"52":1}}],["accessors",{"2":{"42":1}}],["access",{"2":{"22":1,"27":1,"28":2,"36":1,"52":1,"74":1}}],["admin",{"2":{"147":1}}],["advpng",{"2":{"77":1}}],["advanceprogressindicator",{"2":{"48":1}}],["advanced",{"0":{"33":1}}],["advertising",{"2":{"23":1,"59":1}}],["adddir",{"2":{"75":1}}],["addfiles",{"2":{"107":1}}],["addfile",{"2":{"75":2,"107":1}}],["add",{"2":{"19":1,"20":1,"24":1,"31":3,"32":1,"33":2,"34":1,"43":1,"48":1,"58":2,"59":1,"75":4,"105":2,"122":4,"123":4,"151":3,"152":3,"153":3}}],["addasrollback",{"2":{"10":1}}],["addascompletion",{"2":{"10":1}}],["addimportpath",{"2":{"78":1,"80":1}}],["additional",{"0":{"21":1},"2":{"13":1,"20":2,"21":1,"24":1,"26":1,"39":1,"48":1,"59":1,"78":1,"79":1,"80":1,"129":1}}],["addition",{"2":{"9":1,"54":1,"55":1}}],["adding",{"0":{"58":1},"2":{"1":1,"49":1,"78":1,"80":1,"151":1}}],["addstripped",{"2":{"107":1}}],["adds",{"2":{"6":1,"36":1,"78":1,"80":1,"88":4,"89":4,"91":10,"92":10,"93":10,"94":10,"95":10,"96":11,"97":9,"98":11,"99":11,"100":10,"134":3,"139":1,"140":1,"148":2}}],["added",{"2":{"0":1,"6":1,"7":1,"8":3,"13":2,"14":1,"15":1,"19":1,"20":1,"21":2,"41":1,"66":1}}],["avoid",{"2":{"56":1}}],["avoided",{"2":{"19":1}}],["available",{"2":{"16":1,"18":1,"21":1,"22":1,"31":1,"36":1,"45":1,"55":1,"66":1}}],["appended",{"2":{"129":2}}],["appendunlessmatches",{"2":{"122":1,"123":1}}],["appendifmatches",{"2":{"122":1,"123":1}}],["appenddescription",{"2":{"105":1}}],["append",{"2":{"103":1,"122":3,"123":3,"129":1}}],["appear",{"2":{"38":1,"51":1}}],["appears",{"2":{"38":1}}],["app",{"2":{"66":4,"125":1,"142":2}}],["appropriate",{"2":{"20":1,"26":1,"31":1,"48":1}}],["applicaton",{"2":{"33":1}}],["application",{"0":{"32":1},"2":{"20":1,"30":1,"31":2,"32":1,"33":7,"48":1,"54":1,"59":3,"103":1}}],["apply",{"2":{"19":1,"45":1}}],["apigen",{"0":{"71":1,"72":1},"1":{"72":1},"2":{"70":1,"72":7}}],["api",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1},"2":{"14":1}}],["atoum",{"0":{"145":1},"2":{"145":2}}],["attach",{"2":{"45":1}}],["attached",{"2":{"15":1}}],["attempt",{"2":{"13":1,"48":1}}],["at",{"2":{"9":1,"13":1,"21":1,"49":1,"75":1,"103":2,"131":1,"142":1}}],["about",{"2":{"32":1,"75":1}}],["aborttasksexception",{"2":{"10":1}}],["abort",{"2":{"10":1}}],["aborted",{"2":{"0":1}}],["above",{"2":{"6":1,"8":1,"13":2,"26":1,"31":1,"32":2,"33":1,"34":2,"40":1,"48":1,"49":1,"52":1,"59":1,"129":1}}],["abbrev",{"2":{"6":1}}],["anchor",{"2":{"102":1}}],["angst",{"2":{"75":1}}],["ansi",{"2":{"59":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3}}],["annotation",{"2":{"42":1}}],["annotations",{"2":{"41":1}}],["annotated",{"2":{"32":1,"41":1}}],["annotatedcommand",{"2":{"32":1}}],["anyone",{"2":{"75":1}}],["anything",{"2":{"39":1}}],["any",{"2":{"10":1,"13":1,"15":1,"19":2,"21":1,"24":1,"27":1,"31":1,"34":2,"36":1,"40":1,"42":1,"45":2,"49":1,"50":1,"51":1,"52":1,"77":1,"122":2,"123":2,"136":1,"137":1,"142":1}}],["another",{"0":{"54":1},"2":{"8":1,"16":1,"17":1,"18":1,"39":1,"45":1,"126":1,"130":1}}],["an",{"2":{"6":1,"8":1,"9":1,"13":1,"14":1,"18":1,"23":1,"26":1,"29":1,"31":1,"37":1,"38":3,"41":1,"45":3,"46":1,"48":3,"49":1,"56":1,"60":1,"72":3,"74":1,"75":1,"79":1,"82":3,"83":1,"88":3,"89":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"104":1,"108":3,"111":3,"112":4,"113":3,"114":4,"115":3,"116":3,"117":3,"118":3,"129":1,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":3,"149":3,"151":1,"152":1,"153":1}}],["and",{"0":{"7":1,"10":1,"11":1},"1":{"8":1,"9":1,"10":1,"11":1},"2":{"0":4,"1":2,"6":1,"7":1,"9":1,"10":1,"12":1,"13":6,"14":1,"15":2,"16":2,"17":3,"18":2,"19":2,"20":2,"22":1,"24":2,"25":1,"26":4,"27":2,"28":1,"29":2,"30":2,"31":3,"33":2,"34":3,"36":4,"38":2,"41":1,"43":2,"45":6,"46":1,"48":1,"49":3,"50":3,"51":3,"55":1,"56":3,"58":1,"59":6,"60":1,"61":1,"65":2,"66":6,"67":1,"68":1,"74":1,"75":1,"77":1,"78":2,"80":2,"84":1,"94":1,"103":3,"108":1,"121":1,"128":1,"129":3,"142":2,"143":1,"147":1}}],["around",{"2":{"104":1}}],["artisan",{"2":{"85":1}}],["article",{"2":{"23":1}}],["archinve",{"2":{"75":1}}],["archivefile",{"2":{"75":1}}],["archivefile>",{"2":{"75":1}}],["archives",{"2":{"74":1}}],["archive",{"0":{"73":1},"1":{"74":1,"75":1},"2":{"66":1,"70":1,"74":1,"75":6,"142":1}}],["arbitrarily",{"2":{"74":1}}],["arbitrary",{"2":{"11":1,"18":1}}],["arg",{"2":{"72":1,"82":1,"85":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["args",{"2":{"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["argument",{"2":{"37":2,"66":2,"72":3,"82":3,"88":3,"89":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"108":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":3,"149":3}}],["arguments",{"0":{"37":1,"40":1},"2":{"22":1,"36":1,"37":3,"40":2,"41":2,"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["argvinput",{"2":{"33":1}}],["array|string",{"2":{"72":6,"109":1,"142":3}}],["array|string|",{"2":{"72":3}}],["array",{"2":{"1":1,"34":2,"37":2,"38":2,"40":1,"41":1,"45":3,"56":1,"72":3,"75":1,"77":2,"78":3,"80":2,"82":3,"88":3,"89":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":3,"102":3,"105":1,"108":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"121":2,"122":1,"123":1,"128":1,"129":1,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":3,"149":3}}],["are",{"2":{"0":1,"1":2,"6":3,"7":1,"9":1,"12":2,"13":4,"14":5,"15":4,"20":1,"23":1,"26":1,"29":1,"30":2,"33":2,"37":1,"38":1,"41":1,"42":1,"45":1,"46":1,"55":1,"59":1,"65":2,"66":2,"72":1,"74":2,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"126":1,"128":1,"134":1,"139":1,"140":1,"142":1,"143":2,"145":1,"146":1,"147":1,"148":1,"149":1}}],["after",{"2":{"0":1,"6":1,"8":1,"9":2,"13":2,"18":1,"19":4,"40":1,"45":1,"46":1,"78":1,"80":1,"84":1}}],["alias",{"2":{"75":1}}],["alignment",{"2":{"25":1,"42":1}}],["alert",{"2":{"34":1}}],["always",{"2":{"24":1,"26":1,"129":1}}],["all",{"2":{"6":3,"7":1,"8":1,"9":2,"13":2,"18":1,"20":1,"21":1,"26":1,"27":1,"29":1,"32":1,"35":1,"36":2,"37":2,"40":3,"45":1,"49":1,"50":1,"55":2,"65":2,"74":2,"77":1,"86":2,"105":1,"125":1,"132":1,"143":1}}],["allowroot",{"2":{"88":1,"89":1}}],["allowedhtml",{"2":{"72":1}}],["allows",{"2":{"13":2,"27":1,"48":1,"55":1}}],["allow",{"2":{"6":1,"27":1,"34":1,"43":1,"52":1,"75":1,"88":1,"89":1}}],["alternatively",{"2":{"112":1,"113":1,"153":1}}],["alternatives",{"2":{"30":1}}],["alters",{"2":{"17":1}}],["alter",{"2":{"0":1,"26":1}}],["also",{"2":{"0":1,"6":1,"7":1,"9":1,"10":1,"11":1,"13":1,"14":1,"19":1,"29":1,"33":1,"34":1,"36":1,"43":1,"45":3,"46":1,"49":3,"50":1,"51":1,"54":1,"55":2,"59":2,"66":1,"77":1,"129":2,"142":1}}],["a",{"0":{"6":1,"23":1,"30":1,"31":1,"32":1,"34":1,"58":1,"60":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"31":1,"32":1,"33":1,"34":1},"2":{"0":4,"1":6,"6":5,"8":2,"9":1,"10":1,"12":1,"13":7,"14":2,"15":2,"16":4,"17":3,"18":3,"19":8,"20":4,"21":1,"22":1,"23":2,"24":1,"25":2,"26":2,"27":2,"28":4,"29":7,"30":2,"31":8,"32":3,"34":5,"35":2,"36":3,"37":2,"38":7,"39":2,"40":4,"41":2,"42":1,"44":2,"45":16,"46":2,"47":3,"48":2,"49":2,"50":1,"51":5,"52":1,"53":1,"54":2,"55":1,"59":5,"60":1,"66":2,"69":1,"72":1,"75":2,"77":1,"78":1,"80":1,"82":1,"86":1,"88":1,"89":1,"91":1,"92":2,"93":1,"94":1,"95":3,"96":1,"97":1,"98":3,"99":1,"100":1,"103":10,"104":2,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":2,"117":1,"118":1,"121":2,"122":8,"123":5,"129":6,"130":1,"131":2,"132":3,"134":1,"136":1,"137":1,"139":1,"140":1,"142":7,"143":2,"145":1,"146":1,"147":1,"148":1,"149":1,"151":2,"152":1,"153":1}}],["asked",{"2":{"102":1}}],["askhidden",{"2":{"55":1}}],["askdefault",{"2":{"55":1}}],["ask",{"2":{"27":1,"55":1}}],["associative",{"2":{"38":1,"72":1,"82":1,"88":1,"89":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"108":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"134":1,"139":1,"140":1,"142":1,"143":1,"145":1,"146":1,"147":1,"148":1,"149":1}}],["assumes",{"2":{"36":1}}],["asset",{"2":{"79":1,"129":8}}],["assets",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1},"2":{"26":1,"45":3,"55":1,"61":1,"66":2,"70":1,"77":5,"79":1,"80":1,"120":5,"129":8}}],["assert",{"2":{"29":1}}],["assign",{"2":{"0":1}}],["as",{"0":{"30":1,"60":1},"1":{"31":1,"32":1,"33":1,"34":1},"2":{"0":1,"1":1,"6":2,"8":1,"11":3,"13":3,"15":1,"17":2,"18":1,"19":1,"20":1,"21":1,"22":1,"24":1,"25":2,"26":4,"27":1,"28":1,"31":6,"32":3,"33":2,"36":5,"37":2,"38":1,"39":1,"40":3,"45":3,"47":1,"48":4,"50":1,"51":1,"52":2,"54":1,"55":1,"56":2,"59":2,"60":1,"65":1,"66":2,"67":1,"69":1,"72":3,"74":1,"77":1,"82":3,"88":3,"89":3,"91":4,"92":4,"93":3,"94":4,"95":4,"96":4,"97":4,"98":4,"99":4,"100":4,"107":2,"108":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":3,"117":3,"118":3,"121":1,"122":2,"125":1,"126":1,"127":1,"129":4,"131":1,"134":3,"139":3,"140":3,"142":3,"143":3,"145":3,"146":3,"147":3,"148":3,"149":3,"151":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/VPLocalSearchBox.DrZ8Nfg8.js b/assets/chunks/VPLocalSearchBox.DrZ8Nfg8.js new file mode 100644 index 0000000..d046c6f --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.DrZ8Nfg8.js @@ -0,0 +1,7 @@ +var Nt=Object.defineProperty;var Ft=(a,e,t)=>e in a?Nt(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Re=(a,e,t)=>Ft(a,typeof e!="symbol"?e+"":e,t);import{V as Ot,p as se,h as pe,ah as Xe,ai as Rt,aj as Ct,q as je,ak as Mt,d as At,D as ye,al as et,am as Lt,an as Dt,s as zt,ao as Pt,v as Ce,P as ue,O as we,ap as jt,aq as Vt,W as $t,R as Bt,$ as Wt,o as q,b as Kt,j as S,a0 as Jt,k as D,ar as Ut,as as qt,at as Gt,c as Y,n as tt,e as xe,C as st,F as nt,a as de,t as he,au as Ht,av as it,aw as Qt,a6 as Yt,ac as Zt,ax as Xt,_ as es}from"./framework.DptEmx5X.js";import{u as ts,c as ss}from"./theme.mcvFSWbF.js";const ns={root:()=>Ot(()=>import("./@localSearchIndexroot.BFE0kuj6.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var vt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Ie=vt.join(","),mt=typeof Element>"u",ie=mt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,ke=!mt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Ne=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},is=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},gt=function(e,t,s){if(Ne(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Ie));return t&&ie.call(e,Ie)&&n.unshift(e),n=n.filter(s),n},bt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!Ne(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=a(l,!0,s);s.flatten?n.push.apply(n,c):n.push({scopeParent:i,candidates:c})}else{var h=ie.call(i,Ie);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var v=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),p=!Ne(v,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(v&&p){var b=a(v===!0?i.children:v.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},yt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ne=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||is(e))&&!yt(e)?0:e.tabIndex},rs=function(e,t){var s=ne(e);return s<0&&t&&!yt(e)?0:s},as=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},os=function(e){return wt(e)&&e.type==="hidden"},ls=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},cs=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(ie.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var l=e.parentElement,c=ke(e);if(l&&!l.shadowRoot&&n(l)===!0)return rt(e);e.assignedSlot?e=e.assignedSlot:!l&&c!==e.ownerDocument?e=c.host:e=l}e=o}if(fs(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return rt(e);return!1},vs=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},gs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,l=rs(o,i),c=i?a(n.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):s.push({documentOrder:r,tabIndex:l,item:n,isScope:i,content:c})}),s.sort(as).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},bs=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:Ve.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:ms}):s=gt(e,t.includeContainer,Ve.bind(null,t)),gs(s)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=bt([e],t.includeContainer,{filter:Fe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=gt(e,t.includeContainer,Fe.bind(null,t)),s},re=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,Ie)===!1?!1:Ve(t,e)},ws=vt.concat("iframe").join(","),Me=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ie.call(e,ws)===!1?!1:Fe(t,e)};/*! +* focus-trap 7.6.0 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function xs(a,e,t){return(e=_s(e))in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function at(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(a);e&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(a,n).enumerable})),t.push.apply(t,s)}return t}function ot(a){for(var e=1;e0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Es=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Ts=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ve=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Is=function(e){return ve(e)&&!e.shiftKey},ks=function(e){return ve(e)&&e.shiftKey},ct=function(e){return setTimeout(e,0)},ut=function(e,t){var s=-1;return e.every(function(n,r){return t(n)?(s=r,!1):!0}),s},fe=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1?g-1:0),E=1;E=0)d=s.activeElement;else{var u=i.tabbableGroups[0],g=u&&u.firstTabbableNode;d=g||h("fallbackFocus")}if(!d)throw new Error("Your focus-trap needs to have at least one focusable element");return d},p=function(){if(i.containerGroups=i.containers.map(function(d){var u=bs(d,r.tabbableOptions),g=ys(d,r.tabbableOptions),_=u.length>0?u[0]:void 0,E=u.length>0?u[u.length-1]:void 0,N=g.find(function(f){return re(f)}),F=g.slice().reverse().find(function(f){return re(f)}),m=!!u.find(function(f){return ne(f)>0});return{container:d,tabbableNodes:u,focusableNodes:g,posTabIndexesFound:m,firstTabbableNode:_,lastTabbableNode:E,firstDomTabbableNode:N,lastDomTabbableNode:F,nextTabbableNode:function(T){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,C=u.indexOf(T);return C<0?A?g.slice(g.indexOf(T)+1).find(function(M){return re(M)}):g.slice(0,g.indexOf(T)).reverse().find(function(M){return re(M)}):u[C+(A?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(d){return d.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(d){return d.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(d){var u=d.activeElement;if(u)return u.shadowRoot&&u.shadowRoot.activeElement!==null?b(u.shadowRoot):u},y=function(d){if(d!==!1&&d!==b(document)){if(!d||!d.focus){y(v());return}d.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=d,Es(d)&&d.select()}},x=function(d){var u=h("setReturnFocus",d);return u||(u===!1?!1:d)},w=function(d){var u=d.target,g=d.event,_=d.isBackward,E=_===void 0?!1:_;u=u||Se(g),p();var N=null;if(i.tabbableGroups.length>0){var F=c(u,g),m=F>=0?i.containerGroups[F]:void 0;if(F<0)E?N=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:N=i.tabbableGroups[0].firstTabbableNode;else if(E){var f=ut(i.tabbableGroups,function(L){var j=L.firstTabbableNode;return u===j});if(f<0&&(m.container===u||Me(u,r.tabbableOptions)&&!re(u,r.tabbableOptions)&&!m.nextTabbableNode(u,!1))&&(f=F),f>=0){var T=f===0?i.tabbableGroups.length-1:f-1,A=i.tabbableGroups[T];N=ne(u)>=0?A.lastTabbableNode:A.lastDomTabbableNode}else ve(g)||(N=m.nextTabbableNode(u,!1))}else{var C=ut(i.tabbableGroups,function(L){var j=L.lastTabbableNode;return u===j});if(C<0&&(m.container===u||Me(u,r.tabbableOptions)&&!re(u,r.tabbableOptions)&&!m.nextTabbableNode(u))&&(C=F),C>=0){var M=C===i.tabbableGroups.length-1?0:C+1,I=i.tabbableGroups[M];N=ne(u)>=0?I.firstTabbableNode:I.firstDomTabbableNode}else ve(g)||(N=m.nextTabbableNode(u))}}else N=h("fallbackFocus");return N},O=function(d){var u=Se(d);if(!(c(u,d)>=0)){if(fe(r.clickOutsideDeactivates,d)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}fe(r.allowOutsideClick,d)||d.preventDefault()}},R=function(d){var u=Se(d),g=c(u,d)>=0;if(g||u instanceof Document)g&&(i.mostRecentlyFocusedNode=u);else{d.stopImmediatePropagation();var _,E=!0;if(i.mostRecentlyFocusedNode)if(ne(i.mostRecentlyFocusedNode)>0){var N=c(i.mostRecentlyFocusedNode),F=i.containerGroups[N].tabbableNodes;if(F.length>0){var m=F.findIndex(function(f){return f===i.mostRecentlyFocusedNode});m>=0&&(r.isKeyForward(i.recentNavEvent)?m+1=0&&(_=F[m-1],E=!1))}}else i.containerGroups.some(function(f){return f.tabbableNodes.some(function(T){return ne(T)>0})})||(E=!1);else E=!1;E&&(_=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(_||i.mostRecentlyFocusedNode||v())}i.recentNavEvent=void 0},K=function(d){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=d;var g=w({event:d,isBackward:u});g&&(ve(d)&&d.preventDefault(),y(g))},G=function(d){(r.isKeyForward(d)||r.isKeyBackward(d))&&K(d,r.isKeyBackward(d))},W=function(d){Ts(d)&&fe(r.escapeDeactivates,d)!==!1&&(d.preventDefault(),o.deactivate())},V=function(d){var u=Se(d);c(u,d)>=0||fe(r.clickOutsideDeactivates,d)||fe(r.allowOutsideClick,d)||(d.preventDefault(),d.stopImmediatePropagation())},$=function(){if(i.active)return lt.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?ct(function(){y(v())}):y(v()),s.addEventListener("focusin",R,!0),s.addEventListener("mousedown",O,{capture:!0,passive:!1}),s.addEventListener("touchstart",O,{capture:!0,passive:!1}),s.addEventListener("click",V,{capture:!0,passive:!1}),s.addEventListener("keydown",G,{capture:!0,passive:!1}),s.addEventListener("keydown",W),o},me=function(){if(i.active)return s.removeEventListener("focusin",R,!0),s.removeEventListener("mousedown",O,!0),s.removeEventListener("touchstart",O,!0),s.removeEventListener("click",V,!0),s.removeEventListener("keydown",G,!0),s.removeEventListener("keydown",W),o},P=function(d){var u=d.some(function(g){var _=Array.from(g.removedNodes);return _.some(function(E){return E===i.mostRecentlyFocusedNode})});u&&y(v())},H=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(P):void 0,J=function(){H&&(H.disconnect(),i.active&&!i.paused&&i.containers.map(function(d){H.observe(d,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(d){if(i.active)return this;var u=l(d,"onActivate"),g=l(d,"onPostActivate"),_=l(d,"checkCanFocusTrap");_||p(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,u==null||u();var E=function(){_&&p(),$(),J(),g==null||g()};return _?(_(i.containers.concat()).then(E,E),this):(E(),this)},deactivate:function(d){if(!i.active)return this;var u=ot({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},d);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,me(),i.active=!1,i.paused=!1,J(),lt.deactivateTrap(n,o);var g=l(u,"onDeactivate"),_=l(u,"onPostDeactivate"),E=l(u,"checkCanReturnFocus"),N=l(u,"returnFocus","returnFocusOnDeactivate");g==null||g();var F=function(){ct(function(){N&&y(x(i.nodeFocusedBeforeActivation)),_==null||_()})};return N&&E?(E(x(i.nodeFocusedBeforeActivation)).then(F,F),this):(F(),this)},pause:function(d){if(i.paused||!i.active)return this;var u=l(d,"onPause"),g=l(d,"onPostPause");return i.paused=!0,u==null||u(),me(),J(),g==null||g(),this},unpause:function(d){if(!i.paused||!i.active)return this;var u=l(d,"onUnpause"),g=l(d,"onPostUnpause");return i.paused=!1,u==null||u(),p(),$(),J(),g==null||g(),this},updateContainerElements:function(d){var u=[].concat(d).filter(Boolean);return i.containers=u.map(function(g){return typeof g=="string"?s.querySelector(g):g}),i.active&&p(),J(),this}},o.updateContainerElements(e),o};function Os(a,e={}){let t;const{immediate:s,...n}=e,r=se(!1),i=se(!1),o=p=>t&&t.activate(p),l=p=>t&&t.deactivate(p),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},v=pe(()=>{const p=Xe(a);return(Array.isArray(p)?p:[p]).map(b=>{const y=Xe(b);return typeof y=="string"?y:Rt(y)}).filter(Ct)});return je(v,p=>{p.length&&(t=Fs(p,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:r,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class oe{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const l=()=>{--i<=0&&n(o)};i||l(),r.forEach(c=>{oe.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,s(h)),l()},l)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new oe(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,l)=>{o.val===s&&(r=l,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],l=[],c,h,v=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;v();)this.iframes&&this.forEachIframe(t,p=>this.checkIframeFilter(c,h,p,o),p=>{this.createInstanceOnIframe(p).forEachNode(e,b=>l.push(b),n)}),l.push(c);l.forEach(p=>{s(p)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,l):l()})}}let Rs=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new oe(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,n=l+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||n-l<0||l>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(l,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return oe.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!n(i.node))return!1;const c=t-i.start,h=(s>i.end?i.end:s)-i.start,v=e.value.substr(0,i.start),p=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=v+p,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!s(c[i],l))continue;let h=c.index;if(i!==0)for(let v=1;v{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let v=1;vs(l[i],v),(v,p)=>{e.lastIndex=p,n(v)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:v}=this.checkWhitespaceRanges(o,i,r.value);v&&this.wrapRangeInMappedTextNode(r,c,h,p=>t(p,o,r.value.substring(c,h),l),p=>{s(p,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),v=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(p,b)=>this.opt.filter(b,c,s,v),p=>{v++,s++,this.opt.each(p)},()=>{v===0&&this.opt.noMatch(c),r[i-1]===c?this.opt.done(s):l(r[r.indexOf(c)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):l(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,l)=>this.opt.filter(r,i,o,l),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=oe.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Cs(a){const e=new Rs(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function Te(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{c(s.next(h))}catch(v){i(v)}}function l(h){try{c(s.throw(h))}catch(v){i(v)}}function c(h){h.done?r(h.value):n(h.value).then(o,l)}c((s=s.apply(a,[])).next())})}const Ms="ENTRIES",xt="KEYS",St="VALUES",z="";class Ae{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=ae(this._path);if(ae(t)===z)return{done:!1,value:this.result()};const s=e.get(ae(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=ae(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>ae(e)).filter(e=>e!==z).join("")}value(){return ae(this._path).node.get(z)}result(){switch(this._type){case St:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const ae=a=>a[a.length-1],As=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const l=r*i;e:for(const c of a.keys())if(c===z){const h=n[l-1];h<=t&&s.set(o,[a.get(c),h])}else{let h=r;for(let v=0;vt)continue e}_t(a.get(c),e,t,s,n,h,i,o+c)}};class Z{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Oe(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=Ke(s);for(const i of n.keys())if(i!==z&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new Z(o,e)}}return new Z(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Ls(this._tree,e)}entries(){return new Ae(this,Ms)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return As(this._tree,e,t)}get(e){const t=$e(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=$e(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Ae(this,xt)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,Le(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=Le(this._tree,e);return s.set(z,t(s.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=Le(this._tree,e);let n=s.get(z);return n===void 0&&s.set(z,n=t()),n}values(){return new Ae(this,St)}[Symbol.iterator](){return this.entries()}static from(e){const t=new Z;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return Z.from(Object.entries(e))}}const Oe=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==z&&e.startsWith(s))return t.push([a,s]),Oe(a.get(s),e.slice(s.length),t);return t.push([a,e]),Oe(void 0,"",t)},$e=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return $e(a.get(t),e.slice(t.length))},Le=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Oe(a,e);if(t!==void 0){if(t.delete(z),t.size===0)Et(s);else if(t.size===1){const[n,r]=t.entries().next().value;Tt(s,n,r)}}},Et=a=>{if(a.length===0)return;const[e,t]=Ke(a);if(e.delete(t),e.size===0)Et(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==z&&Tt(a.slice(0,-1),s,n)}},Tt=(a,e,t)=>{if(a.length===0)return;const[s,n]=Ke(a);s.set(n+e,t),s.delete(n)},Ke=a=>a[a.length-1],Je="or",It="and",Ds="and_not";class le{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?Pe:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},ze),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},dt),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},$s),e.autoSuggestOptions||{})}),this._index=new Z,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=We,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const l=this.addDocumentId(o);this.saveStoredFields(l,e);for(const c of r){const h=t(e,c);if(h==null)continue;const v=s(h.toString(),c),p=this._fieldIds[c],b=new Set(v).size;this.addFieldLength(l,p,this._documentCount-1,b);for(const y of v){const x=n(y,c);if(Array.isArray(x))for(const w of x)this.addTerm(p,l,w);else x&&this.addTerm(p,l,x)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%s===0?{chunk:[],promise:l.then(()=>new Promise(v=>setTimeout(v,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const l=this._idToShortId.get(o);if(l==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const c of r){const h=n(e,c);if(h==null)continue;const v=t(h.toString(),c),p=this._fieldIds[c],b=new Set(v).size;this.removeFieldLength(l,p,this._documentCount,b);for(const y of v){const x=s(y,c);if(Array.isArray(x))for(const w of x)this.removeTerm(p,l,w);else x&&this.removeTerm(p,l,x)}}this._storedFields.delete(l),this._documentIds.delete(l),this._idToShortId.delete(o),this._fieldLength.delete(l),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Z,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=We,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return Te(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||Be.batchSize,r=e.batchWait||Be.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[v]of h)this._documentIds.has(v)||(h.size<=1?l.delete(c):h.delete(v));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(c=>setTimeout(c,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||Pe.minDirtCount,s=s||Pe.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const s=this.executeQuery(e,t),n=[];for(const[r,{score:i,terms:o,match:l}]of s){const c=o.length||1,h={id:this._documentIds.get(r),score:i*c,terms:Object.keys(l),queryTerms:o,match:l};Object.assign(h,this._storedFields.get(r)),(t.filter==null||t.filter(h))&&n.push(h)}return e===le.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||n.sort(ft),n}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),l=s.get(o);l!=null?(l.score+=r,l.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:l}]of s)n.push({suggestion:r,terms:o,score:i/l});return n.sort(ft),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return Te(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(ze.hasOwnProperty(e))return De(ze,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=_e(n),l._fieldLength=_e(r),l._storedFields=_e(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of s){const v=new Map;for(const p of Object.keys(h)){let b=h[p];o===1&&(b=b.ds),v.set(parseInt(p,10),_e(b))}l._index.set(c,v)}return l}static loadJSAsync(e,t){return Te(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=yield Ee(n),l._fieldLength=yield Ee(r),l._storedFields=yield Ee(i);for(const[h,v]of l._documentIds)l._idToShortId.set(v,h);let c=0;for(const[h,v]of s){const p=new Map;for(const b of Object.keys(v)){let y=v[b];o===1&&(y=y.ds),p.set(parseInt(b,10),yield Ee(y))}++c%1e3===0&&(yield kt(0)),l._index.set(h,p)}return l})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new le(t);return c._documentCount=s,c._nextId=n,c._idToShortId=new Map,c._fieldIds=r,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new Z,c}executeQuery(e,t={}){if(e===le.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const p=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,p));return this.combineResults(b,p.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:l}=i,v=o(e).flatMap(p=>l(p)).filter(p=>!!p).map(Vs(i)).map(p=>this.executeQuerySpec(p,i));return this.combineResults(v,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((x,w)=>Object.assign(Object.assign({},x),{[w]:De(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:l}=s,{fuzzy:c,prefix:h}=Object.assign(Object.assign({},dt.weights),i),v=this._index.get(e.term),p=this.termResults(e.term,e.term,1,e.termBoost,v,n,r,l);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const x=e.fuzzy===!0?.2:e.fuzzy,w=x<1?Math.min(o,Math.round(e.term.length*x)):x;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[x,w]of b){const O=x.length-e.term.length;if(!O)continue;y==null||y.delete(x);const R=h*x.length/(x.length+.3*O);this.termResults(e.term,x,R,e.termBoost,w,n,r,l,p)}if(y)for(const x of y.keys()){const[w,O]=y.get(x);if(!O)continue;const R=c*x.length/(x.length+O);this.termResults(e.term,x,R,e.termBoost,w,n,r,l,p)}return p}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Je){if(e.length===0)return new Map;const s=t.toLowerCase(),n=zs[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,l,c=new Map){if(r==null)return c;for(const h of Object.keys(i)){const v=i[h],p=this._fieldIds[h],b=r.get(p);if(b==null)continue;let y=b.size;const x=this._avgFieldLength[p];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(p,w,t),y-=1;continue}const O=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!O)continue;const R=b.get(w),K=this._fieldLength.get(w)[p],G=js(R,y,this._documentCount,K,x,l),W=s*n*v*O*G,V=c.get(w);if(V){V.score+=W,Bs(V.terms,e);const $=De(V.match,t);$?$.push(h):V.match[t]=[h]}else c.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,s){const n=this._index.fetch(s,pt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,pt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,zs={[Je]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),ht(s.terms,r)}}return a},[It]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);ht(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Ds]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},Ps={k:1.2,b:.7,d:.5},js=(a,e,t,s,n,r)=>{const{k:i,b:o,d:l}=r;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*s/n)))},Vs=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},ze={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Ws),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},dt={combineWith:Je,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:Ps},$s={combineWith:It,prefix:(a,e,t)=>e===t.length-1},Be={batchSize:1e3,batchWait:10},We={minDirtFactor:.1,minDirtCount:20},Pe=Object.assign(Object.assign({},Be),We),Bs=(a,e)=>{a.includes(e)||a.push(e)},ht=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},ft=({score:a},{score:e})=>e-a,pt=()=>new Map,_e=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ee=a=>Te(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield kt(0));return e}),kt=a=>new Promise(e=>setTimeout(e,a)),Ws=/[\n\r\p{Z}\p{P}]+/u;class Ks{constructor(e=10){Re(this,"max");Re(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Js=["aria-owns"],Us={class:"shell"},qs=["title"],Gs={class:"search-actions before"},Hs=["title"],Qs=["placeholder"],Ys={class:"search-actions"},Zs=["title"],Xs=["disabled","title"],en=["id","role","aria-labelledby"],tn=["aria-selected"],sn=["href","aria-label","onMouseenter","onFocusin"],nn={class:"titles"},rn=["innerHTML"],an={class:"title main"},on=["innerHTML"],ln={key:0,class:"excerpt-wrapper"},cn={key:0,class:"excerpt",inert:""},un=["innerHTML"],dn={key:0,class:"no-results"},hn={class:"search-keyboard-shortcuts"},fn=["aria-label"],pn=["aria-label"],vn=["aria-label"],mn=["aria-label"],gn=At({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var N,F;const t=e,s=ye(),n=ye(),r=ye(ns),i=ts(),{activate:o}=Os(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=et(async()=>{var m,f,T,A,C,M,I,L,j;return it(le.loadJSON((T=await((f=(m=r.value)[l.value])==null?void 0:f.call(m)))==null?void 0:T.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((A=c.value.search)==null?void 0:A.provider)==="local"&&((M=(C=c.value.search.options)==null?void 0:C.miniSearch)==null?void 0:M.searchOptions)},...((I=c.value.search)==null?void 0:I.provider)==="local"&&((j=(L=c.value.search.options)==null?void 0:L.miniSearch)==null?void 0:j.options)}))}),p=pe(()=>{var m,f;return((m=c.value.search)==null?void 0:m.provider)==="local"&&((f=c.value.search.options)==null?void 0:f.disableQueryPersistence)===!0}).value?se(""):Lt("vitepress:local-search-filter",""),b=Dt("vitepress:local-search-detailed-list",((N=c.value.search)==null?void 0:N.provider)==="local"&&((F=c.value.search.options)==null?void 0:F.detailedView)===!0),y=pe(()=>{var m,f,T;return((m=c.value.search)==null?void 0:m.provider)==="local"&&(((f=c.value.search.options)==null?void 0:f.disableDetailedView)===!0||((T=c.value.search.options)==null?void 0:T.detailedView)===!1)}),x=pe(()=>{var f,T,A,C,M,I,L;const m=((f=c.value.search)==null?void 0:f.options)??c.value.algolia;return((M=(C=(A=(T=m==null?void 0:m.locales)==null?void 0:T[l.value])==null?void 0:A.translations)==null?void 0:C.button)==null?void 0:M.buttonText)||((L=(I=m==null?void 0:m.translations)==null?void 0:I.button)==null?void 0:L.buttonText)||"Search"});zt(()=>{y.value&&(b.value=!1)});const w=ye([]),O=se(!1);je(p,()=>{O.value=!1});const R=et(async()=>{if(n.value)return it(new Cs(n.value))},null),K=new Ks(16);Pt(()=>[h.value,p.value,b.value],async([m,f,T],A,C)=>{var ge,Ue,qe,Ge;(A==null?void 0:A[0])!==m&&K.clear();let M=!1;if(C(()=>{M=!0}),!m)return;w.value=m.search(f).slice(0,16),O.value=!0;const I=T?await Promise.all(w.value.map(B=>G(B.id))):[];if(M)return;for(const{id:B,mod:X}of I){const ee=B.slice(0,B.indexOf("#"));let Q=K.get(ee);if(Q)continue;Q=new Map,K.set(ee,Q);const U=X.default??X;if(U!=null&&U.render||U!=null&&U.setup){const te=Qt(U);te.config.warnHandler=()=>{},te.provide(Yt,i),Object.defineProperties(te.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const He=document.createElement("div");te.mount(He),He.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(ce=>{var Ze;const be=(Ze=ce.querySelector("a"))==null?void 0:Ze.getAttribute("href"),Qe=(be==null?void 0:be.startsWith("#"))&&be.slice(1);if(!Qe)return;let Ye="";for(;(ce=ce.nextElementSibling)&&!/^h[1-6]$/i.test(ce.tagName);)Ye+=ce.outerHTML;Q.set(Qe,Ye)}),te.unmount()}if(M)return}const L=new Set;if(w.value=w.value.map(B=>{const[X,ee]=B.id.split("#"),Q=K.get(X),U=(Q==null?void 0:Q.get(ee))??"";for(const te in B.match)L.add(te);return{...B,text:U}}),await ue(),M)return;await new Promise(B=>{var X;(X=R.value)==null||X.unmark({done:()=>{var ee;(ee=R.value)==null||ee.markRegExp(E(L),{done:B})}})});const j=((ge=s.value)==null?void 0:ge.querySelectorAll(".result .excerpt"))??[];for(const B of j)(Ue=B.querySelector('mark[data-markjs="true"]'))==null||Ue.scrollIntoView({block:"center"});(Ge=(qe=n.value)==null?void 0:qe.firstElementChild)==null||Ge.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function G(m){const f=Zt(m.slice(0,m.indexOf("#")));try{if(!f)throw new Error(`Cannot find file for id: ${m}`);return{id:m,mod:await import(f)}}catch(T){return console.error(T),{id:m,mod:{}}}}const W=se(),V=pe(()=>{var m;return((m=p.value)==null?void 0:m.length)<=0});function $(m=!0){var f,T;(f=W.value)==null||f.focus(),m&&((T=W.value)==null||T.select())}Ce(()=>{$()});function me(m){m.pointerType==="mouse"&&$()}const P=se(-1),H=se(!1);je(w,m=>{P.value=m.length?0:-1,J()});function J(){ue(()=>{const m=document.querySelector(".result.selected");m==null||m.scrollIntoView({block:"nearest"})})}we("ArrowUp",m=>{m.preventDefault(),P.value--,P.value<0&&(P.value=w.value.length-1),H.value=!0,J()}),we("ArrowDown",m=>{m.preventDefault(),P.value++,P.value>=w.value.length&&(P.value=0),H.value=!0,J()});const k=jt();we("Enter",m=>{if(m.isComposing||m.target instanceof HTMLButtonElement&&m.target.type!=="submit")return;const f=w.value[P.value];if(m.target instanceof HTMLInputElement&&!f){m.preventDefault();return}f&&(k.go(f.id),t("close"))}),we("Escape",()=>{t("close")});const u=ss({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Ce(()=>{window.history.pushState(null,"",null)}),Vt("popstate",m=>{m.preventDefault(),t("close")});const g=$t(Bt?document.body:null);Ce(()=>{ue(()=>{g.value=!0,ue().then(()=>o())})}),Wt(()=>{g.value=!1});function _(){p.value="",ue().then(()=>$(!1))}function E(m){return new RegExp([...m].sort((f,T)=>T.length-f.length).map(f=>`(${Xt(f)})`).join("|"),"gi")}return(m,f)=>{var T,A,C,M;return q(),Kt(Ht,{to:"body"},[S("div",{ref_key:"el",ref:s,role:"button","aria-owns":(T=w.value)!=null&&T.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[S("div",{class:"backdrop",onClick:f[0]||(f[0]=I=>m.$emit("close"))}),S("div",Us,[S("form",{class:"search-bar",onPointerup:f[4]||(f[4]=I=>me(I)),onSubmit:f[5]||(f[5]=Jt(()=>{},["prevent"]))},[S("label",{title:x.value,id:"localsearch-label",for:"localsearch-input"},f[8]||(f[8]=[S("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)]),8,qs),S("div",Gs,[S("button",{class:"back-button",title:D(u)("modal.backButtonTitle"),onClick:f[1]||(f[1]=I=>m.$emit("close"))},f[9]||(f[9]=[S("span",{class:"vpi-arrow-left local-search-icon"},null,-1)]),8,Hs)]),Ut(S("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":f[2]||(f[2]=I=>Gt(p)?p.value=I:null),placeholder:x.value,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Qs),[[qt,D(p)]]),S("div",Ys,[y.value?xe("",!0):(q(),Y("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":D(b)}]),type:"button",title:D(u)("modal.displayDetails"),onClick:f[3]||(f[3]=I=>P.value>-1&&(b.value=!D(b)))},f[10]||(f[10]=[S("span",{class:"vpi-layout-list local-search-icon"},null,-1)]),10,Zs)),S("button",{class:"clear-button",type:"reset",disabled:V.value,title:D(u)("modal.resetButtonTitle"),onClick:_},f[11]||(f[11]=[S("span",{class:"vpi-delete local-search-icon"},null,-1)]),8,Xs)])],32),S("ul",{ref_key:"resultsEl",ref:n,id:(A=w.value)!=null&&A.length?"localsearch-list":void 0,role:(C=w.value)!=null&&C.length?"listbox":void 0,"aria-labelledby":(M=w.value)!=null&&M.length?"localsearch-label":void 0,class:"results",onMousemove:f[7]||(f[7]=I=>H.value=!1)},[(q(!0),Y(nt,null,st(w.value,(I,L)=>(q(),Y("li",{key:I.id,role:"option","aria-selected":P.value===L?"true":"false"},[S("a",{href:I.id,class:tt(["result",{selected:P.value===L}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:j=>!H.value&&(P.value=L),onFocusin:j=>P.value=L,onClick:f[6]||(f[6]=j=>m.$emit("close"))},[S("div",null,[S("div",nn,[f[13]||(f[13]=S("span",{class:"title-icon"},"#",-1)),(q(!0),Y(nt,null,st(I.titles,(j,ge)=>(q(),Y("span",{key:ge,class:"title"},[S("span",{class:"text",innerHTML:j},null,8,rn),f[12]||(f[12]=S("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),S("span",an,[S("span",{class:"text",innerHTML:I.title},null,8,on)])]),D(b)?(q(),Y("div",ln,[I.text?(q(),Y("div",cn,[S("div",{class:"vp-doc",innerHTML:I.text},null,8,un)])):xe("",!0),f[14]||(f[14]=S("div",{class:"excerpt-gradient-bottom"},null,-1)),f[15]||(f[15]=S("div",{class:"excerpt-gradient-top"},null,-1))])):xe("",!0)])],42,sn)],8,tn))),128)),D(p)&&!w.value.length&&O.value?(q(),Y("li",dn,[de(he(D(u)("modal.noResultsText"))+' "',1),S("strong",null,he(D(p)),1),f[16]||(f[16]=de('" '))])):xe("",!0)],40,en),S("div",hn,[S("span",null,[S("kbd",{"aria-label":D(u)("modal.footer.navigateUpKeyAriaLabel")},f[17]||(f[17]=[S("span",{class:"vpi-arrow-up navigate-icon"},null,-1)]),8,fn),S("kbd",{"aria-label":D(u)("modal.footer.navigateDownKeyAriaLabel")},f[18]||(f[18]=[S("span",{class:"vpi-arrow-down navigate-icon"},null,-1)]),8,pn),de(" "+he(D(u)("modal.footer.navigateText")),1)]),S("span",null,[S("kbd",{"aria-label":D(u)("modal.footer.selectKeyAriaLabel")},f[19]||(f[19]=[S("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)]),8,vn),de(" "+he(D(u)("modal.footer.selectText")),1)]),S("span",null,[S("kbd",{"aria-label":D(u)("modal.footer.closeKeyAriaLabel")},"esc",8,mn),de(" "+he(D(u)("modal.footer.closeText")),1)])])])],8,Js)])}}}),_n=es(gn,[["__scopeId","data-v-797a7f7c"]]);export{_n as default}; diff --git a/assets/chunks/framework.DptEmx5X.js b/assets/chunks/framework.DptEmx5X.js new file mode 100644 index 0000000..5b1db58 --- /dev/null +++ b/assets/chunks/framework.DptEmx5X.js @@ -0,0 +1,18 @@ +/** +* @vue/shared v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Hs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Z={},Tt=[],Be=()=>{},Jo=()=>!1,Zt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),$s=e=>e.startsWith("onUpdate:"),fe=Object.assign,Ds=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zo=Object.prototype.hasOwnProperty,z=(e,t)=>zo.call(e,t),K=Array.isArray,Ct=e=>$n(e)==="[object Map]",fi=e=>$n(e)==="[object Set]",q=e=>typeof e=="function",re=e=>typeof e=="string",st=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",ui=e=>(ne(e)||q(e))&&q(e.then)&&q(e.catch),di=Object.prototype.toString,$n=e=>di.call(e),Qo=e=>$n(e).slice(8,-1),hi=e=>$n(e)==="[object Object]",js=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,At=Hs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Dn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Zo=/-(\w)/g,Le=Dn(e=>e.replace(Zo,(t,n)=>n?n.toUpperCase():"")),el=/\B([A-Z])/g,rt=Dn(e=>e.replace(el,"-$1").toLowerCase()),jn=Dn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Sn=Dn(e=>e?`on${jn(e)}`:""),tt=(e,t)=>!Object.is(e,t),En=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Ss=e=>{const t=parseFloat(e);return isNaN(t)?e:t},tl=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let dr;const gi=()=>dr||(dr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Vs(e){if(K(e)){const t={};for(let n=0;n{if(n){const s=n.split(sl);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Us(e){let t="";if(re(e))t=e;else if(K(e))for(let n=0;n!!(e&&e.__v_isRef===!0),cl=e=>re(e)?e:e==null?"":K(e)||ne(e)&&(e.toString===di||!q(e.toString))?yi(e)?cl(e.value):JSON.stringify(e,vi,2):String(e),vi=(e,t)=>yi(t)?vi(e,t.value):Ct(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[ts(s,i)+" =>"]=r,n),{})}:fi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ts(n))}:st(t)?ts(t):ne(t)&&!K(t)&&!hi(t)?String(t):t,ts=(e,t="")=>{var n;return st(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let _e;class al{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=_e,!t&&_e&&(this.index=(_e.scopes||(_e.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(jt){let t=jt;for(jt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Dt;){let t=Dt;for(Dt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Ei(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function xi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Ws(s),ul(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Es(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ti(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ti(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Kt))return;e.globalVersion=Kt;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!Es(e)){e.flags&=-3;return}const n=te,s=Ne;te=e,Ne=!0;try{Ei(e);const r=e.fn(e._value);(t.version===0||tt(r,e._value))&&(e._value=r,t.version++)}catch(r){throw t.version++,r}finally{te=n,Ne=s,xi(e),e.flags&=-3}}function Ws(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s),!n.subs&&n.computed){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Ws(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ul(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ne=!0;const Ci=[];function it(){Ci.push(Ne),Ne=!1}function ot(){const e=Ci.pop();Ne=e===void 0?!0:e}function hr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Kt=0;class dl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Vn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!te||!Ne||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new dl(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,Ai(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=s)}return n}trigger(t){this.version++,Kt++,this.notify(t)}notify(t){Bs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{ks()}}}function Ai(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)Ai(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const On=new WeakMap,ht=Symbol(""),xs=Symbol(""),qt=Symbol("");function ve(e,t,n){if(Ne&&te){let s=On.get(e);s||On.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Vn),r.map=s,r.key=n),r.track()}}function Ge(e,t,n,s,r,i){const o=On.get(e);if(!o){Kt++;return}const l=c=>{c&&c.trigger()};if(Bs(),t==="clear")o.forEach(l);else{const c=K(e),f=c&&js(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,g)=>{(g==="length"||g===qt||!st(g)&&g>=a)&&l(h)})}else switch(n!==void 0&&l(o.get(n)),f&&l(o.get(qt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(ht)),Ct(e)&&l(o.get(xs)));break;case"delete":c||(l(o.get(ht)),Ct(e)&&l(o.get(xs)));break;case"set":Ct(e)&&l(o.get(ht));break}}ks()}function hl(e,t){const n=On.get(e);return n&&n.get(t)}function _t(e){const t=J(e);return t===e?t:(ve(t,"iterate",qt),Pe(e)?t:t.map(me))}function Un(e){return ve(e=J(e),"iterate",qt),e}const pl={__proto__:null,[Symbol.iterator](){return ss(this,Symbol.iterator,me)},concat(...e){return _t(this).concat(...e.map(t=>K(t)?_t(t):t))},entries(){return ss(this,"entries",e=>(e[1]=me(e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,n=>n.map(me),arguments)},find(e,t){return We(this,"find",e,t,me,arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,me,arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return rs(this,"includes",e)},indexOf(...e){return rs(this,"indexOf",e)},join(e){return _t(this).join(e)},lastIndexOf(...e){return rs(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ft(this,"pop")},push(...e){return Ft(this,"push",e)},reduce(e,...t){return pr(this,"reduce",e,t)},reduceRight(e,...t){return pr(this,"reduceRight",e,t)},shift(){return Ft(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ft(this,"splice",e)},toReversed(){return _t(this).toReversed()},toSorted(e){return _t(this).toSorted(e)},toSpliced(...e){return _t(this).toSpliced(...e)},unshift(...e){return Ft(this,"unshift",e)},values(){return ss(this,"values",me)}};function ss(e,t,n){const s=Un(e),r=s[t]();return s!==e&&!Pe(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const gl=Array.prototype;function We(e,t,n,s,r,i){const o=Un(e),l=o!==e&&!Pe(e),c=o[t];if(c!==gl[t]){const h=c.apply(e,i);return l?me(h):h}let f=n;o!==e&&(l?f=function(h,g){return n.call(this,me(h),g,e)}:n.length>2&&(f=function(h,g){return n.call(this,h,g,e)}));const a=c.call(o,f,s);return l&&r?r(a):a}function pr(e,t,n,s){const r=Un(e);let i=n;return r!==e&&(Pe(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,me(l),c,e)}),r[t](i,...s)}function rs(e,t,n){const s=J(e);ve(s,"iterate",qt);const r=s[t](...n);return(r===-1||r===!1)&&Ys(n[0])?(n[0]=J(n[0]),s[t](...n)):r}function Ft(e,t,n=[]){it(),Bs();const s=J(e)[t].apply(e,n);return ks(),ot(),s}const ml=Hs("__proto__,__v_isRef,__isVue"),Ri=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(st));function yl(e){st(e)||(e=String(e));const t=J(this);return ve(t,"has",e),t.hasOwnProperty(e)}class Oi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Ml:Ii:i?Li:Pi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=K(t);if(!r){let c;if(o&&(c=pl[n]))return c;if(n==="hasOwnProperty")return yl}const l=Reflect.get(t,n,ae(t)?t:s);return(st(n)?Ri.has(n):ml(n))||(r||ve(t,"get",n),i)?l:ae(l)?o&&js(n)?l:l.value:ne(l)?r?Wn(l):kn(l):l}}class Mi extends Oi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=vt(i);if(!Pe(s)&&!vt(s)&&(i=J(i),s=J(s)),!K(t)&&ae(i)&&!ae(s))return c?!1:(i.value=s,!0)}const o=K(t)&&js(n)?Number(n)e,Bn=e=>Reflect.getPrototypeOf(e);function cn(e,t,n=!1,s=!1){e=e.__v_raw;const r=J(e),i=J(t);n||(tt(t,i)&&ve(r,"get",t),ve(r,"get",i));const{has:o}=Bn(r),l=s?Ks:n?Xs:me;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function an(e,t=!1){const n=this.__v_raw,s=J(n),r=J(e);return t||(tt(e,r)&&ve(s,"has",e),ve(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function fn(e,t=!1){return e=e.__v_raw,!t&&ve(J(e),"iterate",ht),Reflect.get(e,"size",e)}function gr(e,t=!1){!t&&!Pe(e)&&!vt(e)&&(e=J(e));const n=J(this);return Bn(n).has.call(n,e)||(n.add(e),Ge(n,"add",e,e)),this}function mr(e,t,n=!1){!n&&!Pe(t)&&!vt(t)&&(t=J(t));const s=J(this),{has:r,get:i}=Bn(s);let o=r.call(s,e);o||(e=J(e),o=r.call(s,e));const l=i.call(s,e);return s.set(e,t),o?tt(t,l)&&Ge(s,"set",e,t):Ge(s,"add",e,t),this}function yr(e){const t=J(this),{has:n,get:s}=Bn(t);let r=n.call(t,e);r||(e=J(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&Ge(t,"delete",e,void 0),i}function vr(){const e=J(this),t=e.size!==0,n=e.clear();return t&&Ge(e,"clear",void 0,void 0),n}function un(e,t){return function(s,r){const i=this,o=i.__v_raw,l=J(o),c=t?Ks:e?Xs:me;return!e&&ve(l,"iterate",ht),o.forEach((f,a)=>s.call(r,c(f),c(a),i))}}function dn(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=Ct(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),a=n?Ks:t?Xs:me;return!t&&ve(i,"iterate",c?xs:ht),{next(){const{value:h,done:g}=f.next();return g?{value:h,done:g}:{value:l?[a(h[0]),a(h[1])]:a(h),done:g}},[Symbol.iterator](){return this}}}}function Xe(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Sl(){const e={get(i){return cn(this,i)},get size(){return fn(this)},has:an,add:gr,set:mr,delete:yr,clear:vr,forEach:un(!1,!1)},t={get(i){return cn(this,i,!1,!0)},get size(){return fn(this)},has:an,add(i){return gr.call(this,i,!0)},set(i,o){return mr.call(this,i,o,!0)},delete:yr,clear:vr,forEach:un(!1,!0)},n={get(i){return cn(this,i,!0)},get size(){return fn(this,!0)},has(i){return an.call(this,i,!0)},add:Xe("add"),set:Xe("set"),delete:Xe("delete"),clear:Xe("clear"),forEach:un(!0,!1)},s={get(i){return cn(this,i,!0,!0)},get size(){return fn(this,!0)},has(i){return an.call(this,i,!0)},add:Xe("add"),set:Xe("set"),delete:Xe("delete"),clear:Xe("clear"),forEach:un(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=dn(i,!1,!1),n[i]=dn(i,!0,!1),t[i]=dn(i,!1,!0),s[i]=dn(i,!0,!0)}),[e,n,t,s]}const[El,xl,Tl,Cl]=Sl();function qs(e,t){const n=t?e?Cl:Tl:e?xl:El;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(z(n,r)&&r in s?n:s,r,i)}const Al={get:qs(!1,!1)},Rl={get:qs(!1,!0)},Ol={get:qs(!0,!1)};const Pi=new WeakMap,Li=new WeakMap,Ii=new WeakMap,Ml=new WeakMap;function Pl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ll(e){return e.__v_skip||!Object.isExtensible(e)?0:Pl(Qo(e))}function kn(e){return vt(e)?e:Gs(e,!1,bl,Al,Pi)}function Il(e){return Gs(e,!1,wl,Rl,Li)}function Wn(e){return Gs(e,!0,_l,Ol,Ii)}function Gs(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=Ll(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function pt(e){return vt(e)?pt(e.__v_raw):!!(e&&e.__v_isReactive)}function vt(e){return!!(e&&e.__v_isReadonly)}function Pe(e){return!!(e&&e.__v_isShallow)}function Ys(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function xn(e){return!z(e,"__v_skip")&&Object.isExtensible(e)&&pi(e,"__v_skip",!0),e}const me=e=>ne(e)?kn(e):e,Xs=e=>ne(e)?Wn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function oe(e){return Ni(e,!1)}function Js(e){return Ni(e,!0)}function Ni(e,t){return ae(e)?e:new Nl(e,t)}class Nl{constructor(t,n){this.dep=new Vn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:me(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Pe(t)||vt(t);t=s?t:J(t),tt(t,n)&&(this._rawValue=t,this._value=s?t:me(t),this.dep.trigger())}}function Fi(e){return ae(e)?e.value:e}const Fl={get:(e,t,n)=>t==="__v_raw"?e:Fi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Hi(e){return pt(e)?e:new Proxy(e,Fl)}class Hl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Vn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function $l(e){return new Hl(e)}class Dl{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return hl(J(this._object),this._key)}}class jl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Vl(e,t,n){return ae(e)?e:q(e)?new jl(e):ne(e)&&arguments.length>1?Ul(e,t,n):oe(e)}function Ul(e,t,n){const s=e[t];return ae(s)?s:new Dl(e,t,n)}class Bl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Vn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return Si(this,!0),!0}get value(){const t=this.dep.track();return Ti(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function kl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Bl(s,r,n)}const hn={},Mn=new WeakMap;let ut;function Wl(e,t=!1,n=ut){if(n){let s=Mn.get(n);s||Mn.set(n,s=[]),s.push(e)}}function Kl(e,t,n=Z){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,f=m=>r?m:Pe(m)||r===!1||r===0?qe(m,1):qe(m);let a,h,g,b,S=!1,_=!1;if(ae(e)?(h=()=>e.value,S=Pe(e)):pt(e)?(h=()=>f(e),S=!0):K(e)?(_=!0,S=e.some(m=>pt(m)||Pe(m)),h=()=>e.map(m=>{if(ae(m))return m.value;if(pt(m))return f(m);if(q(m))return c?c(m,2):m()})):q(e)?t?h=c?()=>c(e,2):e:h=()=>{if(g){it();try{g()}finally{ot()}}const m=ut;ut=a;try{return c?c(e,3,[b]):e(b)}finally{ut=m}}:h=Be,t&&r){const m=h,M=r===!0?1/0:r;h=()=>qe(m(),M)}const k=bi(),N=()=>{a.stop(),k&&Ds(k.effects,a)};if(i&&t){const m=t;t=(...M)=>{m(...M),N()}}let j=_?new Array(e.length).fill(hn):hn;const p=m=>{if(!(!(a.flags&1)||!a.dirty&&!m))if(t){const M=a.run();if(r||S||(_?M.some((F,$)=>tt(F,j[$])):tt(M,j))){g&&g();const F=ut;ut=a;try{const $=[M,j===hn?void 0:_&&j[0]===hn?[]:j,b];c?c(t,3,$):t(...$),j=M}finally{ut=F}}}else a.run()};return l&&l(p),a=new _i(h),a.scheduler=o?()=>o(p,!1):p,b=m=>Wl(m,!1,a),g=a.onStop=()=>{const m=Mn.get(a);if(m){if(c)c(m,4);else for(const M of m)M();Mn.delete(a)}},t?s?p(!0):j=a.run():o?o(p.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function qe(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,ae(e))qe(e.value,t,n);else if(K(e))for(let s=0;s{qe(s,t,n)});else if(hi(e)){for(const s in e)qe(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&qe(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function en(e,t,n,s){try{return s?e(...s):e()}catch(r){tn(r,t,n)}}function He(e,t,n,s){if(q(e)){const r=en(e,t,n,s);return r&&ui(r)&&r.catch(i=>{tn(i,t,n)}),r}if(K(e)){const r=[];for(let i=0;i>>1,r=we[s],i=Gt(r);i=Gt(n)?we.push(e):we.splice(Gl(t),0,e),e.flags|=1,Di()}}function Di(){Pn||(Pn=$i.then(ji))}function Yl(e){K(e)?Rt.push(...e):Qe&&e.id===-1?Qe.splice(St+1,0,e):e.flags&1||(Rt.push(e),e.flags|=1),Di()}function br(e,t,n=Ve+1){for(;nGt(n)-Gt(s));if(Rt.length=0,Qe){Qe.push(...t);return}for(Qe=t,St=0;Ste.id==null?e.flags&2?-1:1/0:e.id;function ji(e){try{for(Ve=0;Ve{s._d&&Ir(-1);const i=In(t);let o;try{o=e(...r)}finally{In(i),s._d&&Ir(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Pf(e,t){if(de===null)return e;const n=zn(de),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,Vt=e=>e&&(e.disabled||e.disabled===""),Jl=e=>e&&(e.defer||e.defer===""),_r=e=>typeof SVGElement<"u"&&e instanceof SVGElement,wr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Ts=(e,t)=>{const n=e&&e.to;return re(n)?t?t(n):null:n},zl={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:a,pc:h,pbc:g,o:{insert:b,querySelector:S,createText:_,createComment:k}}=f,N=Vt(t.props);let{shapeFlag:j,children:p,dynamicChildren:m}=t;if(e==null){const M=t.el=_(""),F=t.anchor=_("");b(M,n,s),b(F,n,s);const $=(R,v)=>{j&16&&(r&&r.isCE&&(r.ce._teleportTarget=R),a(p,R,v,r,i,o,l,c))},V=()=>{const R=t.target=Ts(t.props,S),v=ki(R,t,_,b);R&&(o!=="svg"&&_r(R)?o="svg":o!=="mathml"&&wr(R)&&(o="mathml"),N||($(R,v),Tn(t)))};N&&($(n,F),Tn(t)),Jl(t.props)?Ee(V,i):V()}else{t.el=e.el,t.targetStart=e.targetStart;const M=t.anchor=e.anchor,F=t.target=e.target,$=t.targetAnchor=e.targetAnchor,V=Vt(e.props),R=V?n:F,v=V?M:$;if(o==="svg"||_r(F)?o="svg":(o==="mathml"||wr(F))&&(o="mathml"),m?(g(e.dynamicChildren,m,R,r,i,o,l),nr(e,t,!0)):c||h(e,t,R,v,r,i,o,l,!1),N)V?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):pn(t,n,M,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const I=t.target=Ts(t.props,S);I&&pn(t,I,null,f,0)}else V&&pn(t,F,$,f,1);Tn(t)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:h,props:g}=e;if(h&&(r(f),r(a)),i&&r(c),o&16){const b=i||!Vt(g);for(let S=0;S{e.isMounted=!0}),Ji(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],Wi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},Ki=e=>{const t=e.subTree;return t.component?Ki(t.component):t},ec={name:"BaseTransition",props:Wi,setup(e,{slots:t}){const n=Jn(),s=Zl();return()=>{const r=t.default&&Yi(t.default(),!0);if(!r||!r.length)return;const i=qi(r),o=J(e),{mode:l}=o;if(s.isLeaving)return is(i);const c=Sr(i);if(!c)return is(i);let f=Cs(c,o,s,n,g=>f=g);c.type!==ye&&Yt(c,f);const a=n.subTree,h=a&&Sr(a);if(h&&h.type!==ye&&!dt(c,h)&&Ki(n).type!==ye){const g=Cs(h,o,s,n);if(Yt(h,g),l==="out-in"&&c.type!==ye)return s.isLeaving=!0,g.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete g.afterLeave},is(i);l==="in-out"&&c.type!==ye&&(g.delayLeave=(b,S,_)=>{const k=Gi(s,h);k[String(h.key)]=h,b[Ze]=()=>{S(),b[Ze]=void 0,delete f.delayedLeave},f.delayedLeave=_})}return i}}};function qi(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ye){t=n;break}}return t}const tc=ec;function Gi(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Cs(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:g,onLeave:b,onAfterLeave:S,onLeaveCancelled:_,onBeforeAppear:k,onAppear:N,onAfterAppear:j,onAppearCancelled:p}=t,m=String(e.key),M=Gi(n,e),F=(R,v)=>{R&&He(R,s,9,v)},$=(R,v)=>{const I=v[1];F(R,v),K(R)?R.every(x=>x.length<=1)&&I():R.length<=1&&I()},V={mode:o,persisted:l,beforeEnter(R){let v=c;if(!n.isMounted)if(i)v=k||c;else return;R[Ze]&&R[Ze](!0);const I=M[m];I&&dt(e,I)&&I.el[Ze]&&I.el[Ze](),F(v,[R])},enter(R){let v=f,I=a,x=h;if(!n.isMounted)if(i)v=N||f,I=j||a,x=p||h;else return;let W=!1;const se=R[gn]=ce=>{W||(W=!0,ce?F(x,[R]):F(I,[R]),V.delayedLeave&&V.delayedLeave(),R[gn]=void 0)};v?$(v,[R,se]):se()},leave(R,v){const I=String(e.key);if(R[gn]&&R[gn](!0),n.isUnmounting)return v();F(g,[R]);let x=!1;const W=R[Ze]=se=>{x||(x=!0,v(),se?F(_,[R]):F(S,[R]),R[Ze]=void 0,M[I]===e&&delete M[I])};M[I]=e,b?$(b,[R,W]):W()},clone(R){const v=Cs(R,t,n,s,r);return r&&r(v),v}};return V}function is(e){if(nn(e))return e=nt(e),e.children=null,e}function Sr(e){if(!nn(e))return Bi(e.type)&&e.children?qi(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function Yt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Yt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Yi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iNn(S,t&&(K(t)?t[_]:t),n,s,r));return}if(gt(s)&&!r)return;const i=s.shapeFlag&4?zn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===Z?l.refs={}:l.refs,h=l.setupState,g=J(h),b=h===Z?()=>!1:S=>z(g,S);if(f!=null&&f!==c&&(re(f)?(a[f]=null,b(f)&&(h[f]=null)):ae(f)&&(f.value=null)),q(c))en(c,l,12,[o,a]);else{const S=re(c),_=ae(c);if(S||_){const k=()=>{if(e.f){const N=S?b(c)?h[c]:a[c]:c.value;r?K(N)&&Ds(N,i):K(N)?N.includes(i)||N.push(i):S?(a[c]=[i],b(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else S?(a[c]=o,b(c)&&(h[c]=o)):_&&(c.value=o,e.k&&(a[e.k]=o))};o?(k.id=-1,Ee(k,n)):k()}}}let Er=!1;const wt=()=>{Er||(console.error("Hydration completed but contains mismatches."),Er=!0)},nc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",sc=e=>e.namespaceURI.includes("MathML"),mn=e=>{if(e.nodeType===1){if(nc(e))return"svg";if(sc(e))return"mathml"}},xt=e=>e.nodeType===8;function rc(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,m)=>{if(!m.hasChildNodes()){n(null,p,m),Ln(),m._vnode=p;return}h(m.firstChild,p,null,null,null),Ln(),m._vnode=p},h=(p,m,M,F,$,V=!1)=>{V=V||!!m.dynamicChildren;const R=xt(p)&&p.data==="[",v=()=>_(p,m,M,F,$,R),{type:I,ref:x,shapeFlag:W,patchFlag:se}=m;let ce=p.nodeType;m.el=p,se===-2&&(V=!1,m.dynamicChildren=null);let U=null;switch(I){case mt:ce!==3?m.children===""?(c(m.el=r(""),o(p),p),U=p):U=v():(p.data!==m.children&&(wt(),p.data=m.children),U=i(p));break;case ye:j(p)?(U=i(p),N(m.el=p.content.firstChild,p,M)):ce!==8||R?U=v():U=i(p);break;case Bt:if(R&&(p=i(p),ce=p.nodeType),ce===1||ce===3){U=p;const Y=!m.children.length;for(let D=0;D{V=V||!!m.dynamicChildren;const{type:R,props:v,patchFlag:I,shapeFlag:x,dirs:W,transition:se}=m,ce=R==="input"||R==="option";if(ce||I!==-1){W&&Ue(m,null,M,"created");let U=!1;if(j(p)){U=po(F,se)&&M&&M.vnode.props&&M.vnode.props.appear;const D=p.content.firstChild;U&&se.beforeEnter(D),N(D,p,M),m.el=p=D}if(x&16&&!(v&&(v.innerHTML||v.textContent))){let D=b(p.firstChild,m,p,M,F,$,V);for(;D;){yn(p,1)||wt();const he=D;D=D.nextSibling,l(he)}}else if(x&8){let D=m.children;D[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(D=D.slice(1)),p.textContent!==D&&(yn(p,0)||wt(),p.textContent=m.children)}if(v){if(ce||!V||I&48){const D=p.tagName.includes("-");for(const he in v)(ce&&(he.endsWith("value")||he==="indeterminate")||Zt(he)&&!At(he)||he[0]==="."||D)&&s(p,he,null,v[he],void 0,M)}else if(v.onClick)s(p,"onClick",null,v.onClick,void 0,M);else if(I&4&&pt(v.style))for(const D in v.style)v.style[D]}let Y;(Y=v&&v.onVnodeBeforeMount)&&Oe(Y,M,m),W&&Ue(m,null,M,"beforeMount"),((Y=v&&v.onVnodeMounted)||W||U)&&bo(()=>{Y&&Oe(Y,M,m),U&&se.enter(p),W&&Ue(m,null,M,"mounted")},F)}return p.nextSibling},b=(p,m,M,F,$,V,R)=>{R=R||!!m.dynamicChildren;const v=m.children,I=v.length;for(let x=0;x{const{slotScopeIds:R}=m;R&&($=$?$.concat(R):R);const v=o(p),I=b(i(p),m,v,M,F,$,V);return I&&xt(I)&&I.data==="]"?i(m.anchor=I):(wt(),c(m.anchor=f("]"),v,I),I)},_=(p,m,M,F,$,V)=>{if(yn(p.parentElement,1)||wt(),m.el=null,V){const I=k(p);for(;;){const x=i(p);if(x&&x!==I)l(x);else break}}const R=i(p),v=o(p);return l(p),n(null,m,v,R,M,F,mn(v),$),R},k=(p,m="[",M="]")=>{let F=0;for(;p;)if(p=i(p),p&&xt(p)&&(p.data===m&&F++,p.data===M)){if(F===0)return i(p);F--}return p},N=(p,m,M)=>{const F=m.parentNode;F&&F.replaceChild(p,m);let $=M;for(;$;)$.vnode.el===m&&($.vnode.el=$.subTree.el=p),$=$.parent},j=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const xr="data-allow-mismatch",ic={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function yn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(xr);)e=e.parentElement;const n=e&&e.getAttribute(xr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:n.split(",").includes(ic[t])}}function oc(e,t){if(xt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(xt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const gt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function If(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,h=0;const g=()=>(h++,f=null,b()),b=()=>{let S;return f||(S=f=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),c)return new Promise((k,N)=>{c(_,()=>k(g()),()=>N(_),h+1)});throw _}).then(_=>S!==f&&f?f:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),a=_,_)))};return Qs({name:"AsyncComponentWrapper",__asyncLoader:b,__asyncHydrate(S,_,k){const N=i?()=>{const j=i(k,p=>oc(S,p));j&&(_.bum||(_.bum=[])).push(j)}:k;a?N():b().then(()=>!_.isUnmounted&&N())},get __asyncResolved(){return a},setup(){const S=ue;if(Zs(S),a)return()=>os(a,S);const _=p=>{f=null,tn(p,S,13,!s)};if(l&&S.suspense||rn)return b().then(p=>()=>os(p,S)).catch(p=>(_(p),()=>s?le(s,{error:p}):null));const k=oe(!1),N=oe(),j=oe(!!r);return r&&setTimeout(()=>{j.value=!1},r),o!=null&&setTimeout(()=>{if(!k.value&&!N.value){const p=new Error(`Async component timed out after ${o}ms.`);_(p),N.value=p}},o),b().then(()=>{k.value=!0,S.parent&&nn(S.parent.vnode)&&S.parent.update()}).catch(p=>{_(p),N.value=p}),()=>{if(k.value&&a)return os(a,S);if(N.value&&s)return le(s,{error:N.value});if(n&&!j.value)return le(n)}}})}function os(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=le(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const nn=e=>e.type.__isKeepAlive;function lc(e,t){Xi(e,"a",t)}function cc(e,t){Xi(e,"da",t)}function Xi(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(qn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)nn(r.parent.vnode)&&ac(s,t,n,r),r=r.parent}}function ac(e,t,n,s){const r=qn(t,e,s,!0);Gn(()=>{Ds(s[t],r)},n)}function qn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{it();const l=sn(n),c=He(t,n,e,o);return l(),ot(),c});return s?r.unshift(i):r.push(i),i}}const Ye=e=>(t,n=ue)=>{(!rn||e==="sp")&&qn(e,(...s)=>t(...s),n)},fc=Ye("bm"),Lt=Ye("m"),uc=Ye("bu"),dc=Ye("u"),Ji=Ye("bum"),Gn=Ye("um"),hc=Ye("sp"),pc=Ye("rtg"),gc=Ye("rtc");function mc(e,t=ue){qn("ec",e,t)}const zi="components";function Nf(e,t){return Zi(zi,e,!0,t)||e}const Qi=Symbol.for("v-ndc");function Ff(e){return re(e)?Zi(zi,e,!1)||e:e||Qi}function Zi(e,t,n=!0,s=!1){const r=de||ue;if(r){const i=r.type;{const l=ta(i,!1);if(l&&(l===t||l===Le(t)||l===jn(Le(t))))return i}const o=Tr(r[e]||i[e],t)||Tr(r.appContext[e],t);return!o&&s?i:o}}function Tr(e,t){return e&&(e[t]||e[Le(t)]||e[jn(Le(t))])}function Hf(e,t,n,s){let r;const i=n,o=K(e);if(o||re(e)){const l=o&&pt(e);let c=!1;l&&(c=!Pe(e),e=Un(e)),r=new Array(e.length);for(let f=0,a=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,f=l.length;cJt(t)?!(t.type===ye||t.type===Se&&!eo(t.children)):!0)?e:null}function Df(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:Sn(s)]=e[s];return n}const As=e=>e?xo(e)?zn(e):As(e.parent):null,Ut=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>As(e.parent),$root:e=>As(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>er(e),$forceUpdate:e=>e.f||(e.f=()=>{zs(e.update)}),$nextTick:e=>e.n||(e.n=Kn.bind(e.proxy)),$watch:e=>Dc.bind(e)}),ls=(e,t)=>e!==Z&&!e.__isScriptSetup&&z(e,t),yc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const b=o[t];if(b!==void 0)switch(b){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ls(s,t))return o[t]=1,s[t];if(r!==Z&&z(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&z(f,t))return o[t]=3,i[t];if(n!==Z&&z(n,t))return o[t]=4,n[t];Rs&&(o[t]=0)}}const a=Ut[t];let h,g;if(a)return t==="$attrs"&&ve(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==Z&&z(n,t))return o[t]=4,n[t];if(g=c.config.globalProperties,z(g,t))return g[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ls(r,t)?(r[t]=n,!0):s!==Z&&z(s,t)?(s[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==Z&&z(e,o)||ls(t,o)||(l=i[0])&&z(l,o)||z(s,o)||z(Ut,o)||z(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function jf(){return vc().slots}function vc(){const e=Jn();return e.setupContext||(e.setupContext=Co(e))}function Cr(e){return K(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Rs=!0;function bc(e){const t=er(e),n=e.proxy,s=e.ctx;Rs=!1,t.beforeCreate&&Ar(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:g,beforeUpdate:b,updated:S,activated:_,deactivated:k,beforeDestroy:N,beforeUnmount:j,destroyed:p,unmounted:m,render:M,renderTracked:F,renderTriggered:$,errorCaptured:V,serverPrefetch:R,expose:v,inheritAttrs:I,components:x,directives:W,filters:se}=t;if(f&&_c(f,s,null),o)for(const Y in o){const D=o[Y];q(D)&&(s[Y]=D.bind(n))}if(r){const Y=r.call(n,n);ne(Y)&&(e.data=kn(Y))}if(Rs=!0,i)for(const Y in i){const D=i[Y],he=q(D)?D.bind(n,n):q(D.get)?D.get.bind(n,n):Be,on=!q(D)&&q(D.set)?D.set.bind(n):Be,lt=ie({get:he,set:on});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>lt.value,set:De=>lt.value=De})}if(l)for(const Y in l)to(l[Y],s,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(D=>{Cc(D,Y[D])})}a&&Ar(a,e,"c");function U(Y,D){K(D)?D.forEach(he=>Y(he.bind(n))):D&&Y(D.bind(n))}if(U(fc,h),U(Lt,g),U(uc,b),U(dc,S),U(lc,_),U(cc,k),U(mc,V),U(gc,F),U(pc,$),U(Ji,j),U(Gn,m),U(hc,R),K(v))if(v.length){const Y=e.exposed||(e.exposed={});v.forEach(D=>{Object.defineProperty(Y,D,{get:()=>n[D],set:he=>n[D]=he})})}else e.exposed||(e.exposed={});M&&e.render===Be&&(e.render=M),I!=null&&(e.inheritAttrs=I),x&&(e.components=x),W&&(e.directives=W),R&&Zs(e)}function _c(e,t,n=Be){K(e)&&(e=Os(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=Mt(r.from||s,r.default,!0):i=Mt(r.from||s):i=Mt(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Ar(e,t,n){He(K(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function to(e,t,n,s){let r=s.includes(".")?mo(n,s):()=>n[s];if(re(e)){const i=t[e];q(i)&&Fe(r,i)}else if(q(e))Fe(r,e.bind(n));else if(ne(e))if(K(e))e.forEach(i=>to(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Fe(r,i,e)}}function er(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>Fn(c,f,o,!0)),Fn(c,t,o)),ne(t)&&i.set(t,c),c}function Fn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Fn(e,i,n,!0),r&&r.forEach(o=>Fn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=wc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const wc={data:Rr,props:Or,emits:Or,methods:$t,computed:$t,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:$t,directives:$t,watch:Ec,provide:Rr,inject:Sc};function Rr(e,t){return t?e?function(){return fe(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Sc(e,t){return $t(Os(e),Os(t))}function Os(e){if(K(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}const so={},ro=()=>Object.create(so),io=e=>Object.getPrototypeOf(e)===so;function Ac(e,t,n,s=!1){const r={},i=ro();e.propsDefaults=Object.create(null),oo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Il(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Rc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[g,b]=lo(h,t,!0);fe(o,g),b&&l.push(...b)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return ne(e)&&s.set(e,Tt),Tt;if(K(i))for(let a=0;ae[0]==="_"||e==="$stable",tr=e=>K(e)?e.map(Me):[Me(e)],Mc=(e,t,n)=>{if(t._n)return t;const s=Xl((...r)=>tr(t(...r)),n);return s._c=!1,s},ao=(e,t,n)=>{const s=e._ctx;for(const r in e){if(co(r))continue;const i=e[r];if(q(i))t[r]=Mc(r,i,s);else if(i!=null){const o=tr(i);t[r]=()=>o}}},fo=(e,t)=>{const n=tr(t);e.slots.default=()=>n},uo=(e,t,n)=>{for(const s in t)(n||s!=="_")&&(e[s]=t[s])},Pc=(e,t,n)=>{const s=e.slots=ro();if(e.vnode.shapeFlag&32){const r=t._;r?(uo(s,t,n),n&&pi(s,"_",r,!0)):ao(t,s)}else t&&fo(e,t)},Lc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=Z;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:uo(r,t,n):(i=!t.$stable,ao(t,r)),o=t}else t&&(fo(e,t),o={default:1});if(i)for(const l in r)!co(l)&&o[l]==null&&delete r[l]},Ee=bo;function Ic(e){return ho(e)}function Nc(e){return ho(e,rc)}function ho(e,t){const n=gi();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:g,setScopeId:b=Be,insertStaticContent:S}=e,_=(u,d,y,T=null,w=null,E=null,P=void 0,O=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!dt(u,d)&&(T=ln(u),De(u,w,E,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:C,ref:B,shapeFlag:L}=d;switch(C){case mt:k(u,d,y,T);break;case ye:N(u,d,y,T);break;case Bt:u==null&&j(d,y,T,P);break;case Se:x(u,d,y,T,w,E,P,O,A);break;default:L&1?M(u,d,y,T,w,E,P,O,A):L&6?W(u,d,y,T,w,E,P,O,A):(L&64||L&128)&&C.process(u,d,y,T,w,E,P,O,A,bt)}B!=null&&w&&Nn(B,u&&u.ref,E,d||u,!d)},k=(u,d,y,T)=>{if(u==null)s(d.el=l(d.children),y,T);else{const w=d.el=u.el;d.children!==u.children&&f(w,d.children)}},N=(u,d,y,T)=>{u==null?s(d.el=c(d.children||""),y,T):d.el=u.el},j=(u,d,y,T)=>{[u.el,u.anchor]=S(u.children,d,y,T,u.el,u.anchor)},p=({el:u,anchor:d},y,T)=>{let w;for(;u&&u!==d;)w=g(u),s(u,y,T),u=w;s(d,y,T)},m=({el:u,anchor:d})=>{let y;for(;u&&u!==d;)y=g(u),r(u),u=y;r(d)},M=(u,d,y,T,w,E,P,O,A)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),u==null?F(d,y,T,w,E,P,O,A):R(u,d,w,E,P,O,A)},F=(u,d,y,T,w,E,P,O)=>{let A,C;const{props:B,shapeFlag:L,transition:H,dirs:G}=u;if(A=u.el=o(u.type,E,B&&B.is,B),L&8?a(A,u.children):L&16&&V(u.children,A,null,T,w,cs(u,E),P,O),G&&Ue(u,null,T,"created"),$(A,u,u.scopeId,P,T),B){for(const ee in B)ee!=="value"&&!At(ee)&&i(A,ee,null,B[ee],E,T);"value"in B&&i(A,"value",null,B.value,E),(C=B.onVnodeBeforeMount)&&Oe(C,T,u)}G&&Ue(u,null,T,"beforeMount");const X=po(w,H);X&&H.beforeEnter(A),s(A,d,y),((C=B&&B.onVnodeMounted)||X||G)&&Ee(()=>{C&&Oe(C,T,u),X&&H.enter(A),G&&Ue(u,null,T,"mounted")},w)},$=(u,d,y,T,w)=>{if(y&&b(u,y),T)for(let E=0;E{for(let C=A;C{const O=d.el=u.el;let{patchFlag:A,dynamicChildren:C,dirs:B}=d;A|=u.patchFlag&16;const L=u.props||Z,H=d.props||Z;let G;if(y&&ct(y,!1),(G=H.onVnodeBeforeUpdate)&&Oe(G,y,d,u),B&&Ue(d,u,y,"beforeUpdate"),y&&ct(y,!0),(L.innerHTML&&H.innerHTML==null||L.textContent&&H.textContent==null)&&a(O,""),C?v(u.dynamicChildren,C,O,y,T,cs(d,w),E):P||D(u,d,O,null,y,T,cs(d,w),E,!1),A>0){if(A&16)I(O,L,H,y,w);else if(A&2&&L.class!==H.class&&i(O,"class",null,H.class,w),A&4&&i(O,"style",L.style,H.style,w),A&8){const X=d.dynamicProps;for(let ee=0;ee{G&&Oe(G,y,d,u),B&&Ue(d,u,y,"updated")},T)},v=(u,d,y,T,w,E,P)=>{for(let O=0;O{if(d!==y){if(d!==Z)for(const E in d)!At(E)&&!(E in y)&&i(u,E,d[E],null,w,T);for(const E in y){if(At(E))continue;const P=y[E],O=d[E];P!==O&&E!=="value"&&i(u,E,O,P,w,T)}"value"in y&&i(u,"value",d.value,y.value,w)}},x=(u,d,y,T,w,E,P,O,A)=>{const C=d.el=u?u.el:l(""),B=d.anchor=u?u.anchor:l("");let{patchFlag:L,dynamicChildren:H,slotScopeIds:G}=d;G&&(O=O?O.concat(G):G),u==null?(s(C,y,T),s(B,y,T),V(d.children||[],y,B,w,E,P,O,A)):L>0&&L&64&&H&&u.dynamicChildren?(v(u.dynamicChildren,H,y,w,E,P,O),(d.key!=null||w&&d===w.subTree)&&nr(u,d,!0)):D(u,d,y,B,w,E,P,O,A)},W=(u,d,y,T,w,E,P,O,A)=>{d.slotScopeIds=O,u==null?d.shapeFlag&512?w.ctx.activate(d,y,T,P,A):se(d,y,T,w,E,P,A):ce(u,d,A)},se=(u,d,y,T,w,E,P)=>{const O=u.component=zc(u,T,w);if(nn(u)&&(O.ctx.renderer=bt),Qc(O,!1,P),O.asyncDep){if(w&&w.registerDep(O,U,P),!u.el){const A=O.subTree=le(ye);N(null,A,d,y)}}else U(O,u,d,y,w,E,P)},ce=(u,d,y)=>{const T=d.component=u.component;if(kc(u,d,y))if(T.asyncDep&&!T.asyncResolved){Y(T,d,y);return}else T.next=d,T.update();else d.el=u.el,T.vnode=d},U=(u,d,y,T,w,E,P)=>{const O=()=>{if(u.isMounted){let{next:L,bu:H,u:G,parent:X,vnode:ee}=u;{const Te=go(u);if(Te){L&&(L.el=ee.el,Y(u,L,P)),Te.asyncDep.then(()=>{u.isUnmounted||O()});return}}let Q=L,xe;ct(u,!1),L?(L.el=ee.el,Y(u,L,P)):L=ee,H&&En(H),(xe=L.props&&L.props.onVnodeBeforeUpdate)&&Oe(xe,X,L,ee),ct(u,!0);const pe=as(u),Ie=u.subTree;u.subTree=pe,_(Ie,pe,h(Ie.el),ln(Ie),u,w,E),L.el=pe.el,Q===null&&Wc(u,pe.el),G&&Ee(G,w),(xe=L.props&&L.props.onVnodeUpdated)&&Ee(()=>Oe(xe,X,L,ee),w)}else{let L;const{el:H,props:G}=d,{bm:X,m:ee,parent:Q,root:xe,type:pe}=u,Ie=gt(d);if(ct(u,!1),X&&En(X),!Ie&&(L=G&&G.onVnodeBeforeMount)&&Oe(L,Q,d),ct(u,!0),H&&es){const Te=()=>{u.subTree=as(u),es(H,u.subTree,u,w,null)};Ie&&pe.__asyncHydrate?pe.__asyncHydrate(H,u,Te):Te()}else{xe.ce&&xe.ce._injectChildStyle(pe);const Te=u.subTree=as(u);_(null,Te,y,T,u,w,E),d.el=Te.el}if(ee&&Ee(ee,w),!Ie&&(L=G&&G.onVnodeMounted)){const Te=d;Ee(()=>Oe(L,Q,Te),w)}(d.shapeFlag&256||Q&>(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&Ee(u.a,w),u.isMounted=!0,d=y=T=null}};u.scope.on();const A=u.effect=new _i(O);u.scope.off();const C=u.update=A.run.bind(A),B=u.job=A.runIfDirty.bind(A);B.i=u,B.id=u.uid,A.scheduler=()=>zs(B),ct(u,!0),C()},Y=(u,d,y)=>{d.component=u;const T=u.vnode.props;u.vnode=d,u.next=null,Rc(u,d.props,T,y),Lc(u,d.children,y),it(),br(u),ot()},D=(u,d,y,T,w,E,P,O,A=!1)=>{const C=u&&u.children,B=u?u.shapeFlag:0,L=d.children,{patchFlag:H,shapeFlag:G}=d;if(H>0){if(H&128){on(C,L,y,T,w,E,P,O,A);return}else if(H&256){he(C,L,y,T,w,E,P,O,A);return}}G&8?(B&16&&It(C,w,E),L!==C&&a(y,L)):B&16?G&16?on(C,L,y,T,w,E,P,O,A):It(C,w,E,!0):(B&8&&a(y,""),G&16&&V(L,y,T,w,E,P,O,A))},he=(u,d,y,T,w,E,P,O,A)=>{u=u||Tt,d=d||Tt;const C=u.length,B=d.length,L=Math.min(C,B);let H;for(H=0;HB?It(u,w,E,!0,!1,L):V(d,y,T,w,E,P,O,A,L)},on=(u,d,y,T,w,E,P,O,A)=>{let C=0;const B=d.length;let L=u.length-1,H=B-1;for(;C<=L&&C<=H;){const G=u[C],X=d[C]=A?et(d[C]):Me(d[C]);if(dt(G,X))_(G,X,y,null,w,E,P,O,A);else break;C++}for(;C<=L&&C<=H;){const G=u[L],X=d[H]=A?et(d[H]):Me(d[H]);if(dt(G,X))_(G,X,y,null,w,E,P,O,A);else break;L--,H--}if(C>L){if(C<=H){const G=H+1,X=GH)for(;C<=L;)De(u[C],w,E,!0),C++;else{const G=C,X=C,ee=new Map;for(C=X;C<=H;C++){const Ce=d[C]=A?et(d[C]):Me(d[C]);Ce.key!=null&&ee.set(Ce.key,C)}let Q,xe=0;const pe=H-X+1;let Ie=!1,Te=0;const Nt=new Array(pe);for(C=0;C=pe){De(Ce,w,E,!0);continue}let je;if(Ce.key!=null)je=ee.get(Ce.key);else for(Q=X;Q<=H;Q++)if(Nt[Q-X]===0&&dt(Ce,d[Q])){je=Q;break}je===void 0?De(Ce,w,E,!0):(Nt[je-X]=C+1,je>=Te?Te=je:Ie=!0,_(Ce,d[je],y,null,w,E,P,O,A),xe++)}const fr=Ie?Fc(Nt):Tt;for(Q=fr.length-1,C=pe-1;C>=0;C--){const Ce=X+C,je=d[Ce],ur=Ce+1{const{el:E,type:P,transition:O,children:A,shapeFlag:C}=u;if(C&6){lt(u.component.subTree,d,y,T);return}if(C&128){u.suspense.move(d,y,T);return}if(C&64){P.move(u,d,y,bt);return}if(P===Se){s(E,d,y);for(let L=0;LO.enter(E),w);else{const{leave:L,delayLeave:H,afterLeave:G}=O,X=()=>s(E,d,y),ee=()=>{L(E,()=>{X(),G&&G()})};H?H(E,X,ee):ee()}else s(E,d,y)},De=(u,d,y,T=!1,w=!1)=>{const{type:E,props:P,ref:O,children:A,dynamicChildren:C,shapeFlag:B,patchFlag:L,dirs:H,cacheIndex:G}=u;if(L===-2&&(w=!1),O!=null&&Nn(O,null,y,u,!0),G!=null&&(d.renderCache[G]=void 0),B&256){d.ctx.deactivate(u);return}const X=B&1&&H,ee=!gt(u);let Q;if(ee&&(Q=P&&P.onVnodeBeforeUnmount)&&Oe(Q,d,u),B&6)Xo(u.component,y,T);else{if(B&128){u.suspense.unmount(y,T);return}X&&Ue(u,null,d,"beforeUnmount"),B&64?u.type.remove(u,d,y,bt,T):C&&!C.hasOnce&&(E!==Se||L>0&&L&64)?It(C,d,y,!1,!0):(E===Se&&L&384||!w&&B&16)&&It(A,d,y),T&&cr(u)}(ee&&(Q=P&&P.onVnodeUnmounted)||X)&&Ee(()=>{Q&&Oe(Q,d,u),X&&Ue(u,null,d,"unmounted")},y)},cr=u=>{const{type:d,el:y,anchor:T,transition:w}=u;if(d===Se){Yo(y,T);return}if(d===Bt){m(u);return}const E=()=>{r(y),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(u.shapeFlag&1&&w&&!w.persisted){const{leave:P,delayLeave:O}=w,A=()=>P(y,E);O?O(u.el,E,A):A()}else E()},Yo=(u,d)=>{let y;for(;u!==d;)y=g(u),r(u),u=y;r(d)},Xo=(u,d,y)=>{const{bum:T,scope:w,job:E,subTree:P,um:O,m:A,a:C}=u;Pr(A),Pr(C),T&&En(T),w.stop(),E&&(E.flags|=8,De(P,u,d,y)),O&&Ee(O,d),Ee(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},It=(u,d,y,T=!1,w=!1,E=0)=>{for(let P=E;P{if(u.shapeFlag&6)return ln(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=g(u.anchor||u.el),y=d&&d[Ui];return y?g(y):d};let Qn=!1;const ar=(u,d,y)=>{u==null?d._vnode&&De(d._vnode,null,null,!0):_(d._vnode||null,u,d,null,null,null,y),d._vnode=u,Qn||(Qn=!0,br(),Ln(),Qn=!1)},bt={p:_,um:De,m:lt,r:cr,mt:se,mc:V,pc:D,pbc:v,n:ln,o:e};let Zn,es;return t&&([Zn,es]=t(bt)),{render:ar,hydrate:Zn,createApp:Tc(ar,Zn)}}function cs({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ct({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function po(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function nr(e,t,n=!1){const s=e.children,r=t.children;if(K(s)&&K(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function go(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:go(t)}function Pr(e){if(e)for(let t=0;tMt(Hc);function sr(e,t){return Yn(e,null,t)}function Vf(e,t){return Yn(e,null,{flush:"post"})}function Fe(e,t,n){return Yn(e,t,n)}function Yn(e,t,n=Z){const{immediate:s,deep:r,flush:i,once:o}=n,l=fe({},n);let c;if(rn)if(i==="sync"){const g=$c();c=g.__watcherHandles||(g.__watcherHandles=[])}else if(!t||s)l.once=!0;else{const g=()=>{};return g.stop=Be,g.resume=Be,g.pause=Be,g}const f=ue;l.call=(g,b,S)=>He(g,f,b,S);let a=!1;i==="post"?l.scheduler=g=>{Ee(g,f&&f.suspense)}:i!=="sync"&&(a=!0,l.scheduler=(g,b)=>{b?g():zs(g)}),l.augmentJob=g=>{t&&(g.flags|=4),a&&(g.flags|=2,f&&(g.id=f.uid,g.i=f))};const h=Kl(e,t,l);return c&&c.push(h),h}function Dc(e,t,n){const s=this.proxy,r=re(e)?e.includes(".")?mo(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=sn(this),l=Yn(r,i.bind(s),n);return o(),l}function mo(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Le(t)}Modifiers`]||e[`${rt(t)}Modifiers`];function Vc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Z;let r=n;const i=t.startsWith("update:"),o=i&&jc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>re(a)?a.trim():a)),o.number&&(r=n.map(Ss)));let l,c=s[l=Sn(t)]||s[l=Sn(Le(t))];!c&&i&&(c=s[l=Sn(rt(t))]),c&&He(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,He(f,e,6,r)}}function yo(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=f=>{const a=yo(f,t,!0);a&&(l=!0,fe(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ne(e)&&s.set(e,null),null):(K(i)?i.forEach(c=>o[c]=null):fe(o,i),ne(e)&&s.set(e,o),o)}function Xn(e,t){return!e||!Zt(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,rt(t))||z(e,t))}function as(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:g,setupState:b,ctx:S,inheritAttrs:_}=e,k=In(e);let N,j;try{if(n.shapeFlag&4){const m=r||s,M=m;N=Me(f.call(M,m,a,h,b,g,S)),j=l}else{const m=t;N=Me(m.length>1?m(h,{attrs:l,slots:o,emit:c}):m(h,null)),j=t.props?l:Uc(l)}}catch(m){kt.length=0,tn(m,e,1),N=le(ye)}let p=N;if(j&&_!==!1){const m=Object.keys(j),{shapeFlag:M}=p;m.length&&M&7&&(i&&m.some($s)&&(j=Bc(j,i)),p=nt(p,j,!1,!0))}return n.dirs&&(p=nt(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Yt(p,n.transition),N=p,In(k),N}const Uc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Zt(n))&&((t||(t={}))[n]=e[n]);return t},Bc=(e,t)=>{const n={};for(const s in e)(!$s(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function kc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Lr(s,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function bo(e,t){t&&t.pendingBranch?K(e)?t.effects.push(...e):t.effects.push(e):Yl(e)}const Se=Symbol.for("v-fgt"),mt=Symbol.for("v-txt"),ye=Symbol.for("v-cmt"),Bt=Symbol.for("v-stc"),kt=[];let Ae=null;function Ps(e=!1){kt.push(Ae=e?null:[])}function Kc(){kt.pop(),Ae=kt[kt.length-1]||null}let Xt=1;function Ir(e){Xt+=e,e<0&&Ae&&(Ae.hasOnce=!0)}function _o(e){return e.dynamicChildren=Xt>0?Ae||Tt:null,Kc(),Xt>0&&Ae&&Ae.push(e),e}function Uf(e,t,n,s,r,i){return _o(So(e,t,n,s,r,i,!0))}function Ls(e,t,n,s,r){return _o(le(e,t,n,s,r,!0))}function Jt(e){return e?e.__v_isVNode===!0:!1}function dt(e,t){return e.type===t.type&&e.key===t.key}const wo=({key:e})=>e??null,Cn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||ae(e)||q(e)?{i:de,r:e,k:t,f:!!n}:e:null);function So(e,t=null,n=null,s=0,r=null,i=e===Se?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&wo(t),ref:t&&Cn(t),scopeId:Vi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:de};return l?(rr(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),Xt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const le=qc;function qc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Qi)&&(e=ye),Jt(e)){const l=nt(e,t,!0);return n&&rr(l,n),Xt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(na(e)&&(e=e.__vccOpts),t){t=Gc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=Us(l)),ne(c)&&(Ys(c)&&!K(c)&&(c=fe({},c)),t.style=Vs(c))}const o=re(e)?1:vo(e)?128:Bi(e)?64:ne(e)?4:q(e)?2:0;return So(e,t,n,s,r,o,i,!0)}function Gc(e){return e?Ys(e)||io(e)?fe({},e):e:null}function nt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?Yc(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&wo(f),ref:t&&t.ref?n&&i?K(i)?i.concat(Cn(t)):[i,Cn(t)]:Cn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Se?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Yt(a,c.clone(a)),a}function Eo(e=" ",t=0){return le(mt,null,e,t)}function Bf(e,t){const n=le(Bt,null,e);return n.staticCount=t,n}function kf(e="",t=!1){return t?(Ps(),Ls(ye,null,e)):le(ye,null,e)}function Me(e){return e==null||typeof e=="boolean"?le(ye):K(e)?le(Se,null,e.slice()):Jt(e)?et(e):le(mt,null,String(e))}function et(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function rr(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(K(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),rr(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!io(t)?t._ctx=de:r===3&&de&&(de.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:de},n=32):(t=String(t),s&64?(n=16,t=[Eo(t)]):n=8);e.children=t,e.shapeFlag|=n}function Yc(...e){const t={};for(let n=0;nue||de;let Hn,Is;{const e=gi(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Hn=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Is=t("__VUE_SSR_SETTERS__",n=>rn=n)}const sn=e=>{const t=ue;return Hn(e),e.scope.on(),()=>{e.scope.off(),Hn(t)}},Nr=()=>{ue&&ue.scope.off(),Hn(null)};function xo(e){return e.vnode.shapeFlag&4}let rn=!1;function Qc(e,t=!1,n=!1){t&&Is(t);const{props:s,children:r}=e.vnode,i=xo(e);Ac(e,s,i,t),Pc(e,r,n);const o=i?Zc(e,t):void 0;return t&&Is(!1),o}function Zc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,yc);const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Co(e):null,i=sn(e);it();const o=en(s,e,0,[e.props,r]);if(ot(),i(),ui(o)){if(gt(e)||Zs(e),o.then(Nr,Nr),t)return o.then(l=>{Fr(e,l,t)}).catch(l=>{tn(l,e,0)});e.asyncDep=o}else Fr(e,o,t)}else To(e,t)}function Fr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Hi(t)),To(e,n)}let Hr;function To(e,t,n){const s=e.type;if(!e.render){if(!t&&Hr&&!s.render){const r=s.template||er(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=fe(fe({isCustomElement:i,delimiters:l},o),c);s.render=Hr(r,f)}}e.render=s.render||Be}{const r=sn(e);it();try{bc(e)}finally{ot(),r()}}}const ea={get(e,t){return ve(e,"get",""),e[t]}};function Co(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,ea),slots:e.slots,emit:e.emit,expose:t}}function zn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Hi(xn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ut)return Ut[n](e)},has(t,n){return n in t||n in Ut}})):e.proxy}function ta(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function na(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>kl(e,t,rn);function Ns(e,t,n){const s=arguments.length;return s===2?ne(t)&&!K(t)?Jt(t)?le(e,null,[t]):le(e,t):le(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Jt(n)&&(n=[n]),le(e,t,n))}const sa="3.5.11";/** +* @vue/runtime-dom v3.5.11 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Fs;const $r=typeof window<"u"&&window.trustedTypes;if($r)try{Fs=$r.createPolicy("vue",{createHTML:e=>e})}catch{}const Ao=Fs?e=>Fs.createHTML(e):e=>e,ra="http://www.w3.org/2000/svg",ia="http://www.w3.org/1998/Math/MathML",Ke=typeof document<"u"?document:null,Dr=Ke&&Ke.createElement("template"),oa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Ke.createElementNS(ra,e):t==="mathml"?Ke.createElementNS(ia,e):n?Ke.createElement(e,{is:n}):Ke.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ke.createTextNode(e),createComment:e=>Ke.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ke.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Dr.innerHTML=Ao(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Dr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Je="transition",Ht="animation",zt=Symbol("_vtc"),Ro={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},la=fe({},Wi,Ro),ca=e=>(e.displayName="Transition",e.props=la,e),Wf=ca((e,{slots:t})=>Ns(tc,aa(e),t)),at=(e,t=[])=>{K(e)?e.forEach(n=>n(...t)):e&&e(...t)},jr=e=>e?K(e)?e.some(t=>t.length>1):e.length>1:!1;function aa(e){const t={};for(const x in e)x in Ro||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:b=`${n}-leave-to`}=e,S=fa(r),_=S&&S[0],k=S&&S[1],{onBeforeEnter:N,onEnter:j,onEnterCancelled:p,onLeave:m,onLeaveCancelled:M,onBeforeAppear:F=N,onAppear:$=j,onAppearCancelled:V=p}=t,R=(x,W,se)=>{ft(x,W?a:l),ft(x,W?f:o),se&&se()},v=(x,W)=>{x._isLeaving=!1,ft(x,h),ft(x,b),ft(x,g),W&&W()},I=x=>(W,se)=>{const ce=x?$:j,U=()=>R(W,x,se);at(ce,[W,U]),Vr(()=>{ft(W,x?c:i),ze(W,x?a:l),jr(ce)||Ur(W,s,_,U)})};return fe(t,{onBeforeEnter(x){at(N,[x]),ze(x,i),ze(x,o)},onBeforeAppear(x){at(F,[x]),ze(x,c),ze(x,f)},onEnter:I(!1),onAppear:I(!0),onLeave(x,W){x._isLeaving=!0;const se=()=>v(x,W);ze(x,h),ze(x,g),ha(),Vr(()=>{x._isLeaving&&(ft(x,h),ze(x,b),jr(m)||Ur(x,s,k,se))}),at(m,[x,se])},onEnterCancelled(x){R(x,!1),at(p,[x])},onAppearCancelled(x){R(x,!0),at(V,[x])},onLeaveCancelled(x){v(x),at(M,[x])}})}function fa(e){if(e==null)return null;if(ne(e))return[fs(e.enter),fs(e.leave)];{const t=fs(e);return[t,t]}}function fs(e){return tl(e)}function ze(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[zt]||(e[zt]=new Set)).add(t)}function ft(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[zt];n&&(n.delete(t),n.size||(e[zt]=void 0))}function Vr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ua=0;function Ur(e,t,n,s){const r=e._endId=++ua,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=da(e,t);if(!o)return s();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,g),i()},g=b=>{b.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[S]||"").split(", "),r=s(`${Je}Delay`),i=s(`${Je}Duration`),o=Br(r,i),l=s(`${Ht}Delay`),c=s(`${Ht}Duration`),f=Br(l,c);let a=null,h=0,g=0;t===Je?o>0&&(a=Je,h=o,g=i.length):t===Ht?f>0&&(a=Ht,h=f,g=c.length):(h=Math.max(o,f),a=h>0?o>f?Je:Ht:null,g=a?a===Je?i.length:c.length:0);const b=a===Je&&/\b(transform|all)(,|$)/.test(s(`${Je}Property`).toString());return{type:a,timeout:h,propCount:g,hasTransform:b}}function Br(e,t){for(;e.lengthkr(n)+kr(e[s])))}function kr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function ha(){return document.body.offsetHeight}function pa(e,t,n){const s=e[zt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Wr=Symbol("_vod"),ga=Symbol("_vsh"),ma=Symbol(""),ya=/(^|;)\s*display\s*:/;function va(e,t,n){const s=e.style,r=re(n);let i=!1;if(n&&!r){if(t)if(re(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&An(s,l,"")}else for(const o in t)n[o]==null&&An(s,o,"");for(const o in n)o==="display"&&(i=!0),An(s,o,n[o])}else if(r){if(t!==n){const o=s[ma];o&&(n+=";"+o),s.cssText=n,i=ya.test(n)}}else t&&e.removeAttribute("style");Wr in e&&(e[Wr]=i?s.display:"",e[ga]&&(s.display="none"))}const Kr=/\s*!important$/;function An(e,t,n){if(K(n))n.forEach(s=>An(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ba(e,t);Kr.test(n)?e.setProperty(rt(s),n.replace(Kr,""),"important"):e[s]=n}}const qr=["Webkit","Moz","ms"],us={};function ba(e,t){const n=us[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return us[t]=s;s=jn(s);for(let r=0;rds||(Ea.then(()=>ds=0),ds=Date.now());function Ta(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;He(Ca(s,n.value),t,5,[s])};return n.value=e,n.attached=xa(),n}function Ca(e,t){if(K(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Qr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Aa=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?pa(e,s,o):t==="style"?va(e,n,s):Zt(t)?$s(t)||wa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ra(e,t,s,o))?(Xr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Yr(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!re(s))?Xr(e,Le(t),s):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Yr(e,t,s,o))};function Ra(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Qr(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Qr(t)&&re(n)?!1:t in e}const Zr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return K(t)?n=>En(t,n):t};function Oa(e){e.target.composing=!0}function ei(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const hs=Symbol("_assign"),Kf={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[hs]=Zr(r);const i=s||r.props&&r.props.type==="number";Et(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Ss(l)),e[hs](l)}),n&&Et(e,"change",()=>{e.value=e.value.trim()}),t||(Et(e,"compositionstart",Oa),Et(e,"compositionend",ei),Et(e,"change",ei))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[hs]=Zr(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Ss(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},Ma=["ctrl","shift","alt","meta"],Pa={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ma.some(n=>e[`${n}Key`]&&!t.includes(n))},qf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=rt(r.key);if(t.some(o=>o===i||La[o]===i))return e(r)})},Oo=fe({patchProp:Aa},oa);let Wt,ti=!1;function Ia(){return Wt||(Wt=Ic(Oo))}function Na(){return Wt=ti?Wt:Nc(Oo),ti=!0,Wt}const Yf=(...e)=>{const t=Ia().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Po(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Mo(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},Xf=(...e)=>{const t=Na().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Po(s);if(r)return n(r,!0,Mo(r))},t};function Mo(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Po(e){return re(e)?document.querySelector(e):e}const Jf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Fa=window.__VP_SITE_DATA__;function ir(e){return bi()?(fl(e),!0):!1}function ke(e){return typeof e=="function"?e():Fi(e)}const Lo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const zf=e=>e!=null,Ha=Object.prototype.toString,$a=e=>Ha.call(e)==="[object Object]",Qt=()=>{},ni=Da();function Da(){var e,t;return Lo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ja(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Io=e=>e();function Va(e,t={}){let n,s,r=Qt;const i=l=>{clearTimeout(l),r(),r=Qt};return l=>{const c=ke(e),f=ke(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(s&&(i(s),s=null),Promise.resolve(l())):new Promise((a,h)=>{r=t.rejectOnCancel?h:a,f&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,a(l())},f)),n=setTimeout(()=>{s&&i(s),s=null,a(l())},c)})}}function Ua(e=Io){const t=oe(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:Wn(t),pause:n,resume:s,eventFilter:r}}function Ba(e){return Jn()}function No(...e){if(e.length!==1)return Vl(...e);const t=e[0];return typeof t=="function"?Wn($l(()=>({get:t,set:Qt}))):oe(t)}function Fo(e,t,n={}){const{eventFilter:s=Io,...r}=n;return Fe(e,ja(s,t),r)}function ka(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Ua(s);return{stop:Fo(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function or(e,t=!0,n){Ba()?Lt(e,n):t?e():Kn(e)}function Qf(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Fo(e,t,{...i,eventFilter:Va(s,{maxWait:r})})}function Zf(e,t,n){let s;ae(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=Qt}=s,c=oe(!r),f=o?Js(t):oe(t);let a=0;return sr(async h=>{if(!c.value)return;a++;const g=a;let b=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const S=await e(_=>{h(()=>{i&&(i.value=!1),b||_()})});g===a&&(f.value=S)}catch(S){l(S)}finally{i&&g===a&&(i.value=!1),b=!0}}),r?ie(()=>(c.value=!0,f.value)):f}const $e=Lo?window:void 0;function Ho(e){var t;const n=ke(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Pt(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=$e):[t,n,s,r]=e,!t)return Qt;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,g,b)=>(a.addEventListener(h,g,b),()=>a.removeEventListener(h,g,b)),c=Fe(()=>[Ho(t),ke(r)],([a,h])=>{if(o(),!a)return;const g=$a(h)?{...h}:h;i.push(...n.flatMap(b=>s.map(S=>l(a,b,S,g))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return ir(f),f}function Wa(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function eu(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=$e,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=Wa(t);return Pt(r,i,a=>{a.repeat&&ke(l)||c(a)&&n(a)},o)}function Ka(){const e=oe(!1),t=Jn();return t&&Lt(()=>{e.value=!0},t),e}function qa(e){const t=Ka();return ie(()=>(t.value,!!e()))}function $o(e,t={}){const{window:n=$e}=t,s=qa(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=oe(!1),o=f=>{i.value=f.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=sr(()=>{s.value&&(l(),r=n.matchMedia(ke(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return ir(()=>{c(),l(),r=void 0}),i}const vn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},bn="__vueuse_ssr_handlers__",Ga=Ya();function Ya(){return bn in vn||(vn[bn]=vn[bn]||{}),vn[bn]}function Do(e,t){return Ga[e]||t}function jo(e){return $o("(prefers-color-scheme: dark)",e)}function Xa(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Ja={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},si="vueuse-storage";function lr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=$e,eventFilter:g,onError:b=v=>{console.error(v)},initOnMounted:S}=s,_=(a?Js:oe)(typeof t=="function"?t():t);if(!n)try{n=Do("getDefaultStorage",()=>{var v;return(v=$e)==null?void 0:v.localStorage})()}catch(v){b(v)}if(!n)return _;const k=ke(t),N=Xa(k),j=(r=s.serializer)!=null?r:Ja[N],{pause:p,resume:m}=ka(_,()=>F(_.value),{flush:i,deep:o,eventFilter:g});h&&l&&or(()=>{n instanceof Storage?Pt(h,"storage",V):Pt(h,si,R),S&&V()}),S||V();function M(v,I){if(h){const x={key:e,oldValue:v,newValue:I,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",x):new CustomEvent(si,{detail:x}))}}function F(v){try{const I=n.getItem(e);if(v==null)M(I,null),n.removeItem(e);else{const x=j.write(v);I!==x&&(n.setItem(e,x),M(I,x))}}catch(I){b(I)}}function $(v){const I=v?v.newValue:n.getItem(e);if(I==null)return c&&k!=null&&n.setItem(e,j.write(k)),k;if(!v&&f){const x=j.read(I);return typeof f=="function"?f(x,k):N==="object"&&!Array.isArray(x)?{...k,...x}:x}else return typeof I!="string"?I:j.read(I)}function V(v){if(!(v&&v.storageArea!==n)){if(v&&v.key==null){_.value=k;return}if(!(v&&v.key!==e)){p();try{(v==null?void 0:v.newValue)!==j.write(_.value)&&(_.value=$(v))}catch(I){b(I)}finally{v?Kn(m):m()}}}}function R(v){V(v.detail)}return _}const za="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Qa(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=$e,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},g=jo({window:r}),b=ie(()=>g.value?"dark":"light"),S=c||(o==null?No(s):lr(o,s,i,{window:r,listenToStorageChanges:l})),_=ie(()=>S.value==="auto"?b.value:S.value),k=Do("updateHTMLAttrs",(m,M,F)=>{const $=typeof m=="string"?r==null?void 0:r.document.querySelector(m):Ho(m);if(!$)return;const V=new Set,R=new Set;let v=null;if(M==="class"){const x=F.split(/\s/g);Object.values(h).flatMap(W=>(W||"").split(/\s/g)).filter(Boolean).forEach(W=>{x.includes(W)?V.add(W):R.add(W)})}else v={key:M,value:F};if(V.size===0&&R.size===0&&v===null)return;let I;a&&(I=r.document.createElement("style"),I.appendChild(document.createTextNode(za)),r.document.head.appendChild(I));for(const x of V)$.classList.add(x);for(const x of R)$.classList.remove(x);v&&$.setAttribute(v.key,v.value),a&&(r.getComputedStyle(I).opacity,document.head.removeChild(I))});function N(m){var M;k(t,n,(M=h[m])!=null?M:m)}function j(m){e.onChanged?e.onChanged(m,N):N(m)}Fe(_,j,{flush:"post",immediate:!0}),or(()=>j(_.value));const p=ie({get(){return f?S.value:_.value},set(m){S.value=m}});try{return Object.assign(p,{store:S,system:b,state:_})}catch{return p}}function Za(e={}){const{valueDark:t="dark",valueLight:n="",window:s=$e}=e,r=Qa({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=ie(()=>r.system?r.system.value:jo({window:s}).value?"dark":"light");return ie({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}function ps(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function tu(e,t,n={}){const{window:s=$e}=n;return lr(e,t,s==null?void 0:s.localStorage,n)}function Vo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const gs=new WeakMap;function nu(e,t=!1){const n=oe(t);let s=null,r="";Fe(No(e),l=>{const c=ps(ke(l));if(c){const f=c;if(gs.get(f)||gs.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(r=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=ps(ke(e));!l||n.value||(ni&&(s=Pt(l,"touchmove",c=>{ef(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=ps(ke(e));!l||!n.value||(ni&&(s==null||s()),l.style.overflow=r,gs.delete(l),n.value=!1)};return ir(o),ie({get(){return n.value},set(l){l?i():o()}})}function su(e,t,n={}){const{window:s=$e}=n;return lr(e,t,s==null?void 0:s.sessionStorage,n)}function ru(e={}){const{window:t=$e,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const s=oe(t.scrollX),r=oe(t.scrollY),i=ie({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),o=ie({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return Pt(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function iu(e={}){const{window:t=$e,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=oe(n),c=oe(s),f=()=>{t&&(o==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(f(),or(f),Pt("resize",f,{passive:!0}),r){const a=$o("(orientation: portrait)");Fe(a,()=>f())}return{width:l,height:c}}const ms={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var ys={};const Uo=/^(?:[a-z]+:|\/\/)/i,tf="vitepress-theme-appearance",nf=/#.*$/,sf=/[?#].*$/,rf=/(?:(^|\/)index)?\.(?:md|html)$/,ge=typeof document<"u",Bo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function of(e,t,n=!1){if(t===void 0)return!1;if(e=ri(`/${e}`),n)return new RegExp(t).test(e);if(ri(t)!==e)return!1;const s=t.match(nf);return s?(ge?location.hash:"")===s[0]:!0}function ri(e){return decodeURI(e).replace(sf,"").replace(rf,"$1")}function lf(e){return Uo.test(e)}function cf(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!lf(n)&&of(t,`/${n}/`,!0))||"root"}function af(e,t){var s,r,i,o,l,c,f;const n=cf(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Wo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function ko(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=ff(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function ff(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function uf(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Wo(e,t){return[...e.filter(n=>!uf(t,n)),...t]}const df=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,hf=/^[a-z]:/i;function ii(e){const t=hf.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(df,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const vs=new Set;function pf(e){if(vs.size===0){const n=typeof process=="object"&&(ys==null?void 0:ys.VITE_EXTRA_EXTENSIONS)||(ms==null?void 0:ms.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>vs.add(s))}const t=e.split(".").pop();return t==null||!vs.has(t.toLowerCase())}function ou(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const gf=Symbol(),yt=Js(Fa);function lu(e){const t=ie(()=>af(yt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?oe(!0):n?Za({storageKey:tf,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),r=oe(ge?location.hash:"");return ge&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Fe(()=>e.data,()=>{r.value=ge?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>ko(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function mf(){const e=Mt(gf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function yf(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function oi(e){return Uo.test(e)||!e.startsWith("/")?e:yf(yt.value.base,e)}function vf(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ge){const n="/";t=ii(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${ii(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Rn=[];function cu(e){Rn.push(e),Gn(()=>{Rn=Rn.filter(t=>t!==e)})}function bf(){let e=yt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=li(e,n);else if(Array.isArray(e))for(const s of e){const r=li(s,n);if(r){t=r;break}}return t}function li(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const _f=Symbol(),Ko="http://a.com",wf=()=>({path:"/",component:null,data:Bo});function au(e,t){const n=kn(wf()),s={route:n,go:r};async function r(l=ge?location.href:"/"){var c,f;l=bs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ge&&l!==bs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l)))}let i=null;async function o(l,c=0,f=!1){var g,b;if(await((g=s.onBeforePageLoad)==null?void 0:g.call(s,l))===!1)return;const a=new URL(l,Ko),h=i=a.pathname;try{let S=await e(h);if(!S)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:_,__pageData:k}=S;if(!_)throw new Error(`Invalid route component: ${_}`);await((b=s.onAfterPageLoad)==null?void 0:b.call(s,l)),n.path=ge?h:oi(h),n.component=xn(_),n.data=xn(k),ge&&Kn(()=>{let N=yt.value.base+k.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!yt.value.cleanUrls&&!N.endsWith("/")&&(N+=".html"),N!==a.pathname&&(a.pathname=N,l=N+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let j=null;try{j=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(j){ci(j,a.hash);return}}window.scrollTo(0,c)})}}catch(S){if(!/fetch|Page not found/.test(S.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(S),!f)try{const _=await fetch(yt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await _.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=ge?h:oi(h),n.component=t?xn(t):null;const _=ge?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...Bo,relativePath:_}}}}return ge&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const f=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(f==null)return;const{href:a,origin:h,pathname:g,hash:b,search:S}=new URL(f,c.baseURI),_=new URL(location.href);h===_.origin&&pf(g)&&(l.preventDefault(),g===_.pathname&&S===_.search?(b!==_.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:_.href,newURL:a}))),b?ci(c,b,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(bs(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Sf(){const e=Mt(_f);if(!e)throw new Error("useRouter() is called without provider.");return e}function qo(){return Sf().route}function ci(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-bf()+i;requestAnimationFrame(r)}}function bs(e){const t=new URL(e,Ko);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),yt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const _n=()=>Rn.forEach(e=>e()),fu=Qs({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=qo(),{frontmatter:n,site:s}=mf();return Fe(n,_n,{deep:!0,flush:"post"}),()=>Ns(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Ns(t.component,{onVnodeMounted:_n,onVnodeUpdated:_n,onVnodeUnmounted:_n}):"404 Page Not Found"])}}),Ef="modulepreload",xf=function(e){return"/"+e},ai={},uu=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=xf(c),c in ai)return;ai[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":Ef,f||(h.as="script"),h.crossOrigin="",h.href=c,l&&h.setAttribute("nonce",l),document.head.appendChild(h),f)return new Promise((g,b)=>{h.addEventListener("load",g),h.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},du=Qs({setup(e,{slots:t}){const n=oe(!1);return Lt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function hu(){ge&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function pu(){if(ge){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let f=c.textContent||"";o&&(f=f.replace(/^ *(\$|>) /gm,"").trim()),Tf(f).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function Tf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function gu(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=_s(l);for(const f of document.head.children)if(f.isEqualNode(c)){s.push(f);return}});return}const o=i.map(_s);s.forEach((l,c)=>{const f=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));f!==-1?delete o[f]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};sr(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],f=ko(o,i);f!==document.title&&(document.title=f);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):_s(["meta",{name:"description",content:a}]),r(Wo(o.head,Af(c)))})}function _s([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&!t.async&&(s.async=!1),s}function Cf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Af(e){return e.filter(t=>!Cf(t))}const ws=new Set,Go=()=>document.createElement("link"),Rf=e=>{const t=Go();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Of=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let wn;const Mf=ge&&(wn=Go())&&wn.relList&&wn.relList.supports&&wn.relList.supports("prefetch")?Rf:Of;function mu(){if(!ge||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!ws.has(c)){ws.add(c);const f=vf(c);f&&Mf(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):ws.add(l))})})};Lt(s);const r=qo();Fe(()=>r.path,s),Gn(()=>{n&&n.disconnect()})}export{Ji as $,bf as A,Nf as B,Hf as C,Js as D,cu as E,Se as F,le as G,Ff as H,Uo as I,qo as J,Yc as K,Mt as L,iu as M,Vs as N,eu as O,Kn as P,ru as Q,ge as R,Wn as S,Wf as T,If as U,uu as V,nu as W,Cc as X,Gf as Y,Df as Z,Jf as _,Eo as a,qf as a0,jf as a1,Bf as a2,gu as a3,_f as a4,lu as a5,gf as a6,fu as a7,du as a8,yt as a9,Xf as aa,au as ab,vf as ac,mu as ad,pu as ae,hu as af,Ns as ag,ke as ah,Ho as ai,zf as aj,ir as ak,Zf as al,su as am,tu as an,Qf as ao,Sf as ap,Pt as aq,Pf as ar,Kf as as,ae as at,Lf as au,xn as av,Yf as aw,ou as ax,Ls as b,Uf as c,Qs as d,kf as e,pf as f,oi as g,ie as h,lf as i,So as j,Fi as k,of as l,$o as m,Us as n,Ps as o,oe as p,Fe as q,$f as r,sr as s,cl as t,mf as u,Lt as v,Xl as w,Gn as x,Vf as y,dc as z}; diff --git a/assets/chunks/theme.mcvFSWbF.js b/assets/chunks/theme.mcvFSWbF.js new file mode 100644 index 0000000..2f2ea21 --- /dev/null +++ b/assets/chunks/theme.mcvFSWbF.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.DrZ8Nfg8.js","assets/chunks/framework.DptEmx5X.js"])))=>i.map(i=>d[i]); +import{d as m,o as a,c as u,r as c,n as M,a as D,t as N,b as k,w as v,e as h,T as ue,_ as g,u as Be,i as Ce,f as He,g as de,h as y,j as p,k as r,l as z,m as ae,p as I,q as O,s as Y,v as K,x as ve,y as pe,z as Ee,A as Fe,B as q,F as w,C,D as $e,E as Q,G as _,H as E,I as ye,J as Z,K as j,L as x,M as De,N as Pe,O as re,P as Oe,Q as Le,R as ee,S as Ge,U as Ue,V as je,W as Ve,X as Se,Y as ze,Z as Ke,$ as qe,a0 as We,a1 as Re}from"./framework.DptEmx5X.js";const Je=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),u("span",{class:M(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[D(N(e.text),1)])],2))}}),Xe={key:0,class:"VPBackdrop"},Ye=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),k(ue,{name:"fade"},{default:v(()=>[e.show?(a(),u("div",Xe)):h("",!0)]),_:1}))}}),Qe=g(Ye,[["__scopeId","data-v-c79a1216"]]),L=Be;function Ze(s,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(s,e):(s(),(o=!0)&&setTimeout(()=>o=!1,e))}}function ie(s){return/^\//.test(s)?s:`/${s}`}function fe(s){const{pathname:e,search:t,hash:o,protocol:n}=new URL(s,"http://a.com");if(Ce(s)||s.startsWith("#")||!n.startsWith("http")||!He(e))return s;const{site:i}=L(),l=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${o}`);return de(l)}function R({correspondingLink:s=!1}={}){const{site:e,localeIndex:t,page:o,theme:n,hash:i}=L(),l=y(()=>{var d,$;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:(($=e.value.locales[t.value])==null?void 0:$.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([d,$])=>l.value.label===$.label?[]:{text:$.label,link:xe($.link||(d==="root"?"/":`/${d}/`),n.value.i18nRouting!==!1&&s,o.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function xe(s,e,t,o){return e?s.replace(/\/$/,"")+ie(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):s}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},ot={class:"quote"},st={class:"action"},at=["href","aria-label"],rt=m({__name:"NotFound",setup(s){const{theme:e}=L(),{currentLang:t}=R();return(o,n)=>{var i,l,f,d,$;return a(),u("div",et,[p("p",tt,N(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),p("h1",nt,N(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=p("div",{class:"divider"},null,-1)),p("blockquote",ot,N(((f=r(e).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",st,[p("a",{class:"link",href:r(de)(r(t).link),"aria-label":((d=r(e).notFound)==null?void 0:d.linkLabel)??"go to home"},N((($=r(e).notFound)==null?void 0:$.linkText)??"Take me home"),9,at)])])}}}),it=g(rt,[["__scopeId","data-v-d6be1790"]]);function Te(s,e){if(Array.isArray(s))return J(s);if(s==null)return[];e=ie(e);const t=Object.keys(s).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(ie(n))),o=t?s[t]:[];return Array.isArray(o)?J(o):J(o.items,o.base)}function lt(s){const e=[];let t=0;for(const o in s){const n=s[o];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function ct(s){const e=[];function t(o){for(const n of o)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(s),e}function le(s,e){return Array.isArray(e)?e.some(t=>le(s,t)):z(s,e.link)?!0:e.items?le(s,e.items):!1}function J(s,e){return[...s].map(t=>{const o={...t},n=o.base||e;return n&&o.link&&(o.link=n+o.link),o.items&&(o.items=J(o.items,n)),o})}function G(){const{frontmatter:s,page:e,theme:t}=L(),o=ae("(min-width: 960px)"),n=I(!1),i=y(()=>{const B=t.value.sidebar,S=e.value.relativePath;return B?Te(B,S):[]}),l=I(i.value);O(i,(B,S)=>{JSON.stringify(B)!==JSON.stringify(S)&&(l.value=i.value)});const f=y(()=>s.value.sidebar!==!1&&l.value.length>0&&s.value.layout!=="home"),d=y(()=>$?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),$=y(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),V=y(()=>f.value&&o.value),b=y(()=>f.value?lt(l.value):[]);function P(){n.value=!0}function T(){n.value=!1}function A(){n.value?T():P()}return{isOpen:n,sidebar:l,sidebarGroups:b,hasSidebar:f,hasAside:$,leftAside:d,isSidebarEnabled:V,open:P,close:T,toggle:A}}function ut(s,e){let t;Y(()=>{t=s.value?document.activeElement:void 0}),K(()=>{window.addEventListener("keyup",o)}),ve(()=>{window.removeEventListener("keyup",o)});function o(n){n.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}function dt(s){const{page:e,hash:t}=L(),o=I(!1),n=y(()=>s.value.collapsed!=null),i=y(()=>!!s.value.link),l=I(!1),f=()=>{l.value=z(e.value.relativePath,s.value.link)};O([e,s,t],f),K(f);const d=y(()=>l.value?!0:s.value.items?le(e.value.relativePath,s.value.items):!1),$=y(()=>!!(s.value.items&&s.value.items.length));Y(()=>{o.value=!!(n.value&&s.value.collapsed)}),pe(()=>{(l.value||d.value)&&(o.value=!1)});function V(){n.value&&(o.value=!o.value)}return{collapsed:o,collapsible:n,isLink:i,isActiveLink:l,hasActiveLink:d,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:s}=G(),e=ae("(min-width: 960px)"),t=ae("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const ce=[];function Ne(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function he(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:pt(t),link:"#"+t.id,level:o}});return ft(e,s)}function pt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function ft(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return _t(s,o,n)}function ht(s,e){const{isAsideEnabled:t}=vt(),o=Ze(i,100);let n=null;K(()=>{requestAnimationFrame(i),window.addEventListener("scroll",o)}),Ee(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",o)});function i(){if(!t.value)return;const f=window.scrollY,d=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(f+d-$)<1,b=ce.map(({element:T,link:A})=>({link:A,top:mt(T)})).filter(({top:T})=>!Number.isNaN(T)).sort((T,A)=>T.top-A.top);if(!b.length){l(null);return}if(f<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:T,top:A}of b){if(A>f+Fe()+4)break;P=T}l(P)}function l(f){n&&n.classList.remove("active"),f==null?n=null:n=s.value.querySelector(`a[href="${decodeURIComponent(f)}"]`);const d=n;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function mt(s){let e=0;for(;s!==document.body;){if(s===null)return NaN;e+=s.offsetTop,s=s.offsetParent}return e}function _t(s,e,t){ce.length=0;const o=[],n=[];return s.forEach(i=>{const l={...i,children:[]};let f=n[n.length-1];for(;f&&f.level>=l.level;)n.pop(),f=n[n.length-1];if(l.element.classList.contains("ignore-header")||f&&"shouldIgnore"in f){n.push({level:l.level,shouldIgnore:!0});return}l.level>t||l.level{const n=q("VPDocOutlineItem",!0);return a(),u("ul",{class:M(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(w,null,C(t.headers,({children:i,link:l,title:f})=>(a(),u("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:f},N(f),9,kt),i!=null&&i.length?(a(),k(n,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Ie=g(bt,[["__scopeId","data-v-b933a997"]]),gt={class:"content"},$t={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},yt=m({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=L(),o=$e([]);Q(()=>{o.value=he(e.value.outline??t.value.outline)});const n=I(),i=I();return ht(n,i),(l,f)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:M(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:n},[p("div",gt,[p("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),p("div",$t,N(r(Ne)(r(t))),1),_(Ie,{headers:o.value,root:!0},null,8,["headers"])])],2))}}),Pt=g(yt,[["__scopeId","data-v-a5bbad30"]]),Lt={class:"VPDocAsideCarbonAds"},Vt=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,o)=>(a(),u("div",Lt,[_(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),St={class:"VPDocAside"},Tt=m({__name:"VPDocAside",setup(s){const{theme:e}=L();return(t,o)=>(a(),u("div",St,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),_(Pt),c(t.$slots,"aside-outline-after",{},void 0,!0),o[0]||(o[0]=p("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),k(Vt,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Nt=g(Tt,[["__scopeId","data-v-3f215769"]]);function It(){const{theme:s,page:e}=L();return y(()=>{const{text:t="Edit this page",pattern:o=""}=s.value.editLink||{};let n;return typeof o=="function"?n=o(e.value):n=o.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function Mt(){const{page:s,theme:e,frontmatter:t}=L();return y(()=>{var $,V,b,P,T,A,B,S;const o=Te(e.value.sidebar,s.value.relativePath),n=ct(o),i=wt(n,H=>H.link.replace(/[?#].*$/,"")),l=i.findIndex(H=>z(s.value.relativePath,H.link)),f=(($=e.value.docFooter)==null?void 0:$.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((V=e.value.docFooter)==null?void 0:V.next)===!1&&!t.value.next||t.value.next===!1;return{prev:f?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[l-1])==null?void 0:b.docFooterText)??((P=i[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((T=i[l-1])==null?void 0:T.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[l+1])==null?void 0:A.docFooterText)??((B=i[l+1])==null?void 0:B.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((S=i[l+1])==null?void 0:S.link)}}})}function wt(s,e){const t=new Set;return s.filter(o=>{const n=e(o);return t.has(n)?!1:t.add(n)})}const F=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=y(()=>e.tag??(e.href?"a":"span")),o=y(()=>e.href&&ye.test(e.href)||e.target==="_blank");return(n,i)=>(a(),k(E(t.value),{class:M(["VPLink",{link:n.href,"vp-external-link-icon":o.value,"no-icon":n.noIcon}]),href:n.href?r(fe)(n.href):void 0,target:n.target??(o.value?"_blank":void 0),rel:n.rel??(o.value?"noreferrer":void 0)},{default:v(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Bt=["datetime"],Ct=m({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,lang:o}=L(),n=y(()=>new Date(t.value.lastUpdated)),i=y(()=>n.value.toISOString()),l=I("");return K(()=>{Y(()=>{var f,d,$;l.value=new Intl.DateTimeFormat((d=(f=e.value.lastUpdated)==null?void 0:f.formatOptions)!=null&&d.forceLocale?o.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(f,d)=>{var $;return a(),u("p",At,[D(N((($=r(e).lastUpdated)==null?void 0:$.text)||r(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:i.value},N(l.value),9,Bt)])}}}),Ht=g(Ct,[["__scopeId","data-v-e98dd255"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Kt={class:"pager"},qt=["innerHTML"],Wt=["innerHTML"],Rt=m({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:o}=L(),n=It(),i=Mt(),l=y(()=>e.value.editLink&&o.value.editLink!==!1),f=y(()=>t.value.lastUpdated),d=y(()=>l.value||f.value||i.value.prev||i.value.next);return($,V)=>{var b,P,T,A;return d.value?(a(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||f.value?(a(),u("div",Ft,[l.value?(a(),u("div",Dt,[_(F,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:v(()=>[V[0]||(V[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),D(" "+N(r(n).text),1)]),_:1},8,["href"])])):h("",!0),f.value?(a(),u("div",Ot,[_(Ht)])):h("",!0)])):h("",!0),(b=r(i).prev)!=null&&b.link||(P=r(i).next)!=null&&P.link?(a(),u("nav",Gt,[V[1]||(V[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",Ut,[(T=r(i).prev)!=null&&T.link?(a(),k(F,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:v(()=>{var B;return[p("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.prev)||"Previous page"},null,8,jt),p("span",{class:"title",innerHTML:r(i).prev.text},null,8,zt)]}),_:1},8,["href"])):h("",!0)]),p("div",Kt,[(A=r(i).next)!=null&&A.link?(a(),k(F,{key:0,class:"pager-link next",href:r(i).next.link},{default:v(()=>{var B;return[p("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.next)||"Next page"},null,8,qt),p("span",{class:"title",innerHTML:r(i).next.text},null,8,Wt)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-e257564d"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},xt={class:"content-container"},en={class:"main"},tn=m({__name:"VPDoc",setup(s){const{theme:e}=L(),t=Z(),{hasSidebar:o,hasAside:n,leftAside:i}=G(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(f,d)=>{const $=q("Content");return a(),u("div",{class:M(["VPDoc",{"has-sidebar":r(o),"has-aside":r(n)}])},[c(f.$slots,"doc-top",{},void 0,!0),p("div",Xt,[r(n)?(a(),u("div",{key:0,class:M(["aside",{"left-aside":r(i)}])},[d[0]||(d[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",Yt,[p("div",Qt,[_(Nt,null,{"aside-top":v(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),p("div",Zt,[p("div",xt,[c(f.$slots,"doc-before",{},void 0,!0),p("main",en,[_($,{class:M(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(Jt,null,{"doc-footer-before":v(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(f.$slots,"doc-after",{},void 0,!0)])])]),c(f.$slots,"doc-bottom",{},void 0,!0)],2)}}}),nn=g(tn,[["__scopeId","data-v-39a288b8"]]),on=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(s){const e=s,t=y(()=>e.href&&ye.test(e.href)),o=y(()=>e.tag||(e.href?"a":"button"));return(n,i)=>(a(),k(E(o.value),{class:M(["VPButton",[n.size,n.theme]]),href:n.href?r(fe)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:v(()=>[D(N(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-fa7799d5"]]),an=["src","alt"],rn=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const o=q("VPImage",!0);return e.image?(a(),u(w,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",j({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,an)):(a(),u(w,{key:1},[_(o,j({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,j({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),X=g(rn,[["__scopeId","data-v-8426fc1a"]]),ln={class:"container"},cn={class:"main"},un={key:0,class:"name"},dn=["innerHTML"],vn=["innerHTML"],pn=["innerHTML"],fn={key:0,class:"actions"},hn={key:0,class:"image"},mn={class:"image-container"},_n=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=x("hero-image-slot-exists");return(t,o)=>(a(),u("div",{class:M(["VPHero",{"has-image":t.image||r(e)}])},[p("div",ln,[p("div",cn,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",un,[p("span",{innerHTML:t.name,class:"clip"},null,8,dn)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,vn)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,pn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",fn,[(a(!0),u(w,null,C(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[_(sn,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",hn,[p("div",mn,[o[0]||(o[0]=p("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(X,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),kn=g(_n,[["__scopeId","data-v-303bb580"]]),bn=m({__name:"VPHomeHero",setup(s){const{frontmatter:e}=L();return(t,o)=>r(e).hero?(a(),k(kn,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":v(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":v(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":v(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":v(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":v(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),gn={class:"box"},$n={key:0,class:"icon"},yn=["innerHTML"],Pn=["innerHTML"],Ln=["innerHTML"],Vn={key:4,class:"link-text"},Sn={class:"link-text-value"},Tn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),k(F,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[p("article",gn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",$n,[_(X,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(X,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,yn)):h("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,Pn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Ln)):h("",!0),e.linkText?(a(),u("div",Vn,[p("p",Sn,[D(N(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Nn=g(Tn,[["__scopeId","data-v-a3976bdc"]]),In={key:0,class:"VPFeatures"},Mn={class:"container"},wn={class:"items"},An=m({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=y(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,n)=>o.features?(a(),u("div",In,[p("div",Mn,[p("div",wn,[(a(!0),u(w,null,C(o.features,i=>(a(),u("div",{key:i.title,class:M(["item",[t.value]])},[_(Nn,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Bn=g(An,[["__scopeId","data-v-a6181336"]]),Cn=m({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=L();return(t,o)=>r(e).features?(a(),k(Bn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),Hn=m({__name:"VPHomeContent",setup(s){const{width:e}=De({initialWidth:0,includeScrollbar:!1});return(t,o)=>(a(),u("div",{class:"vp-doc container",style:Pe(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),En=g(Hn,[["__scopeId","data-v-8e2d4988"]]),Fn={class:"VPHome"},Dn=m({__name:"VPHome",setup(s){const{frontmatter:e}=L();return(t,o)=>{const n=q("Content");return a(),u("div",Fn,[c(t.$slots,"home-hero-before",{},void 0,!0),_(bn,null,{"home-hero-info-before":v(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),_(Cn),c(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),k(En,{key:0},{default:v(()=>[_(n)]),_:1})):(a(),k(n,{key:1}))])}}}),On=g(Dn,[["__scopeId","data-v-686f80a6"]]),Gn={},Un={class:"VPPage"};function jn(s,e){const t=q("Content");return a(),u("div",Un,[c(s.$slots,"page-top"),_(t),c(s.$slots,"page-bottom")])}const zn=g(Gn,[["render",jn]]),Kn=m({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=L(),{hasSidebar:o}=G();return(n,i)=>(a(),u("div",{class:M(["VPContent",{"has-sidebar":r(o),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[_(it)],!0):r(t).layout==="page"?(a(),k(zn,{key:1},{"page-top":v(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),k(On,{key:2},{"home-hero-before":v(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),k(E(r(t).layout),{key:3})):(a(),k(nn,{key:4},{"doc-top":v(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),qn=g(Kn,[["__scopeId","data-v-1428d186"]]),Wn={class:"container"},Rn=["innerHTML"],Jn=["innerHTML"],Xn=m({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=L(),{hasSidebar:o}=G();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:M(["VPFooter",{"has-sidebar":r(o)}])},[p("div",Wn,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,Rn)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,Jn)):h("",!0)])],2)):h("",!0)}}),Yn=g(Xn,[["__scopeId","data-v-e315a0ad"]]);function Qn(){const{theme:s,frontmatter:e}=L(),t=$e([]),o=y(()=>t.value.length>0);return Q(()=>{t.value=he(e.value.outline??s.value.outline)}),{headers:t,hasLocalNav:o}}const Zn={class:"menu-text"},xn={class:"header"},eo={class:"outline"},to=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=L(),o=I(!1),n=I(0),i=I(),l=I();function f(b){var P;(P=i.value)!=null&&P.contains(b.target)||(o.value=!1)}O(o,b=>{if(b){document.addEventListener("click",f);return}document.removeEventListener("click",f)}),re("Escape",()=>{o.value=!1}),Q(()=>{o.value=!1});function d(){o.value=!o.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Oe(()=>{o.value=!1}))}function V(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),u("button",{key:0,onClick:d,class:M({open:o.value})},[p("span",Zn,N(r(Ne)(r(t))),1),P[0]||(P[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:V},N(r(t).returnToTopLabel||"Return to top"),1)),_(ue,{name:"flyout"},{default:v(()=>[o.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[p("div",xn,[p("a",{class:"top-link",href:"#",onClick:V},N(r(t).returnToTopLabel||"Return to top"),1)]),p("div",eo,[_(Ie,{headers:b.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),no=g(to,[["__scopeId","data-v-17a5e62e"]]),oo={class:"container"},so=["aria-expanded"],ao={class:"menu-text"},ro=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=L(),{hasSidebar:o}=G(),{headers:n}=Qn(),{y:i}=Le(),l=I(0);K(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Q(()=>{n.value=he(t.value.outline??e.value.outline)});const f=y(()=>n.value.length===0),d=y(()=>f.value&&!o.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:f.value,fixed:d.value}));return(V,b)=>r(t).layout!=="home"&&(!d.value||r(i)>=l.value)?(a(),u("div",{key:0,class:M($.value)},[p("div",oo,[r(o)?(a(),u("button",{key:0,class:"menu","aria-expanded":V.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",ao,N(r(e).sidebarMenuLabel||"Menu"),1)],8,so)):h("",!0),_(no,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),io=g(ro,[["__scopeId","data-v-a6f0e41e"]]);function lo(){const s=I(!1);function e(){s.value=!0,window.addEventListener("resize",n)}function t(){s.value=!1,window.removeEventListener("resize",n)}function o(){s.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=Z();return O(()=>i.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:o}}const co={},uo={class:"VPSwitch",type:"button",role:"switch"},vo={class:"check"},po={key:0,class:"icon"};function fo(s,e){return a(),u("button",uo,[p("span",vo,[s.$slots.default?(a(),u("span",po,[c(s.$slots,"default",{},void 0,!0)])):h("",!0)])])}const ho=g(co,[["render",fo],["__scopeId","data-v-1d5665e3"]]),mo=m({__name:"VPSwitchAppearance",setup(s){const{isDark:e,theme:t}=L(),o=x("toggle-appearance",()=>{e.value=!e.value}),n=I("");return pe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),k(ho,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(o)},{default:v(()=>l[0]||(l[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),me=g(mo,[["__scopeId","data-v-5337faa4"]]),_o={key:0,class:"VPNavBarAppearance"},ko=m({__name:"VPNavBarAppearance",setup(s){const{site:e}=L();return(t,o)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",_o,[_(me)])):h("",!0)}}),bo=g(ko,[["__scopeId","data-v-6c893767"]]),_e=I();let Me=!1,se=0;function go(s){const e=I(!1);if(ee){!Me&&$o(),se++;const t=O(_e,o=>{var n,i,l;o===s.el.value||(n=s.el.value)!=null&&n.contains(o)?(e.value=!0,(i=s.onFocus)==null||i.call(s)):(e.value=!1,(l=s.onBlur)==null||l.call(s))});ve(()=>{t(),se--,se||yo()})}return Ge(e)}function $o(){document.addEventListener("focusin",we),Me=!0,_e.value=document.activeElement}function yo(){document.removeEventListener("focusin",we)}function we(){_e.value=document.activeElement}const Po={class:"VPMenuLink"},Lo=m({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=L();return(t,o)=>(a(),u("div",Po,[_(F,{class:M({active:r(z)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[D(N(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),te=g(Lo,[["__scopeId","data-v-43f1e123"]]),Vo={class:"VPMenuGroup"},So={key:0,class:"title"},To=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",Vo,[e.text?(a(),u("p",So,N(e.text),1)):h("",!0),(a(!0),u(w,null,C(e.items,o=>(a(),u(w,null,["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):h("",!0)],64))),256))]))}}),No=g(To,[["__scopeId","data-v-69e747b5"]]),Io={class:"VPMenu"},Mo={key:0,class:"items"},wo=m({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),u("div",Io,[e.items?(a(),u("div",Mo,[(a(!0),u(w,null,C(e.items,o=>(a(),u(w,{key:JSON.stringify(o)},["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):"component"in o?(a(),k(E(o.component),j({key:1,ref_for:!0},o.props),null,16)):(a(),k(No,{key:2,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Ao=g(wo,[["__scopeId","data-v-b98bc113"]]),Bo=["aria-expanded","aria-label"],Co={key:0,class:"text"},Ho=["innerHTML"],Eo={key:1,class:"vpi-more-horizontal icon"},Fo={class:"menu"},Do=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=I(!1),t=I();go({el:t,onBlur:o});function o(){e.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",Co,[n.icon?(a(),u("span",{key:0,class:M([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Ho)):h("",!0),i[3]||(i[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",Eo))],8,Bo),p("div",Fo,[_(Ao,{items:n.items},{default:v(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ke=g(Do,[["__scopeId","data-v-cf11d7a2"]]),Oo=["href","aria-label","innerHTML"],Go=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(o,n)=>(a(),u("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Oo))}}),Uo=g(Go,[["__scopeId","data-v-eee4e7cb"]]),jo={class:"VPSocialLinks"},zo=m({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),u("div",jo,[(a(!0),u(w,null,C(e.links,({link:o,icon:n,ariaLabel:i})=>(a(),k(Uo,{key:o,icon:n,link:o,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(zo,[["__scopeId","data-v-7bc22406"]]),Ko={key:0,class:"group translations"},qo={class:"trans-title"},Wo={key:1,class:"group"},Ro={class:"item appearance"},Jo={class:"label"},Xo={class:"appearance-action"},Yo={key:2,class:"group"},Qo={class:"item social-links"},Zo=m({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=L(),{localeLinks:o,currentLang:n}=R({correspondingLink:!0}),i=y(()=>o.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,f)=>i.value?(a(),k(ke,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[r(o).length&&r(n).label?(a(),u("div",Ko,[p("p",qo,N(r(n).label),1),(a(!0),u(w,null,C(r(o),d=>(a(),k(te,{key:d.link,item:d},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Wo,[p("div",Ro,[p("p",Jo,N(r(t).darkModeSwitchLabel||"Appearance"),1),p("div",Xo,[_(me)])])])):h("",!0),r(t).socialLinks?(a(),u("div",Yo,[p("div",Qo,[_(be,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),xo=g(Zo,[["__scopeId","data-v-bb2aa2f0"]]),es=["aria-expanded"],ts=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),u("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},t[1]||(t[1]=[p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)]),10,es))}}),ns=g(ts,[["__scopeId","data-v-e5dd9c1c"]]),os=["innerHTML"],ss=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=L();return(t,o)=>(a(),k(F,{class:M({VPNavBarMenuLink:!0,active:r(z)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[p("span",{innerHTML:t.item.text},null,8,os)]),_:1},8,["class","href","noIcon","target","rel"]))}}),as=g(ss,[["__scopeId","data-v-9c663999"]]),rs=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=L(),o=i=>"component"in i?!1:"link"in i?z(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(o),n=y(()=>o(e.item));return(i,l)=>(a(),k(ke,{class:M({VPNavBarMenuGroup:!0,active:r(z)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),is={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},ls=m({__name:"VPNavBarMenu",setup(s){const{theme:e}=L();return(t,o)=>r(e).nav?(a(),u("nav",is,[o[0]||(o[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(w,null,C(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(as,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),j({key:1,ref_for:!0},n.props),null,16)):(a(),k(rs,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),cs=g(ls,[["__scopeId","data-v-dc692963"]]);function us(s){const{localeIndex:e,theme:t}=L();function o(n){var A,B,S;const i=n.split("."),l=(A=t.value.search)==null?void 0:A.options,f=l&&typeof l=="object",d=f&&((S=(B=l.locales)==null?void 0:B[e.value])==null?void 0:S.translations)||null,$=f&&l.translations||null;let V=d,b=$,P=s;const T=i.pop();for(const H of i){let U=null;const W=P==null?void 0:P[H];W&&(U=P=W);const ne=b==null?void 0:b[H];ne&&(U=b=ne);const oe=V==null?void 0:V[H];oe&&(U=V=oe),W||(P=U),ne||(b=U),oe||(V=U)}return(V==null?void 0:V[T])??(b==null?void 0:b[T])??(P==null?void 0:P[T])??""}return o}const ds=["aria-label"],vs={class:"DocSearch-Button-Container"},ps={class:"DocSearch-Button-Placeholder"},ge=m({__name:"VPNavBarSearchButton",setup(s){const t=us({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[p("span",vs,[n[0]||(n[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",ps,N(r(t)("button.buttonText")),1)]),n[1]||(n[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,ds))}}),fs={class:"VPNavBarSearch"},hs={id:"local-search"},ms={key:1,id:"docsearch"},_s=m({__name:"VPNavBarSearch",setup(s){const e=Ue(()=>je(()=>import("./VPLocalSearchBox.DrZ8Nfg8.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:o}=L(),n=I(!1),i=I(!1);K(()=>{});function l(){n.value||(n.value=!0,setTimeout(f,16))}function f(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function d(b){const P=b.target,T=P.tagName;return P.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const $=I(!1);re("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),re("/",b=>{d(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var T;return a(),u("div",fs,[r(V)==="local"?(a(),u(w,{key:0},[$.value?(a(),k(r(e),{key:0,onClose:P[0]||(P[0]=A=>$.value=!1)})):h("",!0),p("div",hs,[_(ge,{onClick:P[1]||(P[1]=A=>$.value=!0)})])],64)):r(V)==="algolia"?(a(),u(w,{key:1},[n.value?(a(),k(r(t),{key:0,algolia:((T=r(o).search)==null?void 0:T.options)??r(o).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",ms,[_(ge,{onClick:l})]))],64)):h("",!0)])}}}),ks=m({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=L();return(t,o)=>r(e).socialLinks?(a(),k(be,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),bs=g(ks,[["__scopeId","data-v-0394ad82"]]),gs=["href","rel","target"],$s={key:1},ys={key:2},Ps=m({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=L(),{hasSidebar:o}=G(),{currentLang:n}=R(),i=y(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),l=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),f=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,$)=>(a(),u("div",{class:M(["VPNavBarTitle",{"has-sidebar":r(o)}])},[p("a",{class:"title",href:i.value??r(fe)(r(n).link),rel:l.value,target:f.value},[c(d.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),k(X,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",$s,N(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),u("span",ys,N(r(e).title),1)):h("",!0),c(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,gs)],2))}}),Ls=g(Ps,[["__scopeId","data-v-ab179fa1"]]),Vs={class:"items"},Ss={class:"title"},Ts=m({__name:"VPNavBarTranslations",setup(s){const{theme:e}=L(),{localeLinks:t,currentLang:o}=R({correspondingLink:!0});return(n,i)=>r(t).length&&r(o).label?(a(),k(ke,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:v(()=>[p("div",Vs,[p("p",Ss,N(r(o).label),1),(a(!0),u(w,null,C(r(t),l=>(a(),k(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Ns=g(Ts,[["__scopeId","data-v-88af2de4"]]),Is={class:"wrapper"},Ms={class:"container"},ws={class:"title"},As={class:"content"},Bs={class:"content-body"},Cs=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const e=s,{y:t}=Le(),{hasSidebar:o}=G(),{frontmatter:n}=L(),i=I({});return pe(()=>{i.value={"has-sidebar":o.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,f)=>(a(),u("div",{class:M(["VPNavBar",i.value])},[p("div",Is,[p("div",Ms,[p("div",ws,[_(Ls,null,{"nav-bar-title-before":v(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",As,[p("div",Bs,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),_(_s,{class:"search"}),_(cs,{class:"menu"}),_(Ns,{class:"translations"}),_(bo,{class:"appearance"}),_(bs,{class:"social-links"}),_(xo,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),_(ns,{class:"hamburger",active:l.isScreenOpen,onClick:f[0]||(f[0]=d=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),f[1]||(f[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),Hs=g(Cs,[["__scopeId","data-v-6aa21345"]]),Es={key:0,class:"VPNavScreenAppearance"},Fs={class:"text"},Ds=m({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=L();return(o,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Es,[p("p",Fs,N(r(t).darkModeSwitchLabel||"Appearance"),1),_(me)])):h("",!0)}}),Os=g(Ds,[["__scopeId","data-v-b44890b2"]]),Gs=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Us=g(Gs,[["__scopeId","data-v-7f31e1f6"]]),js=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:v(()=>[D(N(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Ae=g(js,[["__scopeId","data-v-19976ae1"]]),zs={class:"VPNavScreenMenuGroupSection"},Ks={key:0,class:"title"},qs=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",zs,[e.text?(a(),u("p",Ks,N(e.text),1)):h("",!0),(a(!0),u(w,null,C(e.items,o=>(a(),k(Ae,{key:o.text,item:o},null,8,["item"]))),128))]))}}),Ws=g(qs,[["__scopeId","data-v-8133b170"]]),Rs=["aria-controls","aria-expanded"],Js=["innerHTML"],Xs=["id"],Ys={key:0,class:"item"},Qs={key:1,class:"item"},Zs={key:2,class:"group"},xs=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=I(!1),o=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:M(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:n},[p("span",{class:"button-text",innerHTML:i.text},null,8,Js),l[0]||(l[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,Rs),p("div",{id:o.value,class:"items"},[(a(!0),u(w,null,C(i.items,f=>(a(),u(w,{key:JSON.stringify(f)},["link"in f?(a(),u("div",Ys,[_(Ae,{item:f},null,8,["item"])])):"component"in f?(a(),u("div",Qs,[(a(),k(E(f.component),j({ref_for:!0},f.props,{"screen-menu":""}),null,16))])):(a(),u("div",Zs,[_(Ws,{text:f.text,items:f.items},null,8,["text","items"])]))],64))),128))],8,Xs)],2))}}),ea=g(xs,[["__scopeId","data-v-b9ab8c58"]]),ta={key:0,class:"VPNavScreenMenu"},na=m({__name:"VPNavScreenMenu",setup(s){const{theme:e}=L();return(t,o)=>r(e).nav?(a(),u("nav",ta,[(a(!0),u(w,null,C(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(Us,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),j({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),k(ea,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),oa=m({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=L();return(t,o)=>r(e).socialLinks?(a(),k(be,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),sa={class:"list"},aa=m({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=R({correspondingLink:!0}),o=I(!1);function n(){o.value=!o.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:M(["VPNavScreenTranslations",{open:o.value}])},[p("button",{class:"title",onClick:n},[l[0]||(l[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),D(" "+N(r(t).label)+" ",1),l[1]||(l[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",sa,[(a(!0),u(w,null,C(r(e),f=>(a(),u("li",{key:f.link,class:"item"},[_(F,{class:"link",href:f.link},{default:v(()=>[D(N(f.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),ra=g(aa,[["__scopeId","data-v-858fe1a4"]]),ia={class:"container"},la=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=I(null),t=Ve(ee?document.body:null);return(o,n)=>(a(),k(ue,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:v(()=>[o.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",ia,[c(o.$slots,"nav-screen-content-before",{},void 0,!0),_(na,{class:"menu"}),_(ra,{class:"translations"}),_(Os,{class:"appearance"}),_(oa,{class:"social-links"}),c(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),ca=g(la,[["__scopeId","data-v-f2779853"]]),ua={key:0,class:"VPNav"},da=m({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=lo(),{frontmatter:n}=L(),i=y(()=>n.value.navbar!==!1);return Se("close-screen",t),Y(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,f)=>i.value?(a(),u("header",ua,[_(Hs,{"is-screen-open":r(e),onToggleScreen:r(o)},{"nav-bar-title-before":v(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(ca,{open:r(e)},{"nav-screen-content-before":v(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),va=g(da,[["__scopeId","data-v-ae24b3ad"]]),pa=["role","tabindex"],fa={key:1,class:"items"},ha=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:f,toggle:d}=dt(y(()=>e.item)),$=y(()=>f.value?"section":"div"),V=y(()=>n.value?"a":"div"),b=y(()=>f.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>n.value?void 0:"button"),T=y(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(S){"key"in S&&S.key!=="Enter"||!e.item.link&&d()}function B(){e.item.link&&d()}return(S,H)=>{const U=q("VPSidebarItem",!0);return a(),k(E($.value),{class:M(["VPSidebarItem",T.value])},{default:v(()=>[S.item.text?(a(),u("div",j({key:0,class:"item",role:P.value},Ke(S.item.items?{click:A,keydown:A}:{},!0),{tabindex:S.item.items&&0}),[H[1]||(H[1]=p("div",{class:"indicator"},null,-1)),S.item.link?(a(),k(F,{key:0,tag:V.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:v(()=>[(a(),k(E(b.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(E(b.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null&&S.item.items&&S.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:ze(B,["enter"]),tabindex:"0"},H[0]||(H[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,pa)):h("",!0),S.item.items&&S.item.items.length?(a(),u("div",fa,[S.depth<5?(a(!0),u(w,{key:0},C(S.item.items,W=>(a(),k(U,{key:W.text,item:W,depth:S.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),ma=g(ha,[["__scopeId","data-v-b7550ba0"]]),_a=m({__name:"VPSidebarGroup",props:{items:{}},setup(s){const e=I(!0);let t=null;return K(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),qe(()=>{t!=null&&(clearTimeout(t),t=null)}),(o,n)=>(a(!0),u(w,null,C(o.items,i=>(a(),u("div",{key:i.text,class:M(["group",{"no-transition":e.value}])},[_(ma,{item:i,depth:0},null,8,["item"])],2))),128))}}),ka=g(_a,[["__scopeId","data-v-c40bc020"]]),ba={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},ga=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=G(),o=s,n=I(null),i=Ve(ee?document.body:null);O([o,n],()=>{var f;o.open?(i.value=!0,(f=n.value)==null||f.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=I(0);return O(e,()=>{l.value+=1},{deep:!0}),(f,d)=>r(t)?(a(),u("aside",{key:0,class:M(["VPSidebar",{open:f.open}]),ref_key:"navEl",ref:n,onClick:d[0]||(d[0]=We(()=>{},["stop"]))},[d[2]||(d[2]=p("div",{class:"curtain"},null,-1)),p("nav",ba,[d[1]||(d[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(f.$slots,"sidebar-nav-before",{},void 0,!0),(a(),k(ka,{items:r(e),key:l.value},null,8,["items"])),c(f.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),$a=g(ga,[["__scopeId","data-v-319d5ca6"]]),ya=m({__name:"VPSkipLink",setup(s){const e=Z(),t=I();O(()=>e.path,()=>t.value.focus());function o({target:n}){const i=document.getElementById(decodeURIComponent(n.hash).slice(1));if(i){const l=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",l)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",l),i.focus(),window.scrollTo(0,0)}}return(n,i)=>(a(),u(w,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Pa=g(ya,[["__scopeId","data-v-0f60ec36"]]),La=m({__name:"Layout",setup(s){const{isOpen:e,open:t,close:o}=G(),n=Z();O(()=>n.path,o),ut(e,o);const{frontmatter:i}=L(),l=Re(),f=y(()=>!!l["home-hero-image"]);return Se("hero-image-slot-exists",f),(d,$)=>{const V=q("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:M(["Layout",r(i).pageClass])},[c(d.$slots,"layout-top",{},void 0,!0),_(Pa),_(Qe,{class:"backdrop",show:r(e),onClick:r(o)},null,8,["show","onClick"]),_(va,null,{"nav-bar-title-before":v(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(io,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),_($a,{open:r(e)},{"sidebar-nav-before":v(()=>[c(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[c(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(qn,null,{"page-top":v(()=>[c(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[c(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[c(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[c(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[c(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":v(()=>[c(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[c(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[c(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[c(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[c(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[c(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[c(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[c(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[c(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[c(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[c(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[c(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(Yn),c(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(V,{key:1}))}}}),Va=g(La,[["__scopeId","data-v-5d98c3a5"]]),Ta={Layout:Va,enhanceApp:({app:s})=>{s.component("Badge",Je)}};export{us as c,Ta as t,L as u}; diff --git a/assets/collections.md.-h8FUjTS.js b/assets/collections.md.-h8FUjTS.js new file mode 100644 index 0000000..629d071 --- /dev/null +++ b/assets/collections.md.-h8FUjTS.js @@ -0,0 +1,142 @@ +import{_ as i,c as a,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Collection Builders","description":"","frontmatter":{},"headers":[],"relativePath":"collections.md","filePath":"collections.md"}'),n={name:"collections.md"};function l(h,s,p,k,o,r){return e(),a("div",null,s[0]||(s[0]=[t(`

Collection Builders

Robo provides task collections as a means of making error detection and recovery easier. When Robo tasks are added to a collection, their execution is deferred until the $collection->run() method is called. If one of the tasks fail, then the operation will be aborted; rollback tasks may also be defined to restore the system to its original condition.

When using collections, a Robo script will go through three phases:

  1. Determine which tasks will need to be run, and create a task builder.
  • Assign values to variables.
  • Do not alter the state of the system.
  1. Create the necessary tasks via the task builder.
  • Use variables calculated in the first phase in task parameters.
  1. Run the tasks via the run() method.
  • Check and report errors once after run() returns.

Following this pattern will keep your code linear and easy to understand.

Collections API

Collections are made up of a combination of tasks and/or callable functions / method pointers, such as:

  • A task (implements TaskInterface)
  • A function name (string)
  • A closure (inline function)
  • A method reference (array with object and method name)

Examples of adding different kinds of tasks to a collection are provided below.

TaskInterface Objects

php
<?php
+  $collection->add(
+    $this->taskExec('ls')
+  );
+?>

Functions

php
<?php
+  $collection->addCode('mytaskfunction');
+?>

Closures

php
<?php
+  $collection->addCode(
+    function() use ($work)
+    {
+      // do something with $work      
+    });
+?>

Methods

php
<?php
+  $collection->addCode([$myobject, 'mymethod']);
+?>

Using a Collection Builder

To manage a collection of tasks, use a collection builder. Collection builders allow tasks to be created via chained methods. All of the tasks created by the same builder are added to a collection; when the run() method is called, all of the tasks in the collection run.

The 'publish' command from Robo's own RoboFile is shown below. It uses a collection builder to run some git and filesystem operations. The "completion" tasks are run after all other tasks complete, or during rollback processing when an operation fails.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    public function publish(ConsoleIO $io)
+    {
+        $current_branch = exec('git rev-parse --abbrev-ref HEAD');
+
+        $collection = $this->collectionBuilder($io);
+        $collection->taskGitStack()
+            ->checkout('site')
+            ->merge('master')
+        ->completion($this->taskGitStack()->checkout($current_branch))
+        ->taskFilesystemStack()
+            ->copy('CHANGELOG.md', 'docs/changelog.md')
+        ->completion($this->taskFilesystemStack()->remove('docs/changelog.md'))
+        ->taskExec('mkdocs gh-deploy');
+
+        return $collection;
+    }
+}
+?>

The example above also adds a couple of tasks as "completions"; these are run when the collection completes execution, as explained below.

Rollbacks and Completions

Robo also provides rollbacks and completions, special tasks that are eligible to run only if all of the tasks added to the collection before them succeed. The section below explains the circumstances under which these tasks will run.

Completion Tasks

Completions run whenever their collection completes or fails, but only if all of the tasks that come before it succeed. An example of this is shown in the first example above. A filesystem stack task copies CHANDELOG.md to docs/changelog.md; after this task is added to the collection, another filesystem stack task is added as a completion to delete docs/changelog.md. This is done because docs/changelog.md is only intended to exist long enough to be used by the mkdocs task, which is added later.

Rollback Tasks

In addition to completions, Robo also supports rollbacks. Rollback tasks can be used to clean up after failures, so the state of the system does not change when execution is interrupted by an error. A rollback task is executed if all of the tasks that come before it succeed, and at least one of the tasks that come after it fails. If all tasks succeed, then no rollback tasks are executed.

Rollback and Completion Methods

Any task may also implement \\Robo\\Contract\\RollbackInterface; if this is done, then its rollback() method will be called if the task is run() on a collection that later fails.

Use addAsCompletion($collection) in place of addAsRollback($collection), or implement \\Robo\\Contract\\CompletionInterface. Completions otherwise work exactly like rollbacks.

By default, rollbacks and completions tasks or callbacks continue even if errors occur. If you would like to explicitly cancel or abort the rollback or completion, you may throw the \\Robo\\Exception\\AbortTasksException exception.

Rollback and Completion Callbacks

You may also provide arbitrary methods as callables to serve as rollback or completion functions, as shown below:

php
<?php
+  $collection->rollbackCode([$myobject, 'myrollback']);
+  $collection->completionCode([$myobject, 'mycompletion']);
+?>

Temporary Objects

Since the concept of temporary objects that are cleaned up on failure is a common pattern, Robo provides built-in support for them. Temporary directories and files are provided out of the box; other kinds of temporary objects can be easily created using the Temporary global collection.

Temporary Directories

It is recommended that operations that perform multiple filesystem operations should, whenever possible, do most of their work in a temporary directory. Temporary directories are created by $this->taskTmpDir(), and are automatically removed when the collection completes or rolls back. As an added convenience, the CollectionBuilder class has a tmpDir() method that creates a temporary directory via taskTmpDir(), and then returns the path to the temporary directory.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    function myOperation(ConsoleIO $io)
+    {
+        $collection = $this->collectionBuilder($io);
+        
+        // Create a temporary directory, and fetch its path.
+        $work = $collection->tmpDir();
+
+        $collection
+          ->taskWriteToFile("$work/README.md")
+            ->line('-----')
+            ->line(date('Y-m-d').' Generated file: do not edit.')
+            ->line('----');
+        
+        // If all of the preceding tasks succeed, then rename the temporary 
+        // directory to its final name.
+        $collection->taskFilesystemStack()
+          ->rename($work, 'destination');
+        
+        return $collection->run();
+    }
+}
+?>

In the previous example, the path to the temporary directory is stored in the variable $work, and is passed as needed to the parameters of the other tasks as they are added to the collection. After the task collection is run, the temporary directory will be automatically deleted. In the example above, the temporary directory is renamed by the last task in the collection. This allows the working directory to persist; the collection will still attempt to remove the working directory, but no errors will be thrown if it no longer exists in its original location. Following this pattern allows Robo scripts to easily and safely do work that cleans up after itself on failure, without introducing a lot of branching or additional error recovery code. This paradigm is common enough to warrant a shortcut method of accomplishing the same thing. The example below is identical to the one above, save for the fact that it uses the workDir() method instead of tmpDir(). workDir() renames the temporary directory to its final name if the collection completes; any directory that exists in the same location will be overwritten at that time, but will persist if the collection roles back.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    function myOperation(ConsoleIO $io)
+    {
+        $collection = $this->collectionBuilder($io);
+        
+        // Create a temporary directory, and fetch its path.
+        // If all of the tasks succeed, then rename the temporary directory
+        // to its final name.
+        $work = $collection->workDir('destination');
+
+        $collection
+          ->taskWriteToFile("$work/README.md")
+            ->line('-----')
+            ->line(date('Y-m-d').' Generated file: do not edit.')
+            ->line('----');
+        
+        return $collection->run();
+    }
+}
+?>

Temporary directories may also be created via the shortcut $this->_tmpDir();. Temporary directories created in this way are deleted when the script terminates.

Temporary Files

Robo also provides an API for creating temporary files. They may be created via $this->taskTmpFile(); they are used exactly like $this->taskWrite(), except they are given a random name on creation, and are deleted when their collection completes. If they are not added to a collection, then they are deleted when the script terminates.

The Temporary Global Collection

Robo maintains a special collection called the Temporary global collection. This collection is used to keep track of temporary objects that are not part of any collection. For example, Robo temporary directories and temporary files are managed by the Temporary global collection. These temporary objects are cleaned up automatically when the script terminates.

It is easy to create your own temporary tasks that behave in the same way as the provided temporary directory and temporary file tasks. There are two steps required:

  • Implement \\Robo\\Contract\\CompletionInterface
  • Wrap the task via Temporary::wrap()

For example, the implementation of taskTmpFile() looks like this:

php
<?php
+    protected function taskTmpFile($filename = 'tmp', $extension = '', $baseDir = '', $includeRandomPart = true)
+    {
+        return Temporary::wrap(new TmpFile($filename, $extension, $baseDir, $includeRandomPart));
+    }
+?>

The complete() method of the task will be called once the Collection the temporary object is attached to finishes running. If the temporary is not added to a collection, then its complete() method will be called when the script terminates.

Chained State

When using a collection builder, it is possible to pass state from one task to another. State is generated during the run() method of each task, and returned in a Robo\\Result object. Each result has a "message" and a key/value data store that contains the task's state. This state can be made available to later tasks in the builder.

Implicitly Passing State

Sometimes it may be desirable to process the files produced by one task using a following task that alters the result.

For example, if you have one task that takes a set of source files and generates destination files, and another task that encrypts a set of files, you could encrypt the results from the first task by running both of the tasks independently:

php
<?php
+    $result = $this->taskGenerate()
+        ->files($sources)
+        ->run();
+    
+    $result = $this->taskEncrypt()
+        ->files($result['files'])
+        ->run();
+?>

If the Encrypt task implements \\Robo\\State\\Consumer and accepts 'files' from the current state, then these tasks may be chained together as follows:

php
<?php
+    $collection = $this->collectionBuilder($io);
+    $collection
+        ->taskGenerate()
+            ->files($sources)
+        ->taskEncrypt()
+        ->run();
+?>

Tasks that do not implement the Consumer interface may still be chained together by explicitly connecting the state from one task with the task configuration methods, as explained in the following section:

Explicitly Passing State

State from the key/value data store, if set, is automatically stored in the collection's state. The storeState() method can be used to store the result "message".

To pass state from one task to another, the deferTaskConfiguration() method may be used. This method defers initialization until immediately before the task's run() method is called. It then calls a single named setter method, passing it the value of some state variable.

For example, the builder below will create a new directory named after the output of the uname -n command returned by taskExec. Note that it is necessary to call printOutput(false) in order to make the output of taskExec available to the state system.

php
<?php
+    $this->collectionBuilder($io)
+        ->taskExec('uname -n')
+            ->printOutput(false)
+            ->storeState('system-name')
+        ->taskFilesystemStack()
+            ->deferTaskConfiguration('mkdir', 'system-name')
+        ->run();
+?>

More complex task configuration may be done via the defer() method. defer() works like deferTaskConfiguration(), except that it will run an arbitrary callable immediately prior to the execution of the task. The example below works exactly the same as the previous example, but is implemented using defer() instead of deferTaskConfiguration().

php
<?php
+    $this->collectionBuilder($io)
+        ->taskExec('uname -n')
+            ->printOutput(false)
+            ->storeState('system-name')
+        ->taskFilesystemStack()
+            ->defer(
+                function ($task, $state) {
+                    $task->mkdir($state['system-name']);
+                }
+            )
+        ->run();
+?>

In general, it is preferable to collect all of the information needed first, and then use that data to configure the necessary tasks. For example, the previous example could be implemented more simply by calling $system_name = exec('uname -n'); and taskFilesystemStack->mkdir($system_name);. Chained state can be helpful in instances where there is a more complex relationship between the tasks.

Named Tasks

It is also possible to provide names for the tasks added to a collection. This has two primary benefits:

  1. Any result data returned from a named task is stored in the Result object under the task name.
  2. It is possible for other code to add more tasks before or after any named task.

This feature is useful if you have functions that create task collections, and return them as a function results. The original caller can then use the $collection->before() or $collection->after() to insert sequenced tasks into the set of operations to be performed. One reason this might be done would be to define a base set of operations to perform (e.g. in a deploy), and then apply modifications for other environments (e.g. dev or stage).

php
<?php
+  $collection->addCode(
+    function() use ($work)
+    {
+      // do something with $work      
+    },
+    "taskname");
+?>

Given a collection with named tasks, it is possible to insert more tasks before or after a task of a given name.

php
<?php
+  $collection->after("taskname",
+    function() use ($work)
+    {
+      // do something with $work after "taskname" executes, if it succeeds.    
+    });
+?>
php
<?php
+  $collection->before("taskname",
+    function() use ($work)
+    {
+      // do something with $work before "taskname" executes.    
+    });
+?>

It is recommended that named tasks be avoided unless specifically needed.

`,83)]))}const E=i(n,[["render",l]]);export{c as __pageData,E as default}; diff --git a/assets/collections.md.-h8FUjTS.lean.js b/assets/collections.md.-h8FUjTS.lean.js new file mode 100644 index 0000000..629d071 --- /dev/null +++ b/assets/collections.md.-h8FUjTS.lean.js @@ -0,0 +1,142 @@ +import{_ as i,c as a,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Collection Builders","description":"","frontmatter":{},"headers":[],"relativePath":"collections.md","filePath":"collections.md"}'),n={name:"collections.md"};function l(h,s,p,k,o,r){return e(),a("div",null,s[0]||(s[0]=[t(`

Collection Builders

Robo provides task collections as a means of making error detection and recovery easier. When Robo tasks are added to a collection, their execution is deferred until the $collection->run() method is called. If one of the tasks fail, then the operation will be aborted; rollback tasks may also be defined to restore the system to its original condition.

When using collections, a Robo script will go through three phases:

  1. Determine which tasks will need to be run, and create a task builder.
  • Assign values to variables.
  • Do not alter the state of the system.
  1. Create the necessary tasks via the task builder.
  • Use variables calculated in the first phase in task parameters.
  1. Run the tasks via the run() method.
  • Check and report errors once after run() returns.

Following this pattern will keep your code linear and easy to understand.

Collections API

Collections are made up of a combination of tasks and/or callable functions / method pointers, such as:

  • A task (implements TaskInterface)
  • A function name (string)
  • A closure (inline function)
  • A method reference (array with object and method name)

Examples of adding different kinds of tasks to a collection are provided below.

TaskInterface Objects

php
<?php
+  $collection->add(
+    $this->taskExec('ls')
+  );
+?>

Functions

php
<?php
+  $collection->addCode('mytaskfunction');
+?>

Closures

php
<?php
+  $collection->addCode(
+    function() use ($work)
+    {
+      // do something with $work      
+    });
+?>

Methods

php
<?php
+  $collection->addCode([$myobject, 'mymethod']);
+?>

Using a Collection Builder

To manage a collection of tasks, use a collection builder. Collection builders allow tasks to be created via chained methods. All of the tasks created by the same builder are added to a collection; when the run() method is called, all of the tasks in the collection run.

The 'publish' command from Robo's own RoboFile is shown below. It uses a collection builder to run some git and filesystem operations. The "completion" tasks are run after all other tasks complete, or during rollback processing when an operation fails.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    public function publish(ConsoleIO $io)
+    {
+        $current_branch = exec('git rev-parse --abbrev-ref HEAD');
+
+        $collection = $this->collectionBuilder($io);
+        $collection->taskGitStack()
+            ->checkout('site')
+            ->merge('master')
+        ->completion($this->taskGitStack()->checkout($current_branch))
+        ->taskFilesystemStack()
+            ->copy('CHANGELOG.md', 'docs/changelog.md')
+        ->completion($this->taskFilesystemStack()->remove('docs/changelog.md'))
+        ->taskExec('mkdocs gh-deploy');
+
+        return $collection;
+    }
+}
+?>

The example above also adds a couple of tasks as "completions"; these are run when the collection completes execution, as explained below.

Rollbacks and Completions

Robo also provides rollbacks and completions, special tasks that are eligible to run only if all of the tasks added to the collection before them succeed. The section below explains the circumstances under which these tasks will run.

Completion Tasks

Completions run whenever their collection completes or fails, but only if all of the tasks that come before it succeed. An example of this is shown in the first example above. A filesystem stack task copies CHANDELOG.md to docs/changelog.md; after this task is added to the collection, another filesystem stack task is added as a completion to delete docs/changelog.md. This is done because docs/changelog.md is only intended to exist long enough to be used by the mkdocs task, which is added later.

Rollback Tasks

In addition to completions, Robo also supports rollbacks. Rollback tasks can be used to clean up after failures, so the state of the system does not change when execution is interrupted by an error. A rollback task is executed if all of the tasks that come before it succeed, and at least one of the tasks that come after it fails. If all tasks succeed, then no rollback tasks are executed.

Rollback and Completion Methods

Any task may also implement \\Robo\\Contract\\RollbackInterface; if this is done, then its rollback() method will be called if the task is run() on a collection that later fails.

Use addAsCompletion($collection) in place of addAsRollback($collection), or implement \\Robo\\Contract\\CompletionInterface. Completions otherwise work exactly like rollbacks.

By default, rollbacks and completions tasks or callbacks continue even if errors occur. If you would like to explicitly cancel or abort the rollback or completion, you may throw the \\Robo\\Exception\\AbortTasksException exception.

Rollback and Completion Callbacks

You may also provide arbitrary methods as callables to serve as rollback or completion functions, as shown below:

php
<?php
+  $collection->rollbackCode([$myobject, 'myrollback']);
+  $collection->completionCode([$myobject, 'mycompletion']);
+?>

Temporary Objects

Since the concept of temporary objects that are cleaned up on failure is a common pattern, Robo provides built-in support for them. Temporary directories and files are provided out of the box; other kinds of temporary objects can be easily created using the Temporary global collection.

Temporary Directories

It is recommended that operations that perform multiple filesystem operations should, whenever possible, do most of their work in a temporary directory. Temporary directories are created by $this->taskTmpDir(), and are automatically removed when the collection completes or rolls back. As an added convenience, the CollectionBuilder class has a tmpDir() method that creates a temporary directory via taskTmpDir(), and then returns the path to the temporary directory.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    function myOperation(ConsoleIO $io)
+    {
+        $collection = $this->collectionBuilder($io);
+        
+        // Create a temporary directory, and fetch its path.
+        $work = $collection->tmpDir();
+
+        $collection
+          ->taskWriteToFile("$work/README.md")
+            ->line('-----')
+            ->line(date('Y-m-d').' Generated file: do not edit.')
+            ->line('----');
+        
+        // If all of the preceding tasks succeed, then rename the temporary 
+        // directory to its final name.
+        $collection->taskFilesystemStack()
+          ->rename($work, 'destination');
+        
+        return $collection->run();
+    }
+}
+?>

In the previous example, the path to the temporary directory is stored in the variable $work, and is passed as needed to the parameters of the other tasks as they are added to the collection. After the task collection is run, the temporary directory will be automatically deleted. In the example above, the temporary directory is renamed by the last task in the collection. This allows the working directory to persist; the collection will still attempt to remove the working directory, but no errors will be thrown if it no longer exists in its original location. Following this pattern allows Robo scripts to easily and safely do work that cleans up after itself on failure, without introducing a lot of branching or additional error recovery code. This paradigm is common enough to warrant a shortcut method of accomplishing the same thing. The example below is identical to the one above, save for the fact that it uses the workDir() method instead of tmpDir(). workDir() renames the temporary directory to its final name if the collection completes; any directory that exists in the same location will be overwritten at that time, but will persist if the collection roles back.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    function myOperation(ConsoleIO $io)
+    {
+        $collection = $this->collectionBuilder($io);
+        
+        // Create a temporary directory, and fetch its path.
+        // If all of the tasks succeed, then rename the temporary directory
+        // to its final name.
+        $work = $collection->workDir('destination');
+
+        $collection
+          ->taskWriteToFile("$work/README.md")
+            ->line('-----')
+            ->line(date('Y-m-d').' Generated file: do not edit.')
+            ->line('----');
+        
+        return $collection->run();
+    }
+}
+?>

Temporary directories may also be created via the shortcut $this->_tmpDir();. Temporary directories created in this way are deleted when the script terminates.

Temporary Files

Robo also provides an API for creating temporary files. They may be created via $this->taskTmpFile(); they are used exactly like $this->taskWrite(), except they are given a random name on creation, and are deleted when their collection completes. If they are not added to a collection, then they are deleted when the script terminates.

The Temporary Global Collection

Robo maintains a special collection called the Temporary global collection. This collection is used to keep track of temporary objects that are not part of any collection. For example, Robo temporary directories and temporary files are managed by the Temporary global collection. These temporary objects are cleaned up automatically when the script terminates.

It is easy to create your own temporary tasks that behave in the same way as the provided temporary directory and temporary file tasks. There are two steps required:

  • Implement \\Robo\\Contract\\CompletionInterface
  • Wrap the task via Temporary::wrap()

For example, the implementation of taskTmpFile() looks like this:

php
<?php
+    protected function taskTmpFile($filename = 'tmp', $extension = '', $baseDir = '', $includeRandomPart = true)
+    {
+        return Temporary::wrap(new TmpFile($filename, $extension, $baseDir, $includeRandomPart));
+    }
+?>

The complete() method of the task will be called once the Collection the temporary object is attached to finishes running. If the temporary is not added to a collection, then its complete() method will be called when the script terminates.

Chained State

When using a collection builder, it is possible to pass state from one task to another. State is generated during the run() method of each task, and returned in a Robo\\Result object. Each result has a "message" and a key/value data store that contains the task's state. This state can be made available to later tasks in the builder.

Implicitly Passing State

Sometimes it may be desirable to process the files produced by one task using a following task that alters the result.

For example, if you have one task that takes a set of source files and generates destination files, and another task that encrypts a set of files, you could encrypt the results from the first task by running both of the tasks independently:

php
<?php
+    $result = $this->taskGenerate()
+        ->files($sources)
+        ->run();
+    
+    $result = $this->taskEncrypt()
+        ->files($result['files'])
+        ->run();
+?>

If the Encrypt task implements \\Robo\\State\\Consumer and accepts 'files' from the current state, then these tasks may be chained together as follows:

php
<?php
+    $collection = $this->collectionBuilder($io);
+    $collection
+        ->taskGenerate()
+            ->files($sources)
+        ->taskEncrypt()
+        ->run();
+?>

Tasks that do not implement the Consumer interface may still be chained together by explicitly connecting the state from one task with the task configuration methods, as explained in the following section:

Explicitly Passing State

State from the key/value data store, if set, is automatically stored in the collection's state. The storeState() method can be used to store the result "message".

To pass state from one task to another, the deferTaskConfiguration() method may be used. This method defers initialization until immediately before the task's run() method is called. It then calls a single named setter method, passing it the value of some state variable.

For example, the builder below will create a new directory named after the output of the uname -n command returned by taskExec. Note that it is necessary to call printOutput(false) in order to make the output of taskExec available to the state system.

php
<?php
+    $this->collectionBuilder($io)
+        ->taskExec('uname -n')
+            ->printOutput(false)
+            ->storeState('system-name')
+        ->taskFilesystemStack()
+            ->deferTaskConfiguration('mkdir', 'system-name')
+        ->run();
+?>

More complex task configuration may be done via the defer() method. defer() works like deferTaskConfiguration(), except that it will run an arbitrary callable immediately prior to the execution of the task. The example below works exactly the same as the previous example, but is implemented using defer() instead of deferTaskConfiguration().

php
<?php
+    $this->collectionBuilder($io)
+        ->taskExec('uname -n')
+            ->printOutput(false)
+            ->storeState('system-name')
+        ->taskFilesystemStack()
+            ->defer(
+                function ($task, $state) {
+                    $task->mkdir($state['system-name']);
+                }
+            )
+        ->run();
+?>

In general, it is preferable to collect all of the information needed first, and then use that data to configure the necessary tasks. For example, the previous example could be implemented more simply by calling $system_name = exec('uname -n'); and taskFilesystemStack->mkdir($system_name);. Chained state can be helpful in instances where there is a more complex relationship between the tasks.

Named Tasks

It is also possible to provide names for the tasks added to a collection. This has two primary benefits:

  1. Any result data returned from a named task is stored in the Result object under the task name.
  2. It is possible for other code to add more tasks before or after any named task.

This feature is useful if you have functions that create task collections, and return them as a function results. The original caller can then use the $collection->before() or $collection->after() to insert sequenced tasks into the set of operations to be performed. One reason this might be done would be to define a base set of operations to perform (e.g. in a deploy), and then apply modifications for other environments (e.g. dev or stage).

php
<?php
+  $collection->addCode(
+    function() use ($work)
+    {
+      // do something with $work      
+    },
+    "taskname");
+?>

Given a collection with named tasks, it is possible to insert more tasks before or after a task of a given name.

php
<?php
+  $collection->after("taskname",
+    function() use ($work)
+    {
+      // do something with $work after "taskname" executes, if it succeeds.    
+    });
+?>
php
<?php
+  $collection->before("taskname",
+    function() use ($work)
+    {
+      // do something with $work before "taskname" executes.    
+    });
+?>

It is recommended that named tasks be avoided unless specifically needed.

`,83)]))}const E=i(n,[["render",l]]);export{c as __pageData,E as default}; diff --git a/assets/extending.md.B2tToYXb.js b/assets/extending.md.B2tToYXb.js new file mode 100644 index 0000000..1b4717f --- /dev/null +++ b/assets/extending.md.B2tToYXb.js @@ -0,0 +1,146 @@ +import{_ as a,c as n,a2 as i,o as e}from"./chunks/framework.DptEmx5X.js";const d=JSON.parse('{"title":"Extending","description":"","frontmatter":{},"headers":[],"relativePath":"extending.md","filePath":"extending.md"}'),t={name:"extending.md"};function p(l,s,o,h,r,c){return e(),n("div",null,s[0]||(s[0]=[i(`

Extending

Robo tasks can be added to your Robo application by using Composer to suppliment the set of built-in tasks that Robo provides by default. To find existing Robo task extensions, search in Packagist for projects of type robo-tasks.

The convention used to add new tasks for use in your RoboFiles is to create a wrapper trait named Tasks in your namespace that instantiates the implementation class for each task. Each task method in the trait should start with the prefix task, and should use chained method calls for configuration. Task execution should be triggered by the method run.

To include additional tasks in your RoboFile, you must use the appropriate Tasks in your RoboFile. See the section Including Additional Tasks below. To create your own Robo extension that provides tasks for use in RoboFiles, then you must write your own class that implements TaskInterface, and create a Tasks trait for it as described in the section Creating a Robo Extension.

Note: The Tasks traits are called loadTasks in Robo core. This is a legacy name, preserved for backwards compatibility purposes. These traits will all be renamed to Tasks in Robo 2.0.

Including Additional Tasks

Additional tasks may be installed into projects that have included Robo via Composer. For example:

$ cd myproject
+$ composer require boedah/robo-drush

If any of the tasks you include require external Composer projects themselves, then you must composer require these as well. See the suggests section of Robo's composer.json file for a list of some projects you might need to require.

Once the extension you wish to use has been added to your vendor directory, you may then include it from your RoboFile:

php
class RoboFile extends \\Robo\\Tasks
+{
+  use Boedah\\Robo\\Task\\Drush\\Tasks;
+
+  public function test(ConsoleIO $io)
+  {
+    // ...
+  }
+}

Once you have done this, all of the tasks defined in the extension you selected will be available for use in your commands.

Note that at the moment, it is not possible to extend Robo when using the robo.phar. This capability may be added in the future via embedded composer.

Register command files via PSR-4 autoloading

You can have your project expose extra Robo command files by providing them within your project's PSR-4 namespace.

For example, given the following PSR-4 namespace in your composer.json:

json
{
+    "autoload": {
+        "psr-4": {
+            "MyProject\\\\": "./src/"
+        }
+    }
+}

Extra command files can be exposed by creating one or more classes under ./src/Robo/Plugin/Commands, as shown in the example below:

php
<?php
+
+namespace MyProject\\Robo\\Plugin\\Commands;
+
+use Robo\\Symfony\\ConsoleIO;
+
+class MyCustomCommands extends \\Robo\\Tasks
+{
+    /**
+     * @command my-project:command-one
+     */
+    public function commandOne(ConsoleIO $io) { }
+
+    /**
+     * @command my-project:command-two
+     */
+    public function commandTwo(ConsoleIO $io) { }
+}

Please note: command files classes must be placed under Robo/Plugin/Commands relative namespace and their name must end in Command.php or Commands.php.

You can now access your new commands via Robo:

$ ./vendor/bin/robo
+$ ./robo
+Robo 1.2.2-dev
+
+Usage:
+  command [options] [arguments]
+...
+
+Available commands:
+  help                  Displays help for a command
+  list                  Lists commands
+ my-project
+  my-project:command-one
+  my-project:command-two

Creating a Robo Extension

A Robo tasks extension is created by advertising a Composer package of type robo-tasks on Packagist. For an overview on how this is done, see the article Creating your very own Composer Package. Specific instructions for creating Robo task extensions are provided below.

Create your composer.json File

Your composer.json file should look something like the example below:

{
+    "name": "boedah/robo-drush",
+    "description": "Drush CommandStack for Robo Task Runner",
+    "type": "robo-tasks",
+    "autoload": {
+        "psr-4": {
+            "Boedah\\\\Robo\\\\Task\\\\Drush\\\\": "src"
+        }
+    },
+    "require": {
+        "php": ">=5.5.0",
+        "consolidation/robo": "~1"
+    }
+}

Customize the name and autoload paths as necessary, and add any additional required projects needed by the tasks that your extensions will provide. The type of your project should always be robo-tasks. Robo only supports php >= 5.5.0; you may require a higher version of php if necessary.

Create the Tasks.php Trait

It is recommended to place your trait-loading task in a Tasks file in the same namespace as the task implementation.

namespace Boedah\\Robo\\Task\\Drush;
+
+trait Tasks
+{
+    /**
+     * @param string $pathToDrush
+     * @return DrushStack
+     */
+    protected function taskDrushStack($pathToDrush = 'drush')
+    {
+        return $this->task(__FUNCTION__, $pathToDrush);
+    }
+}

Note that the name of the service for a given task must start with the word "task", and must have the same name as the function used to call the task. $this->task() looks up the service by name; using the PHP built-in constant FUNCTION for this parameter ensures that the names of these items remain in alignment.

Task implementation

The implementation of each task class should extend \\Robo\\Task\\BaseTask, or some class that extends the same, and should used chained initializer methods and defer all operations that alter the state of the system until its run() method. If you follow these patterns, then your task extensions will be usable via Robo collection builders, as explained in the collections documentation.

There are many examples of task implementations in the Robo\\Task namespace. A very basic task example is provided below. The namespace is MyAssetTasks, and the example task is CompileAssets. To customize to your purposes, choose an appropriate namespace, and then define as many tasks as you need.

php
<?php
+namespace MyAssetTasks;
+
+trait Tasks
+{
+    /**
+     * Example task to compile assets
+     *
+     * @param string $pathToCompileAssets
+     * @return \\MyAssetTasks\\CompileAssets
+     */
+    protected function taskCompileAssets($path = null)
+    {
+        // Always construct your tasks with the \`task()\` task builder.
+        return $this->task(CompileAssets::class, $path);
+    }
+}
+
+class CompileAssets implements \\Robo\\Contract\\TaskInterface
+{
+    // configuration params
+    protected $path;
+    protected $to;
+    function __construct($path)
+    {
+        $this->path = $path;
+    }
+
+    function to($filename)
+    {
+        $this->to = $filename;
+        // must return $this
+        return $this;
+    }
+
+    // must implement Run
+    function run()
+    {
+        //....
+    }
+}
+?>

To use the tasks you define in a RoboFile, use its Tasks trait as explained in the section Including Additional Tasks, above.

TaskIO

To allow tasks access IO, use the Robo\\Common\\TaskIO trait, or inherit your task class from Robo\\Task\\BaseTask (recommended).

Inside tasks you should print process details with printTaskInfo, printTaskSuccess, and printTaskError.

$this->printTaskInfo('Processing...');

The Task IO methods send all output through a PSR-3 logger. Tasks should use task IO exclusively; methods such as 'say' and 'ask' should reside in the command method. This allows tasks to be usable in any context that has a PSR-3 logger, including background or server processes where it is not possible to directly query the user.

Tasks That Use Tasks

If one task implementation needs to use other tasks while it is running, it should do so via a CollectionBuilder object, as explained in the Collections documentation.

To obtain access to a CollectionBuilder, a task should implement BuilderAwareInterface and use BuilderAwareTrait. It will then have access to a collection builder via the $this->collectionBuilder() method.

Testing Extensions

If you wish to use the task() methods from your Tasks trait in your unit tests, it is necessary to also use the Robo TaskAccessor trait, and define a collectionBuilder() method to provide a builder. Collection builders are used to initialize all Robo tasks. The easiest way to get a usable collection builder in your tests is to initialize Robo's default dependency injection container, and use it to request a new builder.

An example of how to do this in a PHPUnit test is shown below.

use League\\Container\\ContainerAwareInterface;
+use League\\Container\\ContainerAwareTrait;
+use Symfony\\Component\\Console\\Output\\NullOutput;
+use Robo\\TaskAccessor;
+use Robo\\Robo;
+use Robo\\Collection\\CollectionBuilder;
+
+class DrushStackTest extends \\PHPUnit_Framework_TestCase implements ContainerAwareInterface
+{
+    use \\Boedah\\Robo\\Task\\Drush\\Tasks;
+    use TaskAccessor;
+    use ContainerAwareTrait;
+
+    // Set up the Robo container so that we can create tasks in our tests.
+    function setup()
+    {
+        $container = Robo::createDefaultContainer(null, new NullOutput());
+        $this->setContainer($container);
+    }
+
+    // Scaffold the collection builder
+    public function collectionBuilder()
+    {
+        $emptyRobofile = new \\Robo\\Tasks;
+        return CollectionBuilder::create($this->getContainer(), $emptyRobofile);
+    }
+
+    public function testYesIsAssumed()
+    {
+        $command = $this->taskDrushStack()
+            ->drush('command')
+            ->getCommand();
+        $this->assertEquals('drush command -y', $command);
+    }
+}

To assert that the output of a command contains some value, use a Symfony\\Component\\Console\\Output\\BufferedOutput in place of null output when calling Robo::createDefaultContainer().

`,50)]))}const u=a(t,[["render",p]]);export{d as __pageData,u as default}; diff --git a/assets/extending.md.B2tToYXb.lean.js b/assets/extending.md.B2tToYXb.lean.js new file mode 100644 index 0000000..1b4717f --- /dev/null +++ b/assets/extending.md.B2tToYXb.lean.js @@ -0,0 +1,146 @@ +import{_ as a,c as n,a2 as i,o as e}from"./chunks/framework.DptEmx5X.js";const d=JSON.parse('{"title":"Extending","description":"","frontmatter":{},"headers":[],"relativePath":"extending.md","filePath":"extending.md"}'),t={name:"extending.md"};function p(l,s,o,h,r,c){return e(),n("div",null,s[0]||(s[0]=[i(`

Extending

Robo tasks can be added to your Robo application by using Composer to suppliment the set of built-in tasks that Robo provides by default. To find existing Robo task extensions, search in Packagist for projects of type robo-tasks.

The convention used to add new tasks for use in your RoboFiles is to create a wrapper trait named Tasks in your namespace that instantiates the implementation class for each task. Each task method in the trait should start with the prefix task, and should use chained method calls for configuration. Task execution should be triggered by the method run.

To include additional tasks in your RoboFile, you must use the appropriate Tasks in your RoboFile. See the section Including Additional Tasks below. To create your own Robo extension that provides tasks for use in RoboFiles, then you must write your own class that implements TaskInterface, and create a Tasks trait for it as described in the section Creating a Robo Extension.

Note: The Tasks traits are called loadTasks in Robo core. This is a legacy name, preserved for backwards compatibility purposes. These traits will all be renamed to Tasks in Robo 2.0.

Including Additional Tasks

Additional tasks may be installed into projects that have included Robo via Composer. For example:

$ cd myproject
+$ composer require boedah/robo-drush

If any of the tasks you include require external Composer projects themselves, then you must composer require these as well. See the suggests section of Robo's composer.json file for a list of some projects you might need to require.

Once the extension you wish to use has been added to your vendor directory, you may then include it from your RoboFile:

php
class RoboFile extends \\Robo\\Tasks
+{
+  use Boedah\\Robo\\Task\\Drush\\Tasks;
+
+  public function test(ConsoleIO $io)
+  {
+    // ...
+  }
+}

Once you have done this, all of the tasks defined in the extension you selected will be available for use in your commands.

Note that at the moment, it is not possible to extend Robo when using the robo.phar. This capability may be added in the future via embedded composer.

Register command files via PSR-4 autoloading

You can have your project expose extra Robo command files by providing them within your project's PSR-4 namespace.

For example, given the following PSR-4 namespace in your composer.json:

json
{
+    "autoload": {
+        "psr-4": {
+            "MyProject\\\\": "./src/"
+        }
+    }
+}

Extra command files can be exposed by creating one or more classes under ./src/Robo/Plugin/Commands, as shown in the example below:

php
<?php
+
+namespace MyProject\\Robo\\Plugin\\Commands;
+
+use Robo\\Symfony\\ConsoleIO;
+
+class MyCustomCommands extends \\Robo\\Tasks
+{
+    /**
+     * @command my-project:command-one
+     */
+    public function commandOne(ConsoleIO $io) { }
+
+    /**
+     * @command my-project:command-two
+     */
+    public function commandTwo(ConsoleIO $io) { }
+}

Please note: command files classes must be placed under Robo/Plugin/Commands relative namespace and their name must end in Command.php or Commands.php.

You can now access your new commands via Robo:

$ ./vendor/bin/robo
+$ ./robo
+Robo 1.2.2-dev
+
+Usage:
+  command [options] [arguments]
+...
+
+Available commands:
+  help                  Displays help for a command
+  list                  Lists commands
+ my-project
+  my-project:command-one
+  my-project:command-two

Creating a Robo Extension

A Robo tasks extension is created by advertising a Composer package of type robo-tasks on Packagist. For an overview on how this is done, see the article Creating your very own Composer Package. Specific instructions for creating Robo task extensions are provided below.

Create your composer.json File

Your composer.json file should look something like the example below:

{
+    "name": "boedah/robo-drush",
+    "description": "Drush CommandStack for Robo Task Runner",
+    "type": "robo-tasks",
+    "autoload": {
+        "psr-4": {
+            "Boedah\\\\Robo\\\\Task\\\\Drush\\\\": "src"
+        }
+    },
+    "require": {
+        "php": ">=5.5.0",
+        "consolidation/robo": "~1"
+    }
+}

Customize the name and autoload paths as necessary, and add any additional required projects needed by the tasks that your extensions will provide. The type of your project should always be robo-tasks. Robo only supports php >= 5.5.0; you may require a higher version of php if necessary.

Create the Tasks.php Trait

It is recommended to place your trait-loading task in a Tasks file in the same namespace as the task implementation.

namespace Boedah\\Robo\\Task\\Drush;
+
+trait Tasks
+{
+    /**
+     * @param string $pathToDrush
+     * @return DrushStack
+     */
+    protected function taskDrushStack($pathToDrush = 'drush')
+    {
+        return $this->task(__FUNCTION__, $pathToDrush);
+    }
+}

Note that the name of the service for a given task must start with the word "task", and must have the same name as the function used to call the task. $this->task() looks up the service by name; using the PHP built-in constant FUNCTION for this parameter ensures that the names of these items remain in alignment.

Task implementation

The implementation of each task class should extend \\Robo\\Task\\BaseTask, or some class that extends the same, and should used chained initializer methods and defer all operations that alter the state of the system until its run() method. If you follow these patterns, then your task extensions will be usable via Robo collection builders, as explained in the collections documentation.

There are many examples of task implementations in the Robo\\Task namespace. A very basic task example is provided below. The namespace is MyAssetTasks, and the example task is CompileAssets. To customize to your purposes, choose an appropriate namespace, and then define as many tasks as you need.

php
<?php
+namespace MyAssetTasks;
+
+trait Tasks
+{
+    /**
+     * Example task to compile assets
+     *
+     * @param string $pathToCompileAssets
+     * @return \\MyAssetTasks\\CompileAssets
+     */
+    protected function taskCompileAssets($path = null)
+    {
+        // Always construct your tasks with the \`task()\` task builder.
+        return $this->task(CompileAssets::class, $path);
+    }
+}
+
+class CompileAssets implements \\Robo\\Contract\\TaskInterface
+{
+    // configuration params
+    protected $path;
+    protected $to;
+    function __construct($path)
+    {
+        $this->path = $path;
+    }
+
+    function to($filename)
+    {
+        $this->to = $filename;
+        // must return $this
+        return $this;
+    }
+
+    // must implement Run
+    function run()
+    {
+        //....
+    }
+}
+?>

To use the tasks you define in a RoboFile, use its Tasks trait as explained in the section Including Additional Tasks, above.

TaskIO

To allow tasks access IO, use the Robo\\Common\\TaskIO trait, or inherit your task class from Robo\\Task\\BaseTask (recommended).

Inside tasks you should print process details with printTaskInfo, printTaskSuccess, and printTaskError.

$this->printTaskInfo('Processing...');

The Task IO methods send all output through a PSR-3 logger. Tasks should use task IO exclusively; methods such as 'say' and 'ask' should reside in the command method. This allows tasks to be usable in any context that has a PSR-3 logger, including background or server processes where it is not possible to directly query the user.

Tasks That Use Tasks

If one task implementation needs to use other tasks while it is running, it should do so via a CollectionBuilder object, as explained in the Collections documentation.

To obtain access to a CollectionBuilder, a task should implement BuilderAwareInterface and use BuilderAwareTrait. It will then have access to a collection builder via the $this->collectionBuilder() method.

Testing Extensions

If you wish to use the task() methods from your Tasks trait in your unit tests, it is necessary to also use the Robo TaskAccessor trait, and define a collectionBuilder() method to provide a builder. Collection builders are used to initialize all Robo tasks. The easiest way to get a usable collection builder in your tests is to initialize Robo's default dependency injection container, and use it to request a new builder.

An example of how to do this in a PHPUnit test is shown below.

use League\\Container\\ContainerAwareInterface;
+use League\\Container\\ContainerAwareTrait;
+use Symfony\\Component\\Console\\Output\\NullOutput;
+use Robo\\TaskAccessor;
+use Robo\\Robo;
+use Robo\\Collection\\CollectionBuilder;
+
+class DrushStackTest extends \\PHPUnit_Framework_TestCase implements ContainerAwareInterface
+{
+    use \\Boedah\\Robo\\Task\\Drush\\Tasks;
+    use TaskAccessor;
+    use ContainerAwareTrait;
+
+    // Set up the Robo container so that we can create tasks in our tests.
+    function setup()
+    {
+        $container = Robo::createDefaultContainer(null, new NullOutput());
+        $this->setContainer($container);
+    }
+
+    // Scaffold the collection builder
+    public function collectionBuilder()
+    {
+        $emptyRobofile = new \\Robo\\Tasks;
+        return CollectionBuilder::create($this->getContainer(), $emptyRobofile);
+    }
+
+    public function testYesIsAssumed()
+    {
+        $command = $this->taskDrushStack()
+            ->drush('command')
+            ->getCommand();
+        $this->assertEquals('drush command -y', $command);
+    }
+}

To assert that the output of a command contains some value, use a Symfony\\Component\\Console\\Output\\BufferedOutput in place of null output when calling Robo::createDefaultContainer().

`,50)]))}const u=a(t,[["render",p]]);export{d as __pageData,u as default}; diff --git a/assets/framework.md.BcJaTY9h.js b/assets/framework.md.BcJaTY9h.js new file mode 100644 index 0000000..f4dea09 --- /dev/null +++ b/assets/framework.md.BcJaTY9h.js @@ -0,0 +1,117 @@ +import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.DptEmx5X.js";const E=JSON.parse('{"title":"Robo as a Framework","description":"","frontmatter":{},"headers":[],"relativePath":"framework.md","filePath":"framework.md"}'),e={name:"framework.md"};function p(h,s,l,k,o,r){return t(),a("div",null,s[0]||(s[0]=[n(`

Robo as a Framework

For a faster and better start to creating your own commandline application, please see the documentation in the g1a/starter project.

There are multiple ways to use and package Robo scripts; a few of the alternatives are presented below.

Creating a Standalone Phar with Robo

It is possible to create a standalone phar that is implemented with Robo; doing this does not require the RoboFile to be located in the current working directory, or any particular location within your project. To achieve this, first set up your project as shown in the section Implementing Composer Scripts with Robo. Use of the "scripts" section is optional.

Next, add an "autoload" section to your composer.json to provide a namespace for your Robo commands:

json
{
+    "name": "myorg/myproject",
+    "require": {
+        "consolidation/Robo": "^2"
+    },
+    "autoload":{
+        "psr-4":{
+            "MyProject\\\\":"src"
+        }
+    }
+}

Create a new file for your Robo commands, e.g. class RoboFile in namespace MyProject\\Commands; in the file src\\Commands\\RoboFile.php. Optionally, add more task libraries as described in the extending document.

Create a startup script similar to the one below, and add it to the root of your project, or some other location of your choosing:

php
#!/usr/bin/env php
+<?php
+
+// If we're running from phar load the phar autoload file.
+$pharPath = \\Phar::running(true);
+if ($pharPath) {
+    $autoloaderPath = "$pharPath/vendor/autoload.php";
+} else {
+    if (file_exists(__DIR__.'/vendor/autoload.php')) {
+        $autoloaderPath = __DIR__.'/vendor/autoload.php';
+    } elseif (file_exists(__DIR__.'/../../autoload.php')) {
+        $autoloaderPath = __DIR__ . '/../../autoload.php';
+    } else {
+        die("Could not find autoloader. Run 'composer install'.");
+    }
+}
+$classLoader = require $autoloaderPath;
+
+// Customization variables
+$appName = "MyAppName";
+$appVersion = trim(file_get_contents(__DIR__ . '/VERSION'));
+$commandClasses = [ \\MyProject\\Commands\\RoboFile::class ];
+$selfUpdateRepository = 'myorg/myproject';
+$configurationFilename = 'myconfig.yml';
+
+// Define our Runner, and pass it the command classes we provide.
+$runner = new \\Robo\\Runner($commandClasses);
+$runner
+  ->setSelfUpdateRepository($selfUpdateRepository)
+  ->setConfigurationFilename($configurationFilename)
+  ->setClassLoader($classLoader);
+
+// Execute the command and return the result.
+$output = new \\Symfony\\Component\\Console\\Output\\ConsoleOutput();
+$statusCode = $runner->execute($argv, $appName, $appVersion, $output);
+exit($statusCode);

When using Robo as a framework, the Robo file should be included in the autoloader, as Robo does not include a RoboFile.php file when used in this mode. Instead, specify the class or classes to load as a parameter to the Robo\\Runner constructor.

Use box-project/box2 or Robo's taskPackPhar to create a phar for your application. If your application's repository is hosted on GitHub, then passing the appropriate GitHub org/project to the \\Robo\\Robo::run() method, as shown above, will enable the self:update command to automatically update to the latest available version. Note that self:update only works with phar distributions.

Using Multiple RoboFiles in a Standalone Application

It is possible to provide as many command classes as you wish to the Robo Runner() constructor. You might wish to separate your Robo command implementations into separate Robo files if you have a lot of commands, or if you wish to group similar commands together in the same source file. If you do this, you can simply add more class references to the $commandClasses variable shown above.

$commandClasses = [
+    \\MyProject\\Commands\\BuildCommands::class,
+    \\MyProject\\Commands\\DeployCommands::class
+];

If your application has a large number of command files, or if it supports command extensions, then you might wish to use the Command Discovery class to locate your files. The CommandFileDiscovery class will use the Symfony Finder class to search for all filenames matching the provided search pattern. It will return a list of class names using the provided base namespace.

php
$discovery = new \\Consolidation\\AnnotatedCommand\\CommandFileDiscovery();
+$discovery->setSearchPattern('*Command.php');
+$commandClasses = $discovery->discover('php/MyProject/Commands', '\\MyProject\\Commands');

Pass the resulting $commandClasses to the Runner() constructor as shown above. See the annotated-commands project for more information about the different options that the discovery command takes.

Using Your Own Dependency Injection Container with Robo (Advanced)

It is also possible to completely replace the Robo application with your own. To do this, set up your project as described in the sections above, but replace the Robo runner with your own main event loop.

Add the following to your startup file:

php
<?php
+use League\\Container\\Container;
+use Robo\\Robo;
+
+$input = new \\Symfony\\Component\\Console\\Input\\ArgvInput($argv);
+$output = new \\Symfony\\Component\\Console\\Output\\ConsoleOutput();
+$config = Robo::createConfiguration(['myconf.yml']);
+$app = new \\MyApplication($config, $input, $output);
+$status_code = $app->run($input, $output);
+exit($status_code);

Then, create your own custom application:

php
<?php
+
+use Robo\\Common\\ConfigAwareTrait;
+use Robo\\Config;
+use Robo\\Robo;
+use Robo\\Runner as RoboRunner;
+use Symfony\\Component\\Console\\Application;
+use Symfony\\Component\\Console\\Input\\InputInterface;
+use Symfony\\Component\\Console\\Output\\OutputInterface;
+
+class MyApplication {
+
+  const APPLICATION_NAME = 'My Application';
+  const REPOSITORY = 'org/project';
+
+  use ConfigAwareTrait;
+
+  private $runner;
+
+  public function __construct(
+    Config $config,
+    InputInterface $input = NULL,
+    OutputInterface $output = NULL
+  ) {
+
+    // Create applicaton.
+    $this->setConfig($config);
+    $application = new Application(self::APPLICATION_NAME, $config->get('version'));
+
+    // Create and configure container.
+    $container = Robo::createContainer($application, $config);
+    $container->add(MyCustomService::class); // optional
+    Robo::finalizeContainer($container);
+
+    // Instantiate Robo Runner.
+    $this->runner = new RoboRunner([
+      My\\Custom\\Command::class
+    ]);
+    $this->runner->setContainer($container);
+    $this->runner->setSelfUpdateRepository(self::REPOSITORY);
+  }
+
+  public function run(InputInterface $input, OutputInterface $output) {
+    $status_code = $this->runner->run($input, $output);
+
+    return $status_code;
+  }
+
+}

If you are using League\\Container (recommended), then you may simply add and share your own classes to the same container. If you are using some other DI container, then you should use delegate lookup to combine them.

Using a Custom Configuration Loader

Robo provides a very simple configuration loader. If you wish to use more capable loader, you may opt to do so. Replace the call to Robo::createConfiguration() with code similar to the following:

use Robo\\Config\\Config;
+use Consolidation\\Config\\Loader\\YamlConfigLoader;
+use Consolidation\\Config\\Loader\\ConfigProcessor;
+
+$config = new Config();
+$loader = new YamlConfigLoader();
+$processor = new ConfigProcessor();
+$processor->extend($loader->load('defaults.yml'));
+$processor->extend($loader->load('myconf.yml'));
+$config->import($processor->export());

You may also wish to subclass the provided Config and ConfigProcessor classes to customize their behavior.

The example above presumes that the configuration object starts off empty. If you need to repeat this process to extend the configuration in a later stage, you should call $processor->add($config->export()); to ensure that the configuration processor is seeded with the previous configuration values.

Any configuraiton loader that produces a nested array may be used in place of the config loaders and config processor shown in the example above. For example, if you wish to find configuration files in a certain set of directories, allow .yml or .xml configuration files, and validate the schema of your configuration files (to alert users of any syntax errors or unrecognized configuration values), you might want to consider Symfony/Config. Symfony/Config produces a clean array of configuration values; the result of $processor->processConfiguration() may be provided directly to Robo's $config->import() method.

`,31)]))}const g=i(e,[["render",p]]);export{E as __pageData,g as default}; diff --git a/assets/framework.md.BcJaTY9h.lean.js b/assets/framework.md.BcJaTY9h.lean.js new file mode 100644 index 0000000..f4dea09 --- /dev/null +++ b/assets/framework.md.BcJaTY9h.lean.js @@ -0,0 +1,117 @@ +import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.DptEmx5X.js";const E=JSON.parse('{"title":"Robo as a Framework","description":"","frontmatter":{},"headers":[],"relativePath":"framework.md","filePath":"framework.md"}'),e={name:"framework.md"};function p(h,s,l,k,o,r){return t(),a("div",null,s[0]||(s[0]=[n(`

Robo as a Framework

For a faster and better start to creating your own commandline application, please see the documentation in the g1a/starter project.

There are multiple ways to use and package Robo scripts; a few of the alternatives are presented below.

Creating a Standalone Phar with Robo

It is possible to create a standalone phar that is implemented with Robo; doing this does not require the RoboFile to be located in the current working directory, or any particular location within your project. To achieve this, first set up your project as shown in the section Implementing Composer Scripts with Robo. Use of the "scripts" section is optional.

Next, add an "autoload" section to your composer.json to provide a namespace for your Robo commands:

json
{
+    "name": "myorg/myproject",
+    "require": {
+        "consolidation/Robo": "^2"
+    },
+    "autoload":{
+        "psr-4":{
+            "MyProject\\\\":"src"
+        }
+    }
+}

Create a new file for your Robo commands, e.g. class RoboFile in namespace MyProject\\Commands; in the file src\\Commands\\RoboFile.php. Optionally, add more task libraries as described in the extending document.

Create a startup script similar to the one below, and add it to the root of your project, or some other location of your choosing:

php
#!/usr/bin/env php
+<?php
+
+// If we're running from phar load the phar autoload file.
+$pharPath = \\Phar::running(true);
+if ($pharPath) {
+    $autoloaderPath = "$pharPath/vendor/autoload.php";
+} else {
+    if (file_exists(__DIR__.'/vendor/autoload.php')) {
+        $autoloaderPath = __DIR__.'/vendor/autoload.php';
+    } elseif (file_exists(__DIR__.'/../../autoload.php')) {
+        $autoloaderPath = __DIR__ . '/../../autoload.php';
+    } else {
+        die("Could not find autoloader. Run 'composer install'.");
+    }
+}
+$classLoader = require $autoloaderPath;
+
+// Customization variables
+$appName = "MyAppName";
+$appVersion = trim(file_get_contents(__DIR__ . '/VERSION'));
+$commandClasses = [ \\MyProject\\Commands\\RoboFile::class ];
+$selfUpdateRepository = 'myorg/myproject';
+$configurationFilename = 'myconfig.yml';
+
+// Define our Runner, and pass it the command classes we provide.
+$runner = new \\Robo\\Runner($commandClasses);
+$runner
+  ->setSelfUpdateRepository($selfUpdateRepository)
+  ->setConfigurationFilename($configurationFilename)
+  ->setClassLoader($classLoader);
+
+// Execute the command and return the result.
+$output = new \\Symfony\\Component\\Console\\Output\\ConsoleOutput();
+$statusCode = $runner->execute($argv, $appName, $appVersion, $output);
+exit($statusCode);

When using Robo as a framework, the Robo file should be included in the autoloader, as Robo does not include a RoboFile.php file when used in this mode. Instead, specify the class or classes to load as a parameter to the Robo\\Runner constructor.

Use box-project/box2 or Robo's taskPackPhar to create a phar for your application. If your application's repository is hosted on GitHub, then passing the appropriate GitHub org/project to the \\Robo\\Robo::run() method, as shown above, will enable the self:update command to automatically update to the latest available version. Note that self:update only works with phar distributions.

Using Multiple RoboFiles in a Standalone Application

It is possible to provide as many command classes as you wish to the Robo Runner() constructor. You might wish to separate your Robo command implementations into separate Robo files if you have a lot of commands, or if you wish to group similar commands together in the same source file. If you do this, you can simply add more class references to the $commandClasses variable shown above.

$commandClasses = [
+    \\MyProject\\Commands\\BuildCommands::class,
+    \\MyProject\\Commands\\DeployCommands::class
+];

If your application has a large number of command files, or if it supports command extensions, then you might wish to use the Command Discovery class to locate your files. The CommandFileDiscovery class will use the Symfony Finder class to search for all filenames matching the provided search pattern. It will return a list of class names using the provided base namespace.

php
$discovery = new \\Consolidation\\AnnotatedCommand\\CommandFileDiscovery();
+$discovery->setSearchPattern('*Command.php');
+$commandClasses = $discovery->discover('php/MyProject/Commands', '\\MyProject\\Commands');

Pass the resulting $commandClasses to the Runner() constructor as shown above. See the annotated-commands project for more information about the different options that the discovery command takes.

Using Your Own Dependency Injection Container with Robo (Advanced)

It is also possible to completely replace the Robo application with your own. To do this, set up your project as described in the sections above, but replace the Robo runner with your own main event loop.

Add the following to your startup file:

php
<?php
+use League\\Container\\Container;
+use Robo\\Robo;
+
+$input = new \\Symfony\\Component\\Console\\Input\\ArgvInput($argv);
+$output = new \\Symfony\\Component\\Console\\Output\\ConsoleOutput();
+$config = Robo::createConfiguration(['myconf.yml']);
+$app = new \\MyApplication($config, $input, $output);
+$status_code = $app->run($input, $output);
+exit($status_code);

Then, create your own custom application:

php
<?php
+
+use Robo\\Common\\ConfigAwareTrait;
+use Robo\\Config;
+use Robo\\Robo;
+use Robo\\Runner as RoboRunner;
+use Symfony\\Component\\Console\\Application;
+use Symfony\\Component\\Console\\Input\\InputInterface;
+use Symfony\\Component\\Console\\Output\\OutputInterface;
+
+class MyApplication {
+
+  const APPLICATION_NAME = 'My Application';
+  const REPOSITORY = 'org/project';
+
+  use ConfigAwareTrait;
+
+  private $runner;
+
+  public function __construct(
+    Config $config,
+    InputInterface $input = NULL,
+    OutputInterface $output = NULL
+  ) {
+
+    // Create applicaton.
+    $this->setConfig($config);
+    $application = new Application(self::APPLICATION_NAME, $config->get('version'));
+
+    // Create and configure container.
+    $container = Robo::createContainer($application, $config);
+    $container->add(MyCustomService::class); // optional
+    Robo::finalizeContainer($container);
+
+    // Instantiate Robo Runner.
+    $this->runner = new RoboRunner([
+      My\\Custom\\Command::class
+    ]);
+    $this->runner->setContainer($container);
+    $this->runner->setSelfUpdateRepository(self::REPOSITORY);
+  }
+
+  public function run(InputInterface $input, OutputInterface $output) {
+    $status_code = $this->runner->run($input, $output);
+
+    return $status_code;
+  }
+
+}

If you are using League\\Container (recommended), then you may simply add and share your own classes to the same container. If you are using some other DI container, then you should use delegate lookup to combine them.

Using a Custom Configuration Loader

Robo provides a very simple configuration loader. If you wish to use more capable loader, you may opt to do so. Replace the call to Robo::createConfiguration() with code similar to the following:

use Robo\\Config\\Config;
+use Consolidation\\Config\\Loader\\YamlConfigLoader;
+use Consolidation\\Config\\Loader\\ConfigProcessor;
+
+$config = new Config();
+$loader = new YamlConfigLoader();
+$processor = new ConfigProcessor();
+$processor->extend($loader->load('defaults.yml'));
+$processor->extend($loader->load('myconf.yml'));
+$config->import($processor->export());

You may also wish to subclass the provided Config and ConfigProcessor classes to customize their behavior.

The example above presumes that the configuration object starts off empty. If you need to repeat this process to extend the configuration in a later stage, you should call $processor->add($config->export()); to ensure that the configuration processor is seeded with the previous configuration values.

Any configuraiton loader that produces a nested array may be used in place of the config loaders and config processor shown in the example above. For example, if you wish to find configuration files in a certain set of directories, allow .yml or .xml configuration files, and validate the schema of your configuration files (to alert users of any syntax errors or unrecognized configuration values), you might want to consider Symfony/Config. Symfony/Config produces a clean array of configuration values; the result of $processor->processConfiguration() may be provided directly to Robo's $config->import() method.

`,31)]))}const g=i(e,[["render",p]]);export{E as __pageData,g as default}; diff --git a/assets/getting-started.md.CEdBbAjT.js b/assets/getting-started.md.CEdBbAjT.js new file mode 100644 index 0000000..71ed8b7 --- /dev/null +++ b/assets/getting-started.md.CEdBbAjT.js @@ -0,0 +1,196 @@ +import{_ as a,c as i,a2 as n,o as e}from"./chunks/framework.DptEmx5X.js";const k=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md"}'),t={name:"getting-started.md"};function l(p,s,o,h,r,d){return e(),i("div",null,s[0]||(s[0]=[n(`

Getting Started

To begin you need to create a RoboFile. Just run robo init in your project directory:

cd myproject
+robo init

Your project directory may start out empty; Robo will create a new RoboFile.php for you. There will be RoboFile class which extends \\Robo\\Tasks, which includes all bundled tasks of Robo.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+}
+?>

Commands

All public methods of the RoboFile class will be treated as commands. You can run them from the CLI and pass arguments.

php
<?php
+
+use Robo\\Symfony\\ConsoleIO;
+
+class RoboFile extends \\Robo\\Tasks
+{
+    function hello(ConsoleIO $io, $world)
+    {
+        $io->say("Hello, $world");
+    }
+}
+?>

Note: The class ConsoleIO isa SymfonyStyle, and therefore has access to all of the Symfony styling methods. It also adds a few Robo extensions such as the say() and yell() output styles. This parameter may be omitted for commands that do not perofrom any output.

When we run:

robo hello davert
+➜ Hello, davert

Note: This assumes you have installed Robo by downloading the robo.phar file and copied it to a directory in your $PATH. For example, cp robo.phar ~/bin/robo.

Method names in a RoboFile should be camelCased. When called from the CLI, camelCased methods will be available as commands formatted as camel:cased. longCamelCased methods will be transformed to commands formatted as long:camel-cased.

Arguments

All method parameters without default values are treated as required arguments. In our example command hello requires one argument.

If you pass a default value to parameter the argument becomes optional:

php
<?php
+    function hello(ConsoleIO $io, $world = 'world')
+    {
+        $io->say("Hello, $world");
+    }
+?>
robo hello
+➜ Hello, world

To accept multiple, variable arguments, typehint a parameter as an array; Robo will then pass all CLI arguments in this variable:

php
<?php
+    function hello(ConsoleIO $io, array $world)
+    {
+        $io->say("Hello, " . implode(', ', $world));
+    }
+?>
robo hello davert jon bill bob
+➜ Hello, davert, jon, bill, bob

Options

To define command options you should define the last method parameter as an associative array where the keys define the option names and the values provide each option's default value:

php
<?php
+    function hello(ConsoleIO $io, $opts = ['silent' => false])
+    {
+        if (!$opts['silent']) $io->say("Hello, world");
+    }
+?>
robo hello
+➜ Hello, world
+
+robo hello --silent

A one-character shortcut can be specified for option:

php
<?php
+    function hello(ConsoleIO $io, $opts = ['silent|s' => false])
+    {
+        if (!$opts['silent']) $io->say("Hello, world");
+    }
+?>

Now command can be executed with '-s' to run in silent mode:

robo hello -s

The default value for options must be one of:

  • The boolean value false, which indicates that the option takes no value; the variable will be true if the option appears on the commandline, and will be false otherwise.
  • The boolean value true, which indicates that the variable should be true unless the option is disabled on the commandline via the flag --no-foo or --foo=0 (for $opts = ['foo' => true]).
  • A string containing the default value for options that may be provided a value, but are not required to.
  • NULL for options that may be provided an optional value, but that have no default when a value is not provided.
  • The special value InputOption::VALUE_REQUIRED, which indicates that the user must provide a value for the option whenever it is used.
  • An empty array, which indicates that the option may appear multiple times on the command line.

No other values should be used for the default value. For example, $options = ['a' => 1] is incorrect; instead, use $options = ['a' => '1'].

Load From Other Robofile

Robo can execute commands from a different RoboFile, eg. located in different directory or with a different filename. You can specify the path to another RoboFile by including the --load-from option:

robo run --load-from /path/to/my/other/robofile

Additional notes:

  • The filename can be anything; it is not limited to RoboFile.php.
  • The class name inside the file has to be the same name as the file has.
  • The class has to be in the root namespace. Eg. Foo.php => \\Foo
  • The internal current directory (cwd) of the PHP process will be switched to the directory where the provided RoboFile came from.

Pass-Through Arguments

Sometimes you need to pass arguments from your command into a task. A command line after the -- delimiter is passed as a single parameter containing all of the following arguments. Any special characters such as - will be passed into without change.

php
<?php
+    function ls(ConsoleIO $io, array $args)
+    {
+        $this->taskExec('ls')->args($args)->run();
+    }
+?>

Note: Creating tasks without a builder, e.g. $this->taskExec() as shown above, is deprecated. See the Collections documentation for the preferred way to declare tasks.

robo ls -- Robo -c --all
+ [ExecTask] running ls Robo -c --all
+ .  ..  CHANGELOG.md  codeception.yml  composer.json  composer.lock  docs  .git  .gitignore  .idea  LICENSE  README.md  robo  RoboFile.php  robo.phar  src  tests  .travis.yml  vendor

Help

The help text for a command in a RoboFile may be provided in Doc-Block comments. An example help Doc-Block comment is shown below:

php
<?php
+/**
+ * Calculate the fibonacci sequence between two numbers.
+ *
+ * Graphic output will look like
+ *     +----+---+-------------+
+ *     |    |   |             |
+ *     |    |-+-|             |
+ *     |----+-+-+             |
+ *     |        |             |
+ *     |        |             |
+ *     |        |             |
+ *     +--------+-------------+
+ *
+ * @param int $start Number to start from
+ * @param int $steps Number of steps to perform
+ * @param array $opts
+ * @option $graphic Display the sequence graphically using cube
+ *                  representation
+ */
+public function fibonacci(ConsoleIO $io, $start, $steps, $opts = ['graphic' => false])
+{
+}
+?>

The corresponding help text produced is:

robo fibonacci --help
+Usage:
+ fibonacci [--graphic] start steps
+
+Arguments:
+ start                 Number to start from
+ steps                 Number of steps to perform
+
+Options:
+ --graphic             Display the sequence graphically using cube representation
+
+Help:
+ Graphic output will look like
+     +----+---+-------------+
+     |    |   |             |
+     |    |-+-|             |
+     |----+-+-+             |
+     |        |             |
+     |        |             |
+     |        |             |
+     +--------+-------------+

Arguments and options are populated from annotations.

Initially added with PR by @jonsa; now provided by the consolidation/annotated-command project, which was factored out from Robo.

Ignored methods

Robo ignores any method of your RoboFile that begins with get or set. These methods are presumed to be data accessors, not commands. To implement a command whose name contains get or set, use the @command annotation.

php
<?php
+    /**
+     * @command set-alignment
+     */
+    function setAlignment(ConsoleIO $io, $value)
+    {
+        ...
+    }
+?>

Tasks

Robo commands typically divide the work they need to accomplish into tasks. The command first determines what needs to be done, inspecting current state if necessary, and then sets up and executes one or more tasks that make the actual changes needed by the command. (See also the documentation on Collections, which allow you to combine groups of tasks which can provide rollback functions to recover from failure situations.)

For details on how to add custom tasks to Robo, see the extending document.

Shortcuts

Some tasks may have shortcuts. If a task does not require multi-step configuration, it can be executed with a single line:

php
<?php
+$this->_exec('ps aux');
+$this->_copy('config/env.example.yml','config/env.yml');
+?>

Result

Each task must return an instance of Robo\\Result. A Robo Result contains the task instance, exit code, message, and any variable data that the task may wish to return.

Note: A task may also return NULL or an array as a shortcut for a successful result. In this instance, Robo will convert the value into a Robo\\Result, and will apply the provided array values, if any, to the result's variable data. This practice is supported, but not recommended.

The run method of CompileAssets class may look like this:

return new Robo\\Result($this, $exitCode, "Assets compiled");

or

return Robo\\Result::success($this, "Assets compiled");
+return Robo\\Result::error($this, "Failed to compile assets");

You can use this results to check if execution was successful, either using the wasSuccessful() method, or via the invoke shortcut. We will use the Exec task in next example to illustrate this:

php
<?php
+class RoboFile
+{
+    use Robo\\Task\\Base\\loadShortcuts;
+
+    function test(ConsoleIO $io)
+    {
+        $res1 = $this->_exec('phpunit tests/integration');
+        $res2 = $this->_exec('phpunit tests/unit');
+
+        // print message when tests passed
+        if ($res1->wasSuccessful() and $res2->wasSuccessful()) $io->say("All tests passed");
+    }
+}
+?>

When making multi-step commands that call one task after another, it is best to use a collection to group the tasks together. The collection will handle error detection and rollback, and will return a single Result object when done. For more information, see the Collections documentation.

Some tasks may also attach data to the Result object. If this is done, the data may be accessed as an array; for example, $result['path'];. This is not common.

Commands should return a Result object obtained from a task; this will ensure that the command exit code is set correctly. If a command does not have a Result object available, then it may use a ResultData object. ResultData objects are just like Result objects, except the do not contain a reference to a task.

return new Robo\\ResultData($exitcode, 'Error message.');

If the command returns a TaskInterface instead of a result, then the task will be executed, and the result from that task will be used as the final result of the command. See also Formatters, below.

Stack

Some tasks contain Stack in their name. These are called "stack" tasks, and they execute similar tasks one after the other. Each of the primary methods in a stack class executes an operation.

Stack tasks also contain a stopOnFail method which can be used to stop task execution if one of its commands was unsuccessful.

Global StopOnFail

There is a global stopOnFail method as well, that can be used to stop a command on first failure of a task.

$this->stopOnFail(true);

Note, however, that using Collections is preferred.

Progress

Robo supports progress indicators via the Symfony ProgressBar class. Long-running tasks that wish to display the progress indicator may do so via four simple steps:

  • Override the progressIndicatorSteps() method and return the number of "steps" in the operation.
  • Call $this->startProgressIndicator() to begin the progress indicator running.
  • Call $this->advanceProgressIndicator() a number of times equal to the result returned by progressIndicatorSteps()
  • Call $this->stopProgressIndicator() when the operation is completed.

An example of this is shown below:

php
<?php
+class MyTask extends BaseTask
+{
+    protected $steps = 10;
+
+    public function progressIndicatorSteps()
+    {
+        return $this->steps;
+    }
+
+    public function run()
+    {
+        $exitCode = 0;
+        $errorMessage = "";
+
+        $this->startProgressIndicator();
+        for ($i = 0; $i < $this->steps; ++$i) {
+            $this->advanceProgressIndicator();
+        }
+        $this->stopProgressIndicator();
+
+        return new Result($this, $exitCode, $errorMessage, ['time' => $this->getExecutionTime()]);
+    }
+}
+?>

Tasks should not attempt to use a specific progress indicator (e.g. the Symfony ProgressBar class) directly, as the ProgressIndicatorAwareTrait allows for an appropriate progress indicator to be used (or omitted) as best suits the application.

Note that when using Collections, the progress bar will automatically be shown if the collection takes longer than two seconds to run. Each task in the collection will count for one "step"; if the task supports progress indicators as shown above, then it will add an additional number of steps as indicated by its progressIndicatorSteps() method.

Configuration

On startup, Robo will load a configuration file, robo.yml, if it exists in the current working directory, or in the directory $HOME/.robo/robo.yml, or at the path set by the ROBO_CONFIG environment variable. If both the user's robo.yml file and a robo.yml in the current working directory exist, then both will be loaded, with values from the configuration file in the current working directory taking precedence over the values in the user's configuration file.

Environment variables can also be used to set individual configuration values. The environment variable key should start with the string ROBO_, and should be followed by an all-uppercase version of the configuration key, with spaces, dashes and dots converted to underscores. For example, to set the progress bar delay to 999999 seconds:

export ROBO_OPTIONS_PROGRESS_DELAY=999999

Configuration values may also be set via the -D commandline switch. The above effect can also be achieved by adding -Doptions.progress-delay=999999 to any Robo command.

Configuration for Command Options

The preferred method for commands to use to read configuration is to simply define commandline options for each configuration value. Configuration may be provided for any command option in the robo.yml configuration file.

For example, given the following Robo command:

php
<?php
+    function hello(ConsoleIO $io, $opts = ['who' => 'unknown'])
+    {
+        $io->say("Hello, " . $opts['who']);
+    }
+?>

The who option can be defined as follows:

command:
+  hello:
+    options:
+      who: world

If you run this command, then it will print Hello, world. If the --who option is provided on the command line, that value will take precidence over the value stored in configuration. Thus, hello --who=everyone will print Hello, everyone.

Command groups may also share configuration options. For example, if you have commands foo:bar, foo:baz and foo:boz, all of which share a common option color, then the following configuration will provide the value blue to foo:bar and foo:baz, and the value green to foo:boz:

command:
+  foo:
+    options:
+      color: blue
+    boz:
+      options:
+        color: green

Configuration for Task Settings

Robo will automatically configure tasks with values from configuration. For example, given the following task definition:

$this->taskMyOperation()
+  ->dir($buildDir)
+  ->extrapolated(false)
+  ->run();

You could instead remove the setter methods and move the parameter values to a configruation file:

$this->taskComposerInstall()
+  ->run();

Then, presuming that taskMyOperation was implemented in a class \\MyOrg\\Task\\TaskGroup\\MyOperation, then the corresponding configuration file would appear as follows:

task:
+  TaskGroup:
+    MyOperation:
+      settings:
+        dir: /my/path
+        extrapolated: false

The key for configuration-injected settings is task.PARTIAL_NAMESPACE.CLASSNAME.settings.key. PARTIAL_NAMESPACE is the namespace for the class, with each \\ replaced with a ., and with each component of the namespace up to and including Task removed.

Tasks in the same namespace may also share configuration-injected settings. For example, the configuration below will set the dir option of any task implemented by a class in the *\\TaskGroup\\MyOperation namespace, unless the task has a more specific configuration value stored with its classname:

task:
+  TaskGroup:
+    settings:
+      dir: /my/path
+      extrapolated: false

Accessing Configuration Directly

In a RoboFile, use \\Robo\\Robo::Config()->get('task.TaskGroup.MyOperation.settings.dir'); to fetch the dir configuration option from the previous example.

In the implementation of taskMyOperation() itself, it is in general not necessary to access configuration values directly, as it is preferable to allow Robo to inject configuration as described above. However, if desired, configuration may be accessed from within the method of any task that extends \\Robo\\Task\\BaseTask (or otherwise uses ConfigAwareTrait) may do so via static::getConfigValue('key', 'default');.

Providing Default Configuration in Code

RoboFiles that wish to provide default configuration values that can be overridden via robo.yml values or commandline options may do so in the class' constructor method. The example below demonstrates how to set up a default value for the task.Ssh.remoteDir configuration property in code:

class RoboFile
+{
+    public function __construct()
+    {
+        Robo\\Task\\Remote\\Ssh::configure('remoteDir', '/srv/www');
+    }
+}

If task.Remote.Ssh.remoteDir is set to some other value in the robo.yml configuration file in the current directory, then the value from the configuration file will take precedence.

Loading Configuration From Another Source

Sometimes, a RoboFile might want to define its own private configuration file to use in addition to the standard robo.yml file. This can also be done in the constructor.

class RoboFile
+{
+    public function __construct()
+    {
+        Robo::loadConfiguration([__DIR__ . '/myconf.yml']);
+    }
+}

Note that configuration loaded in this way will take precedence over the configuration loaded by default by Robo.

It is possible to have even more control than this if you create your own application using Robo as a Framework.

IO

As you noticed, you can print text via the say method, which is taken from the Robo\\Output trait.

$this->say("Hello");

Also, you can ask for input from console:

$name = $this->ask("What is your name?");

There are also askDefault, askHidden, and confirm methods.

In addition, Robo makes all of the methods of Symfony Style available through the io() method:

$this->io()->title("Build all site assets");

This allows Robo scripts to follow the documentation on How to Style a Console Command if desired.

Formatters

It is preferable for commands that look up and display information should avoid doing IO directly, and should instead return the data they wish to display as an array. This data can then be converted into different data formats, such as "table" and "json". The user may select which formatter to use via the --format option. For details on formatters, see the consolidation/output-formatters project.

Working with Composer

Adding a RoboFile to your Project

Robo is designed to work well with Composer. To use Robo scripts in your Composer-based project, simply add robo to your composer.json file:

$ cd myproject
+$ composer require consolidation/robo:^2
+$ ./vendor/bin/robo mycommand

If you do not want to type the whole path to Robo, you may add ./vendor/bin to your $PATH (relative paths work), or use composer exec to find and run Robo:

$ composer exec robo mycommand

Implementing Composer Scripts with Robo

When using Robo in your project, it is convenient to define Composer scripts that call your Robo commands. Simply add the following to your composer.json file:

{
+    "name": "myorg/myproject",
+    "require": {
+        "consolidation/robo": "^2"
+    },
+    "scripts": {
+        "test": "composer robo test",
+        "phar": "composer robo phar:build",
+        "robo": "robo --ansi --load-from $(pwd)/scripts/BuildCommands.php"
+    }
+}

Note: When you include Robo as a library like this, some external projects used by certain core Robo tasks are not automatically included in your project. See the "suggest": section of Robo's composer.json for a list of external projects you might also want to require in your project.

Once you have set up your composer.json file (and ran composer update if you manually changed the require or require-dev sections), Composer will ensure that your project-local copy of Robo in the vendor/bin dir is in your $PATH when you run the additional Composer scripts that you declared:

$ cd myproject
+$ composer test
+$ composer phar

This will call the public methods test() and phar() in your RoboFile.php when using composer test and composer phar, respectively.

Advertising your build commands as Composer scripts is a useful way to provide the key commands used for testing, building or packaging your application. Also, if your application should happen to provide a commandline tool to perform the operations of the application itself, then defining your build commands in their own RoboFile provides desirable separation, keeping your build commands out of the help and list commands of your primary script.

If you would like to simplify the output of your script (e.g. when running on a CI service), replace the --ansi option in the example above with --no-ansi, and colored terminal output and progress bars will be disabled.

Robo as a Framework

For an overview on how to turn your Robo scripts into standalone tools, see the example robo.script, and the section Robo as a Framework.

`,150)]))}const g=a(t,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/getting-started.md.CEdBbAjT.lean.js b/assets/getting-started.md.CEdBbAjT.lean.js new file mode 100644 index 0000000..71ed8b7 --- /dev/null +++ b/assets/getting-started.md.CEdBbAjT.lean.js @@ -0,0 +1,196 @@ +import{_ as a,c as i,a2 as n,o as e}from"./chunks/framework.DptEmx5X.js";const k=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"getting-started.md","filePath":"getting-started.md"}'),t={name:"getting-started.md"};function l(p,s,o,h,r,d){return e(),i("div",null,s[0]||(s[0]=[n(`

Getting Started

To begin you need to create a RoboFile. Just run robo init in your project directory:

cd myproject
+robo init

Your project directory may start out empty; Robo will create a new RoboFile.php for you. There will be RoboFile class which extends \\Robo\\Tasks, which includes all bundled tasks of Robo.

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+}
+?>

Commands

All public methods of the RoboFile class will be treated as commands. You can run them from the CLI and pass arguments.

php
<?php
+
+use Robo\\Symfony\\ConsoleIO;
+
+class RoboFile extends \\Robo\\Tasks
+{
+    function hello(ConsoleIO $io, $world)
+    {
+        $io->say("Hello, $world");
+    }
+}
+?>

Note: The class ConsoleIO isa SymfonyStyle, and therefore has access to all of the Symfony styling methods. It also adds a few Robo extensions such as the say() and yell() output styles. This parameter may be omitted for commands that do not perofrom any output.

When we run:

robo hello davert
+➜ Hello, davert

Note: This assumes you have installed Robo by downloading the robo.phar file and copied it to a directory in your $PATH. For example, cp robo.phar ~/bin/robo.

Method names in a RoboFile should be camelCased. When called from the CLI, camelCased methods will be available as commands formatted as camel:cased. longCamelCased methods will be transformed to commands formatted as long:camel-cased.

Arguments

All method parameters without default values are treated as required arguments. In our example command hello requires one argument.

If you pass a default value to parameter the argument becomes optional:

php
<?php
+    function hello(ConsoleIO $io, $world = 'world')
+    {
+        $io->say("Hello, $world");
+    }
+?>
robo hello
+➜ Hello, world

To accept multiple, variable arguments, typehint a parameter as an array; Robo will then pass all CLI arguments in this variable:

php
<?php
+    function hello(ConsoleIO $io, array $world)
+    {
+        $io->say("Hello, " . implode(', ', $world));
+    }
+?>
robo hello davert jon bill bob
+➜ Hello, davert, jon, bill, bob

Options

To define command options you should define the last method parameter as an associative array where the keys define the option names and the values provide each option's default value:

php
<?php
+    function hello(ConsoleIO $io, $opts = ['silent' => false])
+    {
+        if (!$opts['silent']) $io->say("Hello, world");
+    }
+?>
robo hello
+➜ Hello, world
+
+robo hello --silent

A one-character shortcut can be specified for option:

php
<?php
+    function hello(ConsoleIO $io, $opts = ['silent|s' => false])
+    {
+        if (!$opts['silent']) $io->say("Hello, world");
+    }
+?>

Now command can be executed with '-s' to run in silent mode:

robo hello -s

The default value for options must be one of:

  • The boolean value false, which indicates that the option takes no value; the variable will be true if the option appears on the commandline, and will be false otherwise.
  • The boolean value true, which indicates that the variable should be true unless the option is disabled on the commandline via the flag --no-foo or --foo=0 (for $opts = ['foo' => true]).
  • A string containing the default value for options that may be provided a value, but are not required to.
  • NULL for options that may be provided an optional value, but that have no default when a value is not provided.
  • The special value InputOption::VALUE_REQUIRED, which indicates that the user must provide a value for the option whenever it is used.
  • An empty array, which indicates that the option may appear multiple times on the command line.

No other values should be used for the default value. For example, $options = ['a' => 1] is incorrect; instead, use $options = ['a' => '1'].

Load From Other Robofile

Robo can execute commands from a different RoboFile, eg. located in different directory or with a different filename. You can specify the path to another RoboFile by including the --load-from option:

robo run --load-from /path/to/my/other/robofile

Additional notes:

  • The filename can be anything; it is not limited to RoboFile.php.
  • The class name inside the file has to be the same name as the file has.
  • The class has to be in the root namespace. Eg. Foo.php => \\Foo
  • The internal current directory (cwd) of the PHP process will be switched to the directory where the provided RoboFile came from.

Pass-Through Arguments

Sometimes you need to pass arguments from your command into a task. A command line after the -- delimiter is passed as a single parameter containing all of the following arguments. Any special characters such as - will be passed into without change.

php
<?php
+    function ls(ConsoleIO $io, array $args)
+    {
+        $this->taskExec('ls')->args($args)->run();
+    }
+?>

Note: Creating tasks without a builder, e.g. $this->taskExec() as shown above, is deprecated. See the Collections documentation for the preferred way to declare tasks.

robo ls -- Robo -c --all
+ [ExecTask] running ls Robo -c --all
+ .  ..  CHANGELOG.md  codeception.yml  composer.json  composer.lock  docs  .git  .gitignore  .idea  LICENSE  README.md  robo  RoboFile.php  robo.phar  src  tests  .travis.yml  vendor

Help

The help text for a command in a RoboFile may be provided in Doc-Block comments. An example help Doc-Block comment is shown below:

php
<?php
+/**
+ * Calculate the fibonacci sequence between two numbers.
+ *
+ * Graphic output will look like
+ *     +----+---+-------------+
+ *     |    |   |             |
+ *     |    |-+-|             |
+ *     |----+-+-+             |
+ *     |        |             |
+ *     |        |             |
+ *     |        |             |
+ *     +--------+-------------+
+ *
+ * @param int $start Number to start from
+ * @param int $steps Number of steps to perform
+ * @param array $opts
+ * @option $graphic Display the sequence graphically using cube
+ *                  representation
+ */
+public function fibonacci(ConsoleIO $io, $start, $steps, $opts = ['graphic' => false])
+{
+}
+?>

The corresponding help text produced is:

robo fibonacci --help
+Usage:
+ fibonacci [--graphic] start steps
+
+Arguments:
+ start                 Number to start from
+ steps                 Number of steps to perform
+
+Options:
+ --graphic             Display the sequence graphically using cube representation
+
+Help:
+ Graphic output will look like
+     +----+---+-------------+
+     |    |   |             |
+     |    |-+-|             |
+     |----+-+-+             |
+     |        |             |
+     |        |             |
+     |        |             |
+     +--------+-------------+

Arguments and options are populated from annotations.

Initially added with PR by @jonsa; now provided by the consolidation/annotated-command project, which was factored out from Robo.

Ignored methods

Robo ignores any method of your RoboFile that begins with get or set. These methods are presumed to be data accessors, not commands. To implement a command whose name contains get or set, use the @command annotation.

php
<?php
+    /**
+     * @command set-alignment
+     */
+    function setAlignment(ConsoleIO $io, $value)
+    {
+        ...
+    }
+?>

Tasks

Robo commands typically divide the work they need to accomplish into tasks. The command first determines what needs to be done, inspecting current state if necessary, and then sets up and executes one or more tasks that make the actual changes needed by the command. (See also the documentation on Collections, which allow you to combine groups of tasks which can provide rollback functions to recover from failure situations.)

For details on how to add custom tasks to Robo, see the extending document.

Shortcuts

Some tasks may have shortcuts. If a task does not require multi-step configuration, it can be executed with a single line:

php
<?php
+$this->_exec('ps aux');
+$this->_copy('config/env.example.yml','config/env.yml');
+?>

Result

Each task must return an instance of Robo\\Result. A Robo Result contains the task instance, exit code, message, and any variable data that the task may wish to return.

Note: A task may also return NULL or an array as a shortcut for a successful result. In this instance, Robo will convert the value into a Robo\\Result, and will apply the provided array values, if any, to the result's variable data. This practice is supported, but not recommended.

The run method of CompileAssets class may look like this:

return new Robo\\Result($this, $exitCode, "Assets compiled");

or

return Robo\\Result::success($this, "Assets compiled");
+return Robo\\Result::error($this, "Failed to compile assets");

You can use this results to check if execution was successful, either using the wasSuccessful() method, or via the invoke shortcut. We will use the Exec task in next example to illustrate this:

php
<?php
+class RoboFile
+{
+    use Robo\\Task\\Base\\loadShortcuts;
+
+    function test(ConsoleIO $io)
+    {
+        $res1 = $this->_exec('phpunit tests/integration');
+        $res2 = $this->_exec('phpunit tests/unit');
+
+        // print message when tests passed
+        if ($res1->wasSuccessful() and $res2->wasSuccessful()) $io->say("All tests passed");
+    }
+}
+?>

When making multi-step commands that call one task after another, it is best to use a collection to group the tasks together. The collection will handle error detection and rollback, and will return a single Result object when done. For more information, see the Collections documentation.

Some tasks may also attach data to the Result object. If this is done, the data may be accessed as an array; for example, $result['path'];. This is not common.

Commands should return a Result object obtained from a task; this will ensure that the command exit code is set correctly. If a command does not have a Result object available, then it may use a ResultData object. ResultData objects are just like Result objects, except the do not contain a reference to a task.

return new Robo\\ResultData($exitcode, 'Error message.');

If the command returns a TaskInterface instead of a result, then the task will be executed, and the result from that task will be used as the final result of the command. See also Formatters, below.

Stack

Some tasks contain Stack in their name. These are called "stack" tasks, and they execute similar tasks one after the other. Each of the primary methods in a stack class executes an operation.

Stack tasks also contain a stopOnFail method which can be used to stop task execution if one of its commands was unsuccessful.

Global StopOnFail

There is a global stopOnFail method as well, that can be used to stop a command on first failure of a task.

$this->stopOnFail(true);

Note, however, that using Collections is preferred.

Progress

Robo supports progress indicators via the Symfony ProgressBar class. Long-running tasks that wish to display the progress indicator may do so via four simple steps:

  • Override the progressIndicatorSteps() method and return the number of "steps" in the operation.
  • Call $this->startProgressIndicator() to begin the progress indicator running.
  • Call $this->advanceProgressIndicator() a number of times equal to the result returned by progressIndicatorSteps()
  • Call $this->stopProgressIndicator() when the operation is completed.

An example of this is shown below:

php
<?php
+class MyTask extends BaseTask
+{
+    protected $steps = 10;
+
+    public function progressIndicatorSteps()
+    {
+        return $this->steps;
+    }
+
+    public function run()
+    {
+        $exitCode = 0;
+        $errorMessage = "";
+
+        $this->startProgressIndicator();
+        for ($i = 0; $i < $this->steps; ++$i) {
+            $this->advanceProgressIndicator();
+        }
+        $this->stopProgressIndicator();
+
+        return new Result($this, $exitCode, $errorMessage, ['time' => $this->getExecutionTime()]);
+    }
+}
+?>

Tasks should not attempt to use a specific progress indicator (e.g. the Symfony ProgressBar class) directly, as the ProgressIndicatorAwareTrait allows for an appropriate progress indicator to be used (or omitted) as best suits the application.

Note that when using Collections, the progress bar will automatically be shown if the collection takes longer than two seconds to run. Each task in the collection will count for one "step"; if the task supports progress indicators as shown above, then it will add an additional number of steps as indicated by its progressIndicatorSteps() method.

Configuration

On startup, Robo will load a configuration file, robo.yml, if it exists in the current working directory, or in the directory $HOME/.robo/robo.yml, or at the path set by the ROBO_CONFIG environment variable. If both the user's robo.yml file and a robo.yml in the current working directory exist, then both will be loaded, with values from the configuration file in the current working directory taking precedence over the values in the user's configuration file.

Environment variables can also be used to set individual configuration values. The environment variable key should start with the string ROBO_, and should be followed by an all-uppercase version of the configuration key, with spaces, dashes and dots converted to underscores. For example, to set the progress bar delay to 999999 seconds:

export ROBO_OPTIONS_PROGRESS_DELAY=999999

Configuration values may also be set via the -D commandline switch. The above effect can also be achieved by adding -Doptions.progress-delay=999999 to any Robo command.

Configuration for Command Options

The preferred method for commands to use to read configuration is to simply define commandline options for each configuration value. Configuration may be provided for any command option in the robo.yml configuration file.

For example, given the following Robo command:

php
<?php
+    function hello(ConsoleIO $io, $opts = ['who' => 'unknown'])
+    {
+        $io->say("Hello, " . $opts['who']);
+    }
+?>

The who option can be defined as follows:

command:
+  hello:
+    options:
+      who: world

If you run this command, then it will print Hello, world. If the --who option is provided on the command line, that value will take precidence over the value stored in configuration. Thus, hello --who=everyone will print Hello, everyone.

Command groups may also share configuration options. For example, if you have commands foo:bar, foo:baz and foo:boz, all of which share a common option color, then the following configuration will provide the value blue to foo:bar and foo:baz, and the value green to foo:boz:

command:
+  foo:
+    options:
+      color: blue
+    boz:
+      options:
+        color: green

Configuration for Task Settings

Robo will automatically configure tasks with values from configuration. For example, given the following task definition:

$this->taskMyOperation()
+  ->dir($buildDir)
+  ->extrapolated(false)
+  ->run();

You could instead remove the setter methods and move the parameter values to a configruation file:

$this->taskComposerInstall()
+  ->run();

Then, presuming that taskMyOperation was implemented in a class \\MyOrg\\Task\\TaskGroup\\MyOperation, then the corresponding configuration file would appear as follows:

task:
+  TaskGroup:
+    MyOperation:
+      settings:
+        dir: /my/path
+        extrapolated: false

The key for configuration-injected settings is task.PARTIAL_NAMESPACE.CLASSNAME.settings.key. PARTIAL_NAMESPACE is the namespace for the class, with each \\ replaced with a ., and with each component of the namespace up to and including Task removed.

Tasks in the same namespace may also share configuration-injected settings. For example, the configuration below will set the dir option of any task implemented by a class in the *\\TaskGroup\\MyOperation namespace, unless the task has a more specific configuration value stored with its classname:

task:
+  TaskGroup:
+    settings:
+      dir: /my/path
+      extrapolated: false

Accessing Configuration Directly

In a RoboFile, use \\Robo\\Robo::Config()->get('task.TaskGroup.MyOperation.settings.dir'); to fetch the dir configuration option from the previous example.

In the implementation of taskMyOperation() itself, it is in general not necessary to access configuration values directly, as it is preferable to allow Robo to inject configuration as described above. However, if desired, configuration may be accessed from within the method of any task that extends \\Robo\\Task\\BaseTask (or otherwise uses ConfigAwareTrait) may do so via static::getConfigValue('key', 'default');.

Providing Default Configuration in Code

RoboFiles that wish to provide default configuration values that can be overridden via robo.yml values or commandline options may do so in the class' constructor method. The example below demonstrates how to set up a default value for the task.Ssh.remoteDir configuration property in code:

class RoboFile
+{
+    public function __construct()
+    {
+        Robo\\Task\\Remote\\Ssh::configure('remoteDir', '/srv/www');
+    }
+}

If task.Remote.Ssh.remoteDir is set to some other value in the robo.yml configuration file in the current directory, then the value from the configuration file will take precedence.

Loading Configuration From Another Source

Sometimes, a RoboFile might want to define its own private configuration file to use in addition to the standard robo.yml file. This can also be done in the constructor.

class RoboFile
+{
+    public function __construct()
+    {
+        Robo::loadConfiguration([__DIR__ . '/myconf.yml']);
+    }
+}

Note that configuration loaded in this way will take precedence over the configuration loaded by default by Robo.

It is possible to have even more control than this if you create your own application using Robo as a Framework.

IO

As you noticed, you can print text via the say method, which is taken from the Robo\\Output trait.

$this->say("Hello");

Also, you can ask for input from console:

$name = $this->ask("What is your name?");

There are also askDefault, askHidden, and confirm methods.

In addition, Robo makes all of the methods of Symfony Style available through the io() method:

$this->io()->title("Build all site assets");

This allows Robo scripts to follow the documentation on How to Style a Console Command if desired.

Formatters

It is preferable for commands that look up and display information should avoid doing IO directly, and should instead return the data they wish to display as an array. This data can then be converted into different data formats, such as "table" and "json". The user may select which formatter to use via the --format option. For details on formatters, see the consolidation/output-formatters project.

Working with Composer

Adding a RoboFile to your Project

Robo is designed to work well with Composer. To use Robo scripts in your Composer-based project, simply add robo to your composer.json file:

$ cd myproject
+$ composer require consolidation/robo:^2
+$ ./vendor/bin/robo mycommand

If you do not want to type the whole path to Robo, you may add ./vendor/bin to your $PATH (relative paths work), or use composer exec to find and run Robo:

$ composer exec robo mycommand

Implementing Composer Scripts with Robo

When using Robo in your project, it is convenient to define Composer scripts that call your Robo commands. Simply add the following to your composer.json file:

{
+    "name": "myorg/myproject",
+    "require": {
+        "consolidation/robo": "^2"
+    },
+    "scripts": {
+        "test": "composer robo test",
+        "phar": "composer robo phar:build",
+        "robo": "robo --ansi --load-from $(pwd)/scripts/BuildCommands.php"
+    }
+}

Note: When you include Robo as a library like this, some external projects used by certain core Robo tasks are not automatically included in your project. See the "suggest": section of Robo's composer.json for a list of external projects you might also want to require in your project.

Once you have set up your composer.json file (and ran composer update if you manually changed the require or require-dev sections), Composer will ensure that your project-local copy of Robo in the vendor/bin dir is in your $PATH when you run the additional Composer scripts that you declared:

$ cd myproject
+$ composer test
+$ composer phar

This will call the public methods test() and phar() in your RoboFile.php when using composer test and composer phar, respectively.

Advertising your build commands as Composer scripts is a useful way to provide the key commands used for testing, building or packaging your application. Also, if your application should happen to provide a commandline tool to perform the operations of the application itself, then defining your build commands in their own RoboFile provides desirable separation, keeping your build commands out of the help and list commands of your primary script.

If you would like to simplify the output of your script (e.g. when running on a CI service), replace the --ansi option in the example above with --no-ansi, and colored terminal output and progress bars will be disabled.

Robo as a Framework

For an overview on how to turn your Robo scripts into standalone tools, see the example robo.script, and the section Robo as a Framework.

`,150)]))}const g=a(t,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/index.md.cV3qPEbw.js b/assets/index.md.cV3qPEbw.js new file mode 100644 index 0000000..49b703a --- /dev/null +++ b/assets/index.md.cV3qPEbw.js @@ -0,0 +1,61 @@ +import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Robo","text":"Modern and simple PHP task runner","image":{"src":"/images/robo-logo.svg","alt":"Robo"},"actions":[{"theme":"brand","text":"Get Started","link":"/links"},{"theme":"alt","text":"GitHub","link":"https://github.com/consolidation/robo"}]}},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),h={name:"index.md"};function l(e,s,p,k,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`

Automate common tasks:

  • writing cross-platform scripts
  • processing assets (less, sass, minification)
  • running tests
  • executing daemons (and workers)
  • watching filesystem changes
  • deployment with sftp/ssh/docker

Installing

Phar

Download robo.phar >

wget https://robo.li/robo.phar

To install globally put robo.phar in /usr/bin. (/usr/local/bin/ in OSX 10.11+)

chmod +x robo.phar && sudo mv robo.phar /usr/bin/robo

OSX 10.11+

chmod +x robo.phar && sudo mv robo.phar /usr/local/bin/robo

Now you can use it simply via robo.

Composer

  • Run composer require consolidation/robo:^3
  • Use vendor/bin/robo to execute Robo tasks.

Usage

All tasks are defined as public methods in RoboFile.php. It can be created by running robo init. All protected methods in traits that start with task prefix are tasks and can be configured and executed in your tasks.

Examples

The best way to learn Robo by example is to take a look into its own RoboFile or RoboFile of Codeception project. There are also some basic example commands in examples/RoboFile.php.

Here are some snippets from them:


Run acceptance test with local server and selenium server started.

php
<?php
+
+use Robo\\Symfony\\ConsoleIO;
+
+class RoboFile extends \\Robo\\Tasks
+{
+
+    function testAcceptance(ConsoleIO $io, $seleniumPath = '~/selenium-server-standalone-2.39.0.jar')
+    {
+       // launches PHP server on port 8000 for web dir
+       // server will be executed in background and stopped in the end
+       $this->collectionBuilder($io)->taskServer(8000)
+            ->background()
+            ->dir('web')
+            ->run();
+
+       // running Selenium server in background
+       $this->collectionBuilder($io)->taskExec('java -jar ' . $seleniumPath)
+            ->background()
+            ->run();
+
+       // loading Symfony Command and running with passed argument
+       $this->collectionBuilder($io)->taskSymfonyCommand(new \\Codeception\\Command\\Run('run'))
+            ->arg('suite','acceptance')
+            ->run();
+    }
+}

If you execute robo you will see this task added to list of available task with name: test:acceptance. To execute it you should run robo test:acceptance. You may change path to selenium server by passing new path as a argument:

robo test:acceptance "C:\\Downloads\\selenium.jar"

Using watch task so you can use it for running tests or building assets.

php
<?php
+class RoboFile extends \\Robo\\Tasks {
+
+    function watchComposer(ConsoleIO $io)
+    {
+        // when composer.json changes \`composer update\` will be executed
+        $this->collectionBuilder($io)->taskWatch()->monitor('composer.json', function() {
+            $this->collectionBuilder($io)->taskComposerUpdate()->run();
+        })->run();
+    }
+}

Cleaning logs and cache

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    public function clean(ConsoleIO $io)
+    {
+        $this->collectionBuilder($io)->taskCleanDir([
+            'app/cache',
+            'app/logs'
+        ])->run();
+
+        $this->collectionBuilder($io)->taskDeleteDir([
+            'web/assets/tmp_uploads',
+        ])->run();
+    }
+}

This task cleans app/cache and app/logs dirs (ignoring .gitignore and .gitkeep files) Can be executed by running:

robo clean

Creating Phar archive

php
function buildPhar(collectionBuilder $io)
+{
+    $files = Finder::create()->ignoreVCS(true)->files()->name('*.php')->in(__DIR__);
+    $packer = $this->collectionBuilder($io)->taskPackPhar('robo.phar');
+    foreach ($files as $file) {
+        $packer->addFile($file->getRelativePathname(), $file->getRealPath());
+    }
+    $packer->addFile('robo','robo')
+        ->executable('robo')
+        ->run();
+}

We need more tasks!

Create your own tasks and send them as Pull Requests or create packages with "type": "robo-tasks" in composer.json on Packagist.

Credits

Follow @robo_php for updates.

Brought to you by Consolidation Team and our awesome contributors.

`,39)]))}const E=i(h,[["render",l]]);export{g as __pageData,E as default}; diff --git a/assets/index.md.cV3qPEbw.lean.js b/assets/index.md.cV3qPEbw.lean.js new file mode 100644 index 0000000..49b703a --- /dev/null +++ b/assets/index.md.cV3qPEbw.lean.js @@ -0,0 +1,61 @@ +import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"Robo","text":"Modern and simple PHP task runner","image":{"src":"/images/robo-logo.svg","alt":"Robo"},"actions":[{"theme":"brand","text":"Get Started","link":"/links"},{"theme":"alt","text":"GitHub","link":"https://github.com/consolidation/robo"}]}},"headers":[],"relativePath":"index.md","filePath":"index.md"}'),h={name:"index.md"};function l(e,s,p,k,r,d){return t(),a("div",null,s[0]||(s[0]=[n(`

Automate common tasks:

  • writing cross-platform scripts
  • processing assets (less, sass, minification)
  • running tests
  • executing daemons (and workers)
  • watching filesystem changes
  • deployment with sftp/ssh/docker

Installing

Phar

Download robo.phar >

wget https://robo.li/robo.phar

To install globally put robo.phar in /usr/bin. (/usr/local/bin/ in OSX 10.11+)

chmod +x robo.phar && sudo mv robo.phar /usr/bin/robo

OSX 10.11+

chmod +x robo.phar && sudo mv robo.phar /usr/local/bin/robo

Now you can use it simply via robo.

Composer

  • Run composer require consolidation/robo:^3
  • Use vendor/bin/robo to execute Robo tasks.

Usage

All tasks are defined as public methods in RoboFile.php. It can be created by running robo init. All protected methods in traits that start with task prefix are tasks and can be configured and executed in your tasks.

Examples

The best way to learn Robo by example is to take a look into its own RoboFile or RoboFile of Codeception project. There are also some basic example commands in examples/RoboFile.php.

Here are some snippets from them:


Run acceptance test with local server and selenium server started.

php
<?php
+
+use Robo\\Symfony\\ConsoleIO;
+
+class RoboFile extends \\Robo\\Tasks
+{
+
+    function testAcceptance(ConsoleIO $io, $seleniumPath = '~/selenium-server-standalone-2.39.0.jar')
+    {
+       // launches PHP server on port 8000 for web dir
+       // server will be executed in background and stopped in the end
+       $this->collectionBuilder($io)->taskServer(8000)
+            ->background()
+            ->dir('web')
+            ->run();
+
+       // running Selenium server in background
+       $this->collectionBuilder($io)->taskExec('java -jar ' . $seleniumPath)
+            ->background()
+            ->run();
+
+       // loading Symfony Command and running with passed argument
+       $this->collectionBuilder($io)->taskSymfonyCommand(new \\Codeception\\Command\\Run('run'))
+            ->arg('suite','acceptance')
+            ->run();
+    }
+}

If you execute robo you will see this task added to list of available task with name: test:acceptance. To execute it you should run robo test:acceptance. You may change path to selenium server by passing new path as a argument:

robo test:acceptance "C:\\Downloads\\selenium.jar"

Using watch task so you can use it for running tests or building assets.

php
<?php
+class RoboFile extends \\Robo\\Tasks {
+
+    function watchComposer(ConsoleIO $io)
+    {
+        // when composer.json changes \`composer update\` will be executed
+        $this->collectionBuilder($io)->taskWatch()->monitor('composer.json', function() {
+            $this->collectionBuilder($io)->taskComposerUpdate()->run();
+        })->run();
+    }
+}

Cleaning logs and cache

php
<?php
+class RoboFile extends \\Robo\\Tasks
+{
+    public function clean(ConsoleIO $io)
+    {
+        $this->collectionBuilder($io)->taskCleanDir([
+            'app/cache',
+            'app/logs'
+        ])->run();
+
+        $this->collectionBuilder($io)->taskDeleteDir([
+            'web/assets/tmp_uploads',
+        ])->run();
+    }
+}

This task cleans app/cache and app/logs dirs (ignoring .gitignore and .gitkeep files) Can be executed by running:

robo clean

Creating Phar archive

php
function buildPhar(collectionBuilder $io)
+{
+    $files = Finder::create()->ignoreVCS(true)->files()->name('*.php')->in(__DIR__);
+    $packer = $this->collectionBuilder($io)->taskPackPhar('robo.phar');
+    foreach ($files as $file) {
+        $packer->addFile($file->getRelativePathname(), $file->getRealPath());
+    }
+    $packer->addFile('robo','robo')
+        ->executable('robo')
+        ->run();
+}

We need more tasks!

Create your own tasks and send them as Pull Requests or create packages with "type": "robo-tasks" in composer.json on Packagist.

Credits

Follow @robo_php for updates.

Brought to you by Consolidation Team and our awesome contributors.

`,39)]))}const E=i(h,[["render",l]]);export{g as __pageData,E as default}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000..b6b603d Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000..def40a4 Binary files /dev/null and b/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ diff --git a/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 new file mode 100644 index 0000000..e070c3d Binary files /dev/null and b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000..a3c16ca Binary files /dev/null and b/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000..2210a89 Binary files /dev/null and b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ diff --git a/assets/inter-italic-latin.C2AdPX0b.woff2 b/assets/inter-italic-latin.C2AdPX0b.woff2 new file mode 100644 index 0000000..790d62d Binary files /dev/null and b/assets/inter-italic-latin.C2AdPX0b.woff2 differ diff --git a/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/assets/inter-italic-vietnamese.BSbpV94h.woff2 new file mode 100644 index 0000000..1eec077 Binary files /dev/null and b/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 new file mode 100644 index 0000000..2cfe615 Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ diff --git a/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 new file mode 100644 index 0000000..e3886dd Binary files /dev/null and b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000..36d6748 Binary files /dev/null and b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000..2bed1e8 Binary files /dev/null and b/assets/inter-roman-greek.BBVDIX6e.woff2 differ diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000..9a8d1e2 Binary files /dev/null and b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000..07d3c53 Binary files /dev/null and b/assets/inter-roman-latin.Di8DUHzh.woff2 differ diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000..57bdc22 Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/assets/links.md.DQC7816G.js b/assets/links.md.DQC7816G.js new file mode 100644 index 0000000..16a0a7d --- /dev/null +++ b/assets/links.md.DQC7816G.js @@ -0,0 +1 @@ +import{_ as e,c as t,a2 as l,o as s}from"./chunks/framework.DptEmx5X.js";const f=JSON.parse('{"title":"Robo Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"links.md","filePath":"links.md"}'),i={name:"links.md"};function o(r,a,h,n,m,c){return s(),t("div",null,a[0]||(a[0]=[l('

Robo Documentation

Tasks

',4)]))}const d=e(i,[["render",o]]);export{f as __pageData,d as default}; diff --git a/assets/links.md.DQC7816G.lean.js b/assets/links.md.DQC7816G.lean.js new file mode 100644 index 0000000..16a0a7d --- /dev/null +++ b/assets/links.md.DQC7816G.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,a2 as l,o as s}from"./chunks/framework.DptEmx5X.js";const f=JSON.parse('{"title":"Robo Documentation","description":"","frontmatter":{},"headers":[],"relativePath":"links.md","filePath":"links.md"}'),i={name:"links.md"};function o(r,a,h,n,m,c){return s(),t("div",null,a[0]||(a[0]=[l('

Robo Documentation

Tasks

',4)]))}const d=e(i,[["render",o]]);export{f as __pageData,d as default}; diff --git a/assets/style.DYPVRNCp.css b/assets/style.DYPVRNCp.css new file mode 100644 index 0000000..88603b8 --- /dev/null +++ b/assets/style.DYPVRNCp.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-c79a1216]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-c79a1216],.VPBackdrop.fade-leave-to[data-v-c79a1216]{opacity:0}.VPBackdrop.fade-leave-active[data-v-c79a1216]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-c79a1216]{display:none}}.NotFound[data-v-d6be1790]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-d6be1790]{padding:96px 32px 168px}}.code[data-v-d6be1790]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-d6be1790]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-d6be1790]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-d6be1790]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-d6be1790]{padding-top:20px}.link[data-v-d6be1790]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-d6be1790]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-b933a997]{position:relative;z-index:1}.nested[data-v-b933a997]{padding-right:16px;padding-left:16px}.outline-link[data-v-b933a997]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-b933a997]:hover,.outline-link.active[data-v-b933a997]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-b933a997]{padding-left:13px}.VPDocAsideOutline[data-v-a5bbad30]{display:none}.VPDocAsideOutline.has-outline[data-v-a5bbad30]{display:block}.content[data-v-a5bbad30]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-a5bbad30]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-a5bbad30]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-3f215769]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-3f215769]{flex-grow:1}.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-3f215769] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-3f215769] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-e98dd255]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-e98dd255]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-e257564d]{margin-top:64px}.edit-info[data-v-e257564d]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-e257564d]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-e257564d]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-e257564d]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-e257564d]{margin-right:8px}.prev-next[data-v-e257564d]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-e257564d]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-e257564d]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-e257564d]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-e257564d]{margin-left:auto;text-align:right}.desc[data-v-e257564d]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-e257564d]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-39a288b8]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-39a288b8]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-39a288b8]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-39a288b8]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-39a288b8]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-39a288b8]{display:flex;justify-content:center}.VPDoc .aside[data-v-39a288b8]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-39a288b8]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-39a288b8]{max-width:1104px}}.container[data-v-39a288b8]{margin:0 auto;width:100%}.aside[data-v-39a288b8]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-39a288b8]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-39a288b8]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-39a288b8]::-webkit-scrollbar{display:none}.aside-curtain[data-v-39a288b8]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-39a288b8]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-39a288b8]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-39a288b8]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-39a288b8]{order:1;margin:0;min-width:640px}}.content-container[data-v-39a288b8]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-39a288b8]{max-width:688px}.VPButton[data-v-fa7799d5]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-fa7799d5]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-fa7799d5]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-fa7799d5]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-fa7799d5]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-fa7799d5]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-fa7799d5]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-fa7799d5]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-fa7799d5]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-fa7799d5]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-fa7799d5]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-fa7799d5]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-fa7799d5]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-8426fc1a]{display:none}.dark .VPImage.light[data-v-8426fc1a]{display:none}.VPHero[data-v-303bb580]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-303bb580]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-303bb580]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-303bb580]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-303bb580]{flex-direction:row}}.main[data-v-303bb580]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-303bb580]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-303bb580]{text-align:left}}@media (min-width: 960px){.main[data-v-303bb580]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-303bb580]{max-width:592px}}.name[data-v-303bb580],.text[data-v-303bb580]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-303bb580],.VPHero.has-image .text[data-v-303bb580]{margin:0 auto}.name[data-v-303bb580]{color:var(--vp-home-hero-name-color)}.clip[data-v-303bb580]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-303bb580],.text[data-v-303bb580]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-303bb580],.text[data-v-303bb580]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-303bb580],.VPHero.has-image .text[data-v-303bb580]{margin:0}}.tagline[data-v-303bb580]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-303bb580]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-303bb580]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-303bb580]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-303bb580]{margin:0}}.actions[data-v-303bb580]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-303bb580]{justify-content:center}@media (min-width: 640px){.actions[data-v-303bb580]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-303bb580]{justify-content:flex-start}}.action[data-v-303bb580]{flex-shrink:0;padding:6px}.image[data-v-303bb580]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-303bb580]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-303bb580]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-303bb580]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-303bb580]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-303bb580]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-303bb580]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-303bb580]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-303bb580]{width:320px;height:320px}}[data-v-303bb580] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-303bb580] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-303bb580] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-a3976bdc]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-a3976bdc]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-a3976bdc]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-a3976bdc]>.VPImage{margin-bottom:20px}.icon[data-v-a3976bdc]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-a3976bdc]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-a3976bdc]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-a3976bdc]{padding-top:8px}.link-text-value[data-v-a3976bdc]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-a3976bdc]{margin-left:6px}.VPFeatures[data-v-a6181336]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-a6181336]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-a6181336]{padding:0 64px}}.container[data-v-a6181336]{margin:0 auto;max-width:1152px}.items[data-v-a6181336]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-a6181336]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-a6181336],.item.grid-4[data-v-a6181336]{width:50%}.item.grid-3[data-v-a6181336],.item.grid-6[data-v-a6181336]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-a6181336]{width:25%}}.container[data-v-8e2d4988]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-8e2d4988]{padding:0 48px}}@media (min-width: 960px){.container[data-v-8e2d4988]{width:100%;padding:0 64px}}.vp-doc[data-v-8e2d4988] .VPHomeSponsors,.vp-doc[data-v-8e2d4988] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-8e2d4988] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-8e2d4988] .VPHomeSponsors a,.vp-doc[data-v-8e2d4988] .VPTeamPage a{text-decoration:none}.VPHome[data-v-686f80a6]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-686f80a6]{margin-bottom:128px}}.VPContent[data-v-1428d186]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-1428d186]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-1428d186]{margin:0}@media (min-width: 960px){.VPContent[data-v-1428d186]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-1428d186]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-1428d186]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e315a0ad]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e315a0ad]{display:none}.VPFooter[data-v-e315a0ad] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-e315a0ad] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-e315a0ad]{padding:32px}}.container[data-v-e315a0ad]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e315a0ad],.copyright[data-v-e315a0ad]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-17a5e62e]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-17a5e62e]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-17a5e62e]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-17a5e62e]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-17a5e62e]{color:var(--vp-c-text-1)}.icon[data-v-17a5e62e]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-17a5e62e]{font-size:14px}.icon[data-v-17a5e62e]{font-size:16px}}.open>.icon[data-v-17a5e62e]{transform:rotate(90deg)}.items[data-v-17a5e62e]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-17a5e62e]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-17a5e62e]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-17a5e62e]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-17a5e62e]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-17a5e62e]{transition:all .2s ease-out}.flyout-leave-active[data-v-17a5e62e]{transition:all .15s ease-in}.flyout-enter-from[data-v-17a5e62e],.flyout-leave-to[data-v-17a5e62e]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-a6f0e41e]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-a6f0e41e]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-a6f0e41e]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-a6f0e41e]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-a6f0e41e]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-a6f0e41e]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-a6f0e41e]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-a6f0e41e]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-a6f0e41e]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-a6f0e41e]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-a6f0e41e]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-a6f0e41e]{display:none}}.menu-icon[data-v-a6f0e41e]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-a6f0e41e]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-a6f0e41e]{padding:12px 32px 11px}}.VPSwitch[data-v-1d5665e3]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-1d5665e3]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1d5665e3]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-1d5665e3]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1d5665e3] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-1d5665e3] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-5337faa4]{opacity:1}.moon[data-v-5337faa4],.dark .sun[data-v-5337faa4]{opacity:0}.dark .moon[data-v-5337faa4]{opacity:1}.dark .VPSwitchAppearance[data-v-5337faa4] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-6c893767]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-6c893767]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-43f1e123]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-43f1e123]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-43f1e123]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-43f1e123]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-69e747b5]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-69e747b5]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-69e747b5]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-69e747b5]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-b98bc113]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-b98bc113] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-b98bc113] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-b98bc113] .group:last-child{padding-bottom:0}.VPMenu[data-v-b98bc113] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-b98bc113] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-b98bc113] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-b98bc113] .action{padding-left:24px}.VPFlyout[data-v-cf11d7a2]{position:relative}.VPFlyout[data-v-cf11d7a2]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-cf11d7a2]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-cf11d7a2]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-cf11d7a2]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-cf11d7a2]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-cf11d7a2]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-cf11d7a2],.button[aria-expanded=true]+.menu[data-v-cf11d7a2]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-cf11d7a2]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-cf11d7a2]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-cf11d7a2]{margin-right:0;font-size:16px}.text-icon[data-v-cf11d7a2]{margin-left:4px;font-size:14px}.icon[data-v-cf11d7a2]{font-size:20px;transition:fill .25s}.menu[data-v-cf11d7a2]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-eee4e7cb]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-eee4e7cb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-eee4e7cb]>svg,.VPSocialLink[data-v-eee4e7cb]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-7bc22406]{display:flex;justify-content:center}.VPNavBarExtra[data-v-bb2aa2f0]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-bb2aa2f0]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-bb2aa2f0]{display:none}}.trans-title[data-v-bb2aa2f0]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-bb2aa2f0],.item.social-links[data-v-bb2aa2f0]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-bb2aa2f0]{min-width:176px}.appearance-action[data-v-bb2aa2f0]{margin-right:-2px}.social-links-list[data-v-bb2aa2f0]{margin:-4px -8px}.VPNavBarHamburger[data-v-e5dd9c1c]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-e5dd9c1c]{display:none}}.container[data-v-e5dd9c1c]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-e5dd9c1c]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-e5dd9c1c]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .middle[data-v-e5dd9c1c],.VPNavBarHamburger.active:hover .bottom[data-v-e5dd9c1c]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-e5dd9c1c],.middle[data-v-e5dd9c1c],.bottom[data-v-e5dd9c1c]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-e5dd9c1c]{top:0;left:0;transform:translate(0)}.middle[data-v-e5dd9c1c]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-e5dd9c1c]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-9c663999]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-9c663999],.VPNavBarMenuLink[data-v-9c663999]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-dc692963]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-dc692963]{display:flex}}/*! @docsearch/css 3.6.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-0394ad82]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-0394ad82]{display:flex;align-items:center}}.title[data-v-ab179fa1]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-ab179fa1]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-ab179fa1]{border-bottom-color:var(--vp-c-divider)}}[data-v-ab179fa1] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-88af2de4]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-88af2de4]{display:flex;align-items:center}}.title[data-v-88af2de4]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-6aa21345]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-6aa21345]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-6aa21345]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-6aa21345]:not(.home){background-color:transparent}.VPNavBar[data-v-6aa21345]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-6aa21345]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-6aa21345]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-6aa21345]{padding:0}}.container[data-v-6aa21345]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-6aa21345],.container>.content[data-v-6aa21345]{pointer-events:none}.container[data-v-6aa21345] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-6aa21345]{max-width:100%}}.title[data-v-6aa21345]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-6aa21345]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-6aa21345]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-6aa21345]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-6aa21345]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-6aa21345]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-6aa21345]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-6aa21345]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-6aa21345]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-6aa21345]{column-gap:.5rem}}.menu+.translations[data-v-6aa21345]:before,.menu+.appearance[data-v-6aa21345]:before,.menu+.social-links[data-v-6aa21345]:before,.translations+.appearance[data-v-6aa21345]:before,.appearance+.social-links[data-v-6aa21345]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-6aa21345]:before,.translations+.appearance[data-v-6aa21345]:before{margin-right:16px}.appearance+.social-links[data-v-6aa21345]:before{margin-left:16px}.social-links[data-v-6aa21345]{margin-right:-8px}.divider[data-v-6aa21345]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-6aa21345]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-6aa21345]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-6aa21345]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-6aa21345]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-6aa21345]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-6aa21345]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-b44890b2]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-b44890b2]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-7f31e1f6]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-7f31e1f6]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-19976ae1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-19976ae1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-8133b170]{display:block}.title[data-v-8133b170]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-b9ab8c58]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-b9ab8c58]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-b9ab8c58]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-b9ab8c58]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-b9ab8c58]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-b9ab8c58]{transform:rotate(45deg)}.button[data-v-b9ab8c58]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-b9ab8c58]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-b9ab8c58]{transition:transform .25s}.group[data-v-b9ab8c58]:first-child{padding-top:0}.group+.group[data-v-b9ab8c58],.group+.item[data-v-b9ab8c58]{padding-top:4px}.VPNavScreenTranslations[data-v-858fe1a4]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-858fe1a4]{height:auto}.title[data-v-858fe1a4]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-858fe1a4]{font-size:16px}.icon.lang[data-v-858fe1a4]{margin-right:8px}.icon.chevron[data-v-858fe1a4]{margin-left:4px}.list[data-v-858fe1a4]{padding:4px 0 0 24px}.link[data-v-858fe1a4]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-f2779853]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-f2779853],.VPNavScreen.fade-leave-active[data-v-f2779853]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-f2779853],.VPNavScreen.fade-leave-active .container[data-v-f2779853]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-f2779853],.VPNavScreen.fade-leave-to[data-v-f2779853]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-f2779853],.VPNavScreen.fade-leave-to .container[data-v-f2779853]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-f2779853]{display:none}}.container[data-v-f2779853]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-f2779853],.menu+.appearance[data-v-f2779853],.translations+.appearance[data-v-f2779853]{margin-top:24px}.menu+.social-links[data-v-f2779853]{margin-top:16px}.appearance+.social-links[data-v-f2779853]{margin-top:16px}.VPNav[data-v-ae24b3ad]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-ae24b3ad]{position:fixed}}.VPSidebarItem.level-0[data-v-b7550ba0]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-b7550ba0]{padding-bottom:10px}.item[data-v-b7550ba0]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-b7550ba0]{cursor:pointer}.indicator[data-v-b7550ba0]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-b7550ba0],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-b7550ba0],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-b7550ba0],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-b7550ba0]{background-color:var(--vp-c-brand-1)}.link[data-v-b7550ba0]{display:flex;align-items:center;flex-grow:1}.text[data-v-b7550ba0]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-b7550ba0]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-b7550ba0],.VPSidebarItem.level-2 .text[data-v-b7550ba0],.VPSidebarItem.level-3 .text[data-v-b7550ba0],.VPSidebarItem.level-4 .text[data-v-b7550ba0],.VPSidebarItem.level-5 .text[data-v-b7550ba0]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-b7550ba0],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-b7550ba0],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-b7550ba0],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-b7550ba0],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-b7550ba0],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-b7550ba0]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-b7550ba0],.VPSidebarItem.level-1.has-active>.item>.text[data-v-b7550ba0],.VPSidebarItem.level-2.has-active>.item>.text[data-v-b7550ba0],.VPSidebarItem.level-3.has-active>.item>.text[data-v-b7550ba0],.VPSidebarItem.level-4.has-active>.item>.text[data-v-b7550ba0],.VPSidebarItem.level-5.has-active>.item>.text[data-v-b7550ba0],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-b7550ba0],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-b7550ba0],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-b7550ba0],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-b7550ba0],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-b7550ba0],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-b7550ba0]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-b7550ba0],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-b7550ba0],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-b7550ba0],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-b7550ba0],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-b7550ba0],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-b7550ba0]{color:var(--vp-c-brand-1)}.caret[data-v-b7550ba0]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-b7550ba0]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-b7550ba0]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-b7550ba0]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-b7550ba0]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-b7550ba0],.VPSidebarItem.level-2 .items[data-v-b7550ba0],.VPSidebarItem.level-3 .items[data-v-b7550ba0],.VPSidebarItem.level-4 .items[data-v-b7550ba0],.VPSidebarItem.level-5 .items[data-v-b7550ba0]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-b7550ba0]{display:none}.no-transition[data-v-c40bc020] .caret-icon{transition:none}.group+.group[data-v-c40bc020]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-c40bc020]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-319d5ca6]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-319d5ca6]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-319d5ca6]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-319d5ca6]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-319d5ca6]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-319d5ca6]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-319d5ca6]{outline:0}.VPSkipLink[data-v-0f60ec36]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-0f60ec36]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-0f60ec36]{top:14px;left:16px}}.Layout[data-v-5d98c3a5]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-3d121b4a]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-3d121b4a]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-3d121b4a]{margin:128px 0}}.VPHomeSponsors[data-v-3d121b4a]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-3d121b4a]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-3d121b4a]{padding:0 64px}}.container[data-v-3d121b4a]{margin:0 auto;max-width:1152px}.love[data-v-3d121b4a]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-3d121b4a]{display:inline-block}.message[data-v-3d121b4a]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-3d121b4a]{padding-top:32px}.action[data-v-3d121b4a]{padding-top:40px;text-align:center}.VPTeamPage[data-v-7c57f839]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-7c57f839]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-7c57f839-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-7c57f839-s],.VPTeamMembers+.VPTeamPageSection[data-v-7c57f839-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-7c57f839-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-7c57f839-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-7c57f839-s],.VPTeamMembers+.VPTeamPageSection[data-v-7c57f839-s]{margin-top:96px}}.VPTeamMembers[data-v-7c57f839-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-7c57f839-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-7c57f839-s]{padding:0 64px}}.VPTeamPageTitle[data-v-bf2cbdac]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-bf2cbdac]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-bf2cbdac]{padding:80px 64px 48px}}.title[data-v-bf2cbdac]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-bf2cbdac]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-bf2cbdac]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-bf2cbdac]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-b1a88750]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-b1a88750]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-b1a88750]{padding:0 64px}}.title[data-v-b1a88750]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-b1a88750]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-b1a88750]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-b1a88750]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-b1a88750]{padding-top:40px}.VPTeamMembersItem[data-v-f3fa364a]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-f3fa364a]{padding:32px}.VPTeamMembersItem.small .data[data-v-f3fa364a]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-f3fa364a]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-f3fa364a]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-f3fa364a]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-f3fa364a]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-f3fa364a]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-f3fa364a]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-f3fa364a]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-f3fa364a]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-f3fa364a]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-f3fa364a]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-f3fa364a]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-f3fa364a]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-f3fa364a]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-f3fa364a]{text-align:center}.avatar[data-v-f3fa364a]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-f3fa364a]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-f3fa364a]{margin:0;font-weight:600}.affiliation[data-v-f3fa364a]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-f3fa364a]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-f3fa364a]:hover{color:var(--vp-c-brand-1)}.desc[data-v-f3fa364a]{margin:0 auto}.desc[data-v-f3fa364a] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-f3fa364a]{display:flex;justify-content:center;height:56px}.sp-link[data-v-f3fa364a]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-f3fa364a]:hover,.sp .sp-link.link[data-v-f3fa364a]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-f3fa364a]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-6cb0dbc4]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-6cb0dbc4]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-6cb0dbc4]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-6cb0dbc4]{max-width:876px}.VPTeamMembers.medium .container[data-v-6cb0dbc4]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-6cb0dbc4]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-6cb0dbc4]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-6cb0dbc4]{max-width:760px}.container[data-v-6cb0dbc4]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-c-brand-1: #4B7BA0;--vp-button-brand-bg: #4B7BA0}:root:hover{--vp-c-brand-2: #548fbc}.VPLocalSearchBox[data-v-797a7f7c]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-797a7f7c]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-797a7f7c]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-797a7f7c]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-797a7f7c]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-797a7f7c]{padding:0 8px}}.search-bar[data-v-797a7f7c]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-797a7f7c]{display:block;font-size:18px}.navigate-icon[data-v-797a7f7c]{display:block;font-size:14px}.search-icon[data-v-797a7f7c]{margin:8px}@media (max-width: 767px){.search-icon[data-v-797a7f7c]{display:none}}.search-input[data-v-797a7f7c]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-797a7f7c]{padding:6px 4px}}.search-actions[data-v-797a7f7c]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-797a7f7c]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-797a7f7c]{display:none}}.search-actions button[data-v-797a7f7c]{padding:8px}.search-actions button[data-v-797a7f7c]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-797a7f7c]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-797a7f7c]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-797a7f7c]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-797a7f7c]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-797a7f7c]{display:none}}.search-keyboard-shortcuts kbd[data-v-797a7f7c]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-797a7f7c]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-797a7f7c]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-797a7f7c]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-797a7f7c]{margin:8px}}.titles[data-v-797a7f7c]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-797a7f7c]{display:flex;align-items:center;gap:4px}.title.main[data-v-797a7f7c]{font-weight:500}.title-icon[data-v-797a7f7c]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-797a7f7c]{opacity:.5}.result.selected[data-v-797a7f7c]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-797a7f7c]{position:relative}.excerpt[data-v-797a7f7c]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-797a7f7c]{opacity:1}.excerpt[data-v-797a7f7c] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-797a7f7c] mark,.excerpt[data-v-797a7f7c] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-797a7f7c] .vp-code-group .tabs{display:none}.excerpt[data-v-797a7f7c] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-797a7f7c]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-797a7f7c]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-797a7f7c],.result.selected .title-icon[data-v-797a7f7c]{color:var(--vp-c-brand-1)!important}.no-results[data-v-797a7f7c]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-797a7f7c]{flex:none} diff --git a/assets/tasks_ApiGen.md.DPsW2ltv.js b/assets/tasks_ApiGen.md.DPsW2ltv.js new file mode 100644 index 0000000..27396c5 --- /dev/null +++ b/assets/tasks_ApiGen.md.DPsW2ltv.js @@ -0,0 +1,8 @@ +import{_ as i,c as a,a2 as s,o}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"ApiGen Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/ApiGen.md","filePath":"tasks/ApiGen.md"}'),t={name:"tasks/ApiGen.md"};function l(d,e,n,r,c,p){return o(),a("div",null,e[0]||(e[0]=[s(`

ApiGen Tasks

ApiGen

Executes ApiGen command to generate documentation

php
<?php
+// ApiGen Command
+$this->taskApiGen('./vendor/apigen/apigen.phar')
+     ->config('./apigen.neon')
+     ->templateConfig('vendor/apigen/apigen/templates/bootstrap/config.neon')
+     ->wipeout(true)
+      ->run();
+?>
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • config($config) * param string $config
  • source($src) * param array|string|\\Traversable $src
  • destination($dest) * param string $dest
  • extensions($exts) * param array|string $exts
  • exclude($exclude) * param array|string $exclude
  • skipDocPath($path) * param array|string|\\Traversable $path
  • skipDocPrefix($prefix) * param array|string|\\Traversable $prefix
  • charset($charset) * param array|string $charset
  • mainProjectNamePrefix($name) * param string $name
  • title($title) * param string $title
  • baseUrl($baseUrl) * param string $baseUrl
  • googleCseId($id) * param string $id
  • googleAnalytics($trackingCode) * param string $trackingCode
  • templateConfig($templateConfig) * param mixed $templateConfig
  • allowedHtml($tags) * param array|string $tags
  • groups($groups) * param string $groups
  • autocomplete($types) * param array|string $types
  • accessLevels($levels) * param array|string $levels
  • internal($internal) * param boolean|string $internal
  • php($php) * param bool|string $php
  • tree($tree) * param bool|string $tree
  • deprecated($dep) * param bool|string $dep
  • todo($todo) * param bool|string $todo
  • sourceCode($src) * param bool|string $src
  • download($zipped) * param bool|string $zipped
  • report($path) * param string $path
  • wipeout($wipeout) * param bool|string $wipeout
  • quiet($quiet) * param bool|string $quiet
  • progressbar($bar) * param bool|string $bar
  • colors($colors) * param bool|string $colors
  • updateCheck($check) * param bool|string $check
  • debug($debug) * param bool|string $debug
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
`,5)]))}const k=i(t,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/tasks_ApiGen.md.DPsW2ltv.lean.js b/assets/tasks_ApiGen.md.DPsW2ltv.lean.js new file mode 100644 index 0000000..27396c5 --- /dev/null +++ b/assets/tasks_ApiGen.md.DPsW2ltv.lean.js @@ -0,0 +1,8 @@ +import{_ as i,c as a,a2 as s,o}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"ApiGen Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/ApiGen.md","filePath":"tasks/ApiGen.md"}'),t={name:"tasks/ApiGen.md"};function l(d,e,n,r,c,p){return o(),a("div",null,e[0]||(e[0]=[s(`

ApiGen Tasks

ApiGen

Executes ApiGen command to generate documentation

php
<?php
+// ApiGen Command
+$this->taskApiGen('./vendor/apigen/apigen.phar')
+     ->config('./apigen.neon')
+     ->templateConfig('vendor/apigen/apigen/templates/bootstrap/config.neon')
+     ->wipeout(true)
+      ->run();
+?>
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • config($config) * param string $config
  • source($src) * param array|string|\\Traversable $src
  • destination($dest) * param string $dest
  • extensions($exts) * param array|string $exts
  • exclude($exclude) * param array|string $exclude
  • skipDocPath($path) * param array|string|\\Traversable $path
  • skipDocPrefix($prefix) * param array|string|\\Traversable $prefix
  • charset($charset) * param array|string $charset
  • mainProjectNamePrefix($name) * param string $name
  • title($title) * param string $title
  • baseUrl($baseUrl) * param string $baseUrl
  • googleCseId($id) * param string $id
  • googleAnalytics($trackingCode) * param string $trackingCode
  • templateConfig($templateConfig) * param mixed $templateConfig
  • allowedHtml($tags) * param array|string $tags
  • groups($groups) * param string $groups
  • autocomplete($types) * param array|string $types
  • accessLevels($levels) * param array|string $levels
  • internal($internal) * param boolean|string $internal
  • php($php) * param bool|string $php
  • tree($tree) * param bool|string $tree
  • deprecated($dep) * param bool|string $dep
  • todo($todo) * param bool|string $todo
  • sourceCode($src) * param bool|string $src
  • download($zipped) * param bool|string $zipped
  • report($path) * param string $path
  • wipeout($wipeout) * param bool|string $wipeout
  • quiet($quiet) * param bool|string $quiet
  • progressbar($bar) * param bool|string $bar
  • colors($colors) * param bool|string $colors
  • updateCheck($check) * param bool|string $check
  • debug($debug) * param bool|string $debug
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
`,5)]))}const k=i(t,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/tasks_Archive.md.CBeND0F3.js b/assets/tasks_Archive.md.CBeND0F3.js new file mode 100644 index 0000000..4fa02d5 --- /dev/null +++ b/assets/tasks_Archive.md.CBeND0F3.js @@ -0,0 +1,14 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Archive Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Archive.md","filePath":"tasks/Archive.md"}'),h={name:"tasks/Archive.md"};function l(n,s,p,r,k,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Archive Tasks

Extract

Extracts an archive.

Note that often, distributions are packaged in tar or zip archives where the topmost folder may contain variable information, such as the release date, or the version of the package. This information is very useful when unpacking by hand, but arbitrarily-named directories are much less useful to scripts. Therefore, by default, Extract will remove the top-level directory, and instead store all extracted files into the directory specified by $archivePath.

To keep the top-level directory when extracting, use preserveTopDirectory(true).

php
<?php
+$this->taskExtract($archivePath)
+ ->to($destination)
+ ->preserveTopDirectory(false) // the default
+ ->run();
+?>
  • to($to) Location to store extracted files.
  • preserveTopDirectory($preserve = null) * param bool $preserve
  • setOutput($output) Sets the Console Output.
  • getBuiltTask($fn, $args) Provides the collection builder with access to all of the

Pack

Creates a zip or tar archive.

php
<?php
+$this->taskPack(
+<archiveFile>)
+->add('README')                         // Puts file 'README' in archive at the root
+->add('project')                        // Puts entire contents of directory 'project' in archinve inside 'project'
+->addFile('dir/file.txt', 'file.txt')   // Takes 'file.txt' from cwd and puts it in archive inside 'dir'.
+->exclude(['dir\\/.*.zip', '.*.md'])      // Add regex (or array of regex) to the excluded patterns list.
+->run();
+?>
  • archiveFile($archiveFile) * param string $archiveFile
  • addFile($placementLocation, $filesystemLocation) Add an item to the archive. Like file_exists(), the parameter
  • addDir($placementLocation, $filesystemLocation) Alias for addFile, in case anyone has angst about using
  • add($item) Add a file or directory, or list of same to the archive.
  • exclude($ignoreList) Allow files or folder to be excluded from the archive. Use regex, without enclosing slashes.
  • setOutput($output) Sets the Console Output.
`,11)]))}const g=i(h,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/tasks_Archive.md.CBeND0F3.lean.js b/assets/tasks_Archive.md.CBeND0F3.lean.js new file mode 100644 index 0000000..4fa02d5 --- /dev/null +++ b/assets/tasks_Archive.md.CBeND0F3.lean.js @@ -0,0 +1,14 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Archive Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Archive.md","filePath":"tasks/Archive.md"}'),h={name:"tasks/Archive.md"};function l(n,s,p,r,k,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Archive Tasks

Extract

Extracts an archive.

Note that often, distributions are packaged in tar or zip archives where the topmost folder may contain variable information, such as the release date, or the version of the package. This information is very useful when unpacking by hand, but arbitrarily-named directories are much less useful to scripts. Therefore, by default, Extract will remove the top-level directory, and instead store all extracted files into the directory specified by $archivePath.

To keep the top-level directory when extracting, use preserveTopDirectory(true).

php
<?php
+$this->taskExtract($archivePath)
+ ->to($destination)
+ ->preserveTopDirectory(false) // the default
+ ->run();
+?>
  • to($to) Location to store extracted files.
  • preserveTopDirectory($preserve = null) * param bool $preserve
  • setOutput($output) Sets the Console Output.
  • getBuiltTask($fn, $args) Provides the collection builder with access to all of the

Pack

Creates a zip or tar archive.

php
<?php
+$this->taskPack(
+<archiveFile>)
+->add('README')                         // Puts file 'README' in archive at the root
+->add('project')                        // Puts entire contents of directory 'project' in archinve inside 'project'
+->addFile('dir/file.txt', 'file.txt')   // Takes 'file.txt' from cwd and puts it in archive inside 'dir'.
+->exclude(['dir\\/.*.zip', '.*.md'])      // Add regex (or array of regex) to the excluded patterns list.
+->run();
+?>
  • archiveFile($archiveFile) * param string $archiveFile
  • addFile($placementLocation, $filesystemLocation) Add an item to the archive. Like file_exists(), the parameter
  • addDir($placementLocation, $filesystemLocation) Alias for addFile, in case anyone has angst about using
  • add($item) Add a file or directory, or list of same to the archive.
  • exclude($ignoreList) Allow files or folder to be excluded from the archive. Use regex, without enclosing slashes.
  • setOutput($output) Sets the Console Output.
`,11)]))}const g=i(h,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/tasks_Assets.md.9yJg3m8Y.js b/assets/tasks_Assets.md.9yJg3m8Y.js new file mode 100644 index 0000000..6043d44 --- /dev/null +++ b/assets/tasks_Assets.md.9yJg3m8Y.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Assets Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Assets.md","filePath":"tasks/Assets.md"}'),n={name:"tasks/Assets.md"};function l(p,s,h,k,r,d){return e(),a("div",null,s[0]||(s[0]=[t(`

Assets Tasks

ImageMinify

Minifies images.

When the task is run without any specified minifier it will compress the images based on the extension.

php
$this->taskImageMinify('assets/images/*')
+    ->to('dist/images/')
+    ->run();

This will use the following minifiers based in the extension:

  • PNG: optipng
  • GIF: gifsicle
  • JPG, JPEG: jpegtran
  • SVG: svgo

When the required minifier is not installed on the system the task will try to download it from the imagemin repository into a local directory. This directory is vendor/bin/ by default and may be changed:

php
$this->taskImageMinify('assets/images/*')
+    ->setExecutableDir('/tmp/imagemin/bin/)
+    ->to('dist/images/')
+    ->run();

When the minifier is specified the task will use that for all the input files. In that case it is useful to filter the files with the extension:

php
$this->taskImageMinify('assets/images/*.png')
+    ->to('dist/images/')
+    ->minifier('pngcrush');
+    ->run();

The task supports the following minifiers:

  • optipng
  • pngquant
  • advpng
  • pngout
  • zopflipng
  • pngcrush
  • gifsicle
  • jpegoptim
  • jpeg-recompress
  • jpegtran
  • svgo (only minification, no downloading)

You can also specifiy extra options for the minifiers:

php
$this->taskImageMinify('assets/images/*.jpg')
+    ->to('dist/images/')
+    ->minifier('jpegtran', ['-progressive' => null, '-copy' => 'none'])
+    ->run();

This will execute as: jpegtran -copy none -progressive -optimize -outfile "dist/images/test.jpg" "/var/www/test/assets/images/test.jpg"

  • setExecutableDir($directory) Sets the target directory for executables (vendor/bin/ by default)
  • to($target) Sets the target directory where the files will be copied to.
  • minifier($minifier, array $options = Array ( ) ) Sets the minifier.
  • setOutput($output) Sets the Console Output.

Less

Compiles less files.

php
<?php
+$this->taskLess([
+    'less/default.less' => 'css/default.css'
+])
+->run();
+?>

Use one of both less compilers in your project:

"leafo/lessphp": "~0.5",
+"oyejorge/less.php": "~1.5"

Specify directory (string or array) for less imports lookup:

php
<?php
+$this->taskLess([
+    'less/default.less' => 'css/default.css'
+])
+->importDir('less')
+->compiler('lessphp')
+->run();
+?>

You can implement additional compilers by extending this task and adding a method named after them and overloading the lessCompilers() method to inject the name there.

  • importDir($dirs) Sets import directories
  • addImportPath($dir) Adds import directory
  • setImportPaths($dirs) Sets import directories
  • setFormatter($formatterName) * param string $formatterName
  • compiler($compiler, array $options = Array ( ) ) Sets the compiler.
  • setOutput($output) Sets the Console Output.

Minify

Minifies an asset file (CSS or JS).

php
<?php
+$this->taskMinify('web/assets/theme.css')
+     ->run()
+?>

Please install additional packages to use this task:

composer require patchwork/jsqueeze:^2.0
+composer require natxet/cssmin:^3.0
  • to($dst) Sets destination. Tries to guess type from it.
  • type($type) Sets type with validation.
  • singleLine($singleLine) Single line option for the JS minimisation.
  • keepImportantComments($keepImportantComments) keepImportantComments option for the JS minimisation.
  • specialVarRx($specialVarRx) Set specialVarRx option for the JS minimisation.
  • __toString() @return string
  • setOutput($output) Sets the Console Output.

Scss

Compiles scss files.

php
<?php
+$this->taskScss([
+    'scss/default.scss' => 'css/default.css'
+])
+->importDir('assets/styles')
+->run();
+?>

Use the following scss compiler in your project:

"scssphp/scssphp ": "~1.0.0",

You can implement additional compilers by extending this task and adding a method named after them and overloading the scssCompilers() method to inject the name there.

  • setFormatter($formatterName) Sets the formatter for scssphp
  • importDir($dirs) Sets import directories
  • addImportPath($dir) Adds import directory
  • setImportPaths($dirs) Sets import directories
  • compiler($compiler, array $options = Array ( ) ) Sets the compiler.
  • setOutput($output) Sets the Console Output.
`,39)]))}const c=i(n,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/tasks_Assets.md.9yJg3m8Y.lean.js b/assets/tasks_Assets.md.9yJg3m8Y.lean.js new file mode 100644 index 0000000..6043d44 --- /dev/null +++ b/assets/tasks_Assets.md.9yJg3m8Y.lean.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Assets Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Assets.md","filePath":"tasks/Assets.md"}'),n={name:"tasks/Assets.md"};function l(p,s,h,k,r,d){return e(),a("div",null,s[0]||(s[0]=[t(`

Assets Tasks

ImageMinify

Minifies images.

When the task is run without any specified minifier it will compress the images based on the extension.

php
$this->taskImageMinify('assets/images/*')
+    ->to('dist/images/')
+    ->run();

This will use the following minifiers based in the extension:

  • PNG: optipng
  • GIF: gifsicle
  • JPG, JPEG: jpegtran
  • SVG: svgo

When the required minifier is not installed on the system the task will try to download it from the imagemin repository into a local directory. This directory is vendor/bin/ by default and may be changed:

php
$this->taskImageMinify('assets/images/*')
+    ->setExecutableDir('/tmp/imagemin/bin/)
+    ->to('dist/images/')
+    ->run();

When the minifier is specified the task will use that for all the input files. In that case it is useful to filter the files with the extension:

php
$this->taskImageMinify('assets/images/*.png')
+    ->to('dist/images/')
+    ->minifier('pngcrush');
+    ->run();

The task supports the following minifiers:

  • optipng
  • pngquant
  • advpng
  • pngout
  • zopflipng
  • pngcrush
  • gifsicle
  • jpegoptim
  • jpeg-recompress
  • jpegtran
  • svgo (only minification, no downloading)

You can also specifiy extra options for the minifiers:

php
$this->taskImageMinify('assets/images/*.jpg')
+    ->to('dist/images/')
+    ->minifier('jpegtran', ['-progressive' => null, '-copy' => 'none'])
+    ->run();

This will execute as: jpegtran -copy none -progressive -optimize -outfile "dist/images/test.jpg" "/var/www/test/assets/images/test.jpg"

  • setExecutableDir($directory) Sets the target directory for executables (vendor/bin/ by default)
  • to($target) Sets the target directory where the files will be copied to.
  • minifier($minifier, array $options = Array ( ) ) Sets the minifier.
  • setOutput($output) Sets the Console Output.

Less

Compiles less files.

php
<?php
+$this->taskLess([
+    'less/default.less' => 'css/default.css'
+])
+->run();
+?>

Use one of both less compilers in your project:

"leafo/lessphp": "~0.5",
+"oyejorge/less.php": "~1.5"

Specify directory (string or array) for less imports lookup:

php
<?php
+$this->taskLess([
+    'less/default.less' => 'css/default.css'
+])
+->importDir('less')
+->compiler('lessphp')
+->run();
+?>

You can implement additional compilers by extending this task and adding a method named after them and overloading the lessCompilers() method to inject the name there.

  • importDir($dirs) Sets import directories
  • addImportPath($dir) Adds import directory
  • setImportPaths($dirs) Sets import directories
  • setFormatter($formatterName) * param string $formatterName
  • compiler($compiler, array $options = Array ( ) ) Sets the compiler.
  • setOutput($output) Sets the Console Output.

Minify

Minifies an asset file (CSS or JS).

php
<?php
+$this->taskMinify('web/assets/theme.css')
+     ->run()
+?>

Please install additional packages to use this task:

composer require patchwork/jsqueeze:^2.0
+composer require natxet/cssmin:^3.0
  • to($dst) Sets destination. Tries to guess type from it.
  • type($type) Sets type with validation.
  • singleLine($singleLine) Single line option for the JS minimisation.
  • keepImportantComments($keepImportantComments) keepImportantComments option for the JS minimisation.
  • specialVarRx($specialVarRx) Set specialVarRx option for the JS minimisation.
  • __toString() @return string
  • setOutput($output) Sets the Console Output.

Scss

Compiles scss files.

php
<?php
+$this->taskScss([
+    'scss/default.scss' => 'css/default.css'
+])
+->importDir('assets/styles')
+->run();
+?>

Use the following scss compiler in your project:

"scssphp/scssphp ": "~1.0.0",

You can implement additional compilers by extending this task and adding a method named after them and overloading the scssCompilers() method to inject the name there.

  • setFormatter($formatterName) Sets the formatter for scssphp
  • importDir($dirs) Sets import directories
  • addImportPath($dir) Adds import directory
  • setImportPaths($dirs) Sets import directories
  • compiler($compiler, array $options = Array ( ) ) Sets the compiler.
  • setOutput($output) Sets the Console Output.
`,39)]))}const c=i(n,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/tasks_Base.md.U8B-s0P6.js b/assets/tasks_Base.md.U8B-s0P6.js new file mode 100644 index 0000000..b8b4d08 --- /dev/null +++ b/assets/tasks_Base.md.U8B-s0P6.js @@ -0,0 +1,69 @@ +import{_ as n,c as t,a2 as i,j as a,o as l}from"./chunks/framework.DptEmx5X.js";const E=JSON.parse('{"title":"Base Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Base.md","filePath":"tasks/Base.md"}'),p={name:"tasks/Base.md"};function e(h,s,k,r,d,o){return l(),t("div",null,[s[3]||(s[3]=i(`

Base Tasks

Exec

Executes shell script. Closes it when running in background mode.

php
<?php
+$this->taskExec('compass')->arg('watch')->run();
+// or use shortcut
+$this->_exec('compass watch');
+
+$this->taskExec('compass watch')->background()->run();
+
+if ($this->taskExec('phpunit .')->run()->wasSuccessful()) {
+ $this->say('tests passed');
+}
+
+?>
`,4)),a("ul",null,[a("li",{onInheritdoc:s[0]||(s[0]=()=>{})},s[1]||(s[1]=[a("code",null,"simulate($context)",-1)]),32),s[2]||(s[2]=i("
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",9))]),s[4]||(s[4]=i(`

    ExecStack

    Execute commands one by one in stack. Stack can be stopped on first fail if you call stopOnFail().

    php
    <?php
    +$this->taskExecStack()
    + ->stopOnFail()
    + ->exec('mkdir site')
    + ->exec('cd site')
    + ->run();
    +
    +?>
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    ParallelExec

    Class ParallelExecTask

    php
    <?php
    +$this->taskParallelExec()
    +  ->process('php ~/demos/script.php hey')
    +  ->process('php ~/demos/script.php hoy')
    +  ->process('php ~/demos/script.php gou')
    +  ->run();
    +?>
    • process($command) * param string|\\Robo\\Contract\\CommandInterface $command
    • waitInterval($waitInterval) Parallel processing will wait $waitInterval seconds after launching each process and before
    • setOutput($output) Sets the Console Output.

    SymfonyCommand

    Executes Symfony Command

    php
    <?php
    +// Symfony Command
    +$this->taskSymfonyCommand(new \\Codeception\\Command\\Run('run'))
    +     ->arg('suite','acceptance')
    +     ->opt('debug')
    +     ->run();
    +
    +// Artisan Command
    +$this->taskSymfonyCommand(new ModelGeneratorCommand())
    +     ->arg('name', 'User')
    +     ->run();
    +?>
    • arg($arg, $value) * param string $arg
    • opt($option, $value = null)
    • setOutput($output) Sets the Console Output.

    Watch

    Runs task when specified file or dir was changed. Uses Lurker library. Monitor third parameter takes Lurker filesystem events types to watch. By default its set to MODIFY event.

    php
    <?php
    +$this->taskWatch()
    +     ->monitor(
    +         'composer.json',
    +         function() {
    +             $this->taskComposerUpdate()->run();
    +         }
    +     )->monitor(
    +         'src',
    +         function() {
    +             $this->taskExec('phpunit')->run();
    +         },
    +         \\Lurker\\Event\\FilesystemEvent::ALL
    +     )->monitor(
    +         'migrations',
    +         function() {
    +             //do something
    +         },
    +         [
    +             \\Lurker\\Event\\FilesystemEvent::CREATE,
    +             \\Lurker\\Event\\FilesystemEvent::DELETE
    +         ]
    +     )->run();
    +?>

    Pass through the changed file to the callable function

    $this
    + ->taskWatch()
    + ->monitor(
    +     'filename',
    +     function ($event) {
    +         $resource = $event->getResource();
    +         ... do something with (string)$resource ...
    +     },
    +     FilesystemEvent::ALL
    + )
    + ->run();

    The $event parameter is a standard Symfony file resource object

    • monitor($paths, $callable, $events = null) * param string|string[] $paths
    • setOutput($output) Sets the Console Output.
    `,19))])}const c=n(p,[["render",e]]);export{E as __pageData,c as default}; diff --git a/assets/tasks_Base.md.U8B-s0P6.lean.js b/assets/tasks_Base.md.U8B-s0P6.lean.js new file mode 100644 index 0000000..b8b4d08 --- /dev/null +++ b/assets/tasks_Base.md.U8B-s0P6.lean.js @@ -0,0 +1,69 @@ +import{_ as n,c as t,a2 as i,j as a,o as l}from"./chunks/framework.DptEmx5X.js";const E=JSON.parse('{"title":"Base Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Base.md","filePath":"tasks/Base.md"}'),p={name:"tasks/Base.md"};function e(h,s,k,r,d,o){return l(),t("div",null,[s[3]||(s[3]=i(`

    Base Tasks

    Exec

    Executes shell script. Closes it when running in background mode.

    php
    <?php
    +$this->taskExec('compass')->arg('watch')->run();
    +// or use shortcut
    +$this->_exec('compass watch');
    +
    +$this->taskExec('compass watch')->background()->run();
    +
    +if ($this->taskExec('phpunit .')->run()->wasSuccessful()) {
    + $this->say('tests passed');
    +}
    +
    +?>
    `,4)),a("ul",null,[a("li",{onInheritdoc:s[0]||(s[0]=()=>{})},s[1]||(s[1]=[a("code",null,"simulate($context)",-1)]),32),s[2]||(s[2]=i("
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",9))]),s[4]||(s[4]=i(`

    ExecStack

    Execute commands one by one in stack. Stack can be stopped on first fail if you call stopOnFail().

    php
    <?php
    +$this->taskExecStack()
    + ->stopOnFail()
    + ->exec('mkdir site')
    + ->exec('cd site')
    + ->run();
    +
    +?>
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    ParallelExec

    Class ParallelExecTask

    php
    <?php
    +$this->taskParallelExec()
    +  ->process('php ~/demos/script.php hey')
    +  ->process('php ~/demos/script.php hoy')
    +  ->process('php ~/demos/script.php gou')
    +  ->run();
    +?>
    • process($command) * param string|\\Robo\\Contract\\CommandInterface $command
    • waitInterval($waitInterval) Parallel processing will wait $waitInterval seconds after launching each process and before
    • setOutput($output) Sets the Console Output.

    SymfonyCommand

    Executes Symfony Command

    php
    <?php
    +// Symfony Command
    +$this->taskSymfonyCommand(new \\Codeception\\Command\\Run('run'))
    +     ->arg('suite','acceptance')
    +     ->opt('debug')
    +     ->run();
    +
    +// Artisan Command
    +$this->taskSymfonyCommand(new ModelGeneratorCommand())
    +     ->arg('name', 'User')
    +     ->run();
    +?>
    • arg($arg, $value) * param string $arg
    • opt($option, $value = null)
    • setOutput($output) Sets the Console Output.

    Watch

    Runs task when specified file or dir was changed. Uses Lurker library. Monitor third parameter takes Lurker filesystem events types to watch. By default its set to MODIFY event.

    php
    <?php
    +$this->taskWatch()
    +     ->monitor(
    +         'composer.json',
    +         function() {
    +             $this->taskComposerUpdate()->run();
    +         }
    +     )->monitor(
    +         'src',
    +         function() {
    +             $this->taskExec('phpunit')->run();
    +         },
    +         \\Lurker\\Event\\FilesystemEvent::ALL
    +     )->monitor(
    +         'migrations',
    +         function() {
    +             //do something
    +         },
    +         [
    +             \\Lurker\\Event\\FilesystemEvent::CREATE,
    +             \\Lurker\\Event\\FilesystemEvent::DELETE
    +         ]
    +     )->run();
    +?>

    Pass through the changed file to the callable function

    $this
    + ->taskWatch()
    + ->monitor(
    +     'filename',
    +     function ($event) {
    +         $resource = $event->getResource();
    +         ... do something with (string)$resource ...
    +     },
    +     FilesystemEvent::ALL
    + )
    + ->run();

    The $event parameter is a standard Symfony file resource object

    • monitor($paths, $callable, $events = null) * param string|string[] $paths
    • setOutput($output) Sets the Console Output.
    `,19))])}const c=n(p,[["render",e]]);export{E as __pageData,c as default}; diff --git a/assets/tasks_Bower.md.B24dqck7.js b/assets/tasks_Bower.md.B24dqck7.js new file mode 100644 index 0000000..b95e6f2 --- /dev/null +++ b/assets/tasks_Bower.md.B24dqck7.js @@ -0,0 +1,17 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const k=JSON.parse('{"title":"Bower Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Bower.md","filePath":"tasks/Bower.md"}'),l={name:"tasks/Bower.md"};function n(o,s,p,r,d,h){return t(),a("div",null,s[0]||(s[0]=[e(`

    Bower Tasks

    Install

    Bower Install

    php
    <?php
    +// simple execution
    +$this->taskBowerInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskBowerInstall('path/to/my/bower')
    +     ->noDev()
    +     ->run();
    +?>
    • allowRoot() adds allow-root option to bower
    • forceLatest() adds force-latest option to bower
    • noDev() adds production option to bower
    • offline() adds offline option to bower
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Bower Update

    php
    <?php
    +// simple execution
    +$this->taskBowerUpdate->run();
    +
    +// prefer dist with custom path
    +$this->taskBowerUpdate('path/to/my/bower')
    +     ->noDev()
    +     ->run();
    +?>
    • allowRoot() adds allow-root option to bower
    • forceLatest() adds force-latest option to bower
    • noDev() adds production option to bower
    • offline() adds offline option to bower
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,9)]))}const u=i(l,[["render",n]]);export{k as __pageData,u as default}; diff --git a/assets/tasks_Bower.md.B24dqck7.lean.js b/assets/tasks_Bower.md.B24dqck7.lean.js new file mode 100644 index 0000000..b95e6f2 --- /dev/null +++ b/assets/tasks_Bower.md.B24dqck7.lean.js @@ -0,0 +1,17 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const k=JSON.parse('{"title":"Bower Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Bower.md","filePath":"tasks/Bower.md"}'),l={name:"tasks/Bower.md"};function n(o,s,p,r,d,h){return t(),a("div",null,s[0]||(s[0]=[e(`

    Bower Tasks

    Install

    Bower Install

    php
    <?php
    +// simple execution
    +$this->taskBowerInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskBowerInstall('path/to/my/bower')
    +     ->noDev()
    +     ->run();
    +?>
    • allowRoot() adds allow-root option to bower
    • forceLatest() adds force-latest option to bower
    • noDev() adds production option to bower
    • offline() adds offline option to bower
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Bower Update

    php
    <?php
    +// simple execution
    +$this->taskBowerUpdate->run();
    +
    +// prefer dist with custom path
    +$this->taskBowerUpdate('path/to/my/bower')
    +     ->noDev()
    +     ->run();
    +?>
    • allowRoot() adds allow-root option to bower
    • forceLatest() adds force-latest option to bower
    • noDev() adds production option to bower
    • offline() adds offline option to bower
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,9)]))}const u=i(l,[["render",n]]);export{k as __pageData,u as default}; diff --git a/assets/tasks_Composer.md.qQciG78B.js b/assets/tasks_Composer.md.qQciG78B.js new file mode 100644 index 0000000..c042131 --- /dev/null +++ b/assets/tasks_Composer.md.qQciG78B.js @@ -0,0 +1,67 @@ +import{_ as o,c as a,a2 as e,j as s,o as t}from"./chunks/framework.DptEmx5X.js";const u=JSON.parse('{"title":"Composer Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Composer.md","filePath":"tasks/Composer.md"}'),l={name:"tasks/Composer.md"};function n(d,i,p,r,c,h){return t(),a("div",null,[i[4]||(i[4]=e(`

    Composer Tasks

    CheckPlatformReqs

    Composer Check Platform Requirements

    php
    <?php
    +// simple execution
    +$this->taskComposerValidate()->run();
    +?>
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Config

    Composer Config

    php
    <?php
    +// simple execution
    +$this->taskComposerConfig()->set('bin-dir', 'bin/')->run();
    +?>
    • set($key, $value) Set a configuration value.
    • useGlobal($useGlobal = null) Operate on the global repository
    • repository($id, $uri, $repoType = null) * param string $id
    • removeRepository($id) * param string $id
    • disableRepository($id) * param string $id
    • enableRepository($id) * param string $id
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    CreateProject

    Composer CreateProject

    php
    <?php
    +// simple execution
    +$this->taskComposerCreateProject()->source('foo/bar')->target('myBar')->run();
    +?>
    `,12)),s("ul",null,[i[2]||(i[2]=e("
  • source($source) * param string $source
  • target($target) * param string $target
  • version($version) * param string $version
  • keepVcs($keep = null) * param bool $keep
  • noInstall($noInstall = null) * param bool $noInstall
  • repository($repository) * param string $repository
  • stability($stability) * param string $stability
  • ",7)),s("li",{onInheritdoc:i[0]||(i[0]=()=>{})},i[1]||(i[1]=[s("code",null,"buildCommand()",-1)]),32),i[3]||(i[3]=e("
  • preferDist($preferDist = null) adds prefer-dist option to composer
  • preferSource() adds prefer-source option to composer
  • dev($dev = null) adds dev option to composer
  • noDev() adds no-dev option to composer
  • ansi($ansi = null) adds ansi option to composer
  • noAnsi() adds no-ansi option to composer
  • interaction($interaction = null) * param bool $interaction
  • noInteraction() adds no-interaction option to composer
  • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
  • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
  • disablePlugins($disable = null) disable plugins
  • noScripts($disable = null) skip scripts
  • workingDir($dir) adds --working-dir $dir option to composer
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",22))]),i[5]||(i[5]=e(`

    DumpAutoload

    Composer Dump Autoload

    php
    <?php
    +// simple execution
    +$this->taskComposerDumpAutoload()->run();
    +
    +// dump auto loader with custom path
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader dump with custom path
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->optimize()
    +     ->run();
    +
    +// optimize autoloader dump with custom path and no dev
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->optimize()
    +     ->noDev()
    +     ->run();
    +?>
    • optimize($optimize = null) * param bool $optimize
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Init

    Composer Init

    php
    <?php
    +// simple execution
    +$this->taskComposerInit()->run();
    +?>
    • projectName($projectName) * param string $projectName
    • description($description) * param string $description
    • author($author) * param string $author
    • projectType($type) * param string $type
    • homepage($homepage) * param string $homepage
    • dependency($project, $version = null) 'require' is a keyword, so it cannot be a method name.
    • stability($stability) * param string $stability
    • license($license) * param string $license
    • repository($repository) * param string $repository
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Install

    Composer Install

    php
    <?php
    +// simple execution
    +$this->taskComposerInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskComposerInstall('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader with custom path
    +$this->taskComposerInstall('path/to/my/composer.phar')
    +     ->optimizeAutoloader()
    +     ->run();
    +?>
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Remove

    Composer Remove

    php
    <?php
    +// simple execution
    +$this->taskComposerRemove()->run();
    +?>
    • dev($dev = null) * param bool $dev
    • noProgress($noProgress = null) * param bool $noProgress
    • noUpdate($noUpdate = null) * param bool $noUpdate
    • updateNoDev($updateNoDev = null) * param bool $updateNoDev
    • noUpdateWithDependencies($updateWithDependencies = null) * param bool $updateWithDependencies
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    RequireDependency

    Composer Require

    php
    <?php
    +// simple execution
    +$this->taskComposerRequire()->dependency('foo/bar', '^.2.4.8')->run();
    +?>
    • dependency($project, $version = null) 'require' is a keyword, so it cannot be a method name.
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Composer Update

    php
    <?php
    +// simple execution
    +$this->taskComposerUpdate()->run();
    +
    +// prefer dist with custom path
    +$this->taskComposerUpdate('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader with custom path
    +$this->taskComposerUpdate('path/to/my/composer.phar')
    +     ->optimizeAutoloader()
    +     ->run();
    +?>
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Validate

    Composer Validate

    php
    <?php
    +// simple execution
    +$this->taskComposerValidate()->run();
    +?>
    • noCheckAll($noCheckAll = null) * param bool $noCheckAll
    • noCheckLock($noCheckLock = null) * param bool $noCheckLock
    • noCheckPublish($noCheckPublish = null) * param bool $noCheckPublish
    • withDependencies($withDependencies = null) * param bool $withDependencies
    • strict($strict = null) * param bool $strict
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,28))])}const g=o(l,[["render",n]]);export{u as __pageData,g as default}; diff --git a/assets/tasks_Composer.md.qQciG78B.lean.js b/assets/tasks_Composer.md.qQciG78B.lean.js new file mode 100644 index 0000000..c042131 --- /dev/null +++ b/assets/tasks_Composer.md.qQciG78B.lean.js @@ -0,0 +1,67 @@ +import{_ as o,c as a,a2 as e,j as s,o as t}from"./chunks/framework.DptEmx5X.js";const u=JSON.parse('{"title":"Composer Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Composer.md","filePath":"tasks/Composer.md"}'),l={name:"tasks/Composer.md"};function n(d,i,p,r,c,h){return t(),a("div",null,[i[4]||(i[4]=e(`

    Composer Tasks

    CheckPlatformReqs

    Composer Check Platform Requirements

    php
    <?php
    +// simple execution
    +$this->taskComposerValidate()->run();
    +?>
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Config

    Composer Config

    php
    <?php
    +// simple execution
    +$this->taskComposerConfig()->set('bin-dir', 'bin/')->run();
    +?>
    • set($key, $value) Set a configuration value.
    • useGlobal($useGlobal = null) Operate on the global repository
    • repository($id, $uri, $repoType = null) * param string $id
    • removeRepository($id) * param string $id
    • disableRepository($id) * param string $id
    • enableRepository($id) * param string $id
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    CreateProject

    Composer CreateProject

    php
    <?php
    +// simple execution
    +$this->taskComposerCreateProject()->source('foo/bar')->target('myBar')->run();
    +?>
    `,12)),s("ul",null,[i[2]||(i[2]=e("
  • source($source) * param string $source
  • target($target) * param string $target
  • version($version) * param string $version
  • keepVcs($keep = null) * param bool $keep
  • noInstall($noInstall = null) * param bool $noInstall
  • repository($repository) * param string $repository
  • stability($stability) * param string $stability
  • ",7)),s("li",{onInheritdoc:i[0]||(i[0]=()=>{})},i[1]||(i[1]=[s("code",null,"buildCommand()",-1)]),32),i[3]||(i[3]=e("
  • preferDist($preferDist = null) adds prefer-dist option to composer
  • preferSource() adds prefer-source option to composer
  • dev($dev = null) adds dev option to composer
  • noDev() adds no-dev option to composer
  • ansi($ansi = null) adds ansi option to composer
  • noAnsi() adds no-ansi option to composer
  • interaction($interaction = null) * param bool $interaction
  • noInteraction() adds no-interaction option to composer
  • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
  • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
  • disablePlugins($disable = null) disable plugins
  • noScripts($disable = null) skip scripts
  • workingDir($dir) adds --working-dir $dir option to composer
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",22))]),i[5]||(i[5]=e(`

    DumpAutoload

    Composer Dump Autoload

    php
    <?php
    +// simple execution
    +$this->taskComposerDumpAutoload()->run();
    +
    +// dump auto loader with custom path
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader dump with custom path
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->optimize()
    +     ->run();
    +
    +// optimize autoloader dump with custom path and no dev
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->optimize()
    +     ->noDev()
    +     ->run();
    +?>
    • optimize($optimize = null) * param bool $optimize
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Init

    Composer Init

    php
    <?php
    +// simple execution
    +$this->taskComposerInit()->run();
    +?>
    • projectName($projectName) * param string $projectName
    • description($description) * param string $description
    • author($author) * param string $author
    • projectType($type) * param string $type
    • homepage($homepage) * param string $homepage
    • dependency($project, $version = null) 'require' is a keyword, so it cannot be a method name.
    • stability($stability) * param string $stability
    • license($license) * param string $license
    • repository($repository) * param string $repository
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Install

    Composer Install

    php
    <?php
    +// simple execution
    +$this->taskComposerInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskComposerInstall('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader with custom path
    +$this->taskComposerInstall('path/to/my/composer.phar')
    +     ->optimizeAutoloader()
    +     ->run();
    +?>
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Remove

    Composer Remove

    php
    <?php
    +// simple execution
    +$this->taskComposerRemove()->run();
    +?>
    • dev($dev = null) * param bool $dev
    • noProgress($noProgress = null) * param bool $noProgress
    • noUpdate($noUpdate = null) * param bool $noUpdate
    • updateNoDev($updateNoDev = null) * param bool $updateNoDev
    • noUpdateWithDependencies($updateWithDependencies = null) * param bool $updateWithDependencies
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    RequireDependency

    Composer Require

    php
    <?php
    +// simple execution
    +$this->taskComposerRequire()->dependency('foo/bar', '^.2.4.8')->run();
    +?>
    • dependency($project, $version = null) 'require' is a keyword, so it cannot be a method name.
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Composer Update

    php
    <?php
    +// simple execution
    +$this->taskComposerUpdate()->run();
    +
    +// prefer dist with custom path
    +$this->taskComposerUpdate('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader with custom path
    +$this->taskComposerUpdate('path/to/my/composer.phar')
    +     ->optimizeAutoloader()
    +     ->run();
    +?>
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Validate

    Composer Validate

    php
    <?php
    +// simple execution
    +$this->taskComposerValidate()->run();
    +?>
    • noCheckAll($noCheckAll = null) * param bool $noCheckAll
    • noCheckLock($noCheckLock = null) * param bool $noCheckLock
    • noCheckPublish($noCheckPublish = null) * param bool $noCheckPublish
    • withDependencies($withDependencies = null) * param bool $withDependencies
    • strict($strict = null) * param bool $strict
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,28))])}const g=o(l,[["render",n]]);export{u as __pageData,g as default}; diff --git a/assets/tasks_Development.md.BNerfiF_.js b/assets/tasks_Development.md.BNerfiF_.js new file mode 100644 index 0000000..8c64a78 --- /dev/null +++ b/assets/tasks_Development.md.BNerfiF_.js @@ -0,0 +1,92 @@ +import{_ as n,c as t,a2 as e,j as i,a,o as l}from"./chunks/framework.DptEmx5X.js";const E=JSON.parse('{"title":"Development Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Development.md","filePath":"tasks/Development.md"}'),h={name:"tasks/Development.md"};function p(k,s,r,d,o,g){return l(),t("div",null,[s[5]||(s[5]=e(`

    Development Tasks

    Changelog

    Helps to manage changelog file. Creates or updates changelog.md file with recent changes in current version.

    php
    <?php
    +$version = "0.1.0";
    +$this->taskChangelog()
    + ->version($version)
    + ->change("released to github")
    + ->run();
    +?>

    Changes can be asked from Console

    php
    <?php
    +$this->taskChangelog()
    + ->version($version)
    + ->askForChanges()
    + ->run();
    +?>
    • filename($filename) * param string $filename
    • setBody($body) Sets the changelog body text.
    • setHeader($header) * param string $header
    • log($item) * param string $item
    • anchor($anchor) * param string $anchor
    • version($version) * param string $version
    • changes(array $data) * param array $data
    • change($change) * param string $change
    • getChanges() @return array
    • processLogRow($i) * param string $i
    • setOutput($output) Sets the Console Output.

    GenerateMarkdownDoc

    Simple documentation generator from source files. Takes classes, properties and methods with their docblocks and writes down a markdown file.

    php
    <?php
    +$this->taskGenDoc('models.md')
    +     ->docClass('Model\\User') // take class Model\\User
    +     ->docClass('Model\\Post') // take class Model\\Post
    +     ->filterMethods(function(\\ReflectionMethod $r) {
    +         return $r->isPublic() or $r->isProtected(); // process public and protected methods
    +     })->processClass(function(\\ReflectionClass $r, $text) {
    +         return "Class ".$r->getName()."\\n\\n$text\\n\\n###Methods\\n";
    +     })->run();

    By default this task generates a documentation for each public method of a class, interface or trait. It combines method signature with a docblock. Both can be post-processed.

    php
    <?php
    +$this->taskGenDoc('models.md')
    +     ->docClass('Model\\User')
    +     ->processClassSignature(false) // false can be passed to not include class signature
    +     ->processClassDocBlock(function(\\ReflectionClass $r, $text) {
    +         return "[This is part of application model]\\n" . $text;
    +     })->processMethodSignature(function(\\ReflectionMethod $r, $text) {
    +         return "#### {$r->name}()";
    +     })->processMethodDocBlock(function(\\ReflectionMethod $r, $text) {
    +         return strpos($r->name, 'save')===0 ? "[Saves to the database]\\n" . $text : $text;
    +     })->run();
    • docClass($item) Put a class you want to be documented.
    • filterMethods($filterMethods) Using a callback function filter out methods that won't be documented.
    • filterClasses($filterClasses) Using a callback function filter out classes that won't be documented.
    • filterProperties($filterProperties) Using a callback function filter out properties that won't be documented.
    • processClass($processClass) Post-process class documentation.
    • processClassSignature($processClassSignature) Post-process class signature. Provide false to skip.
    • processClassDocBlock($processClassDocBlock) Post-process class docblock contents. Provide false to skip.
    • processMethod($processMethod) Post-process method documentation. Provide false to skip.
    • processMethodSignature($processMethodSignature) Post-process method signature. Provide false to skip.
    • processMethodDocBlock($processMethodDocBlock) Post-process method docblock contents. Provide false to skip.
    • processProperty($processProperty) Post-process property documentation. Provide false to skip.
    • processPropertySignature($processPropertySignature) Post-process property signature. Provide false to skip.
    • processPropertyDocBlock($processPropertyDocBlock) Post-process property docblock contents. Provide false to skip.
    • reorder($reorder) Use a function to reorder classes.
    • reorderMethods($reorderMethods) Use a function to reorder methods in class.
    • reorderProperties($reorderProperties) * param callable $reorderProperties
    • filename($filename) * param string $filename
    • prepend($prepend) Inserts text at the beginning of markdown file.
    • append($append) Inserts text at the end of markdown file.
    • text($text) * param string $text
    • textForClass($item) * param string $item
    • setOutput($output) Sets the Console Output.

    Generate

    Generate a Robo Task that is a wrapper around an existing class.

    php
    <?php
    +$this->taskGenerateTask('Symfony\\Component\\Filesystem\\Filesystem', 'FilesystemStack')
    +  ->run();
    • setOutput($output) Sets the Console Output.

    GitHubRelease

    Publishes new GitHub release.

    php
    <?php
    +$this->taskGitHubRelease('0.1.0')
    +  ->uri('consolidation-org/Robo')
    +  ->description('Add stuff people need.')
    +  ->change('Fix #123')
    +  ->change('Add frobulation method to all widgets')
    +  ->run();
    +?>
    • tag($tag) * param string $tag
    • draft($draft) * param bool $draft
    • name($name) * param string $name
    • description($description) * param string $description
    • prerelease($prerelease) * param bool $prerelease
    • comittish($comittish) * param string $comittish
    • appendDescription($description) * param string $description
    • changes(array $changes)
    • change($change) * param string $change
    • repo($repo) * param string $repo
    • owner($owner) * param string $owner
    • uri($uri) * param string $uri
    • user($user) * param string $user
    • password($password) * param string $password
    • accessToken($token) * param string $token
    • setOutput($output) Sets the Console Output.

    OpenBrowser

    Opens the default's user browser code inspired from openBrowser() function in https://github.com/composer/composer/blob/master/src/Composer/Command/HomeCommand.php

    php
    <?php
    +// open one browser window
    +$this->taskOpenBrowser('http://localhost')
    + ->run();
    +
    +// open two browser windows
    +$this->taskOpenBrowser([
    +    'http://localhost/mysite',
    +    'http://localhost/mysite2'
    +  ])
    +  ->run();
    • setOutput($output) Sets the Console Output.

    PackPhar

    Creates Phar.

    php
    <?php
    +$pharTask = $this->taskPackPhar('package/codecept.phar')
    +  ->compress()
    +  ->stub('package/stub.php');
    +
    + $finder = Finder::create()
    +     ->name('*.php')
    +       ->in('src');
    +
    +   foreach ($finder as $file) {
    +       $pharTask->addFile('src/'.$file->getRelativePathname(), $file->getRealPath());
    +   }
    +
    +   $finder = Finder::create()->files()
    +       ->name('*.php')
    +       ->in('vendor');
    +
    +   foreach ($finder as $file) {
    +       $pharTask->addStripped('vendor/'.$file->getRelativePathname(), $file->getRealPath());
    +   }
    +   $pharTask->run();
    +
    +   // verify Phar is packed correctly
    +   $code = $this->_exec('php package/codecept.phar');
    +?>
    • compress($compress = null) * param bool $compress
    • stub($stub) * param string $stub
    • addStripped($path, $file) * param string $path
    • addFile($path, $file) * param string $path
    • addFiles($files) * param \\Symfony\\Component\\Finder\\SplFileInfo[] $files
    • executable($file) * param string $file
    • setOutput($output) Sets the Console Output.

    PhpServer

    Runs PHP server and stops it when task finishes.

    php
    <?php
    +// run server in /public directory
    +$this->taskServer(8000)
    + ->dir('public')
    + ->run();
    +
    +// run with IP 0.0.0.0
    +$this->taskServer(8000)
    + ->host('0.0.0.0')
    + ->run();
    +
    +// execute server in background
    +$this->taskServer(8000)
    + ->background()
    + ->run();
    +?>
    `,32)),i("ul",null,[s[2]||(s[2]=i("li",null,[i("code",null,"host($host)"),a(" * "),i("code",null,"param string"),a(" $host")],-1)),s[3]||(s[3]=i("li",null,[i("code",null,"dir($path)"),a(" * "),i("code",null,"param string"),a(" $path")],-1)),i("li",{onInheritdoc:s[0]||(s[0]=()=>{})},s[1]||(s[1]=[i("code",null,"simulate($context)",-1)]),32),s[4]||(s[4]=e("
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",8))]),s[6]||(s[6]=e(`

    SemVer

    Helps to maintain .semver file.

    php
    <?php
    +$this->taskSemVer('.semver')
    +     ->increment()
    +     ->run();
    +?>
    • __toString() @return string
    • version($version) * param string $version
    • setFormat($format) * param string $format
    • setMetadataSeparator($separator) * param string $separator
    • setPrereleaseSeparator($separator) * param string $separator
    • increment($what = null) * param string $what
    • prerelease($tag = null) * param string $tag
    • metadata($data) * param array|string $data
    `,4))])}const y=n(h,[["render",p]]);export{E as __pageData,y as default}; diff --git a/assets/tasks_Development.md.BNerfiF_.lean.js b/assets/tasks_Development.md.BNerfiF_.lean.js new file mode 100644 index 0000000..8c64a78 --- /dev/null +++ b/assets/tasks_Development.md.BNerfiF_.lean.js @@ -0,0 +1,92 @@ +import{_ as n,c as t,a2 as e,j as i,a,o as l}from"./chunks/framework.DptEmx5X.js";const E=JSON.parse('{"title":"Development Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Development.md","filePath":"tasks/Development.md"}'),h={name:"tasks/Development.md"};function p(k,s,r,d,o,g){return l(),t("div",null,[s[5]||(s[5]=e(`

    Development Tasks

    Changelog

    Helps to manage changelog file. Creates or updates changelog.md file with recent changes in current version.

    php
    <?php
    +$version = "0.1.0";
    +$this->taskChangelog()
    + ->version($version)
    + ->change("released to github")
    + ->run();
    +?>

    Changes can be asked from Console

    php
    <?php
    +$this->taskChangelog()
    + ->version($version)
    + ->askForChanges()
    + ->run();
    +?>
    • filename($filename) * param string $filename
    • setBody($body) Sets the changelog body text.
    • setHeader($header) * param string $header
    • log($item) * param string $item
    • anchor($anchor) * param string $anchor
    • version($version) * param string $version
    • changes(array $data) * param array $data
    • change($change) * param string $change
    • getChanges() @return array
    • processLogRow($i) * param string $i
    • setOutput($output) Sets the Console Output.

    GenerateMarkdownDoc

    Simple documentation generator from source files. Takes classes, properties and methods with their docblocks and writes down a markdown file.

    php
    <?php
    +$this->taskGenDoc('models.md')
    +     ->docClass('Model\\User') // take class Model\\User
    +     ->docClass('Model\\Post') // take class Model\\Post
    +     ->filterMethods(function(\\ReflectionMethod $r) {
    +         return $r->isPublic() or $r->isProtected(); // process public and protected methods
    +     })->processClass(function(\\ReflectionClass $r, $text) {
    +         return "Class ".$r->getName()."\\n\\n$text\\n\\n###Methods\\n";
    +     })->run();

    By default this task generates a documentation for each public method of a class, interface or trait. It combines method signature with a docblock. Both can be post-processed.

    php
    <?php
    +$this->taskGenDoc('models.md')
    +     ->docClass('Model\\User')
    +     ->processClassSignature(false) // false can be passed to not include class signature
    +     ->processClassDocBlock(function(\\ReflectionClass $r, $text) {
    +         return "[This is part of application model]\\n" . $text;
    +     })->processMethodSignature(function(\\ReflectionMethod $r, $text) {
    +         return "#### {$r->name}()";
    +     })->processMethodDocBlock(function(\\ReflectionMethod $r, $text) {
    +         return strpos($r->name, 'save')===0 ? "[Saves to the database]\\n" . $text : $text;
    +     })->run();
    • docClass($item) Put a class you want to be documented.
    • filterMethods($filterMethods) Using a callback function filter out methods that won't be documented.
    • filterClasses($filterClasses) Using a callback function filter out classes that won't be documented.
    • filterProperties($filterProperties) Using a callback function filter out properties that won't be documented.
    • processClass($processClass) Post-process class documentation.
    • processClassSignature($processClassSignature) Post-process class signature. Provide false to skip.
    • processClassDocBlock($processClassDocBlock) Post-process class docblock contents. Provide false to skip.
    • processMethod($processMethod) Post-process method documentation. Provide false to skip.
    • processMethodSignature($processMethodSignature) Post-process method signature. Provide false to skip.
    • processMethodDocBlock($processMethodDocBlock) Post-process method docblock contents. Provide false to skip.
    • processProperty($processProperty) Post-process property documentation. Provide false to skip.
    • processPropertySignature($processPropertySignature) Post-process property signature. Provide false to skip.
    • processPropertyDocBlock($processPropertyDocBlock) Post-process property docblock contents. Provide false to skip.
    • reorder($reorder) Use a function to reorder classes.
    • reorderMethods($reorderMethods) Use a function to reorder methods in class.
    • reorderProperties($reorderProperties) * param callable $reorderProperties
    • filename($filename) * param string $filename
    • prepend($prepend) Inserts text at the beginning of markdown file.
    • append($append) Inserts text at the end of markdown file.
    • text($text) * param string $text
    • textForClass($item) * param string $item
    • setOutput($output) Sets the Console Output.

    Generate

    Generate a Robo Task that is a wrapper around an existing class.

    php
    <?php
    +$this->taskGenerateTask('Symfony\\Component\\Filesystem\\Filesystem', 'FilesystemStack')
    +  ->run();
    • setOutput($output) Sets the Console Output.

    GitHubRelease

    Publishes new GitHub release.

    php
    <?php
    +$this->taskGitHubRelease('0.1.0')
    +  ->uri('consolidation-org/Robo')
    +  ->description('Add stuff people need.')
    +  ->change('Fix #123')
    +  ->change('Add frobulation method to all widgets')
    +  ->run();
    +?>
    • tag($tag) * param string $tag
    • draft($draft) * param bool $draft
    • name($name) * param string $name
    • description($description) * param string $description
    • prerelease($prerelease) * param bool $prerelease
    • comittish($comittish) * param string $comittish
    • appendDescription($description) * param string $description
    • changes(array $changes)
    • change($change) * param string $change
    • repo($repo) * param string $repo
    • owner($owner) * param string $owner
    • uri($uri) * param string $uri
    • user($user) * param string $user
    • password($password) * param string $password
    • accessToken($token) * param string $token
    • setOutput($output) Sets the Console Output.

    OpenBrowser

    Opens the default's user browser code inspired from openBrowser() function in https://github.com/composer/composer/blob/master/src/Composer/Command/HomeCommand.php

    php
    <?php
    +// open one browser window
    +$this->taskOpenBrowser('http://localhost')
    + ->run();
    +
    +// open two browser windows
    +$this->taskOpenBrowser([
    +    'http://localhost/mysite',
    +    'http://localhost/mysite2'
    +  ])
    +  ->run();
    • setOutput($output) Sets the Console Output.

    PackPhar

    Creates Phar.

    php
    <?php
    +$pharTask = $this->taskPackPhar('package/codecept.phar')
    +  ->compress()
    +  ->stub('package/stub.php');
    +
    + $finder = Finder::create()
    +     ->name('*.php')
    +       ->in('src');
    +
    +   foreach ($finder as $file) {
    +       $pharTask->addFile('src/'.$file->getRelativePathname(), $file->getRealPath());
    +   }
    +
    +   $finder = Finder::create()->files()
    +       ->name('*.php')
    +       ->in('vendor');
    +
    +   foreach ($finder as $file) {
    +       $pharTask->addStripped('vendor/'.$file->getRelativePathname(), $file->getRealPath());
    +   }
    +   $pharTask->run();
    +
    +   // verify Phar is packed correctly
    +   $code = $this->_exec('php package/codecept.phar');
    +?>
    • compress($compress = null) * param bool $compress
    • stub($stub) * param string $stub
    • addStripped($path, $file) * param string $path
    • addFile($path, $file) * param string $path
    • addFiles($files) * param \\Symfony\\Component\\Finder\\SplFileInfo[] $files
    • executable($file) * param string $file
    • setOutput($output) Sets the Console Output.

    PhpServer

    Runs PHP server and stops it when task finishes.

    php
    <?php
    +// run server in /public directory
    +$this->taskServer(8000)
    + ->dir('public')
    + ->run();
    +
    +// run with IP 0.0.0.0
    +$this->taskServer(8000)
    + ->host('0.0.0.0')
    + ->run();
    +
    +// execute server in background
    +$this->taskServer(8000)
    + ->background()
    + ->run();
    +?>
    `,32)),i("ul",null,[s[2]||(s[2]=i("li",null,[i("code",null,"host($host)"),a(" * "),i("code",null,"param string"),a(" $host")],-1)),s[3]||(s[3]=i("li",null,[i("code",null,"dir($path)"),a(" * "),i("code",null,"param string"),a(" $path")],-1)),i("li",{onInheritdoc:s[0]||(s[0]=()=>{})},s[1]||(s[1]=[i("code",null,"simulate($context)",-1)]),32),s[4]||(s[4]=e("
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",8))]),s[6]||(s[6]=e(`

    SemVer

    Helps to maintain .semver file.

    php
    <?php
    +$this->taskSemVer('.semver')
    +     ->increment()
    +     ->run();
    +?>
    • __toString() @return string
    • version($version) * param string $version
    • setFormat($format) * param string $format
    • setMetadataSeparator($separator) * param string $separator
    • setPrereleaseSeparator($separator) * param string $separator
    • increment($what = null) * param string $what
    • prerelease($tag = null) * param string $tag
    • metadata($data) * param array|string $data
    `,4))])}const y=n(h,[["render",p]]);export{E as __pageData,y as default}; diff --git a/assets/tasks_Docker.md.BZPWmQuP.js b/assets/tasks_Docker.md.BZPWmQuP.js new file mode 100644 index 0000000..87a5130 --- /dev/null +++ b/assets/tasks_Docker.md.BZPWmQuP.js @@ -0,0 +1,84 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Docker Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Docker.md","filePath":"tasks/Docker.md"}'),n={name:"tasks/Docker.md"};function l(p,s,h,r,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

    Docker Tasks

    Build

    Builds Docker image

    php
    <?php
    +$this->taskDockerBuild()->run();
    +
    +$this->taskDockerBuild('path/to/dir')
    +     ->tag('database')
    +     ->run();
    +
    +?>

    Class Build @package Robo\\Task\\Docker

    • tag($tag) * param string $tag
    • enableBuildKit() * return $this
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Commit

    Commits docker container to an image

    $this->taskDockerCommit($containerId)
    +     ->name('my/database')
    +     ->run();
    +
    +// alternatively you can take the result from DockerRun task:
    +
    +$result = $this->taskDockerRun('db')
    +     ->exec('./prepare_database.sh')
    +     ->run();
    +
    +$task->dockerCommit($result)
    +     ->name('my/database')
    +     ->run();
    • name($name) * param string $name
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Exec

    Executes command inside running Docker container

    php
    <?php
    +$test = $this->taskDockerRun('test_env')
    +     ->detached()
    +     ->run();
    +
    +$this->taskDockerExec($test)
    +     ->interactive()
    +     ->exec('./runtests')
    +     ->run();
    +
    +// alternatively use commands from other tasks
    +
    +$this->taskDockerExec($test)
    +     ->interactive()
    +     ->exec($this->taskCodecept()->suite('acceptance'))
    +     ->run();
    +?>
    • detached() * return $this
    • exec($command) * param string|\\Robo\\Contract\\CommandInterface $command
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Pull

    Pulls an image from DockerHub

    php
    <?php
    +$this->taskDockerPull('wordpress')
    +     ->run();
    +
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Remove

    Remove docker container

    php
    <?php
    +$this->taskDockerRemove($container)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Run

    Performs docker run on a container.

    php
    <?php
    +$this->taskDockerRun('mysql')->run();
    +
    +$result = $this->taskDockerRun('my_db_image')
    +     ->env('DB', 'database_name')
    +     ->volume('/path/to/data', '/data')
    +     ->detached()
    +     ->publish(3306)
    +     ->name('my_mysql')
    +     ->run();
    +
    +// retrieve container's cid:
    +$this->say("Running container ".$result->getCid());
    +
    +// execute script inside container
    +$result = $this->taskDockerRun('db')
    +     ->exec('prepare_test_data.sh')
    +     ->run();
    +
    +$this->taskDockerCommit($result)
    +     ->name('test_db')
    +     ->run();
    +
    +// link containers
    +$mysql = $this->taskDockerRun('mysql')
    +     ->name('wp_db') // important to set name for linked container
    +     ->env('MYSQL_ROOT_PASSWORD', '123456')
    +     ->run();
    +
    +$this->taskDockerRun('wordpress')
    +     ->link($mysql)
    +     ->publish(80, 8080)
    +     ->detached()
    +     ->run();
    +
    +?>
    • detached() * return $this
    • exec($run) * param string|\\Robo\\Contract\\CommandInterface $run
    • volume($from, $to = null) * param string $from
    • publish($port = null, $portTo = null) * param null|int $port
    • containerWorkdir($dir) * param string $dir
    • user($user) * param string $user
    • privileged() * return $this
    • name($name) * param string $name
    • link($name, $alias) * param string|\\Robo\\Task\\Docker\\Result $name
    • tmpDir($dir) * param string $dir
    • getTmpDir() @return string
    • getUniqId() @return string
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Start

    Starts Docker container

    php
    <?php
    +$this->taskDockerStart($cidOrResult)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Stop

    Stops Docker container

    php
    <?php
    +$this->taskDockerStop($cidOrResult)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,34)]))}const g=i(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/tasks_Docker.md.BZPWmQuP.lean.js b/assets/tasks_Docker.md.BZPWmQuP.lean.js new file mode 100644 index 0000000..87a5130 --- /dev/null +++ b/assets/tasks_Docker.md.BZPWmQuP.lean.js @@ -0,0 +1,84 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Docker Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Docker.md","filePath":"tasks/Docker.md"}'),n={name:"tasks/Docker.md"};function l(p,s,h,r,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

    Docker Tasks

    Build

    Builds Docker image

    php
    <?php
    +$this->taskDockerBuild()->run();
    +
    +$this->taskDockerBuild('path/to/dir')
    +     ->tag('database')
    +     ->run();
    +
    +?>

    Class Build @package Robo\\Task\\Docker

    • tag($tag) * param string $tag
    • enableBuildKit() * return $this
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Commit

    Commits docker container to an image

    $this->taskDockerCommit($containerId)
    +     ->name('my/database')
    +     ->run();
    +
    +// alternatively you can take the result from DockerRun task:
    +
    +$result = $this->taskDockerRun('db')
    +     ->exec('./prepare_database.sh')
    +     ->run();
    +
    +$task->dockerCommit($result)
    +     ->name('my/database')
    +     ->run();
    • name($name) * param string $name
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Exec

    Executes command inside running Docker container

    php
    <?php
    +$test = $this->taskDockerRun('test_env')
    +     ->detached()
    +     ->run();
    +
    +$this->taskDockerExec($test)
    +     ->interactive()
    +     ->exec('./runtests')
    +     ->run();
    +
    +// alternatively use commands from other tasks
    +
    +$this->taskDockerExec($test)
    +     ->interactive()
    +     ->exec($this->taskCodecept()->suite('acceptance'))
    +     ->run();
    +?>
    • detached() * return $this
    • exec($command) * param string|\\Robo\\Contract\\CommandInterface $command
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Pull

    Pulls an image from DockerHub

    php
    <?php
    +$this->taskDockerPull('wordpress')
    +     ->run();
    +
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Remove

    Remove docker container

    php
    <?php
    +$this->taskDockerRemove($container)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Run

    Performs docker run on a container.

    php
    <?php
    +$this->taskDockerRun('mysql')->run();
    +
    +$result = $this->taskDockerRun('my_db_image')
    +     ->env('DB', 'database_name')
    +     ->volume('/path/to/data', '/data')
    +     ->detached()
    +     ->publish(3306)
    +     ->name('my_mysql')
    +     ->run();
    +
    +// retrieve container's cid:
    +$this->say("Running container ".$result->getCid());
    +
    +// execute script inside container
    +$result = $this->taskDockerRun('db')
    +     ->exec('prepare_test_data.sh')
    +     ->run();
    +
    +$this->taskDockerCommit($result)
    +     ->name('test_db')
    +     ->run();
    +
    +// link containers
    +$mysql = $this->taskDockerRun('mysql')
    +     ->name('wp_db') // important to set name for linked container
    +     ->env('MYSQL_ROOT_PASSWORD', '123456')
    +     ->run();
    +
    +$this->taskDockerRun('wordpress')
    +     ->link($mysql)
    +     ->publish(80, 8080)
    +     ->detached()
    +     ->run();
    +
    +?>
    • detached() * return $this
    • exec($run) * param string|\\Robo\\Contract\\CommandInterface $run
    • volume($from, $to = null) * param string $from
    • publish($port = null, $portTo = null) * param null|int $port
    • containerWorkdir($dir) * param string $dir
    • user($user) * param string $user
    • privileged() * return $this
    • name($name) * param string $name
    • link($name, $alias) * param string|\\Robo\\Task\\Docker\\Result $name
    • tmpDir($dir) * param string $dir
    • getTmpDir() @return string
    • getUniqId() @return string
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Start

    Starts Docker container

    php
    <?php
    +$this->taskDockerStart($cidOrResult)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Stop

    Stops Docker container

    php
    <?php
    +$this->taskDockerStop($cidOrResult)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,34)]))}const g=i(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/tasks_File.md.zkkyWHS9.js b/assets/tasks_File.md.zkkyWHS9.js new file mode 100644 index 0000000..f8fd969 --- /dev/null +++ b/assets/tasks_File.md.zkkyWHS9.js @@ -0,0 +1,43 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"File Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/File.md","filePath":"tasks/File.md"}'),l={name:"tasks/File.md"};function n(h,s,p,k,d,r){return t(),a("div",null,s[0]||(s[0]=[e(`

    File Tasks

    Concat

    Merges files into one. Used for preparing assets.

    php
    <?php
    +$this->taskConcat([
    +     'web/assets/screen.css',
    +     'web/assets/print.css',
    +     'web/assets/theme.css'
    + ])
    + ->to('web/assets/style.css')
    + ->run()
    +?>
    • to($dst) set the destination file
    • setOutput($output) Sets the Console Output.

    Replace

    Performs search and replace inside a files.

    php
    <?php
    +$this->taskReplaceInFile('VERSION')
    + ->from('0.2.0')
    + ->to('0.3.0')
    + ->run();
    +
    +$this->taskReplaceInFile('README.md')
    + ->from(date('Y')-1)
    + ->to(date('Y'))
    + ->run();
    +
    +$this->taskReplaceInFile('config.yml')
    + ->regex('~^service:~')
    + ->to('services:')
    + ->run();
    +
    +$this->taskReplaceInFile('box/robo.txt')
    + ->from(array('##dbname##', '##dbhost##'))
    + ->to(array('robo', 'localhost'))
    + ->run();
    +?>
    • filename($filename) * param string $filename
    • from($from) String(s) to be replaced.
    • to($to) Value(s) to be set as a replacement.
    • regex($regex) Regex to match string to be replaced.
    • limit($limit) If used with $this->regexp() how many counts will be replaced
    • setOutput($output) Sets the Console Output.

    TmpFile

    Create a temporary file that is automatically cleaned up once the task collection is is part of completes. When created, it is given a random filename.

    This temporary file may be manipulated exacatly like taskWrite(). It is deleted as soon as the collection it is a part of completes or rolls back.

    php
    <?php
    +$collection = $this->collectionBuilder();
    +$tmpFilePath = $collection->taskTmpFile()
    +     ->line('-----')
    +     ->line(date('Y-m-d').' '.$title)
    +     ->line('----')
    +     ->getPath();
    +$collection->run();
    +?>
    • complete() Delete this file when our collection completes.
    • filename($filename) * param string $filename
    • append($append = null) * param bool $append
    • line($line) add a line.
    • lines(array $lines) add more lines.
    • text($text) add a text.
    • textFromFile($filename) add a text from a file.
    • place($name, $val) substitute a placeholder with value, placeholder must be enclosed by {}.
    • replace($string, $replacement) replace any string with value.
    • regexReplace($pattern, $replacement) replace any string with value using regular expression.
    • appendIfMatches($pattern, $text) Append the provided text to the end of the buffer if the provided
    • appendUnlessMatches($pattern, $text) Append the provided text to the end of the buffer unless the provided
    • originalContents() @return string
    • wouldChange() @return bool
    • getPath() @return string
    • setOutput($output) Sets the Console Output.

    Write

    Writes to file.

    php
    <?php
    +$this->taskWriteToFile('blogpost.md')
    +     ->line('-----')
    +     ->line(date('Y-m-d').' '.$title)
    +     ->line('----')
    +     ->run();
    +?>
    • filename($filename) * param string $filename
    • append($append = null) * param bool $append
    • line($line) add a line.
    • lines(array $lines) add more lines.
    • text($text) add a text.
    • textFromFile($filename) add a text from a file.
    • place($name, $val) substitute a placeholder with value, placeholder must be enclosed by {}.
    • replace($string, $replacement) replace any string with value.
    • regexReplace($pattern, $replacement) replace any string with value using regular expression.
    • appendIfMatches($pattern, $text) Append the provided text to the end of the buffer if the provided
    • appendUnlessMatches($pattern, $text) Append the provided text to the end of the buffer unless the provided
    • originalContents() @return string
    • wouldChange() @return bool
    • getPath() @return string
    • setOutput($output) Sets the Console Output.
    `,18)]))}const o=i(l,[["render",n]]);export{g as __pageData,o as default}; diff --git a/assets/tasks_File.md.zkkyWHS9.lean.js b/assets/tasks_File.md.zkkyWHS9.lean.js new file mode 100644 index 0000000..f8fd969 --- /dev/null +++ b/assets/tasks_File.md.zkkyWHS9.lean.js @@ -0,0 +1,43 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"File Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/File.md","filePath":"tasks/File.md"}'),l={name:"tasks/File.md"};function n(h,s,p,k,d,r){return t(),a("div",null,s[0]||(s[0]=[e(`

    File Tasks

    Concat

    Merges files into one. Used for preparing assets.

    php
    <?php
    +$this->taskConcat([
    +     'web/assets/screen.css',
    +     'web/assets/print.css',
    +     'web/assets/theme.css'
    + ])
    + ->to('web/assets/style.css')
    + ->run()
    +?>
    • to($dst) set the destination file
    • setOutput($output) Sets the Console Output.

    Replace

    Performs search and replace inside a files.

    php
    <?php
    +$this->taskReplaceInFile('VERSION')
    + ->from('0.2.0')
    + ->to('0.3.0')
    + ->run();
    +
    +$this->taskReplaceInFile('README.md')
    + ->from(date('Y')-1)
    + ->to(date('Y'))
    + ->run();
    +
    +$this->taskReplaceInFile('config.yml')
    + ->regex('~^service:~')
    + ->to('services:')
    + ->run();
    +
    +$this->taskReplaceInFile('box/robo.txt')
    + ->from(array('##dbname##', '##dbhost##'))
    + ->to(array('robo', 'localhost'))
    + ->run();
    +?>
    • filename($filename) * param string $filename
    • from($from) String(s) to be replaced.
    • to($to) Value(s) to be set as a replacement.
    • regex($regex) Regex to match string to be replaced.
    • limit($limit) If used with $this->regexp() how many counts will be replaced
    • setOutput($output) Sets the Console Output.

    TmpFile

    Create a temporary file that is automatically cleaned up once the task collection is is part of completes. When created, it is given a random filename.

    This temporary file may be manipulated exacatly like taskWrite(). It is deleted as soon as the collection it is a part of completes or rolls back.

    php
    <?php
    +$collection = $this->collectionBuilder();
    +$tmpFilePath = $collection->taskTmpFile()
    +     ->line('-----')
    +     ->line(date('Y-m-d').' '.$title)
    +     ->line('----')
    +     ->getPath();
    +$collection->run();
    +?>
    • complete() Delete this file when our collection completes.
    • filename($filename) * param string $filename
    • append($append = null) * param bool $append
    • line($line) add a line.
    • lines(array $lines) add more lines.
    • text($text) add a text.
    • textFromFile($filename) add a text from a file.
    • place($name, $val) substitute a placeholder with value, placeholder must be enclosed by {}.
    • replace($string, $replacement) replace any string with value.
    • regexReplace($pattern, $replacement) replace any string with value using regular expression.
    • appendIfMatches($pattern, $text) Append the provided text to the end of the buffer if the provided
    • appendUnlessMatches($pattern, $text) Append the provided text to the end of the buffer unless the provided
    • originalContents() @return string
    • wouldChange() @return bool
    • getPath() @return string
    • setOutput($output) Sets the Console Output.

    Write

    Writes to file.

    php
    <?php
    +$this->taskWriteToFile('blogpost.md')
    +     ->line('-----')
    +     ->line(date('Y-m-d').' '.$title)
    +     ->line('----')
    +     ->run();
    +?>
    • filename($filename) * param string $filename
    • append($append = null) * param bool $append
    • line($line) add a line.
    • lines(array $lines) add more lines.
    • text($text) add a text.
    • textFromFile($filename) add a text from a file.
    • place($name, $val) substitute a placeholder with value, placeholder must be enclosed by {}.
    • replace($string, $replacement) replace any string with value.
    • regexReplace($pattern, $replacement) replace any string with value using regular expression.
    • appendIfMatches($pattern, $text) Append the provided text to the end of the buffer if the provided
    • appendUnlessMatches($pattern, $text) Append the provided text to the end of the buffer unless the provided
    • originalContents() @return string
    • wouldChange() @return bool
    • getPath() @return string
    • setOutput($output) Sets the Console Output.
    `,18)]))}const o=i(l,[["render",n]]);export{g as __pageData,o as default}; diff --git a/assets/tasks_Filesystem.md.uI33GNVM.js b/assets/tasks_Filesystem.md.uI33GNVM.js new file mode 100644 index 0000000..38885d1 --- /dev/null +++ b/assets/tasks_Filesystem.md.uI33GNVM.js @@ -0,0 +1,68 @@ +import{_ as i,c as a,a2 as t,o as n}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Filesystem Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Filesystem.md","filePath":"tasks/Filesystem.md"}'),e={name:"tasks/Filesystem.md"};function l(h,s,p,k,r,d){return n(),a("div",null,s[0]||(s[0]=[t(`

    Filesystem Tasks

    CleanDir

    Deletes all files from specified dir, ignoring git files.

    php
    <?php
    +$this->taskCleanDir(['tmp','logs'])->run();
    +// as shortcut
    +$this->_cleanDir('app/cache');
    +?>
    • setOutput($output) Sets the Console Output.

    CopyDir

    Copies one dir into another

    php
    <?php
    +$this->taskCopyDir(['dist/config' => 'config'])->run();
    +// as shortcut
    +$this->_copyDir('dist/config', 'config');
    +?>
    • dirPermissions($value) Sets the default folder permissions for the destination if it doesn't exist
    • exclude($exclude = null) List files to exclude.
    • overwrite($overwrite) Destination files newer than source files are overwritten.
    • setOutput($output) Sets the Console Output.

    DeleteDir

    Deletes dir

    php
    <?php
    +$this->taskDeleteDir('tmp')->run();
    +// as shortcut
    +$this->_deleteDir(['tmp', 'log']);
    +?>
    • setOutput($output) Sets the Console Output.

    FilesystemStack

    Wrapper for Symfony Filesystem Component. Comands are executed in stack and can be stopped on first fail with stopOnFail option.

    php
    <?php
    +$this->taskFilesystemStack()
    +     ->mkdir('logs')
    +     ->touch('logs/.gitignore')
    +     ->chgrp('www', 'www-data')
    +     ->symlink('/var/log/nginx/error.log', 'logs/error.log')
    +     ->run();
    +
    +// one line
    +$this->_touch('.gitignore');
    +$this->_mkdir('logs');
    +
    +?>
    • $this mkdir(string|array|\\Traversable $dir, int $mode = 0777)

    • $this touch(string|array|\\Traversable $file, int $time = null, int $atime = null)

    • $this copy(string $from, string $to, bool $force = false)

    • $this chmod(string|array|\\Traversable $file, int $permissions, int $umask = 0000, bool $recursive = false)

    • $this chgrp(string|array|\\Traversable $file, string $group, bool $recursive = false)

    • $this chown(string|array|\\Traversable $file, string $user, bool $recursive = false)

    • $this remove(string|array|\\Traversable $file)

    • $this rename(string $from, string $to, bool $force = false)

    • $this symlink(string $from, string $to, bool $copyOnWindows = false)

    • $this mirror(string $from, string $to, \\Traversable $iterator = null, array $options = [])

    • stopOnFail($stop = null) * param bool $stop

    • setOutput($output) Sets the Console Output.

    FlattenDir

    Searches for files in a nested directory structure and copies them to a target directory with or without the parent directories. The task was inspired by gulp-flatten.

    Example directory structure:

    └── assets
    +    ├── asset-library1
    +    │   ├── README.md
    +    │   └── asset-library1.min.js
    +    └── asset-library2
    +        ├── README.md
    +        └── asset-library2.min.js

    The following code will search the *.min.js files and copy them inside a new dist folder:

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js' => 'dist'])->run();
    +// or use shortcut
    +$this->_flattenDir('assets/*.min.js', 'dist');
    +?>

    You can also define the target directory with an additional method, instead of key/value pairs. More similar to the gulp-flatten syntax:

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js'])
    +  ->to('dist')
    +  ->run();
    +?>

    You can also append parts of the parent directories to the target path. If you give the value 1 to the includeParents() method, then the top parent will be appended to the target directory resulting in a path such as dist/assets/asset-library1.min.js.

    If you give a negative number, such as -1 (the same as specifying array(0, 1) then the bottom parent will be appended, resulting in a path such as dist/asset-library1/asset-library1.min.js.

    The top parent directory will always be starting from the relative path to the current directory. You can override that with the parentDir() method. If in the above example you would specify assets, then the top parent directory would be asset-library1.

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js' => 'dist'])
    +  ->parentDir('assets')
    +  ->includeParents(1)
    +  ->run();
    +?>
    • dirPermissions($permission) Sets the default folder permissions for the destination if it does not exist.
    • includeParents($parents) Sets the value from which direction and how much parent dirs should be included.
    • parentDir($dir) Sets the parent directory from which the relative parent directories will be calculated.
    • to($target) Sets the target directory where the files will be copied to.
    • setOutput($output) Sets the Console Output.

    MirrorDir

    Mirrors a directory to another

    php
    <?php
    +$this->taskMirrorDir(['dist/config/' => 'config/'])->run();
    +// or use shortcut
    +$this->_mirrorDir('dist/config/', 'config/');
    +
    +?>
    • setOutput($output) Sets the Console Output.

    TmpDir

    Create a temporary directory that is automatically cleaned up once the task collection is is part of completes.

    Use WorkDir if you do not want the directory to be deleted.

    php
    <?php
    +// Delete on rollback or on successful completion.
    +// Note that in this example, everything is deleted at
    +// the end of $collection->run().
    +$collection = $this->collectionBuilder();
    +$tmpPath = $collection->tmpDir()->getPath();
    +$collection->taskFilesystemStack()
    +          ->mkdir("$tmpPath/log")
    +          ->touch("$tmpPath/log/error.txt");
    +$collection->run();
    +// as shortcut (deleted when program exits)
    +$tmpPath = $this->_tmpDir();
    +?>
    • cwd($shouldChangeWorkingDirectory = null) Flag that we should cwd to the temporary directory when it is
    • complete() Delete this directory when our collection completes.
    • getPath() Get a reference to the path to the temporary directory, so that
    • setOutput($output) Sets the Console Output.

    WorkDir

    Create a temporary working directory that is automatically renamed to its final desired location if all of the tasks in the collection succeed. If there is a rollback, then the working directory is deleted.

    php
    <?php
    +$collection = $this->collectionBuilder();
    +$workingPath = $collection->workDir("build")->getPath();
    +$collection->taskFilesystemStack()
    +          ->mkdir("$workingPath/log")
    +          ->touch("$workingPath/log/error.txt");
    +$collection->run();
    +?>
    • complete() Move our working directory into its final destination once the
    • rollback() Delete our working directory
    • getPath() Get a reference to the path to the temporary directory, so that
    • cwd($shouldChangeWorkingDirectory = null) Flag that we should cwd to the temporary directory when it is
    • setOutput($output) Sets the Console Output.
    `,43)]))}const c=i(e,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/tasks_Filesystem.md.uI33GNVM.lean.js b/assets/tasks_Filesystem.md.uI33GNVM.lean.js new file mode 100644 index 0000000..38885d1 --- /dev/null +++ b/assets/tasks_Filesystem.md.uI33GNVM.lean.js @@ -0,0 +1,68 @@ +import{_ as i,c as a,a2 as t,o as n}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Filesystem Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Filesystem.md","filePath":"tasks/Filesystem.md"}'),e={name:"tasks/Filesystem.md"};function l(h,s,p,k,r,d){return n(),a("div",null,s[0]||(s[0]=[t(`

    Filesystem Tasks

    CleanDir

    Deletes all files from specified dir, ignoring git files.

    php
    <?php
    +$this->taskCleanDir(['tmp','logs'])->run();
    +// as shortcut
    +$this->_cleanDir('app/cache');
    +?>
    • setOutput($output) Sets the Console Output.

    CopyDir

    Copies one dir into another

    php
    <?php
    +$this->taskCopyDir(['dist/config' => 'config'])->run();
    +// as shortcut
    +$this->_copyDir('dist/config', 'config');
    +?>
    • dirPermissions($value) Sets the default folder permissions for the destination if it doesn't exist
    • exclude($exclude = null) List files to exclude.
    • overwrite($overwrite) Destination files newer than source files are overwritten.
    • setOutput($output) Sets the Console Output.

    DeleteDir

    Deletes dir

    php
    <?php
    +$this->taskDeleteDir('tmp')->run();
    +// as shortcut
    +$this->_deleteDir(['tmp', 'log']);
    +?>
    • setOutput($output) Sets the Console Output.

    FilesystemStack

    Wrapper for Symfony Filesystem Component. Comands are executed in stack and can be stopped on first fail with stopOnFail option.

    php
    <?php
    +$this->taskFilesystemStack()
    +     ->mkdir('logs')
    +     ->touch('logs/.gitignore')
    +     ->chgrp('www', 'www-data')
    +     ->symlink('/var/log/nginx/error.log', 'logs/error.log')
    +     ->run();
    +
    +// one line
    +$this->_touch('.gitignore');
    +$this->_mkdir('logs');
    +
    +?>
    • $this mkdir(string|array|\\Traversable $dir, int $mode = 0777)

    • $this touch(string|array|\\Traversable $file, int $time = null, int $atime = null)

    • $this copy(string $from, string $to, bool $force = false)

    • $this chmod(string|array|\\Traversable $file, int $permissions, int $umask = 0000, bool $recursive = false)

    • $this chgrp(string|array|\\Traversable $file, string $group, bool $recursive = false)

    • $this chown(string|array|\\Traversable $file, string $user, bool $recursive = false)

    • $this remove(string|array|\\Traversable $file)

    • $this rename(string $from, string $to, bool $force = false)

    • $this symlink(string $from, string $to, bool $copyOnWindows = false)

    • $this mirror(string $from, string $to, \\Traversable $iterator = null, array $options = [])

    • stopOnFail($stop = null) * param bool $stop

    • setOutput($output) Sets the Console Output.

    FlattenDir

    Searches for files in a nested directory structure and copies them to a target directory with or without the parent directories. The task was inspired by gulp-flatten.

    Example directory structure:

    └── assets
    +    ├── asset-library1
    +    │   ├── README.md
    +    │   └── asset-library1.min.js
    +    └── asset-library2
    +        ├── README.md
    +        └── asset-library2.min.js

    The following code will search the *.min.js files and copy them inside a new dist folder:

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js' => 'dist'])->run();
    +// or use shortcut
    +$this->_flattenDir('assets/*.min.js', 'dist');
    +?>

    You can also define the target directory with an additional method, instead of key/value pairs. More similar to the gulp-flatten syntax:

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js'])
    +  ->to('dist')
    +  ->run();
    +?>

    You can also append parts of the parent directories to the target path. If you give the value 1 to the includeParents() method, then the top parent will be appended to the target directory resulting in a path such as dist/assets/asset-library1.min.js.

    If you give a negative number, such as -1 (the same as specifying array(0, 1) then the bottom parent will be appended, resulting in a path such as dist/asset-library1/asset-library1.min.js.

    The top parent directory will always be starting from the relative path to the current directory. You can override that with the parentDir() method. If in the above example you would specify assets, then the top parent directory would be asset-library1.

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js' => 'dist'])
    +  ->parentDir('assets')
    +  ->includeParents(1)
    +  ->run();
    +?>
    • dirPermissions($permission) Sets the default folder permissions for the destination if it does not exist.
    • includeParents($parents) Sets the value from which direction and how much parent dirs should be included.
    • parentDir($dir) Sets the parent directory from which the relative parent directories will be calculated.
    • to($target) Sets the target directory where the files will be copied to.
    • setOutput($output) Sets the Console Output.

    MirrorDir

    Mirrors a directory to another

    php
    <?php
    +$this->taskMirrorDir(['dist/config/' => 'config/'])->run();
    +// or use shortcut
    +$this->_mirrorDir('dist/config/', 'config/');
    +
    +?>
    • setOutput($output) Sets the Console Output.

    TmpDir

    Create a temporary directory that is automatically cleaned up once the task collection is is part of completes.

    Use WorkDir if you do not want the directory to be deleted.

    php
    <?php
    +// Delete on rollback or on successful completion.
    +// Note that in this example, everything is deleted at
    +// the end of $collection->run().
    +$collection = $this->collectionBuilder();
    +$tmpPath = $collection->tmpDir()->getPath();
    +$collection->taskFilesystemStack()
    +          ->mkdir("$tmpPath/log")
    +          ->touch("$tmpPath/log/error.txt");
    +$collection->run();
    +// as shortcut (deleted when program exits)
    +$tmpPath = $this->_tmpDir();
    +?>
    • cwd($shouldChangeWorkingDirectory = null) Flag that we should cwd to the temporary directory when it is
    • complete() Delete this directory when our collection completes.
    • getPath() Get a reference to the path to the temporary directory, so that
    • setOutput($output) Sets the Console Output.

    WorkDir

    Create a temporary working directory that is automatically renamed to its final desired location if all of the tasks in the collection succeed. If there is a rollback, then the working directory is deleted.

    php
    <?php
    +$collection = $this->collectionBuilder();
    +$workingPath = $collection->workDir("build")->getPath();
    +$collection->taskFilesystemStack()
    +          ->mkdir("$workingPath/log")
    +          ->touch("$workingPath/log/error.txt");
    +$collection->run();
    +?>
    • complete() Move our working directory into its final destination once the
    • rollback() Delete our working directory
    • getPath() Get a reference to the path to the temporary directory, so that
    • cwd($shouldChangeWorkingDirectory = null) Flag that we should cwd to the temporary directory when it is
    • setOutput($output) Sets the Console Output.
    `,43)]))}const c=i(e,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/tasks_Gulp.md.C3DY2yDe.js b/assets/tasks_Gulp.md.C3DY2yDe.js new file mode 100644 index 0000000..2501e68 --- /dev/null +++ b/assets/tasks_Gulp.md.C3DY2yDe.js @@ -0,0 +1,9 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Gulp Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Gulp.md","filePath":"tasks/Gulp.md"}'),l={name:"tasks/Gulp.md"};function n(p,s,o,r,h,d){return t(),i("div",null,s[0]||(s[0]=[e(`

    Gulp Tasks

    Run

    Gulp Run

    php
    <?php
    +// simple execution
    +$this->taskGulpRun()->run();
    +
    +// run task 'clean' with --silent option
    +$this->taskGulpRun('clean')
    +     ->silent()
    +     ->run();
    +?>
    • noColor() adds --no-color option to gulp
    • color() adds --color option to gulp
    • simple() adds --tasks-simple option to gulp
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,5)]))}const u=a(l,[["render",n]]);export{c as __pageData,u as default}; diff --git a/assets/tasks_Gulp.md.C3DY2yDe.lean.js b/assets/tasks_Gulp.md.C3DY2yDe.lean.js new file mode 100644 index 0000000..2501e68 --- /dev/null +++ b/assets/tasks_Gulp.md.C3DY2yDe.lean.js @@ -0,0 +1,9 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Gulp Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Gulp.md","filePath":"tasks/Gulp.md"}'),l={name:"tasks/Gulp.md"};function n(p,s,o,r,h,d){return t(),i("div",null,s[0]||(s[0]=[e(`

    Gulp Tasks

    Run

    Gulp Run

    php
    <?php
    +// simple execution
    +$this->taskGulpRun()->run();
    +
    +// run task 'clean' with --silent option
    +$this->taskGulpRun('clean')
    +     ->silent()
    +     ->run();
    +?>
    • noColor() adds --no-color option to gulp
    • color() adds --color option to gulp
    • simple() adds --tasks-simple option to gulp
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,5)]))}const u=a(l,[["render",n]]);export{c as __pageData,u as default}; diff --git a/assets/tasks_Logfile.md.Blr2QCoo.js b/assets/tasks_Logfile.md.Blr2QCoo.js new file mode 100644 index 0000000..f554934 --- /dev/null +++ b/assets/tasks_Logfile.md.Blr2QCoo.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Logfile Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Logfile.md","filePath":"tasks/Logfile.md"}'),l={name:"tasks/Logfile.md"};function n(h,s,p,k,o,r){return e(),a("div",null,s[0]||(s[0]=[t(`

    Logfile Tasks

    RotateLog

    Rotates a log (or any other) file

    php
    <?php
    +$this->taskRotateLog(['logfile.log'])->run();
    +// or use shortcut
    +$this->_rotateLog(['logfile.log']);
    +
    +?>
    • keep($keep) * param int $keep
    • chmod($chmod) * param int $chmod
    • setOutput($output) Sets the Console Output.

    TruncateLog

    Truncates a log (or any other) file

    php
    <?php
    +$this->taskTruncateLog(['logfile.log'])->run();
    +// or use shortcut
    +$this->_truncateLog(['logfile.log']);
    +
    +?>
    • chmod($chmod) * param int $chmod
    • setOutput($output) Sets the Console Output.
    `,9)]))}const c=i(l,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/tasks_Logfile.md.Blr2QCoo.lean.js b/assets/tasks_Logfile.md.Blr2QCoo.lean.js new file mode 100644 index 0000000..f554934 --- /dev/null +++ b/assets/tasks_Logfile.md.Blr2QCoo.lean.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Logfile Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Logfile.md","filePath":"tasks/Logfile.md"}'),l={name:"tasks/Logfile.md"};function n(h,s,p,k,o,r){return e(),a("div",null,s[0]||(s[0]=[t(`

    Logfile Tasks

    RotateLog

    Rotates a log (or any other) file

    php
    <?php
    +$this->taskRotateLog(['logfile.log'])->run();
    +// or use shortcut
    +$this->_rotateLog(['logfile.log']);
    +
    +?>
    • keep($keep) * param int $keep
    • chmod($chmod) * param int $chmod
    • setOutput($output) Sets the Console Output.

    TruncateLog

    Truncates a log (or any other) file

    php
    <?php
    +$this->taskTruncateLog(['logfile.log'])->run();
    +// or use shortcut
    +$this->_truncateLog(['logfile.log']);
    +
    +?>
    • chmod($chmod) * param int $chmod
    • setOutput($output) Sets the Console Output.
    `,9)]))}const c=i(l,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/tasks_Npm.md.CDkDDsGf.js b/assets/tasks_Npm.md.CDkDDsGf.js new file mode 100644 index 0000000..cc008f6 --- /dev/null +++ b/assets/tasks_Npm.md.CDkDDsGf.js @@ -0,0 +1,17 @@ +import{_ as a,c as i,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Npm Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Npm.md","filePath":"tasks/Npm.md"}'),n={name:"tasks/Npm.md"};function l(p,s,o,h,r,d){return e(),i("div",null,s[0]||(s[0]=[t(`

    Npm Tasks

    Install

    Npm Install

    php
    <?php
    +// simple execution
    +$this->taskNpmInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskNpmInstall('path/to/my/npm')
    +     ->noDev()
    +     ->run();
    +?>
    • noDev() adds production option to npm
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Npm Update

    php
    <?php
    +// simple execution
    +$this->taskNpmUpdate()->run();
    +
    +// prefer dist with custom path
    +$this->taskNpmUpdate('path/to/my/npm')
    +     ->noDev()
    +     ->run();
    +?>
    • noDev() adds production option to npm
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,9)]))}const u=a(n,[["render",l]]);export{c as __pageData,u as default}; diff --git a/assets/tasks_Npm.md.CDkDDsGf.lean.js b/assets/tasks_Npm.md.CDkDDsGf.lean.js new file mode 100644 index 0000000..cc008f6 --- /dev/null +++ b/assets/tasks_Npm.md.CDkDDsGf.lean.js @@ -0,0 +1,17 @@ +import{_ as a,c as i,a2 as t,o as e}from"./chunks/framework.DptEmx5X.js";const c=JSON.parse('{"title":"Npm Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Npm.md","filePath":"tasks/Npm.md"}'),n={name:"tasks/Npm.md"};function l(p,s,o,h,r,d){return e(),i("div",null,s[0]||(s[0]=[t(`

    Npm Tasks

    Install

    Npm Install

    php
    <?php
    +// simple execution
    +$this->taskNpmInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskNpmInstall('path/to/my/npm')
    +     ->noDev()
    +     ->run();
    +?>
    • noDev() adds production option to npm
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Npm Update

    php
    <?php
    +// simple execution
    +$this->taskNpmUpdate()->run();
    +
    +// prefer dist with custom path
    +$this->taskNpmUpdate('path/to/my/npm')
    +     ->noDev()
    +     ->run();
    +?>
    • noDev() adds production option to npm
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,9)]))}const u=a(n,[["render",l]]);export{c as __pageData,u as default}; diff --git a/assets/tasks_Remote.md.njRmWy1Y.js b/assets/tasks_Remote.md.njRmWy1Y.js new file mode 100644 index 0000000..06a3981 --- /dev/null +++ b/assets/tasks_Remote.md.njRmWy1Y.js @@ -0,0 +1,40 @@ +import{_ as e,c as t,a2 as i,j as a,o as n}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Remote Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Remote.md","filePath":"tasks/Remote.md"}'),l={name:"tasks/Remote.md"};function h(p,s,k,r,d,o){return n(),t("div",null,[s[4]||(s[4]=i(`

    Remote Tasks

    Rsync

    Executes rsync in a flexible manner.

    php
    $this->taskRsync()
    +  ->fromPath('src/')
    +  ->toHost('localhost')
    +  ->toUser('dev')
    +  ->toPath('/var/www/html/app/')
    +  ->remoteShell('ssh -i public_key')
    +  ->recursive()
    +  ->excludeVcs()
    +  ->checksum()
    +  ->wholeFile()
    +  ->verbose()
    +  ->progress()
    +  ->humanReadable()
    +  ->stats()
    +  ->run();

    You could also clone the task and do a dry-run first:

    php
    $rsync = $this->taskRsync()
    +  ->fromPath('src/')
    +  ->toPath('example.com:/var/www/html/app/')
    +  ->archive()
    +  ->excludeVcs()
    +  ->progress()
    +  ->stats();
    +
    +$dryRun = clone $rsync;
    +$dryRun->dryRun()->run();
    +if ('y' === $this->ask('Do you want to run (y/n)')) {
    +  $rsync->run();
    +}
    • fromPath($path) This can either be a full rsync path spec (user@host:path) or just a path.
    • toPath($path) This can either be a full rsync path spec (user@host:path) or just a path.
    • fromUser($fromUser) * param string $fromUser
    • fromHost($fromHost) * param string $fromHost
    • toUser($toUser) * param string $toUser
    • toHost($toHost) * param string $toHost
    • progress() * return $this
    • stats() * return $this
    • recursive() * return $this
    • verbose() * return $this
    • checksum() * return $this
    • archive() * return $this
    • compress() * return $this
    • owner() * return $this
    • group() * return $this
    • times() * return $this
    • delete() * return $this
    • humanReadable() * return $this
    • wholeFile() * return $this
    • dryRun() * return $this
    • itemizeChanges() * return $this
    • excludeVcs() Excludes .git, .svn and .hg items at any depth.
    • exclude($pattern) * param array|string $pattern
    • excludeFrom($file) * param string $file
    • includeFilter($pattern) * param array|string $pattern
    • filter($pattern) * param array|string $pattern
    • filesFrom($file) * param string $file
    • remoteShell($command) * param string $command
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Ssh

    Runs multiple commands on a remote server. Per default, commands are combined with &&, unless stopOnFail is false.

    php
    <?php
    +
    +$this->taskSshExec('remote.example.com', 'user')
    +    ->remoteDir('/var/www/html')
    +    ->exec('ls -la')
    +    ->exec('chmod g+x logs')
    +    ->run();

    You can even exec other tasks (which implement CommandInterface):

    php
    $gitTask = $this->taskGitStack()
    +    ->checkout('master')
    +    ->pull();
    +
    +$this->taskSshExec('remote.example.com')
    +    ->remoteDir('/var/www/html/site')
    +    ->exec($gitTask)
    +    ->run();

    You can configure the remote directory for all future calls:

    php
    ::configure('remoteDir', '/some-dir');
    `,14)),a("ul",null,[s[2]||(s[2]=i("
  • hostname($hostname) * param string $hostname
  • user($user) * param string $user
  • stopOnFail($stopOnFail = null) Whether or not to chain commands together with && and stop the chain if one command fails.
  • remoteDir($remoteDir) Changes to the given directory before running commands.
  • identityFile($filename) * param string $filename
  • port($port) * param int $port
  • forcePseudoTty() * return $this
  • quiet() * return $this
  • verbose() * return $this
  • exec($command) * param string|string[]|CommandInterface $command
  • ",10)),a("li",{onInheritdoc:s[0]||(s[0]=()=>{})},s[1]||(s[1]=[a("code",null,"simulate($context)",-1)]),32),s[3]||(s[3]=i("
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",9))])])}const E=e(l,[["render",h]]);export{g as __pageData,E as default}; diff --git a/assets/tasks_Remote.md.njRmWy1Y.lean.js b/assets/tasks_Remote.md.njRmWy1Y.lean.js new file mode 100644 index 0000000..06a3981 --- /dev/null +++ b/assets/tasks_Remote.md.njRmWy1Y.lean.js @@ -0,0 +1,40 @@ +import{_ as e,c as t,a2 as i,j as a,o as n}from"./chunks/framework.DptEmx5X.js";const g=JSON.parse('{"title":"Remote Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Remote.md","filePath":"tasks/Remote.md"}'),l={name:"tasks/Remote.md"};function h(p,s,k,r,d,o){return n(),t("div",null,[s[4]||(s[4]=i(`

    Remote Tasks

    Rsync

    Executes rsync in a flexible manner.

    php
    $this->taskRsync()
    +  ->fromPath('src/')
    +  ->toHost('localhost')
    +  ->toUser('dev')
    +  ->toPath('/var/www/html/app/')
    +  ->remoteShell('ssh -i public_key')
    +  ->recursive()
    +  ->excludeVcs()
    +  ->checksum()
    +  ->wholeFile()
    +  ->verbose()
    +  ->progress()
    +  ->humanReadable()
    +  ->stats()
    +  ->run();

    You could also clone the task and do a dry-run first:

    php
    $rsync = $this->taskRsync()
    +  ->fromPath('src/')
    +  ->toPath('example.com:/var/www/html/app/')
    +  ->archive()
    +  ->excludeVcs()
    +  ->progress()
    +  ->stats();
    +
    +$dryRun = clone $rsync;
    +$dryRun->dryRun()->run();
    +if ('y' === $this->ask('Do you want to run (y/n)')) {
    +  $rsync->run();
    +}
    • fromPath($path) This can either be a full rsync path spec (user@host:path) or just a path.
    • toPath($path) This can either be a full rsync path spec (user@host:path) or just a path.
    • fromUser($fromUser) * param string $fromUser
    • fromHost($fromHost) * param string $fromHost
    • toUser($toUser) * param string $toUser
    • toHost($toHost) * param string $toHost
    • progress() * return $this
    • stats() * return $this
    • recursive() * return $this
    • verbose() * return $this
    • checksum() * return $this
    • archive() * return $this
    • compress() * return $this
    • owner() * return $this
    • group() * return $this
    • times() * return $this
    • delete() * return $this
    • humanReadable() * return $this
    • wholeFile() * return $this
    • dryRun() * return $this
    • itemizeChanges() * return $this
    • excludeVcs() Excludes .git, .svn and .hg items at any depth.
    • exclude($pattern) * param array|string $pattern
    • excludeFrom($file) * param string $file
    • includeFilter($pattern) * param array|string $pattern
    • filter($pattern) * param array|string $pattern
    • filesFrom($file) * param string $file
    • remoteShell($command) * param string $command
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Ssh

    Runs multiple commands on a remote server. Per default, commands are combined with &&, unless stopOnFail is false.

    php
    <?php
    +
    +$this->taskSshExec('remote.example.com', 'user')
    +    ->remoteDir('/var/www/html')
    +    ->exec('ls -la')
    +    ->exec('chmod g+x logs')
    +    ->run();

    You can even exec other tasks (which implement CommandInterface):

    php
    $gitTask = $this->taskGitStack()
    +    ->checkout('master')
    +    ->pull();
    +
    +$this->taskSshExec('remote.example.com')
    +    ->remoteDir('/var/www/html/site')
    +    ->exec($gitTask)
    +    ->run();

    You can configure the remote directory for all future calls:

    php
    ::configure('remoteDir', '/some-dir');
    `,14)),a("ul",null,[s[2]||(s[2]=i("
  • hostname($hostname) * param string $hostname
  • user($user) * param string $user
  • stopOnFail($stopOnFail = null) Whether or not to chain commands together with && and stop the chain if one command fails.
  • remoteDir($remoteDir) Changes to the given directory before running commands.
  • identityFile($filename) * param string $filename
  • port($port) * param int $port
  • forcePseudoTty() * return $this
  • quiet() * return $this
  • verbose() * return $this
  • exec($command) * param string|string[]|CommandInterface $command
  • ",10)),a("li",{onInheritdoc:s[0]||(s[0]=()=>{})},s[1]||(s[1]=[a("code",null,"simulate($context)",-1)]),32),s[3]||(s[3]=i("
  • setOutput($output) Sets the Console Output.
  • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
  • dir($dir) Changes working directory of command
  • arg($arg) Pass argument to executable. Its value will be automatically escaped.
  • args($args) Pass methods parameters as arguments to executable. Argument values
  • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
  • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
  • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
  • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
  • ",9))])])}const E=e(l,[["render",h]]);export{g as __pageData,E as default}; diff --git a/assets/tasks_Testing.md.BzoHi9tg.js b/assets/tasks_Testing.md.BzoHi9tg.js new file mode 100644 index 0000000..d93ba88 --- /dev/null +++ b/assets/tasks_Testing.md.BzoHi9tg.js @@ -0,0 +1,33 @@ +import{_ as s,c as e,a2 as a,o as t}from"./chunks/framework.DptEmx5X.js";const k=JSON.parse('{"title":"Testing Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Testing.md","filePath":"tasks/Testing.md"}'),l={name:"tasks/Testing.md"};function n(o,i,p,r,d,c){return t(),e("div",null,i[0]||(i[0]=[a(`

    Testing Tasks

    Atoum

    Runs atoum tests

    php
    <?php
    +$this->taskAtoum()
    + ->files('path/to/test.php')
    + ->configFile('config/dev.php')
    + ->run()
    +
    +?>
    • tags($tags) Tag or Tags to filter.
    • lightReport() Display result using the light reporter.
    • tap() Display result using the tap reporter.
    • bootstrap($file) Path to the bootstrap file.
    • configFile($file) Path to the config file.
    • debug() Use atoum's debug mode.
    • files($files) Test file or test files to run.
    • directories($directories) Test directory or directories to run.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Behat

    Executes Behat tests

    php
    <?php
    +$this->taskBehat()
    +     ->format('pretty')
    +     ->noInteraction()
    +     ->run();
    +?>
    • stopOnFail() * return $this
    • noInteraction() * return $this
    • config($config_file) * param string $config_file
    • colors() * return $this
    • noColors() * return $this
    • suite($suite) * param string $suite
    • verbose($level = null) * param string $level
    • format($formater) * param string $formater
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Codecept

    Executes Codeception tests

    php
    <?php
    +// config
    +$this->taskCodecept()
    +     ->suite('acceptance')
    +     ->env('chrome')
    +     ->group('admin')
    +     ->xml()
    +     ->html()
    +     ->run();
    +
    +?>
    • suite($suite) * param string $suite
    • test($testName) * param string $testName
    • group($group) set group option. Can be called multiple times
    • excludeGroup($group) * param string $group
    • json($file = null) generate json report
    • xml($file = null) generate xml JUnit report
    • html($dir = null) Generate html report
    • tap($file = null) generate tap report
    • configFile($file) provides config file other then default codeception.yml with -c option
    • coverage($cov = null) collect codecoverage in raw format. You may pass name of cov file to save results
    • coverageXml($xml = null) collect code coverage in xml format. You may pass name of xml file to save results
    • coverageHtml($html = null) collect code coverage and generate html report. You may pass
    • debug() * return $this
    • noRebuild() * return $this
    • noExit() * return $this
    • failGroup($failGroup) * param string $failGroup
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    PHPUnit

    Runs PHPUnit tests

    php
    <?php
    +$this->taskPHPUnit()
    + ->group('core')
    + ->bootstrap('test/bootstrap.php')
    + ->run()
    +
    +?>
    • filter($filter) * param string $filter
    • group($group) * param string $group
    • excludeGroup($group) * param string $group
    • json($file = null) adds log-json option to runner
    • xml($file = null) adds log-junit option
    • tap($file = null) * param string $file
    • bootstrap($file) * param string $file
    • configFile($file) * param string $file
    • debug() * return $this
    • files($files) Directory of test files or single test file to run.
    • file($file) Test the provided file.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Phpspec

    Executes Phpspec tests

    php
    <?php
    +$this->taskPhpspec()
    +     ->format('pretty')
    +     ->noInteraction()
    +     ->run();
    +?>
    • stopOnFail()
    • noCodeGeneration()
    • quiet()
    • verbose($level = null) * param string $level
    • noAnsi() * return $this
    • noInteraction() * return $this
    • config($config_file) * param string $config_file
    • format($formater) * param string $formater
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,21)]))}const g=s(l,[["render",n]]);export{k as __pageData,g as default}; diff --git a/assets/tasks_Testing.md.BzoHi9tg.lean.js b/assets/tasks_Testing.md.BzoHi9tg.lean.js new file mode 100644 index 0000000..d93ba88 --- /dev/null +++ b/assets/tasks_Testing.md.BzoHi9tg.lean.js @@ -0,0 +1,33 @@ +import{_ as s,c as e,a2 as a,o as t}from"./chunks/framework.DptEmx5X.js";const k=JSON.parse('{"title":"Testing Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Testing.md","filePath":"tasks/Testing.md"}'),l={name:"tasks/Testing.md"};function n(o,i,p,r,d,c){return t(),e("div",null,i[0]||(i[0]=[a(`

    Testing Tasks

    Atoum

    Runs atoum tests

    php
    <?php
    +$this->taskAtoum()
    + ->files('path/to/test.php')
    + ->configFile('config/dev.php')
    + ->run()
    +
    +?>
    • tags($tags) Tag or Tags to filter.
    • lightReport() Display result using the light reporter.
    • tap() Display result using the tap reporter.
    • bootstrap($file) Path to the bootstrap file.
    • configFile($file) Path to the config file.
    • debug() Use atoum's debug mode.
    • files($files) Test file or test files to run.
    • directories($directories) Test directory or directories to run.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Behat

    Executes Behat tests

    php
    <?php
    +$this->taskBehat()
    +     ->format('pretty')
    +     ->noInteraction()
    +     ->run();
    +?>
    • stopOnFail() * return $this
    • noInteraction() * return $this
    • config($config_file) * param string $config_file
    • colors() * return $this
    • noColors() * return $this
    • suite($suite) * param string $suite
    • verbose($level = null) * param string $level
    • format($formater) * param string $formater
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Codecept

    Executes Codeception tests

    php
    <?php
    +// config
    +$this->taskCodecept()
    +     ->suite('acceptance')
    +     ->env('chrome')
    +     ->group('admin')
    +     ->xml()
    +     ->html()
    +     ->run();
    +
    +?>
    • suite($suite) * param string $suite
    • test($testName) * param string $testName
    • group($group) set group option. Can be called multiple times
    • excludeGroup($group) * param string $group
    • json($file = null) generate json report
    • xml($file = null) generate xml JUnit report
    • html($dir = null) Generate html report
    • tap($file = null) generate tap report
    • configFile($file) provides config file other then default codeception.yml with -c option
    • coverage($cov = null) collect codecoverage in raw format. You may pass name of cov file to save results
    • coverageXml($xml = null) collect code coverage in xml format. You may pass name of xml file to save results
    • coverageHtml($html = null) collect code coverage and generate html report. You may pass
    • debug() * return $this
    • noRebuild() * return $this
    • noExit() * return $this
    • failGroup($failGroup) * param string $failGroup
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    PHPUnit

    Runs PHPUnit tests

    php
    <?php
    +$this->taskPHPUnit()
    + ->group('core')
    + ->bootstrap('test/bootstrap.php')
    + ->run()
    +
    +?>
    • filter($filter) * param string $filter
    • group($group) * param string $group
    • excludeGroup($group) * param string $group
    • json($file = null) adds log-json option to runner
    • xml($file = null) adds log-junit option
    • tap($file = null) * param string $file
    • bootstrap($file) * param string $file
    • configFile($file) * param string $file
    • debug() * return $this
    • files($files) Directory of test files or single test file to run.
    • file($file) Test the provided file.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Phpspec

    Executes Phpspec tests

    php
    <?php
    +$this->taskPhpspec()
    +     ->format('pretty')
    +     ->noInteraction()
    +     ->run();
    +?>
    • stopOnFail()
    • noCodeGeneration()
    • quiet()
    • verbose($level = null) * param string $level
    • noAnsi() * return $this
    • noInteraction() * return $this
    • config($config_file) * param string $config_file
    • format($formater) * param string $formater
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    `,21)]))}const g=s(l,[["render",n]]);export{k as __pageData,g as default}; diff --git a/assets/tasks_Vcs.md.Cj5oiNmm.js b/assets/tasks_Vcs.md.Cj5oiNmm.js new file mode 100644 index 0000000..633237b --- /dev/null +++ b/assets/tasks_Vcs.md.Cj5oiNmm.js @@ -0,0 +1,41 @@ +import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.DptEmx5X.js";const r=JSON.parse('{"title":"Vcs Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Vcs.md","filePath":"tasks/Vcs.md"}'),l={name:"tasks/Vcs.md"};function e(h,s,p,k,d,c){return t(),a("div",null,s[0]||(s[0]=[n(`

    Vcs Tasks

    GitStack

    Runs Git commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->taskGitStack()
    + ->stopOnFail()
    + ->add('-A')
    + ->commit('adding everything')
    + ->push('origin','master')
    + ->tag('0.6.0')
    + ->push('origin','0.6.0')
    + ->run()
    +
    +$this->taskGitStack()
    + ->stopOnFail()
    + ->add('doc/*')
    + ->commit('doc updated')
    + ->push()
    + ->run();
    +?>
    • cloneRepo($repo, $to = null, $branch = null) Executes git clone
    • cloneShallow($repo, $to = null, $branch = null, $depth = null) Executes git clone with depth 1 as default
    • add($pattern) Executes git add command with files to add pattern
    • commit($message, $options = null) Executes git commit command with a message
    • pull($origin = null, $branch = null) Executes git pull command.
    • push($origin = null, $branch = null) Executes git push command
    • merge($branch) Performs git merge
    • checkout($branch) Executes git checkout command
    • tag($tag_name, $message = null) Executes git tag command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    HgStack

    Runs hg commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->hgStack
    + ->cloneRepo('https://bitbucket.org/durin42/hgsubversion')
    + ->pull()
    + ->add()
    + ->commit('changed')
    + ->push()
    + ->tag('0.6.0')
    + ->push('0.6.0')
    + ->run();
    +?>
    • cloneRepo($repo, $to = null) Executes hg clone
    • add($include = null, $exclude = null) Executes hg add command with files to add by pattern
    • commit($message, $options = null) Executes hg commit command with a message
    • pull($branch = null) Executes hg pull command.
    • push($branch = null) Executes hg push command
    • merge($revision = null) Performs hg merge
    • tag($tag_name, $message = null) Executes hg tag command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    SvnStack

    Runs Svn commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->taskSvnStack()
    + ->checkout('http://svn.collab.net/repos/svn/trunk')
    + ->run()
    +
    +// alternatively
    +$this->_svnCheckout('http://svn.collab.net/repos/svn/trunk');
    +
    +$this->taskSvnStack('username', 'password')
    + ->stopOnFail()
    + ->update()
    + ->add('doc/*')
    + ->commit('doc updated')
    + ->run();
    +?>
    • update($path = null) Updates svn update command
    • add($pattern = null) Executes svn add command with files to add pattern
    • commit($message, $options = null) Executes svn commit command with a message
    • checkout($branch) Executes svn checkout command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    `,13)]))}const g=i(l,[["render",e]]);export{r as __pageData,g as default}; diff --git a/assets/tasks_Vcs.md.Cj5oiNmm.lean.js b/assets/tasks_Vcs.md.Cj5oiNmm.lean.js new file mode 100644 index 0000000..633237b --- /dev/null +++ b/assets/tasks_Vcs.md.Cj5oiNmm.lean.js @@ -0,0 +1,41 @@ +import{_ as i,c as a,a2 as n,o as t}from"./chunks/framework.DptEmx5X.js";const r=JSON.parse('{"title":"Vcs Tasks","description":"","frontmatter":{},"headers":[],"relativePath":"tasks/Vcs.md","filePath":"tasks/Vcs.md"}'),l={name:"tasks/Vcs.md"};function e(h,s,p,k,d,c){return t(),a("div",null,s[0]||(s[0]=[n(`

    Vcs Tasks

    GitStack

    Runs Git commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->taskGitStack()
    + ->stopOnFail()
    + ->add('-A')
    + ->commit('adding everything')
    + ->push('origin','master')
    + ->tag('0.6.0')
    + ->push('origin','0.6.0')
    + ->run()
    +
    +$this->taskGitStack()
    + ->stopOnFail()
    + ->add('doc/*')
    + ->commit('doc updated')
    + ->push()
    + ->run();
    +?>
    • cloneRepo($repo, $to = null, $branch = null) Executes git clone
    • cloneShallow($repo, $to = null, $branch = null, $depth = null) Executes git clone with depth 1 as default
    • add($pattern) Executes git add command with files to add pattern
    • commit($message, $options = null) Executes git commit command with a message
    • pull($origin = null, $branch = null) Executes git pull command.
    • push($origin = null, $branch = null) Executes git push command
    • merge($branch) Performs git merge
    • checkout($branch) Executes git checkout command
    • tag($tag_name, $message = null) Executes git tag command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    HgStack

    Runs hg commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->hgStack
    + ->cloneRepo('https://bitbucket.org/durin42/hgsubversion')
    + ->pull()
    + ->add()
    + ->commit('changed')
    + ->push()
    + ->tag('0.6.0')
    + ->push('0.6.0')
    + ->run();
    +?>
    • cloneRepo($repo, $to = null) Executes hg clone
    • add($include = null, $exclude = null) Executes hg add command with files to add by pattern
    • commit($message, $options = null) Executes hg commit command with a message
    • pull($branch = null) Executes hg pull command.
    • push($branch = null) Executes hg push command
    • merge($revision = null) Performs hg merge
    • tag($tag_name, $message = null) Executes hg tag command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    SvnStack

    Runs Svn commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->taskSvnStack()
    + ->checkout('http://svn.collab.net/repos/svn/trunk')
    + ->run()
    +
    +// alternatively
    +$this->_svnCheckout('http://svn.collab.net/repos/svn/trunk');
    +
    +$this->taskSvnStack('username', 'password')
    + ->stopOnFail()
    + ->update()
    + ->add('doc/*')
    + ->commit('doc updated')
    + ->run();
    +?>
    • update($path = null) Updates svn update command
    • add($pattern = null) Executes svn add command with files to add pattern
    • commit($message, $options = null) Executes svn commit command with a message
    • checkout($branch) Executes svn checkout command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    `,13)]))}const g=i(l,[["render",e]]);export{r as __pageData,g as default}; diff --git a/collections.html b/collections.html new file mode 100644 index 0000000..feb3d51 --- /dev/null +++ b/collections.html @@ -0,0 +1,173 @@ + + + + + + Collection Builders | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Collection Builders

    Robo provides task collections as a means of making error detection and recovery easier. When Robo tasks are added to a collection, their execution is deferred until the $collection->run() method is called. If one of the tasks fail, then the operation will be aborted; rollback tasks may also be defined to restore the system to its original condition.

    When using collections, a Robo script will go through three phases:

    1. Determine which tasks will need to be run, and create a task builder.
    • Assign values to variables.
    • Do not alter the state of the system.
    1. Create the necessary tasks via the task builder.
    • Use variables calculated in the first phase in task parameters.
    1. Run the tasks via the run() method.
    • Check and report errors once after run() returns.

    Following this pattern will keep your code linear and easy to understand.

    Collections API

    Collections are made up of a combination of tasks and/or callable functions / method pointers, such as:

    • A task (implements TaskInterface)
    • A function name (string)
    • A closure (inline function)
    • A method reference (array with object and method name)

    Examples of adding different kinds of tasks to a collection are provided below.

    TaskInterface Objects

    php
    <?php
    +  $collection->add(
    +    $this->taskExec('ls')
    +  );
    +?>

    Functions

    php
    <?php
    +  $collection->addCode('mytaskfunction');
    +?>

    Closures

    php
    <?php
    +  $collection->addCode(
    +    function() use ($work)
    +    {
    +      // do something with $work      
    +    });
    +?>

    Methods

    php
    <?php
    +  $collection->addCode([$myobject, 'mymethod']);
    +?>

    Using a Collection Builder

    To manage a collection of tasks, use a collection builder. Collection builders allow tasks to be created via chained methods. All of the tasks created by the same builder are added to a collection; when the run() method is called, all of the tasks in the collection run.

    The 'publish' command from Robo's own RoboFile is shown below. It uses a collection builder to run some git and filesystem operations. The "completion" tasks are run after all other tasks complete, or during rollback processing when an operation fails.

    php
    <?php
    +class RoboFile extends \Robo\Tasks
    +{
    +    public function publish(ConsoleIO $io)
    +    {
    +        $current_branch = exec('git rev-parse --abbrev-ref HEAD');
    +
    +        $collection = $this->collectionBuilder($io);
    +        $collection->taskGitStack()
    +            ->checkout('site')
    +            ->merge('master')
    +        ->completion($this->taskGitStack()->checkout($current_branch))
    +        ->taskFilesystemStack()
    +            ->copy('CHANGELOG.md', 'docs/changelog.md')
    +        ->completion($this->taskFilesystemStack()->remove('docs/changelog.md'))
    +        ->taskExec('mkdocs gh-deploy');
    +
    +        return $collection;
    +    }
    +}
    +?>

    The example above also adds a couple of tasks as "completions"; these are run when the collection completes execution, as explained below.

    Rollbacks and Completions

    Robo also provides rollbacks and completions, special tasks that are eligible to run only if all of the tasks added to the collection before them succeed. The section below explains the circumstances under which these tasks will run.

    Completion Tasks

    Completions run whenever their collection completes or fails, but only if all of the tasks that come before it succeed. An example of this is shown in the first example above. A filesystem stack task copies CHANDELOG.md to docs/changelog.md; after this task is added to the collection, another filesystem stack task is added as a completion to delete docs/changelog.md. This is done because docs/changelog.md is only intended to exist long enough to be used by the mkdocs task, which is added later.

    Rollback Tasks

    In addition to completions, Robo also supports rollbacks. Rollback tasks can be used to clean up after failures, so the state of the system does not change when execution is interrupted by an error. A rollback task is executed if all of the tasks that come before it succeed, and at least one of the tasks that come after it fails. If all tasks succeed, then no rollback tasks are executed.

    Rollback and Completion Methods

    Any task may also implement \Robo\Contract\RollbackInterface; if this is done, then its rollback() method will be called if the task is run() on a collection that later fails.

    Use addAsCompletion($collection) in place of addAsRollback($collection), or implement \Robo\Contract\CompletionInterface. Completions otherwise work exactly like rollbacks.

    By default, rollbacks and completions tasks or callbacks continue even if errors occur. If you would like to explicitly cancel or abort the rollback or completion, you may throw the \Robo\Exception\AbortTasksException exception.

    Rollback and Completion Callbacks

    You may also provide arbitrary methods as callables to serve as rollback or completion functions, as shown below:

    php
    <?php
    +  $collection->rollbackCode([$myobject, 'myrollback']);
    +  $collection->completionCode([$myobject, 'mycompletion']);
    +?>

    Temporary Objects

    Since the concept of temporary objects that are cleaned up on failure is a common pattern, Robo provides built-in support for them. Temporary directories and files are provided out of the box; other kinds of temporary objects can be easily created using the Temporary global collection.

    Temporary Directories

    It is recommended that operations that perform multiple filesystem operations should, whenever possible, do most of their work in a temporary directory. Temporary directories are created by $this->taskTmpDir(), and are automatically removed when the collection completes or rolls back. As an added convenience, the CollectionBuilder class has a tmpDir() method that creates a temporary directory via taskTmpDir(), and then returns the path to the temporary directory.

    php
    <?php
    +class RoboFile extends \Robo\Tasks
    +{
    +    function myOperation(ConsoleIO $io)
    +    {
    +        $collection = $this->collectionBuilder($io);
    +        
    +        // Create a temporary directory, and fetch its path.
    +        $work = $collection->tmpDir();
    +
    +        $collection
    +          ->taskWriteToFile("$work/README.md")
    +            ->line('-----')
    +            ->line(date('Y-m-d').' Generated file: do not edit.')
    +            ->line('----');
    +        
    +        // If all of the preceding tasks succeed, then rename the temporary 
    +        // directory to its final name.
    +        $collection->taskFilesystemStack()
    +          ->rename($work, 'destination');
    +        
    +        return $collection->run();
    +    }
    +}
    +?>

    In the previous example, the path to the temporary directory is stored in the variable $work, and is passed as needed to the parameters of the other tasks as they are added to the collection. After the task collection is run, the temporary directory will be automatically deleted. In the example above, the temporary directory is renamed by the last task in the collection. This allows the working directory to persist; the collection will still attempt to remove the working directory, but no errors will be thrown if it no longer exists in its original location. Following this pattern allows Robo scripts to easily and safely do work that cleans up after itself on failure, without introducing a lot of branching or additional error recovery code. This paradigm is common enough to warrant a shortcut method of accomplishing the same thing. The example below is identical to the one above, save for the fact that it uses the workDir() method instead of tmpDir(). workDir() renames the temporary directory to its final name if the collection completes; any directory that exists in the same location will be overwritten at that time, but will persist if the collection roles back.

    php
    <?php
    +class RoboFile extends \Robo\Tasks
    +{
    +    function myOperation(ConsoleIO $io)
    +    {
    +        $collection = $this->collectionBuilder($io);
    +        
    +        // Create a temporary directory, and fetch its path.
    +        // If all of the tasks succeed, then rename the temporary directory
    +        // to its final name.
    +        $work = $collection->workDir('destination');
    +
    +        $collection
    +          ->taskWriteToFile("$work/README.md")
    +            ->line('-----')
    +            ->line(date('Y-m-d').' Generated file: do not edit.')
    +            ->line('----');
    +        
    +        return $collection->run();
    +    }
    +}
    +?>

    Temporary directories may also be created via the shortcut $this->_tmpDir();. Temporary directories created in this way are deleted when the script terminates.

    Temporary Files

    Robo also provides an API for creating temporary files. They may be created via $this->taskTmpFile(); they are used exactly like $this->taskWrite(), except they are given a random name on creation, and are deleted when their collection completes. If they are not added to a collection, then they are deleted when the script terminates.

    The Temporary Global Collection

    Robo maintains a special collection called the Temporary global collection. This collection is used to keep track of temporary objects that are not part of any collection. For example, Robo temporary directories and temporary files are managed by the Temporary global collection. These temporary objects are cleaned up automatically when the script terminates.

    It is easy to create your own temporary tasks that behave in the same way as the provided temporary directory and temporary file tasks. There are two steps required:

    • Implement \Robo\Contract\CompletionInterface
    • Wrap the task via Temporary::wrap()

    For example, the implementation of taskTmpFile() looks like this:

    php
    <?php
    +    protected function taskTmpFile($filename = 'tmp', $extension = '', $baseDir = '', $includeRandomPart = true)
    +    {
    +        return Temporary::wrap(new TmpFile($filename, $extension, $baseDir, $includeRandomPart));
    +    }
    +?>

    The complete() method of the task will be called once the Collection the temporary object is attached to finishes running. If the temporary is not added to a collection, then its complete() method will be called when the script terminates.

    Chained State

    When using a collection builder, it is possible to pass state from one task to another. State is generated during the run() method of each task, and returned in a Robo\Result object. Each result has a "message" and a key/value data store that contains the task's state. This state can be made available to later tasks in the builder.

    Implicitly Passing State

    Sometimes it may be desirable to process the files produced by one task using a following task that alters the result.

    For example, if you have one task that takes a set of source files and generates destination files, and another task that encrypts a set of files, you could encrypt the results from the first task by running both of the tasks independently:

    php
    <?php
    +    $result = $this->taskGenerate()
    +        ->files($sources)
    +        ->run();
    +    
    +    $result = $this->taskEncrypt()
    +        ->files($result['files'])
    +        ->run();
    +?>

    If the Encrypt task implements \Robo\State\Consumer and accepts 'files' from the current state, then these tasks may be chained together as follows:

    php
    <?php
    +    $collection = $this->collectionBuilder($io);
    +    $collection
    +        ->taskGenerate()
    +            ->files($sources)
    +        ->taskEncrypt()
    +        ->run();
    +?>

    Tasks that do not implement the Consumer interface may still be chained together by explicitly connecting the state from one task with the task configuration methods, as explained in the following section:

    Explicitly Passing State

    State from the key/value data store, if set, is automatically stored in the collection's state. The storeState() method can be used to store the result "message".

    To pass state from one task to another, the deferTaskConfiguration() method may be used. This method defers initialization until immediately before the task's run() method is called. It then calls a single named setter method, passing it the value of some state variable.

    For example, the builder below will create a new directory named after the output of the uname -n command returned by taskExec. Note that it is necessary to call printOutput(false) in order to make the output of taskExec available to the state system.

    php
    <?php
    +    $this->collectionBuilder($io)
    +        ->taskExec('uname -n')
    +            ->printOutput(false)
    +            ->storeState('system-name')
    +        ->taskFilesystemStack()
    +            ->deferTaskConfiguration('mkdir', 'system-name')
    +        ->run();
    +?>

    More complex task configuration may be done via the defer() method. defer() works like deferTaskConfiguration(), except that it will run an arbitrary callable immediately prior to the execution of the task. The example below works exactly the same as the previous example, but is implemented using defer() instead of deferTaskConfiguration().

    php
    <?php
    +    $this->collectionBuilder($io)
    +        ->taskExec('uname -n')
    +            ->printOutput(false)
    +            ->storeState('system-name')
    +        ->taskFilesystemStack()
    +            ->defer(
    +                function ($task, $state) {
    +                    $task->mkdir($state['system-name']);
    +                }
    +            )
    +        ->run();
    +?>

    In general, it is preferable to collect all of the information needed first, and then use that data to configure the necessary tasks. For example, the previous example could be implemented more simply by calling $system_name = exec('uname -n'); and taskFilesystemStack->mkdir($system_name);. Chained state can be helpful in instances where there is a more complex relationship between the tasks.

    Named Tasks

    It is also possible to provide names for the tasks added to a collection. This has two primary benefits:

    1. Any result data returned from a named task is stored in the Result object under the task name.
    2. It is possible for other code to add more tasks before or after any named task.

    This feature is useful if you have functions that create task collections, and return them as a function results. The original caller can then use the $collection->before() or $collection->after() to insert sequenced tasks into the set of operations to be performed. One reason this might be done would be to define a base set of operations to perform (e.g. in a deploy), and then apply modifications for other environments (e.g. dev or stage).

    php
    <?php
    +  $collection->addCode(
    +    function() use ($work)
    +    {
    +      // do something with $work      
    +    },
    +    "taskname");
    +?>

    Given a collection with named tasks, it is possible to insert more tasks before or after a task of a given name.

    php
    <?php
    +  $collection->after("taskname",
    +    function() use ($work)
    +    {
    +      // do something with $work after "taskname" executes, if it succeeds.    
    +    });
    +?>
    php
    <?php
    +  $collection->before("taskname",
    +    function() use ($work)
    +    {
    +      // do something with $work before "taskname" executes.    
    +    });
    +?>

    It is recommended that named tasks be avoided unless specifically needed.

    + + + + \ No newline at end of file diff --git a/extending.html b/extending.html new file mode 100644 index 0000000..be520ef --- /dev/null +++ b/extending.html @@ -0,0 +1,177 @@ + + + + + + Extending | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Extending

    Robo tasks can be added to your Robo application by using Composer to suppliment the set of built-in tasks that Robo provides by default. To find existing Robo task extensions, search in Packagist for projects of type robo-tasks.

    The convention used to add new tasks for use in your RoboFiles is to create a wrapper trait named Tasks in your namespace that instantiates the implementation class for each task. Each task method in the trait should start with the prefix task, and should use chained method calls for configuration. Task execution should be triggered by the method run.

    To include additional tasks in your RoboFile, you must use the appropriate Tasks in your RoboFile. See the section Including Additional Tasks below. To create your own Robo extension that provides tasks for use in RoboFiles, then you must write your own class that implements TaskInterface, and create a Tasks trait for it as described in the section Creating a Robo Extension.

    Note: The Tasks traits are called loadTasks in Robo core. This is a legacy name, preserved for backwards compatibility purposes. These traits will all be renamed to Tasks in Robo 2.0.

    Including Additional Tasks

    Additional tasks may be installed into projects that have included Robo via Composer. For example:

    $ cd myproject
    +$ composer require boedah/robo-drush

    If any of the tasks you include require external Composer projects themselves, then you must composer require these as well. See the suggests section of Robo's composer.json file for a list of some projects you might need to require.

    Once the extension you wish to use has been added to your vendor directory, you may then include it from your RoboFile:

    php
    class RoboFile extends \Robo\Tasks
    +{
    +  use Boedah\Robo\Task\Drush\Tasks;
    +
    +  public function test(ConsoleIO $io)
    +  {
    +    // ...
    +  }
    +}

    Once you have done this, all of the tasks defined in the extension you selected will be available for use in your commands.

    Note that at the moment, it is not possible to extend Robo when using the robo.phar. This capability may be added in the future via embedded composer.

    Register command files via PSR-4 autoloading

    You can have your project expose extra Robo command files by providing them within your project's PSR-4 namespace.

    For example, given the following PSR-4 namespace in your composer.json:

    json
    {
    +    "autoload": {
    +        "psr-4": {
    +            "MyProject\\": "./src/"
    +        }
    +    }
    +}

    Extra command files can be exposed by creating one or more classes under ./src/Robo/Plugin/Commands, as shown in the example below:

    php
    <?php
    +
    +namespace MyProject\Robo\Plugin\Commands;
    +
    +use Robo\Symfony\ConsoleIO;
    +
    +class MyCustomCommands extends \Robo\Tasks
    +{
    +    /**
    +     * @command my-project:command-one
    +     */
    +    public function commandOne(ConsoleIO $io) { }
    +
    +    /**
    +     * @command my-project:command-two
    +     */
    +    public function commandTwo(ConsoleIO $io) { }
    +}

    Please note: command files classes must be placed under Robo/Plugin/Commands relative namespace and their name must end in Command.php or Commands.php.

    You can now access your new commands via Robo:

    $ ./vendor/bin/robo
    +$ ./robo
    +Robo 1.2.2-dev
    +
    +Usage:
    +  command [options] [arguments]
    +...
    +
    +Available commands:
    +  help                  Displays help for a command
    +  list                  Lists commands
    + my-project
    +  my-project:command-one
    +  my-project:command-two

    Creating a Robo Extension

    A Robo tasks extension is created by advertising a Composer package of type robo-tasks on Packagist. For an overview on how this is done, see the article Creating your very own Composer Package. Specific instructions for creating Robo task extensions are provided below.

    Create your composer.json File

    Your composer.json file should look something like the example below:

    {
    +    "name": "boedah/robo-drush",
    +    "description": "Drush CommandStack for Robo Task Runner",
    +    "type": "robo-tasks",
    +    "autoload": {
    +        "psr-4": {
    +            "Boedah\\Robo\\Task\\Drush\\": "src"
    +        }
    +    },
    +    "require": {
    +        "php": ">=5.5.0",
    +        "consolidation/robo": "~1"
    +    }
    +}

    Customize the name and autoload paths as necessary, and add any additional required projects needed by the tasks that your extensions will provide. The type of your project should always be robo-tasks. Robo only supports php >= 5.5.0; you may require a higher version of php if necessary.

    Create the Tasks.php Trait

    It is recommended to place your trait-loading task in a Tasks file in the same namespace as the task implementation.

    namespace Boedah\Robo\Task\Drush;
    +
    +trait Tasks
    +{
    +    /**
    +     * @param string $pathToDrush
    +     * @return DrushStack
    +     */
    +    protected function taskDrushStack($pathToDrush = 'drush')
    +    {
    +        return $this->task(__FUNCTION__, $pathToDrush);
    +    }
    +}

    Note that the name of the service for a given task must start with the word "task", and must have the same name as the function used to call the task. $this->task() looks up the service by name; using the PHP built-in constant FUNCTION for this parameter ensures that the names of these items remain in alignment.

    Task implementation

    The implementation of each task class should extend \Robo\Task\BaseTask, or some class that extends the same, and should used chained initializer methods and defer all operations that alter the state of the system until its run() method. If you follow these patterns, then your task extensions will be usable via Robo collection builders, as explained in the collections documentation.

    There are many examples of task implementations in the Robo\Task namespace. A very basic task example is provided below. The namespace is MyAssetTasks, and the example task is CompileAssets. To customize to your purposes, choose an appropriate namespace, and then define as many tasks as you need.

    php
    <?php
    +namespace MyAssetTasks;
    +
    +trait Tasks
    +{
    +    /**
    +     * Example task to compile assets
    +     *
    +     * @param string $pathToCompileAssets
    +     * @return \MyAssetTasks\CompileAssets
    +     */
    +    protected function taskCompileAssets($path = null)
    +    {
    +        // Always construct your tasks with the `task()` task builder.
    +        return $this->task(CompileAssets::class, $path);
    +    }
    +}
    +
    +class CompileAssets implements \Robo\Contract\TaskInterface
    +{
    +    // configuration params
    +    protected $path;
    +    protected $to;
    +    function __construct($path)
    +    {
    +        $this->path = $path;
    +    }
    +
    +    function to($filename)
    +    {
    +        $this->to = $filename;
    +        // must return $this
    +        return $this;
    +    }
    +
    +    // must implement Run
    +    function run()
    +    {
    +        //....
    +    }
    +}
    +?>

    To use the tasks you define in a RoboFile, use its Tasks trait as explained in the section Including Additional Tasks, above.

    TaskIO

    To allow tasks access IO, use the Robo\Common\TaskIO trait, or inherit your task class from Robo\Task\BaseTask (recommended).

    Inside tasks you should print process details with printTaskInfo, printTaskSuccess, and printTaskError.

    $this->printTaskInfo('Processing...');

    The Task IO methods send all output through a PSR-3 logger. Tasks should use task IO exclusively; methods such as 'say' and 'ask' should reside in the command method. This allows tasks to be usable in any context that has a PSR-3 logger, including background or server processes where it is not possible to directly query the user.

    Tasks That Use Tasks

    If one task implementation needs to use other tasks while it is running, it should do so via a CollectionBuilder object, as explained in the Collections documentation.

    To obtain access to a CollectionBuilder, a task should implement BuilderAwareInterface and use BuilderAwareTrait. It will then have access to a collection builder via the $this->collectionBuilder() method.

    Testing Extensions

    If you wish to use the task() methods from your Tasks trait in your unit tests, it is necessary to also use the Robo TaskAccessor trait, and define a collectionBuilder() method to provide a builder. Collection builders are used to initialize all Robo tasks. The easiest way to get a usable collection builder in your tests is to initialize Robo's default dependency injection container, and use it to request a new builder.

    An example of how to do this in a PHPUnit test is shown below.

    use League\Container\ContainerAwareInterface;
    +use League\Container\ContainerAwareTrait;
    +use Symfony\Component\Console\Output\NullOutput;
    +use Robo\TaskAccessor;
    +use Robo\Robo;
    +use Robo\Collection\CollectionBuilder;
    +
    +class DrushStackTest extends \PHPUnit_Framework_TestCase implements ContainerAwareInterface
    +{
    +    use \Boedah\Robo\Task\Drush\Tasks;
    +    use TaskAccessor;
    +    use ContainerAwareTrait;
    +
    +    // Set up the Robo container so that we can create tasks in our tests.
    +    function setup()
    +    {
    +        $container = Robo::createDefaultContainer(null, new NullOutput());
    +        $this->setContainer($container);
    +    }
    +
    +    // Scaffold the collection builder
    +    public function collectionBuilder()
    +    {
    +        $emptyRobofile = new \Robo\Tasks;
    +        return CollectionBuilder::create($this->getContainer(), $emptyRobofile);
    +    }
    +
    +    public function testYesIsAssumed()
    +    {
    +        $command = $this->taskDrushStack()
    +            ->drush('command')
    +            ->getCommand();
    +        $this->assertEquals('drush command -y', $command);
    +    }
    +}

    To assert that the output of a command contains some value, use a Symfony\Component\Console\Output\BufferedOutput in place of null output when calling Robo::createDefaultContainer().

    + + + + \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..193fe51 Binary files /dev/null and b/favicon.ico differ diff --git a/favicons/android-chrome-192x192.png b/favicons/android-chrome-192x192.png new file mode 100644 index 0000000..705143b Binary files /dev/null and b/favicons/android-chrome-192x192.png differ diff --git a/favicons/android-chrome-512x512.png b/favicons/android-chrome-512x512.png new file mode 100644 index 0000000..d5f5897 Binary files /dev/null and b/favicons/android-chrome-512x512.png differ diff --git a/favicons/apple-touch-icon.png b/favicons/apple-touch-icon.png new file mode 100644 index 0000000..d884697 Binary files /dev/null and b/favicons/apple-touch-icon.png differ diff --git a/favicons/browserconfig.xml b/favicons/browserconfig.xml new file mode 100644 index 0000000..d21f775 --- /dev/null +++ b/favicons/browserconfig.xml @@ -0,0 +1,13 @@ + + + + + + + + + + #ffffff + + + diff --git a/favicons/favicon-16x16.png b/favicons/favicon-16x16.png new file mode 100644 index 0000000..628d6f8 Binary files /dev/null and b/favicons/favicon-16x16.png differ diff --git a/favicons/favicon-32x32.png b/favicons/favicon-32x32.png new file mode 100644 index 0000000..a0198a9 Binary files /dev/null and b/favicons/favicon-32x32.png differ diff --git a/favicons/mstile-144x144.png b/favicons/mstile-144x144.png new file mode 100644 index 0000000..2c34630 Binary files /dev/null and b/favicons/mstile-144x144.png differ diff --git a/favicons/mstile-150x150.png b/favicons/mstile-150x150.png new file mode 100644 index 0000000..3f9e8ae Binary files /dev/null and b/favicons/mstile-150x150.png differ diff --git a/favicons/mstile-310x150.png b/favicons/mstile-310x150.png new file mode 100644 index 0000000..7e9416c Binary files /dev/null and b/favicons/mstile-310x150.png differ diff --git a/favicons/mstile-310x310.png b/favicons/mstile-310x310.png new file mode 100644 index 0000000..3be0bb6 Binary files /dev/null and b/favicons/mstile-310x310.png differ diff --git a/favicons/mstile-70x70.png b/favicons/mstile-70x70.png new file mode 100644 index 0000000..3f99237 Binary files /dev/null and b/favicons/mstile-70x70.png differ diff --git a/favicons/safari-pinned-tab.svg b/favicons/safari-pinned-tab.svg new file mode 100644 index 0000000..ba84cfd --- /dev/null +++ b/favicons/safari-pinned-tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/favicons/site.webmanifest b/favicons/site.webmanifest new file mode 100644 index 0000000..da5a9da --- /dev/null +++ b/favicons/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "Robo - modern and simple PHP task runner", + "short_name": "Robo", + "icons": [ + { + "src": "/favicons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/favicons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/framework.html b/framework.html new file mode 100644 index 0000000..3234140 --- /dev/null +++ b/framework.html @@ -0,0 +1,148 @@ + + + + + + Robo as a Framework | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Robo as a Framework

    For a faster and better start to creating your own commandline application, please see the documentation in the g1a/starter project.

    There are multiple ways to use and package Robo scripts; a few of the alternatives are presented below.

    Creating a Standalone Phar with Robo

    It is possible to create a standalone phar that is implemented with Robo; doing this does not require the RoboFile to be located in the current working directory, or any particular location within your project. To achieve this, first set up your project as shown in the section Implementing Composer Scripts with Robo. Use of the "scripts" section is optional.

    Next, add an "autoload" section to your composer.json to provide a namespace for your Robo commands:

    json
    {
    +    "name": "myorg/myproject",
    +    "require": {
    +        "consolidation/Robo": "^2"
    +    },
    +    "autoload":{
    +        "psr-4":{
    +            "MyProject\\":"src"
    +        }
    +    }
    +}

    Create a new file for your Robo commands, e.g. class RoboFile in namespace MyProject\Commands; in the file src\Commands\RoboFile.php. Optionally, add more task libraries as described in the extending document.

    Create a startup script similar to the one below, and add it to the root of your project, or some other location of your choosing:

    php
    #!/usr/bin/env php
    +<?php
    +
    +// If we're running from phar load the phar autoload file.
    +$pharPath = \Phar::running(true);
    +if ($pharPath) {
    +    $autoloaderPath = "$pharPath/vendor/autoload.php";
    +} else {
    +    if (file_exists(__DIR__.'/vendor/autoload.php')) {
    +        $autoloaderPath = __DIR__.'/vendor/autoload.php';
    +    } elseif (file_exists(__DIR__.'/../../autoload.php')) {
    +        $autoloaderPath = __DIR__ . '/../../autoload.php';
    +    } else {
    +        die("Could not find autoloader. Run 'composer install'.");
    +    }
    +}
    +$classLoader = require $autoloaderPath;
    +
    +// Customization variables
    +$appName = "MyAppName";
    +$appVersion = trim(file_get_contents(__DIR__ . '/VERSION'));
    +$commandClasses = [ \MyProject\Commands\RoboFile::class ];
    +$selfUpdateRepository = 'myorg/myproject';
    +$configurationFilename = 'myconfig.yml';
    +
    +// Define our Runner, and pass it the command classes we provide.
    +$runner = new \Robo\Runner($commandClasses);
    +$runner
    +  ->setSelfUpdateRepository($selfUpdateRepository)
    +  ->setConfigurationFilename($configurationFilename)
    +  ->setClassLoader($classLoader);
    +
    +// Execute the command and return the result.
    +$output = new \Symfony\Component\Console\Output\ConsoleOutput();
    +$statusCode = $runner->execute($argv, $appName, $appVersion, $output);
    +exit($statusCode);

    When using Robo as a framework, the Robo file should be included in the autoloader, as Robo does not include a RoboFile.php file when used in this mode. Instead, specify the class or classes to load as a parameter to the Robo\Runner constructor.

    Use box-project/box2 or Robo's taskPackPhar to create a phar for your application. If your application's repository is hosted on GitHub, then passing the appropriate GitHub org/project to the \Robo\Robo::run() method, as shown above, will enable the self:update command to automatically update to the latest available version. Note that self:update only works with phar distributions.

    Using Multiple RoboFiles in a Standalone Application

    It is possible to provide as many command classes as you wish to the Robo Runner() constructor. You might wish to separate your Robo command implementations into separate Robo files if you have a lot of commands, or if you wish to group similar commands together in the same source file. If you do this, you can simply add more class references to the $commandClasses variable shown above.

    $commandClasses = [
    +    \MyProject\Commands\BuildCommands::class,
    +    \MyProject\Commands\DeployCommands::class
    +];

    If your application has a large number of command files, or if it supports command extensions, then you might wish to use the Command Discovery class to locate your files. The CommandFileDiscovery class will use the Symfony Finder class to search for all filenames matching the provided search pattern. It will return a list of class names using the provided base namespace.

    php
    $discovery = new \Consolidation\AnnotatedCommand\CommandFileDiscovery();
    +$discovery->setSearchPattern('*Command.php');
    +$commandClasses = $discovery->discover('php/MyProject/Commands', '\MyProject\Commands');

    Pass the resulting $commandClasses to the Runner() constructor as shown above. See the annotated-commands project for more information about the different options that the discovery command takes.

    Using Your Own Dependency Injection Container with Robo (Advanced)

    It is also possible to completely replace the Robo application with your own. To do this, set up your project as described in the sections above, but replace the Robo runner with your own main event loop.

    Add the following to your startup file:

    php
    <?php
    +use League\Container\Container;
    +use Robo\Robo;
    +
    +$input = new \Symfony\Component\Console\Input\ArgvInput($argv);
    +$output = new \Symfony\Component\Console\Output\ConsoleOutput();
    +$config = Robo::createConfiguration(['myconf.yml']);
    +$app = new \MyApplication($config, $input, $output);
    +$status_code = $app->run($input, $output);
    +exit($status_code);

    Then, create your own custom application:

    php
    <?php
    +
    +use Robo\Common\ConfigAwareTrait;
    +use Robo\Config;
    +use Robo\Robo;
    +use Robo\Runner as RoboRunner;
    +use Symfony\Component\Console\Application;
    +use Symfony\Component\Console\Input\InputInterface;
    +use Symfony\Component\Console\Output\OutputInterface;
    +
    +class MyApplication {
    +
    +  const APPLICATION_NAME = 'My Application';
    +  const REPOSITORY = 'org/project';
    +
    +  use ConfigAwareTrait;
    +
    +  private $runner;
    +
    +  public function __construct(
    +    Config $config,
    +    InputInterface $input = NULL,
    +    OutputInterface $output = NULL
    +  ) {
    +
    +    // Create applicaton.
    +    $this->setConfig($config);
    +    $application = new Application(self::APPLICATION_NAME, $config->get('version'));
    +
    +    // Create and configure container.
    +    $container = Robo::createContainer($application, $config);
    +    $container->add(MyCustomService::class); // optional
    +    Robo::finalizeContainer($container);
    +
    +    // Instantiate Robo Runner.
    +    $this->runner = new RoboRunner([
    +      My\Custom\Command::class
    +    ]);
    +    $this->runner->setContainer($container);
    +    $this->runner->setSelfUpdateRepository(self::REPOSITORY);
    +  }
    +
    +  public function run(InputInterface $input, OutputInterface $output) {
    +    $status_code = $this->runner->run($input, $output);
    +
    +    return $status_code;
    +  }
    +
    +}

    If you are using League\Container (recommended), then you may simply add and share your own classes to the same container. If you are using some other DI container, then you should use delegate lookup to combine them.

    Using a Custom Configuration Loader

    Robo provides a very simple configuration loader. If you wish to use more capable loader, you may opt to do so. Replace the call to Robo::createConfiguration() with code similar to the following:

    use Robo\Config\Config;
    +use Consolidation\Config\Loader\YamlConfigLoader;
    +use Consolidation\Config\Loader\ConfigProcessor;
    +
    +$config = new Config();
    +$loader = new YamlConfigLoader();
    +$processor = new ConfigProcessor();
    +$processor->extend($loader->load('defaults.yml'));
    +$processor->extend($loader->load('myconf.yml'));
    +$config->import($processor->export());

    You may also wish to subclass the provided Config and ConfigProcessor classes to customize their behavior.

    The example above presumes that the configuration object starts off empty. If you need to repeat this process to extend the configuration in a later stage, you should call $processor->add($config->export()); to ensure that the configuration processor is seeded with the previous configuration values.

    Any configuraiton loader that produces a nested array may be used in place of the config loaders and config processor shown in the example above. For example, if you wish to find configuration files in a certain set of directories, allow .yml or .xml configuration files, and validate the schema of your configuration files (to alert users of any syntax errors or unrecognized configuration values), you might want to consider Symfony/Config. Symfony/Config produces a clean array of configuration values; the result of $processor->processConfiguration() may be provided directly to Robo's $config->import() method.

    + + + + \ No newline at end of file diff --git a/getting-started.html b/getting-started.html new file mode 100644 index 0000000..e2a7f31 --- /dev/null +++ b/getting-started.html @@ -0,0 +1,227 @@ + + + + + + Getting Started | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Getting Started

    To begin you need to create a RoboFile. Just run robo init in your project directory:

    cd myproject
    +robo init

    Your project directory may start out empty; Robo will create a new RoboFile.php for you. There will be RoboFile class which extends \Robo\Tasks, which includes all bundled tasks of Robo.

    php
    <?php
    +class RoboFile extends \Robo\Tasks
    +{
    +}
    +?>

    Commands

    All public methods of the RoboFile class will be treated as commands. You can run them from the CLI and pass arguments.

    php
    <?php
    +
    +use Robo\Symfony\ConsoleIO;
    +
    +class RoboFile extends \Robo\Tasks
    +{
    +    function hello(ConsoleIO $io, $world)
    +    {
    +        $io->say("Hello, $world");
    +    }
    +}
    +?>

    Note: The class ConsoleIO isa SymfonyStyle, and therefore has access to all of the Symfony styling methods. It also adds a few Robo extensions such as the say() and yell() output styles. This parameter may be omitted for commands that do not perofrom any output.

    When we run:

    robo hello davert
    +➜ Hello, davert

    Note: This assumes you have installed Robo by downloading the robo.phar file and copied it to a directory in your $PATH. For example, cp robo.phar ~/bin/robo.

    Method names in a RoboFile should be camelCased. When called from the CLI, camelCased methods will be available as commands formatted as camel:cased. longCamelCased methods will be transformed to commands formatted as long:camel-cased.

    Arguments

    All method parameters without default values are treated as required arguments. In our example command hello requires one argument.

    If you pass a default value to parameter the argument becomes optional:

    php
    <?php
    +    function hello(ConsoleIO $io, $world = 'world')
    +    {
    +        $io->say("Hello, $world");
    +    }
    +?>
    robo hello
    +➜ Hello, world

    To accept multiple, variable arguments, typehint a parameter as an array; Robo will then pass all CLI arguments in this variable:

    php
    <?php
    +    function hello(ConsoleIO $io, array $world)
    +    {
    +        $io->say("Hello, " . implode(', ', $world));
    +    }
    +?>
    robo hello davert jon bill bob
    +➜ Hello, davert, jon, bill, bob

    Options

    To define command options you should define the last method parameter as an associative array where the keys define the option names and the values provide each option's default value:

    php
    <?php
    +    function hello(ConsoleIO $io, $opts = ['silent' => false])
    +    {
    +        if (!$opts['silent']) $io->say("Hello, world");
    +    }
    +?>
    robo hello
    +➜ Hello, world
    +
    +robo hello --silent

    A one-character shortcut can be specified for option:

    php
    <?php
    +    function hello(ConsoleIO $io, $opts = ['silent|s' => false])
    +    {
    +        if (!$opts['silent']) $io->say("Hello, world");
    +    }
    +?>

    Now command can be executed with '-s' to run in silent mode:

    robo hello -s

    The default value for options must be one of:

    • The boolean value false, which indicates that the option takes no value; the variable will be true if the option appears on the commandline, and will be false otherwise.
    • The boolean value true, which indicates that the variable should be true unless the option is disabled on the commandline via the flag --no-foo or --foo=0 (for $opts = ['foo' => true]).
    • A string containing the default value for options that may be provided a value, but are not required to.
    • NULL for options that may be provided an optional value, but that have no default when a value is not provided.
    • The special value InputOption::VALUE_REQUIRED, which indicates that the user must provide a value for the option whenever it is used.
    • An empty array, which indicates that the option may appear multiple times on the command line.

    No other values should be used for the default value. For example, $options = ['a' => 1] is incorrect; instead, use $options = ['a' => '1'].

    Load From Other Robofile

    Robo can execute commands from a different RoboFile, eg. located in different directory or with a different filename. You can specify the path to another RoboFile by including the --load-from option:

    robo run --load-from /path/to/my/other/robofile

    Additional notes:

    • The filename can be anything; it is not limited to RoboFile.php.
    • The class name inside the file has to be the same name as the file has.
    • The class has to be in the root namespace. Eg. Foo.php => \Foo
    • The internal current directory (cwd) of the PHP process will be switched to the directory where the provided RoboFile came from.

    Pass-Through Arguments

    Sometimes you need to pass arguments from your command into a task. A command line after the -- delimiter is passed as a single parameter containing all of the following arguments. Any special characters such as - will be passed into without change.

    php
    <?php
    +    function ls(ConsoleIO $io, array $args)
    +    {
    +        $this->taskExec('ls')->args($args)->run();
    +    }
    +?>

    Note: Creating tasks without a builder, e.g. $this->taskExec() as shown above, is deprecated. See the Collections documentation for the preferred way to declare tasks.

    robo ls -- Robo -c --all
    + [ExecTask] running ls Robo -c --all
    + .  ..  CHANGELOG.md  codeception.yml  composer.json  composer.lock  docs  .git  .gitignore  .idea  LICENSE  README.md  robo  RoboFile.php  robo.phar  src  tests  .travis.yml  vendor

    Help

    The help text for a command in a RoboFile may be provided in Doc-Block comments. An example help Doc-Block comment is shown below:

    php
    <?php
    +/**
    + * Calculate the fibonacci sequence between two numbers.
    + *
    + * Graphic output will look like
    + *     +----+---+-------------+
    + *     |    |   |             |
    + *     |    |-+-|             |
    + *     |----+-+-+             |
    + *     |        |             |
    + *     |        |             |
    + *     |        |             |
    + *     +--------+-------------+
    + *
    + * @param int $start Number to start from
    + * @param int $steps Number of steps to perform
    + * @param array $opts
    + * @option $graphic Display the sequence graphically using cube
    + *                  representation
    + */
    +public function fibonacci(ConsoleIO $io, $start, $steps, $opts = ['graphic' => false])
    +{
    +}
    +?>

    The corresponding help text produced is:

    robo fibonacci --help
    +Usage:
    + fibonacci [--graphic] start steps
    +
    +Arguments:
    + start                 Number to start from
    + steps                 Number of steps to perform
    +
    +Options:
    + --graphic             Display the sequence graphically using cube representation
    +
    +Help:
    + Graphic output will look like
    +     +----+---+-------------+
    +     |    |   |             |
    +     |    |-+-|             |
    +     |----+-+-+             |
    +     |        |             |
    +     |        |             |
    +     |        |             |
    +     +--------+-------------+

    Arguments and options are populated from annotations.

    Initially added with PR by @jonsa; now provided by the consolidation/annotated-command project, which was factored out from Robo.

    Ignored methods

    Robo ignores any method of your RoboFile that begins with get or set. These methods are presumed to be data accessors, not commands. To implement a command whose name contains get or set, use the @command annotation.

    php
    <?php
    +    /**
    +     * @command set-alignment
    +     */
    +    function setAlignment(ConsoleIO $io, $value)
    +    {
    +        ...
    +    }
    +?>

    Tasks

    Robo commands typically divide the work they need to accomplish into tasks. The command first determines what needs to be done, inspecting current state if necessary, and then sets up and executes one or more tasks that make the actual changes needed by the command. (See also the documentation on Collections, which allow you to combine groups of tasks which can provide rollback functions to recover from failure situations.)

    For details on how to add custom tasks to Robo, see the extending document.

    Shortcuts

    Some tasks may have shortcuts. If a task does not require multi-step configuration, it can be executed with a single line:

    php
    <?php
    +$this->_exec('ps aux');
    +$this->_copy('config/env.example.yml','config/env.yml');
    +?>

    Result

    Each task must return an instance of Robo\Result. A Robo Result contains the task instance, exit code, message, and any variable data that the task may wish to return.

    Note: A task may also return NULL or an array as a shortcut for a successful result. In this instance, Robo will convert the value into a Robo\Result, and will apply the provided array values, if any, to the result's variable data. This practice is supported, but not recommended.

    The run method of CompileAssets class may look like this:

    return new Robo\Result($this, $exitCode, "Assets compiled");

    or

    return Robo\Result::success($this, "Assets compiled");
    +return Robo\Result::error($this, "Failed to compile assets");

    You can use this results to check if execution was successful, either using the wasSuccessful() method, or via the invoke shortcut. We will use the Exec task in next example to illustrate this:

    php
    <?php
    +class RoboFile
    +{
    +    use Robo\Task\Base\loadShortcuts;
    +
    +    function test(ConsoleIO $io)
    +    {
    +        $res1 = $this->_exec('phpunit tests/integration');
    +        $res2 = $this->_exec('phpunit tests/unit');
    +
    +        // print message when tests passed
    +        if ($res1->wasSuccessful() and $res2->wasSuccessful()) $io->say("All tests passed");
    +    }
    +}
    +?>

    When making multi-step commands that call one task after another, it is best to use a collection to group the tasks together. The collection will handle error detection and rollback, and will return a single Result object when done. For more information, see the Collections documentation.

    Some tasks may also attach data to the Result object. If this is done, the data may be accessed as an array; for example, $result['path'];. This is not common.

    Commands should return a Result object obtained from a task; this will ensure that the command exit code is set correctly. If a command does not have a Result object available, then it may use a ResultData object. ResultData objects are just like Result objects, except the do not contain a reference to a task.

    return new Robo\ResultData($exitcode, 'Error message.');

    If the command returns a TaskInterface instead of a result, then the task will be executed, and the result from that task will be used as the final result of the command. See also Formatters, below.

    Stack

    Some tasks contain Stack in their name. These are called "stack" tasks, and they execute similar tasks one after the other. Each of the primary methods in a stack class executes an operation.

    Stack tasks also contain a stopOnFail method which can be used to stop task execution if one of its commands was unsuccessful.

    Global StopOnFail

    There is a global stopOnFail method as well, that can be used to stop a command on first failure of a task.

    $this->stopOnFail(true);

    Note, however, that using Collections is preferred.

    Progress

    Robo supports progress indicators via the Symfony ProgressBar class. Long-running tasks that wish to display the progress indicator may do so via four simple steps:

    • Override the progressIndicatorSteps() method and return the number of "steps" in the operation.
    • Call $this->startProgressIndicator() to begin the progress indicator running.
    • Call $this->advanceProgressIndicator() a number of times equal to the result returned by progressIndicatorSteps()
    • Call $this->stopProgressIndicator() when the operation is completed.

    An example of this is shown below:

    php
    <?php
    +class MyTask extends BaseTask
    +{
    +    protected $steps = 10;
    +
    +    public function progressIndicatorSteps()
    +    {
    +        return $this->steps;
    +    }
    +
    +    public function run()
    +    {
    +        $exitCode = 0;
    +        $errorMessage = "";
    +
    +        $this->startProgressIndicator();
    +        for ($i = 0; $i < $this->steps; ++$i) {
    +            $this->advanceProgressIndicator();
    +        }
    +        $this->stopProgressIndicator();
    +
    +        return new Result($this, $exitCode, $errorMessage, ['time' => $this->getExecutionTime()]);
    +    }
    +}
    +?>

    Tasks should not attempt to use a specific progress indicator (e.g. the Symfony ProgressBar class) directly, as the ProgressIndicatorAwareTrait allows for an appropriate progress indicator to be used (or omitted) as best suits the application.

    Note that when using Collections, the progress bar will automatically be shown if the collection takes longer than two seconds to run. Each task in the collection will count for one "step"; if the task supports progress indicators as shown above, then it will add an additional number of steps as indicated by its progressIndicatorSteps() method.

    Configuration

    On startup, Robo will load a configuration file, robo.yml, if it exists in the current working directory, or in the directory $HOME/.robo/robo.yml, or at the path set by the ROBO_CONFIG environment variable. If both the user's robo.yml file and a robo.yml in the current working directory exist, then both will be loaded, with values from the configuration file in the current working directory taking precedence over the values in the user's configuration file.

    Environment variables can also be used to set individual configuration values. The environment variable key should start with the string ROBO_, and should be followed by an all-uppercase version of the configuration key, with spaces, dashes and dots converted to underscores. For example, to set the progress bar delay to 999999 seconds:

    export ROBO_OPTIONS_PROGRESS_DELAY=999999

    Configuration values may also be set via the -D commandline switch. The above effect can also be achieved by adding -Doptions.progress-delay=999999 to any Robo command.

    Configuration for Command Options

    The preferred method for commands to use to read configuration is to simply define commandline options for each configuration value. Configuration may be provided for any command option in the robo.yml configuration file.

    For example, given the following Robo command:

    php
    <?php
    +    function hello(ConsoleIO $io, $opts = ['who' => 'unknown'])
    +    {
    +        $io->say("Hello, " . $opts['who']);
    +    }
    +?>

    The who option can be defined as follows:

    command:
    +  hello:
    +    options:
    +      who: world

    If you run this command, then it will print Hello, world. If the --who option is provided on the command line, that value will take precidence over the value stored in configuration. Thus, hello --who=everyone will print Hello, everyone.

    Command groups may also share configuration options. For example, if you have commands foo:bar, foo:baz and foo:boz, all of which share a common option color, then the following configuration will provide the value blue to foo:bar and foo:baz, and the value green to foo:boz:

    command:
    +  foo:
    +    options:
    +      color: blue
    +    boz:
    +      options:
    +        color: green

    Configuration for Task Settings

    Robo will automatically configure tasks with values from configuration. For example, given the following task definition:

    $this->taskMyOperation()
    +  ->dir($buildDir)
    +  ->extrapolated(false)
    +  ->run();

    You could instead remove the setter methods and move the parameter values to a configruation file:

    $this->taskComposerInstall()
    +  ->run();

    Then, presuming that taskMyOperation was implemented in a class \MyOrg\Task\TaskGroup\MyOperation, then the corresponding configuration file would appear as follows:

    task:
    +  TaskGroup:
    +    MyOperation:
    +      settings:
    +        dir: /my/path
    +        extrapolated: false

    The key for configuration-injected settings is task.PARTIAL_NAMESPACE.CLASSNAME.settings.key. PARTIAL_NAMESPACE is the namespace for the class, with each \ replaced with a ., and with each component of the namespace up to and including Task removed.

    Tasks in the same namespace may also share configuration-injected settings. For example, the configuration below will set the dir option of any task implemented by a class in the *\TaskGroup\MyOperation namespace, unless the task has a more specific configuration value stored with its classname:

    task:
    +  TaskGroup:
    +    settings:
    +      dir: /my/path
    +      extrapolated: false

    Accessing Configuration Directly

    In a RoboFile, use \Robo\Robo::Config()->get('task.TaskGroup.MyOperation.settings.dir'); to fetch the dir configuration option from the previous example.

    In the implementation of taskMyOperation() itself, it is in general not necessary to access configuration values directly, as it is preferable to allow Robo to inject configuration as described above. However, if desired, configuration may be accessed from within the method of any task that extends \Robo\Task\BaseTask (or otherwise uses ConfigAwareTrait) may do so via static::getConfigValue('key', 'default');.

    Providing Default Configuration in Code

    RoboFiles that wish to provide default configuration values that can be overridden via robo.yml values or commandline options may do so in the class' constructor method. The example below demonstrates how to set up a default value for the task.Ssh.remoteDir configuration property in code:

    class RoboFile
    +{
    +    public function __construct()
    +    {
    +        Robo\Task\Remote\Ssh::configure('remoteDir', '/srv/www');
    +    }
    +}

    If task.Remote.Ssh.remoteDir is set to some other value in the robo.yml configuration file in the current directory, then the value from the configuration file will take precedence.

    Loading Configuration From Another Source

    Sometimes, a RoboFile might want to define its own private configuration file to use in addition to the standard robo.yml file. This can also be done in the constructor.

    class RoboFile
    +{
    +    public function __construct()
    +    {
    +        Robo::loadConfiguration([__DIR__ . '/myconf.yml']);
    +    }
    +}

    Note that configuration loaded in this way will take precedence over the configuration loaded by default by Robo.

    It is possible to have even more control than this if you create your own application using Robo as a Framework.

    IO

    As you noticed, you can print text via the say method, which is taken from the Robo\Output trait.

    $this->say("Hello");

    Also, you can ask for input from console:

    $name = $this->ask("What is your name?");

    There are also askDefault, askHidden, and confirm methods.

    In addition, Robo makes all of the methods of Symfony Style available through the io() method:

    $this->io()->title("Build all site assets");

    This allows Robo scripts to follow the documentation on How to Style a Console Command if desired.

    Formatters

    It is preferable for commands that look up and display information should avoid doing IO directly, and should instead return the data they wish to display as an array. This data can then be converted into different data formats, such as "table" and "json". The user may select which formatter to use via the --format option. For details on formatters, see the consolidation/output-formatters project.

    Working with Composer

    Adding a RoboFile to your Project

    Robo is designed to work well with Composer. To use Robo scripts in your Composer-based project, simply add robo to your composer.json file:

    $ cd myproject
    +$ composer require consolidation/robo:^2
    +$ ./vendor/bin/robo mycommand

    If you do not want to type the whole path to Robo, you may add ./vendor/bin to your $PATH (relative paths work), or use composer exec to find and run Robo:

    $ composer exec robo mycommand

    Implementing Composer Scripts with Robo

    When using Robo in your project, it is convenient to define Composer scripts that call your Robo commands. Simply add the following to your composer.json file:

    {
    +    "name": "myorg/myproject",
    +    "require": {
    +        "consolidation/robo": "^2"
    +    },
    +    "scripts": {
    +        "test": "composer robo test",
    +        "phar": "composer robo phar:build",
    +        "robo": "robo --ansi --load-from $(pwd)/scripts/BuildCommands.php"
    +    }
    +}

    Note: When you include Robo as a library like this, some external projects used by certain core Robo tasks are not automatically included in your project. See the "suggest": section of Robo's composer.json for a list of external projects you might also want to require in your project.

    Once you have set up your composer.json file (and ran composer update if you manually changed the require or require-dev sections), Composer will ensure that your project-local copy of Robo in the vendor/bin dir is in your $PATH when you run the additional Composer scripts that you declared:

    $ cd myproject
    +$ composer test
    +$ composer phar

    This will call the public methods test() and phar() in your RoboFile.php when using composer test and composer phar, respectively.

    Advertising your build commands as Composer scripts is a useful way to provide the key commands used for testing, building or packaging your application. Also, if your application should happen to provide a commandline tool to perform the operations of the application itself, then defining your build commands in their own RoboFile provides desirable separation, keeping your build commands out of the help and list commands of your primary script.

    If you would like to simplify the output of your script (e.g. when running on a CI service), replace the --ansi option in the example above with --no-ansi, and colored terminal output and progress bars will be disabled.

    Robo as a Framework

    For an overview on how to turn your Robo scripts into standalone tools, see the example robo.script, and the section Robo as a Framework.

    + + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 0000000..f261717 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"collections.md":"-h8FUjTS","extending.md":"B2tToYXb","framework.md":"BcJaTY9h","getting-started.md":"CEdBbAjT","index.md":"cV3qPEbw","links.md":"DQC7816G","tasks_apigen.md":"DPsW2ltv","tasks_archive.md":"CBeND0F3","tasks_assets.md":"9yJg3m8Y","tasks_base.md":"U8B-s0P6","tasks_bower.md":"B24dqck7","tasks_composer.md":"qQciG78B","tasks_development.md":"BNerfiF_","tasks_docker.md":"BZPWmQuP","tasks_file.md":"zkkyWHS9","tasks_filesystem.md":"uI33GNVM","tasks_gulp.md":"C3DY2yDe","tasks_logfile.md":"Blr2QCoo","tasks_npm.md":"CDkDDsGf","tasks_remote.md":"njRmWy1Y","tasks_testing.md":"BzoHi9tg","tasks_vcs.md":"Cj5oiNmm"} diff --git a/images/logotype.png b/images/logotype.png new file mode 100644 index 0000000..206617d Binary files /dev/null and b/images/logotype.png differ diff --git a/images/robo-logo.svg b/images/robo-logo.svg new file mode 100644 index 0000000..02de7ee --- /dev/null +++ b/images/robo-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..6902dc5 --- /dev/null +++ b/index.html @@ -0,0 +1,92 @@ + + + + + + Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Robo

    Modern and simple PHP task runner

    Robo

    Automate common tasks:

    • writing cross-platform scripts
    • processing assets (less, sass, minification)
    • running tests
    • executing daemons (and workers)
    • watching filesystem changes
    • deployment with sftp/ssh/docker

    Installing

    Phar

    Download robo.phar >

    wget https://robo.li/robo.phar

    To install globally put robo.phar in /usr/bin. (/usr/local/bin/ in OSX 10.11+)

    chmod +x robo.phar && sudo mv robo.phar /usr/bin/robo

    OSX 10.11+

    chmod +x robo.phar && sudo mv robo.phar /usr/local/bin/robo

    Now you can use it simply via robo.

    Composer

    • Run composer require consolidation/robo:^3
    • Use vendor/bin/robo to execute Robo tasks.

    Usage

    All tasks are defined as public methods in RoboFile.php. It can be created by running robo init. All protected methods in traits that start with task prefix are tasks and can be configured and executed in your tasks.

    Examples

    The best way to learn Robo by example is to take a look into its own RoboFile or RoboFile of Codeception project. There are also some basic example commands in examples/RoboFile.php.

    Here are some snippets from them:


    Run acceptance test with local server and selenium server started.

    php
    <?php
    +
    +use Robo\Symfony\ConsoleIO;
    +
    +class RoboFile extends \Robo\Tasks
    +{
    +
    +    function testAcceptance(ConsoleIO $io, $seleniumPath = '~/selenium-server-standalone-2.39.0.jar')
    +    {
    +       // launches PHP server on port 8000 for web dir
    +       // server will be executed in background and stopped in the end
    +       $this->collectionBuilder($io)->taskServer(8000)
    +            ->background()
    +            ->dir('web')
    +            ->run();
    +
    +       // running Selenium server in background
    +       $this->collectionBuilder($io)->taskExec('java -jar ' . $seleniumPath)
    +            ->background()
    +            ->run();
    +
    +       // loading Symfony Command and running with passed argument
    +       $this->collectionBuilder($io)->taskSymfonyCommand(new \Codeception\Command\Run('run'))
    +            ->arg('suite','acceptance')
    +            ->run();
    +    }
    +}

    If you execute robo you will see this task added to list of available task with name: test:acceptance. To execute it you should run robo test:acceptance. You may change path to selenium server by passing new path as a argument:

    robo test:acceptance "C:\Downloads\selenium.jar"

    Using watch task so you can use it for running tests or building assets.

    php
    <?php
    +class RoboFile extends \Robo\Tasks {
    +
    +    function watchComposer(ConsoleIO $io)
    +    {
    +        // when composer.json changes `composer update` will be executed
    +        $this->collectionBuilder($io)->taskWatch()->monitor('composer.json', function() {
    +            $this->collectionBuilder($io)->taskComposerUpdate()->run();
    +        })->run();
    +    }
    +}

    Cleaning logs and cache

    php
    <?php
    +class RoboFile extends \Robo\Tasks
    +{
    +    public function clean(ConsoleIO $io)
    +    {
    +        $this->collectionBuilder($io)->taskCleanDir([
    +            'app/cache',
    +            'app/logs'
    +        ])->run();
    +
    +        $this->collectionBuilder($io)->taskDeleteDir([
    +            'web/assets/tmp_uploads',
    +        ])->run();
    +    }
    +}

    This task cleans app/cache and app/logs dirs (ignoring .gitignore and .gitkeep files) Can be executed by running:

    robo clean

    Creating Phar archive

    php
    function buildPhar(collectionBuilder $io)
    +{
    +    $files = Finder::create()->ignoreVCS(true)->files()->name('*.php')->in(__DIR__);
    +    $packer = $this->collectionBuilder($io)->taskPackPhar('robo.phar');
    +    foreach ($files as $file) {
    +        $packer->addFile($file->getRelativePathname(), $file->getRealPath());
    +    }
    +    $packer->addFile('robo','robo')
    +        ->executable('robo')
    +        ->run();
    +}

    We need more tasks!

    Create your own tasks and send them as Pull Requests or create packages with "type": "robo-tasks" in composer.json on Packagist.

    Credits

    Follow @robo_php for updates.

    Brought to you by Consolidation Team and our awesome contributors.

    + + + + \ No newline at end of file diff --git a/links.html b/links.html new file mode 100644 index 0000000..1e52ae8 --- /dev/null +++ b/links.html @@ -0,0 +1,32 @@ + + + + + + Robo Documentation | Robo + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/robo.phar b/robo.phar new file mode 100755 index 0000000..fc421a5 Binary files /dev/null and b/robo.phar differ diff --git a/tasks/ApiGen.html b/tasks/ApiGen.html new file mode 100644 index 0000000..5494984 --- /dev/null +++ b/tasks/ApiGen.html @@ -0,0 +1,39 @@ + + + + + + ApiGen Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    ApiGen Tasks

    ApiGen

    Executes ApiGen command to generate documentation

    php
    <?php
    +// ApiGen Command
    +$this->taskApiGen('./vendor/apigen/apigen.phar')
    +     ->config('./apigen.neon')
    +     ->templateConfig('vendor/apigen/apigen/templates/bootstrap/config.neon')
    +     ->wipeout(true)
    +      ->run();
    +?>
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • config($config) * param string $config
    • source($src) * param array|string|\Traversable $src
    • destination($dest) * param string $dest
    • extensions($exts) * param array|string $exts
    • exclude($exclude) * param array|string $exclude
    • skipDocPath($path) * param array|string|\Traversable $path
    • skipDocPrefix($prefix) * param array|string|\Traversable $prefix
    • charset($charset) * param array|string $charset
    • mainProjectNamePrefix($name) * param string $name
    • title($title) * param string $title
    • baseUrl($baseUrl) * param string $baseUrl
    • googleCseId($id) * param string $id
    • googleAnalytics($trackingCode) * param string $trackingCode
    • templateConfig($templateConfig) * param mixed $templateConfig
    • allowedHtml($tags) * param array|string $tags
    • groups($groups) * param string $groups
    • autocomplete($types) * param array|string $types
    • accessLevels($levels) * param array|string $levels
    • internal($internal) * param boolean|string $internal
    • php($php) * param bool|string $php
    • tree($tree) * param bool|string $tree
    • deprecated($dep) * param bool|string $dep
    • todo($todo) * param bool|string $todo
    • sourceCode($src) * param bool|string $src
    • download($zipped) * param bool|string $zipped
    • report($path) * param string $path
    • wipeout($wipeout) * param bool|string $wipeout
    • quiet($quiet) * param bool|string $quiet
    • progressbar($bar) * param bool|string $bar
    • colors($colors) * param bool|string $colors
    • updateCheck($check) * param bool|string $check
    • debug($debug) * param bool|string $debug
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/Archive.html b/tasks/Archive.html new file mode 100644 index 0000000..76133d7 --- /dev/null +++ b/tasks/Archive.html @@ -0,0 +1,45 @@ + + + + + + Archive Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Archive Tasks

    Extract

    Extracts an archive.

    Note that often, distributions are packaged in tar or zip archives where the topmost folder may contain variable information, such as the release date, or the version of the package. This information is very useful when unpacking by hand, but arbitrarily-named directories are much less useful to scripts. Therefore, by default, Extract will remove the top-level directory, and instead store all extracted files into the directory specified by $archivePath.

    To keep the top-level directory when extracting, use preserveTopDirectory(true).

    php
    <?php
    +$this->taskExtract($archivePath)
    + ->to($destination)
    + ->preserveTopDirectory(false) // the default
    + ->run();
    +?>
    • to($to) Location to store extracted files.
    • preserveTopDirectory($preserve = null) * param bool $preserve
    • setOutput($output) Sets the Console Output.
    • getBuiltTask($fn, $args) Provides the collection builder with access to all of the

    Pack

    Creates a zip or tar archive.

    php
    <?php
    +$this->taskPack(
    +<archiveFile>)
    +->add('README')                         // Puts file 'README' in archive at the root
    +->add('project')                        // Puts entire contents of directory 'project' in archinve inside 'project'
    +->addFile('dir/file.txt', 'file.txt')   // Takes 'file.txt' from cwd and puts it in archive inside 'dir'.
    +->exclude(['dir\/.*.zip', '.*.md'])      // Add regex (or array of regex) to the excluded patterns list.
    +->run();
    +?>
    • archiveFile($archiveFile) * param string $archiveFile
    • addFile($placementLocation, $filesystemLocation) Add an item to the archive. Like file_exists(), the parameter
    • addDir($placementLocation, $filesystemLocation) Alias for addFile, in case anyone has angst about using
    • add($item) Add a file or directory, or list of same to the archive.
    • exclude($ignoreList) Allow files or folder to be excluded from the archive. Use regex, without enclosing slashes.
    • setOutput($output) Sets the Console Output.
    + + + + \ No newline at end of file diff --git a/tasks/Assets.html b/tasks/Assets.html new file mode 100644 index 0000000..da9b946 --- /dev/null +++ b/tasks/Assets.html @@ -0,0 +1,66 @@ + + + + + + Assets Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Assets Tasks

    ImageMinify

    Minifies images.

    When the task is run without any specified minifier it will compress the images based on the extension.

    php
    $this->taskImageMinify('assets/images/*')
    +    ->to('dist/images/')
    +    ->run();

    This will use the following minifiers based in the extension:

    • PNG: optipng
    • GIF: gifsicle
    • JPG, JPEG: jpegtran
    • SVG: svgo

    When the required minifier is not installed on the system the task will try to download it from the imagemin repository into a local directory. This directory is vendor/bin/ by default and may be changed:

    php
    $this->taskImageMinify('assets/images/*')
    +    ->setExecutableDir('/tmp/imagemin/bin/)
    +    ->to('dist/images/')
    +    ->run();

    When the minifier is specified the task will use that for all the input files. In that case it is useful to filter the files with the extension:

    php
    $this->taskImageMinify('assets/images/*.png')
    +    ->to('dist/images/')
    +    ->minifier('pngcrush');
    +    ->run();

    The task supports the following minifiers:

    • optipng
    • pngquant
    • advpng
    • pngout
    • zopflipng
    • pngcrush
    • gifsicle
    • jpegoptim
    • jpeg-recompress
    • jpegtran
    • svgo (only minification, no downloading)

    You can also specifiy extra options for the minifiers:

    php
    $this->taskImageMinify('assets/images/*.jpg')
    +    ->to('dist/images/')
    +    ->minifier('jpegtran', ['-progressive' => null, '-copy' => 'none'])
    +    ->run();

    This will execute as: jpegtran -copy none -progressive -optimize -outfile "dist/images/test.jpg" "/var/www/test/assets/images/test.jpg"

    • setExecutableDir($directory) Sets the target directory for executables (vendor/bin/ by default)
    • to($target) Sets the target directory where the files will be copied to.
    • minifier($minifier, array $options = Array ( ) ) Sets the minifier.
    • setOutput($output) Sets the Console Output.

    Less

    Compiles less files.

    php
    <?php
    +$this->taskLess([
    +    'less/default.less' => 'css/default.css'
    +])
    +->run();
    +?>

    Use one of both less compilers in your project:

    "leafo/lessphp": "~0.5",
    +"oyejorge/less.php": "~1.5"

    Specify directory (string or array) for less imports lookup:

    php
    <?php
    +$this->taskLess([
    +    'less/default.less' => 'css/default.css'
    +])
    +->importDir('less')
    +->compiler('lessphp')
    +->run();
    +?>

    You can implement additional compilers by extending this task and adding a method named after them and overloading the lessCompilers() method to inject the name there.

    • importDir($dirs) Sets import directories
    • addImportPath($dir) Adds import directory
    • setImportPaths($dirs) Sets import directories
    • setFormatter($formatterName) * param string $formatterName
    • compiler($compiler, array $options = Array ( ) ) Sets the compiler.
    • setOutput($output) Sets the Console Output.

    Minify

    Minifies an asset file (CSS or JS).

    php
    <?php
    +$this->taskMinify('web/assets/theme.css')
    +     ->run()
    +?>

    Please install additional packages to use this task:

    composer require patchwork/jsqueeze:^2.0
    +composer require natxet/cssmin:^3.0
    • to($dst) Sets destination. Tries to guess type from it.
    • type($type) Sets type with validation.
    • singleLine($singleLine) Single line option for the JS minimisation.
    • keepImportantComments($keepImportantComments) keepImportantComments option for the JS minimisation.
    • specialVarRx($specialVarRx) Set specialVarRx option for the JS minimisation.
    • __toString() @return string
    • setOutput($output) Sets the Console Output.

    Scss

    Compiles scss files.

    php
    <?php
    +$this->taskScss([
    +    'scss/default.scss' => 'css/default.css'
    +])
    +->importDir('assets/styles')
    +->run();
    +?>

    Use the following scss compiler in your project:

    "scssphp/scssphp ": "~1.0.0",

    You can implement additional compilers by extending this task and adding a method named after them and overloading the scssCompilers() method to inject the name there.

    • setFormatter($formatterName) Sets the formatter for scssphp
    • importDir($dirs) Sets import directories
    • addImportPath($dir) Adds import directory
    • setImportPaths($dirs) Sets import directories
    • compiler($compiler, array $options = Array ( ) ) Sets the compiler.
    • setOutput($output) Sets the Console Output.
    + + + + \ No newline at end of file diff --git a/tasks/Base.html b/tasks/Base.html new file mode 100644 index 0000000..0ff8a53 --- /dev/null +++ b/tasks/Base.html @@ -0,0 +1,100 @@ + + + + + + Base Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Base Tasks

    Exec

    Executes shell script. Closes it when running in background mode.

    php
    <?php
    +$this->taskExec('compass')->arg('watch')->run();
    +// or use shortcut
    +$this->_exec('compass watch');
    +
    +$this->taskExec('compass watch')->background()->run();
    +
    +if ($this->taskExec('phpunit .')->run()->wasSuccessful()) {
    + $this->say('tests passed');
    +}
    +
    +?>
    • simulate($context)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    ExecStack

    Execute commands one by one in stack. Stack can be stopped on first fail if you call stopOnFail().

    php
    <?php
    +$this->taskExecStack()
    + ->stopOnFail()
    + ->exec('mkdir site')
    + ->exec('cd site')
    + ->run();
    +
    +?>
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    ParallelExec

    Class ParallelExecTask

    php
    <?php
    +$this->taskParallelExec()
    +  ->process('php ~/demos/script.php hey')
    +  ->process('php ~/demos/script.php hoy')
    +  ->process('php ~/demos/script.php gou')
    +  ->run();
    +?>
    • process($command) * param string|\Robo\Contract\CommandInterface $command
    • waitInterval($waitInterval) Parallel processing will wait $waitInterval seconds after launching each process and before
    • setOutput($output) Sets the Console Output.

    SymfonyCommand

    Executes Symfony Command

    php
    <?php
    +// Symfony Command
    +$this->taskSymfonyCommand(new \Codeception\Command\Run('run'))
    +     ->arg('suite','acceptance')
    +     ->opt('debug')
    +     ->run();
    +
    +// Artisan Command
    +$this->taskSymfonyCommand(new ModelGeneratorCommand())
    +     ->arg('name', 'User')
    +     ->run();
    +?>
    • arg($arg, $value) * param string $arg
    • opt($option, $value = null)
    • setOutput($output) Sets the Console Output.

    Watch

    Runs task when specified file or dir was changed. Uses Lurker library. Monitor third parameter takes Lurker filesystem events types to watch. By default its set to MODIFY event.

    php
    <?php
    +$this->taskWatch()
    +     ->monitor(
    +         'composer.json',
    +         function() {
    +             $this->taskComposerUpdate()->run();
    +         }
    +     )->monitor(
    +         'src',
    +         function() {
    +             $this->taskExec('phpunit')->run();
    +         },
    +         \Lurker\Event\FilesystemEvent::ALL
    +     )->monitor(
    +         'migrations',
    +         function() {
    +             //do something
    +         },
    +         [
    +             \Lurker\Event\FilesystemEvent::CREATE,
    +             \Lurker\Event\FilesystemEvent::DELETE
    +         ]
    +     )->run();
    +?>

    Pass through the changed file to the callable function

    $this
    + ->taskWatch()
    + ->monitor(
    +     'filename',
    +     function ($event) {
    +         $resource = $event->getResource();
    +         ... do something with (string)$resource ...
    +     },
    +     FilesystemEvent::ALL
    + )
    + ->run();

    The $event parameter is a standard Symfony file resource object

    • monitor($paths, $callable, $events = null) * param string|string[] $paths
    • setOutput($output) Sets the Console Output.
    + + + + \ No newline at end of file diff --git a/tasks/Bower.html b/tasks/Bower.html new file mode 100644 index 0000000..029ea1c --- /dev/null +++ b/tasks/Bower.html @@ -0,0 +1,48 @@ + + + + + + Bower Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Bower Tasks

    Install

    Bower Install

    php
    <?php
    +// simple execution
    +$this->taskBowerInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskBowerInstall('path/to/my/bower')
    +     ->noDev()
    +     ->run();
    +?>
    • allowRoot() adds allow-root option to bower
    • forceLatest() adds force-latest option to bower
    • noDev() adds production option to bower
    • offline() adds offline option to bower
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Bower Update

    php
    <?php
    +// simple execution
    +$this->taskBowerUpdate->run();
    +
    +// prefer dist with custom path
    +$this->taskBowerUpdate('path/to/my/bower')
    +     ->noDev()
    +     ->run();
    +?>
    • allowRoot() adds allow-root option to bower
    • forceLatest() adds force-latest option to bower
    • noDev() adds production option to bower
    • offline() adds offline option to bower
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/Composer.html b/tasks/Composer.html new file mode 100644 index 0000000..922afbc --- /dev/null +++ b/tasks/Composer.html @@ -0,0 +1,98 @@ + + + + + + Composer Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Composer Tasks

    CheckPlatformReqs

    Composer Check Platform Requirements

    php
    <?php
    +// simple execution
    +$this->taskComposerValidate()->run();
    +?>
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Config

    Composer Config

    php
    <?php
    +// simple execution
    +$this->taskComposerConfig()->set('bin-dir', 'bin/')->run();
    +?>
    • set($key, $value) Set a configuration value.
    • useGlobal($useGlobal = null) Operate on the global repository
    • repository($id, $uri, $repoType = null) * param string $id
    • removeRepository($id) * param string $id
    • disableRepository($id) * param string $id
    • enableRepository($id) * param string $id
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    CreateProject

    Composer CreateProject

    php
    <?php
    +// simple execution
    +$this->taskComposerCreateProject()->source('foo/bar')->target('myBar')->run();
    +?>
    • source($source) * param string $source
    • target($target) * param string $target
    • version($version) * param string $version
    • keepVcs($keep = null) * param bool $keep
    • noInstall($noInstall = null) * param bool $noInstall
    • repository($repository) * param string $repository
    • stability($stability) * param string $stability
    • buildCommand()
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    DumpAutoload

    Composer Dump Autoload

    php
    <?php
    +// simple execution
    +$this->taskComposerDumpAutoload()->run();
    +
    +// dump auto loader with custom path
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader dump with custom path
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->optimize()
    +     ->run();
    +
    +// optimize autoloader dump with custom path and no dev
    +$this->taskComposerDumpAutoload('path/to/my/composer.phar')
    +     ->optimize()
    +     ->noDev()
    +     ->run();
    +?>
    • optimize($optimize = null) * param bool $optimize
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Init

    Composer Init

    php
    <?php
    +// simple execution
    +$this->taskComposerInit()->run();
    +?>
    • projectName($projectName) * param string $projectName
    • description($description) * param string $description
    • author($author) * param string $author
    • projectType($type) * param string $type
    • homepage($homepage) * param string $homepage
    • dependency($project, $version = null) 'require' is a keyword, so it cannot be a method name.
    • stability($stability) * param string $stability
    • license($license) * param string $license
    • repository($repository) * param string $repository
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Install

    Composer Install

    php
    <?php
    +// simple execution
    +$this->taskComposerInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskComposerInstall('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader with custom path
    +$this->taskComposerInstall('path/to/my/composer.phar')
    +     ->optimizeAutoloader()
    +     ->run();
    +?>
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Remove

    Composer Remove

    php
    <?php
    +// simple execution
    +$this->taskComposerRemove()->run();
    +?>
    • dev($dev = null) * param bool $dev
    • noProgress($noProgress = null) * param bool $noProgress
    • noUpdate($noUpdate = null) * param bool $noUpdate
    • updateNoDev($updateNoDev = null) * param bool $updateNoDev
    • noUpdateWithDependencies($updateWithDependencies = null) * param bool $updateWithDependencies
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    RequireDependency

    Composer Require

    php
    <?php
    +// simple execution
    +$this->taskComposerRequire()->dependency('foo/bar', '^.2.4.8')->run();
    +?>
    • dependency($project, $version = null) 'require' is a keyword, so it cannot be a method name.
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Composer Update

    php
    <?php
    +// simple execution
    +$this->taskComposerUpdate()->run();
    +
    +// prefer dist with custom path
    +$this->taskComposerUpdate('path/to/my/composer.phar')
    +     ->preferDist()
    +     ->run();
    +
    +// optimize autoloader with custom path
    +$this->taskComposerUpdate('path/to/my/composer.phar')
    +     ->optimizeAutoloader()
    +     ->run();
    +?>
    • noSuggest($noSuggest = null) adds no-suggest option to composer
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Validate

    Composer Validate

    php
    <?php
    +// simple execution
    +$this->taskComposerValidate()->run();
    +?>
    • noCheckAll($noCheckAll = null) * param bool $noCheckAll
    • noCheckLock($noCheckLock = null) * param bool $noCheckLock
    • noCheckPublish($noCheckPublish = null) * param bool $noCheckPublish
    • withDependencies($withDependencies = null) * param bool $withDependencies
    • strict($strict = null) * param bool $strict
    • preferDist($preferDist = null) adds prefer-dist option to composer
    • preferSource() adds prefer-source option to composer
    • dev($dev = null) adds dev option to composer
    • noDev() adds no-dev option to composer
    • ansi($ansi = null) adds ansi option to composer
    • noAnsi() adds no-ansi option to composer
    • interaction($interaction = null) * param bool $interaction
    • noInteraction() adds no-interaction option to composer
    • optimizeAutoloader($optimize = null) adds optimize-autoloader option to composer
    • ignorePlatformRequirements($ignore = null) adds ignore-platform-reqs option to composer
    • disablePlugins($disable = null) disable plugins
    • noScripts($disable = null) skip scripts
    • workingDir($dir) adds --working-dir $dir option to composer
    • buildCommand() Copy class fields into command options as directed.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/Development.html b/tasks/Development.html new file mode 100644 index 0000000..690af15 --- /dev/null +++ b/tasks/Development.html @@ -0,0 +1,123 @@ + + + + + + Development Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Development Tasks

    Changelog

    Helps to manage changelog file. Creates or updates changelog.md file with recent changes in current version.

    php
    <?php
    +$version = "0.1.0";
    +$this->taskChangelog()
    + ->version($version)
    + ->change("released to github")
    + ->run();
    +?>

    Changes can be asked from Console

    php
    <?php
    +$this->taskChangelog()
    + ->version($version)
    + ->askForChanges()
    + ->run();
    +?>
    • filename($filename) * param string $filename
    • setBody($body) Sets the changelog body text.
    • setHeader($header) * param string $header
    • log($item) * param string $item
    • anchor($anchor) * param string $anchor
    • version($version) * param string $version
    • changes(array $data) * param array $data
    • change($change) * param string $change
    • getChanges() @return array
    • processLogRow($i) * param string $i
    • setOutput($output) Sets the Console Output.

    GenerateMarkdownDoc

    Simple documentation generator from source files. Takes classes, properties and methods with their docblocks and writes down a markdown file.

    php
    <?php
    +$this->taskGenDoc('models.md')
    +     ->docClass('Model\User') // take class Model\User
    +     ->docClass('Model\Post') // take class Model\Post
    +     ->filterMethods(function(\ReflectionMethod $r) {
    +         return $r->isPublic() or $r->isProtected(); // process public and protected methods
    +     })->processClass(function(\ReflectionClass $r, $text) {
    +         return "Class ".$r->getName()."\n\n$text\n\n###Methods\n";
    +     })->run();

    By default this task generates a documentation for each public method of a class, interface or trait. It combines method signature with a docblock. Both can be post-processed.

    php
    <?php
    +$this->taskGenDoc('models.md')
    +     ->docClass('Model\User')
    +     ->processClassSignature(false) // false can be passed to not include class signature
    +     ->processClassDocBlock(function(\ReflectionClass $r, $text) {
    +         return "[This is part of application model]\n" . $text;
    +     })->processMethodSignature(function(\ReflectionMethod $r, $text) {
    +         return "#### {$r->name}()";
    +     })->processMethodDocBlock(function(\ReflectionMethod $r, $text) {
    +         return strpos($r->name, 'save')===0 ? "[Saves to the database]\n" . $text : $text;
    +     })->run();
    • docClass($item) Put a class you want to be documented.
    • filterMethods($filterMethods) Using a callback function filter out methods that won't be documented.
    • filterClasses($filterClasses) Using a callback function filter out classes that won't be documented.
    • filterProperties($filterProperties) Using a callback function filter out properties that won't be documented.
    • processClass($processClass) Post-process class documentation.
    • processClassSignature($processClassSignature) Post-process class signature. Provide false to skip.
    • processClassDocBlock($processClassDocBlock) Post-process class docblock contents. Provide false to skip.
    • processMethod($processMethod) Post-process method documentation. Provide false to skip.
    • processMethodSignature($processMethodSignature) Post-process method signature. Provide false to skip.
    • processMethodDocBlock($processMethodDocBlock) Post-process method docblock contents. Provide false to skip.
    • processProperty($processProperty) Post-process property documentation. Provide false to skip.
    • processPropertySignature($processPropertySignature) Post-process property signature. Provide false to skip.
    • processPropertyDocBlock($processPropertyDocBlock) Post-process property docblock contents. Provide false to skip.
    • reorder($reorder) Use a function to reorder classes.
    • reorderMethods($reorderMethods) Use a function to reorder methods in class.
    • reorderProperties($reorderProperties) * param callable $reorderProperties
    • filename($filename) * param string $filename
    • prepend($prepend) Inserts text at the beginning of markdown file.
    • append($append) Inserts text at the end of markdown file.
    • text($text) * param string $text
    • textForClass($item) * param string $item
    • setOutput($output) Sets the Console Output.

    Generate

    Generate a Robo Task that is a wrapper around an existing class.

    php
    <?php
    +$this->taskGenerateTask('Symfony\Component\Filesystem\Filesystem', 'FilesystemStack')
    +  ->run();
    • setOutput($output) Sets the Console Output.

    GitHubRelease

    Publishes new GitHub release.

    php
    <?php
    +$this->taskGitHubRelease('0.1.0')
    +  ->uri('consolidation-org/Robo')
    +  ->description('Add stuff people need.')
    +  ->change('Fix #123')
    +  ->change('Add frobulation method to all widgets')
    +  ->run();
    +?>
    • tag($tag) * param string $tag
    • draft($draft) * param bool $draft
    • name($name) * param string $name
    • description($description) * param string $description
    • prerelease($prerelease) * param bool $prerelease
    • comittish($comittish) * param string $comittish
    • appendDescription($description) * param string $description
    • changes(array $changes)
    • change($change) * param string $change
    • repo($repo) * param string $repo
    • owner($owner) * param string $owner
    • uri($uri) * param string $uri
    • user($user) * param string $user
    • password($password) * param string $password
    • accessToken($token) * param string $token
    • setOutput($output) Sets the Console Output.

    OpenBrowser

    Opens the default's user browser code inspired from openBrowser() function in https://github.com/composer/composer/blob/master/src/Composer/Command/HomeCommand.php

    php
    <?php
    +// open one browser window
    +$this->taskOpenBrowser('http://localhost')
    + ->run();
    +
    +// open two browser windows
    +$this->taskOpenBrowser([
    +    'http://localhost/mysite',
    +    'http://localhost/mysite2'
    +  ])
    +  ->run();
    • setOutput($output) Sets the Console Output.

    PackPhar

    Creates Phar.

    php
    <?php
    +$pharTask = $this->taskPackPhar('package/codecept.phar')
    +  ->compress()
    +  ->stub('package/stub.php');
    +
    + $finder = Finder::create()
    +     ->name('*.php')
    +       ->in('src');
    +
    +   foreach ($finder as $file) {
    +       $pharTask->addFile('src/'.$file->getRelativePathname(), $file->getRealPath());
    +   }
    +
    +   $finder = Finder::create()->files()
    +       ->name('*.php')
    +       ->in('vendor');
    +
    +   foreach ($finder as $file) {
    +       $pharTask->addStripped('vendor/'.$file->getRelativePathname(), $file->getRealPath());
    +   }
    +   $pharTask->run();
    +
    +   // verify Phar is packed correctly
    +   $code = $this->_exec('php package/codecept.phar');
    +?>
    • compress($compress = null) * param bool $compress
    • stub($stub) * param string $stub
    • addStripped($path, $file) * param string $path
    • addFile($path, $file) * param string $path
    • addFiles($files) * param \Symfony\Component\Finder\SplFileInfo[] $files
    • executable($file) * param string $file
    • setOutput($output) Sets the Console Output.

    PhpServer

    Runs PHP server and stops it when task finishes.

    php
    <?php
    +// run server in /public directory
    +$this->taskServer(8000)
    + ->dir('public')
    + ->run();
    +
    +// run with IP 0.0.0.0
    +$this->taskServer(8000)
    + ->host('0.0.0.0')
    + ->run();
    +
    +// execute server in background
    +$this->taskServer(8000)
    + ->background()
    + ->run();
    +?>
    • host($host) * param string $host
    • dir($path) * param string $path
    • simulate($context)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    SemVer

    Helps to maintain .semver file.

    php
    <?php
    +$this->taskSemVer('.semver')
    +     ->increment()
    +     ->run();
    +?>
    • __toString() @return string
    • version($version) * param string $version
    • setFormat($format) * param string $format
    • setMetadataSeparator($separator) * param string $separator
    • setPrereleaseSeparator($separator) * param string $separator
    • increment($what = null) * param string $what
    • prerelease($tag = null) * param string $tag
    • metadata($data) * param array|string $data
    + + + + \ No newline at end of file diff --git a/tasks/Docker.html b/tasks/Docker.html new file mode 100644 index 0000000..f0ceec4 --- /dev/null +++ b/tasks/Docker.html @@ -0,0 +1,115 @@ + + + + + + Docker Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Docker Tasks

    Build

    Builds Docker image

    php
    <?php
    +$this->taskDockerBuild()->run();
    +
    +$this->taskDockerBuild('path/to/dir')
    +     ->tag('database')
    +     ->run();
    +
    +?>

    Class Build @package Robo\Task\Docker

    • tag($tag) * param string $tag
    • enableBuildKit() * return $this
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Commit

    Commits docker container to an image

    $this->taskDockerCommit($containerId)
    +     ->name('my/database')
    +     ->run();
    +
    +// alternatively you can take the result from DockerRun task:
    +
    +$result = $this->taskDockerRun('db')
    +     ->exec('./prepare_database.sh')
    +     ->run();
    +
    +$task->dockerCommit($result)
    +     ->name('my/database')
    +     ->run();
    • name($name) * param string $name
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Exec

    Executes command inside running Docker container

    php
    <?php
    +$test = $this->taskDockerRun('test_env')
    +     ->detached()
    +     ->run();
    +
    +$this->taskDockerExec($test)
    +     ->interactive()
    +     ->exec('./runtests')
    +     ->run();
    +
    +// alternatively use commands from other tasks
    +
    +$this->taskDockerExec($test)
    +     ->interactive()
    +     ->exec($this->taskCodecept()->suite('acceptance'))
    +     ->run();
    +?>
    • detached() * return $this
    • exec($command) * param string|\Robo\Contract\CommandInterface $command
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Pull

    Pulls an image from DockerHub

    php
    <?php
    +$this->taskDockerPull('wordpress')
    +     ->run();
    +
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Remove

    Remove docker container

    php
    <?php
    +$this->taskDockerRemove($container)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Run

    Performs docker run on a container.

    php
    <?php
    +$this->taskDockerRun('mysql')->run();
    +
    +$result = $this->taskDockerRun('my_db_image')
    +     ->env('DB', 'database_name')
    +     ->volume('/path/to/data', '/data')
    +     ->detached()
    +     ->publish(3306)
    +     ->name('my_mysql')
    +     ->run();
    +
    +// retrieve container's cid:
    +$this->say("Running container ".$result->getCid());
    +
    +// execute script inside container
    +$result = $this->taskDockerRun('db')
    +     ->exec('prepare_test_data.sh')
    +     ->run();
    +
    +$this->taskDockerCommit($result)
    +     ->name('test_db')
    +     ->run();
    +
    +// link containers
    +$mysql = $this->taskDockerRun('mysql')
    +     ->name('wp_db') // important to set name for linked container
    +     ->env('MYSQL_ROOT_PASSWORD', '123456')
    +     ->run();
    +
    +$this->taskDockerRun('wordpress')
    +     ->link($mysql)
    +     ->publish(80, 8080)
    +     ->detached()
    +     ->run();
    +
    +?>
    • detached() * return $this
    • exec($run) * param string|\Robo\Contract\CommandInterface $run
    • volume($from, $to = null) * param string $from
    • publish($port = null, $portTo = null) * param null|int $port
    • containerWorkdir($dir) * param string $dir
    • user($user) * param string $user
    • privileged() * return $this
    • name($name) * param string $name
    • link($name, $alias) * param string|\Robo\Task\Docker\Result $name
    • tmpDir($dir) * param string $dir
    • getTmpDir() @return string
    • getUniqId() @return string
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Start

    Starts Docker container

    php
    <?php
    +$this->taskDockerStart($cidOrResult)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Stop

    Stops Docker container

    php
    <?php
    +$this->taskDockerStop($cidOrResult)
    +     ->run();
    +?>
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/File.html b/tasks/File.html new file mode 100644 index 0000000..a431a28 --- /dev/null +++ b/tasks/File.html @@ -0,0 +1,74 @@ + + + + + + File Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    File Tasks

    Concat

    Merges files into one. Used for preparing assets.

    php
    <?php
    +$this->taskConcat([
    +     'web/assets/screen.css',
    +     'web/assets/print.css',
    +     'web/assets/theme.css'
    + ])
    + ->to('web/assets/style.css')
    + ->run()
    +?>
    • to($dst) set the destination file
    • setOutput($output) Sets the Console Output.

    Replace

    Performs search and replace inside a files.

    php
    <?php
    +$this->taskReplaceInFile('VERSION')
    + ->from('0.2.0')
    + ->to('0.3.0')
    + ->run();
    +
    +$this->taskReplaceInFile('README.md')
    + ->from(date('Y')-1)
    + ->to(date('Y'))
    + ->run();
    +
    +$this->taskReplaceInFile('config.yml')
    + ->regex('~^service:~')
    + ->to('services:')
    + ->run();
    +
    +$this->taskReplaceInFile('box/robo.txt')
    + ->from(array('##dbname##', '##dbhost##'))
    + ->to(array('robo', 'localhost'))
    + ->run();
    +?>
    • filename($filename) * param string $filename
    • from($from) String(s) to be replaced.
    • to($to) Value(s) to be set as a replacement.
    • regex($regex) Regex to match string to be replaced.
    • limit($limit) If used with $this->regexp() how many counts will be replaced
    • setOutput($output) Sets the Console Output.

    TmpFile

    Create a temporary file that is automatically cleaned up once the task collection is is part of completes. When created, it is given a random filename.

    This temporary file may be manipulated exacatly like taskWrite(). It is deleted as soon as the collection it is a part of completes or rolls back.

    php
    <?php
    +$collection = $this->collectionBuilder();
    +$tmpFilePath = $collection->taskTmpFile()
    +     ->line('-----')
    +     ->line(date('Y-m-d').' '.$title)
    +     ->line('----')
    +     ->getPath();
    +$collection->run();
    +?>
    • complete() Delete this file when our collection completes.
    • filename($filename) * param string $filename
    • append($append = null) * param bool $append
    • line($line) add a line.
    • lines(array $lines) add more lines.
    • text($text) add a text.
    • textFromFile($filename) add a text from a file.
    • place($name, $val) substitute a placeholder with value, placeholder must be enclosed by {}.
    • replace($string, $replacement) replace any string with value.
    • regexReplace($pattern, $replacement) replace any string with value using regular expression.
    • appendIfMatches($pattern, $text) Append the provided text to the end of the buffer if the provided
    • appendUnlessMatches($pattern, $text) Append the provided text to the end of the buffer unless the provided
    • originalContents() @return string
    • wouldChange() @return bool
    • getPath() @return string
    • setOutput($output) Sets the Console Output.

    Write

    Writes to file.

    php
    <?php
    +$this->taskWriteToFile('blogpost.md')
    +     ->line('-----')
    +     ->line(date('Y-m-d').' '.$title)
    +     ->line('----')
    +     ->run();
    +?>
    • filename($filename) * param string $filename
    • append($append = null) * param bool $append
    • line($line) add a line.
    • lines(array $lines) add more lines.
    • text($text) add a text.
    • textFromFile($filename) add a text from a file.
    • place($name, $val) substitute a placeholder with value, placeholder must be enclosed by {}.
    • replace($string, $replacement) replace any string with value.
    • regexReplace($pattern, $replacement) replace any string with value using regular expression.
    • appendIfMatches($pattern, $text) Append the provided text to the end of the buffer if the provided
    • appendUnlessMatches($pattern, $text) Append the provided text to the end of the buffer unless the provided
    • originalContents() @return string
    • wouldChange() @return bool
    • getPath() @return string
    • setOutput($output) Sets the Console Output.
    + + + + \ No newline at end of file diff --git a/tasks/Filesystem.html b/tasks/Filesystem.html new file mode 100644 index 0000000..d52afe1 --- /dev/null +++ b/tasks/Filesystem.html @@ -0,0 +1,99 @@ + + + + + + Filesystem Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Filesystem Tasks

    CleanDir

    Deletes all files from specified dir, ignoring git files.

    php
    <?php
    +$this->taskCleanDir(['tmp','logs'])->run();
    +// as shortcut
    +$this->_cleanDir('app/cache');
    +?>
    • setOutput($output) Sets the Console Output.

    CopyDir

    Copies one dir into another

    php
    <?php
    +$this->taskCopyDir(['dist/config' => 'config'])->run();
    +// as shortcut
    +$this->_copyDir('dist/config', 'config');
    +?>
    • dirPermissions($value) Sets the default folder permissions for the destination if it doesn't exist
    • exclude($exclude = null) List files to exclude.
    • overwrite($overwrite) Destination files newer than source files are overwritten.
    • setOutput($output) Sets the Console Output.

    DeleteDir

    Deletes dir

    php
    <?php
    +$this->taskDeleteDir('tmp')->run();
    +// as shortcut
    +$this->_deleteDir(['tmp', 'log']);
    +?>
    • setOutput($output) Sets the Console Output.

    FilesystemStack

    Wrapper for Symfony Filesystem Component. Comands are executed in stack and can be stopped on first fail with stopOnFail option.

    php
    <?php
    +$this->taskFilesystemStack()
    +     ->mkdir('logs')
    +     ->touch('logs/.gitignore')
    +     ->chgrp('www', 'www-data')
    +     ->symlink('/var/log/nginx/error.log', 'logs/error.log')
    +     ->run();
    +
    +// one line
    +$this->_touch('.gitignore');
    +$this->_mkdir('logs');
    +
    +?>
    • $this mkdir(string|array|\Traversable $dir, int $mode = 0777)

    • $this touch(string|array|\Traversable $file, int $time = null, int $atime = null)

    • $this copy(string $from, string $to, bool $force = false)

    • $this chmod(string|array|\Traversable $file, int $permissions, int $umask = 0000, bool $recursive = false)

    • $this chgrp(string|array|\Traversable $file, string $group, bool $recursive = false)

    • $this chown(string|array|\Traversable $file, string $user, bool $recursive = false)

    • $this remove(string|array|\Traversable $file)

    • $this rename(string $from, string $to, bool $force = false)

    • $this symlink(string $from, string $to, bool $copyOnWindows = false)

    • $this mirror(string $from, string $to, \Traversable $iterator = null, array $options = [])

    • stopOnFail($stop = null) * param bool $stop

    • setOutput($output) Sets the Console Output.

    FlattenDir

    Searches for files in a nested directory structure and copies them to a target directory with or without the parent directories. The task was inspired by gulp-flatten.

    Example directory structure:

    └── assets
    +    ├── asset-library1
    +    │   ├── README.md
    +    │   └── asset-library1.min.js
    +    └── asset-library2
    +        ├── README.md
    +        └── asset-library2.min.js

    The following code will search the *.min.js files and copy them inside a new dist folder:

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js' => 'dist'])->run();
    +// or use shortcut
    +$this->_flattenDir('assets/*.min.js', 'dist');
    +?>

    You can also define the target directory with an additional method, instead of key/value pairs. More similar to the gulp-flatten syntax:

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js'])
    +  ->to('dist')
    +  ->run();
    +?>

    You can also append parts of the parent directories to the target path. If you give the value 1 to the includeParents() method, then the top parent will be appended to the target directory resulting in a path such as dist/assets/asset-library1.min.js.

    If you give a negative number, such as -1 (the same as specifying array(0, 1) then the bottom parent will be appended, resulting in a path such as dist/asset-library1/asset-library1.min.js.

    The top parent directory will always be starting from the relative path to the current directory. You can override that with the parentDir() method. If in the above example you would specify assets, then the top parent directory would be asset-library1.

    php
    <?php
    +$this->taskFlattenDir(['assets/*.min.js' => 'dist'])
    +  ->parentDir('assets')
    +  ->includeParents(1)
    +  ->run();
    +?>
    • dirPermissions($permission) Sets the default folder permissions for the destination if it does not exist.
    • includeParents($parents) Sets the value from which direction and how much parent dirs should be included.
    • parentDir($dir) Sets the parent directory from which the relative parent directories will be calculated.
    • to($target) Sets the target directory where the files will be copied to.
    • setOutput($output) Sets the Console Output.

    MirrorDir

    Mirrors a directory to another

    php
    <?php
    +$this->taskMirrorDir(['dist/config/' => 'config/'])->run();
    +// or use shortcut
    +$this->_mirrorDir('dist/config/', 'config/');
    +
    +?>
    • setOutput($output) Sets the Console Output.

    TmpDir

    Create a temporary directory that is automatically cleaned up once the task collection is is part of completes.

    Use WorkDir if you do not want the directory to be deleted.

    php
    <?php
    +// Delete on rollback or on successful completion.
    +// Note that in this example, everything is deleted at
    +// the end of $collection->run().
    +$collection = $this->collectionBuilder();
    +$tmpPath = $collection->tmpDir()->getPath();
    +$collection->taskFilesystemStack()
    +          ->mkdir("$tmpPath/log")
    +          ->touch("$tmpPath/log/error.txt");
    +$collection->run();
    +// as shortcut (deleted when program exits)
    +$tmpPath = $this->_tmpDir();
    +?>
    • cwd($shouldChangeWorkingDirectory = null) Flag that we should cwd to the temporary directory when it is
    • complete() Delete this directory when our collection completes.
    • getPath() Get a reference to the path to the temporary directory, so that
    • setOutput($output) Sets the Console Output.

    WorkDir

    Create a temporary working directory that is automatically renamed to its final desired location if all of the tasks in the collection succeed. If there is a rollback, then the working directory is deleted.

    php
    <?php
    +$collection = $this->collectionBuilder();
    +$workingPath = $collection->workDir("build")->getPath();
    +$collection->taskFilesystemStack()
    +          ->mkdir("$workingPath/log")
    +          ->touch("$workingPath/log/error.txt");
    +$collection->run();
    +?>
    • complete() Move our working directory into its final destination once the
    • rollback() Delete our working directory
    • getPath() Get a reference to the path to the temporary directory, so that
    • cwd($shouldChangeWorkingDirectory = null) Flag that we should cwd to the temporary directory when it is
    • setOutput($output) Sets the Console Output.
    + + + + \ No newline at end of file diff --git a/tasks/Gulp.html b/tasks/Gulp.html new file mode 100644 index 0000000..d88fe35 --- /dev/null +++ b/tasks/Gulp.html @@ -0,0 +1,40 @@ + + + + + + Gulp Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Gulp Tasks

    Run

    Gulp Run

    php
    <?php
    +// simple execution
    +$this->taskGulpRun()->run();
    +
    +// run task 'clean' with --silent option
    +$this->taskGulpRun('clean')
    +     ->silent()
    +     ->run();
    +?>
    • noColor() adds --no-color option to gulp
    • color() adds --color option to gulp
    • simple() adds --tasks-simple option to gulp
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/Logfile.html b/tasks/Logfile.html new file mode 100644 index 0000000..6d2ecc1 --- /dev/null +++ b/tasks/Logfile.html @@ -0,0 +1,42 @@ + + + + + + Logfile Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Logfile Tasks

    RotateLog

    Rotates a log (or any other) file

    php
    <?php
    +$this->taskRotateLog(['logfile.log'])->run();
    +// or use shortcut
    +$this->_rotateLog(['logfile.log']);
    +
    +?>
    • keep($keep) * param int $keep
    • chmod($chmod) * param int $chmod
    • setOutput($output) Sets the Console Output.

    TruncateLog

    Truncates a log (or any other) file

    php
    <?php
    +$this->taskTruncateLog(['logfile.log'])->run();
    +// or use shortcut
    +$this->_truncateLog(['logfile.log']);
    +
    +?>
    • chmod($chmod) * param int $chmod
    • setOutput($output) Sets the Console Output.
    + + + + \ No newline at end of file diff --git a/tasks/Npm.html b/tasks/Npm.html new file mode 100644 index 0000000..3cbbd17 --- /dev/null +++ b/tasks/Npm.html @@ -0,0 +1,48 @@ + + + + + + Npm Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Npm Tasks

    Install

    Npm Install

    php
    <?php
    +// simple execution
    +$this->taskNpmInstall()->run();
    +
    +// prefer dist with custom path
    +$this->taskNpmInstall('path/to/my/npm')
    +     ->noDev()
    +     ->run();
    +?>
    • noDev() adds production option to npm
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Update

    Npm Update

    php
    <?php
    +// simple execution
    +$this->taskNpmUpdate()->run();
    +
    +// prefer dist with custom path
    +$this->taskNpmUpdate('path/to/my/npm')
    +     ->noDev()
    +     ->run();
    +?>
    • noDev() adds production option to npm
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/Remote.html b/tasks/Remote.html new file mode 100644 index 0000000..56723e9 --- /dev/null +++ b/tasks/Remote.html @@ -0,0 +1,71 @@ + + + + + + Remote Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Remote Tasks

    Rsync

    Executes rsync in a flexible manner.

    php
    $this->taskRsync()
    +  ->fromPath('src/')
    +  ->toHost('localhost')
    +  ->toUser('dev')
    +  ->toPath('/var/www/html/app/')
    +  ->remoteShell('ssh -i public_key')
    +  ->recursive()
    +  ->excludeVcs()
    +  ->checksum()
    +  ->wholeFile()
    +  ->verbose()
    +  ->progress()
    +  ->humanReadable()
    +  ->stats()
    +  ->run();

    You could also clone the task and do a dry-run first:

    php
    $rsync = $this->taskRsync()
    +  ->fromPath('src/')
    +  ->toPath('example.com:/var/www/html/app/')
    +  ->archive()
    +  ->excludeVcs()
    +  ->progress()
    +  ->stats();
    +
    +$dryRun = clone $rsync;
    +$dryRun->dryRun()->run();
    +if ('y' === $this->ask('Do you want to run (y/n)')) {
    +  $rsync->run();
    +}
    • fromPath($path) This can either be a full rsync path spec (user@host:path) or just a path.
    • toPath($path) This can either be a full rsync path spec (user@host:path) or just a path.
    • fromUser($fromUser) * param string $fromUser
    • fromHost($fromHost) * param string $fromHost
    • toUser($toUser) * param string $toUser
    • toHost($toHost) * param string $toHost
    • progress() * return $this
    • stats() * return $this
    • recursive() * return $this
    • verbose() * return $this
    • checksum() * return $this
    • archive() * return $this
    • compress() * return $this
    • owner() * return $this
    • group() * return $this
    • times() * return $this
    • delete() * return $this
    • humanReadable() * return $this
    • wholeFile() * return $this
    • dryRun() * return $this
    • itemizeChanges() * return $this
    • excludeVcs() Excludes .git, .svn and .hg items at any depth.
    • exclude($pattern) * param array|string $pattern
    • excludeFrom($file) * param string $file
    • includeFilter($pattern) * param array|string $pattern
    • filter($pattern) * param array|string $pattern
    • filesFrom($file) * param string $file
    • remoteShell($command) * param string $command
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Ssh

    Runs multiple commands on a remote server. Per default, commands are combined with &&, unless stopOnFail is false.

    php
    <?php
    +
    +$this->taskSshExec('remote.example.com', 'user')
    +    ->remoteDir('/var/www/html')
    +    ->exec('ls -la')
    +    ->exec('chmod g+x logs')
    +    ->run();

    You can even exec other tasks (which implement CommandInterface):

    php
    $gitTask = $this->taskGitStack()
    +    ->checkout('master')
    +    ->pull();
    +
    +$this->taskSshExec('remote.example.com')
    +    ->remoteDir('/var/www/html/site')
    +    ->exec($gitTask)
    +    ->run();

    You can configure the remote directory for all future calls:

    php
    ::configure('remoteDir', '/some-dir');
    • hostname($hostname) * param string $hostname
    • user($user) * param string $user
    • stopOnFail($stopOnFail = null) Whether or not to chain commands together with && and stop the chain if one command fails.
    • remoteDir($remoteDir) Changes to the given directory before running commands.
    • identityFile($filename) * param string $filename
    • port($port) * param int $port
    • forcePseudoTty() * return $this
    • quiet() * return $this
    • verbose() * return $this
    • exec($command) * param string|string[]|CommandInterface $command
    • simulate($context)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/Testing.html b/tasks/Testing.html new file mode 100644 index 0000000..f48bba9 --- /dev/null +++ b/tasks/Testing.html @@ -0,0 +1,64 @@ + + + + + + Testing Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Testing Tasks

    Atoum

    Runs atoum tests

    php
    <?php
    +$this->taskAtoum()
    + ->files('path/to/test.php')
    + ->configFile('config/dev.php')
    + ->run()
    +
    +?>
    • tags($tags) Tag or Tags to filter.
    • lightReport() Display result using the light reporter.
    • tap() Display result using the tap reporter.
    • bootstrap($file) Path to the bootstrap file.
    • configFile($file) Path to the config file.
    • debug() Use atoum's debug mode.
    • files($files) Test file or test files to run.
    • directories($directories) Test directory or directories to run.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Behat

    Executes Behat tests

    php
    <?php
    +$this->taskBehat()
    +     ->format('pretty')
    +     ->noInteraction()
    +     ->run();
    +?>
    • stopOnFail() * return $this
    • noInteraction() * return $this
    • config($config_file) * param string $config_file
    • colors() * return $this
    • noColors() * return $this
    • suite($suite) * param string $suite
    • verbose($level = null) * param string $level
    • format($formater) * param string $formater
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Codecept

    Executes Codeception tests

    php
    <?php
    +// config
    +$this->taskCodecept()
    +     ->suite('acceptance')
    +     ->env('chrome')
    +     ->group('admin')
    +     ->xml()
    +     ->html()
    +     ->run();
    +
    +?>
    • suite($suite) * param string $suite
    • test($testName) * param string $testName
    • group($group) set group option. Can be called multiple times
    • excludeGroup($group) * param string $group
    • json($file = null) generate json report
    • xml($file = null) generate xml JUnit report
    • html($dir = null) Generate html report
    • tap($file = null) generate tap report
    • configFile($file) provides config file other then default codeception.yml with -c option
    • coverage($cov = null) collect codecoverage in raw format. You may pass name of cov file to save results
    • coverageXml($xml = null) collect code coverage in xml format. You may pass name of xml file to save results
    • coverageHtml($html = null) collect code coverage and generate html report. You may pass
    • debug() * return $this
    • noRebuild() * return $this
    • noExit() * return $this
    • failGroup($failGroup) * param string $failGroup
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    PHPUnit

    Runs PHPUnit tests

    php
    <?php
    +$this->taskPHPUnit()
    + ->group('core')
    + ->bootstrap('test/bootstrap.php')
    + ->run()
    +
    +?>
    • filter($filter) * param string $filter
    • group($group) * param string $group
    • excludeGroup($group) * param string $group
    • json($file = null) adds log-json option to runner
    • xml($file = null) adds log-junit option
    • tap($file = null) * param string $file
    • bootstrap($file) * param string $file
    • configFile($file) * param string $file
    • debug() * return $this
    • files($files) Directory of test files or single test file to run.
    • file($file) Test the provided file.
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.

    Phpspec

    Executes Phpspec tests

    php
    <?php
    +$this->taskPhpspec()
    +     ->format('pretty')
    +     ->noInteraction()
    +     ->run();
    +?>
    • stopOnFail()
    • noCodeGeneration()
    • quiet()
    • verbose($level = null) * param string $level
    • noAnsi() * return $this
    • noInteraction() * return $this
    • config($config_file) * param string $config_file
    • format($formater) * param string $formater
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    • arg($arg) Pass argument to executable. Its value will be automatically escaped.
    • args($args) Pass methods parameters as arguments to executable. Argument values
    • rawArg($arg) Pass the provided string in its raw (as provided) form as an argument to executable.
    • option($option, $value = null, $separator = null) Pass option to executable. Options are prefixed with -- , value can be provided in second parameter.
    • options(array $options, $separator = null) Pass multiple options to executable. The associative array contains
    • optionList($option, $value = null, $separator = null) Pass an option with multiple values to executable. Value can be a string or array.
    + + + + \ No newline at end of file diff --git a/tasks/Vcs.html b/tasks/Vcs.html new file mode 100644 index 0000000..012a4cb --- /dev/null +++ b/tasks/Vcs.html @@ -0,0 +1,72 @@ + + + + + + Vcs Tasks | Robo + + + + + + + + + + + + + + + + + + + + + +
    Skip to content

    Vcs Tasks

    GitStack

    Runs Git commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->taskGitStack()
    + ->stopOnFail()
    + ->add('-A')
    + ->commit('adding everything')
    + ->push('origin','master')
    + ->tag('0.6.0')
    + ->push('origin','0.6.0')
    + ->run()
    +
    +$this->taskGitStack()
    + ->stopOnFail()
    + ->add('doc/*')
    + ->commit('doc updated')
    + ->push()
    + ->run();
    +?>
    • cloneRepo($repo, $to = null, $branch = null) Executes git clone
    • cloneShallow($repo, $to = null, $branch = null, $depth = null) Executes git clone with depth 1 as default
    • add($pattern) Executes git add command with files to add pattern
    • commit($message, $options = null) Executes git commit command with a message
    • pull($origin = null, $branch = null) Executes git pull command.
    • push($origin = null, $branch = null) Executes git push command
    • merge($branch) Performs git merge
    • checkout($branch) Executes git checkout command
    • tag($tag_name, $message = null) Executes git tag command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    HgStack

    Runs hg commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->hgStack
    + ->cloneRepo('https://bitbucket.org/durin42/hgsubversion')
    + ->pull()
    + ->add()
    + ->commit('changed')
    + ->push()
    + ->tag('0.6.0')
    + ->push('0.6.0')
    + ->run();
    +?>
    • cloneRepo($repo, $to = null) Executes hg clone
    • add($include = null, $exclude = null) Executes hg add command with files to add by pattern
    • commit($message, $options = null) Executes hg commit command with a message
    • pull($branch = null) Executes hg pull command.
    • push($branch = null) Executes hg push command
    • merge($revision = null) Performs hg merge
    • tag($tag_name, $message = null) Executes hg tag command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command

    SvnStack

    Runs Svn commands in stack. You can use stopOnFail() to point that stack should be terminated on first fail.

    php
    <?php
    +$this->taskSvnStack()
    + ->checkout('http://svn.collab.net/repos/svn/trunk')
    + ->run()
    +
    +// alternatively
    +$this->_svnCheckout('http://svn.collab.net/repos/svn/trunk');
    +
    +$this->taskSvnStack('username', 'password')
    + ->stopOnFail()
    + ->update()
    + ->add('doc/*')
    + ->commit('doc updated')
    + ->run();
    +?>
    • update($path = null) Updates svn update command
    • add($pattern = null) Executes svn add command with files to add pattern
    • commit($message, $options = null) Executes svn commit command with a message
    • checkout($branch) Executes svn checkout command
    • executable($executable) * param string $executable
    • exec($command) * param string|string[]|CommandInterface $command
    • stopOnFail($stopOnFail = null) * param bool $stopOnFail
    • result($result)
    • setOutput($output) Sets the Console Output.
    • setProcessInput($input) Pass an input to the process. Can be resource created with fopen() or string
    • dir($dir) Changes working directory of command
    + + + + \ No newline at end of file