diff --git a/apps/deploy-web/env/.env b/apps/deploy-web/env/.env index 62748f51e..9a707a612 100644 --- a/apps/deploy-web/env/.env +++ b/apps/deploy-web/env/.env @@ -4,3 +4,10 @@ AUTH0_SCOPE=openid profile email offline_access NEXT_PUBLIC_SENTRY_DSN="https://2d6f725d1cd34086995df50a5d7192f0@o877251.ingest.sentry.io/4504656428204032" NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID="2b2b3e1d953d33bd3b3e2c864edd2dea" NEXT_PUBLIC_SENTRY_APPLICATION_KEY="AKASH-CONSOLE-WEB" + + +NEXT_PUBLIC_REDIRECT_URI='https://console.akash.network/new-deployment' +NEXT_PUBLIC_GITHUB_APP_INSTALLATION_URL='https://github.com/apps/akash-console-build-and-deploy-app/installations/new' +NEXT_PUBLIC_BITBUCKET_CLIENT_ID=tdH2xfRkTcdqVP6cwW +NEXT_PUBLIC_GITHUB_CLIENT_ID=Iv23lidSwihrsSL7aGew +NEXT_PUBLIC_GITLAB_CLIENT_ID=beb5370aad2fdb6147edb44248d20d30c3e189ddfb40c26f651c77bbe949d5a8 \ No newline at end of file diff --git a/apps/deploy-web/env/.env.sample b/apps/deploy-web/env/.env.sample index 6bd69d4a1..01225de21 100644 --- a/apps/deploy-web/env/.env.sample +++ b/apps/deploy-web/env/.env.sample @@ -26,4 +26,9 @@ NEXT_PUBLIC_GA_MEASUREMENT_ID= BASE_API_MAINNET_URL= BASE_API_TESTNET_URL= -BASE_API_SANDBOX_URL= \ No newline at end of file +BASE_API_SANDBOX_URL= + +NEXT_PUBLIC_REDIRECT_URI= +NEXT_PUBLIC_GITHUB_APP_INSTALLATION_URL= +NEXT_PUBLIC_BITBUCKET_CLIENT_ID= +NEXT_PUBLIC_GITLAB_CLIENT_ID= \ No newline at end of file diff --git a/apps/deploy-web/next.config.js b/apps/deploy-web/next.config.js index 93ca1d679..ab9e9d421 100644 --- a/apps/deploy-web/next.config.js +++ b/apps/deploy-web/next.config.js @@ -30,7 +30,7 @@ const moduleExports = { styledComponents: true }, images: { - domains: ["raw.githubusercontent.com"] + domains: ["raw.githubusercontent.com", "avatars.githubusercontent.com"] }, output: "standalone", typescript: { diff --git a/apps/deploy-web/package.json b/apps/deploy-web/package.json index 7df741c14..31a148413 100644 --- a/apps/deploy-web/package.json +++ b/apps/deploy-web/package.json @@ -61,6 +61,7 @@ "clsx": "^2.0.0", "cosmjs-types": "^0.9.0", "date-fns": "^2.29.3", + "dotenv": "^16.4.5", "file-saver": "^2.0.5", "geist": "^1.3.0", "http-proxy": "^1.18.1", @@ -116,6 +117,7 @@ "@akashnetwork/dev-config": "*", "@keplr-wallet/types": "^0.12.111", "@next/bundle-analyzer": "^14.0.1", + "@octokit/openapi-types": "^22.2.0", "@playwright/test": "^1.45.0", "@release-it/conventional-changelog": "github:akash-network/conventional-changelog#feature/pre-release", "@types/auth0": "^2.35.3", diff --git a/apps/deploy-web/public/sw.js b/apps/deploy-web/public/sw.js index bbda7e773..2ce6ae3a1 100644 --- a/apps/deploy-web/public/sw.js +++ b/apps/deploy-web/public/sw.js @@ -1,2 +1,2 @@ -if(!self.define){let e,s={};const a=(a,c)=>(a=new URL(a+".js",c).href,s[a]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()})).then((()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e})));self.define=(c,i)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(s[n])return;let t={};const d=e=>a(e,n),r={module:{uri:n},exports:t,require:d};s[n]=Promise.all(c.map((e=>r[e]||d(e)))).then((e=>(i(...e),t)))}}define(["./workbox-495fd258"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/chunks/1134-f1edfac271d26e5d.js",revision:"f1edfac271d26e5d"},{url:"/_next/static/chunks/1134-f1edfac271d26e5d.js.map",revision:"e79c7d1bc47fca0b2185fb775c231609"},{url:"/_next/static/chunks/1270-0734ab044ebb64ed.js",revision:"0734ab044ebb64ed"},{url:"/_next/static/chunks/1270-0734ab044ebb64ed.js.map",revision:"d33dfd3bd538ffb4a54bc8e89e0f2c66"},{url:"/_next/static/chunks/1280-41e6f846a7c47308.js",revision:"41e6f846a7c47308"},{url:"/_next/static/chunks/1280-41e6f846a7c47308.js.map",revision:"894f12d9e7c6e05cd5749221dd7690cd"},{url:"/_next/static/chunks/1506-59339618eab7447f.js",revision:"59339618eab7447f"},{url:"/_next/static/chunks/1506-59339618eab7447f.js.map",revision:"c3f93039cacaa6638d5925b4ec8773dd"},{url:"/_next/static/chunks/1588-b199eef3be0d22d1.js",revision:"b199eef3be0d22d1"},{url:"/_next/static/chunks/1588-b199eef3be0d22d1.js.map",revision:"f1625eb6f0470b2de90dfb5a40d0782f"},{url:"/_next/static/chunks/1733-6dae128c8882ae62.js",revision:"6dae128c8882ae62"},{url:"/_next/static/chunks/1733-6dae128c8882ae62.js.map",revision:"f28d25436493bce881bd875460377953"},{url:"/_next/static/chunks/1864-a108b3603800e036.js",revision:"a108b3603800e036"},{url:"/_next/static/chunks/1864-a108b3603800e036.js.map",revision:"d59eb0a87c8bfb233ab3a00bed27cbfd"},{url:"/_next/static/chunks/2000-c850bd696cec2098.js",revision:"c850bd696cec2098"},{url:"/_next/static/chunks/2000-c850bd696cec2098.js.map",revision:"f18ae09cab455616d4915ee0de5bace2"},{url:"/_next/static/chunks/237-77a0396adc433bd3.js",revision:"77a0396adc433bd3"},{url:"/_next/static/chunks/237-77a0396adc433bd3.js.map",revision:"68187fa1002c401b155407711b422aef"},{url:"/_next/static/chunks/2615.cd4ca347223d657b.js",revision:"cd4ca347223d657b"},{url:"/_next/static/chunks/2615.cd4ca347223d657b.js.map",revision:"1972319efd41267ca80b39c164a6796d"},{url:"/_next/static/chunks/2674-72d9141ee61fa622.js",revision:"72d9141ee61fa622"},{url:"/_next/static/chunks/2674-72d9141ee61fa622.js.map",revision:"3c32c5ad19bb626530fb893892bd5a9e"},{url:"/_next/static/chunks/2716.fbbb58a2fbd79f67.js",revision:"fbbb58a2fbd79f67"},{url:"/_next/static/chunks/2716.fbbb58a2fbd79f67.js.map",revision:"b68932a41f667aac4bf4908248d77ca3"},{url:"/_next/static/chunks/2721-03484ed4a5ba7909.js",revision:"03484ed4a5ba7909"},{url:"/_next/static/chunks/2721-03484ed4a5ba7909.js.map",revision:"fdd1d6c4710b1d16d4b26daadfea6805"},{url:"/_next/static/chunks/2928.24a5a7c6f2f41f01.js",revision:"24a5a7c6f2f41f01"},{url:"/_next/static/chunks/2928.24a5a7c6f2f41f01.js.map",revision:"b25fde6e17b20bb5c55d728e6c09f7dd"},{url:"/_next/static/chunks/309-315e2c4b6959711a.js",revision:"315e2c4b6959711a"},{url:"/_next/static/chunks/309-315e2c4b6959711a.js.map",revision:"53017df15ff8d7365dd26b601d37f571"},{url:"/_next/static/chunks/3472-5775d3204a43bb60.js",revision:"5775d3204a43bb60"},{url:"/_next/static/chunks/3472-5775d3204a43bb60.js.map",revision:"536284bc522d5bafec82550bc2ac588f"},{url:"/_next/static/chunks/4099-b8578ac08ce318de.js",revision:"b8578ac08ce318de"},{url:"/_next/static/chunks/4099-b8578ac08ce318de.js.map",revision:"6e0c00fd33fc9203177613edda0ec3e1"},{url:"/_next/static/chunks/4390-bdb1d1c03df50067.js",revision:"bdb1d1c03df50067"},{url:"/_next/static/chunks/4390-bdb1d1c03df50067.js.map",revision:"f1d3a16d4240515d61fb29d73312b49b"},{url:"/_next/static/chunks/4569-e0285edc701b296e.js",revision:"e0285edc701b296e"},{url:"/_next/static/chunks/4569-e0285edc701b296e.js.map",revision:"691508a604f84c8b6b6d26f5d4039d0e"},{url:"/_next/static/chunks/4608.3b915ba50845ff19.js",revision:"3b915ba50845ff19"},{url:"/_next/static/chunks/4608.3b915ba50845ff19.js.map",revision:"9ddf1792a967355dc0cc2c8210d10885"},{url:"/_next/static/chunks/4618-a672f9bf086f841f.js",revision:"a672f9bf086f841f"},{url:"/_next/static/chunks/4618-a672f9bf086f841f.js.map",revision:"b778fcb3871b0a771fa73b3229a148c1"},{url:"/_next/static/chunks/477-88f9c85ab59dd63e.js",revision:"88f9c85ab59dd63e"},{url:"/_next/static/chunks/477-88f9c85ab59dd63e.js.map",revision:"cdf4353cf93f90df7e14df521e6b973b"},{url:"/_next/static/chunks/4800.2f1701ea0540caf1.js",revision:"2f1701ea0540caf1"},{url:"/_next/static/chunks/4800.2f1701ea0540caf1.js.map",revision:"577f6acf828690e23d10ae0dcec8e1a9"},{url:"/_next/static/chunks/4961.1cb207cc3bd56017.js",revision:"1cb207cc3bd56017"},{url:"/_next/static/chunks/4961.1cb207cc3bd56017.js.map",revision:"efb5ba432f00515eba6775a083f21c10"},{url:"/_next/static/chunks/5102-cbbec4d175f05d83.js",revision:"cbbec4d175f05d83"},{url:"/_next/static/chunks/5102-cbbec4d175f05d83.js.map",revision:"986f67bb4091d5b51e33077cab68d45b"},{url:"/_next/static/chunks/5356-d7f4891c2cf8ad20.js",revision:"d7f4891c2cf8ad20"},{url:"/_next/static/chunks/5356-d7f4891c2cf8ad20.js.map",revision:"2df33605b8bd477763cdb231595433da"},{url:"/_next/static/chunks/5580-b0c78a61d8a0c621.js",revision:"b0c78a61d8a0c621"},{url:"/_next/static/chunks/5580-b0c78a61d8a0c621.js.map",revision:"92ec561a58b3b5a0703885a7d057b75a"},{url:"/_next/static/chunks/6033-ccabda622fc6a68c.js",revision:"ccabda622fc6a68c"},{url:"/_next/static/chunks/6033-ccabda622fc6a68c.js.map",revision:"569a1422365b1f2326ca5594ac9e0f24"},{url:"/_next/static/chunks/6310-6ac0f2df10accef8.js",revision:"6ac0f2df10accef8"},{url:"/_next/static/chunks/6310-6ac0f2df10accef8.js.map",revision:"e6136fa5290d3969ac41a697a5a37051"},{url:"/_next/static/chunks/6424.afd408d2a0a8aa78.js",revision:"afd408d2a0a8aa78"},{url:"/_next/static/chunks/6424.afd408d2a0a8aa78.js.map",revision:"06a1e277ef6809ad36ed4fde2d391baf"},{url:"/_next/static/chunks/6778.eb8dbdfb58565a2a.js",revision:"eb8dbdfb58565a2a"},{url:"/_next/static/chunks/6778.eb8dbdfb58565a2a.js.map",revision:"b99aaa9833f399c9e578a997dbeffc14"},{url:"/_next/static/chunks/6dd150ba.ec75e8e489a567a9.js",revision:"ec75e8e489a567a9"},{url:"/_next/static/chunks/6dd150ba.ec75e8e489a567a9.js.map",revision:"0958db114513904932a656bdf3630b27"},{url:"/_next/static/chunks/7015.081c061481193a2b.js",revision:"081c061481193a2b"},{url:"/_next/static/chunks/7015.081c061481193a2b.js.map",revision:"f724c855b4dd5742c534416086c78ddc"},{url:"/_next/static/chunks/7725.758b246f86e835a1.js",revision:"758b246f86e835a1"},{url:"/_next/static/chunks/7725.758b246f86e835a1.js.map",revision:"55f3162732eec5cb268a6a2949757c91"},{url:"/_next/static/chunks/7879-2ee883c40233c9ae.js",revision:"2ee883c40233c9ae"},{url:"/_next/static/chunks/7879-2ee883c40233c9ae.js.map",revision:"e5843b3eafc79757795c25c292815768"},{url:"/_next/static/chunks/87d427d2-4b3f96f2a3f4b743.js",revision:"4b3f96f2a3f4b743"},{url:"/_next/static/chunks/8871-48f526e1254c05a0.js",revision:"48f526e1254c05a0"},{url:"/_next/static/chunks/8871-48f526e1254c05a0.js.map",revision:"852fa993ff14c56ee43cf71becc9d086"},{url:"/_next/static/chunks/9227-252d36e47e055305.js",revision:"252d36e47e055305"},{url:"/_next/static/chunks/9227-252d36e47e055305.js.map",revision:"eb8b0546fd77062abc9da89b93c29d86"},{url:"/_next/static/chunks/9433.257cddc15e70fce2.js",revision:"257cddc15e70fce2"},{url:"/_next/static/chunks/9433.257cddc15e70fce2.js.map",revision:"8cf7ed2b43a1c3b9b069e0f7c4f853c9"},{url:"/_next/static/chunks/9435.4f5fb53b3c8e87ec.js",revision:"4f5fb53b3c8e87ec"},{url:"/_next/static/chunks/9435.4f5fb53b3c8e87ec.js.map",revision:"9ecfe5c24f8a95c077191088e2acb109"},{url:"/_next/static/chunks/9534-13d530c02b55e7fa.js",revision:"13d530c02b55e7fa"},{url:"/_next/static/chunks/9534-13d530c02b55e7fa.js.map",revision:"db50baa394f1781bfc6039d937009824"},{url:"/_next/static/chunks/framework-8383bf789d61bcef.js",revision:"8383bf789d61bcef"},{url:"/_next/static/chunks/framework-8383bf789d61bcef.js.map",revision:"a115d423eec304cd979739160b33710b"},{url:"/_next/static/chunks/main-6975c9c4f12c2805.js",revision:"6975c9c4f12c2805"},{url:"/_next/static/chunks/main-6975c9c4f12c2805.js.map",revision:"4f71ba4539244afdd855de7b4f5e464c"},{url:"/_next/static/chunks/pages/404-4417be13257199c8.js",revision:"4417be13257199c8"},{url:"/_next/static/chunks/pages/404-4417be13257199c8.js.map",revision:"7cb8b31b01844b38e51705b00ae7215b"},{url:"/_next/static/chunks/pages/500-6ef94004508219c2.js",revision:"6ef94004508219c2"},{url:"/_next/static/chunks/pages/500-6ef94004508219c2.js.map",revision:"80b151ec4b36caf67ad9d7d5aca386b3"},{url:"/_next/static/chunks/pages/_error-27e6d24952261c74.js",revision:"27e6d24952261c74"},{url:"/_next/static/chunks/pages/_error-27e6d24952261c74.js.map",revision:"85666421135cfb6874e03f36be2d9d25"},{url:"/_next/static/chunks/pages/contact-1e955792ce8b72fa.js",revision:"1e955792ce8b72fa"},{url:"/_next/static/chunks/pages/contact-1e955792ce8b72fa.js.map",revision:"4d85419ec79b8ed6b40a66a34aec5af3"},{url:"/_next/static/chunks/pages/deploy-linux-9b394412a7839cae.js",revision:"9b394412a7839cae"},{url:"/_next/static/chunks/pages/deploy-linux-9b394412a7839cae.js.map",revision:"ad84c96b0b137c911548f58f5fbc98ae"},{url:"/_next/static/chunks/pages/deployments-56a4224f26930706.js",revision:"56a4224f26930706"},{url:"/_next/static/chunks/pages/deployments-56a4224f26930706.js.map",revision:"4a975554aa15d86c93622e4d036a0398"},{url:"/_next/static/chunks/pages/deployments/%5Bdseq%5D-26973b12b5a730c1.js",revision:"26973b12b5a730c1"},{url:"/_next/static/chunks/pages/deployments/%5Bdseq%5D-26973b12b5a730c1.js.map",revision:"00f9b11701925220c237bfa4ffc88f02"},{url:"/_next/static/chunks/pages/faq-8989d2648405e633.js",revision:"8989d2648405e633"},{url:"/_next/static/chunks/pages/faq-8989d2648405e633.js.map",revision:"c6bc257c6f67248c5ab329e0cf390b5c"},{url:"/_next/static/chunks/pages/get-started-24d23ecc37a72161.js",revision:"24d23ecc37a72161"},{url:"/_next/static/chunks/pages/get-started-24d23ecc37a72161.js.map",revision:"3e11b3dfd15583cb27ba27b38ef57425"},{url:"/_next/static/chunks/pages/get-started/wallet-dae103639db14ded.js",revision:"dae103639db14ded"},{url:"/_next/static/chunks/pages/get-started/wallet-dae103639db14ded.js.map",revision:"501f129d78e773fe911251c1608abdb2"},{url:"/_next/static/chunks/pages/index-6b4aec9c233e635c.js",revision:"6b4aec9c233e635c"},{url:"/_next/static/chunks/pages/index-6b4aec9c233e635c.js.map",revision:"bf6172c0222baeb70d4e96c6a8f3f3d6"},{url:"/_next/static/chunks/pages/maintenance-dd3056ef5d884017.js",revision:"dd3056ef5d884017"},{url:"/_next/static/chunks/pages/maintenance-dd3056ef5d884017.js.map",revision:"475186a4149d1d52900b5fe2fa4b3865"},{url:"/_next/static/chunks/pages/new-deployment-d14e20405e147554.js",revision:"d14e20405e147554"},{url:"/_next/static/chunks/pages/new-deployment-d14e20405e147554.js.map",revision:"459cba368145859ad3b1d2b7aca740de"},{url:"/_next/static/chunks/pages/privacy-policy-bd363e256d8c8604.js",revision:"bd363e256d8c8604"},{url:"/_next/static/chunks/pages/privacy-policy-bd363e256d8c8604.js.map",revision:"3ef5088cffe9fff700f27dfc7b560c92"},{url:"/_next/static/chunks/pages/profile/%5Busername%5D-040828a4cad3196d.js",revision:"040828a4cad3196d"},{url:"/_next/static/chunks/pages/profile/%5Busername%5D-040828a4cad3196d.js.map",revision:"42a4977a08eac34836dda74c2ae31acd"},{url:"/_next/static/chunks/pages/providers-dc35c788d5cf830a.js",revision:"dc35c788d5cf830a"},{url:"/_next/static/chunks/pages/providers-dc35c788d5cf830a.js.map",revision:"5b2c4f7f13e6d999c0f918c80f85c8df"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D-20ef01163df8b2af.js",revision:"20ef01163df8b2af"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D-20ef01163df8b2af.js.map",revision:"8f6cd8934b660efa0614ebecece93f8b"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-347b1cb1e7b59c29.js",revision:"347b1cb1e7b59c29"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-347b1cb1e7b59c29.js.map",revision:"81e60d5141936aa753e9f8fcd48be1d9"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-8287e6b45bd96228.js",revision:"8287e6b45bd96228"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-8287e6b45bd96228.js.map",revision:"0c5431b02683623fdcef1c364278547e"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-45a89f0fbd2eda97.js",revision:"45a89f0fbd2eda97"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-45a89f0fbd2eda97.js.map",revision:"1fac9de8b58a75bf30f2f4dc47ecbccf"},{url:"/_next/static/chunks/pages/rent-gpu-72ff0e7372d535b7.js",revision:"72ff0e7372d535b7"},{url:"/_next/static/chunks/pages/rent-gpu-72ff0e7372d535b7.js.map",revision:"4ca2f3554ec80c1e82079c752edbbe90"},{url:"/_next/static/chunks/pages/sdl-builder-9bf09079bc6e146e.js",revision:"9bf09079bc6e146e"},{url:"/_next/static/chunks/pages/sdl-builder-9bf09079bc6e146e.js.map",revision:"927fd59a73ecf000df8280d4a12c2ea3"},{url:"/_next/static/chunks/pages/settings-2fac8bbf7cf6ada0.js",revision:"2fac8bbf7cf6ada0"},{url:"/_next/static/chunks/pages/settings-2fac8bbf7cf6ada0.js.map",revision:"14cbccaa583f11a72c9f74d814459165"},{url:"/_next/static/chunks/pages/settings/authorizations-70107e1d800dc033.js",revision:"70107e1d800dc033"},{url:"/_next/static/chunks/pages/settings/authorizations-70107e1d800dc033.js.map",revision:"46b7a80f41d374d101dc4dbf0c165bda"},{url:"/_next/static/chunks/pages/template/%5Bid%5D-44ff2920dc401c02.js",revision:"44ff2920dc401c02"},{url:"/_next/static/chunks/pages/template/%5Bid%5D-44ff2920dc401c02.js.map",revision:"e54d8b9f5c3622fbb056b16b9945345d"},{url:"/_next/static/chunks/pages/templates-b5e3c559fdb3b26d.js",revision:"b5e3c559fdb3b26d"},{url:"/_next/static/chunks/pages/templates-b5e3c559fdb3b26d.js.map",revision:"b3ad3d062fc456b3d0355b5c04ebe765"},{url:"/_next/static/chunks/pages/templates/%5BtemplateId%5D-d894f6fcad4f4161.js",revision:"d894f6fcad4f4161"},{url:"/_next/static/chunks/pages/templates/%5BtemplateId%5D-d894f6fcad4f4161.js.map",revision:"e74913e2f2358affd5b737c41a57965b"},{url:"/_next/static/chunks/pages/terms-of-service-b1ef7819fd159dfd.js",revision:"b1ef7819fd159dfd"},{url:"/_next/static/chunks/pages/terms-of-service-b1ef7819fd159dfd.js.map",revision:"352963282161075819c0c99fdc7dce20"},{url:"/_next/static/chunks/pages/user/settings-29cafa9bd4331609.js",revision:"29cafa9bd4331609"},{url:"/_next/static/chunks/pages/user/settings-29cafa9bd4331609.js.map",revision:"1c96f061d2b88b218f339d350e1c1469"},{url:"/_next/static/chunks/pages/user/settings/address-book-eb0a6eb5d529ba06.js",revision:"eb0a6eb5d529ba06"},{url:"/_next/static/chunks/pages/user/settings/address-book-eb0a6eb5d529ba06.js.map",revision:"9abd2c939d137b55f9eb95ba8ddced45"},{url:"/_next/static/chunks/pages/user/settings/favorites-149808cbece37163.js",revision:"149808cbece37163"},{url:"/_next/static/chunks/pages/user/settings/favorites-149808cbece37163.js.map",revision:"61b27c158da733d82cc486a418f148e6"},{url:"/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js",revision:"79330112775102f91e1010318bae2bd3"},{url:"/_next/static/chunks/webpack-20a180bb907816e2.js",revision:"20a180bb907816e2"},{url:"/_next/static/chunks/webpack-20a180bb907816e2.js.map",revision:"ae4b6cdf6fad54ae2cec4763924e0fe0"},{url:"/_next/static/css/54c1a5d817f16a82.css",revision:"54c1a5d817f16a82"},{url:"/_next/static/css/60da0364ed65e94f.css",revision:"60da0364ed65e94f"},{url:"/_next/static/css/60da0364ed65e94f.css.map",revision:"7ebdaca80e1b94a3afdc509e9729e2f4"},{url:"/_next/static/css/85fa6dafca566008.css",revision:"85fa6dafca566008"},{url:"/_next/static/css/85fa6dafca566008.css.map",revision:"e1c00d68c2a092625defb4c86bdb56ae"},{url:"/_next/static/mbgmrS0y5fl-D-YnFDNib/_buildManifest.js",revision:"e68c89cc08f1d0b966204b94ee2a5c88"},{url:"/_next/static/mbgmrS0y5fl-D-YnFDNib/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/media/e11418ac562b8ac1-s.p.woff2",revision:"0e46e732cced180e3a2c7285100f27d4"},{url:"/akash-console.png",revision:"4ab11b341159b007fc63d28631e0a8d8"},{url:"/android-chrome-192x192.png",revision:"a2eeed7b0d4a8c9bd9fa014378ac733e"},{url:"/android-chrome-256x256.png",revision:"b0dc3017fadbf0f4c323636535f582b7"},{url:"/android-chrome-384x384.png",revision:"3fae18e8537ff0745221e5aec66c247b"},{url:"/apple-touch-icon.png",revision:"43451e961475b8323dcfb705fb6eb480"},{url:"/browserconfig.xml",revision:"389eabe3c9a90736f426109c84458455"},{url:"/favicon-16x16.png",revision:"8cf7a2775f6f6d6db07b95197538b11b"},{url:"/favicon-32x32.png",revision:"bef7d8e9aaed7fb3ef49cbffa31b5339"},{url:"/favicon.ico",revision:"cfebc107c597696c596a277239546a86"},{url:"/images/akash-logo-dark.png",revision:"b1623e407dad710a4c0c73461bbb8bb3"},{url:"/images/akash-logo-flat-dark.png",revision:"50b4ad6438e791047d97da0af65b96f5"},{url:"/images/akash-logo-flat-light.png",revision:"2befec2d17a2b6a32b1a0517ca1baf01"},{url:"/images/akash-logo-light.png",revision:"0ea30905c72eda674ad74c65d0c062bf"},{url:"/images/akash-logo.svg",revision:"be6715fe32a9ad342a59c397f2e455c0"},{url:"/images/chains/akash.png",revision:"d0b3f8ccaa3b0d18ef4039f86edf4436"},{url:"/images/chains/atom.png",revision:"6e4d88ad2c295e811fee29cc89edfcb1"},{url:"/images/chains/evmos.png",revision:"487a456e9091dec9ddf18892531401f8"},{url:"/images/chains/huahua.png",revision:"f0ba8427522833bba44962e87e982412"},{url:"/images/chains/juno.png",revision:"933b7d992dc67fd2f0d0f35e182b3361"},{url:"/images/chains/kuji.png",revision:"9c31e679007e5ae16fc28e067d907f79"},{url:"/images/chains/osmo.png",revision:"6940c69c28e5d85d99ba498fc7e95a26"},{url:"/images/chains/scrt.png",revision:"0dd98be17447cf7c47d27153f534ca60"},{url:"/images/chains/stars.png",revision:"56d0bd40e52f010c7267eb78c53138f2"},{url:"/images/chains/strd.png",revision:"eebdfb53ba0bc9bba88b0bede7a44f6d"},{url:"/images/cloudmos-logo-light.png",revision:"a7423327e4280225e176da92c6176c28"},{url:"/images/cloudmos-logo-small.jpg",revision:"4b339b83e7dc396894537b83d794726d"},{url:"/images/cloudmos-logo.png",revision:"56d87e0230a0ad5dd745efd486a33a58"},{url:"/images/docker.png",revision:"fde0ed6a2add0ffabfbc5a7749fdfff2"},{url:"/images/faq/change-node.png",revision:"9421f6443f6c4397887035e50d8c9b24"},{url:"/images/faq/update-deployment-btn.png",revision:"ebc7f6907a08fdf6a6cd5a87043456fd"},{url:"/images/keplr-logo.png",revision:"50397e4902a33a6045c0f23dfe5cb1bd"},{url:"/images/leap-cosmos-logo.png",revision:"a54ced7748b33565e6dc1ea1c5b1ef52"},{url:"/images/powered-by-akash-dark.svg",revision:"2a5c50d964ae8578b76af3829e25e9be"},{url:"/images/powered-by-akash.svg",revision:"a8d720b6750092d5e4696a4e1a06859b"},{url:"/images/ubuntu.png",revision:"c631b8fae270a618c1fe1c9d43097189"},{url:"/images/wallet-connect-logo.png",revision:"8379e4d4e7267b47a0b5b89807a4d8f8"},{url:"/manifest.json",revision:"e1124d72dfaaaeded3a11372e3508e6c"},{url:"/mstile-150x150.png",revision:"17614fed638be1d5e2225b9d5419336a"},{url:"/robots.txt",revision:"f221cfd87bacaa726943e34b2629c37f"},{url:"/safari-pinned-tab.svg",revision:"c51530560c75152b849bb467e50a8b76"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:s,event:a,state:c})=>s&&"opaqueredirect"===s.type?new Response(s.body,{status:200,statusText:"OK",headers:s.headers}):s}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const s=e.pathname;return!s.startsWith("/api/auth/")&&!!s.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); +if(!self.define){let e,a={};const s=(s,c)=>(s=new URL(s+".js",c).href,a[s]||new Promise((a=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=a,document.head.appendChild(e)}else e=s,importScripts(s),a()})).then((()=>{let e=a[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e})));self.define=(c,i)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(a[n])return;let t={};const d=e=>s(e,n),r={module:{uri:n},exports:t,require:d};a[n]=Promise.all(c.map((e=>r[e]||d(e)))).then((e=>(i(...e),t)))}}define(["./workbox-495fd258"],(function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/_next/static/JjcVAQOnFZXbatLlLhuHr/_buildManifest.js",revision:"652b453ea29668941d7bb825e45e725a"},{url:"/_next/static/JjcVAQOnFZXbatLlLhuHr/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/_next/static/chunks/1134-060024805396f93f.js",revision:"060024805396f93f"},{url:"/_next/static/chunks/1134-060024805396f93f.js.map",revision:"f58aa85db8737f159077a35d0aed08e5"},{url:"/_next/static/chunks/1166-a239214ef6d24b1a.js",revision:"a239214ef6d24b1a"},{url:"/_next/static/chunks/1166-a239214ef6d24b1a.js.map",revision:"bc1ecf445889a998e6486414b1500749"},{url:"/_next/static/chunks/1189.4cc1e5c1defa42f3.js",revision:"4cc1e5c1defa42f3"},{url:"/_next/static/chunks/1189.4cc1e5c1defa42f3.js.map",revision:"d4ad4c5c22a1c08ec27ca71b306bf6a1"},{url:"/_next/static/chunks/1199.401caaa57d9d4991.js",revision:"401caaa57d9d4991"},{url:"/_next/static/chunks/1199.401caaa57d9d4991.js.map",revision:"e04d19e0101489c55b7708494343fb01"},{url:"/_next/static/chunks/1270-06695b5e45dd0c87.js",revision:"06695b5e45dd0c87"},{url:"/_next/static/chunks/1270-06695b5e45dd0c87.js.map",revision:"9bba3e73153b434dfcdf0056772655e5"},{url:"/_next/static/chunks/1280-f358cf851994d83a.js",revision:"f358cf851994d83a"},{url:"/_next/static/chunks/1280-f358cf851994d83a.js.map",revision:"767e94175744ab33cf54e39034fa081c"},{url:"/_next/static/chunks/1567-4b3941a8a3e22145.js",revision:"4b3941a8a3e22145"},{url:"/_next/static/chunks/1567-4b3941a8a3e22145.js.map",revision:"6bfb945a8c27bf07022d69bd9101df33"},{url:"/_next/static/chunks/1588-79b979bf702676a4.js",revision:"79b979bf702676a4"},{url:"/_next/static/chunks/1588-79b979bf702676a4.js.map",revision:"d73ac3a6bb4cba8e49eaeee711fc5cfe"},{url:"/_next/static/chunks/1665-1052f536dfde1b71.js",revision:"1052f536dfde1b71"},{url:"/_next/static/chunks/1665-1052f536dfde1b71.js.map",revision:"080700fd7bf73ff51000a77b4a8bf941"},{url:"/_next/static/chunks/1733-36a5992fc95eb140.js",revision:"36a5992fc95eb140"},{url:"/_next/static/chunks/1733-36a5992fc95eb140.js.map",revision:"41cfc5c668926a98e1839874d7b814f9"},{url:"/_next/static/chunks/1864-2c240c06c2b3e472.js",revision:"2c240c06c2b3e472"},{url:"/_next/static/chunks/1864-2c240c06c2b3e472.js.map",revision:"f226db147f786033f185e4fafa0a62c3"},{url:"/_next/static/chunks/2601-232776c6f940688b.js",revision:"232776c6f940688b"},{url:"/_next/static/chunks/2601-232776c6f940688b.js.map",revision:"03e1ab562e8d9dde4fcc79cef0392787"},{url:"/_next/static/chunks/2615.ed5c4bb5ec872ee6.js",revision:"ed5c4bb5ec872ee6"},{url:"/_next/static/chunks/2615.ed5c4bb5ec872ee6.js.map",revision:"25890ba34ed4cb4c93b0a1ae984290ad"},{url:"/_next/static/chunks/2674-850f531893e0fc3b.js",revision:"850f531893e0fc3b"},{url:"/_next/static/chunks/2674-850f531893e0fc3b.js.map",revision:"1cc7aab62fa62e1cc7dfb018b848c560"},{url:"/_next/static/chunks/2721-f0ebd06b641bd3ad.js",revision:"f0ebd06b641bd3ad"},{url:"/_next/static/chunks/2721-f0ebd06b641bd3ad.js.map",revision:"6431c43078385ab0ea38052544f35ea9"},{url:"/_next/static/chunks/2891-b55cad448c4623ad.js",revision:"b55cad448c4623ad"},{url:"/_next/static/chunks/2891-b55cad448c4623ad.js.map",revision:"276f900f0ffcc78af15e4d71747f67b3"},{url:"/_next/static/chunks/2928.ff93bc87ea910d9f.js",revision:"ff93bc87ea910d9f"},{url:"/_next/static/chunks/2928.ff93bc87ea910d9f.js.map",revision:"acdd23871ec2a4a45bd920d8e5c5ac35"},{url:"/_next/static/chunks/3269-4ef33d40b0229c1b.js",revision:"4ef33d40b0229c1b"},{url:"/_next/static/chunks/3269-4ef33d40b0229c1b.js.map",revision:"dc02ff4a163c5c56daad1c1b9a319b8d"},{url:"/_next/static/chunks/3311-a5d4efd2728c5857.js",revision:"a5d4efd2728c5857"},{url:"/_next/static/chunks/3311-a5d4efd2728c5857.js.map",revision:"26c81d458b9628b64190a6aac3d541d7"},{url:"/_next/static/chunks/4118-bbce4979e4854e5a.js",revision:"bbce4979e4854e5a"},{url:"/_next/static/chunks/4118-bbce4979e4854e5a.js.map",revision:"b48e0eb4156cb3af3fad70eea8890e01"},{url:"/_next/static/chunks/4608.b9b818fd3fc948c0.js",revision:"b9b818fd3fc948c0"},{url:"/_next/static/chunks/4608.b9b818fd3fc948c0.js.map",revision:"b98aa1260b8770ff80e2549609d3b552"},{url:"/_next/static/chunks/4618-c02be8493604ced3.js",revision:"c02be8493604ced3"},{url:"/_next/static/chunks/4618-c02be8493604ced3.js.map",revision:"bad1387804fd72f6240e81c8a317a6da"},{url:"/_next/static/chunks/4800.a6d4c2045571a3a1.js",revision:"a6d4c2045571a3a1"},{url:"/_next/static/chunks/4800.a6d4c2045571a3a1.js.map",revision:"1bea97f6d3385ec3dccf59d81f2682cc"},{url:"/_next/static/chunks/4961.791b28d81d71f433.js",revision:"791b28d81d71f433"},{url:"/_next/static/chunks/4961.791b28d81d71f433.js.map",revision:"dc48df2521b9cdbcd7c3adcd6e748caf"},{url:"/_next/static/chunks/6033-7fb3f69aa5ceae6a.js",revision:"7fb3f69aa5ceae6a"},{url:"/_next/static/chunks/6033-7fb3f69aa5ceae6a.js.map",revision:"77dc579dbe15bbc83026f637143d9802"},{url:"/_next/static/chunks/6424.419a6cf980d6d2db.js",revision:"419a6cf980d6d2db"},{url:"/_next/static/chunks/6424.419a6cf980d6d2db.js.map",revision:"cce829f16095a0ac2e32cb614ba9d2da"},{url:"/_next/static/chunks/6726-6dc5f9bf6bd44c80.js",revision:"6dc5f9bf6bd44c80"},{url:"/_next/static/chunks/6726-6dc5f9bf6bd44c80.js.map",revision:"4bee244a4d683022d3fc191dfeee2f2a"},{url:"/_next/static/chunks/6778.194ba7a60cdbd2ae.js",revision:"194ba7a60cdbd2ae"},{url:"/_next/static/chunks/6778.194ba7a60cdbd2ae.js.map",revision:"913ca7bb59ea6add0171ad93b71111d8"},{url:"/_next/static/chunks/6dd150ba.64b5afd105402a95.js",revision:"64b5afd105402a95"},{url:"/_next/static/chunks/6dd150ba.64b5afd105402a95.js.map",revision:"1384f4b07003004abdcc5fa87d28fce2"},{url:"/_next/static/chunks/7015.a11b4ff5c7ac8194.js",revision:"a11b4ff5c7ac8194"},{url:"/_next/static/chunks/7015.a11b4ff5c7ac8194.js.map",revision:"b69cc5a69150812c29d4a8f9b47bc8c6"},{url:"/_next/static/chunks/7118-c5bc6fa870d9014a.js",revision:"c5bc6fa870d9014a"},{url:"/_next/static/chunks/7314-253bbd3922832c0b.js",revision:"253bbd3922832c0b"},{url:"/_next/static/chunks/7314-253bbd3922832c0b.js.map",revision:"1542f5b57a5aa6600733b4d20c46dbbc"},{url:"/_next/static/chunks/7717-d3003d5d0d954032.js",revision:"d3003d5d0d954032"},{url:"/_next/static/chunks/7717-d3003d5d0d954032.js.map",revision:"ad491b3ba680ad50b1fcec18d08bcf55"},{url:"/_next/static/chunks/7725.990fb3c07f9a9dbc.js",revision:"990fb3c07f9a9dbc"},{url:"/_next/static/chunks/7725.990fb3c07f9a9dbc.js.map",revision:"0c676813f732ecdee914bf17c30a6360"},{url:"/_next/static/chunks/7879-71c9fcbd0b2e23ca.js",revision:"71c9fcbd0b2e23ca"},{url:"/_next/static/chunks/7879-71c9fcbd0b2e23ca.js.map",revision:"b4191092daf58d17ba388d3d51adf80a"},{url:"/_next/static/chunks/87d427d2-f644a880d2332fb2.js",revision:"f644a880d2332fb2"},{url:"/_next/static/chunks/8871-1f647fa5615d1805.js",revision:"1f647fa5615d1805"},{url:"/_next/static/chunks/8871-1f647fa5615d1805.js.map",revision:"0875d65c9f22e30099683f5db80c95ad"},{url:"/_next/static/chunks/9226-4c34d6b1fcd17748.js",revision:"4c34d6b1fcd17748"},{url:"/_next/static/chunks/9226-4c34d6b1fcd17748.js.map",revision:"1841067bfdf6fde56ba8a61b878eb1b0"},{url:"/_next/static/chunks/9433.d40955b54963ff98.js",revision:"d40955b54963ff98"},{url:"/_next/static/chunks/9433.d40955b54963ff98.js.map",revision:"d31d0af5dde8e5af63b41033a0449cb9"},{url:"/_next/static/chunks/9435.722cdc3f0a842f0e.js",revision:"722cdc3f0a842f0e"},{url:"/_next/static/chunks/9435.722cdc3f0a842f0e.js.map",revision:"7ef9b0e9ce7e2d49aa96e09d6d7e93a3"},{url:"/_next/static/chunks/9441-dc231b8b03fbe64d.js",revision:"dc231b8b03fbe64d"},{url:"/_next/static/chunks/9441-dc231b8b03fbe64d.js.map",revision:"785577b6a97c55e36664186b20a80a4e"},{url:"/_next/static/chunks/9534-f42e4c9f880208f6.js",revision:"f42e4c9f880208f6"},{url:"/_next/static/chunks/9534-f42e4c9f880208f6.js.map",revision:"a5dcaa783b26ea1e874868b8c4d18c21"},{url:"/_next/static/chunks/982-fa48caa31481a42c.js",revision:"fa48caa31481a42c"},{url:"/_next/static/chunks/982-fa48caa31481a42c.js.map",revision:"a67694d3b931781a4902cb09a7d2ccfb"},{url:"/_next/static/chunks/framework-48b742837832a3b5.js",revision:"48b742837832a3b5"},{url:"/_next/static/chunks/framework-48b742837832a3b5.js.map",revision:"2b40a60a66108548bf9636193694ed01"},{url:"/_next/static/chunks/main-e0442a3a4cf377c0.js",revision:"e0442a3a4cf377c0"},{url:"/_next/static/chunks/main-e0442a3a4cf377c0.js.map",revision:"0d56e9ea604706a6899edc8c80858d39"},{url:"/_next/static/chunks/pages/404-fbf3343f318ade33.js",revision:"fbf3343f318ade33"},{url:"/_next/static/chunks/pages/404-fbf3343f318ade33.js.map",revision:"93e84dd4d49acb1c6d19e3a618b36415"},{url:"/_next/static/chunks/pages/500-bcd0e3bcc7517edb.js",revision:"bcd0e3bcc7517edb"},{url:"/_next/static/chunks/pages/500-bcd0e3bcc7517edb.js.map",revision:"956c402d12f953479726780e34fba1d6"},{url:"/_next/static/chunks/pages/_error-511479c77bb2be13.js",revision:"511479c77bb2be13"},{url:"/_next/static/chunks/pages/_error-511479c77bb2be13.js.map",revision:"5a48916ea1c0233a4c58bd49e0b55fbe"},{url:"/_next/static/chunks/pages/contact-c460ca8ccde54b12.js",revision:"c460ca8ccde54b12"},{url:"/_next/static/chunks/pages/contact-c460ca8ccde54b12.js.map",revision:"dc9b3dc79338fa0ef2ed6668061e1fc2"},{url:"/_next/static/chunks/pages/deploy-linux-23c9be43000af12a.js",revision:"23c9be43000af12a"},{url:"/_next/static/chunks/pages/deploy-linux-23c9be43000af12a.js.map",revision:"4ac9d3ab2af06534c69abd51059591fa"},{url:"/_next/static/chunks/pages/deployments-a00c3173095d34fb.js",revision:"a00c3173095d34fb"},{url:"/_next/static/chunks/pages/deployments-a00c3173095d34fb.js.map",revision:"0f4b427c36b2002c5c29724283b81202"},{url:"/_next/static/chunks/pages/deployments/%5Bdseq%5D-bcdb49ca85d696e5.js",revision:"bcdb49ca85d696e5"},{url:"/_next/static/chunks/pages/deployments/%5Bdseq%5D-bcdb49ca85d696e5.js.map",revision:"b441e72589c45d9a958cd621bcad5577"},{url:"/_next/static/chunks/pages/faq-aec6845f07f34a57.js",revision:"aec6845f07f34a57"},{url:"/_next/static/chunks/pages/faq-aec6845f07f34a57.js.map",revision:"8739089394d8733fceecf39444262da6"},{url:"/_next/static/chunks/pages/get-started-c8f4953957abb605.js",revision:"c8f4953957abb605"},{url:"/_next/static/chunks/pages/get-started-c8f4953957abb605.js.map",revision:"e45442e931a1fb453693fd1847fccc74"},{url:"/_next/static/chunks/pages/get-started/wallet-1aee174b2b799709.js",revision:"1aee174b2b799709"},{url:"/_next/static/chunks/pages/get-started/wallet-1aee174b2b799709.js.map",revision:"e5200dd538c1bc6feb6d6455c708f1a7"},{url:"/_next/static/chunks/pages/index-cd034d00d4896429.js",revision:"cd034d00d4896429"},{url:"/_next/static/chunks/pages/index-cd034d00d4896429.js.map",revision:"63952c3eba384e57ff94c9c3c907bf47"},{url:"/_next/static/chunks/pages/maintenance-120a58f5264a511c.js",revision:"120a58f5264a511c"},{url:"/_next/static/chunks/pages/maintenance-120a58f5264a511c.js.map",revision:"aa65c449936488df06deaf7300aa8b29"},{url:"/_next/static/chunks/pages/new-deployment-d2df306166b0670f.js",revision:"d2df306166b0670f"},{url:"/_next/static/chunks/pages/new-deployment-d2df306166b0670f.js.map",revision:"4e741ff57280e31df36f0f872b288e82"},{url:"/_next/static/chunks/pages/privacy-policy-5d219078a5a2b589.js",revision:"5d219078a5a2b589"},{url:"/_next/static/chunks/pages/privacy-policy-5d219078a5a2b589.js.map",revision:"c868ed31022a27bb65d1a2eb34713ece"},{url:"/_next/static/chunks/pages/profile/%5Busername%5D-6e16356a5d1d47cc.js",revision:"6e16356a5d1d47cc"},{url:"/_next/static/chunks/pages/profile/%5Busername%5D-6e16356a5d1d47cc.js.map",revision:"c601f4380619097b851c42be189b422e"},{url:"/_next/static/chunks/pages/providers-3d9f41d49f85bb58.js",revision:"3d9f41d49f85bb58"},{url:"/_next/static/chunks/pages/providers-3d9f41d49f85bb58.js.map",revision:"9bdf2b1bbb0e8e1ba1964424d3d467b2"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D-377a86545e9d2fb0.js",revision:"377a86545e9d2fb0"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D-377a86545e9d2fb0.js.map",revision:"6f204261fd719d6b26e221d6c68cd663"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-95a1a2299a4ecbd8.js",revision:"95a1a2299a4ecbd8"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-95a1a2299a4ecbd8.js.map",revision:"3b21db66b4d39dd28b43120da7eb53cd"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-74feff18622f6ace.js",revision:"74feff18622f6ace"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-74feff18622f6ace.js.map",revision:"dd4c42fa524bf05b6acec95d333f328d"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-db7c9221d20cae64.js",revision:"db7c9221d20cae64"},{url:"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-db7c9221d20cae64.js.map",revision:"7440d9a212d32064ce2f9fe928fb1ac6"},{url:"/_next/static/chunks/pages/rent-gpu-f4d1d107282842d1.js",revision:"f4d1d107282842d1"},{url:"/_next/static/chunks/pages/rent-gpu-f4d1d107282842d1.js.map",revision:"e591e072e7964b72be4e52aecc717de7"},{url:"/_next/static/chunks/pages/sdl-builder-1a5fe6e914c8bf9c.js",revision:"1a5fe6e914c8bf9c"},{url:"/_next/static/chunks/pages/sdl-builder-1a5fe6e914c8bf9c.js.map",revision:"c06dd3a1ed973219023647be841588aa"},{url:"/_next/static/chunks/pages/settings-2a2a7dd5eca3d3b1.js",revision:"2a2a7dd5eca3d3b1"},{url:"/_next/static/chunks/pages/settings-2a2a7dd5eca3d3b1.js.map",revision:"f248b5224bcf180ca578ce3e8ff20d1e"},{url:"/_next/static/chunks/pages/settings/authorizations-80c2f49b131a5aa7.js",revision:"80c2f49b131a5aa7"},{url:"/_next/static/chunks/pages/settings/authorizations-80c2f49b131a5aa7.js.map",revision:"513ed6df51cc05eabf7810f194b2f1b9"},{url:"/_next/static/chunks/pages/template/%5Bid%5D-587a8a4868c12f9a.js",revision:"587a8a4868c12f9a"},{url:"/_next/static/chunks/pages/template/%5Bid%5D-587a8a4868c12f9a.js.map",revision:"f032843469d6ed1162c123f80242831c"},{url:"/_next/static/chunks/pages/templates-bc34d9ca54d08dd9.js",revision:"bc34d9ca54d08dd9"},{url:"/_next/static/chunks/pages/templates-bc34d9ca54d08dd9.js.map",revision:"9c1a1d685636ed9817c6f5fd3992eed1"},{url:"/_next/static/chunks/pages/templates/%5BtemplateId%5D-f5184d243fa01871.js",revision:"f5184d243fa01871"},{url:"/_next/static/chunks/pages/templates/%5BtemplateId%5D-f5184d243fa01871.js.map",revision:"a129f04240de49532291bf2263d46b6c"},{url:"/_next/static/chunks/pages/terms-of-service-c53f3d98181c6258.js",revision:"c53f3d98181c6258"},{url:"/_next/static/chunks/pages/terms-of-service-c53f3d98181c6258.js.map",revision:"8cd359a500f7470a561af7606bb2d085"},{url:"/_next/static/chunks/pages/user/settings-9c1b2afb8954da61.js",revision:"9c1b2afb8954da61"},{url:"/_next/static/chunks/pages/user/settings-9c1b2afb8954da61.js.map",revision:"3e75f649427151732dd17e6f2bed4c52"},{url:"/_next/static/chunks/pages/user/settings/favorites-7877137575f375d7.js",revision:"7877137575f375d7"},{url:"/_next/static/chunks/pages/user/settings/favorites-7877137575f375d7.js.map",revision:"586fb4e67708c01512f143f111aa287c"},{url:"/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js",revision:"79330112775102f91e1010318bae2bd3"},{url:"/_next/static/chunks/webpack-5a54c6233d75fd8d.js",revision:"5a54c6233d75fd8d"},{url:"/_next/static/chunks/webpack-5a54c6233d75fd8d.js.map",revision:"a28bb2c3378284ec1a5645f7962cdba0"},{url:"/_next/static/css/60da0364ed65e94f.css",revision:"60da0364ed65e94f"},{url:"/_next/static/css/60da0364ed65e94f.css.map",revision:"7ebdaca80e1b94a3afdc509e9729e2f4"},{url:"/_next/static/css/6f12c16d317846a2.css",revision:"6f12c16d317846a2"},{url:"/_next/static/css/85fa6dafca566008.css",revision:"85fa6dafca566008"},{url:"/_next/static/css/85fa6dafca566008.css.map",revision:"e1c00d68c2a092625defb4c86bdb56ae"},{url:"/_next/static/media/e11418ac562b8ac1-s.p.woff2",revision:"0e46e732cced180e3a2c7285100f27d4"},{url:"/akash-console.png",revision:"4ab11b341159b007fc63d28631e0a8d8"},{url:"/android-chrome-192x192.png",revision:"a2eeed7b0d4a8c9bd9fa014378ac733e"},{url:"/android-chrome-256x256.png",revision:"b0dc3017fadbf0f4c323636535f582b7"},{url:"/android-chrome-384x384.png",revision:"3fae18e8537ff0745221e5aec66c247b"},{url:"/apple-touch-icon.png",revision:"43451e961475b8323dcfb705fb6eb480"},{url:"/browserconfig.xml",revision:"e41ebb6b49206a59d8eafce8220ebeac"},{url:"/favicon-16x16.png",revision:"8cf7a2775f6f6d6db07b95197538b11b"},{url:"/favicon-32x32.png",revision:"bef7d8e9aaed7fb3ef49cbffa31b5339"},{url:"/favicon.ico",revision:"cfebc107c597696c596a277239546a86"},{url:"/images/akash-logo-dark.png",revision:"b1623e407dad710a4c0c73461bbb8bb3"},{url:"/images/akash-logo-flat-dark.png",revision:"50b4ad6438e791047d97da0af65b96f5"},{url:"/images/akash-logo-flat-light.png",revision:"2befec2d17a2b6a32b1a0517ca1baf01"},{url:"/images/akash-logo-light.png",revision:"0ea30905c72eda674ad74c65d0c062bf"},{url:"/images/akash-logo.svg",revision:"4a5f3eaf31bf0f88ff3baec6281c8de3"},{url:"/images/chains/akash.png",revision:"d0b3f8ccaa3b0d18ef4039f86edf4436"},{url:"/images/chains/atom.png",revision:"6e4d88ad2c295e811fee29cc89edfcb1"},{url:"/images/chains/evmos.png",revision:"487a456e9091dec9ddf18892531401f8"},{url:"/images/chains/huahua.png",revision:"f0ba8427522833bba44962e87e982412"},{url:"/images/chains/juno.png",revision:"933b7d992dc67fd2f0d0f35e182b3361"},{url:"/images/chains/kuji.png",revision:"9c31e679007e5ae16fc28e067d907f79"},{url:"/images/chains/osmo.png",revision:"6940c69c28e5d85d99ba498fc7e95a26"},{url:"/images/chains/scrt.png",revision:"0dd98be17447cf7c47d27153f534ca60"},{url:"/images/chains/stars.png",revision:"56d0bd40e52f010c7267eb78c53138f2"},{url:"/images/chains/strd.png",revision:"eebdfb53ba0bc9bba88b0bede7a44f6d"},{url:"/images/cloudmos-logo-light.png",revision:"a7423327e4280225e176da92c6176c28"},{url:"/images/cloudmos-logo-small.jpg",revision:"4b339b83e7dc396894537b83d794726d"},{url:"/images/cloudmos-logo.png",revision:"56d87e0230a0ad5dd745efd486a33a58"},{url:"/images/docker.png",revision:"fde0ed6a2add0ffabfbc5a7749fdfff2"},{url:"/images/faq/change-node.png",revision:"9421f6443f6c4397887035e50d8c9b24"},{url:"/images/faq/update-deployment-btn.png",revision:"ebc7f6907a08fdf6a6cd5a87043456fd"},{url:"/images/keplr-logo.png",revision:"50397e4902a33a6045c0f23dfe5cb1bd"},{url:"/images/leap-cosmos-logo.png",revision:"a54ced7748b33565e6dc1ea1c5b1ef52"},{url:"/images/powered-by-akash-dark.svg",revision:"3ea920f030ede7926a02c2dc17e332c4"},{url:"/images/powered-by-akash.svg",revision:"24b2566094fafded6c325246fe84c2a9"},{url:"/images/ubuntu.png",revision:"c631b8fae270a618c1fe1c9d43097189"},{url:"/images/wallet-connect-logo.png",revision:"8379e4d4e7267b47a0b5b89807a4d8f8"},{url:"/manifest.json",revision:"a030fca8a5c7b8e2e1b5d7614a8b74fa"},{url:"/mstile-150x150.png",revision:"17614fed638be1d5e2225b9d5419336a"},{url:"/robots.txt",revision:"c2bb774b8071c957d2b835beaa28a58b"},{url:"/safari-pinned-tab.svg",revision:"86b02210e078cb763098dfec594f4f04"}],{ignoreURLParametersMatching:[]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({request:e,response:a,event:s,state:c})=>a&&"opaqueredirect"===a.type?new Response(a.body,{status:200,statusText:"OK",headers:a.headers}):a}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;const a=e.pathname;return!a.startsWith("/api/auth/")&&!!a.startsWith("/api/")}),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>{if(!(self.origin===e.origin))return!1;return!e.pathname.startsWith("/api/")}),new e.NetworkFirst({cacheName:"others",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute((({url:e})=>!(self.origin===e.origin)),new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")})); //# sourceMappingURL=sw.js.map diff --git a/apps/deploy-web/public/sw.js.map b/apps/deploy-web/public/sw.js.map index f736579aa..1616b937a 100644 --- a/apps/deploy-web/public/sw.js.map +++ b/apps/deploy-web/public/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../../../private/var/folders/tk/wz1yhr411g558rt103cxg_cw0000gn/T/f5b938baa006bef49e56108b217e3eea/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {StaleWhileRevalidate as workbox_strategies_StaleWhileRevalidate} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-strategies/StaleWhileRevalidate.mjs';\nimport {RangeRequestsPlugin as workbox_range_requests_RangeRequestsPlugin} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-range-requests/RangeRequestsPlugin.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/Users/sid/LeapWallet/development/cloudmos/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/_next/static/chunks/1134-f1edfac271d26e5d.js\",\n \"revision\": \"f1edfac271d26e5d\"\n },\n {\n \"url\": \"/_next/static/chunks/1134-f1edfac271d26e5d.js.map\",\n \"revision\": \"e79c7d1bc47fca0b2185fb775c231609\"\n },\n {\n \"url\": \"/_next/static/chunks/1270-0734ab044ebb64ed.js\",\n \"revision\": \"0734ab044ebb64ed\"\n },\n {\n \"url\": \"/_next/static/chunks/1270-0734ab044ebb64ed.js.map\",\n \"revision\": \"d33dfd3bd538ffb4a54bc8e89e0f2c66\"\n },\n {\n \"url\": \"/_next/static/chunks/1280-41e6f846a7c47308.js\",\n \"revision\": \"41e6f846a7c47308\"\n },\n {\n \"url\": \"/_next/static/chunks/1280-41e6f846a7c47308.js.map\",\n \"revision\": \"894f12d9e7c6e05cd5749221dd7690cd\"\n },\n {\n \"url\": \"/_next/static/chunks/1506-59339618eab7447f.js\",\n \"revision\": \"59339618eab7447f\"\n },\n {\n \"url\": \"/_next/static/chunks/1506-59339618eab7447f.js.map\",\n \"revision\": \"c3f93039cacaa6638d5925b4ec8773dd\"\n },\n {\n \"url\": \"/_next/static/chunks/1588-b199eef3be0d22d1.js\",\n \"revision\": \"b199eef3be0d22d1\"\n },\n {\n \"url\": \"/_next/static/chunks/1588-b199eef3be0d22d1.js.map\",\n \"revision\": \"f1625eb6f0470b2de90dfb5a40d0782f\"\n },\n {\n \"url\": \"/_next/static/chunks/1733-6dae128c8882ae62.js\",\n \"revision\": \"6dae128c8882ae62\"\n },\n {\n \"url\": \"/_next/static/chunks/1733-6dae128c8882ae62.js.map\",\n \"revision\": \"f28d25436493bce881bd875460377953\"\n },\n {\n \"url\": \"/_next/static/chunks/1864-a108b3603800e036.js\",\n \"revision\": \"a108b3603800e036\"\n },\n {\n \"url\": \"/_next/static/chunks/1864-a108b3603800e036.js.map\",\n \"revision\": \"d59eb0a87c8bfb233ab3a00bed27cbfd\"\n },\n {\n \"url\": \"/_next/static/chunks/2000-c850bd696cec2098.js\",\n \"revision\": \"c850bd696cec2098\"\n },\n {\n \"url\": \"/_next/static/chunks/2000-c850bd696cec2098.js.map\",\n \"revision\": \"f18ae09cab455616d4915ee0de5bace2\"\n },\n {\n \"url\": \"/_next/static/chunks/237-77a0396adc433bd3.js\",\n \"revision\": \"77a0396adc433bd3\"\n },\n {\n \"url\": \"/_next/static/chunks/237-77a0396adc433bd3.js.map\",\n \"revision\": \"68187fa1002c401b155407711b422aef\"\n },\n {\n \"url\": \"/_next/static/chunks/2615.cd4ca347223d657b.js\",\n \"revision\": \"cd4ca347223d657b\"\n },\n {\n \"url\": \"/_next/static/chunks/2615.cd4ca347223d657b.js.map\",\n \"revision\": \"1972319efd41267ca80b39c164a6796d\"\n },\n {\n \"url\": \"/_next/static/chunks/2674-72d9141ee61fa622.js\",\n \"revision\": \"72d9141ee61fa622\"\n },\n {\n \"url\": \"/_next/static/chunks/2674-72d9141ee61fa622.js.map\",\n \"revision\": \"3c32c5ad19bb626530fb893892bd5a9e\"\n },\n {\n \"url\": \"/_next/static/chunks/2716.fbbb58a2fbd79f67.js\",\n \"revision\": \"fbbb58a2fbd79f67\"\n },\n {\n \"url\": \"/_next/static/chunks/2716.fbbb58a2fbd79f67.js.map\",\n \"revision\": \"b68932a41f667aac4bf4908248d77ca3\"\n },\n {\n \"url\": \"/_next/static/chunks/2721-03484ed4a5ba7909.js\",\n \"revision\": \"03484ed4a5ba7909\"\n },\n {\n \"url\": \"/_next/static/chunks/2721-03484ed4a5ba7909.js.map\",\n \"revision\": \"fdd1d6c4710b1d16d4b26daadfea6805\"\n },\n {\n \"url\": \"/_next/static/chunks/2928.24a5a7c6f2f41f01.js\",\n \"revision\": \"24a5a7c6f2f41f01\"\n },\n {\n \"url\": \"/_next/static/chunks/2928.24a5a7c6f2f41f01.js.map\",\n \"revision\": \"b25fde6e17b20bb5c55d728e6c09f7dd\"\n },\n {\n \"url\": \"/_next/static/chunks/309-315e2c4b6959711a.js\",\n \"revision\": \"315e2c4b6959711a\"\n },\n {\n \"url\": \"/_next/static/chunks/309-315e2c4b6959711a.js.map\",\n \"revision\": \"53017df15ff8d7365dd26b601d37f571\"\n },\n {\n \"url\": \"/_next/static/chunks/3472-5775d3204a43bb60.js\",\n \"revision\": \"5775d3204a43bb60\"\n },\n {\n \"url\": \"/_next/static/chunks/3472-5775d3204a43bb60.js.map\",\n \"revision\": \"536284bc522d5bafec82550bc2ac588f\"\n },\n {\n \"url\": \"/_next/static/chunks/4099-b8578ac08ce318de.js\",\n \"revision\": \"b8578ac08ce318de\"\n },\n {\n \"url\": \"/_next/static/chunks/4099-b8578ac08ce318de.js.map\",\n \"revision\": \"6e0c00fd33fc9203177613edda0ec3e1\"\n },\n {\n \"url\": \"/_next/static/chunks/4390-bdb1d1c03df50067.js\",\n \"revision\": \"bdb1d1c03df50067\"\n },\n {\n \"url\": \"/_next/static/chunks/4390-bdb1d1c03df50067.js.map\",\n \"revision\": \"f1d3a16d4240515d61fb29d73312b49b\"\n },\n {\n \"url\": \"/_next/static/chunks/4569-e0285edc701b296e.js\",\n \"revision\": \"e0285edc701b296e\"\n },\n {\n \"url\": \"/_next/static/chunks/4569-e0285edc701b296e.js.map\",\n \"revision\": \"691508a604f84c8b6b6d26f5d4039d0e\"\n },\n {\n \"url\": \"/_next/static/chunks/4608.3b915ba50845ff19.js\",\n \"revision\": \"3b915ba50845ff19\"\n },\n {\n \"url\": \"/_next/static/chunks/4608.3b915ba50845ff19.js.map\",\n \"revision\": \"9ddf1792a967355dc0cc2c8210d10885\"\n },\n {\n \"url\": \"/_next/static/chunks/4618-a672f9bf086f841f.js\",\n \"revision\": \"a672f9bf086f841f\"\n },\n {\n \"url\": \"/_next/static/chunks/4618-a672f9bf086f841f.js.map\",\n \"revision\": \"b778fcb3871b0a771fa73b3229a148c1\"\n },\n {\n \"url\": \"/_next/static/chunks/477-88f9c85ab59dd63e.js\",\n \"revision\": \"88f9c85ab59dd63e\"\n },\n {\n \"url\": \"/_next/static/chunks/477-88f9c85ab59dd63e.js.map\",\n \"revision\": \"cdf4353cf93f90df7e14df521e6b973b\"\n },\n {\n \"url\": \"/_next/static/chunks/4800.2f1701ea0540caf1.js\",\n \"revision\": \"2f1701ea0540caf1\"\n },\n {\n \"url\": \"/_next/static/chunks/4800.2f1701ea0540caf1.js.map\",\n \"revision\": \"577f6acf828690e23d10ae0dcec8e1a9\"\n },\n {\n \"url\": \"/_next/static/chunks/4961.1cb207cc3bd56017.js\",\n \"revision\": \"1cb207cc3bd56017\"\n },\n {\n \"url\": \"/_next/static/chunks/4961.1cb207cc3bd56017.js.map\",\n \"revision\": \"efb5ba432f00515eba6775a083f21c10\"\n },\n {\n \"url\": \"/_next/static/chunks/5102-cbbec4d175f05d83.js\",\n \"revision\": \"cbbec4d175f05d83\"\n },\n {\n \"url\": \"/_next/static/chunks/5102-cbbec4d175f05d83.js.map\",\n \"revision\": \"986f67bb4091d5b51e33077cab68d45b\"\n },\n {\n \"url\": \"/_next/static/chunks/5356-d7f4891c2cf8ad20.js\",\n \"revision\": \"d7f4891c2cf8ad20\"\n },\n {\n \"url\": \"/_next/static/chunks/5356-d7f4891c2cf8ad20.js.map\",\n \"revision\": \"2df33605b8bd477763cdb231595433da\"\n },\n {\n \"url\": \"/_next/static/chunks/5580-b0c78a61d8a0c621.js\",\n \"revision\": \"b0c78a61d8a0c621\"\n },\n {\n \"url\": \"/_next/static/chunks/5580-b0c78a61d8a0c621.js.map\",\n \"revision\": \"92ec561a58b3b5a0703885a7d057b75a\"\n },\n {\n \"url\": \"/_next/static/chunks/6033-ccabda622fc6a68c.js\",\n \"revision\": \"ccabda622fc6a68c\"\n },\n {\n \"url\": \"/_next/static/chunks/6033-ccabda622fc6a68c.js.map\",\n \"revision\": \"569a1422365b1f2326ca5594ac9e0f24\"\n },\n {\n \"url\": \"/_next/static/chunks/6310-6ac0f2df10accef8.js\",\n \"revision\": \"6ac0f2df10accef8\"\n },\n {\n \"url\": \"/_next/static/chunks/6310-6ac0f2df10accef8.js.map\",\n \"revision\": \"e6136fa5290d3969ac41a697a5a37051\"\n },\n {\n \"url\": \"/_next/static/chunks/6424.afd408d2a0a8aa78.js\",\n \"revision\": \"afd408d2a0a8aa78\"\n },\n {\n \"url\": \"/_next/static/chunks/6424.afd408d2a0a8aa78.js.map\",\n \"revision\": \"06a1e277ef6809ad36ed4fde2d391baf\"\n },\n {\n \"url\": \"/_next/static/chunks/6778.eb8dbdfb58565a2a.js\",\n \"revision\": \"eb8dbdfb58565a2a\"\n },\n {\n \"url\": \"/_next/static/chunks/6778.eb8dbdfb58565a2a.js.map\",\n \"revision\": \"b99aaa9833f399c9e578a997dbeffc14\"\n },\n {\n \"url\": \"/_next/static/chunks/6dd150ba.ec75e8e489a567a9.js\",\n \"revision\": \"ec75e8e489a567a9\"\n },\n {\n \"url\": \"/_next/static/chunks/6dd150ba.ec75e8e489a567a9.js.map\",\n \"revision\": \"0958db114513904932a656bdf3630b27\"\n },\n {\n \"url\": \"/_next/static/chunks/7015.081c061481193a2b.js\",\n \"revision\": \"081c061481193a2b\"\n },\n {\n \"url\": \"/_next/static/chunks/7015.081c061481193a2b.js.map\",\n \"revision\": \"f724c855b4dd5742c534416086c78ddc\"\n },\n {\n \"url\": \"/_next/static/chunks/7725.758b246f86e835a1.js\",\n \"revision\": \"758b246f86e835a1\"\n },\n {\n \"url\": \"/_next/static/chunks/7725.758b246f86e835a1.js.map\",\n \"revision\": \"55f3162732eec5cb268a6a2949757c91\"\n },\n {\n \"url\": \"/_next/static/chunks/7879-2ee883c40233c9ae.js\",\n \"revision\": \"2ee883c40233c9ae\"\n },\n {\n \"url\": \"/_next/static/chunks/7879-2ee883c40233c9ae.js.map\",\n \"revision\": \"e5843b3eafc79757795c25c292815768\"\n },\n {\n \"url\": \"/_next/static/chunks/87d427d2-4b3f96f2a3f4b743.js\",\n \"revision\": \"4b3f96f2a3f4b743\"\n },\n {\n \"url\": \"/_next/static/chunks/8871-48f526e1254c05a0.js\",\n \"revision\": \"48f526e1254c05a0\"\n },\n {\n \"url\": \"/_next/static/chunks/8871-48f526e1254c05a0.js.map\",\n \"revision\": \"852fa993ff14c56ee43cf71becc9d086\"\n },\n {\n \"url\": \"/_next/static/chunks/9227-252d36e47e055305.js\",\n \"revision\": \"252d36e47e055305\"\n },\n {\n \"url\": \"/_next/static/chunks/9227-252d36e47e055305.js.map\",\n \"revision\": \"eb8b0546fd77062abc9da89b93c29d86\"\n },\n {\n \"url\": \"/_next/static/chunks/9433.257cddc15e70fce2.js\",\n \"revision\": \"257cddc15e70fce2\"\n },\n {\n \"url\": \"/_next/static/chunks/9433.257cddc15e70fce2.js.map\",\n \"revision\": \"8cf7ed2b43a1c3b9b069e0f7c4f853c9\"\n },\n {\n \"url\": \"/_next/static/chunks/9435.4f5fb53b3c8e87ec.js\",\n \"revision\": \"4f5fb53b3c8e87ec\"\n },\n {\n \"url\": \"/_next/static/chunks/9435.4f5fb53b3c8e87ec.js.map\",\n \"revision\": \"9ecfe5c24f8a95c077191088e2acb109\"\n },\n {\n \"url\": \"/_next/static/chunks/9534-13d530c02b55e7fa.js\",\n \"revision\": \"13d530c02b55e7fa\"\n },\n {\n \"url\": \"/_next/static/chunks/9534-13d530c02b55e7fa.js.map\",\n \"revision\": \"db50baa394f1781bfc6039d937009824\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-8383bf789d61bcef.js\",\n \"revision\": \"8383bf789d61bcef\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-8383bf789d61bcef.js.map\",\n \"revision\": \"a115d423eec304cd979739160b33710b\"\n },\n {\n \"url\": \"/_next/static/chunks/main-6975c9c4f12c2805.js\",\n \"revision\": \"6975c9c4f12c2805\"\n },\n {\n \"url\": \"/_next/static/chunks/main-6975c9c4f12c2805.js.map\",\n \"revision\": \"4f71ba4539244afdd855de7b4f5e464c\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/404-4417be13257199c8.js\",\n \"revision\": \"4417be13257199c8\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/404-4417be13257199c8.js.map\",\n \"revision\": \"7cb8b31b01844b38e51705b00ae7215b\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/500-6ef94004508219c2.js\",\n \"revision\": \"6ef94004508219c2\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/500-6ef94004508219c2.js.map\",\n \"revision\": \"80b151ec4b36caf67ad9d7d5aca386b3\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-27e6d24952261c74.js\",\n \"revision\": \"27e6d24952261c74\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-27e6d24952261c74.js.map\",\n \"revision\": \"85666421135cfb6874e03f36be2d9d25\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/contact-1e955792ce8b72fa.js\",\n \"revision\": \"1e955792ce8b72fa\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/contact-1e955792ce8b72fa.js.map\",\n \"revision\": \"4d85419ec79b8ed6b40a66a34aec5af3\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deploy-linux-9b394412a7839cae.js\",\n \"revision\": \"9b394412a7839cae\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deploy-linux-9b394412a7839cae.js.map\",\n \"revision\": \"ad84c96b0b137c911548f58f5fbc98ae\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments-56a4224f26930706.js\",\n \"revision\": \"56a4224f26930706\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments-56a4224f26930706.js.map\",\n \"revision\": \"4a975554aa15d86c93622e4d036a0398\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments/%5Bdseq%5D-26973b12b5a730c1.js\",\n \"revision\": \"26973b12b5a730c1\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments/%5Bdseq%5D-26973b12b5a730c1.js.map\",\n \"revision\": \"00f9b11701925220c237bfa4ffc88f02\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/faq-8989d2648405e633.js\",\n \"revision\": \"8989d2648405e633\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/faq-8989d2648405e633.js.map\",\n \"revision\": \"c6bc257c6f67248c5ab329e0cf390b5c\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started-24d23ecc37a72161.js\",\n \"revision\": \"24d23ecc37a72161\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started-24d23ecc37a72161.js.map\",\n \"revision\": \"3e11b3dfd15583cb27ba27b38ef57425\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started/wallet-dae103639db14ded.js\",\n \"revision\": \"dae103639db14ded\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started/wallet-dae103639db14ded.js.map\",\n \"revision\": \"501f129d78e773fe911251c1608abdb2\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-6b4aec9c233e635c.js\",\n \"revision\": \"6b4aec9c233e635c\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-6b4aec9c233e635c.js.map\",\n \"revision\": \"bf6172c0222baeb70d4e96c6a8f3f3d6\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/maintenance-dd3056ef5d884017.js\",\n \"revision\": \"dd3056ef5d884017\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/maintenance-dd3056ef5d884017.js.map\",\n \"revision\": \"475186a4149d1d52900b5fe2fa4b3865\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/new-deployment-d14e20405e147554.js\",\n \"revision\": \"d14e20405e147554\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/new-deployment-d14e20405e147554.js.map\",\n \"revision\": \"459cba368145859ad3b1d2b7aca740de\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/privacy-policy-bd363e256d8c8604.js\",\n \"revision\": \"bd363e256d8c8604\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/privacy-policy-bd363e256d8c8604.js.map\",\n \"revision\": \"3ef5088cffe9fff700f27dfc7b560c92\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/profile/%5Busername%5D-040828a4cad3196d.js\",\n \"revision\": \"040828a4cad3196d\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/profile/%5Busername%5D-040828a4cad3196d.js.map\",\n \"revision\": \"42a4977a08eac34836dda74c2ae31acd\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers-dc35c788d5cf830a.js\",\n \"revision\": \"dc35c788d5cf830a\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers-dc35c788d5cf830a.js.map\",\n \"revision\": \"5b2c4f7f13e6d999c0f918c80f85c8df\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D-20ef01163df8b2af.js\",\n \"revision\": \"20ef01163df8b2af\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D-20ef01163df8b2af.js.map\",\n \"revision\": \"8f6cd8934b660efa0614ebecece93f8b\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-347b1cb1e7b59c29.js\",\n \"revision\": \"347b1cb1e7b59c29\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-347b1cb1e7b59c29.js.map\",\n \"revision\": \"81e60d5141936aa753e9f8fcd48be1d9\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-8287e6b45bd96228.js\",\n \"revision\": \"8287e6b45bd96228\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-8287e6b45bd96228.js.map\",\n \"revision\": \"0c5431b02683623fdcef1c364278547e\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-45a89f0fbd2eda97.js\",\n \"revision\": \"45a89f0fbd2eda97\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-45a89f0fbd2eda97.js.map\",\n \"revision\": \"1fac9de8b58a75bf30f2f4dc47ecbccf\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/rent-gpu-72ff0e7372d535b7.js\",\n \"revision\": \"72ff0e7372d535b7\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/rent-gpu-72ff0e7372d535b7.js.map\",\n \"revision\": \"4ca2f3554ec80c1e82079c752edbbe90\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sdl-builder-9bf09079bc6e146e.js\",\n \"revision\": \"9bf09079bc6e146e\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sdl-builder-9bf09079bc6e146e.js.map\",\n \"revision\": \"927fd59a73ecf000df8280d4a12c2ea3\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings-2fac8bbf7cf6ada0.js\",\n \"revision\": \"2fac8bbf7cf6ada0\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings-2fac8bbf7cf6ada0.js.map\",\n \"revision\": \"14cbccaa583f11a72c9f74d814459165\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings/authorizations-70107e1d800dc033.js\",\n \"revision\": \"70107e1d800dc033\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings/authorizations-70107e1d800dc033.js.map\",\n \"revision\": \"46b7a80f41d374d101dc4dbf0c165bda\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/template/%5Bid%5D-44ff2920dc401c02.js\",\n \"revision\": \"44ff2920dc401c02\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/template/%5Bid%5D-44ff2920dc401c02.js.map\",\n \"revision\": \"e54d8b9f5c3622fbb056b16b9945345d\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates-b5e3c559fdb3b26d.js\",\n \"revision\": \"b5e3c559fdb3b26d\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates-b5e3c559fdb3b26d.js.map\",\n \"revision\": \"b3ad3d062fc456b3d0355b5c04ebe765\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates/%5BtemplateId%5D-d894f6fcad4f4161.js\",\n \"revision\": \"d894f6fcad4f4161\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates/%5BtemplateId%5D-d894f6fcad4f4161.js.map\",\n \"revision\": \"e74913e2f2358affd5b737c41a57965b\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/terms-of-service-b1ef7819fd159dfd.js\",\n \"revision\": \"b1ef7819fd159dfd\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/terms-of-service-b1ef7819fd159dfd.js.map\",\n \"revision\": \"352963282161075819c0c99fdc7dce20\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings-29cafa9bd4331609.js\",\n \"revision\": \"29cafa9bd4331609\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings-29cafa9bd4331609.js.map\",\n \"revision\": \"1c96f061d2b88b218f339d350e1c1469\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings/address-book-eb0a6eb5d529ba06.js\",\n \"revision\": \"eb0a6eb5d529ba06\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings/address-book-eb0a6eb5d529ba06.js.map\",\n \"revision\": \"9abd2c939d137b55f9eb95ba8ddced45\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings/favorites-149808cbece37163.js\",\n \"revision\": \"149808cbece37163\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings/favorites-149808cbece37163.js.map\",\n \"revision\": \"61b27c158da733d82cc486a418f148e6\"\n },\n {\n \"url\": \"/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js\",\n \"revision\": \"79330112775102f91e1010318bae2bd3\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-20a180bb907816e2.js\",\n \"revision\": \"20a180bb907816e2\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-20a180bb907816e2.js.map\",\n \"revision\": \"ae4b6cdf6fad54ae2cec4763924e0fe0\"\n },\n {\n \"url\": \"/_next/static/css/54c1a5d817f16a82.css\",\n \"revision\": \"54c1a5d817f16a82\"\n },\n {\n \"url\": \"/_next/static/css/60da0364ed65e94f.css\",\n \"revision\": \"60da0364ed65e94f\"\n },\n {\n \"url\": \"/_next/static/css/60da0364ed65e94f.css.map\",\n \"revision\": \"7ebdaca80e1b94a3afdc509e9729e2f4\"\n },\n {\n \"url\": \"/_next/static/css/85fa6dafca566008.css\",\n \"revision\": \"85fa6dafca566008\"\n },\n {\n \"url\": \"/_next/static/css/85fa6dafca566008.css.map\",\n \"revision\": \"e1c00d68c2a092625defb4c86bdb56ae\"\n },\n {\n \"url\": \"/_next/static/mbgmrS0y5fl-D-YnFDNib/_buildManifest.js\",\n \"revision\": \"e68c89cc08f1d0b966204b94ee2a5c88\"\n },\n {\n \"url\": \"/_next/static/mbgmrS0y5fl-D-YnFDNib/_ssgManifest.js\",\n \"revision\": \"b6652df95db52feb4daf4eca35380933\"\n },\n {\n \"url\": \"/_next/static/media/e11418ac562b8ac1-s.p.woff2\",\n \"revision\": \"0e46e732cced180e3a2c7285100f27d4\"\n },\n {\n \"url\": \"/akash-console.png\",\n \"revision\": \"4ab11b341159b007fc63d28631e0a8d8\"\n },\n {\n \"url\": \"/android-chrome-192x192.png\",\n \"revision\": \"a2eeed7b0d4a8c9bd9fa014378ac733e\"\n },\n {\n \"url\": \"/android-chrome-256x256.png\",\n \"revision\": \"b0dc3017fadbf0f4c323636535f582b7\"\n },\n {\n \"url\": \"/android-chrome-384x384.png\",\n \"revision\": \"3fae18e8537ff0745221e5aec66c247b\"\n },\n {\n \"url\": \"/apple-touch-icon.png\",\n \"revision\": \"43451e961475b8323dcfb705fb6eb480\"\n },\n {\n \"url\": \"/browserconfig.xml\",\n \"revision\": \"389eabe3c9a90736f426109c84458455\"\n },\n {\n \"url\": \"/favicon-16x16.png\",\n \"revision\": \"8cf7a2775f6f6d6db07b95197538b11b\"\n },\n {\n \"url\": \"/favicon-32x32.png\",\n \"revision\": \"bef7d8e9aaed7fb3ef49cbffa31b5339\"\n },\n {\n \"url\": \"/favicon.ico\",\n \"revision\": \"cfebc107c597696c596a277239546a86\"\n },\n {\n \"url\": \"/images/akash-logo-dark.png\",\n \"revision\": \"b1623e407dad710a4c0c73461bbb8bb3\"\n },\n {\n \"url\": \"/images/akash-logo-flat-dark.png\",\n \"revision\": \"50b4ad6438e791047d97da0af65b96f5\"\n },\n {\n \"url\": \"/images/akash-logo-flat-light.png\",\n \"revision\": \"2befec2d17a2b6a32b1a0517ca1baf01\"\n },\n {\n \"url\": \"/images/akash-logo-light.png\",\n \"revision\": \"0ea30905c72eda674ad74c65d0c062bf\"\n },\n {\n \"url\": \"/images/akash-logo.svg\",\n \"revision\": \"be6715fe32a9ad342a59c397f2e455c0\"\n },\n {\n \"url\": \"/images/chains/akash.png\",\n \"revision\": \"d0b3f8ccaa3b0d18ef4039f86edf4436\"\n },\n {\n \"url\": \"/images/chains/atom.png\",\n \"revision\": \"6e4d88ad2c295e811fee29cc89edfcb1\"\n },\n {\n \"url\": \"/images/chains/evmos.png\",\n \"revision\": \"487a456e9091dec9ddf18892531401f8\"\n },\n {\n \"url\": \"/images/chains/huahua.png\",\n \"revision\": \"f0ba8427522833bba44962e87e982412\"\n },\n {\n \"url\": \"/images/chains/juno.png\",\n \"revision\": \"933b7d992dc67fd2f0d0f35e182b3361\"\n },\n {\n \"url\": \"/images/chains/kuji.png\",\n \"revision\": \"9c31e679007e5ae16fc28e067d907f79\"\n },\n {\n \"url\": \"/images/chains/osmo.png\",\n \"revision\": \"6940c69c28e5d85d99ba498fc7e95a26\"\n },\n {\n \"url\": \"/images/chains/scrt.png\",\n \"revision\": \"0dd98be17447cf7c47d27153f534ca60\"\n },\n {\n \"url\": \"/images/chains/stars.png\",\n \"revision\": \"56d0bd40e52f010c7267eb78c53138f2\"\n },\n {\n \"url\": \"/images/chains/strd.png\",\n \"revision\": \"eebdfb53ba0bc9bba88b0bede7a44f6d\"\n },\n {\n \"url\": \"/images/cloudmos-logo-light.png\",\n \"revision\": \"a7423327e4280225e176da92c6176c28\"\n },\n {\n \"url\": \"/images/cloudmos-logo-small.jpg\",\n \"revision\": \"4b339b83e7dc396894537b83d794726d\"\n },\n {\n \"url\": \"/images/cloudmos-logo.png\",\n \"revision\": \"56d87e0230a0ad5dd745efd486a33a58\"\n },\n {\n \"url\": \"/images/docker.png\",\n \"revision\": \"fde0ed6a2add0ffabfbc5a7749fdfff2\"\n },\n {\n \"url\": \"/images/faq/change-node.png\",\n \"revision\": \"9421f6443f6c4397887035e50d8c9b24\"\n },\n {\n \"url\": \"/images/faq/update-deployment-btn.png\",\n \"revision\": \"ebc7f6907a08fdf6a6cd5a87043456fd\"\n },\n {\n \"url\": \"/images/keplr-logo.png\",\n \"revision\": \"50397e4902a33a6045c0f23dfe5cb1bd\"\n },\n {\n \"url\": \"/images/leap-cosmos-logo.png\",\n \"revision\": \"a54ced7748b33565e6dc1ea1c5b1ef52\"\n },\n {\n \"url\": \"/images/powered-by-akash-dark.svg\",\n \"revision\": \"2a5c50d964ae8578b76af3829e25e9be\"\n },\n {\n \"url\": \"/images/powered-by-akash.svg\",\n \"revision\": \"a8d720b6750092d5e4696a4e1a06859b\"\n },\n {\n \"url\": \"/images/ubuntu.png\",\n \"revision\": \"c631b8fae270a618c1fe1c9d43097189\"\n },\n {\n \"url\": \"/images/wallet-connect-logo.png\",\n \"revision\": \"8379e4d4e7267b47a0b5b89807a4d8f8\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"e1124d72dfaaaeded3a11372e3508e6c\"\n },\n {\n \"url\": \"/mstile-150x150.png\",\n \"revision\": \"17614fed638be1d5e2225b9d5419336a\"\n },\n {\n \"url\": \"/robots.txt\",\n \"revision\": \"f221cfd87bacaa726943e34b2629c37f\"\n },\n {\n \"url\": \"/safari-pinned-tab.svg\",\n \"revision\": \"c51530560c75152b849bb467e50a8b76\"\n }\n], {\n \"ignoreURLParametersMatching\": []\n});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.(?:gstatic)\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"google-fonts-webfonts\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 31536000 })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.(?:googleapis)\\.com\\/.*/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"google-fonts-stylesheets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-font-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-image-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/image\\?url=.+$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-image\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:mp3|wav|ogg)$/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"static-audio-assets\", plugins: [new workbox_range_requests_RangeRequestsPlugin(), new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:mp4)$/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"static-video-assets\", plugins: [new workbox_range_requests_RangeRequestsPlugin(), new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:js)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-js-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|less)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-style-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/data\\/.+\\/.+\\.json$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-data\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:json|xml|csv)$/i, new workbox_strategies_NetworkFirst({ \"cacheName\":\"static-data-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({ url }) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n // Exclude /api/auth/callback/* to fix OAuth workflow in Safari without impact other environment\n // Above route is default for next-auth, you may need to change it if your OAuth workflow has a different callback route\n // Issue: https://github.com/shadowwalker/next-pwa/issues/131#issuecomment-821894809\n if (pathname.startsWith('/api/auth/')) return false\n if (pathname.startsWith('/api/')) return true\n return false\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"apis\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 16, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({ url }) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n if (pathname.startsWith('/api/')) return false\n return true\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"others\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({ url }) => {\n const isSameOrigin = self.origin === url.origin\n return !isSameOrigin\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"cross-origin\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 3600 })] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","ignoreURLParametersMatching","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","cacheName","plugins","cacheWillUpdate","async","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_CacheFirst","workbox_expiration_ExpirationPlugin","maxEntries","maxAgeSeconds","workbox_strategies_StaleWhileRevalidate","workbox_range_requests_RangeRequestsPlugin","origin","pathname","startsWith","networkTimeoutSeconds"],"mappings":"0nBAqBAA,gBAUAC,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oBAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oBAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oBAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oBAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oBAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oBAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oBAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oBAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oBAEd,CACED,IAAO,4EACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oBAEd,CACED,IAAO,wEACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oBAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oBAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oBAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oBAEd,CACED,IAAO,4EACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oBAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,uEACPC,SAAY,oBAEd,CACED,IAAO,2EACPC,SAAY,oCAEd,CACED,IAAO,4EACPC,SAAY,oBAEd,CACED,IAAO,gFACPC,SAAY,oCAEd,CACED,IAAO,8EACPC,SAAY,oBAEd,CACED,IAAO,kFACPC,SAAY,oCAEd,CACED,IAAO,2EACPC,SAAY,oBAEd,CACED,IAAO,+EACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oBAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oBAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oBAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oBAEd,CACED,IAAO,uEACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oBAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,4EACPC,SAAY,oBAEd,CACED,IAAO,gFACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oBAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oBAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,4EACPC,SAAY,oBAEd,CACED,IAAO,gFACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oBAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oBAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oBAEd,CACED,IAAO,yCACPC,SAAY,oBAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oBAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,iBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,qCAEb,CACDC,4BAA+B,KAEjCC,EAAAA,wBAIAC,EAAAA,cAA8B,IAAK,IAAIC,eAAgC,CAAEC,UAAY,YAAaC,QAAS,CAAC,CAAEC,gBAAiBC,OAASC,UAASC,WAAUC,QAAOC,WAAkBF,GAA8B,mBAAlBA,EAASG,KAAoC,IAAIC,SAASJ,EAASK,KAAM,CAAEC,OAAQ,IAAKC,WAAY,KAAMC,QAASR,EAASQ,UAAoBR,MAAkB,OAClWP,EAAAA,cAA8B,0CAA2C,IAAIgB,aAA8B,CAAEd,UAAY,wBAAyBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,aAAiB,OACrPnB,EAAAA,cAA8B,6CAA8C,IAAIoB,uBAAwC,CAAElB,UAAY,2BAA4BC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,YAAe,OACnQnB,EAAAA,cAA8B,8CAA+C,IAAIoB,uBAAwC,CAAElB,UAAY,qBAAsBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,YAAe,OAC9PnB,EAAAA,cAA8B,wCAAyC,IAAIoB,uBAAwC,CAAElB,UAAY,sBAAuBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACzPnB,EAAAA,cAA8B,2BAA4B,IAAIoB,uBAAwC,CAAElB,UAAY,aAAcC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACnOnB,EAAAA,cAA8B,sBAAuB,IAAIgB,aAA8B,CAAEd,UAAY,sBAAuBC,QAAS,CAAC,IAAIkB,sBAA8C,IAAIJ,EAAAA,iBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC/QnB,EAAAA,cAA8B,cAAe,IAAIgB,aAA8B,CAAEd,UAAY,sBAAuBC,QAAS,CAAC,IAAIkB,sBAA8C,IAAIJ,EAAAA,iBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACvQnB,EAAAA,cAA8B,aAAc,IAAIoB,uBAAwC,CAAElB,UAAY,mBAAoBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC3NnB,EAAAA,cAA8B,mBAAoB,IAAIoB,uBAAwC,CAAElB,UAAY,sBAAuBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACpOnB,EAAAA,cAA8B,gCAAiC,IAAIoB,uBAAwC,CAAElB,UAAY,YAAaC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACvOnB,EAAAA,cAA8B,uBAAwB,IAAIC,eAAgC,CAAEC,UAAY,qBAAsBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC/NnB,EAAAA,eAA8B,EAAGJ,UAE3B,KADqBJ,KAAK8B,SAAW1B,EAAI0B,QACtB,OAAO,EAC1B,MAAMC,EAAW3B,EAAI2B,SAIrB,OAAIA,EAASC,WAAW,iBACpBD,EAASC,WAAW,QACZ,GACX,IAAIvB,EAAAA,aAAgC,CAAEC,UAAY,OAAOuB,sBAAwB,GAAItB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC7LnB,EAAAA,eAA8B,EAAGJ,UAE3B,KADqBJ,KAAK8B,SAAW1B,EAAI0B,QACtB,OAAO,EAE1B,OADiB1B,EAAI2B,SACRC,WAAW,QACb,GACV,IAAIvB,EAAAA,aAAgC,CAAEC,UAAY,SAASuB,sBAAwB,GAAItB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC/LnB,EAAAA,eAA8B,EAAGJ,WACNJ,KAAK8B,SAAW1B,EAAI0B,SAExC,IAAIrB,EAAAA,aAAgC,CAAEC,UAAY,eAAeuB,sBAAwB,GAAItB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,UAAa"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../Users/maxim/AppData/Local/Temp/76ab6c52584ca4a984136248fdee2cf8/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from 'C:/repos/cloudmos/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from 'C:/repos/cloudmos/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from 'C:/repos/cloudmos/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from 'C:/repos/cloudmos/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {StaleWhileRevalidate as workbox_strategies_StaleWhileRevalidate} from 'C:/repos/cloudmos/node_modules/workbox-strategies/StaleWhileRevalidate.mjs';\nimport {RangeRequestsPlugin as workbox_range_requests_RangeRequestsPlugin} from 'C:/repos/cloudmos/node_modules/workbox-range-requests/RangeRequestsPlugin.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from 'C:/repos/cloudmos/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from 'C:/repos/cloudmos/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from 'C:/repos/cloudmos/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"/_next/static/JjcVAQOnFZXbatLlLhuHr/_buildManifest.js\",\n \"revision\": \"652b453ea29668941d7bb825e45e725a\"\n },\n {\n \"url\": \"/_next/static/JjcVAQOnFZXbatLlLhuHr/_ssgManifest.js\",\n \"revision\": \"b6652df95db52feb4daf4eca35380933\"\n },\n {\n \"url\": \"/_next/static/chunks/1134-060024805396f93f.js\",\n \"revision\": \"060024805396f93f\"\n },\n {\n \"url\": \"/_next/static/chunks/1134-060024805396f93f.js.map\",\n \"revision\": \"f58aa85db8737f159077a35d0aed08e5\"\n },\n {\n \"url\": \"/_next/static/chunks/1166-a239214ef6d24b1a.js\",\n \"revision\": \"a239214ef6d24b1a\"\n },\n {\n \"url\": \"/_next/static/chunks/1166-a239214ef6d24b1a.js.map\",\n \"revision\": \"bc1ecf445889a998e6486414b1500749\"\n },\n {\n \"url\": \"/_next/static/chunks/1189.4cc1e5c1defa42f3.js\",\n \"revision\": \"4cc1e5c1defa42f3\"\n },\n {\n \"url\": \"/_next/static/chunks/1189.4cc1e5c1defa42f3.js.map\",\n \"revision\": \"d4ad4c5c22a1c08ec27ca71b306bf6a1\"\n },\n {\n \"url\": \"/_next/static/chunks/1199.401caaa57d9d4991.js\",\n \"revision\": \"401caaa57d9d4991\"\n },\n {\n \"url\": \"/_next/static/chunks/1199.401caaa57d9d4991.js.map\",\n \"revision\": \"e04d19e0101489c55b7708494343fb01\"\n },\n {\n \"url\": \"/_next/static/chunks/1270-06695b5e45dd0c87.js\",\n \"revision\": \"06695b5e45dd0c87\"\n },\n {\n \"url\": \"/_next/static/chunks/1270-06695b5e45dd0c87.js.map\",\n \"revision\": \"9bba3e73153b434dfcdf0056772655e5\"\n },\n {\n \"url\": \"/_next/static/chunks/1280-f358cf851994d83a.js\",\n \"revision\": \"f358cf851994d83a\"\n },\n {\n \"url\": \"/_next/static/chunks/1280-f358cf851994d83a.js.map\",\n \"revision\": \"767e94175744ab33cf54e39034fa081c\"\n },\n {\n \"url\": \"/_next/static/chunks/1567-4b3941a8a3e22145.js\",\n \"revision\": \"4b3941a8a3e22145\"\n },\n {\n \"url\": \"/_next/static/chunks/1567-4b3941a8a3e22145.js.map\",\n \"revision\": \"6bfb945a8c27bf07022d69bd9101df33\"\n },\n {\n \"url\": \"/_next/static/chunks/1588-79b979bf702676a4.js\",\n \"revision\": \"79b979bf702676a4\"\n },\n {\n \"url\": \"/_next/static/chunks/1588-79b979bf702676a4.js.map\",\n \"revision\": \"d73ac3a6bb4cba8e49eaeee711fc5cfe\"\n },\n {\n \"url\": \"/_next/static/chunks/1665-1052f536dfde1b71.js\",\n \"revision\": \"1052f536dfde1b71\"\n },\n {\n \"url\": \"/_next/static/chunks/1665-1052f536dfde1b71.js.map\",\n \"revision\": \"080700fd7bf73ff51000a77b4a8bf941\"\n },\n {\n \"url\": \"/_next/static/chunks/1733-36a5992fc95eb140.js\",\n \"revision\": \"36a5992fc95eb140\"\n },\n {\n \"url\": \"/_next/static/chunks/1733-36a5992fc95eb140.js.map\",\n \"revision\": \"41cfc5c668926a98e1839874d7b814f9\"\n },\n {\n \"url\": \"/_next/static/chunks/1864-2c240c06c2b3e472.js\",\n \"revision\": \"2c240c06c2b3e472\"\n },\n {\n \"url\": \"/_next/static/chunks/1864-2c240c06c2b3e472.js.map\",\n \"revision\": \"f226db147f786033f185e4fafa0a62c3\"\n },\n {\n \"url\": \"/_next/static/chunks/2601-232776c6f940688b.js\",\n \"revision\": \"232776c6f940688b\"\n },\n {\n \"url\": \"/_next/static/chunks/2601-232776c6f940688b.js.map\",\n \"revision\": \"03e1ab562e8d9dde4fcc79cef0392787\"\n },\n {\n \"url\": \"/_next/static/chunks/2615.ed5c4bb5ec872ee6.js\",\n \"revision\": \"ed5c4bb5ec872ee6\"\n },\n {\n \"url\": \"/_next/static/chunks/2615.ed5c4bb5ec872ee6.js.map\",\n \"revision\": \"25890ba34ed4cb4c93b0a1ae984290ad\"\n },\n {\n \"url\": \"/_next/static/chunks/2674-850f531893e0fc3b.js\",\n \"revision\": \"850f531893e0fc3b\"\n },\n {\n \"url\": \"/_next/static/chunks/2674-850f531893e0fc3b.js.map\",\n \"revision\": \"1cc7aab62fa62e1cc7dfb018b848c560\"\n },\n {\n \"url\": \"/_next/static/chunks/2721-f0ebd06b641bd3ad.js\",\n \"revision\": \"f0ebd06b641bd3ad\"\n },\n {\n \"url\": \"/_next/static/chunks/2721-f0ebd06b641bd3ad.js.map\",\n \"revision\": \"6431c43078385ab0ea38052544f35ea9\"\n },\n {\n \"url\": \"/_next/static/chunks/2891-b55cad448c4623ad.js\",\n \"revision\": \"b55cad448c4623ad\"\n },\n {\n \"url\": \"/_next/static/chunks/2891-b55cad448c4623ad.js.map\",\n \"revision\": \"276f900f0ffcc78af15e4d71747f67b3\"\n },\n {\n \"url\": \"/_next/static/chunks/2928.ff93bc87ea910d9f.js\",\n \"revision\": \"ff93bc87ea910d9f\"\n },\n {\n \"url\": \"/_next/static/chunks/2928.ff93bc87ea910d9f.js.map\",\n \"revision\": \"acdd23871ec2a4a45bd920d8e5c5ac35\"\n },\n {\n \"url\": \"/_next/static/chunks/3269-4ef33d40b0229c1b.js\",\n \"revision\": \"4ef33d40b0229c1b\"\n },\n {\n \"url\": \"/_next/static/chunks/3269-4ef33d40b0229c1b.js.map\",\n \"revision\": \"dc02ff4a163c5c56daad1c1b9a319b8d\"\n },\n {\n \"url\": \"/_next/static/chunks/3311-a5d4efd2728c5857.js\",\n \"revision\": \"a5d4efd2728c5857\"\n },\n {\n \"url\": \"/_next/static/chunks/3311-a5d4efd2728c5857.js.map\",\n \"revision\": \"26c81d458b9628b64190a6aac3d541d7\"\n },\n {\n \"url\": \"/_next/static/chunks/4118-bbce4979e4854e5a.js\",\n \"revision\": \"bbce4979e4854e5a\"\n },\n {\n \"url\": \"/_next/static/chunks/4118-bbce4979e4854e5a.js.map\",\n \"revision\": \"b48e0eb4156cb3af3fad70eea8890e01\"\n },\n {\n \"url\": \"/_next/static/chunks/4608.b9b818fd3fc948c0.js\",\n \"revision\": \"b9b818fd3fc948c0\"\n },\n {\n \"url\": \"/_next/static/chunks/4608.b9b818fd3fc948c0.js.map\",\n \"revision\": \"b98aa1260b8770ff80e2549609d3b552\"\n },\n {\n \"url\": \"/_next/static/chunks/4618-c02be8493604ced3.js\",\n \"revision\": \"c02be8493604ced3\"\n },\n {\n \"url\": \"/_next/static/chunks/4618-c02be8493604ced3.js.map\",\n \"revision\": \"bad1387804fd72f6240e81c8a317a6da\"\n },\n {\n \"url\": \"/_next/static/chunks/4800.a6d4c2045571a3a1.js\",\n \"revision\": \"a6d4c2045571a3a1\"\n },\n {\n \"url\": \"/_next/static/chunks/4800.a6d4c2045571a3a1.js.map\",\n \"revision\": \"1bea97f6d3385ec3dccf59d81f2682cc\"\n },\n {\n \"url\": \"/_next/static/chunks/4961.791b28d81d71f433.js\",\n \"revision\": \"791b28d81d71f433\"\n },\n {\n \"url\": \"/_next/static/chunks/4961.791b28d81d71f433.js.map\",\n \"revision\": \"dc48df2521b9cdbcd7c3adcd6e748caf\"\n },\n {\n \"url\": \"/_next/static/chunks/6033-7fb3f69aa5ceae6a.js\",\n \"revision\": \"7fb3f69aa5ceae6a\"\n },\n {\n \"url\": \"/_next/static/chunks/6033-7fb3f69aa5ceae6a.js.map\",\n \"revision\": \"77dc579dbe15bbc83026f637143d9802\"\n },\n {\n \"url\": \"/_next/static/chunks/6424.419a6cf980d6d2db.js\",\n \"revision\": \"419a6cf980d6d2db\"\n },\n {\n \"url\": \"/_next/static/chunks/6424.419a6cf980d6d2db.js.map\",\n \"revision\": \"cce829f16095a0ac2e32cb614ba9d2da\"\n },\n {\n \"url\": \"/_next/static/chunks/6726-6dc5f9bf6bd44c80.js\",\n \"revision\": \"6dc5f9bf6bd44c80\"\n },\n {\n \"url\": \"/_next/static/chunks/6726-6dc5f9bf6bd44c80.js.map\",\n \"revision\": \"4bee244a4d683022d3fc191dfeee2f2a\"\n },\n {\n \"url\": \"/_next/static/chunks/6778.194ba7a60cdbd2ae.js\",\n \"revision\": \"194ba7a60cdbd2ae\"\n },\n {\n \"url\": \"/_next/static/chunks/6778.194ba7a60cdbd2ae.js.map\",\n \"revision\": \"913ca7bb59ea6add0171ad93b71111d8\"\n },\n {\n \"url\": \"/_next/static/chunks/6dd150ba.64b5afd105402a95.js\",\n \"revision\": \"64b5afd105402a95\"\n },\n {\n \"url\": \"/_next/static/chunks/6dd150ba.64b5afd105402a95.js.map\",\n \"revision\": \"1384f4b07003004abdcc5fa87d28fce2\"\n },\n {\n \"url\": \"/_next/static/chunks/7015.a11b4ff5c7ac8194.js\",\n \"revision\": \"a11b4ff5c7ac8194\"\n },\n {\n \"url\": \"/_next/static/chunks/7015.a11b4ff5c7ac8194.js.map\",\n \"revision\": \"b69cc5a69150812c29d4a8f9b47bc8c6\"\n },\n {\n \"url\": \"/_next/static/chunks/7118-c5bc6fa870d9014a.js\",\n \"revision\": \"c5bc6fa870d9014a\"\n },\n {\n \"url\": \"/_next/static/chunks/7314-253bbd3922832c0b.js\",\n \"revision\": \"253bbd3922832c0b\"\n },\n {\n \"url\": \"/_next/static/chunks/7314-253bbd3922832c0b.js.map\",\n \"revision\": \"1542f5b57a5aa6600733b4d20c46dbbc\"\n },\n {\n \"url\": \"/_next/static/chunks/7717-d3003d5d0d954032.js\",\n \"revision\": \"d3003d5d0d954032\"\n },\n {\n \"url\": \"/_next/static/chunks/7717-d3003d5d0d954032.js.map\",\n \"revision\": \"ad491b3ba680ad50b1fcec18d08bcf55\"\n },\n {\n \"url\": \"/_next/static/chunks/7725.990fb3c07f9a9dbc.js\",\n \"revision\": \"990fb3c07f9a9dbc\"\n },\n {\n \"url\": \"/_next/static/chunks/7725.990fb3c07f9a9dbc.js.map\",\n \"revision\": \"0c676813f732ecdee914bf17c30a6360\"\n },\n {\n \"url\": \"/_next/static/chunks/7879-71c9fcbd0b2e23ca.js\",\n \"revision\": \"71c9fcbd0b2e23ca\"\n },\n {\n \"url\": \"/_next/static/chunks/7879-71c9fcbd0b2e23ca.js.map\",\n \"revision\": \"b4191092daf58d17ba388d3d51adf80a\"\n },\n {\n \"url\": \"/_next/static/chunks/87d427d2-f644a880d2332fb2.js\",\n \"revision\": \"f644a880d2332fb2\"\n },\n {\n \"url\": \"/_next/static/chunks/8871-1f647fa5615d1805.js\",\n \"revision\": \"1f647fa5615d1805\"\n },\n {\n \"url\": \"/_next/static/chunks/8871-1f647fa5615d1805.js.map\",\n \"revision\": \"0875d65c9f22e30099683f5db80c95ad\"\n },\n {\n \"url\": \"/_next/static/chunks/9226-4c34d6b1fcd17748.js\",\n \"revision\": \"4c34d6b1fcd17748\"\n },\n {\n \"url\": \"/_next/static/chunks/9226-4c34d6b1fcd17748.js.map\",\n \"revision\": \"1841067bfdf6fde56ba8a61b878eb1b0\"\n },\n {\n \"url\": \"/_next/static/chunks/9433.d40955b54963ff98.js\",\n \"revision\": \"d40955b54963ff98\"\n },\n {\n \"url\": \"/_next/static/chunks/9433.d40955b54963ff98.js.map\",\n \"revision\": \"d31d0af5dde8e5af63b41033a0449cb9\"\n },\n {\n \"url\": \"/_next/static/chunks/9435.722cdc3f0a842f0e.js\",\n \"revision\": \"722cdc3f0a842f0e\"\n },\n {\n \"url\": \"/_next/static/chunks/9435.722cdc3f0a842f0e.js.map\",\n \"revision\": \"7ef9b0e9ce7e2d49aa96e09d6d7e93a3\"\n },\n {\n \"url\": \"/_next/static/chunks/9441-dc231b8b03fbe64d.js\",\n \"revision\": \"dc231b8b03fbe64d\"\n },\n {\n \"url\": \"/_next/static/chunks/9441-dc231b8b03fbe64d.js.map\",\n \"revision\": \"785577b6a97c55e36664186b20a80a4e\"\n },\n {\n \"url\": \"/_next/static/chunks/9534-f42e4c9f880208f6.js\",\n \"revision\": \"f42e4c9f880208f6\"\n },\n {\n \"url\": \"/_next/static/chunks/9534-f42e4c9f880208f6.js.map\",\n \"revision\": \"a5dcaa783b26ea1e874868b8c4d18c21\"\n },\n {\n \"url\": \"/_next/static/chunks/982-fa48caa31481a42c.js\",\n \"revision\": \"fa48caa31481a42c\"\n },\n {\n \"url\": \"/_next/static/chunks/982-fa48caa31481a42c.js.map\",\n \"revision\": \"a67694d3b931781a4902cb09a7d2ccfb\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-48b742837832a3b5.js\",\n \"revision\": \"48b742837832a3b5\"\n },\n {\n \"url\": \"/_next/static/chunks/framework-48b742837832a3b5.js.map\",\n \"revision\": \"2b40a60a66108548bf9636193694ed01\"\n },\n {\n \"url\": \"/_next/static/chunks/main-e0442a3a4cf377c0.js\",\n \"revision\": \"e0442a3a4cf377c0\"\n },\n {\n \"url\": \"/_next/static/chunks/main-e0442a3a4cf377c0.js.map\",\n \"revision\": \"0d56e9ea604706a6899edc8c80858d39\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/404-fbf3343f318ade33.js\",\n \"revision\": \"fbf3343f318ade33\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/404-fbf3343f318ade33.js.map\",\n \"revision\": \"93e84dd4d49acb1c6d19e3a618b36415\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/500-bcd0e3bcc7517edb.js\",\n \"revision\": \"bcd0e3bcc7517edb\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/500-bcd0e3bcc7517edb.js.map\",\n \"revision\": \"956c402d12f953479726780e34fba1d6\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-511479c77bb2be13.js\",\n \"revision\": \"511479c77bb2be13\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/_error-511479c77bb2be13.js.map\",\n \"revision\": \"5a48916ea1c0233a4c58bd49e0b55fbe\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/contact-c460ca8ccde54b12.js\",\n \"revision\": \"c460ca8ccde54b12\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/contact-c460ca8ccde54b12.js.map\",\n \"revision\": \"dc9b3dc79338fa0ef2ed6668061e1fc2\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deploy-linux-23c9be43000af12a.js\",\n \"revision\": \"23c9be43000af12a\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deploy-linux-23c9be43000af12a.js.map\",\n \"revision\": \"4ac9d3ab2af06534c69abd51059591fa\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments-a00c3173095d34fb.js\",\n \"revision\": \"a00c3173095d34fb\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments-a00c3173095d34fb.js.map\",\n \"revision\": \"0f4b427c36b2002c5c29724283b81202\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments/%5Bdseq%5D-bcdb49ca85d696e5.js\",\n \"revision\": \"bcdb49ca85d696e5\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/deployments/%5Bdseq%5D-bcdb49ca85d696e5.js.map\",\n \"revision\": \"b441e72589c45d9a958cd621bcad5577\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/faq-aec6845f07f34a57.js\",\n \"revision\": \"aec6845f07f34a57\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/faq-aec6845f07f34a57.js.map\",\n \"revision\": \"8739089394d8733fceecf39444262da6\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started-c8f4953957abb605.js\",\n \"revision\": \"c8f4953957abb605\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started-c8f4953957abb605.js.map\",\n \"revision\": \"e45442e931a1fb453693fd1847fccc74\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started/wallet-1aee174b2b799709.js\",\n \"revision\": \"1aee174b2b799709\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/get-started/wallet-1aee174b2b799709.js.map\",\n \"revision\": \"e5200dd538c1bc6feb6d6455c708f1a7\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-cd034d00d4896429.js\",\n \"revision\": \"cd034d00d4896429\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/index-cd034d00d4896429.js.map\",\n \"revision\": \"63952c3eba384e57ff94c9c3c907bf47\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/maintenance-120a58f5264a511c.js\",\n \"revision\": \"120a58f5264a511c\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/maintenance-120a58f5264a511c.js.map\",\n \"revision\": \"aa65c449936488df06deaf7300aa8b29\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/new-deployment-d2df306166b0670f.js\",\n \"revision\": \"d2df306166b0670f\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/new-deployment-d2df306166b0670f.js.map\",\n \"revision\": \"4e741ff57280e31df36f0f872b288e82\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/privacy-policy-5d219078a5a2b589.js\",\n \"revision\": \"5d219078a5a2b589\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/privacy-policy-5d219078a5a2b589.js.map\",\n \"revision\": \"c868ed31022a27bb65d1a2eb34713ece\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/profile/%5Busername%5D-6e16356a5d1d47cc.js\",\n \"revision\": \"6e16356a5d1d47cc\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/profile/%5Busername%5D-6e16356a5d1d47cc.js.map\",\n \"revision\": \"c601f4380619097b851c42be189b422e\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers-3d9f41d49f85bb58.js\",\n \"revision\": \"3d9f41d49f85bb58\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers-3d9f41d49f85bb58.js.map\",\n \"revision\": \"9bdf2b1bbb0e8e1ba1964424d3d467b2\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D-377a86545e9d2fb0.js\",\n \"revision\": \"377a86545e9d2fb0\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D-377a86545e9d2fb0.js.map\",\n \"revision\": \"6f204261fd719d6b26e221d6c68cd663\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-95a1a2299a4ecbd8.js\",\n \"revision\": \"95a1a2299a4ecbd8\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/edit-95a1a2299a4ecbd8.js.map\",\n \"revision\": \"3b21db66b4d39dd28b43120da7eb53cd\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-74feff18622f6ace.js\",\n \"revision\": \"74feff18622f6ace\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/leases-74feff18622f6ace.js.map\",\n \"revision\": \"dd4c42fa524bf05b6acec95d333f328d\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-db7c9221d20cae64.js\",\n \"revision\": \"db7c9221d20cae64\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/providers/%5Bowner%5D/raw-db7c9221d20cae64.js.map\",\n \"revision\": \"7440d9a212d32064ce2f9fe928fb1ac6\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/rent-gpu-f4d1d107282842d1.js\",\n \"revision\": \"f4d1d107282842d1\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/rent-gpu-f4d1d107282842d1.js.map\",\n \"revision\": \"e591e072e7964b72be4e52aecc717de7\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sdl-builder-1a5fe6e914c8bf9c.js\",\n \"revision\": \"1a5fe6e914c8bf9c\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/sdl-builder-1a5fe6e914c8bf9c.js.map\",\n \"revision\": \"c06dd3a1ed973219023647be841588aa\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings-2a2a7dd5eca3d3b1.js\",\n \"revision\": \"2a2a7dd5eca3d3b1\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings-2a2a7dd5eca3d3b1.js.map\",\n \"revision\": \"f248b5224bcf180ca578ce3e8ff20d1e\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings/authorizations-80c2f49b131a5aa7.js\",\n \"revision\": \"80c2f49b131a5aa7\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/settings/authorizations-80c2f49b131a5aa7.js.map\",\n \"revision\": \"513ed6df51cc05eabf7810f194b2f1b9\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/template/%5Bid%5D-587a8a4868c12f9a.js\",\n \"revision\": \"587a8a4868c12f9a\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/template/%5Bid%5D-587a8a4868c12f9a.js.map\",\n \"revision\": \"f032843469d6ed1162c123f80242831c\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates-bc34d9ca54d08dd9.js\",\n \"revision\": \"bc34d9ca54d08dd9\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates-bc34d9ca54d08dd9.js.map\",\n \"revision\": \"9c1a1d685636ed9817c6f5fd3992eed1\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates/%5BtemplateId%5D-f5184d243fa01871.js\",\n \"revision\": \"f5184d243fa01871\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/templates/%5BtemplateId%5D-f5184d243fa01871.js.map\",\n \"revision\": \"a129f04240de49532291bf2263d46b6c\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/terms-of-service-c53f3d98181c6258.js\",\n \"revision\": \"c53f3d98181c6258\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/terms-of-service-c53f3d98181c6258.js.map\",\n \"revision\": \"8cd359a500f7470a561af7606bb2d085\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings-9c1b2afb8954da61.js\",\n \"revision\": \"9c1b2afb8954da61\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings-9c1b2afb8954da61.js.map\",\n \"revision\": \"3e75f649427151732dd17e6f2bed4c52\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings/favorites-7877137575f375d7.js\",\n \"revision\": \"7877137575f375d7\"\n },\n {\n \"url\": \"/_next/static/chunks/pages/user/settings/favorites-7877137575f375d7.js.map\",\n \"revision\": \"586fb4e67708c01512f143f111aa287c\"\n },\n {\n \"url\": \"/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js\",\n \"revision\": \"79330112775102f91e1010318bae2bd3\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-5a54c6233d75fd8d.js\",\n \"revision\": \"5a54c6233d75fd8d\"\n },\n {\n \"url\": \"/_next/static/chunks/webpack-5a54c6233d75fd8d.js.map\",\n \"revision\": \"a28bb2c3378284ec1a5645f7962cdba0\"\n },\n {\n \"url\": \"/_next/static/css/60da0364ed65e94f.css\",\n \"revision\": \"60da0364ed65e94f\"\n },\n {\n \"url\": \"/_next/static/css/60da0364ed65e94f.css.map\",\n \"revision\": \"7ebdaca80e1b94a3afdc509e9729e2f4\"\n },\n {\n \"url\": \"/_next/static/css/6f12c16d317846a2.css\",\n \"revision\": \"6f12c16d317846a2\"\n },\n {\n \"url\": \"/_next/static/css/85fa6dafca566008.css\",\n \"revision\": \"85fa6dafca566008\"\n },\n {\n \"url\": \"/_next/static/css/85fa6dafca566008.css.map\",\n \"revision\": \"e1c00d68c2a092625defb4c86bdb56ae\"\n },\n {\n \"url\": \"/_next/static/media/e11418ac562b8ac1-s.p.woff2\",\n \"revision\": \"0e46e732cced180e3a2c7285100f27d4\"\n },\n {\n \"url\": \"/akash-console.png\",\n \"revision\": \"4ab11b341159b007fc63d28631e0a8d8\"\n },\n {\n \"url\": \"/android-chrome-192x192.png\",\n \"revision\": \"a2eeed7b0d4a8c9bd9fa014378ac733e\"\n },\n {\n \"url\": \"/android-chrome-256x256.png\",\n \"revision\": \"b0dc3017fadbf0f4c323636535f582b7\"\n },\n {\n \"url\": \"/android-chrome-384x384.png\",\n \"revision\": \"3fae18e8537ff0745221e5aec66c247b\"\n },\n {\n \"url\": \"/apple-touch-icon.png\",\n \"revision\": \"43451e961475b8323dcfb705fb6eb480\"\n },\n {\n \"url\": \"/browserconfig.xml\",\n \"revision\": \"e41ebb6b49206a59d8eafce8220ebeac\"\n },\n {\n \"url\": \"/favicon-16x16.png\",\n \"revision\": \"8cf7a2775f6f6d6db07b95197538b11b\"\n },\n {\n \"url\": \"/favicon-32x32.png\",\n \"revision\": \"bef7d8e9aaed7fb3ef49cbffa31b5339\"\n },\n {\n \"url\": \"/favicon.ico\",\n \"revision\": \"cfebc107c597696c596a277239546a86\"\n },\n {\n \"url\": \"/images/akash-logo-dark.png\",\n \"revision\": \"b1623e407dad710a4c0c73461bbb8bb3\"\n },\n {\n \"url\": \"/images/akash-logo-flat-dark.png\",\n \"revision\": \"50b4ad6438e791047d97da0af65b96f5\"\n },\n {\n \"url\": \"/images/akash-logo-flat-light.png\",\n \"revision\": \"2befec2d17a2b6a32b1a0517ca1baf01\"\n },\n {\n \"url\": \"/images/akash-logo-light.png\",\n \"revision\": \"0ea30905c72eda674ad74c65d0c062bf\"\n },\n {\n \"url\": \"/images/akash-logo.svg\",\n \"revision\": \"4a5f3eaf31bf0f88ff3baec6281c8de3\"\n },\n {\n \"url\": \"/images/chains/akash.png\",\n \"revision\": \"d0b3f8ccaa3b0d18ef4039f86edf4436\"\n },\n {\n \"url\": \"/images/chains/atom.png\",\n \"revision\": \"6e4d88ad2c295e811fee29cc89edfcb1\"\n },\n {\n \"url\": \"/images/chains/evmos.png\",\n \"revision\": \"487a456e9091dec9ddf18892531401f8\"\n },\n {\n \"url\": \"/images/chains/huahua.png\",\n \"revision\": \"f0ba8427522833bba44962e87e982412\"\n },\n {\n \"url\": \"/images/chains/juno.png\",\n \"revision\": \"933b7d992dc67fd2f0d0f35e182b3361\"\n },\n {\n \"url\": \"/images/chains/kuji.png\",\n \"revision\": \"9c31e679007e5ae16fc28e067d907f79\"\n },\n {\n \"url\": \"/images/chains/osmo.png\",\n \"revision\": \"6940c69c28e5d85d99ba498fc7e95a26\"\n },\n {\n \"url\": \"/images/chains/scrt.png\",\n \"revision\": \"0dd98be17447cf7c47d27153f534ca60\"\n },\n {\n \"url\": \"/images/chains/stars.png\",\n \"revision\": \"56d0bd40e52f010c7267eb78c53138f2\"\n },\n {\n \"url\": \"/images/chains/strd.png\",\n \"revision\": \"eebdfb53ba0bc9bba88b0bede7a44f6d\"\n },\n {\n \"url\": \"/images/cloudmos-logo-light.png\",\n \"revision\": \"a7423327e4280225e176da92c6176c28\"\n },\n {\n \"url\": \"/images/cloudmos-logo-small.jpg\",\n \"revision\": \"4b339b83e7dc396894537b83d794726d\"\n },\n {\n \"url\": \"/images/cloudmos-logo.png\",\n \"revision\": \"56d87e0230a0ad5dd745efd486a33a58\"\n },\n {\n \"url\": \"/images/docker.png\",\n \"revision\": \"fde0ed6a2add0ffabfbc5a7749fdfff2\"\n },\n {\n \"url\": \"/images/faq/change-node.png\",\n \"revision\": \"9421f6443f6c4397887035e50d8c9b24\"\n },\n {\n \"url\": \"/images/faq/update-deployment-btn.png\",\n \"revision\": \"ebc7f6907a08fdf6a6cd5a87043456fd\"\n },\n {\n \"url\": \"/images/keplr-logo.png\",\n \"revision\": \"50397e4902a33a6045c0f23dfe5cb1bd\"\n },\n {\n \"url\": \"/images/leap-cosmos-logo.png\",\n \"revision\": \"a54ced7748b33565e6dc1ea1c5b1ef52\"\n },\n {\n \"url\": \"/images/powered-by-akash-dark.svg\",\n \"revision\": \"3ea920f030ede7926a02c2dc17e332c4\"\n },\n {\n \"url\": \"/images/powered-by-akash.svg\",\n \"revision\": \"24b2566094fafded6c325246fe84c2a9\"\n },\n {\n \"url\": \"/images/ubuntu.png\",\n \"revision\": \"c631b8fae270a618c1fe1c9d43097189\"\n },\n {\n \"url\": \"/images/wallet-connect-logo.png\",\n \"revision\": \"8379e4d4e7267b47a0b5b89807a4d8f8\"\n },\n {\n \"url\": \"/manifest.json\",\n \"revision\": \"a030fca8a5c7b8e2e1b5d7614a8b74fa\"\n },\n {\n \"url\": \"/mstile-150x150.png\",\n \"revision\": \"17614fed638be1d5e2225b9d5419336a\"\n },\n {\n \"url\": \"/robots.txt\",\n \"revision\": \"c2bb774b8071c957d2b835beaa28a58b\"\n },\n {\n \"url\": \"/safari-pinned-tab.svg\",\n \"revision\": \"86b02210e078cb763098dfec594f4f04\"\n }\n], {\n \"ignoreURLParametersMatching\": []\n});\nworkbox_precaching_cleanupOutdatedCaches();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.(?:gstatic)\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"google-fonts-webfonts\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 31536000 })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.(?:googleapis)\\.com\\/.*/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"google-fonts-stylesheets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-font-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 4, maxAgeSeconds: 604800 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-image-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/image\\?url=.+$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-image\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 64, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:mp3|wav|ogg)$/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"static-audio-assets\", plugins: [new workbox_range_requests_RangeRequestsPlugin(), new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:mp4)$/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"static-video-assets\", plugins: [new workbox_range_requests_RangeRequestsPlugin(), new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:js)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-js-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|less)$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"static-style-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\/_next\\/data\\/.+\\/.+\\.json$/i, new workbox_strategies_StaleWhileRevalidate({ \"cacheName\":\"next-data\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:json|xml|csv)$/i, new workbox_strategies_NetworkFirst({ \"cacheName\":\"static-data-assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({ url }) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n // Exclude /api/auth/callback/* to fix OAuth workflow in Safari without impact other environment\n // Above route is default for next-auth, you may need to change it if your OAuth workflow has a different callback route\n // Issue: https://github.com/shadowwalker/next-pwa/issues/131#issuecomment-821894809\n if (pathname.startsWith('/api/auth/')) return false\n if (pathname.startsWith('/api/')) return true\n return false\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"apis\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 16, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({ url }) => {\n const isSameOrigin = self.origin === url.origin\n if (!isSameOrigin) return false\n const pathname = url.pathname\n if (pathname.startsWith('/api/')) return false\n return true\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"others\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 86400 })] }), 'GET');\nworkbox_routing_registerRoute(({ url }) => {\n const isSameOrigin = self.origin === url.origin\n return !isSameOrigin\n }, new workbox_strategies_NetworkFirst({ \"cacheName\":\"cross-origin\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 32, maxAgeSeconds: 3600 })] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","ignoreURLParametersMatching","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","cacheName","plugins","cacheWillUpdate","async","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_CacheFirst","workbox_expiration_ExpirationPlugin","maxEntries","maxAgeSeconds","workbox_strategies_StaleWhileRevalidate","workbox_range_requests_RangeRequestsPlugin","origin","pathname","startsWith","networkTimeoutSeconds"],"mappings":"0nBAqBAA,gBAUAC,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oBAEd,CACED,IAAO,wDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oBAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,+CACPC,SAAY,oBAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,gDACPC,SAAY,oBAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,wDACPC,SAAY,oBAEd,CACED,IAAO,4DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oBAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,8DACPC,SAAY,oBAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oBAEd,CACED,IAAO,4EACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oBAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oBAEd,CACED,IAAO,wEACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oBAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oBAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oBAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oBAEd,CACED,IAAO,4EACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oBAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,uEACPC,SAAY,oBAEd,CACED,IAAO,2EACPC,SAAY,oCAEd,CACED,IAAO,4EACPC,SAAY,oBAEd,CACED,IAAO,gFACPC,SAAY,oCAEd,CACED,IAAO,8EACPC,SAAY,oBAEd,CACED,IAAO,kFACPC,SAAY,oCAEd,CACED,IAAO,2EACPC,SAAY,oBAEd,CACED,IAAO,+EACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oBAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oBAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,0DACPC,SAAY,oBAEd,CACED,IAAO,8DACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oBAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oBAEd,CACED,IAAO,uEACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oBAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,4EACPC,SAAY,oBAEd,CACED,IAAO,gFACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oBAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oBAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oBAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oBAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oBAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oBAEd,CACED,IAAO,yCACPC,SAAY,oBAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,iDACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,eACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,2BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,oCACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,qBACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,iBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,qCAEb,CACDC,4BAA+B,KAEjCC,EAAAA,wBAIAC,EAAAA,cAA8B,IAAK,IAAIC,eAAgC,CAAEC,UAAY,YAAaC,QAAS,CAAC,CAAEC,gBAAiBC,OAASC,UAASC,WAAUC,QAAOC,WAAkBF,GAA8B,mBAAlBA,EAASG,KAAoC,IAAIC,SAASJ,EAASK,KAAM,CAAEC,OAAQ,IAAKC,WAAY,KAAMC,QAASR,EAASQ,UAAoBR,MAAkB,OAClWP,EAAAA,cAA8B,0CAA2C,IAAIgB,aAA8B,CAAEd,UAAY,wBAAyBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,aAAiB,OACrPnB,EAAAA,cAA8B,6CAA8C,IAAIoB,uBAAwC,CAAElB,UAAY,2BAA4BC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,YAAe,OACnQnB,EAAAA,cAA8B,8CAA+C,IAAIoB,uBAAwC,CAAElB,UAAY,qBAAsBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,EAAGC,cAAe,YAAe,OAC9PnB,EAAAA,cAA8B,wCAAyC,IAAIoB,uBAAwC,CAAElB,UAAY,sBAAuBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACzPnB,EAAAA,cAA8B,2BAA4B,IAAIoB,uBAAwC,CAAElB,UAAY,aAAcC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACnOnB,EAAAA,cAA8B,sBAAuB,IAAIgB,aAA8B,CAAEd,UAAY,sBAAuBC,QAAS,CAAC,IAAIkB,sBAA8C,IAAIJ,EAAAA,iBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC/QnB,EAAAA,cAA8B,cAAe,IAAIgB,aAA8B,CAAEd,UAAY,sBAAuBC,QAAS,CAAC,IAAIkB,sBAA8C,IAAIJ,EAAAA,iBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACvQnB,EAAAA,cAA8B,aAAc,IAAIoB,uBAAwC,CAAElB,UAAY,mBAAoBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC3NnB,EAAAA,cAA8B,mBAAoB,IAAIoB,uBAAwC,CAAElB,UAAY,sBAAuBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACpOnB,EAAAA,cAA8B,gCAAiC,IAAIoB,uBAAwC,CAAElB,UAAY,YAAaC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OACvOnB,EAAAA,cAA8B,uBAAwB,IAAIC,eAAgC,CAAEC,UAAY,qBAAsBC,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC/NnB,EAAAA,eAA8B,EAAGJ,UAE3B,KADqBJ,KAAK8B,SAAW1B,EAAI0B,QACtB,OAAO,EAC1B,MAAMC,EAAW3B,EAAI2B,SAIrB,OAAIA,EAASC,WAAW,iBACpBD,EAASC,WAAW,QACZ,GACX,IAAIvB,EAAAA,aAAgC,CAAEC,UAAY,OAAOuB,sBAAwB,GAAItB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC7LnB,EAAAA,eAA8B,EAAGJ,UAE3B,KADqBJ,KAAK8B,SAAW1B,EAAI0B,QACtB,OAAO,EAE1B,OADiB1B,EAAI2B,SACRC,WAAW,QACb,GACV,IAAIvB,EAAAA,aAAgC,CAAEC,UAAY,SAASuB,sBAAwB,GAAItB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,WAAc,OAC/LnB,EAAAA,eAA8B,EAAGJ,WACNJ,KAAK8B,SAAW1B,EAAI0B,SAExC,IAAIrB,EAAAA,aAAgC,CAAEC,UAAY,eAAeuB,sBAAwB,GAAItB,QAAS,CAAC,IAAIc,mBAAoC,CAAEC,WAAY,GAAIC,cAAe,UAAa"} \ No newline at end of file diff --git a/apps/deploy-web/src/components/deployments/DeploymentDetail.tsx b/apps/deploy-web/src/components/deployments/DeploymentDetail.tsx index 813595f07..a1d545f85 100644 --- a/apps/deploy-web/src/components/deployments/DeploymentDetail.tsx +++ b/apps/deploy-web/src/components/deployments/DeploymentDetail.tsx @@ -9,12 +9,15 @@ import { useRouter, useSearchParams } from "next/navigation"; import { NextSeo } from "next-seo"; import { event } from "nextjs-google-analytics"; +import { CI_CD_TEMPLATE_ID } from "@src/config/remote-deploy.config"; import { useCertificate } from "@src/context/CertificateProvider"; import { useSettings } from "@src/context/SettingsProvider"; +import { useTemplates } from "@src/context/TemplatesProvider"; import { useWallet } from "@src/context/WalletProvider"; import { useDeploymentDetail } from "@src/queries/useDeploymentQuery"; import { useDeploymentLeaseList } from "@src/queries/useLeaseQuery"; import { useProviderList } from "@src/queries/useProvidersQuery"; +import { extractRepositoryUrl, isImageInYaml } from "@src/services/remote-deploy/remote-deployment-controller.service"; import { RouteStep } from "@src/types/route-steps.type"; import { AnalyticsEvents } from "@src/utils/analytics"; import { getDeploymentLocalData } from "@src/utils/deploymentLocalDataUtils"; @@ -31,10 +34,16 @@ import { ManifestUpdate } from "./ManifestUpdate"; export function DeploymentDetail({ dseq }: React.PropsWithChildren<{ dseq: string }>) { const router = useRouter(); const [activeTab, setActiveTab] = useState("LEASES"); + const [editedManifest, setEditedManifest] = useState(null); const { address, isWalletLoaded } = useWallet(); const { isSettingsInit } = useSettings(); const [leaseRefs, setLeaseRefs] = useState>([]); const [deploymentManifest, setDeploymentManifest] = useState(null); + const { getTemplateById } = useTemplates(); + const remoteDeployTemplate = getTemplateById(CI_CD_TEMPLATE_ID); + const isRemoteDeploy: boolean = !!editedManifest && !!isImageInYaml(editedManifest, remoteDeployTemplate?.deploy); + const repo: string | null = isRemoteDeploy ? extractRepositoryUrl(editedManifest) : null; + const { data: deployment, isFetching: isLoadingDeployment, @@ -45,7 +54,6 @@ export function DeploymentDetail({ dseq }: React.PropsWithChildren<{ dseq: strin if (_deploymentDetail) { getLeases(); getProviders(); - const deploymentData = getDeploymentLocalData(dseq); setDeploymentManifest(deploymentData?.manifest || ""); } @@ -84,6 +92,7 @@ export function DeploymentDetail({ dseq }: React.PropsWithChildren<{ dseq: strin const { isLocalCertMatching, localCert, isCreatingCert, createCertificate } = useCertificate(); const { data: providers, isFetching: isLoadingProviders, refetch: getProviders } = useProviderList(); const isActive = deployment?.state === "active" && leases?.some(x => x.state === "active"); + const searchParams = useSearchParams(); const tabQuery = searchParams?.get("tab"); const logsModeQuery = searchParams?.get("logsMode"); @@ -189,6 +198,9 @@ export function DeploymentDetail({ dseq }: React.PropsWithChildren<{ dseq: strin {activeTab === "EDIT" && deployment && leases && ( { @@ -215,6 +227,7 @@ export function DeploymentDetail({ dseq }: React.PropsWithChildren<{ dseq: strin {leases && leases.map((lease, i) => ( ))} diff --git a/apps/deploy-web/src/components/deployments/LeaseRow.tsx b/apps/deploy-web/src/components/deployments/LeaseRow.tsx index 1f9847ab0..10f2d7843 100644 --- a/apps/deploy-web/src/components/deployments/LeaseRow.tsx +++ b/apps/deploy-web/src/components/deployments/LeaseRow.tsx @@ -42,6 +42,8 @@ type Props = { dseq: string; providers: ApiProviderList[]; loadDeploymentDetail: () => void; + isRemoteDeploy?: boolean; + repo?: string | null; }; export type AcceptRefType = { @@ -49,7 +51,7 @@ export type AcceptRefType = { }; export const LeaseRow = React.forwardRef( - ({ index, lease, setActiveTab, deploymentManifest, dseq, providers, loadDeploymentDetail }, ref) => { + ({ index, lease, setActiveTab, deploymentManifest, dseq, providers, loadDeploymentDetail, isRemoteDeploy, repo }, ref) => { const provider = providers?.find(p => p.owner === lease?.provider); const { localCert } = useCertificate(); const isLeaseActive = lease.state === "active"; @@ -212,7 +214,7 @@ export const LeaseRow = React.forwardRef( /> {isLeaseActive && isLoadingProviderStatus && } @@ -326,7 +328,7 @@ export const LeaseRow = React.forwardRef( - {leaseStatus.forwarded_ports && leaseStatus.forwarded_ports[service.name]?.length > 0 && ( + {leaseStatus.forwarded_ports && leaseStatus.forwarded_ports[service.name]?.length > 0 && !isRemoteDeploy && (
0 })}> (
)} + {isRemoteDeploy && repo && ( +
+ +
    +
  • + + {repo?.replace("https://github.com/", "")?.replace("https://gitlab.com/", "")} + +
  • +
+
+ )} {service.uris?.length > 0 && ( <>
diff --git a/apps/deploy-web/src/components/deployments/ManifestUpdate.tsx b/apps/deploy-web/src/components/deployments/ManifestUpdate.tsx index 3a8c5672c..e36adeaa1 100644 --- a/apps/deploy-web/src/components/deployments/ManifestUpdate.tsx +++ b/apps/deploy-web/src/components/deployments/ManifestUpdate.tsx @@ -22,6 +22,7 @@ import { deploymentData } from "@src/utils/deploymentData"; import { getDeploymentLocalData, saveDeploymentManifest } from "@src/utils/deploymentLocalDataUtils"; import { sendManifestToProvider } from "@src/utils/deploymentUtils"; import { TransactionMessageData } from "@src/utils/TransactionMessageData"; +import RemoteDeployUpdate from "../remote-deploy/update/RemoteDeployUpdate"; import { ManifestErrorSnackbar } from "../shared/ManifestErrorSnackbar"; import { Title } from "../shared/Title"; @@ -29,14 +30,23 @@ type Props = { deployment: DeploymentDto; leases: LeaseDto[]; closeManifestEditor: () => void; + isRemoteDeploy: boolean; + editedManifest: string; + onManifestChange: (value: string) => void; }; -export const ManifestUpdate: React.FunctionComponent = ({ deployment, leases, closeManifestEditor }) => { +export const ManifestUpdate: React.FunctionComponent = ({ + deployment, + leases, + closeManifestEditor, + isRemoteDeploy, + editedManifest, + onManifestChange +}) => { const [parsingError, setParsingError] = useState(null); const [deploymentVersion, setDeploymentVersion] = useState(null); - const [editedManifest, setEditedManifest] = useState(""); - const [isSendingManifest, setIsSendingManifest] = useState(false); const [showOutsideDeploymentMessage, setShowOutsideDeploymentMessage] = useState(false); + const [isSendingManifest, setIsSendingManifest] = useState(false); const { settings } = useSettings(); const { address, signAndBroadcastTx, isManaged: isManagedWallet } = useWallet(); const { data: providers } = useProviderList(); @@ -48,7 +58,7 @@ export const ManifestUpdate: React.FunctionComponent = ({ deployment, lea const localDeploymentData = getDeploymentLocalData(deployment.dseq); if (localDeploymentData?.manifest) { - setEditedManifest(localDeploymentData.manifest); + onManifestChange(localDeploymentData.manifest); try { const yamlVersion = yaml.load(localDeploymentData.manifest); @@ -99,7 +109,7 @@ export const ManifestUpdate: React.FunctionComponent = ({ deployment, lea }, [editedManifest, deployment.dseq, settings.apiEndpoint, address]); function handleTextChange(value) { - setEditedManifest(value); + onManifestChange(value); if (deploymentVersion) { setDeploymentVersion(null); @@ -244,6 +254,7 @@ export const ManifestUpdate: React.FunctionComponent = ({ deployment, lea disabled={!!parsingError || !editedManifest || !providers || isSendingManifest || deployment.state !== "active"} onClick={() => handleUpdateClick()} size="sm" + type="button" > Update Deployment @@ -255,8 +266,12 @@ export const ManifestUpdate: React.FunctionComponent = ({ deployment, lea - - + + {isRemoteDeploy ? ( + + ) : ( + + )}
diff --git a/apps/deploy-web/src/components/layout/CustomGoogleAnalytics.tsx b/apps/deploy-web/src/components/layout/CustomGoogleAnalytics.tsx index 660a98deb..3fe30e5e2 100644 --- a/apps/deploy-web/src/components/layout/CustomGoogleAnalytics.tsx +++ b/apps/deploy-web/src/components/layout/CustomGoogleAnalytics.tsx @@ -13,6 +13,5 @@ export default function GoogleAnalytics() { nonInteraction: true // avoids affecting bounce rate. }); }); - return <>{browserEnvConfig.NEXT_PUBLIC_NODE_ENV === "production" && }; } diff --git a/apps/deploy-web/src/components/new-deployment/ManifestEdit.tsx b/apps/deploy-web/src/components/new-deployment/ManifestEdit.tsx index 13b9661df..c63fbe6ed 100644 --- a/apps/deploy-web/src/components/new-deployment/ManifestEdit.tsx +++ b/apps/deploy-web/src/components/new-deployment/ManifestEdit.tsx @@ -1,7 +1,7 @@ "use client"; import { Dispatch, SetStateAction, useEffect, useRef, useState } from "react"; import { certificateManager } from "@akashnetwork/akashjs/build/certificates/certificate-manager"; -import { Alert, Button, CustomTooltip, Input, Spinner } from "@akashnetwork/ui/components"; +import { Alert, Button, CustomTooltip, Input, Snackbar, Spinner } from "@akashnetwork/ui/components"; import { cn } from "@akashnetwork/ui/utils"; import { EncodeObject } from "@cosmjs/proto-signing"; import { useTheme as useMuiTheme } from "@mui/material/styles"; @@ -10,6 +10,7 @@ import { ArrowRight, InfoCircle } from "iconoir-react"; import { useAtom } from "jotai"; import { useRouter, useSearchParams } from "next/navigation"; import { event } from "nextjs-google-analytics"; +import { useSnackbar } from "notistack"; import { browserEnvConfig } from "@src/config/browser-env.config"; import { useCertificate } from "@src/context/CertificateProvider"; @@ -47,15 +48,23 @@ type Props = { selectedTemplate: TemplateCreation | null; editedManifest: string | null; setEditedManifest: Dispatch>; + isGitProviderTemplate?: boolean; }; -export const ManifestEdit: React.FunctionComponent = ({ editedManifest, setEditedManifest, onTemplateSelected, selectedTemplate }) => { +export const ManifestEdit: React.FunctionComponent = ({ + editedManifest, + setEditedManifest, + onTemplateSelected, + selectedTemplate, + isGitProviderTemplate +}) => { const [parsingError, setParsingError] = useState(null); const [deploymentName, setDeploymentName] = useState(""); const [isCreatingDeployment, setIsCreatingDeployment] = useState(false); const [isDepositingDeployment, setIsDepositingDeployment] = useState(false); const [isCheckingPrerequisites, setIsCheckingPrerequisites] = useState(false); const [selectedSdlEditMode, setSelectedSdlEditMode] = useAtom(sdlStore.selectedSdlEditMode); + const [isRepoInputValid, setIsRepoInputValid] = useState(false); const [sdlDenom, setSdlDenom] = useState("uakt"); const { settings } = useSettings(); const { address, signAndBroadcastTx, isManaged } = useWallet(); @@ -75,6 +84,7 @@ export const ManifestEdit: React.FunctionComponent = ({ editedManifest, s const wallet = useWallet(); const managedDenom = useManagedWalletDenom(); const { createDeploymentConfirm } = useManagedDeploymentConfirm(); + const { enqueueSnackbar } = useSnackbar(); useWhen( wallet.isManaged && sdlDenom === "uakt" && editedManifest, @@ -84,11 +94,14 @@ export const ManifestEdit: React.FunctionComponent = ({ editedManifest, s }, [editedManifest, wallet.isManaged, sdlDenom] ); - useWhen(hasComponent("ssh"), () => { setSelectedSdlEditMode("builder"); }); + useWhen(isGitProviderTemplate, () => { + setSelectedSdlEditMode("builder"); + }, [isGitProviderTemplate]); + const propagateUploadedSdl = (event: React.ChangeEvent) => { const selectedFiles = event.target.files ?? []; const hasFileSelected = selectedFiles.length > 0; @@ -176,6 +189,13 @@ export const ManifestEdit: React.FunctionComponent = ({ editedManifest, s } const handleCreateDeployment = async () => { + if (isGitProviderTemplate && !isRepoInputValid) { + enqueueSnackbar(, { + variant: "error" + }); + return; + } + if (selectedSdlEditMode === "builder") { const valid = await sdlBuilderRef.current?.validate(); if (!valid) return; @@ -350,44 +370,46 @@ export const ManifestEdit: React.FunctionComponent = ({ editedManifest, s -
- {hasComponent("yml-editor") && ( -
- - -
- )} - {hasComponent("yml-uploader") && !templateId && ( - <> - - - - )} -
+ {!isGitProviderTemplate && ( +
+ {hasComponent("yml-editor") && ( +
+ + +
+ )} + {hasComponent("yml-uploader") && !templateId && ( + <> + + + + )} +
+ )} {parsingError && {parsingError}} @@ -397,7 +419,15 @@ export const ManifestEdit: React.FunctionComponent = ({ editedManifest, s )} {(hasComponent("ssh") || selectedSdlEditMode === "builder") && ( - + )} {isDepositingDeployment && ( diff --git a/apps/deploy-web/src/components/new-deployment/NewDeploymentContainer.tsx b/apps/deploy-web/src/components/new-deployment/NewDeploymentContainer.tsx index 72ce0719a..4fb06e4b6 100644 --- a/apps/deploy-web/src/components/new-deployment/NewDeploymentContainer.tsx +++ b/apps/deploy-web/src/components/new-deployment/NewDeploymentContainer.tsx @@ -3,9 +3,11 @@ import { FC, useEffect, useState } from "react"; import { useAtomValue } from "jotai"; import { useRouter, useSearchParams } from "next/navigation"; +import { CI_CD_TEMPLATE_ID } from "@src/config/remote-deploy.config"; import { useLocalNotes } from "@src/context/LocalNoteProvider"; import { useSdlBuilder } from "@src/context/SdlBuilderProvider"; import { useTemplates } from "@src/context/TemplatesProvider"; +import { isImageInYaml } from "@src/services/remote-deploy/remote-deployment-controller.service"; import sdlStore from "@src/store/sdlStore"; import { TemplateCreation } from "@src/types"; import { RouteStep } from "@src/types/route-steps.type"; @@ -18,6 +20,7 @@ import { CustomizedSteppers } from "./Stepper"; import { TemplateList } from "./TemplateList"; export const NewDeploymentContainer: FC = () => { + const [isGitProviderTemplate, setIsGitProviderTemplate] = useState(false); const { isLoading: isLoadingTemplates, templates } = useTemplates(); const [activeStep, setActiveStep] = useState(null); const [selectedTemplate, setSelectedTemplate] = useState(null); @@ -34,6 +37,30 @@ export const NewDeploymentContainer: FC = () => { const queryStep = searchParams?.get("step"); const _activeStep = getStepIndexByParam(queryStep as RouteStep); setActiveStep(_activeStep); + + const redeploy = searchParams?.get("redeploy"); + const code = searchParams?.get("code"); + const gitProvider = searchParams?.get("gitProvider"); + const state = searchParams?.get("state"); + const templateId = searchParams?.get("templateId"); + const shouldRedirectToGitlab = !redeploy && state === "gitlab" && code; + const isGitProvider = gitProvider === "github" || code || state === "gitlab" || (templateId && templateId === CI_CD_TEMPLATE_ID); + if (shouldRedirectToGitlab) { + router.replace( + UrlService.newDeployment({ + step: RouteStep.editDeployment, + gitProvider: "github", + gitProviderCode: code, + templateId: CI_CD_TEMPLATE_ID + }) + ); + } else { + if (isGitProvider) { + setIsGitProviderTemplate(true); + } else { + setIsGitProviderTemplate(false); + } + } }, [searchParams]); useEffect(() => { @@ -50,10 +77,18 @@ export const NewDeploymentContainer: FC = () => { if ("config" in template && (template.config?.ssh || (!template.config?.ssh && hasComponent("ssh")))) { toggleCmp("ssh"); } - + const isRemoteYamlImage = isImageInYaml(template?.content as string, getTemplateById(CI_CD_TEMPLATE_ID)?.deploy); const queryStep = searchParams?.get("step"); if (queryStep !== RouteStep.editDeployment) { - router.replace(UrlService.newDeployment({ ...searchParams, step: RouteStep.editDeployment })); + if (isRemoteYamlImage) { + setIsGitProviderTemplate(true); + } + + const newParams = isRemoteYamlImage + ? { ...searchParams, step: RouteStep.editDeployment, gitProvider: "github" } + : { ...searchParams, step: RouteStep.editDeployment }; + + router.replace(UrlService.newDeployment(newParams)); } } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -127,13 +162,14 @@ export const NewDeploymentContainer: FC = () => {
{activeStep !== null && }
- {activeStep === 0 && } + {activeStep === 0 && } {activeStep === 1 && ( )} {activeStep === 2 && } diff --git a/apps/deploy-web/src/components/new-deployment/SdlBuilder.tsx b/apps/deploy-web/src/components/new-deployment/SdlBuilder.tsx index 16610f3aa..452f8dd4e 100644 --- a/apps/deploy-web/src/components/new-deployment/SdlBuilder.tsx +++ b/apps/deploy-web/src/components/new-deployment/SdlBuilder.tsx @@ -16,11 +16,16 @@ import { defaultService, defaultSshVMService } from "@src/utils/sdl/data"; import { generateSdl } from "@src/utils/sdl/sdlGenerator"; import { importSimpleSdl } from "@src/utils/sdl/sdlImport"; import { transformCustomSdlFields, TransformError } from "@src/utils/sdl/transformCustomSdlFields"; +import RemoteRepositoryDeployManager from "../remote-deploy/RemoteRepositoryDeployManager"; import { SimpleServiceFormControl } from "../sdl/SimpleServiceFormControl"; interface Props { sdlString: string | null; setEditedManifest: Dispatch; + isGitProviderTemplate?: boolean; + setDeploymentName: Dispatch; + deploymentName: string; + setIsRepoInputValid?: Dispatch; } export type SdlBuilderRefType = { @@ -28,161 +33,176 @@ export type SdlBuilderRefType = { validate: () => Promise; }; -export const SdlBuilder = React.forwardRef(({ sdlString, setEditedManifest }, ref) => { - const [error, setError] = useState(null); - const formRef = useRef(null); - const [isInit, setIsInit] = useState(false); - const { hasComponent, imageList } = useSdlBuilder(); - const form = useForm({ - defaultValues: { - services: [cloneDeep(hasComponent("ssh") ? defaultSshVMService : defaultService)], - imageList: imageList, - hasSSHKey: hasComponent("ssh") - }, - resolver: zodResolver(SdlBuilderFormValuesSchema) - }); - const { control, trigger, watch, setValue } = form; - const { - fields: services, - remove: removeService, - append: appendService - } = useFieldArray({ - control, - name: "services", - keyName: "id" - }); - const { services: formServices = [] } = watch(); - const { data: gpuModels } = useGpuModels(); - const [serviceCollapsed, setServiceCollapsed] = useState([]); - const wallet = useWallet(); - const managedDenom = useManagedWalletDenom(); - - useWhen( - wallet.isManaged, - () => { - formServices.forEach((service, index) => { - const { denom } = service.placement.pricing; - - if (denom !== managedDenom) { - setValue(`services.${index}.placement.pricing.denom`, managedDenom); - } - }); - }, - [formServices, sdlString] - ); - - React.useImperativeHandle(ref, () => ({ - getSdl: getSdl, - validate: async () => { - return await trigger(); - } - })); - - useEffect(() => { - const { unsubscribe } = watch(data => { - const sdl = generateSdl(data.services as ServiceType[]); - setEditedManifest(sdl); +export const SdlBuilder = React.forwardRef( + ({ sdlString, setEditedManifest, isGitProviderTemplate, setDeploymentName, deploymentName, setIsRepoInputValid }, ref) => { + const [error, setError] = useState(null); + const formRef = useRef(null); + const [isInit, setIsInit] = useState(false); + const { hasComponent, imageList } = useSdlBuilder(); + const form = useForm({ + defaultValues: { + services: [cloneDeep(hasComponent("ssh") ? defaultSshVMService : defaultService)], + imageList: imageList, + hasSSHKey: hasComponent("ssh") + }, + resolver: zodResolver(SdlBuilderFormValuesSchema) + }); + const { control, trigger, watch, setValue } = form; + const { + fields: services, + remove: removeService, + append: appendService + } = useFieldArray({ + control, + name: "services", + keyName: "id" }); + const { services: formServices = [] } = watch(); + const { data: gpuModels } = useGpuModels(); + const [serviceCollapsed, setServiceCollapsed] = useState(isGitProviderTemplate ? [0] : []); + + const wallet = useWallet(); + const managedDenom = useManagedWalletDenom(); + + useWhen( + wallet.isManaged, + () => { + formServices.forEach((service, index) => { + const { denom } = service.placement.pricing; + + if (denom !== managedDenom) { + setValue(`services.${index}.placement.pricing.denom`, managedDenom); + } + }); + }, + [formServices, sdlString] + ); + + React.useImperativeHandle(ref, () => ({ + getSdl: getSdl, + validate: async () => { + return await trigger(); + } + })); + + useEffect(() => { + const { unsubscribe } = watch(data => { + const sdl = generateSdl(data.services as ServiceType[]); + setEditedManifest(sdl); + }); - try { - if (sdlString) { - const services = createAndValidateSdl(sdlString); - setValue("services", services as ServiceType[]); + try { + if (sdlString) { + const services = createAndValidateSdl(sdlString); + setValue("services", services as ServiceType[]); + } + } catch (error) { + setError("Error importing SDL"); } - } catch (error) { - setError("Error importing SDL"); - } - setIsInit(true); + setIsInit(true); - return () => { - unsubscribe(); - }; - }, [watch]); - - const getSdl = () => { - try { - return generateSdl(transformCustomSdlFields(formServices, { withSSH: hasComponent("ssh") })); - } catch (err) { - if (err instanceof TransformError) { - setError(err.message); + return () => { + unsubscribe(); + }; + }, [watch]); + + const getSdl = () => { + try { + return generateSdl(transformCustomSdlFields(formServices, { withSSH: hasComponent("ssh") })); + } catch (err) { + if (err instanceof TransformError) { + setError(err.message); + } } - } - }; - - const createAndValidateSdl = (yamlStr: string) => { - try { - if (!yamlStr) return []; - - const services = importSimpleSdl(yamlStr); - - setError(null); - - return services; - } catch (err) { - if (err.name === "YAMLException" || err.name === "CustomValidationError") { - setError(err.message); - } else if (err.name === "TemplateValidation") { - setError(err.message); - } else { - setError("Error while parsing SDL file"); - console.error(err); + }; + + const createAndValidateSdl = (yamlStr: string) => { + try { + if (!yamlStr) return []; + + const services = importSimpleSdl(yamlStr); + + setError(null); + + return services; + } catch (err) { + if (err.name === "YAMLException" || err.name === "CustomValidationError") { + setError(err.message); + } else if (err.name === "TemplateValidation") { + setError(err.message); + } else { + setError("Error while parsing SDL file"); + } } - } - }; - - const onAddService = () => { - appendService({ ...defaultService, id: nanoid(), title: `service-${services.length + 1}` }); - }; - - const onRemoveService = (index: number) => { - removeService(index); - }; - - return ( -
- {!isInit ? ( -
- -
- ) : ( -
- - {formServices && - services.map((service, serviceIndex) => ( - - ))} - - {error && ( - - {error} - - )} + }; + + const onAddService = () => { + appendService({ ...defaultService, id: nanoid(), title: `service-${services.length + 1}` }); + }; + + const onRemoveService = (index: number) => { + removeService(index); + }; - {!hasComponent("ssh") && ( -
-
- -
-
+ return ( +
+ {!isInit ? ( +
+ +
+ ) : ( + <> + {isGitProviderTemplate && ( + )} - - - )} -
- ); -}); +
+ + {formServices && + services.map((service, serviceIndex) => ( + + ))} + + {error && ( + + {error} + + )} + + {!hasComponent("ssh") && !isGitProviderTemplate && ( +
+
+ +
+
+ )} + + + + )} +
+ ); + } +); diff --git a/apps/deploy-web/src/components/new-deployment/TemplateList.tsx b/apps/deploy-web/src/components/new-deployment/TemplateList.tsx index 217b4d545..5caaf4069 100644 --- a/apps/deploy-web/src/components/new-deployment/TemplateList.tsx +++ b/apps/deploy-web/src/components/new-deployment/TemplateList.tsx @@ -8,6 +8,7 @@ import { useAtom } from "jotai"; import Link from "next/link"; import { useRouter } from "next/navigation"; +import { CI_CD_TEMPLATE_ID } from "@src/config/remote-deploy.config"; import { useTemplates } from "@src/context/TemplatesProvider"; import { usePreviousRoute } from "@src/hooks/usePreviousRoute"; import sdlStore from "@src/store/sdlStore"; @@ -33,13 +34,19 @@ const previewTemplateIds = [ "akash-network-awesome-akash-grok", "akash-network-awesome-akash-FastChat" ]; - -export const TemplateList: React.FunctionComponent = () => { +type Props = { + onChangeGitProvider: (gh: boolean) => void; +}; +export const TemplateList: React.FunctionComponent = ({ onChangeGitProvider }) => { const { templates } = useTemplates(); const router = useRouter(); const [previewTemplates, setPreviewTemplates] = useState([]); const [, setSdlEditMode] = useAtom(sdlStore.selectedSdlEditMode); const previousRoute = usePreviousRoute(); + const handleGithubTemplate = async () => { + onChangeGitProvider(true); + router.push(UrlService.newDeployment({ step: RouteStep.editDeployment, gitProvider: "github", templateId: CI_CD_TEMPLATE_ID })); + }; useEffect(() => { if (templates) { @@ -77,11 +84,10 @@ export const TemplateList: React.FunctionComponent = () => {
} - testId="hello-world-card" - onClick={() => router.push(UrlService.newDeployment({ step: RouteStep.editDeployment, templateId: helloWorldTemplate.code }))} + title={"Build and Deploy"} + description={"Deploy directly from GitHub/BitBucket/GitLab"} + icon={} + onClick={handleGithubTemplate} /> {
+ } + testId="hello-world-card" + onClick={() => router.push(UrlService.newDeployment({ step: RouteStep.editDeployment, templateId: helloWorldTemplate.code }))} + /> {previewTemplates.map(template => ( { + const [token, setToken] = useAtom(tokens); + return ( + + + + + + {userProfile?.login || userProfileBit?.username || userProfileGitLab?.name} + + { + setToken({ + accessToken: null, + refreshToken: null, + type: "github", + alreadyLoggedIn: token?.alreadyLoggedIn?.includes(token.type) + ? token.alreadyLoggedIn + : token?.alreadyLoggedIn && token?.alreadyLoggedIn?.length > 0 + ? [...token.alreadyLoggedIn, token.type] + : [token.type] + }); + }} + className="flex cursor-pointer items-center gap-2" + > + Switch Git Provider + + + setToken({ + accessToken: null, + refreshToken: null, + type: "github", + alreadyLoggedIn: [] + }) + } + className="flex cursor-pointer items-center gap-2" + > + Logout + + + + ); +}; + +export default AccountDropDown; diff --git a/apps/deploy-web/src/components/remote-deploy/BoxTextInput.tsx b/apps/deploy-web/src/components/remote-deploy/BoxTextInput.tsx new file mode 100644 index 000000000..c6dc02380 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/BoxTextInput.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import { Input } from "@akashnetwork/ui/components"; +const BoxTextInput = ({ + label, + description, + placeholder, + onChange +}: { + label: string; + description?: string; + placeholder: string; + onChange: (e: React.ChangeEvent) => void; +}) => { + return ( +
+
+

{label}

+ {description &&

{description}

} +
+ +
+ ); +}; + +export default BoxTextInput; diff --git a/apps/deploy-web/src/components/remote-deploy/RemoteRepositoryDeployManager.tsx b/apps/deploy-web/src/components/remote-deploy/RemoteRepositoryDeployManager.tsx new file mode 100644 index 000000000..16487f2d6 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/RemoteRepositoryDeployManager.tsx @@ -0,0 +1,264 @@ +import { Dispatch, useEffect, useMemo, useState } from "react"; +import { Control, UseFormSetValue } from "react-hook-form"; +import { Button, Spinner, Tabs, TabsContent, TabsList, TabsTrigger } from "@akashnetwork/ui/components"; +import { Bitbucket, Github as GitIcon, GitlabFull } from "iconoir-react"; +import { useAtom } from "jotai"; +import { useRouter } from "next/navigation"; + +import { CI_CD_TEMPLATE_ID, CURRENT_SERVICE, DEFAULT_ENV_IN_YML, protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { useWhen } from "@src/hooks/useWhen"; +import { useFetchAccessToken, useUserProfile } from "@src/queries/useGithubQuery"; +import { useGitLabFetchAccessToken, useGitLabUserProfile } from "@src/queries/useGitlabQuery"; +import { BitbucketService } from "@src/services/remote-deploy/bitbucket-http.service"; +import { GitHubService } from "@src/services/remote-deploy/github-http.service"; +import { GitLabService } from "@src/services/remote-deploy/gitlab-http.service"; +import { EnvVarUpdater } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { tokens } from "@src/store/remoteDeployStore"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { RouteStep } from "@src/types/route-steps.type"; +import { UrlService } from "@src/utils/urlUtils"; +import { useBitFetchAccessToken, useBitUserProfile } from "../../queries/useBitBucketQuery"; +import BitBucketManager from "./bitbucket/BitBucketManager"; +import RemoteBuildInstallConfig from "./deployment-configurations/RemoteBuildInstallConfig"; +import RemoteDeployEnvDropdown from "./deployment-configurations/RemoteDeployEnvDropdown"; +import GithubManager from "./github/GithubManager"; +import GitlabManager from "./gitlab/GitlabManager"; +import AccountDropDown from "./AccountDropdown"; +import CustomInput from "./BoxTextInput"; +const RemoteRepositoryDeployManager = ({ + setValue, + services, + control, + deploymentName, + setDeploymentName, + setIsRepoInputValid +}: { + setValue: UseFormSetValue; + services: ServiceType[]; + control: Control; + setDeploymentName: Dispatch; + deploymentName: string; + setIsRepoInputValid?: Dispatch; +}) => { + const [token, setToken] = useAtom(tokens); + + const [selectedTab, setSelectedTab] = useState("git"); + const router = useRouter(); + const [hydrated, setHydrated] = useState(false); + const isRepoAndBranchPresent = (env: Array<{ key: string }>) => + env.some(e => e.key === protectedEnvironmentVariables.REPO_URL) && env.some(e => e.key === protectedEnvironmentVariables.BRANCH_NAME); + + const isValid = isRepoAndBranchPresent(services?.[0]?.env || []); + const isRepoUrlDefault = (env: ServiceType["env"]) => env?.some(e => e.key === protectedEnvironmentVariables.REPO_URL && e.value === DEFAULT_ENV_IN_YML); + + const shouldResetValue = isRepoUrlDefault(services?.[0]?.env || []); + + const envVarUpdater = useMemo(() => new EnvVarUpdater(services), [services]); + + const { reLoginWithGithub, loginWithGithub } = useMemo(() => new GitHubService(), []); + + const { data: userProfile, isLoading: fetchingProfile } = useUserProfile(); + const { mutate: fetchAccessToken, isLoading: fetchingToken } = useFetchAccessToken(navigateToNewDeployment); + + const { loginWithBitBucket } = useMemo(() => new BitbucketService(), []); + const { data: userProfileBit, isLoading: fetchingProfileBit } = useBitUserProfile(); + const { mutate: fetchAccessTokenBit, isLoading: fetchingTokenBit } = useBitFetchAccessToken(navigateToNewDeployment); + + const { loginWithGitLab } = useMemo(() => new GitLabService(), []); + const { data: userProfileGitLab, isLoading: fetchingProfileGitLab } = useGitLabUserProfile(); + const { mutate: fetchAccessTokenGitLab, isLoading: fetchingTokenGitLab } = useGitLabFetchAccessToken(navigateToNewDeployment); + + useWhen(isValid, () => { + setIsRepoInputValid?.(true); + }); + + useWhen(!isValid, () => { + setIsRepoInputValid?.(false); + }); + + useWhen(shouldResetValue, () => { + setValue(CURRENT_SERVICE, []); + }); + + useEffect(() => { + setHydrated(true); + }, []); + + useEffect(() => { + const url = new URL(window.location.href); + + const code = url.searchParams.get("code"); + + if (code && !token?.accessToken && hydrated) { + if (token?.type === "github") fetchAccessToken(code); + if (token?.type === "bitbucket") fetchAccessTokenBit(code); + if (token?.type === "gitlab") fetchAccessTokenGitLab(code); + } + }, [hydrated]); + + function navigateToNewDeployment() { + router.replace( + UrlService.newDeployment({ + step: RouteStep.editDeployment, + gitProvider: "github", + templateId: CI_CD_TEMPLATE_ID + }) + ); + } + + return ( + <> +
+
+

Import Repository

+ + {token?.accessToken && ( +
+ +
+ )} +
+ + { + { + setSelectedTab(value); + setValue(CURRENT_SERVICE, []); + }} + defaultValue="git" + className="mt-6" + > +
+ + + Git Provider + + + Third-Party Git Repository + + + {token?.accessToken && ( +
+ +
+ )} +
+ + {fetchingToken || fetchingProfile || fetchingTokenBit || fetchingProfileBit || fetchingTokenGitLab || fetchingProfileGitLab ? ( +
+ +

Loading...

+
+ ) : ( + !token?.accessToken && ( +
+
+

Connect Account

+

Connect a git provider to access your repositories.

+
+
+ + + +
+
+ ) + )} +
+ + + + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.REPO_URL, e.target.value, false)) + } + /> + + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.BRANCH_NAME, e.target.value, false)) + } + /> + +
+ } + + {selectedTab === "git" && token?.accessToken && ( +
+ {token?.type === "github" ? ( + <> + + + ) : token?.type === "bitbucket" ? ( + + ) : ( + + )} +
+ )} +
+ + + + ); +}; + +export default RemoteRepositoryDeployManager; diff --git a/apps/deploy-web/src/components/remote-deploy/Repos.tsx b/apps/deploy-web/src/components/remote-deploy/Repos.tsx new file mode 100644 index 000000000..8894c304e --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/Repos.tsx @@ -0,0 +1,330 @@ +import { Dispatch, useEffect, useMemo, useState } from "react"; +import { UseFormSetValue } from "react-hook-form"; +import { + Button, + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, + Input, + Label, + RadioGroup, + RadioGroupItem, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + Spinner +} from "@akashnetwork/ui/components"; +import { Folder, GithubCircle, Lock } from "iconoir-react"; +import { useAtom } from "jotai"; +import { Globe2 } from "lucide-react"; +import { nanoid } from "nanoid"; +import Image from "next/image"; + +import { CURRENT_SERVICE, protectedEnvironmentVariables, ROOT_FOLDER_NAME } from "@src/config/remote-deploy.config"; +import useRemoteDeployFramework from "@src/hooks/useRemoteDeployFramework"; +import { useSrcFolders } from "@src/queries/useGithubQuery"; +import { useGitlabSrcFolders } from "@src/queries/useGitlabQuery"; +import { EnvVarUpdater, formatUrlWithoutInitialPath } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { tokens } from "@src/store/remoteDeployStore"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { CustomRepo, IGithubDirectoryItem } from "@src/types/remotedeploy"; +import { GitHubProfile } from "@src/types/remoteProfile"; +import { useBitSrcFolders } from "../../queries/useBitBucketQuery"; +import CustomInput from "./BoxTextInput"; + +const Repos = ({ + repos, + setValue, + isLoading, + services, + setDeploymentName, + profile, + type = "github" +}: { + repos?: CustomRepo[]; + setValue: UseFormSetValue; + services: ServiceType[]; + isLoading: boolean; + setDeploymentName: Dispatch; + deploymentName: string; + profile?: GitHubProfile; + type?: "github" | "gitlab" | "bitbucket"; +}) => { + const currentServiceEnv = services?.[0]?.env || []; + const currentRepoUrl = currentServiceEnv?.find(e => e.key === protectedEnvironmentVariables.REPO_URL)?.value; + const currentBranchName = currentServiceEnv?.find(e => e.key === protectedEnvironmentVariables.BRANCH_NAME)?.value; + const [token] = useAtom(tokens); + const [search, setSearch] = useState(""); + const [filteredRepos, setFilteredRepos] = useState(repos); + const [currentAccount, setCurrentAccount] = useState(""); + const [directory, setDirectory] = useState(null); + const [open, setOpen] = useState(false); + const [accounts, setAccounts] = useState([]); + const repo = repos?.find(r => r.html_url === currentRepoUrl); + const currentFolder = currentServiceEnv?.find(e => e.key === protectedEnvironmentVariables.FRONTEND_FOLDER); + const { currentFramework, isLoading: frameworkLoading } = useRemoteDeployFramework({ + currentRepoUrl, + currentBranchName, + currentGitlabProjectId: currentServiceEnv?.find(e => e.key === protectedEnvironmentVariables.GITLAB_PROJECT_ID)?.value, + subFolder: currentFolder?.value, + setCpus: (cpus: number) => setValue("services.0.profile.cpu", +cpus > 2 ? +cpus : 2) + }); + const { isLoading: isGettingDirectory, isFetching: isGithubLoading } = useSrcFolders(setFolders, formatUrlWithoutInitialPath(currentRepoUrl)); + const { isLoading: isGettingDirectoryBit, isFetching: isBitLoading } = useBitSrcFolders( + setFolders, + formatUrlWithoutInitialPath(currentRepoUrl), + currentBranchName + ); + const { isLoading: isGettingDirectoryGitlab, isFetching: isGitlabLoading } = useGitlabSrcFolders( + setFolders, + currentServiceEnv?.find(e => e.key === protectedEnvironmentVariables.GITLAB_PROJECT_ID)?.value + ); + const isLoadingDirectories = isGithubLoading || isGitlabLoading || isBitLoading || isGettingDirectory || isGettingDirectoryBit || isGettingDirectoryGitlab; + const envVarUpdater = useMemo(() => new EnvVarUpdater(services), [services]); + + useEffect(() => { + if (type === "github") { + const differentOwnersArray = repos?.map(repo => repo?.owner?.login || ""); + const uniqueOwners = Array.from(new Set(differentOwnersArray)); + setAccounts(uniqueOwners); + setCurrentAccount( + repos?.find(repo => currentRepoUrl?.includes(repo?.html_url?.replace("https://github.com/", "")))?.owner?.login || + uniqueOwners?.find(account => profile?.login === account) || + uniqueOwners?.[0] + ); + } + setFilteredRepos(repos); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [repos, type, profile]); + + function setFolders(data: IGithubDirectoryItem[]) { + if (data?.length > 0) { + setDirectory(data); + } else { + setDirectory(null); + } + } + + return ( +
+
+

Select Repository

+

Select a Repo to be deployed

+
+ + + + + + + + Search Repository +
+ {type === "github" && ( + + )} + { + setSearch(e.target.value); + setFilteredRepos(repos?.filter(repo => repo.name.toLowerCase().includes(e.target.value.toLowerCase()))); + }} + /> +
+
+
+ {filteredRepos + ?.filter(repo => repo?.owner?.login === currentAccount || type !== "github") + ?.map(repo => ( +
+
+
+
+ {currentFramework && !frameworkLoading && currentRepoUrl === repo.html_url ? ( + currentFramework?.image ? ( + // eslint-disable-next-line @next/next/no-img-element + {currentFramework.title} + ) : ( + + ) + ) : ( + + )} +

{repo.name}

+ {repo.private && } +
+
+ {currentRepoUrl === repo?.html_url ? ( + + ) : ( + + )} +
+ {isLoadingDirectories && currentRepoUrl === repo.html_url && ( +
+

Fetching Directory

+ +
+ )} + {currentRepoUrl === repo.html_url && + (directory && directory?.filter(item => item.type === "dir" || item.type === "commit_directory" || item.type === "tree")?.length > 0 ? ( +
+
+

Select Directory

+
+ + { + if (value === ROOT_FOLDER_NAME) { + setValue(CURRENT_SERVICE, envVarUpdater?.deleteEnvironmentVariable(protectedEnvironmentVariables.FRONTEND_FOLDER)); + } else { + setValue( + CURRENT_SERVICE, + envVarUpdater?.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.FRONTEND_FOLDER, value, false) + ); + } + }} + value={currentFolder?.value || ROOT_FOLDER_NAME} + > +
+ + +
+ {directory + ?.filter(item => item.type === "dir" || item.type === "commit_directory" || item.type === "tree") + .map(item => ( +
+ + +
+ ))} +
+
+ ) : ( + + setValue( + CURRENT_SERVICE, + envVarUpdater?.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.FRONTEND_FOLDER, e.target.value, false) + ) + } + label="Frontend Folder" + description="By default we use ./, Change the version if needed" + placeholder="eg. app" + /> + ))} +
+ ))} + {isLoading && ( +
+ +
+ )} + {filteredRepos?.filter(repo => repo?.owner?.login === currentAccount || type !== "github")?.length === 0 && ( +
No Repository Found
+ )} +
+
+
+
+ ); +}; + +export default Repos; diff --git a/apps/deploy-web/src/components/remote-deploy/SelectBranches.tsx b/apps/deploy-web/src/components/remote-deploy/SelectBranches.tsx new file mode 100644 index 000000000..752db9a94 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/SelectBranches.tsx @@ -0,0 +1,72 @@ +import React from "react"; +import { Control, useFieldArray } from "react-hook-form"; +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Spinner } from "@akashnetwork/ui/components"; +import { nanoid } from "nanoid"; + +import { CURRENT_SERVICE, protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { SdlBuilderFormValuesType } from "@src/types"; + +const SelectBranches = ({ + control, + + loading, + branches, + selected +}: { + control: Control; + loading: boolean; + branches?: { + name: string; + }[]; + selected?: string; +}) => { + const { fields, append, update } = useFieldArray({ + control, + name: CURRENT_SERVICE, + keyName: "id" + }); + + const currentBranch = fields.find(e => e.key === protectedEnvironmentVariables.BRANCH_NAME); + return ( +
+
+

Select Branch

+

Select a branch to use for deployment

+
+ + +
+ ); +}; + +export default SelectBranches; diff --git a/apps/deploy-web/src/components/remote-deploy/bitbucket/BitBucketBranches.tsx b/apps/deploy-web/src/components/remote-deploy/bitbucket/BitBucketBranches.tsx new file mode 100644 index 000000000..32842ebe2 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/bitbucket/BitBucketBranches.tsx @@ -0,0 +1,17 @@ +import { Control } from "react-hook-form"; + +import { protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { formatUrlWithoutInitialPath } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { useBitBranches } from "../../../queries/useBitBucketQuery"; +import SelectBranches from "../SelectBranches"; + +const BitBucketBranches = ({ services, control }: { services: ServiceType[]; control: Control }) => { + const selected = formatUrlWithoutInitialPath(services?.[0]?.env?.find(e => e.key === protectedEnvironmentVariables.REPO_URL)?.value); + + const { data: branches, isLoading: branchesLoading } = useBitBranches(selected); + + return ; +}; + +export default BitBucketBranches; diff --git a/apps/deploy-web/src/components/remote-deploy/bitbucket/BitBucketManager.tsx b/apps/deploy-web/src/components/remote-deploy/bitbucket/BitBucketManager.tsx new file mode 100644 index 000000000..f1897d0d3 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/bitbucket/BitBucketManager.tsx @@ -0,0 +1,57 @@ +import { Dispatch, useState } from "react"; +import { Control, UseFormSetValue } from "react-hook-form"; + +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { BitProfile } from "@src/types/remoteProfile"; +import { useBitReposByWorkspace } from "../../../queries/useBitBucketQuery"; +import Repos from "../Repos"; +import BitBucketBranches from "./BitBucketBranches"; +import WorkSpaces from "./Workspaces"; + +const BitBucketManager = ({ + loading, + setValue, + services, + control, + setDeploymentName, + deploymentName, + profile +}: { + setDeploymentName: Dispatch; + deploymentName: string; + loading: boolean; + setValue: UseFormSetValue; + control: Control; + services: ServiceType[]; + profile?: BitProfile; +}) => { + const [workSpace, setWorkSpace] = useState(""); + + const { data: repos, isLoading } = useBitReposByWorkspace(workSpace); + + return ( + <> + + ({ + name: repo.name, + default_branch: repo?.mainbranch?.name, + html_url: repo?.links?.html?.href, + userName: profile?.username, + private: repo?.is_private + })) ?? [] + } + type="bitbucket" + setValue={setValue} + setDeploymentName={setDeploymentName} + deploymentName={deploymentName} + services={services} + /> + + + ); +}; + +export default BitBucketManager; diff --git a/apps/deploy-web/src/components/remote-deploy/bitbucket/Workspaces.tsx b/apps/deploy-web/src/components/remote-deploy/bitbucket/Workspaces.tsx new file mode 100644 index 000000000..d9e1a8d78 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/bitbucket/Workspaces.tsx @@ -0,0 +1,51 @@ +import { Dispatch, useState } from "react"; +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Spinner } from "@akashnetwork/ui/components"; +import { Bitbucket } from "iconoir-react"; + +import { useWorkspaces } from "../../../queries/useBitBucketQuery"; + +const WorkSpaces = ({ isLoading, setWorkSpaces }: { isLoading: boolean; workSpaces: string; setWorkSpaces: Dispatch }) => { + const [open, setOpen] = useState(false); + + const { data, isLoading: loadingWorkSpaces } = useWorkspaces(); + + return ( +
+
+

Select WorkSpace

+

Select a Work-Space to use for deployment

+
+ + +
+ ); +}; + +export default WorkSpaces; diff --git a/apps/deploy-web/src/components/remote-deploy/deployment-configurations/RemoteBuildInstallConfig.tsx b/apps/deploy-web/src/components/remote-deploy/deployment-configurations/RemoteBuildInstallConfig.tsx new file mode 100644 index 000000000..e3385987c --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/deployment-configurations/RemoteBuildInstallConfig.tsx @@ -0,0 +1,94 @@ +import { useMemo, useState } from "react"; +import { UseFormSetValue } from "react-hook-form"; +import { Card, CardContent, Checkbox, Collapsible, CollapsibleContent, CollapsibleTrigger, Label, Separator } from "@akashnetwork/ui/components"; +import { cn } from "@akashnetwork/ui/utils"; +import { NavArrowDown } from "iconoir-react"; + +import { CURRENT_SERVICE, protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { EnvVarUpdater } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import BoxTextInput from "../BoxTextInput"; + +const RemoteBuildInstallConfig = ({ services, setValue }: { services: ServiceType[]; setValue: UseFormSetValue }) => { + const [expanded, setExpanded] = useState(false); + const currentService = services[0]; + const envVarUpdater = useMemo(() => new EnvVarUpdater(services), [services]); + return ( + { + setExpanded(value); + }} + > + + + +
+

Build & Install Configurations

+ +
+
+ {expanded && } + +
+ + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.INSTALL_COMMAND, e.target.value, false)) + } + label="Install Command" + placeholder="npm install" + /> + + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.BUILD_DIRECTORY, e.target.value, false)) + } + label="Build Directory" + placeholder="dist" + /> + + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.BUILD_COMMAND, e.target.value, false)) + } + label="Build Command" + placeholder="npm run build" + /> + + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.CUSTOM_SRC, e.target.value, false)) + } + label="Start Command" + placeholder="npm start" + /> + + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.NODE_VERSION, e.target.value, false)) + } + label="Node Version" + placeholder="21" + /> +
+
+ + + env.key === protectedEnvironmentVariables.DISABLE_PULL)?.value !== "yes"} + id="disable-pull" + defaultChecked={false} + onCheckedChange={value => { + const pull = !value ? "yes" : "no"; + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.DISABLE_PULL, pull, false)); + }} + /> +
+

If checked, Console will automatically re-deploy your app on any code commits

+
+
+
+
+
+
+ ); +}; +export default RemoteBuildInstallConfig; diff --git a/apps/deploy-web/src/components/remote-deploy/deployment-configurations/RemoteDeployEnvDropdown.tsx b/apps/deploy-web/src/components/remote-deploy/deployment-configurations/RemoteDeployEnvDropdown.tsx new file mode 100644 index 000000000..b0f7c7b2a --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/deployment-configurations/RemoteDeployEnvDropdown.tsx @@ -0,0 +1,54 @@ +import { useState } from "react"; +import { Control } from "react-hook-form"; +import { Card, CardContent, Collapsible, CollapsibleContent, CollapsibleTrigger, Separator } from "@akashnetwork/ui/components"; +import { cn } from "@akashnetwork/ui/utils"; +import { NavArrowDown } from "iconoir-react"; + +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { EnvFormModal } from "../../sdl/EnvFormModal"; +import { EnvVarList } from "../../sdl/EnvVarList"; + +const RemoteDeployEnvDropdown = ({ services, control }: { services: ServiceType[]; control: Control }) => { + const serviceIndex = 0; + const [expanded, setExpanded] = useState(false); + const currentService = services[serviceIndex]; + const [isEditingEnv, setIsEditingEnv] = useState(null); + return ( + { + setExpanded(value); + }} + > + + + +
+

{!expanded && "Environment Variables"}

+ +
+
+ {expanded && } + +
+ {isEditingEnv === serviceIndex && ( + setIsEditingEnv(null)} + serviceIndex={serviceIndex} + envs={currentService.env || []} + /> + )} +
+ +
+
+
+
+
+
+ ); +}; + +export default RemoteDeployEnvDropdown; diff --git a/apps/deploy-web/src/components/remote-deploy/github/GithubBranches.tsx b/apps/deploy-web/src/components/remote-deploy/github/GithubBranches.tsx new file mode 100644 index 000000000..1720e129e --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/github/GithubBranches.tsx @@ -0,0 +1,17 @@ +import { Control } from "react-hook-form"; + +import { protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { useBranches } from "@src/queries/useGithubQuery"; +import { formatUrlWithoutInitialPath } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import SelectBranches from "../SelectBranches"; + +const GithubBranches = ({ services, control }: { services: ServiceType[]; control: Control }) => { + const selected = formatUrlWithoutInitialPath(services?.[0]?.env?.find(e => e.key === protectedEnvironmentVariables.REPO_URL)?.value); + + const { data: branches, isLoading: branchesLoading } = useBranches(selected); + + return ; +}; + +export default GithubBranches; diff --git a/apps/deploy-web/src/components/remote-deploy/github/GithubManager.tsx b/apps/deploy-web/src/components/remote-deploy/github/GithubManager.tsx new file mode 100644 index 000000000..2908208d0 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/github/GithubManager.tsx @@ -0,0 +1,53 @@ +import { Dispatch } from "react"; +import { Control, UseFormSetValue } from "react-hook-form"; + +import { useRepos } from "@src/queries/useGithubQuery"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { GitHubProfile } from "@src/types/remoteProfile"; +import Repos from "../Repos"; +import GithubBranches from "./GithubBranches"; + +const GithubManager = ({ + control, + setValue, + services, + setDeploymentName, + deploymentName, + profile +}: { + setDeploymentName: Dispatch; + deploymentName: string; + control: Control; + + setValue: UseFormSetValue; + services: ServiceType[]; + profile?: GitHubProfile; +}) => { + const { data: repos, isLoading } = useRepos(); + + return ( + <> + repo.owner?.login === profile?.login || repo?.owner?.type === "Organization") + ?.map(repo => ({ + name: repo.name, + default_branch: repo?.default_branch, + html_url: repo?.html_url, + private: repo?.private, + id: repo.id?.toString(), + owner: repo?.owner + }))} + setValue={setValue} + isLoading={isLoading} + services={services} + setDeploymentName={setDeploymentName} + deploymentName={deploymentName} + profile={profile} + /> + + + ); +}; + +export default GithubManager; diff --git a/apps/deploy-web/src/components/remote-deploy/gitlab/GitlabBranches.tsx b/apps/deploy-web/src/components/remote-deploy/gitlab/GitlabBranches.tsx new file mode 100644 index 000000000..567afce5c --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/gitlab/GitlabBranches.tsx @@ -0,0 +1,19 @@ +import { Control } from "react-hook-form"; + +import { useGitLabBranches } from "@src/queries/useGitlabQuery"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { GitlabRepo } from "@src/types/remoteRepos"; +import SelectBranches from "../SelectBranches"; + +const GitlabBranches = ({ repos, services, control }: { repos?: GitlabRepo[]; services: ServiceType[]; control: Control }) => { + const selected = + repos && repos?.length > 0 + ? repos?.find(e => e.web_url === services?.[0]?.env?.find(e => e.key === "REPO_URL")?.value)?.id?.toString() + : services?.[0]?.env?.find(e => e.key === "GITLAB_PROJECT_ID")?.value; + + const { data: branches, isLoading: branchesLoading } = useGitLabBranches(selected); + + return ; +}; + +export default GitlabBranches; diff --git a/apps/deploy-web/src/components/remote-deploy/gitlab/GitlabManager.tsx b/apps/deploy-web/src/components/remote-deploy/gitlab/GitlabManager.tsx new file mode 100644 index 000000000..944ac6395 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/gitlab/GitlabManager.tsx @@ -0,0 +1,54 @@ +import React, { Dispatch, useState } from "react"; +import { Control, UseFormSetValue } from "react-hook-form"; + +import { useGitLabReposByGroup } from "@src/queries/useGitlabQuery"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import Repos from "../Repos"; +import GitlabBranches from "./GitlabBranches"; +import Groups from "./Groups"; + +const GitlabManager = ({ + loading, + setValue, + services, + control, + setDeploymentName, + deploymentName +}: { + setDeploymentName: Dispatch; + deploymentName: string; + loading: boolean; + setValue: UseFormSetValue; + services: ServiceType[]; + control: Control; +}) => { + const [group, setGroup] = useState(""); + const { data: repos, isLoading } = useGitLabReposByGroup(group); + + return ( + <> + + ({ + name: repo.name, + id: repo.id?.toString(), + default_branch: repo?.default_branch, + html_url: repo?.web_url, + userName: "gitlab", + private: repo?.visibility === "private" + })) ?? [] + } + setValue={setValue} + setDeploymentName={setDeploymentName} + deploymentName={deploymentName} + type="gitlab" + /> + + + ); +}; + +export default GitlabManager; diff --git a/apps/deploy-web/src/components/remote-deploy/gitlab/Groups.tsx b/apps/deploy-web/src/components/remote-deploy/gitlab/Groups.tsx new file mode 100644 index 000000000..497e98367 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/gitlab/Groups.tsx @@ -0,0 +1,51 @@ +import { Dispatch, useState } from "react"; +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, Spinner } from "@akashnetwork/ui/components"; +import { GitlabFull } from "iconoir-react"; + +import { useGitLabGroups } from "@src/queries/useGitlabQuery"; + +const Groups = ({ isLoading, setGroup }: { isLoading: boolean; setGroup: Dispatch }) => { + const [open, setOpen] = useState(false); + + const { data, isLoading: loadingWorkSpaces } = useGitLabGroups(); + + return ( +
+
+

Select Group

+

Select a Group to use for deployment

+
+ + +
+ ); +}; + +export default Groups; diff --git a/apps/deploy-web/src/components/remote-deploy/update/RemoteDeployUpdate.tsx b/apps/deploy-web/src/components/remote-deploy/update/RemoteDeployUpdate.tsx new file mode 100644 index 000000000..f1d8c600c --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/update/RemoteDeployUpdate.tsx @@ -0,0 +1,128 @@ +import React, { useEffect, useMemo, useState } from "react"; +import { useFieldArray, useForm } from "react-hook-form"; +import { Checkbox, Label, Snackbar } from "@akashnetwork/ui/components"; +import { useAtom } from "jotai"; +import { useSnackbar } from "notistack"; + +import { EnvFormModal } from "@src/components/sdl/EnvFormModal"; +import { EnvVarList } from "@src/components/sdl/EnvVarList"; +import { CI_CD_TEMPLATE_ID, CURRENT_SERVICE, protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { SdlBuilderProvider } from "@src/context/SdlBuilderProvider"; +import { useTemplates } from "@src/context/TemplatesProvider"; +import { EnvVarUpdater } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { tokens } from "@src/store/remoteDeployStore"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { defaultService } from "@src/utils/sdl/data"; +import { generateSdl } from "@src/utils/sdl/sdlGenerator"; +import { importSimpleSdl } from "@src/utils/sdl/sdlImport"; +import BitBranches from "../bitbucket/BitBucketBranches"; +import GithubBranches from "../github/GithubBranches"; +import GitBranches from "../gitlab/GitlabBranches"; +import Rollback from "./Rollback"; + +const RemoteDeployUpdate = ({ sdlString, onManifestChange }: { sdlString: string; onManifestChange: (value: string) => void }) => { + const [token] = useAtom(tokens); + const { enqueueSnackbar } = useSnackbar(); + const [isEditingEnv, setIsEditingEnv] = useState(false); + const { control, watch, setValue } = useForm({ defaultValues: { services: [defaultService] } }); + const { fields: services } = useFieldArray({ control, name: "services", keyName: "id" }); + const { getTemplateById } = useTemplates(); + const remoteDeployTemplate = getTemplateById(CI_CD_TEMPLATE_ID); + const envVarUpdater = useMemo(() => new EnvVarUpdater(services), [services]); + + useEffect(() => { + const { unsubscribe }: any = watch(data => { + const sdl = generateSdl(data.services as ServiceType[]); + onManifestChange(sdl); + }); + try { + if (sdlString) { + const services = createAndValidateSdl(sdlString); + setValue("services", services as ServiceType[]); + } + } catch (error) { + enqueueSnackbar(, { variant: "error" }); + } + + return () => { + unsubscribe(); + }; + }, [watch, sdlString]); + + const createAndValidateSdl = (yamlStr: string) => { + try { + if (!yamlStr) return []; + const services = importSimpleSdl(yamlStr); + + return services; + } catch (err) { + if (err.name === "YAMLException" || err.name === "CustomValidationError") { + enqueueSnackbar(, { variant: "error" }); + } else if (err.name === "TemplateValidation") { + enqueueSnackbar(, { variant: "error" }); + } else { + enqueueSnackbar(, { variant: "error" }); + } + } + }; + return remoteDeployTemplate?.deploy?.includes(services?.[0]?.image) && services?.[0]?.env && services?.[0]?.env?.length > 0 ? ( +
+
+
+ + + e.key === protectedEnvironmentVariables.DISABLE_PULL)?.value !== "yes"} + onCheckedChange={value => { + const pull = !value ? "yes" : "no"; + + setValue(CURRENT_SERVICE, envVarUpdater.addOrUpdateEnvironmentVariable(protectedEnvironmentVariables.DISABLE_PULL, pull, false)); + enqueueSnackbar(, { + variant: "info" + }); + }} + /> +
+

If checked, Console will automatically re-deploy your app on any code commits

+
+ + + + {isEditingEnv && ( + { + setIsEditingEnv(false); + }} + /> + )} + + {token.accessToken && services[0]?.env?.find(e => e.key === protectedEnvironmentVariables.REPO_URL)?.value?.includes(token.type) && ( + <> +
+
+

Rollback

Rollback to a specific commit

+
+ + +
+ {token?.type === "github" ? ( + + ) : token?.type === "gitlab" ? ( + + ) : ( + + )} + + )} +
+ ) : null; +}; +export default RemoteDeployUpdate; diff --git a/apps/deploy-web/src/components/remote-deploy/update/Rollback.tsx b/apps/deploy-web/src/components/remote-deploy/update/Rollback.tsx new file mode 100644 index 000000000..0fcd7f146 --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/update/Rollback.tsx @@ -0,0 +1,49 @@ +import { useMemo } from "react"; +import { Control } from "react-hook-form"; + +import { protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { useCommits } from "@src/queries/useGithubQuery"; +import { useGitLabCommits } from "@src/queries/useGitlabQuery"; +import { formatUrlWithoutInitialPath } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; +import { RollBackType } from "@src/types/remotedeploy"; +import { useBitBucketCommits } from "../../../queries/useBitBucketQuery"; +import RollbackModal from "./RollbackModal"; + +const Rollback = ({ services, control }: { services: ServiceType[]; control: Control }) => { + const repoUrl = services?.[0]?.env?.find(e => e.key === protectedEnvironmentVariables.REPO_URL)?.value; + const branchName = services?.[0]?.env?.find(e => e.key === protectedEnvironmentVariables.BRANCH_NAME)?.value; + + const { data } = useCommits(repoUrl?.replace("https://github.com/", ""), branchName); + const { data: labCommits } = useGitLabCommits(services?.[0]?.env?.find(e => e.key === protectedEnvironmentVariables.GITLAB_PROJECT_ID)?.value, branchName); + const { data: bitbucketCommits } = useBitBucketCommits(formatUrlWithoutInitialPath(repoUrl)); + const commits: RollBackType[] | null = useMemo(() => { + if (data?.length) { + return formatCommits(data, commit => ({ + name: commit.commit.message, + value: commit.sha, + date: new Date(commit?.commit?.author?.date || "") + })); + } else if (labCommits?.length) { + return formatCommits(labCommits, commit => ({ + name: commit.title, + value: commit.id, + date: new Date(commit.authored_date) + })); + } else if (bitbucketCommits?.values?.length) { + return formatCommits(bitbucketCommits.values, commit => ({ + name: commit.message, + value: commit.hash, + date: new Date(commit.date) + })); + } + return null; + }, [data, labCommits, bitbucketCommits]); + + function formatCommits(commits: T[], mapFn: (commit: T) => RollBackType): RollBackType[] { + return commits.map(mapFn); + } + + return ; +}; +export default Rollback; diff --git a/apps/deploy-web/src/components/remote-deploy/update/RollbackModal.tsx b/apps/deploy-web/src/components/remote-deploy/update/RollbackModal.tsx new file mode 100644 index 000000000..a6a52012a --- /dev/null +++ b/apps/deploy-web/src/components/remote-deploy/update/RollbackModal.tsx @@ -0,0 +1,130 @@ +import React, { useEffect, useState } from "react"; +import { Control, useFieldArray } from "react-hook-form"; +import { + Button, + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, + Input, + Label, + RadioGroup, + RadioGroupItem, + Tabs, + TabsContent, + TabsList, + TabsTrigger +} from "@akashnetwork/ui/components"; +import { GitCommitVertical, GitGraph, Info } from "lucide-react"; +import { nanoid } from "nanoid"; + +import { protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { SdlBuilderFormValuesType } from "@src/types"; +import { RollBackType } from "@src/types/remotedeploy"; + +const RollbackModal = ({ commits, control }: { commits?: RollBackType[] | null; control: Control }) => { + const [filteredCommits, setFilteredCommits] = useState([]); + const [searchQuery, setSearchQuery] = useState(""); + const { fields: services } = useFieldArray({ control, name: "services", keyName: "id" }); + const { append, update } = useFieldArray({ control, name: "services.0.env", keyName: "id" }); + const currentHash = services[0]?.env?.find(e => e.key === protectedEnvironmentVariables.COMMIT_HASH); + + useEffect(() => { + if (commits) { + setFilteredCommits( + commits?.filter(item => { + return item.name.toLowerCase().includes(searchQuery.toLowerCase()); + }) + ); + } + }, [commits, searchQuery]); + + return ( +
+ + + + + + + Rollbacks + + + You need to click update deployment button to apply changes + + + + + Commit Name + Commit Hash + + +
+
+ { + setSearchQuery(e.target.value); + }} + /> +
+ {filteredCommits?.length > 0 ? ( + { + const hash = { id: nanoid(), key: protectedEnvironmentVariables.COMMIT_HASH, value: value, isSecret: false }; + + if (currentHash) { + update(services[0]?.env?.findIndex(e => e.key === protectedEnvironmentVariables.COMMIT_HASH) as number, hash); + } else { + append(hash); + } + }} + > + {filteredCommits?.map(item => ( +
+ + +
+ ))} +
+ ) : ( + <> + )} +
+
+ +
+ + { + const hash = { id: nanoid(), key: protectedEnvironmentVariables.COMMIT_HASH, value: e.target.value, isSecret: false }; + if (currentHash) { + update(services[0]?.env?.findIndex(e => e.key === protectedEnvironmentVariables.COMMIT_HASH) as number, hash); + } else { + append(hash); + } + }} + /> +
+
+
+
+
+
+ ); +}; + +export default RollbackModal; diff --git a/apps/deploy-web/src/components/sdl/EnvFormModal.tsx b/apps/deploy-web/src/components/sdl/EnvFormModal.tsx index 637dc8f9a..43de16fdf 100644 --- a/apps/deploy-web/src/components/sdl/EnvFormModal.tsx +++ b/apps/deploy-web/src/components/sdl/EnvFormModal.tsx @@ -6,7 +6,8 @@ import { cn } from "@akashnetwork/ui/utils"; import { Bin } from "iconoir-react"; import { nanoid } from "nanoid"; -import { EnvironmentVariableType, RentGpusFormValuesType,SdlBuilderFormValuesType } from "@src/types"; +import { protectedEnvironmentVariables } from "@src/config/remote-deploy.config"; +import { EnvironmentVariableType, RentGpusFormValuesType, SdlBuilderFormValuesType } from "@src/types"; import { FormPaper } from "./FormPaper"; type Props = { @@ -16,9 +17,19 @@ type Props = { control: Control; hasSecretOption?: boolean; children?: ReactNode; + isRemoteDeployEnvHidden?: boolean; + isUpdate?: boolean; }; -export const EnvFormModal: React.FunctionComponent = ({ control, serviceIndex, envs: _envs, onClose, hasSecretOption = true }) => { +export const EnvFormModal: React.FunctionComponent = ({ + control, + serviceIndex, + envs: _envs, + onClose, + hasSecretOption = true, + isRemoteDeployEnvHidden, + isUpdate +}) => { const { fields: envs, remove: removeEnv, @@ -28,9 +39,14 @@ export const EnvFormModal: React.FunctionComponent = ({ control, serviceI name: `services.${serviceIndex}.env`, keyName: "id" }); + const filteredEnvs = envs?.filter(e => !isRemoteDeployEnvHidden || !(e?.key?.trim() in protectedEnvironmentVariables)); useEffect(() => { - if (_envs.length === 0) { + const noEnvsExist = _envs.length === 0; + const noUserAddedEnvs = _envs.filter(e => !(e?.key?.trim() in protectedEnvironmentVariables)).length === 0; + const shouldAddEnv = noEnvsExist || (isRemoteDeployEnvHidden && noUserAddedEnvs && !isUpdate); + + if (shouldAddEnv) { onAddEnv(); } }, []); @@ -80,13 +96,15 @@ export const EnvFormModal: React.FunctionComponent = ({ control, serviceI enableCloseOnBackdropClick > - {envs.map((env, envIndex) => { + {filteredEnvs?.map((env, envIndex) => { + const currentEnvIndex = envs.findIndex(e => e.id === env.id); + const isLastEnv = envIndex + 1 === filteredEnvs.length; return ( -
+
(
= ({ control, serviceI (
= ({ control, serviceI })} > {envIndex > 0 && ( - )} @@ -134,7 +152,7 @@ export const EnvFormModal: React.FunctionComponent = ({ control, serviceI {hasSecretOption && ( ( >; + isRemoteDeployEnvHidden?: boolean; }; -export const EnvVarList: React.FunctionComponent = ({ currentService, setIsEditingEnv, serviceIndex }) => { +export const EnvVarList: React.FunctionComponent = ({ currentService, setIsEditingEnv, serviceIndex, isRemoteDeployEnvHidden }) => { const { hasComponent } = useSdlBuilder(); + const currentEnvs = currentService.env?.filter(e => !isRemoteDeployEnvHidden || !(e?.key in protectedEnvironmentVariables)); return ( - +
Environment Variables @@ -51,8 +55,8 @@ export const EnvVarList: React.FunctionComponent = ({ currentService, set
- {(currentService.env?.length || 0) > 0 ? ( - currentService.env?.map((e, i) => ( + {currentEnvs?.length ? ( + currentEnvs.map((e, i) => (
{e.key}={e.value}
diff --git a/apps/deploy-web/src/components/sdl/SimpleServiceFormControl.tsx b/apps/deploy-web/src/components/sdl/SimpleServiceFormControl.tsx index 26af5477e..26958ef05 100644 --- a/apps/deploy-web/src/components/sdl/SimpleServiceFormControl.tsx +++ b/apps/deploy-web/src/components/sdl/SimpleServiceFormControl.tsx @@ -66,6 +66,7 @@ type Props = { setValue: UseFormSetValue; gpuModels: GpuVendor[] | undefined; hasSecretOption?: boolean; + isGitProviderTemplate?: boolean; }; export const SimpleServiceFormControl: React.FunctionComponent = ({ @@ -78,7 +79,8 @@ export const SimpleServiceFormControl: React.FunctionComponent = ({ setServiceCollapsed, setValue, gpuModels, - hasSecretOption + hasSecretOption, + isGitProviderTemplate }) => { const [isEditingCommands, setIsEditingCommands] = useState(null); const [isEditingEnv, setIsEditingEnv] = useState(null); @@ -94,7 +96,6 @@ export const SimpleServiceFormControl: React.FunctionComponent = ({ const _isEditingPlacement = serviceIndex === isEditingPlacement; const { imageList, hasComponent, toggleCmp } = useSdlBuilder(); const wallet = useWallet(); - const onExpandClick = () => { setServiceCollapsed(prev => { if (expanded) { @@ -144,39 +145,48 @@ export const SimpleServiceFormControl: React.FunctionComponent = ({ /> )} -
- ( - - Service Name - - The service name serves as a identifier for the workload to be ran on the Akash Network. -
-
- - View official documentation. - - - } - > - -
-
- } - value={field.value} - className="flex-grow" - onChange={event => field.onChange((event.target.value || "").toLowerCase())} - /> - )} - /> - +
+ {isGitProviderTemplate ? ( +

Build Server Specs

+ ) : ( + ( + + Service Name + + The service name serves as a identifier for the workload to be ran on the Akash Network. +
+
+ + View official documentation. + + + } + > + +
+
+ } + value={field.value} + className="flex-grow" + onChange={event => field.onChange((event.target.value || "").toLowerCase())} + /> + )} + /> + )}
{!expanded && isDesktop && (
@@ -208,84 +218,86 @@ export const SimpleServiceFormControl: React.FunctionComponent = ({
-
- ( - - {imageList?.length ? ( -
- + + Docker Logo +
+ +
+
+ + + {imageList.map(image => { + return ( + + {image} + + ); + })} + + + +
+ ) : ( + + Docker Image / OS + + Docker image of the container. +
+
+ Best practices: avoid using :latest image tags as Akash Providers heavily cache images. + + } + > + +
- - - - {imageList.map(image => { - return ( - - {image} - - ); - })} - - - -
- ) : ( - - Docker Image / OS - - Docker image of the container. -
-
- Best practices: avoid using :latest image tags as Akash Providers heavily cache images. - - } + } + placeholder="Example: mydockerimage:1.01" + value={field.value} + error={!!fieldState.error} + onChange={event => field.onChange((event.target.value || "").toLowerCase())} + startIconClassName="pl-2" + startIcon={Docker Logo} + endIcon={ + - -
-
- } - placeholder="Example: mydockerimage:1.01" - value={field.value} - error={!!fieldState.error} - onChange={event => field.onChange((event.target.value || "").toLowerCase())} - startIconClassName="pl-2" - startIcon={Docker Logo} - endIcon={ - - - - } - data-testid="image-name-input" - /> - )} + + + } + data-testid="image-name-input" + /> + )} - - - )} - /> -
+ + + )} + /> +
+ )}
@@ -317,39 +329,43 @@ export const SimpleServiceFormControl: React.FunctionComponent = ({
-
- {(hasComponent("ssh") || hasComponent("ssh-toggle")) && ( - - {hasComponent("ssh-toggle") && ( - { - toggleCmp("ssh"); - setValue("hasSSHKey", !!checked); - }} - className="ml-4" - label="Expose SSH" - data-testid="ssh-toggle" - /> + {!isGitProviderTemplate && ( + <> +
+ {(hasComponent("ssh") || hasComponent("ssh-toggle")) && ( + + {hasComponent("ssh-toggle") && ( + { + toggleCmp("ssh"); + setValue("hasSSHKey", !!checked); + }} + className="ml-4" + label="Expose SSH" + data-testid="ssh-toggle" + /> + )} + {hasComponent("ssh") && } + )} - {hasComponent("ssh") && } - - )} -
- -
+
+ +
- {hasComponent("command") && ( -
- + {hasComponent("command") && ( +
+ +
+ )}
- )} -
-
- -
+
+ +
+ + )} {hasComponent("service-count") && (
diff --git a/apps/deploy-web/src/config/browser-env.config.ts b/apps/deploy-web/src/config/browser-env.config.ts index abe5143ba..ff36d15b0 100644 --- a/apps/deploy-web/src/config/browser-env.config.ts +++ b/apps/deploy-web/src/config/browser-env.config.ts @@ -18,5 +18,10 @@ export const browserEnvConfig = validateStaticEnvVars({ NEXT_PUBLIC_NODE_ENV: process.env.NEXT_PUBLIC_NODE_ENV, NEXT_PUBLIC_BASE_API_MAINNET_URL: process.env.NEXT_PUBLIC_BASE_API_MAINNET_URL, NEXT_PUBLIC_BASE_API_TESTNET_URL: process.env.NEXT_PUBLIC_BASE_API_TESTNET_URL, - NEXT_PUBLIC_BASE_API_SANDBOX_URL: process.env.NEXT_PUBLIC_BASE_API_SANDBOX_URL + NEXT_PUBLIC_BASE_API_SANDBOX_URL: process.env.NEXT_PUBLIC_BASE_API_SANDBOX_URL, + NEXT_PUBLIC_REDIRECT_URI: process.env.NEXT_PUBLIC_REDIRECT_URI, + NEXT_PUBLIC_GITHUB_APP_INSTALLATION_URL: process.env.NEXT_PUBLIC_GITHUB_APP_INSTALLATION_URL, + NEXT_PUBLIC_BITBUCKET_CLIENT_ID: process.env.NEXT_PUBLIC_BITBUCKET_CLIENT_ID, + NEXT_PUBLIC_GITLAB_CLIENT_ID: process.env.NEXT_PUBLIC_GITLAB_CLIENT_ID, + NEXT_PUBLIC_GITHUB_CLIENT_ID: process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID }); diff --git a/apps/deploy-web/src/config/env-config.schema.ts b/apps/deploy-web/src/config/env-config.schema.ts index b7a751d3d..2d3682f5b 100644 --- a/apps/deploy-web/src/config/env-config.schema.ts +++ b/apps/deploy-web/src/config/env-config.schema.ts @@ -20,7 +20,12 @@ export const browserEnvSchema = z.object({ NEXT_PUBLIC_BASE_API_MAINNET_URL: z.string().url(), NEXT_PUBLIC_BASE_API_TESTNET_URL: z.string().url(), NEXT_PUBLIC_BASE_API_SANDBOX_URL: z.string().url(), - NEXT_PUBLIC_GA_MEASUREMENT_ID: z.string().optional() + NEXT_PUBLIC_GA_MEASUREMENT_ID: z.string().optional(), + NEXT_PUBLIC_REDIRECT_URI: z.string().url(), + NEXT_PUBLIC_GITHUB_APP_INSTALLATION_URL: z.string().url(), + NEXT_PUBLIC_BITBUCKET_CLIENT_ID: z.string().optional(), + NEXT_PUBLIC_GITLAB_CLIENT_ID: z.string().optional(), + NEXT_PUBLIC_GITHUB_CLIENT_ID: z.string().optional() }); export const serverEnvSchema = browserEnvSchema.extend({ @@ -34,7 +39,10 @@ export const serverEnvSchema = browserEnvSchema.extend({ AUTH0_SCOPE: z.string(), BASE_API_MAINNET_URL: z.string().url(), BASE_API_TESTNET_URL: z.string().url(), - BASE_API_SANDBOX_URL: z.string().url() + BASE_API_SANDBOX_URL: z.string().url(), + GITHUB_CLIENT_SECRET: z.string(), + BITBUCKET_CLIENT_SECRET: z.string(), + GITLAB_CLIENT_SECRET: z.string() }); export type BrowserEnvConfig = z.infer; diff --git a/apps/deploy-web/src/config/remote-deploy.config.ts b/apps/deploy-web/src/config/remote-deploy.config.ts new file mode 100644 index 000000000..1646efed6 --- /dev/null +++ b/apps/deploy-web/src/config/remote-deploy.config.ts @@ -0,0 +1,80 @@ +import { browserEnvConfig } from "./browser-env.config"; + +export const CI_CD_TEMPLATE_ID = "akash-network-awesome-akash-automatic-deployment-CICD-template"; +export const CURRENT_SERVICE = "services.0.env"; +export const DEFAULT_ENV_IN_YML = "https://github.com/onwidget/astrowind"; +export const ROOT_FOLDER_NAME = "akash-root-folder-repo-path"; +export const protectedEnvironmentVariables = { + REPO_URL: "REPO_URL", + BRANCH_NAME: "BRANCH_NAME", + accessToken: "accessToken", + BUILD_DIRECTORY: "BUILD_DIRECTORY", + BUILD_COMMAND: "BUILD_COMMAND", + NODE_VERSION: "NODE_VERSION", + CUSTOM_SRC: "CUSTOM_SRC", + COMMIT_HASH: "COMMIT_HASH", + GITLAB_PROJECT_ID: "GITLAB_PROJECT_ID", + GITLAB_ACCESS_TOKEN: "GITLAB_ACCESS_TOKEN", + BITBUCKET_ACCESS_TOKEN: "BITBUCKET_ACCESS_TOKEN", + BITBUCKET_USER: "BITBUCKET_USER", + DISABLE_PULL: "DISABLE_PULL", + GITHUB_ACCESS_TOKEN: "GITHUB_ACCESS_TOKEN", + FRONTEND_FOLDER: "FRONTEND_FOLDER", + INSTALL_COMMAND: "INSTALL_COMMAND" +}; + +export const REDIRECT_URL = `${browserEnvConfig.NEXT_PUBLIC_REDIRECT_URI}?step=edit-deployment&type=github`; + +export const supportedFrameworks = [ + { + title: "React", + value: "react", + image: "https://static-00.iconduck.com/assets.00/react-icon-512x456-2ynx529a.png" + }, + { + title: "Vue", + value: "vue", + image: "https://upload.wikimedia.org/wikipedia/commons/thumb/5/53/Vue.js_Logo.svg/1200px-Vue.js_Logo.svg.png" + }, + { + title: "Angular", + value: "angular", + image: "https://upload.wikimedia.org/wikipedia/commons/thumb/c/cf/Angular_full_color_logo.svg/1200px-Angular_full_color_logo.svg.png" + }, + { + title: "Svelte", + value: "svelte", + image: "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/Svelte_Logo.svg/1200px-Svelte_Logo.svg.png" + }, + { + title: "Next.js", + value: "next", + image: "https://uxwing.com/wp-content/themes/uxwing/download/brands-and-social-media/nextjs-icon.png" + }, + + { + title: "Astro", + value: "astro", + image: "https://icon.icepanel.io/Technology/png-shadow-512/Astro.png" + }, + { + title: "Nuxt.js", + value: "nuxt", + image: "https://v2.nuxt.com/_nuxt/icons/icon_64x64.6dcbd4.png" + }, + + { + title: "Gridsome ", + value: "gridsome", + image: "https://gridsome.org/assets/static/favicon.b9532cc.c6d52b979318cc0b0524324281174df2.png" + }, + { + title: "Vite", + value: "vite", + image: "https://vitejs.dev/logo.svg" + }, + { + title: "Other", + value: "other" + } +]; diff --git a/apps/deploy-web/src/hooks/useRemoteDeployFramework.tsx b/apps/deploy-web/src/hooks/useRemoteDeployFramework.tsx new file mode 100644 index 000000000..2d3f738cf --- /dev/null +++ b/apps/deploy-web/src/hooks/useRemoteDeployFramework.tsx @@ -0,0 +1,49 @@ +import { useState } from "react"; + +import { supportedFrameworks } from "@src/config/remote-deploy.config"; +import { useBitPackageJson } from "@src/queries/useBitBucketQuery"; +import { usePackageJson } from "@src/queries/useGithubQuery"; +import { useGitlabPackageJson } from "@src/queries/useGitlabQuery"; +import { formatUrlWithoutInitialPath } from "@src/services/remote-deploy/remote-deployment-controller.service"; +import { PackageJson } from "@src/types/remotedeploy"; + +const useRemoteDeployFramework = ({ + currentRepoUrl, + currentBranchName, + currentGitlabProjectId, + subFolder, + setCpus +}: { + currentRepoUrl?: string; + currentBranchName?: string; + currentGitlabProjectId?: string; + subFolder?: string; + setCpus: (cpu: number) => void; +}) => { + const [packageJson, setPackageJson] = useState(null); + + const { isLoading } = usePackageJson(setValueHandler, formatUrlWithoutInitialPath(currentRepoUrl), subFolder); + const { isLoading: gitlabLoading, isFetching } = useGitlabPackageJson(setValueHandler, currentGitlabProjectId, subFolder); + + const { isLoading: bitbucketLoading } = useBitPackageJson(setValueHandler, formatUrlWithoutInitialPath(currentRepoUrl), currentBranchName, subFolder); + + function setValueHandler(data: PackageJson) { + if (data?.dependencies) { + setPackageJson(data); + const cpus = (Object.keys(data?.dependencies ?? {})?.length / 10 / 2)?.toFixed(1); + + setCpus(+cpus > 2 ? +cpus : 2); + } else { + setPackageJson(null); + } + } + return { + currentFramework: supportedFrameworks.find(f => packageJson?.scripts?.dev?.includes(f.value)) ?? { + title: "Other", + value: "other" + }, + isLoading: isLoading || gitlabLoading || bitbucketLoading || isFetching + }; +}; + +export default useRemoteDeployFramework; diff --git a/apps/deploy-web/src/pages/api/bitbucket/authenticate.ts b/apps/deploy-web/src/pages/api/bitbucket/authenticate.ts new file mode 100644 index 000000000..d29aa4cb6 --- /dev/null +++ b/apps/deploy-web/src/pages/api/bitbucket/authenticate.ts @@ -0,0 +1,30 @@ +import { NextApiRequest, NextApiResponse } from "next"; + +import { serverEnvConfig } from "@src/config/server-env.config"; +import BitbucketAuth from "@src/services/auth/bitbucket.service"; + +const NEXT_PUBLIC_BITBUCKET_CLIENT_ID = serverEnvConfig.NEXT_PUBLIC_BITBUCKET_CLIENT_ID as string; +const BITBUCKET_CLIENT_SECRET = serverEnvConfig.BITBUCKET_CLIENT_SECRET as string; + +export default async function exchangeBitBucketCodeForTokensHandler(req: NextApiRequest, res: NextApiResponse): Promise { + const { code }: { code: string } = req.body; + + if (!code) { + return res.status(400).send({ + error: "BadRequestError", + message: "No authorization code provided" + }); + } + + const bitbucketAuth = new BitbucketAuth(NEXT_PUBLIC_BITBUCKET_CLIENT_ID, BITBUCKET_CLIENT_SECRET); + + try { + const tokens = await bitbucketAuth.exchangeAuthorizationCodeForTokens(code); + res.status(200).json(tokens); + } catch (error) { + res.status(500).send({ + error: error.response?.data?.error, + message: error.response?.data?.error_description + }); + } +} diff --git a/apps/deploy-web/src/pages/api/bitbucket/refresh.ts b/apps/deploy-web/src/pages/api/bitbucket/refresh.ts new file mode 100644 index 000000000..c84cd3f73 --- /dev/null +++ b/apps/deploy-web/src/pages/api/bitbucket/refresh.ts @@ -0,0 +1,30 @@ +import { NextApiRequest, NextApiResponse } from "next"; + +import { serverEnvConfig } from "@src/config/server-env.config"; +import BitbucketAuth from "@src/services/auth/bitbucket.service"; + +const NEXT_PUBLIC_BITBUCKET_CLIENT_ID = serverEnvConfig.NEXT_PUBLIC_BITBUCKET_CLIENT_ID as string; +const BITBUCKET_CLIENT_SECRET = serverEnvConfig.BITBUCKET_CLIENT_SECRET as string; + +export default async function refreshTokensHandler(req: NextApiRequest, res: NextApiResponse): Promise { + const { refreshToken }: { refreshToken: string } = req.body; + + if (!refreshToken) { + return res.status(400).send({ + error: "BadRequestError", + message: "No refresh token provided" + }); + } + + const bitbucketAuth = new BitbucketAuth(NEXT_PUBLIC_BITBUCKET_CLIENT_ID, BITBUCKET_CLIENT_SECRET); + + try { + const tokens = await bitbucketAuth.refreshTokensUsingRefreshToken(refreshToken); + res.status(200).json(tokens); + } catch (error) { + res.status(500).send({ + error: error.response?.data?.error, + message: error.response?.data?.error_description + }); + } +} diff --git a/apps/deploy-web/src/pages/api/github/authenticate.ts b/apps/deploy-web/src/pages/api/github/authenticate.ts new file mode 100644 index 000000000..df2c83afb --- /dev/null +++ b/apps/deploy-web/src/pages/api/github/authenticate.ts @@ -0,0 +1,29 @@ +import { NextApiRequest, NextApiResponse } from "next"; + +import { serverEnvConfig } from "@src/config/server-env.config"; +import GitHubAuth from "@src/services/auth/github.service"; + +const { NEXT_PUBLIC_GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, NEXT_PUBLIC_REDIRECT_URI } = serverEnvConfig; + +export default async function exchangeGitHubCodeForTokenHandler(req: NextApiRequest, res: NextApiResponse): Promise { + const { code }: { code: string } = req.body; + + if (!code) { + return res.status(400).send({ + error: "BadRequestError", + message: "No authorization code provided" + }); + } + + const gitHubAuth = new GitHubAuth(NEXT_PUBLIC_GITHUB_CLIENT_ID as string, GITHUB_CLIENT_SECRET as string, NEXT_PUBLIC_REDIRECT_URI as string); + + try { + const accessToken = await gitHubAuth.exchangeAuthorizationCodeForToken(code); + res.status(200).json({ accessToken }); + } catch (error) { + res.status(500).send({ + error: "Something went wrong", + message: error + }); + } +} diff --git a/apps/deploy-web/src/pages/api/gitlab/authenticate.ts b/apps/deploy-web/src/pages/api/gitlab/authenticate.ts new file mode 100644 index 000000000..28b0905d1 --- /dev/null +++ b/apps/deploy-web/src/pages/api/gitlab/authenticate.ts @@ -0,0 +1,29 @@ +import { NextApiRequest, NextApiResponse } from "next"; + +import { serverEnvConfig } from "@src/config/server-env.config"; +import GitlabAuth from "@src/services/auth/gitlab.service"; + +const { NEXT_PUBLIC_GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET, NEXT_PUBLIC_REDIRECT_URI } = serverEnvConfig; + +export default async function exchangeGitLabCodeForTokensHandler(req: NextApiRequest, res: NextApiResponse): Promise { + const { code }: { code: string } = req.body; + + if (!code) { + return res.status(400).send({ + error: "BadRequestError", + message: "No authorization code provided" + }); + } + + const gitlabAuth = new GitlabAuth(NEXT_PUBLIC_GITLAB_CLIENT_ID as string, GITLAB_CLIENT_SECRET as string, NEXT_PUBLIC_REDIRECT_URI as string); + + try { + const tokens = await gitlabAuth.exchangeAuthorizationCodeForTokens(code); + res.status(200).json(tokens); + } catch (error) { + res.status(500).send({ + error: error.response?.data?.error, + message: error.response?.data?.error_description + }); + } +} diff --git a/apps/deploy-web/src/pages/api/gitlab/refresh.ts b/apps/deploy-web/src/pages/api/gitlab/refresh.ts new file mode 100644 index 000000000..d45390022 --- /dev/null +++ b/apps/deploy-web/src/pages/api/gitlab/refresh.ts @@ -0,0 +1,29 @@ +import { NextApiRequest, NextApiResponse } from "next"; + +import { serverEnvConfig } from "@src/config/server-env.config"; +import GitlabAuth from "@src/services/auth/gitlab.service"; + +const { NEXT_PUBLIC_GITLAB_CLIENT_ID, GITLAB_CLIENT_SECRET } = serverEnvConfig; + +export default async function refreshGitLabTokensHandler(req: NextApiRequest, res: NextApiResponse): Promise { + const { refreshToken }: { refreshToken: string } = req.body; + + if (!refreshToken) { + return res.status(400).send({ + error: "BadRequestError", + message: "No refresh token provided" + }); + } + + const gitlabAuth = new GitlabAuth(NEXT_PUBLIC_GITLAB_CLIENT_ID as string, GITLAB_CLIENT_SECRET as string); + + try { + const tokens = await gitlabAuth.refreshTokensUsingRefreshToken(refreshToken); + res.status(200).json(tokens); + } catch (error) { + res.status(500).send({ + error: error.response?.data?.error, + message: error.response?.data?.error_description + }); + } +} diff --git a/apps/deploy-web/src/queries/queryKeys.ts b/apps/deploy-web/src/queries/queryKeys.ts index 199985e35..1f9cba09d 100644 --- a/apps/deploy-web/src/queries/queryKeys.ts +++ b/apps/deploy-web/src/queries/queryKeys.ts @@ -46,4 +46,18 @@ export class QueryKeys { static getDepositParamsKey = () => ["DEPOSIT_PARAMS"]; static getGpuModelsKey = () => ["GPU_MODELS"]; static getTrialProvidersKey = () => ["TRIAL_PROVIDERS"]; + + // Remote deploy + static getProviderTokenKey = () => ["TOKEN"]; + static getUserProfileKey = (accessToken?: string | null) => ["USER_PROFILE", accessToken]; + static getGroupsKey = (accessToken?: string | null) => ["GROUPS", accessToken]; + static getReposByGroupKey = (group?: string, accessToken?: string | null) => ["REPOS_BY_GROUP", group, accessToken]; + static getCommitsKey = (repo?: string, accessToken?: string | null) => ["COMMITS", repo, accessToken]; + static getCommitsByBranchKey = (repo?: string, branch?: string, accessToken?: string | null) => ["COMMITS_BY_BRANCH", repo, branch, accessToken]; + static getWorkspacesKey = (accessToken?: string | null) => ["WORKSPACES", accessToken]; + static getReposByWorkspaceKey = (workspace: string, accessToken: string | null) => ["REPOS", accessToken, workspace]; + static getReposKey = (accessToken?: string | null) => ["REPOS", accessToken]; + static getBranchesKey = (repo?: string, accessToken?: string | null) => ["BRANCHES", repo, accessToken]; + static getPackageJsonKey = (repo?: string, branch?: string, subFolder?: string) => ["PACKAGE_JSON", repo, branch, subFolder]; + static getSrcFoldersKey = (repo?: string, branch?: string) => ["SRC_FOLDERS", repo, branch]; } diff --git a/apps/deploy-web/src/queries/useBitBucketQuery.ts b/apps/deploy-web/src/queries/useBitBucketQuery.ts new file mode 100644 index 000000000..7c0265032 --- /dev/null +++ b/apps/deploy-web/src/queries/useBitBucketQuery.ts @@ -0,0 +1,123 @@ +import { useMutation, useQuery } from "react-query"; +import { AxiosError } from "axios"; +import { useAtom } from "jotai"; + +import { BitbucketService } from "@src/services/remote-deploy/bitbucket-http.service"; +import { tokens } from "@src/store/remoteDeployStore"; +import { IGithubDirectoryItem, PackageJson } from "@src/types/remotedeploy"; +import { QueryKeys } from "./queryKeys"; +const OAuthType = "bitbucket"; +const bitbucketService = new BitbucketService(); + +export const useFetchRefreshBitToken = () => { + const [token, setToken] = useAtom(tokens); + + return useMutation({ + mutationFn: async () => bitbucketService.fetchRefreshToken(token?.refreshToken), + onSuccess: data => { + setToken({ + ...data, + type: "bitbucket" + }); + } + }); +}; + +export const useBitFetchAccessToken = (onSuccess: () => void) => { + const [, setToken] = useAtom(tokens); + + return useMutation({ + mutationFn: async (code: string) => bitbucketService.fetchAccessToken(code), + onSuccess: data => { + setToken({ + ...data, + type: OAuthType + }); + + onSuccess(); + } + }); +}; + +export const useBitUserProfile = () => { + const [token] = useAtom(tokens); + + const { mutate } = useFetchRefreshBitToken(); + return useQuery({ + queryKey: QueryKeys.getUserProfileKey(token.accessToken), + queryFn: async () => bitbucketService.fetchUserProfile(token.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType, + onError: (error: AxiosError) => { + if (error.response?.status === 401) { + mutate(); + } + } + }); +}; + +export const useBitBucketCommits = (repo?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getCommitsKey(repo, token.accessToken), + queryFn: async () => bitbucketService.fetchCommits(repo, token.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo + }); +}; + +export const useWorkspaces = () => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getWorkspacesKey(token.accessToken), + queryFn: async () => bitbucketService.fetchWorkspaces(token.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType + }); +}; + +export const useBitReposByWorkspace = (workspace: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getReposByWorkspaceKey(workspace, token.accessToken), + queryFn: async () => bitbucketService.fetchReposByWorkspace(workspace, token.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!workspace + }); +}; + +export const useBitBranches = (repo?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getBranchesKey(repo, token.accessToken), + queryFn: async () => bitbucketService.fetchBranches(repo, token.accessToken), + enabled: !!repo && !!token?.accessToken && token.type === OAuthType + }); +}; + +export const useBitPackageJson = (onSettled: (data: PackageJson) => void, repo?: string, branch?: string, subFolder?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getPackageJsonKey(repo, branch, subFolder), + queryFn: async () => bitbucketService.fetchPackageJson(repo, branch, subFolder, token.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo && !!branch, + onSettled: data => { + onSettled(data); + } + }); +}; + +export const useBitSrcFolders = (onSettled: (data: IGithubDirectoryItem[]) => void, repo?: string, branch?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getSrcFoldersKey(repo, branch), + + queryFn: async () => bitbucketService.fetchSrcFolders(repo, branch, token.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo && !!branch, + onSettled: data => { + onSettled(data?.values); + } + }); +}; diff --git a/apps/deploy-web/src/queries/useGithubQuery.ts b/apps/deploy-web/src/queries/useGithubQuery.ts new file mode 100644 index 000000000..0e09eb4f9 --- /dev/null +++ b/apps/deploy-web/src/queries/useGithubQuery.ts @@ -0,0 +1,97 @@ +import { useMutation, useQuery } from "react-query"; +import { useAtom } from "jotai"; + +import { GitHubService } from "@src/services/remote-deploy/github-http.service"; +import { tokens } from "@src/store/remoteDeployStore"; +import { IGithubDirectoryItem, PackageJson } from "@src/types/remotedeploy"; +import { QueryKeys } from "./queryKeys"; + +const githubService = new GitHubService(); +const OAuthType = "github"; +export const useUserProfile = () => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getUserProfileKey(token.accessToken), + queryFn: () => githubService.fetchUserProfile(token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType + }); +}; + +export const useRepos = () => { + const [token] = useAtom(tokens); + return useQuery({ + queryKey: QueryKeys.getReposKey(token.accessToken), + queryFn: () => githubService.fetchRepos(token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType + }); +}; + +export const useBranches = (repo?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getBranchesKey(repo, token?.accessToken), + queryFn: () => githubService.fetchBranches(repo!, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo + }); +}; + +export const useCommits = (repo?: string, branch?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getCommitsByBranchKey(repo, branch, token?.accessToken), + queryFn: () => githubService.fetchCommits(repo!, branch!, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo && !!branch + }); +}; + +export const usePackageJson = (onSuccess: (data: PackageJson) => void, repo?: string, subFolder?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getPackageJsonKey(repo, OAuthType, subFolder), + queryFn: () => githubService.fetchPackageJson(repo, subFolder, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo, + onSettled: data => { + if (data?.content === undefined) return; + const content = atob(data.content); + const parsed = JSON.parse(content); + + onSuccess(parsed); + } + }); +}; + +export const useSrcFolders = (onSettled: (data: IGithubDirectoryItem[]) => void, repo?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getSrcFoldersKey(repo, OAuthType), + queryFn: () => githubService.fetchSrcFolders(repo!, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo, + onSettled: data => { + onSettled(data); + } + }); +}; + +export const useFetchAccessToken = (onSuccess: () => void) => { + const [, setToken] = useAtom(tokens); + + return useMutation({ + mutationFn: async (code: string) => { + return githubService.fetchAccessToken(code); + }, + onSuccess: data => { + setToken({ + accessToken: data.accessToken, + refreshToken: data.refreshToken, + type: OAuthType + }); + + onSuccess(); + } + }); +}; diff --git a/apps/deploy-web/src/queries/useGitlabQuery.ts b/apps/deploy-web/src/queries/useGitlabQuery.ts new file mode 100644 index 000000000..84aaa18f4 --- /dev/null +++ b/apps/deploy-web/src/queries/useGitlabQuery.ts @@ -0,0 +1,123 @@ +import { useMutation, useQuery } from "react-query"; +import { AxiosError } from "axios"; +import { useAtom } from "jotai"; + +import { GitLabService } from "@src/services/remote-deploy/gitlab-http.service"; +import { tokens } from "@src/store/remoteDeployStore"; +import { IGithubDirectoryItem, PackageJson } from "@src/types/remotedeploy"; +import { QueryKeys } from "./queryKeys"; + +const gitLabService = new GitLabService(); +const OAuthType = "gitlab"; +export const useGitLabFetchAccessToken = (onSuccess: () => void) => { + const [, setToken] = useAtom(tokens); + + return useMutation({ + mutationFn: (code: string) => gitLabService.fetchAccessToken(code), + onSuccess: data => { + setToken({ + accessToken: data.accessToken, + refreshToken: data.refreshToken, + type: OAuthType + }); + + onSuccess(); + } + }); +}; + +export const useFetchRefreshToken = () => { + const [token, setToken] = useAtom(tokens); + + return useMutation({ + mutationFn: () => gitLabService.refreshToken(token?.refreshToken), + onSuccess: data => { + setToken({ + accessToken: data.accessToken, + refreshToken: data.refreshToken, + type: OAuthType + }); + } + }); +}; + +export const useGitLabUserProfile = () => { + const [token] = useAtom(tokens); + const { mutate } = useFetchRefreshToken(); + + return useQuery({ + queryKey: QueryKeys.getUserProfileKey(token?.accessToken), + queryFn: () => gitLabService.fetchUserProfile(token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType, + onError: (error: AxiosError) => { + if (error.response?.status === 401) { + mutate(); + } + } + }); +}; + +export const useGitLabGroups = () => { + const [token] = useAtom(tokens); + return useQuery({ + queryKey: QueryKeys.getGroupsKey(token?.accessToken), + queryFn: () => gitLabService.fetchGitLabGroups(token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType + }); +}; + +export const useGitLabReposByGroup = (group: string | undefined) => { + const [token] = useAtom(tokens); + return useQuery({ + queryKey: QueryKeys.getReposByGroupKey(group, token?.accessToken), + queryFn: () => gitLabService.fetchReposByGroup(group, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!group + }); +}; + +export const useGitLabBranches = (repo?: string) => { + const [token] = useAtom(tokens); + return useQuery({ + queryKey: QueryKeys.getBranchesKey(repo, token?.accessToken), + queryFn: () => gitLabService.fetchBranches(repo, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo + }); +}; + +export const useGitLabCommits = (repo?: string, branch?: string) => { + const [token] = useAtom(tokens); + return useQuery({ + queryKey: QueryKeys.getCommitsByBranchKey(repo, branch, token?.accessToken), + queryFn: () => gitLabService.fetchCommits(repo, branch, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo && !!branch + }); +}; + +export const useGitlabPackageJson = (onSettled: (data: PackageJson) => void, repo?: string, subFolder?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getPackageJsonKey(repo, OAuthType, subFolder), + queryFn: () => gitLabService.fetchPackageJson(repo, subFolder, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo, + onSettled: data => { + if (data?.content === undefined) return; + const content = atob(data.content); + const parsed = JSON.parse(content); + onSettled(parsed); + } + }); +}; + +export const useGitlabSrcFolders = (onSettled: (data: IGithubDirectoryItem[]) => void, repo?: string) => { + const [token] = useAtom(tokens); + + return useQuery({ + queryKey: QueryKeys.getSrcFoldersKey(repo, OAuthType), + queryFn: () => gitLabService.fetchSrcFolders(repo, token?.accessToken), + enabled: !!token?.accessToken && token.type === OAuthType && !!repo, + onSettled: data => { + onSettled(data); + } + }); +}; diff --git a/apps/deploy-web/src/services/auth/bitbucket.service.ts b/apps/deploy-web/src/services/auth/bitbucket.service.ts new file mode 100644 index 000000000..da2b84dbd --- /dev/null +++ b/apps/deploy-web/src/services/auth/bitbucket.service.ts @@ -0,0 +1,67 @@ +import axios, { AxiosResponse } from "axios"; +import { URLSearchParams } from "url"; + +import { GitProviderTokens } from "@src/types/remotedeploy"; + +interface Tokens { + access_token: string; + refresh_token: string; +} + +class BitbucketAuth { + private tokenUrl: string; + private clientId: string; + private clientSecret: string; + + constructor(clientId: string, clientSecret: string) { + this.tokenUrl = "https://bitbucket.org/site/oauth2/access_token"; + this.clientId = clientId; + this.clientSecret = clientSecret; + } + + async exchangeAuthorizationCodeForTokens(authorizationCode: string): Promise { + const params = new URLSearchParams(); + params.append("grant_type", "authorization_code"); + params.append("code", authorizationCode); + + const headers = { + Authorization: `Basic ${Buffer.from(`${this.clientId}:${this.clientSecret}`).toString("base64")}`, + "Content-Type": "application/x-www-form-urlencoded" + }; + + try { + const response: AxiosResponse = await axios.post(this.tokenUrl, params.toString(), { headers }); + const { access_token, refresh_token }: Tokens = response.data; + return { + accessToken: access_token, + refreshToken: refresh_token + }; + } catch (error) { + throw new Error(error); + } + } + + async refreshTokensUsingRefreshToken(refreshToken: string): Promise { + const params = new URLSearchParams(); + params.append("grant_type", "refresh_token"); + params.append("refresh_token", refreshToken); + + const headers = { + Authorization: `Basic ${Buffer.from(`${this.clientId}:${this.clientSecret}`).toString("base64")}`, + "Content-Type": "application/x-www-form-urlencoded" + }; + + try { + const response: AxiosResponse = await axios.post(this.tokenUrl, params.toString(), { headers }); + const { access_token, refresh_token }: Tokens = response.data; + return { + accessToken: access_token, + refreshToken: refresh_token + }; + } catch (error) { + throw new Error(error); + } + } +} + +export default BitbucketAuth; diff --git a/apps/deploy-web/src/services/auth/github.service.ts b/apps/deploy-web/src/services/auth/github.service.ts new file mode 100644 index 000000000..bb042fdc3 --- /dev/null +++ b/apps/deploy-web/src/services/auth/github.service.ts @@ -0,0 +1,34 @@ +import axios, { AxiosResponse } from "axios"; + +class GitHubAuth { + private tokenUrl: string; + private clientId: string; + private clientSecret: string; + private redirectUri: string | undefined; + + constructor(clientId: string, clientSecret: string, redirectUri?: string) { + this.tokenUrl = "https://github.com/login/oauth/access_token"; + this.clientId = clientId; + this.clientSecret = clientSecret; + this.redirectUri = redirectUri; + } + + async exchangeAuthorizationCodeForToken(authorizationCode: string): Promise { + try { + const response: AxiosResponse = await axios.post(this.tokenUrl, { + client_id: this.clientId, + client_secret: this.clientSecret, + code: authorizationCode, + redirect_uri: this.redirectUri + }); + + const params = new URLSearchParams(response.data); + const accessToken = params.get("access_token"); + return accessToken as string; + } catch (error) { + throw new Error(error); + } + } +} + +export default GitHubAuth; diff --git a/apps/deploy-web/src/services/auth/gitlab.service.ts b/apps/deploy-web/src/services/auth/gitlab.service.ts new file mode 100644 index 000000000..7d057f4f2 --- /dev/null +++ b/apps/deploy-web/src/services/auth/gitlab.service.ts @@ -0,0 +1,62 @@ +import axios, { AxiosResponse } from "axios"; + +import { GitProviderTokens } from "@src/types/remotedeploy"; +interface Tokens { + access_token: string; + refresh_token: string; +} + +class GitlabAuth { + private tokenUrl: string; + private clientId: string; + private clientSecret: string; + private redirectUri: string | undefined; + + constructor(clientId: string, clientSecret: string, redirectUri?: string) { + this.tokenUrl = "https://gitlab.com/oauth/token"; + this.clientId = clientId; + this.clientSecret = clientSecret; + this.redirectUri = redirectUri; + } + + async exchangeAuthorizationCodeForTokens(authorizationCode: string): Promise { + try { + const response: AxiosResponse = await axios.post(this.tokenUrl, { + client_id: this.clientId, + client_secret: this.clientSecret, + code: authorizationCode, + redirect_uri: this.redirectUri, + grant_type: "authorization_code" + }); + + const { access_token, refresh_token }: Tokens = response.data; + return { + accessToken: access_token, + refreshToken: refresh_token + }; + } catch (error) { + throw new Error(error); + } + } + + async refreshTokensUsingRefreshToken(token: string): Promise { + try { + const response: AxiosResponse = await axios.post(this.tokenUrl, { + client_id: this.clientId, + client_secret: this.clientSecret, + refresh_token: token, + grant_type: "refresh_token" + }); + + const { access_token, refresh_token }: Tokens = response.data; + return { + accessToken: access_token, + refreshToken: refresh_token + }; + } catch (error) { + throw new Error(error); + } + } +} + +export default GitlabAuth; diff --git a/apps/deploy-web/src/services/remote-deploy/bitbucket-http.service.ts b/apps/deploy-web/src/services/remote-deploy/bitbucket-http.service.ts new file mode 100644 index 000000000..46f95b4af --- /dev/null +++ b/apps/deploy-web/src/services/remote-deploy/bitbucket-http.service.ts @@ -0,0 +1,97 @@ +import axios from "axios"; + +import { browserEnvConfig } from "@src/config/browser-env.config"; +import { BitBucketCommit } from "@src/types/remoteCommits"; +import { BitProfile } from "@src/types/remoteProfile"; +import { BitRepository, BitWorkspace } from "@src/types/remoteRepos"; + +const BITBUCKET_API_URL = "https://api.bitbucket.org/2.0"; + +export class BitbucketService { + private axiosInstance = axios.create({ + baseURL: BITBUCKET_API_URL, + headers: { + "Content-Type": "application/json", + Accept: "application/json" + } + }); + + constructor() {} + + public loginWithBitBucket() { + window.location.href = `https://bitbucket.org/site/oauth2/authorize?client_id=${browserEnvConfig.NEXT_PUBLIC_BITBUCKET_CLIENT_ID}&response_type=code`; + } + + async fetchRefreshToken(refreshToken?: string | null) { + const response = await axios.post(`/api/bitbucket/refresh`, { refreshToken }); + return response.data; + } + + async fetchAccessToken(code: string) { + const response = await axios.post(`/api/bitbucket/authenticate`, { code }); + return response.data; + } + + async fetchUserProfile(accessToken?: string | null) { + const response = await this.axiosInstance.get("/user", { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + return response.data; + } + + async fetchCommits(repo?: string, accessToken?: string | null) { + const response = await this.axiosInstance.get(`/repositories/${repo}/commits`, { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + return response.data; + } + + async fetchWorkspaces(accessToken?: string | null) { + const response = await this.axiosInstance.get<{ values: BitWorkspace[] }>("/workspaces", { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + return response.data; + } + + async fetchReposByWorkspace(workspace: string, accessToken?: string | null) { + const response = await this.axiosInstance.get<{ values: BitRepository[] }>(`/repositories/${workspace}`, { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + return response.data; + } + + async fetchBranches(repo?: string, accessToken?: string | null) { + const response = await this.axiosInstance.get(`/repositories/${repo}/refs/branches`, { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + return response.data; + } + + async fetchPackageJson(repo?: string, branch?: string, subFolder?: string | undefined, accessToken?: string | null) { + const response = await this.axiosInstance.get(`/repositories/${repo}/src/${branch}/${subFolder ? `${subFolder}/` : ""}package.json`, { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + return response.data; + } + + async fetchSrcFolders(repo?: string, branch?: string, accessToken?: string | null) { + const response = await this.axiosInstance.get(`/repositories/${repo}/src/${branch}/.`, { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + return response.data; + } +} diff --git a/apps/deploy-web/src/services/remote-deploy/github-http.service.ts b/apps/deploy-web/src/services/remote-deploy/github-http.service.ts new file mode 100644 index 000000000..be8392265 --- /dev/null +++ b/apps/deploy-web/src/services/remote-deploy/github-http.service.ts @@ -0,0 +1,85 @@ +import axios from "axios"; + +import { browserEnvConfig } from "@src/config/browser-env.config"; +import { REDIRECT_URL } from "@src/config/remote-deploy.config"; +import { GitCommit } from "@src/types/remoteCommits"; +import { GithubRepository } from "@src/types/remotedeploy"; +import { GitHubProfile } from "@src/types/remoteProfile"; +const GITHUB_API_URL = "https://api.github.com"; + +const axiosInstance = axios.create({ + baseURL: GITHUB_API_URL, + headers: { + "Content-Type": "application/json", + Accept: "application/json" + } +}); + +export class GitHubService { + loginWithGithub() { + window.location.href = browserEnvConfig.NEXT_PUBLIC_GITHUB_APP_INSTALLATION_URL; + } + + reLoginWithGithub() { + window.location.href = `https://github.com/login/oauth/authorize?client_id=${browserEnvConfig.NEXT_PUBLIC_GITHUB_CLIENT_ID}&redirect_uri=${REDIRECT_URL}`; + } + + async fetchUserProfile(token?: string | null) { + const response = await axiosInstance.get("/user", { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + async fetchRepos(token?: string | null) { + const response = await axiosInstance.get("/user/repos?per_page=150", { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + async fetchBranches(repo?: string, token?: string | null) { + const response = await axiosInstance.get(`/repos/${repo}/branches`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + async fetchCommits(repo?: string, branch?: string, token?: string | null) { + const response = await axiosInstance.get(`/repos/${repo}/commits?sha=${branch}`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + async fetchPackageJson(repo?: string, subFolder?: string | undefined, token?: string | null) { + const response = await axiosInstance.get(`/repos/${repo}/contents/${subFolder ? `${subFolder}/` : ""}package.json`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + async fetchSrcFolders(repo: string, token?: string | null) { + const response = await axiosInstance.get(`/repos/${repo}/contents`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + async fetchAccessToken(code: string) { + const response = await axios.post(`/api/github/authenticate`, { code }); + return response.data; + } +} diff --git a/apps/deploy-web/src/services/remote-deploy/gitlab-http.service.ts b/apps/deploy-web/src/services/remote-deploy/gitlab-http.service.ts new file mode 100644 index 000000000..2e520d7f6 --- /dev/null +++ b/apps/deploy-web/src/services/remote-deploy/gitlab-http.service.ts @@ -0,0 +1,93 @@ +import axios from "axios"; + +import { browserEnvConfig } from "@src/config/browser-env.config"; +import { GitLabCommit } from "@src/types/remoteCommits"; +import { GitLabProfile } from "@src/types/remoteProfile"; +import { GitlabGroup, GitlabRepo } from "@src/types/remoteRepos"; + +export class GitLabService { + private axiosInstance = axios.create({ + baseURL: "https://gitlab.com/api/v4", + headers: { + "Content-Type": "application/json", + Accept: "application/json" + } + }); + + public loginWithGitLab() { + window.location.href = `https://gitlab.com/oauth/authorize?client_id=${browserEnvConfig.NEXT_PUBLIC_GITLAB_CLIENT_ID}&redirect_uri=${process.env.NEXT_PUBLIC_REDIRECT_URI}&response_type=code&scope=read_user+read_repository+read_api+api&state=gitlab`; + } + + public async fetchAccessToken(code: string) { + const response = await axios.post(`/api/gitlab/authenticate`, { code }); + return response.data; + } + + public async refreshToken(refreshToken?: string | null) { + const response = await axios.post(`/api/gitlab/refresh`, { refreshToken }); + return response.data; + } + + public async fetchUserProfile(token?: string | null) { + const response = await this.axiosInstance.get("/user", { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + public async fetchGitLabGroups(token?: string | null) { + const response = await this.axiosInstance.get(`/groups`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + public async fetchReposByGroup(group: string | undefined, token?: string | null) { + const response = await this.axiosInstance.get(`/groups/${group}/projects`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + public async fetchBranches(repo: string | undefined, token?: string | null) { + const response = await this.axiosInstance.get(`/projects/${repo}/repository/branches`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + public async fetchCommits(repo: string | undefined, branch: string | undefined, token?: string | null) { + const response = await this.axiosInstance.get(`/projects/${repo}/repository/commits?ref_name=${branch}`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + public async fetchPackageJson(repo: string | undefined, subFolder: string | undefined, token?: string | null) { + const response = await this.axiosInstance.get(`/projects/${repo}/repository/files/${subFolder ? `${subFolder}%2F` : ""}package.json?ref=main`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } + + public async fetchSrcFolders(repo: string | undefined, token?: string | null) { + const response = await this.axiosInstance.get(`/projects/${repo}/repository/tree`, { + headers: { + Authorization: `Bearer ${token}` + } + }); + return response.data; + } +} diff --git a/apps/deploy-web/src/services/remote-deploy/remote-deployment-controller.service.ts b/apps/deploy-web/src/services/remote-deploy/remote-deployment-controller.service.ts new file mode 100644 index 000000000..2d341594a --- /dev/null +++ b/apps/deploy-web/src/services/remote-deploy/remote-deployment-controller.service.ts @@ -0,0 +1,52 @@ +import { nanoid } from "nanoid"; + +import { SdlBuilderFormValuesType, ServiceType } from "@src/types"; + +export class EnvVarUpdater { + private services: ServiceType[]; + + constructor(services: ServiceType[]) { + this.services = services; + } + + public addOrUpdateEnvironmentVariable(key: string, value: string, isSecret: boolean): SdlBuilderFormValuesType["services"][0]["env"] { + const environmentVariables = this.services[0]?.env || []; + const existingVariable = environmentVariables.find(envVar => envVar.key === key); + + if (existingVariable) { + return environmentVariables.map(envVar => { + if (envVar.key === key) { + return { ...envVar, value, isSecret }; + } + return envVar; + }); + } else { + return [...environmentVariables, { id: nanoid(), key, value, isSecret }]; + } + } + + public deleteEnvironmentVariable(key: string): SdlBuilderFormValuesType["services"][0]["env"] { + const environmentVariables = this.services[0]?.env || []; + return environmentVariables.filter(envVar => envVar.key !== key); + } +} + +export function formatUrlWithoutInitialPath(url?: string): string | undefined { + return url?.split("/").slice(-2).join("/"); +} + +export function isImageInYaml(yml: string, cicdYml?: string): boolean | undefined { + return cicdYml?.includes(yml?.split("service-1:")?.[1]?.split("expose:")?.[0]?.split("image: ")?.[1]); +} + +export function extractRepositoryUrl(yml?: string | null): string | null { + if (!yml) return null; + + const lines = yml.split("\n"); + const envStartIndex = lines.findIndex(line => line.includes("env:")); + const profileStartIndex = lines.findIndex(line => line.includes("profiles:")); + const envVariables = lines.slice(envStartIndex + 1, profileStartIndex); + const repoUrlLine = envVariables.find(line => line.includes("REPO_URL")); + + return repoUrlLine ? repoUrlLine.split("=")[1] : null; +} diff --git a/apps/deploy-web/src/store/remoteDeployStore.ts b/apps/deploy-web/src/store/remoteDeployStore.ts new file mode 100644 index 000000000..9a731d6e0 --- /dev/null +++ b/apps/deploy-web/src/store/remoteDeployStore.ts @@ -0,0 +1,13 @@ +import { atomWithStorage } from "jotai/utils"; + +export const tokens = atomWithStorage<{ + accessToken: string | null; + refreshToken: string | null; + type: "bitbucket" | "github" | "gitlab"; + alreadyLoggedIn?: string[]; +}>("remote-deploy-tokens", { + accessToken: null, + refreshToken: null, + type: "github", + alreadyLoggedIn: [] +}); diff --git a/apps/deploy-web/src/types/remoteCommits.ts b/apps/deploy-web/src/types/remoteCommits.ts new file mode 100644 index 000000000..19722626d --- /dev/null +++ b/apps/deploy-web/src/types/remoteCommits.ts @@ -0,0 +1,24 @@ +import { components } from "@octokit/openapi-types"; +export type GitCommit = components["schemas"]["commit"]; +export interface GitLabCommit { + id: string; + title: string; + message: string; + authored_date: string; +} + +export interface BitBucketCommit { + values: { + type: string; + hash: string; + date: string; + message: string; + author: Author; + }[]; + pagelen: number; +} + +interface Author { + type: string; + raw: string; +} diff --git a/apps/deploy-web/src/types/remoteProfile.ts b/apps/deploy-web/src/types/remoteProfile.ts new file mode 100644 index 000000000..28c9a1d0e --- /dev/null +++ b/apps/deploy-web/src/types/remoteProfile.ts @@ -0,0 +1,47 @@ +import { components } from "@octokit/openapi-types"; +export type GitHubProfile = components["schemas"]["simple-user"]; + +export interface BitProfile { + display_name: string; + links: { + self: { + href: string; + }; + avatar: { + href: string; + }; + + html: { + href: string; + }; + hooks: { + href: string; + }; + }; + created_on: string; + type: string; + uuid: string; + + username: string; + + account_id: string; + nickname: string; + account_status: string; + location: null; +} + +export interface GitLabProfile { + id: number; + username: string; + name: string; + + avatar_url: string; + web_url: string; + created_at: string; + bio: string; + location: string; + public_email: string; + + last_activity_on: string; + email: string; +} diff --git a/apps/deploy-web/src/types/remoteRepos.ts b/apps/deploy-web/src/types/remoteRepos.ts new file mode 100644 index 000000000..b75c8118a --- /dev/null +++ b/apps/deploy-web/src/types/remoteRepos.ts @@ -0,0 +1,117 @@ +interface RepositoryLinks { + self: Link; + html: Link; + avatar: Link; + pullrequests: Link; + commits: Link; + forks: Link; + watchers: Link; + branches: Link; + tags: Link; + downloads: Link; + source: Link; + hooks: Link; +} + +interface Link { + href: string; +} + +interface RepositoryOwner { + display_name: string; + links: { + self: Link; + avatar: Link; + html: Link; + }; + type: string; + uuid: string; + username: string; +} + +export interface BitWorkspace { + type: string; + uuid: string; + name: string; + slug: string; + links: { + avatar: Link; + html: Link; + self: Link; + }; +} + +interface Project { + type: string; + key: string; + uuid: string; + name: string; + links: { + self: Link; + html: Link; + avatar: Link; + }; +} + +interface MainBranch { + name: string; + type: string; +} + +export interface BitRepository { + type: string; + full_name: string; + links: RepositoryLinks; + name: string; + slug: string; + description: string; + scm: string; + website: string | null; + owner: RepositoryOwner; + workspace: BitWorkspace; + is_private: boolean; + project: Project; + fork_policy: string; + created_on: string; + updated_on: string; + size: number; + language: string; + uuid: string; + mainbranch: MainBranch; + parent: null | string; +} + +export interface GitlabRepo { + id: number; + description: string; + name: string; + created_at: string; + default_branch: string; + web_url: string; + readme_url: string; + forks_count: number; + avatar_url: string | null; + star_count: number; + last_activity_at: string; + container_registry_image_prefix: string; + packages_enabled: boolean; + empty_repo: boolean; + archived: boolean; + visibility: string; +} + +export interface GitlabGroup { + id: number; + web_url: string; + name: string; + path: string; + description: string; + visibility: string; + default_branch: string | null; + default_branch_protection: number; + avatar_url: string | null; + request_access_enabled: boolean; + full_name: string; + full_path: string; + created_at: string; +} diff --git a/apps/deploy-web/src/types/remotedeploy.ts b/apps/deploy-web/src/types/remotedeploy.ts new file mode 100644 index 000000000..2a0c05a60 --- /dev/null +++ b/apps/deploy-web/src/types/remotedeploy.ts @@ -0,0 +1,33 @@ +import { components } from "@octokit/openapi-types"; +export type GithubRepository = components["schemas"]["full-repository"]; +export type IGithubDirectoryItem = Omit & { + type: "file" | "dir" | "commit_directory" | "tree"; +}; +export type Owner = components["schemas"]["full-repository"]["owner"]; + +export interface RollBackType { + name: string; + value: string; + date: Date; +} + +export interface PackageJson { + dependencies?: Record; + devDependencies?: Record; + scripts?: Record; +} + +export interface CustomRepo { + name: string; + id?: string; + default_branch: string; + html_url: string; + userName?: string; + private: boolean; + owner?: Owner; +} + +export interface GitProviderTokens { + accessToken: string; + refreshToken: string; +} diff --git a/apps/deploy-web/src/utils/urlUtils.ts b/apps/deploy-web/src/utils/urlUtils.ts index 3ceb03c8b..33c4b229d 100644 --- a/apps/deploy-web/src/utils/urlUtils.ts +++ b/apps/deploy-web/src/utils/urlUtils.ts @@ -7,6 +7,8 @@ export type NewDeploymentParams = { redeploy?: string | number; templateId?: string; page?: "new-deployment" | "deploy-linux"; + gitProvider?: string; + gitProviderCode?: string | null; }; export const domainName = "https://console.akash.network"; @@ -50,11 +52,10 @@ export class UrlService { // Deploy static deploymentList = () => `/deployments`; static deploymentDetails = (dseq: string, tab?: string, logsMode?: string) => `/deployments/${dseq}${appendSearchParams({ tab, logsMode })}`; - static publicDeploymentDetails = (owner: string, dseq: string) => `/deployment/${owner}/${dseq}${appendSearchParams({ network: networkStore.apiVersion })}`; static templates = (category?: string, search?: string) => `/templates${appendSearchParams({ category, search })}`; static templateDetails = (templateId: string) => `/templates/${templateId}`; static providers = (sort?: string) => `/providers${appendSearchParams({ sort })}`; - static providerDetail = (owner: string) => `/providers/${owner}${appendSearchParams({ network: networkStore.marketApiVersion })}`; + static providerDetail = (owner: string) => `/providers/${owner}${appendSearchParams({ network: networkStore.selectedNetworkId })}`; static providerDetailLeases = (owner: string) => `/providers/${owner}/leases`; static providerDetailRaw = (owner: string) => `/providers/${owner}/raw`; static providerDetailEdit = (owner: string) => `/providers/${owner}/edit`; @@ -63,9 +64,9 @@ export class UrlService { // New deployment static newDeployment = (params: NewDeploymentParams = {}) => { - const { step, dseq, redeploy, templateId } = params; + const { step, dseq, redeploy, templateId, gitProviderCode, gitProvider } = params; const page = params.page || "new-deployment"; - return `/${page}${appendSearchParams({ dseq, step, templateId, redeploy })}`; + return `/${page}${appendSearchParams({ dseq, step, templateId, redeploy, gitProvider, code: gitProviderCode })}`; }; } diff --git a/package-lock.json b/package-lock.json index 904c2f8e1..483a93ca3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -317,6 +317,7 @@ "clsx": "^2.0.0", "cosmjs-types": "^0.9.0", "date-fns": "^2.29.3", + "dotenv": "^16.4.5", "file-saver": "^2.0.5", "geist": "^1.3.0", "http-proxy": "^1.18.1", @@ -372,6 +373,7 @@ "@akashnetwork/dev-config": "*", "@keplr-wallet/types": "^0.12.111", "@next/bundle-analyzer": "^14.0.1", + "@octokit/openapi-types": "^22.2.0", "@playwright/test": "^1.45.0", "@release-it/conventional-changelog": "github:akash-network/conventional-changelog#feature/pre-release", "@types/auth0": "^2.35.3", @@ -448,6 +450,25 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", "dev": true }, + "apps/deploy-web/node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "dev": true, + "license": "MIT" + }, + "apps/deploy-web/node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "apps/deploy-web/node_modules/stripe": { "version": "10.17.0", "resolved": "https://registry.npmjs.org/stripe/-/stripe-10.17.0.tgz",