[{"data":1,"prerenderedAt":1713},["ShallowReactive",2],{"navigation_docs":3,"-engineering-development-setup":209,"-engineering-development-setup-surround":1708},[4,8,50,75,133,149,162,171,205],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"path":10,"stem":11,"children":12,"page":49},"Company","\u002Fcompany","1.company",[13,17,21,25,29,33,37,41,45],{"title":14,"path":15,"stem":16},"About","\u002Fcompany\u002Fabout","1.company\u002F0.about",{"title":18,"path":19,"stem":20},"Values","\u002Fcompany\u002Fvalues","1.company\u002F1.values",{"title":22,"path":23,"stem":24},"Communication","\u002Fcompany\u002Fcommunication","1.company\u002Fcommunication",{"title":26,"path":27,"stem":28},"Competition","\u002Fcompany\u002Fcompetition","1.company\u002Fcompetition",{"title":30,"path":31,"stem":32},"Hybrid Working","\u002Fcompany\u002Fhybrid-working","1.company\u002Fhybrid-working",{"title":34,"path":35,"stem":36},"Operations","\u002Fcompany\u002Foperations","1.company\u002Foperations",{"title":38,"path":39,"stem":40},"Policies","\u002Fcompany\u002Fpolicies","1.company\u002Fpolicies",{"title":42,"path":43,"stem":44},"Product","\u002Fcompany\u002Fproduct","1.company\u002Fproduct",{"title":46,"path":47,"stem":48},"Security","\u002Fcompany\u002Fsecurity","1.company\u002Fsecurity",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"People Ops","\u002Fpeople-ops","2.people-ops",[55,59,63,67,71],{"title":56,"path":57,"stem":58},"Compensation","\u002Fpeople-ops\u002Fcompensation","2.people-ops\u002Fcompensation",{"title":60,"path":61,"stem":62},"Education","\u002Fpeople-ops\u002Feducation","2.people-ops\u002Feducation",{"title":64,"path":65,"stem":66},"Expenses","\u002Fpeople-ops\u002Fexpenses","2.people-ops\u002Fexpenses",{"title":68,"path":69,"stem":70},"Holiday & Leave","\u002Fpeople-ops\u002Fleave","2.people-ops\u002Fleave",{"title":72,"path":73,"stem":74},"Onboarding","\u002Fpeople-ops\u002Fonboarding","2.people-ops\u002Fonboarding",{"title":76,"path":77,"stem":78,"children":79,"page":49},"Engineering","\u002Fengineering","3.engineering",[80,84,88,92,96,117,121,125,129],{"title":81,"path":82,"stem":83},"Development Setup","\u002Fengineering\u002Fdevelopment-setup","3.engineering\u002F1.development-setup",{"title":85,"path":86,"stem":87},"Contributing","\u002Fengineering\u002Fcontributing","3.engineering\u002Fcontributing",{"title":89,"path":90,"stem":91},"Production Database","\u002Fengineering\u002Fdatabase-connection","3.engineering\u002Fdatabase-connection",{"title":93,"path":94,"stem":95},"Deployment","\u002Fengineering\u002Fdeployment","3.engineering\u002Fdeployment",{"title":97,"path":98,"stem":99,"children":100,"page":49},"Github","\u002Fengineering\u002Fgithub","3.engineering\u002Fgithub",[101,105,109,113],{"title":102,"path":103,"stem":104},"Packages","\u002Fengineering\u002Fgithub\u002Fpackages","3.engineering\u002Fgithub\u002Fpackages",{"title":106,"path":107,"stem":108},"Personal Access Token","\u002Fengineering\u002Fgithub\u002Fpersonal-access-token","3.engineering\u002Fgithub\u002Fpersonal-access-token",{"title":110,"path":111,"stem":112},"Troubleshooting","\u002Fengineering\u002Fgithub\u002Ftroubleshooting","3.engineering\u002Fgithub\u002Ftroubleshooting",{"title":114,"path":115,"stem":116},"Workflows","\u002Fengineering\u002Fgithub\u002Fworkflows","3.engineering\u002Fgithub\u002Fworkflows",{"title":118,"path":119,"stem":120},"Platform Ops","\u002Fengineering\u002Fplatform-ops","3.engineering\u002Fplatform-ops",{"title":122,"path":123,"stem":124},"Project Management","\u002Fengineering\u002Fproject-management","3.engineering\u002Fproject-management",{"title":126,"path":127,"stem":128},"Releases","\u002Fengineering\u002Frelease","3.engineering\u002Frelease",{"title":130,"path":131,"stem":132},"Tools","\u002Fengineering\u002Ftools","3.engineering\u002Ftools",{"title":134,"path":135,"stem":136,"children":137,"page":49},"Design","\u002Fdesign","4.design",[138,142,146],{"title":139,"path":140,"stem":141},"Branding","\u002Fdesign\u002Fbranding","4.design\u002Fbranding",{"title":143,"path":144,"stem":145},"Design Thinking","\u002Fdesign\u002Fdesign-thinking","4.design\u002Fdesign-thinking",{"title":130,"path":147,"stem":148},"\u002Fdesign\u002Ftools","4.design\u002Ftools",{"title":150,"path":151,"stem":152,"children":153,"page":49},"Sales","\u002Fsales","4.sales",[154,158],{"title":155,"path":156,"stem":157},"Customer Onboarding","\u002Fsales\u002Fonboarding","4.sales\u002Fonboarding",{"title":159,"path":160,"stem":161},"Sales Tools","\u002Fsales\u002Ftools","4.sales\u002Ftools",{"title":163,"path":164,"stem":165,"children":166,"page":49},"Marketing","\u002Fmarketing","5.marketing",[167],{"title":168,"path":169,"stem":170},"Messaging","\u002Fmarketing\u002Fmessaging","5.marketing\u002Fmessaging",{"title":172,"path":173,"stem":174,"children":175,"page":49},"Data Ops","\u002Fdata-ops","6.data-ops",[176,185,189,193,197,201],{"title":177,"path":178,"stem":179,"children":180,"page":49},"Capability Exchange","\u002Fdata-ops\u002Fcapability-exchange","6.data-ops\u002FCapability Exchange",[181],{"title":182,"path":183,"stem":184},"Leaderboard Calculation","\u002Fdata-ops\u002Fcapability-exchange\u002Fleaderboard-calculation","6.data-ops\u002FCapability Exchange\u002Fleaderboard-calculation",{"title":186,"path":187,"stem":188},"Account Portal (CAS)","\u002Fdata-ops\u002Faccount-portal","6.data-ops\u002Faccount-portal",{"title":190,"path":191,"stem":192},"Adding Products","\u002Fdata-ops\u002Faddin-products","6.data-ops\u002Faddin-products",{"title":194,"path":195,"stem":196},"Adding Vendors","\u002Fdata-ops\u002Fadding-vendors","6.data-ops\u002Fadding-vendors",{"title":198,"path":199,"stem":200},"Message Queues","\u002Fdata-ops\u002Fmessage-queues","6.data-ops\u002Fmessage-queues",{"title":202,"path":203,"stem":204},"Refreshing Vendors","\u002Fdata-ops\u002Frefreshing-vendors","6.data-ops\u002Frefreshing-vendors",{"title":206,"path":207,"stem":208},"Glossary","\u002Fglossary","glossary",{"id":210,"title":81,"body":211,"description":1702,"extension":1703,"links":1704,"meta":1705,"navigation":811,"path":82,"seo":1706,"stem":83,"__hash__":1707},"docs\u002F3.engineering\u002F1.development-setup.md",{"type":212,"value":213,"toc":1684},"minimark",[214,259,264,267,272,886,891,894,898,1342,1346,1353,1361,1364,1375,1381,1385,1392,1395,1399,1402,1405,1409,1419,1425,1455,1466,1468,1472,1480,1483,1535,1537,1541,1549,1552,1563,1565,1569,1577,1584,1604,1606,1610,1618,1620,1624,1638,1640,1644,1662,1664,1668,1671,1674,1680],[215,216,217,231,239,246,249],"card",{},[218,219,220,221,225,226,230],"p",{},"The majority of the required software downloads can be found on the ESP Google Drive in ",[222,223,224],"strong",{},"Software Programming Downloads"," which should be already be installed accessible on your machine via ",[227,228,229],"code",{},"G:"," virtual drive, should you have issues downloading software directly from the internet due to permission restrictions.",[232,233,234,235,238],"warning",{},"Always use Windows file explorer to browse and copy installers\u002Fbundles from Google Drive.",[236,237],"br",{},"\nDo not use the Google Drive web interface to download software.",[240,241,242,243,245],"caution",{},"Do not install or upack software directly from ",[227,244,229],{}," virtual drive directory, Copy to your local machine first and install from there.",[218,247,248],{},"Folder location:",[250,251,256],"pre",{"className":252,"code":254,"language":255},[253],"language-text","G:\u002FShared drives\u002FESP Common\u002FOnboarding\u002FSoftware\u002FPrograming\n","text",[227,257,254],{"__ignoreMap":258},"",[260,261,263],"h2",{"id":262},"prerequisites","Prerequisites",[218,265,266],{},"Before you begin, please ensure you have the following relevant software installed and configurations set up on your computer:",[268,269,271],"h4",{"id":270},"common-prerequisites","Common Prerequisites",[215,273,274],{},[275,276,277,445,662],"accordion",{},[278,279,282,285,289,304,320,324,335,349,360,364,367,376,382,386,389,398,401,410,414,417,433,436],"accordion-item",{"icon":280,"label":281},"fa6-brands:git-alt","GIT - Version Control",[218,283,284],{},"Git is required for source control across all ESP projects.",[268,286,288],{"id":287},"why-use-windows-package-manager-winget","Why use Windows Package Manager (winget)?",[218,290,291,292,299,300,303],{},"The ",[222,293,294,295,298],{},"Windows Package Manager (",[227,296,297],{},"winget",")"," — available via the ",[222,301,302],{},"Microsoft Store"," — is the recommended way to install and maintain Git on Windows. It keeps Git up to date automatically alongside your other managed packages, and avoids the need to manually download installers.",[305,306,307],"blockquote",{},[218,308,309,311,312,319],{},[227,310,297],{}," is pre-installed on Windows 11 and available on Windows 10 (build 1709+) via the ",[313,314,318],"a",{"href":315,"rel":316},"https:\u002F\u002Fapps.microsoft.com\u002Fdetail\u002F9NBLGGH4NNS1",[317],"nofollow","App Installer"," package in the Microsoft Store.",[268,321,323],{"id":322},"install-git","Install Git",[218,325,326,327,330,331,334],{},"Open ",[222,328,329],{},"PowerShell"," or ",[222,332,333],{},"Windows Terminal"," and run:",[250,336,340],{"className":337,"code":338,"language":339,"meta":258,"style":258},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","winget install --id Git.Git -e --source winget\n","powershell",[227,341,342],{"__ignoreMap":258},[343,344,347],"span",{"class":345,"line":346},"line",1,[343,348,338],{},[218,350,351,352,355,356,359],{},"This installs the latest stable release of Git, including ",[222,353,354],{},"Git Bash"," and ",[222,357,358],{},"Git GUI",".",[268,361,363],{"id":362},"verify-the-installation","Verify the installation",[218,365,366],{},"After installation, restart your terminal, then confirm Git is available:",[250,368,370],{"className":337,"code":369,"language":339,"meta":258,"style":258},"git --version\n",[227,371,372],{"__ignoreMap":258},[343,373,374],{"class":345,"line":346},[343,375,369],{},[218,377,378,379,359],{},"You should see output like ",[227,380,381],{},"git version 2.x.x.windows.x",[268,383,385],{"id":384},"keeping-git-up-to-date","Keeping Git up to date",[218,387,388],{},"To update Git (and all other winget-managed packages) at any time:",[250,390,392],{"className":337,"code":391,"language":339,"meta":258,"style":258},"winget upgrade --id Git.Git\n",[227,393,394],{"__ignoreMap":258},[343,395,396],{"class":345,"line":346},[343,397,391],{},[218,399,400],{},"Or update everything in one command:",[250,402,404],{"className":337,"code":403,"language":339,"meta":258,"style":258},"winget upgrade --all\n",[227,405,406],{"__ignoreMap":258},[343,407,408],{"class":345,"line":346},[343,409,403],{},[268,411,413],{"id":412},"first-time-configuration","First-time configuration",[218,415,416],{},"After installing, set your identity so commits are correctly attributed:",[250,418,420],{"className":337,"code":419,"language":339,"meta":258,"style":258},"git config --global user.name \"Your Name\"\ngit config --global user.email \"your.email@es-profiler.com\"\n",[227,421,422,427],{"__ignoreMap":258},[343,423,424],{"class":345,"line":346},[343,425,426],{},"git config --global user.name \"Your Name\"\n",[343,428,430],{"class":345,"line":429},2,[343,431,432],{},"git config --global user.email \"your.email@es-profiler.com\"\n",[218,434,435],{},"Confirm your global config is correct:",[250,437,439],{"className":337,"code":438,"language":339,"meta":258,"style":258},"git config --global --list\n",[227,440,441],{"__ignoreMap":258},[343,442,443],{"class":345,"line":346},[343,444,438],{},[278,446,449,452,455,462,477,480,484,491,500,508,519,522,525,540,543,552,556,559,568,572,579,585,615,626,629,638,644,647,656],{"icon":447,"label":448},"fa6-brands:docker","Docker",[218,450,451],{},"Docker Desktop is required to run containerised services locally, including the ESP platform and its supporting infrastructure.",[268,453,263],{"id":454},"prerequisites-1",[218,456,457,458,461],{},"Docker Desktop on Windows uses the ",[222,459,460],{},"WSL 2"," (Windows Subsystem for Linux 2) backend. Before installing, ensure WSL 2 is enabled:",[250,463,465],{"className":337,"code":464,"language":339,"meta":258,"style":258},"wsl --install\nwsl --set-default-version 2\n",[227,466,467,472],{"__ignoreMap":258},[343,468,469],{"class":345,"line":346},[343,470,471],{},"wsl --install\n",[343,473,474],{"class":345,"line":429},[343,475,476],{},"wsl --set-default-version 2\n",[218,478,479],{},"Restart your machine after this step if prompted.",[268,481,483],{"id":482},"install-docker-desktop","Install Docker Desktop",[218,485,486,487,490],{},"The recommended way to install Docker Desktop is via ",[222,488,489],{},"Windows Package Manager (winget)",":",[250,492,494],{"className":337,"code":493,"language":339,"meta":258,"style":258},"winget install --id Docker.DockerDesktop -e --source winget\n",[227,495,496],{"__ignoreMap":258},[343,497,498],{"class":345,"line":346},[343,499,493],{},[218,501,502,503,359],{},"Alternatively, download the installer directly from ",[313,504,507],{"href":505,"rel":506},"https:\u002F\u002Fdocs.docker.com\u002Fdesktop\u002Finstall\u002Fwindows-install\u002F",[317],"docs.docker.com\u002Fdesktop\u002Finstall\u002Fwindows-install",[218,509,510,511,514,515,518],{},"After installation, launch ",[222,512,513],{},"Docker Desktop"," from the Start menu and complete the initial setup wizard. Accept the licence agreement and ensure ",[222,516,517],{},"Use WSL 2 instead of Hyper-V"," is selected.",[268,520,363],{"id":521},"verify-the-installation-1",[218,523,524],{},"Once Docker Desktop is running (the whale icon appears in the system tray), open a terminal and confirm:",[250,526,528],{"className":337,"code":527,"language":339,"meta":258,"style":258},"docker --version\ndocker compose version\n",[227,529,530,535],{"__ignoreMap":258},[343,531,532],{"class":345,"line":346},[343,533,534],{},"docker --version\n",[343,536,537],{"class":345,"line":429},[343,538,539],{},"docker compose version\n",[218,541,542],{},"You should see version output for both. Run a quick smoke test:",[250,544,546],{"className":337,"code":545,"language":339,"meta":258,"style":258},"docker run --rm hello-world\n",[227,547,548],{"__ignoreMap":258},[343,549,550],{"class":345,"line":346},[343,551,545],{},[268,553,555],{"id":554},"keeping-docker-desktop-up-to-date","Keeping Docker Desktop up to date",[218,557,558],{},"Docker Desktop notifies you in-app when updates are available. You can also update via winget:",[250,560,562],{"className":337,"code":561,"language":339,"meta":258,"style":258},"winget upgrade --id Docker.DockerDesktop\n",[227,563,564],{"__ignoreMap":258},[343,565,566],{"class":345,"line":346},[343,567,561],{},[268,569,571],{"id":570},"increasing-memory-allocation","Increasing Memory Allocation",[218,573,574,575,578],{},"By default, WSL 2 may claim too much — or too little — host memory. For ESP local development, it is recommended to allocate at least ",[222,576,577],{},"6–8 GB"," of RAM to WSL 2.",[218,580,581,582,490],{},"Create or edit the file ",[227,583,584],{},"C:\\Users\\\u003CYourUsername>\\.wslconfig",[250,586,591],{"className":587,"code":588,"filename":589,"language":590,"meta":258,"style":258},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[wsl2]\nmemory=16GB       # Maximum RAM allocated to WSL 2 (adjust to suit your machine)\nprocessors=4     # Number of CPU cores (optional)\nswap=2GB         # Swap space (optional)\n","C:\\Users\u003CYourUsername>.wslconfig","ini",[227,592,593,598,603,609],{"__ignoreMap":258},[343,594,595],{"class":345,"line":346},[343,596,597],{},"[wsl2]\n",[343,599,600],{"class":345,"line":429},[343,601,602],{},"memory=16GB       # Maximum RAM allocated to WSL 2 (adjust to suit your machine)\n",[343,604,606],{"class":345,"line":605},3,[343,607,608],{},"processors=4     # Number of CPU cores (optional)\n",[343,610,612],{"class":345,"line":611},4,[343,613,614],{},"swap=2GB         # Swap space (optional)\n",[305,616,617],{},[218,618,619,622,623,359],{},[222,620,621],{},"Tip:"," A safe value is half your total physical RAM. For example, on a 16 GB machine, set ",[227,624,625],{},"memory=8GB",[218,627,628],{},"After saving the file, restart WSL 2 for the change to take effect:",[250,630,632],{"className":337,"code":631,"language":339,"meta":258,"style":258},"wsl --shutdown\n",[227,633,634],{"__ignoreMap":258},[343,635,636],{"class":345,"line":346},[343,637,631],{},[218,639,640,641,643],{},"Then reopen ",[222,642,513],{}," — it will reconnect to the updated WSL 2 instance automatically.",[218,645,646],{},"You can verify the memory available inside WSL 2 with:",[250,648,650],{"className":337,"code":649,"language":339,"meta":258,"style":258},"wsl -- free -h\n",[227,651,652],{"__ignoreMap":258},[343,653,654],{"class":345,"line":346},[343,655,649],{},[232,657,658,661],{},[222,659,660],{},"Important",": After installing Docker Desktop, make sure it is running before you proceed.",[278,663,666,669,673,679,688,709,722,725,728,743,751,768,772,781,785,792,841,848,857,860,869],{"icon":664,"label":665},"fa6-brands:python","Python",[218,667,668],{},"Python is required for tooling and scripting used across ESP projects.",[268,670,672],{"id":671},"install-python-via-winget","Install Python via winget",[218,674,675,676,678],{},"The recommended way to install Python on Windows is via ",[222,677,489],{},", which keeps it up to date alongside your other packages:",[250,680,682],{"className":337,"code":681,"language":339,"meta":258,"style":258},"winget install --id Python.Python.3 -e --source winget\n",[227,683,684],{"__ignoreMap":258},[343,685,686],{"class":345,"line":346},[343,687,681],{},[305,689,690],{},[218,691,692,693,698,699,702,703,359],{},"This installs the latest stable Python 3 release from the official ",[313,694,697],{"href":695,"rel":696},"https:\u002F\u002Fwww.python.org\u002F",[317],"python.org"," channel, including ",[222,700,701],{},"pip"," and the ",[222,704,705,706,298],{},"Python Launcher (",[227,707,708],{},"py",[218,710,711,712,717,718,721],{},"Alternatively, download the installer from ",[313,713,716],{"href":714,"rel":715},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[317],"python.org\u002Fdownloads",". If using the manual installer, ensure ",[222,719,720],{},"Add Python to PATH"," is checked before clicking Install.",[268,723,363],{"id":724},"verify-the-installation-2",[218,726,727],{},"Restart your terminal after installation, then confirm Python and pip are available:",[250,729,731],{"className":337,"code":730,"language":339,"meta":258,"style":258},"python --version\npip --version\n",[227,732,733,738],{"__ignoreMap":258},[343,734,735],{"class":345,"line":346},[343,736,737],{},"python --version\n",[343,739,740],{"class":345,"line":429},[343,741,742],{},"pip --version\n",[218,744,378,745,355,748,359],{},[227,746,747],{},"Python 3.x.x",[227,749,750],{},"pip x.x.x",[305,752,753,759],{},[218,754,755,756,758],{},"On Windows, ",[227,757,708],{}," (the Python Launcher) is also available and is the preferred way to run Python scripts when multiple versions are installed:",[250,760,762],{"className":337,"code":761,"language":339,"meta":258,"style":258},"py --version\n",[227,763,764],{"__ignoreMap":258},[343,765,766],{"class":345,"line":346},[343,767,761],{},[268,769,771],{"id":770},"keeping-python-up-to-date","Keeping Python up to date",[250,773,775],{"className":337,"code":774,"language":339,"meta":258,"style":258},"winget upgrade --id Python.Python.3\n",[227,776,777],{"__ignoreMap":258},[343,778,779],{"class":345,"line":346},[343,780,774],{},[268,782,784],{"id":783},"virtual-environments","Virtual Environments",[218,786,787,788,791],{},"Always use a ",[222,789,790],{},"virtual environment"," to isolate project dependencies. In the project root:",[250,793,795],{"className":337,"code":794,"language":339,"meta":258,"style":258},"# Create a virtual environment\npython -m venv .venv\n\n# Activate it (PowerShell)\n.\\.venv\\Scripts\\Activate.ps1\n\n# Activate it (Command Prompt)\n.\\.venv\\Scripts\\activate.bat\n",[227,796,797,802,807,813,818,824,829,835],{"__ignoreMap":258},[343,798,799],{"class":345,"line":346},[343,800,801],{},"# Create a virtual environment\n",[343,803,804],{"class":345,"line":429},[343,805,806],{},"python -m venv .venv\n",[343,808,809],{"class":345,"line":605},[343,810,812],{"emptyLinePlaceholder":811},true,"\n",[343,814,815],{"class":345,"line":611},[343,816,817],{},"# Activate it (PowerShell)\n",[343,819,821],{"class":345,"line":820},5,[343,822,823],{},".\\.venv\\Scripts\\Activate.ps1\n",[343,825,827],{"class":345,"line":826},6,[343,828,812],{"emptyLinePlaceholder":811},[343,830,832],{"class":345,"line":831},7,[343,833,834],{},"# Activate it (Command Prompt)\n",[343,836,838],{"class":345,"line":837},8,[343,839,840],{},".\\.venv\\Scripts\\activate.bat\n",[218,842,843,844,847],{},"Your terminal prompt will change to show ",[227,845,846],{},"(.venv)"," when active. Install dependencies into the environment with:",[250,849,851],{"className":337,"code":850,"language":339,"meta":258,"style":258},"pip install -r requirements.txt\n",[227,852,853],{"__ignoreMap":258},[343,854,855],{"class":345,"line":346},[343,856,850],{},[218,858,859],{},"Deactivate when done:",[250,861,863],{"className":337,"code":862,"language":339,"meta":258,"style":258},"deactivate\n",[227,864,865],{"__ignoreMap":258},[343,866,867],{"class":345,"line":346},[343,868,862],{},[305,870,871,877],{},[218,872,873,876],{},[222,874,875],{},"Note:"," If you see a PowerShell execution policy error when activating, run:",[250,878,880],{"className":337,"code":879,"language":339,"meta":258,"style":258},"Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser\n",[227,881,882],{"__ignoreMap":258},[343,883,884],{"class":345,"line":346},[343,885,879],{},[887,888,890],"h3",{"id":889},"backend-prerequisites","Backend Prerequisites",[215,892,893],{},"TBC",[887,895,897],{"id":896},"frontend-prerequisites","Frontend Prerequisites",[215,899,900],{},[275,901,902,1037,1299],{},[278,903,906,910,914,917,931,938,942,965,968,974,978,998,1013,1016,1033],{"icon":904,"label":905},"fa6-brands:node-js","Setup Node",[907,908,909],"callout",{},"It is recommended that you install NodeJS and Yarn in your user profile directory to avoid permission issues.",[268,911,913],{"id":912},"downloading-nodejs","Downloading NodeJS",[232,915,916],{},"Do not install using the MSI executable installer, it can only be installed and ran as Admin!",[218,918,919,920,925,926],{},"Download the LTS Windows x64 ",[222,921,924],{"className":922},[923],"text-success","Standalone Binary (.ZIP)"," package from ",[313,927,930],{"href":928,"rel":929},"https:\u002F\u002Fnodejs.org\u002Fen\u002Fdownload\u002Fprebuilt-binaries",[317],"Prebuilt Binaries",[218,932,933],{},[934,935],"img",{"alt":936,"src":937},"js-downloading-node.png","\u002Fimages\u002Fengineering\u002Fsetup\u002Fjs-downloading-node.png",[268,939,941],{"id":940},"installing-nodejs","Installing NodeJS",[943,944,945,952,958],"ol",{},[946,947,948,949],"li",{},"Navigate to your user applications folder by pasting the following alias into your File Explorer address bar: ",[227,950,951],{},"%userprofile%",[946,953,954,955],{},"Then create the following folder tree ",[227,956,957],{},"Applications\u002Fnodejs",[946,959,960,961,964],{},"Extract the ZIP file contents into the ",[227,962,963],{},"nodejs"," folder.",[218,966,967],{},"You should have a path to the node executable file as follows:",[250,969,972],{"className":970,"code":971,"language":255},[253],"..\u002FApplications\u002Fnodejs\u002Fnode.exe\n",[227,973,971],{"__ignoreMap":258},[268,975,977],{"id":976},"system-configuration","System Configuration",[979,980,981,989,995],"ul",{},[946,982,983,984,988],{},"Press Windows key and search for ",[985,986,987],"em",{},"“Environment Variables”",", there will be two search results.",[946,990,991,992],{},"Click on ",[985,993,994],{},"“Edit environment variables for your account”",[946,996,997],{},"Add the installation location of NodeJS to the User Paths location.",[218,999,1000,1008],{},[934,1001],{"alt":1002,"src":1003,"className":1004},"win-account-env-menu.png","\u002Fimages\u002Fengineering\u002Fsetup\u002Fwin-account-env-menu.png",[1005,1006,1007],"mx-auto","w-auto","mb-4",[934,1009],{"alt":1010,"src":1011,"className":1012},"win-account-env-variable-config.png","\u002Fimages\u002Fengineering\u002Fsetup\u002Fwin-account-env-variable-config.png",[1005,1006,1007],[218,1014,1015],{},"Once the installation location of NodeJS has been added to user paths, check it is installed correctly by opening a new terminal and running:",[250,1017,1021],{"className":1018,"code":1019,"language":1020,"meta":258,"style":258},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","node -v\n","shell",[227,1022,1023],{"__ignoreMap":258},[343,1024,1025,1029],{"class":345,"line":346},[343,1026,1028],{"class":1027},"sBMFI","node",[343,1030,1032],{"class":1031},"sfazB"," -v\n",[1034,1035,1036],"tip",{},"You may need to restart Terminal or your PC for the Path changes to take affect. Ensure all terminal windows are closed including all instances of programs using terminals before running the command.",[278,1038,1041,1063,1070,1074,1086,1126,1139,1142,1150,1160,1171,1176,1193,1198,1217,1235,1247,1250,1254,1261,1270,1273,1277,1283,1296],{"icon":1039,"label":1040},"fa6-brands:github","Setup Package Manager Token",[218,1042,1043,1044,1047,1048,1051,1052,330,1055,1058,1059,1062],{},"ESP projects consume private packages hosted on the ",[222,1045,1046],{},"GitHub Package Registry"," under the ",[227,1049,1050],{},"@es-profiler"," scope. To install these packages locally (via ",[227,1053,1054],{},"yarn install",[227,1056,1057],{},"npm install","), your machine must have a ",[222,1060,1061],{},"GitHub Classic Personal Access Token (PAT)"," configured as an environment variable.",[218,1064,1065,1066,1069],{},"Without this token, package installation will fail with a ",[222,1067,1068],{},"403 Forbidden"," error.",[268,1071,1073],{"id":1072},"step-1-create-a-classic-personal-access-token","Step 1: Create a Classic Personal Access Token",[218,1075,1076,1077,1081,1082,1085],{},"Follow the ",[313,1078,1080],{"href":1079},".\u002Fpersonal-access-token","Personal Access Token guide"," to create a ",[222,1083,1084],{},"Classic token"," with the following scopes:",[1087,1088,1089,1102],"table",{},[1090,1091,1092],"thead",{},[1093,1094,1095,1099],"tr",{},[1096,1097,1098],"th",{},"Scope",[1096,1100,1101],{},"Purpose",[1103,1104,1105,1116],"tbody",{},[1093,1106,1107,1113],{},[1108,1109,1110],"td",{},[227,1111,1112],{},"read:packages",[1108,1114,1115],{},"Download packages from GitHub Package Registry",[1093,1117,1118,1123],{},[1108,1119,1120],{},[227,1121,1122],{},"repo",[1108,1124,1125],{},"Required — ESP packages live in private repositories",[305,1127,1128],{},[218,1129,1130,1133,1134,1138],{},[222,1131,1132],{},"Classic tokens only"," — fine-grained tokens are not supported by the GitHub Package Registry. See the ",[313,1135,1137],{"href":1136},".\u002Fpersonal-access-token#classic-tokens-required-for-github-packages","PAT guide"," for detail on why.",[218,1140,1141],{},"Copy the token value immediately after creation — GitHub will not show it again.",[268,1143,1145,1146,1149],{"id":1144},"step-2-add-node_auth_token-to-your-user-environment-variables","Step 2: Add ",[227,1147,1148],{},"NODE_AUTH_TOKEN"," to your User Environment Variables",[218,1151,1152,1153,1155,1156,1159],{},"Projects are configured to read your token from the ",[227,1154,1148],{}," environment variable. This must be set at the ",[222,1157,1158],{},"user account level"," — not at the system level, as that requires administrator access.",[232,1161,1162,1163,1166,1167,1170],{},"Use ",[222,1164,1165],{},"\"Edit environment variables for your account\""," only. Do ",[222,1168,1169],{},"not"," use \"Edit the system environment variables\" — this requires admin rights and will not work on a standard developer account.",[218,1172,1173],{},[222,1174,1175],{},"On Windows 11:",[943,1177,1178,1188],{},[946,1179,1180,1181,1184,1185],{},"Press the ",[222,1182,1183],{},"Windows key"," and type ",[227,1186,1187],{},"environment variables",[946,1189,1190,1191],{},"Two results will appear — click ",[222,1192,1165],{},[218,1194,1195],{},[934,1196],{"alt":1002,"src":1003,"className":1197},[1005,1006,1007],[943,1199,1200,1214],{"start":605},[946,1201,1202,1203,1206,1207,1210,1211],{},"In the ",[222,1204,1205],{},"\"User variables for \u003Cyour username>\""," section (the ",[222,1208,1209],{},"top"," panel), click ",[222,1212,1213],{},"New...",[946,1215,1216],{},"Fill in the following:",[979,1218,1219,1227],{},[946,1220,1221,1224,1225],{},[222,1222,1223],{},"Variable name:"," ",[227,1226,1148],{},[946,1228,1229,1224,1232],{},[222,1230,1231],{},"Variable value:",[985,1233,1234],{},"(paste your Classic token here)",[943,1236,1237],{"start":820},[946,1238,1239,1240,1243,1244,1246],{},"Click ",[222,1241,1242],{},"OK"," to save, then ",[222,1245,1242],{}," again to close the window.",[1034,1248,1249],{},"Restart any open terminals (and editors like VS Code) after adding the variable for it to take effect.",[268,1251,1253],{"id":1252},"step-3-verify-the-token-is-available","Step 3: Verify the token is available",[218,1255,1256,1257,1260],{},"Open a ",[222,1258,1259],{},"new"," PowerShell or terminal window and run:",[250,1262,1264],{"className":337,"code":1263,"language":339,"meta":258,"style":258},"echo $env:NODE_AUTH_TOKEN\n",[227,1265,1266],{"__ignoreMap":258},[343,1267,1268],{"class":345,"line":346},[343,1269,1263],{},[218,1271,1272],{},"Your token value should be printed. If the output is blank, ensure you fully closed and reopened the terminal after saving.",[268,1274,1276],{"id":1275},"step-4-test-package-installation","Step 4: Test package installation",[218,1278,1279,1280,1282],{},"Navigate to a project that uses ",[227,1281,1050],{}," packages and run:",[250,1284,1286],{"className":1018,"code":1285,"language":1020,"meta":258,"style":258},"yarn install\n",[227,1287,1288],{"__ignoreMap":258},[343,1289,1290,1293],{"class":345,"line":346},[343,1291,1292],{"class":1027},"yarn",[343,1294,1295],{"class":1031}," install\n",[218,1297,1298],{},"If the token is correctly set, packages will download without a 403 error.",[278,1300,1303,1306,1325,1328,1339],{"icon":1301,"label":1302},"fa6-brands:yarn","Setup Yarn",[218,1304,1305],{},"Enable Yarn by running the following command in terminal:",[250,1307,1309],{"className":1018,"code":1308,"language":1020,"meta":258,"style":258},"corepack install -g yarn@stable\n",[227,1310,1311],{"__ignoreMap":258},[343,1312,1313,1316,1319,1322],{"class":345,"line":346},[343,1314,1315],{"class":1027},"corepack",[343,1317,1318],{"class":1031}," install",[343,1320,1321],{"class":1031}," -g",[343,1323,1324],{"class":1031}," yarn@stable\n",[218,1326,1327],{},"Check yarn has been enabled and version 4+ is output:",[250,1329,1331],{"className":1018,"code":1330,"language":1020,"meta":258,"style":258},"yarn -v\n",[227,1332,1333],{"__ignoreMap":258},[343,1334,1335,1337],{"class":345,"line":346},[343,1336,1292],{"class":1027},[343,1338,1032],{"class":1031},[218,1340,1341],{},"This should print out version 4+ and enable you to follow online setup guides for newer versions of Yarn.",[260,1343,1345],{"id":1344},"getting-started-cloning-the-repository","Getting Started: Cloning the Repository",[218,1347,1348,1349,1352],{},"To get started, you must first clone the ",[227,1350,1351],{},"infra-devenv-pro"," repository from GitHub. This repository contains the management tool and all the necessary configuration files.",[305,1354,1355],{},[218,1356,1357,1358,359],{},"Ensure you clone the repository into ",[227,1359,1360],{},"C\\Users\\\u003Cyour-username>\\development",[218,1362,1363],{},"Open a terminal or command prompt and run the following command:",[250,1365,1369],{"className":1366,"code":1367,"language":1368,"meta":258,"style":258},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002FES-Profiler\u002Finfra-devenv-pro.git\n","sh",[227,1370,1371],{"__ignoreMap":258},[343,1372,1373],{"class":345,"line":346},[343,1374,1367],{},[218,1376,1377,1378,1380],{},"This will create a new folder named ",[227,1379,1351],{}," on your machine.",[260,1382,1384],{"id":1383},"running-the-manager","Running the Manager",[218,1386,1387,1388,1391],{},"Open the File Explorer and navigate into the cloned repository folder. To launch the tool, simply double-click and run the ",[227,1389,1390],{},"esprofiler-dev.bat"," file.",[218,1393,1394],{},"This will open a command-line interface, install the necessary dependencies and present you with a menu of options.",[260,1396,1398],{"id":1397},"main-menu-features","Main Menu Features",[218,1400,1401],{},"The manager provides several options to help you manage your development environment.",[1403,1404],"hr",{},[887,1406,1408],{"id":1407},"onboarding-wizard","Onboarding Wizard",[218,1410,1411,1414,1415,1418],{},[222,1412,1413],{},"What it is:"," This is the first step for any new user. The wizard sets up your entire development environment based on the type of work you do.\n",[222,1416,1417],{},"When to use it:"," Run this the very first time you use the tool.",[218,1420,1421,1422,490],{},"The wizard will ask you to select a ",[222,1423,1424],{},"Profile",[979,1426,1427,1433,1439,1445],{},[946,1428,1429,1432],{},[222,1430,1431],{},"Frontend Only",": If you only work on user interfaces (like the Platform SPA or Account Portal), choose this. It will clone only the frontend-related code repositories to your computer. The backend services will run automatically in Docker.",[946,1434,1435,1438],{},[222,1436,1437],{},"Backend Only",": If you only work on APIs and server-side logic, choose this. It will clone only the backend-related code repositories. The frontend services will run automatically in Docker.",[946,1440,1441,1444],{},[222,1442,1443],{},"Fullstack",": If you work on both frontend and backend code, this option is for you. It clones all necessary code repositories and runs other infrastructure services (like databases) in Docker.",[946,1446,1447,1450,1451,1454],{},[222,1448,1449],{},"Q&A",": This profile is for team members who need to run the entire application for testing but do not need to edit the code. ",[222,1452,1453],{},"It WILL NOT clone any code repositories","; instead, it runs all services (both frontend and backend) inside Docker.",[218,1456,1457,1458,1461,1462,1465],{},"After you select a profile, the wizard will clone the relevant repositories into a ",[227,1459,1460],{},"development"," folder located in your user's home directory (e.g., ",[227,1463,1464],{},"C:\\Users\\YourName\\development",").",[1403,1467],{},[887,1469,1471],{"id":1470},"configure-environment","Configure Environment",[218,1473,1474,1476,1477,1479],{},[222,1475,1413],{}," This option lets you change your setup after the initial onboarding.\n",[222,1478,1417],{}," Use this if you need to switch profiles or use a specific version of a service.",[218,1481,1482],{},"You can perform two main actions here:",[943,1484,1485,1503],{},[946,1486,1487,1490,1491,1494,1495,1494,1498,1494,1500,1502],{},[222,1488,1489],{},"Change Profile",": You can switch between the profiles described above (",[227,1492,1493],{},"Frontend",", ",[227,1496,1497],{},"Backend",[227,1499,1443],{},[227,1501,1449],{},") at any time.",[946,1504,1505,1508,1509,1511,1512,1515,1516,1519,1520,1523,1524,1527,1528,1531,1532],{},[222,1506,1507],{},"Override Container Tags",": For any service that runs in Docker (i.e., the parts of the application you are ",[985,1510,1169],{}," developing locally), you can specify a version. The default is ",[227,1513,1514],{},"latest",", but you might want to use a specific version for testing, for example, ",[227,1517,1518],{},"feature-branch-name",". This gives you fine-grained control over your environment. Not, if a branch has a ",[227,1521,1522],{},"\u002F"," in it, then this will be changed to a ",[227,1525,1526],{},"-"," in the image name, e.g. ",[227,1529,1530],{},"improvement\u002Fmy-improvement"," will be available as ",[227,1533,1534],{},"improvement-my-improvement",[1403,1536],{},[887,1538,1540],{"id":1539},"updaterebuild","Update\u002FRebuild",[218,1542,1543,1545,1546,1548],{},[222,1544,1413],{}," This option updates both the management tool and your running Docker services.\n",[222,1547,1417],{}," Run this periodically to ensure you have the latest code and features.",[218,1550,1551],{},"This action does two things:",[943,1553,1554,1560],{},[946,1555,1556,1557,1559],{},"Pulls the latest changes for the ",[227,1558,1351],{}," tool itself.",[946,1561,1562],{},"Rebuilds all the Docker containers, pulling the newest available images for all services. This ensures your environment is up-to-date.",[1403,1564],{},[887,1566,1568],{"id":1567},"import-volume","Import Volume",[218,1570,1571,1573,1574,1576],{},[222,1572,1413],{}," A \"volume\" is where Docker stores persistent data, like a database. This option lets you load pre-packaged data into your environment.\n",[222,1575,1417],{}," Use this when you need a specific dataset for testing, such as an empty database, a partially filled one, or a large, production-like one.",[218,1578,1579,1580,1583],{},"You will be asked to choose a volume (e.g., ",[227,1581,1582],{},"esp-database-8"," for the main database) and then a \"tag\" for the data you want to import:",[979,1585,1586,1592,1598],{},[946,1587,1588,1591],{},[227,1589,1590],{},"empty",": A clean slate.",[946,1593,1594,1597],{},[227,1595,1596],{},"partial",": A small amount of sample data.",[946,1599,1600,1603],{},[227,1601,1602],{},"heavy",": A large dataset for more comprehensive testing.",[1403,1605],{},[887,1607,1609],{"id":1608},"export-volume","Export Volume",[218,1611,1612,1614,1615,1617],{},[222,1613,1413],{}," This is the reverse of importing. It packages your local data volume into a shareable image.\n",[222,1616,1417],{}," Use this if you have created a specific data setup (e.g., for a bug reproduction or a new feature) that you want to share with other team members. You will be prompted to give your export a \"tag\" (name).",[1403,1619],{},[887,1621,1623],{"id":1622},"startstop-environment","Start\u002FStop Environment",[979,1625,1626,1632],{},[946,1627,1628,1631],{},[222,1629,1630],{},"Start Environment",": Starts all the Docker containers associated with your currently configured profile.",[946,1633,1634,1637],{},[222,1635,1636],{},"Stop Environment",": Shuts down all running services.",[1403,1639],{},[887,1641,1643],{"id":1642},"reset-config","Reset Config",[218,1645,1646,1648,1649,355,1652,1655,1656,1658,1659,1661],{},[222,1647,1413],{}," This deletes your local configuration (",[227,1650,1651],{},"config.json",[227,1653,1654],{},".env",").\n",[222,1657,1417],{}," Use this only if your configuration is broken and you want to start over from scratch. After resetting, you will need to run the ",[222,1660,1408],{}," again.",[1403,1663],{},[260,1665,1667],{"id":1666},"local-login-credentials","Local Login Credentials",[218,1669,1670],{},"How to log in to ESP Platform, Account Portal and Vendor Portal.",[218,1672,1673],{},"A local development environment login account is available for all the front-end app services:",[250,1675,1678],{"className":1676,"code":1677,"language":255},[253],"Username: user@esprofiler.com\nPassword: ESProfiler@123\n",[227,1679,1677],{"__ignoreMap":258},[1681,1682,1683],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":258,"searchDepth":429,"depth":429,"links":1685},[1686,1690,1691,1692,1701],{"id":262,"depth":429,"text":263,"children":1687},[1688,1689],{"id":889,"depth":605,"text":890},{"id":896,"depth":605,"text":897},{"id":1344,"depth":429,"text":1345},{"id":1383,"depth":429,"text":1384},{"id":1397,"depth":429,"text":1398,"children":1693},[1694,1695,1696,1697,1698,1699,1700],{"id":1407,"depth":605,"text":1408},{"id":1470,"depth":605,"text":1471},{"id":1539,"depth":605,"text":1540},{"id":1567,"depth":605,"text":1568},{"id":1608,"depth":605,"text":1609},{"id":1622,"depth":605,"text":1623},{"id":1642,"depth":605,"text":1643},{"id":1666,"depth":429,"text":1667},"This guide provides a detailed walkthrough of the ESProfiler Development Environment Manager (DevEnvPro), a tool designed to simplify setting up and managing your local development environment.","md",null,{},{"title":81,"description":1702},"tBEZlzKseC7No1tQanPCzgEsM3sLbUTJpaV9CQQ3YKc",[1709,1711],{"title":72,"path":73,"stem":74,"description":1710,"children":-1},"The checklist for onboarding new members in the team, and helpful guides for new employees at ESProfiler.",{"title":85,"path":86,"stem":87,"description":1712,"children":-1},"If you're contributing to ESProfiler, this section provides you with quick links to tools, resources and best practices to help you in your day-to-day role and work seamlessly with the rest of the engineering team.",1778263956048]