UNPKG

@shopify/cli

Version:

A CLI tool to build for the Shopify platform

277 lines (269 loc) • 102 kB
import{a as An,b as Un}from"../../../chunk-FKMC5OFF.js";import{a as Cn}from"../../../chunk-HIBX234C.js";import{a as kn,e as Dn,f as Tn,g as kt,h as Ln,i as In,j as On,k as Mn,l as _n,m as Rn,n as $n,o as Fn,p as Wn,u as Nn,w as qn,y as Dt}from"../../../chunk-IZ3C5J7G.js";import{c as Bn}from"../../../chunk-C2IK2HY3.js";import{a as wn,b as xn,c as bn,d as Sn,e as En}from"../../../chunk-OTY24J2W.js";import{a as qr}from"../../../chunk-ZBRRJDGW.js";import{a as Pn}from"../../../chunk-TQ6HYDVC.js";import{a as yn}from"../../../chunk-JCL2RRU6.js";import{a as Nr}from"../../../chunk-AGNMOFJS.js";import{Ba as vn,D as rn,F as nn,H as ve,P as on,Q as ln,R as cn,V as dn,Y as un,ba as mn,ea as fn,f as Br,fa as gn,ga as hn,h as Gr,i as zr,j as jr,l as ee,m as Kr,p as Qr,q as Ut,r as Vr,s as Yr,t as Jr,u as Xr,v as Zr,va as et,w as en,wa as tt,x as tn}from"../../../chunk-54CAKCYR.js";import{H as sn,I as an,W as pn,a as Ze,f as Te,l as Hr}from"../../../chunk-7ESSIN27.js";import{a as br,b as Er,d as Dr,h as Rr,i as $r,j as Fr,k as Ct,l as At,m as Wr}from"../../../chunk-HUIJMGVJ.js";import{a as Qt}from"../../../chunk-AKML26N3.js";import"../../../chunk-URZPVSJZ.js";import{a as Tr,b as Lr,c as Ir}from"../../../chunk-EQU4MUQJ.js";import{a as Z,b as St}from"../../../chunk-6SF3ZETE.js";import"../../../chunk-3VZEETAV.js";import{a as Cr,b as Ar,c as bt,d as Ae,e as Ur,f as Ue,h as kr,l as ke,m as Qe,n as z,s as R,u as Ve,v as Ye,w as Je}from"../../../chunk-IX5ICOBV.js";import{a as Sr}from"../../../chunk-SXTMSGUE.js";import"../../../chunk-QFWIDATO.js";import{b as xr,g as Ke,j as xt}from"../../../chunk-CBXSPL4W.js";import"../../../chunk-UJVH7FZS.js";import{c as Or}from"../../../chunk-E3EMHAJB.js";import"../../../chunk-UWJ73J4B.js";import{a as _r,b as Et}from"../../../chunk-WFXRSKRK.js";import"../../../chunk-YOZNRLFC.js";import"../../../chunk-XEFQQPL4.js";import{a as De}from"../../../chunk-6WL4GA2M.js";import"../../../chunk-TYZXGSHO.js";import"../../../chunk-ULFWK45W.js";import"../../../chunk-KHTV6PBV.js";import"../../../chunk-NKQBEFPS.js";import{a as Mr}from"../../../chunk-GZS44BUW.js";import"../../../chunk-K2WUCOQJ.js";import"../../../chunk-7QIOUDCX.js";import"../../../chunk-7MUKLZOL.js";import"../../../chunk-VBUZWRUL.js";import"../../../chunk-DCPBRWVC.js";import"../../../chunk-KR6QDE7D.js";import"../../../chunk-UXVZ2P63.js";import"../../../chunk-QSTEVZFQ.js";import"../../../chunk-5Y7GIF2W.js";import{c as Pr,e as wr}from"../../../chunk-EKXY5COY.js";import{c as vr}from"../../../chunk-4DCQNGUV.js";import"../../../chunk-4ZGSSQC6.js";import"../../../chunk-QBSKKQBN.js";import"../../../chunk-FQWB2F75.js";import{$ as ir,A as vt,N as sr,Z as ge,a as Zt,c as er,h as tr,l as rr,n as Ee,q as nr,t as or,ta as pr,u as Fe,z as re}from"../../../chunk-XONFGLJQ.js";import"../../../chunk-4LNCYIS3.js";import"../../../chunk-L2MGAEV3.js";import"../../../chunk-PRKBO42R.js";import"../../../chunk-ZSBA6VIC.js";import{a as Ht}from"../../../chunk-F2QU6WWX.js";import"../../../chunk-XULPJ6UG.js";import{b as yr}from"../../../chunk-XR6GMMEU.js";import"../../../chunk-3TNEIDOD.js";import"../../../chunk-MHWV5RQV.js";import"../../../chunk-XOTA6JTZ.js";import"../../../chunk-MOA33ZFO.js";import{a as ht,c as Xt}from"../../../chunk-JUVAGMIH.js";import{D as He,H as dr,J as se,O as Ge,P as Ce,Q as wt,R as mr,T as fr,a as Jt,g as ar,i as yt,j as We,k as J,l as X,m as Ne,n as Pt,o as cr,p as qe,u as Be,w as ae}from"../../../chunk-6G6TMKXF.js";import"../../../chunk-P6XE4MH5.js";import"../../../chunk-KLMDWDT2.js";import"../../../chunk-5CH3B62S.js";import{a as ss}from"../../../chunk-QUTQDXSL.js";import{d as lr}from"../../../chunk-WSDN25F5.js";import{d as O,g as he,l as ur}from"../../../chunk-M56NDIMD.js";import"../../../chunk-PD5ZHJWI.js";import{r as os}from"../../../chunk-LDGAHMS7.js";import"../../../chunk-ZR76GGZ6.js";import"../../../chunk-EENHXSWU.js";import"../../../chunk-FUOIGXI4.js";import"../../../chunk-6M3ZYNGO.js";import"../../../chunk-QYR5VPQA.js";import{a as Xe}from"../../../chunk-S6EJHWJL.js";import"../../../chunk-OBEWZXOQ.js";import{$a as Se,Ea as jt,Gb as U,Hb as hr,Ib as T,Na as Re,Nb as ne,Q as gt,Qb as y,Rb as G,Ta as oe,Wa as $e,cb as Kt,eb as ie,fb as N,gb as A,jb as ue,kb as me,ma as W,mb as Vt,nb as Yt,ua as Me,ub as fe,wa as _e}from"../../../chunk-N5PQPIBF.js";import"../../../chunk-CERXUPGC.js";import"../../../chunk-T4M5CWAO.js";import"../../../chunk-PRVQAHWI.js";import{d as gr,f as ze,j as je}from"../../../chunk-YTNDFQJT.js";import{a as Ie}from"../../../chunk-ULQG3XQS.js";import{d as I,f as ft,g as ce,h as Gt,i as de,j as zt,k as Oe,p as be}from"../../../chunk-IU2ZQ6TE.js";import"../../../chunk-PIBY5DDZ.js";import{e as Y,g as c}from"../../../chunk-VPRTJUIN.js";c();c();c();c();c();c();var is=300*1e3,as='The host theme could not be created to host your theme app extension. Please try again or use the "--theme" flag to use an existing theme as the host theme.';async function Hn(t,e,r=Date.now()){for(;await ps(t,e,r););}async function ps(t,e,r){let n=await Ke(t,e);if(!n||ls(n,r))throw new O(as);return await Ce(3),n.processing}function ls(t,e){return t.processing&&Date.now()-e>=is}var cs="https://codeload.github.com/Shopify/dawn/zip/refs/tags/v15.0.0",ds="https://cdn.shopify.com/theme-store/uhrdefhlndzaoyrgylhto59sx2i7.jpg",Tt=3,rt=class extends Sr{constructor(r,n={devPreview:!1}){super(r);this.context="App Ext. Host";this.themeId=Tr(r.storeFqdn),this.devPreview=n.devPreview}async findOrCreate(){let r=await this.fetch();return r??=this.devPreview?await this.createHostTheme():await this.create(),r}setTheme(r){Lr(this.adminSession.storeFqdn,r)}removeTheme(){Ir(this.adminSession.storeFqdn)}async createHostTheme(){let r={role:xr,name:this.generateThemeName(this.context),src:cs};for(let o=0;o<Tt;o++){y(`Attempt ${o}/${Tt}: Creating theme with name "${r.name}" and role "${r.role}"`);try{let s=await xt(r,this.adminSession);if(s)return this.setTheme(s.id.toString()),y(`Waiting for theme with id "${s.id}" to be processed`),await Hn(s.id,this.adminSession),s;throw new Error}catch{y(`Failed to create theme with name "${r.name}" and role "${r.role}". Retrying...`)}}y(`Theme creation failed after ${Tt} retries. Creating theme using fallback theme zip`);let n=await xt({...r,src:ds},this.adminSession);if(!n)throw y("Theme creation failed. Exiting process."),new he(`Could not create theme with name "${r.name}" and role "${r.role}"`);return n}};async function Gn(t){let{remoteApp:e,localApp:r}=t,o=r.allExtensions.filter(m=>m.isThemeExtension);if(o.length===0)return;let i=o[0].directory,a=t.themeExtensionPort??9293,[l,d]=await Promise.all([sr(t.storeFqdn),fs(e)]),p=l.storeFqdn,u=await br(l)?await Er("",p):void 0,f=await ms(l,t.theme),h=f.id.toString();return Be({headline:"The theme app extension development server is ready.",orderedNextSteps:!0,nextSteps:[[{link:{label:"Install your app in your development store",url:d}}],[{link:{label:"Setup your theme app extension in the host theme",url:`https://${p}/admin/themes/${h}/editor`}}],["Preview your theme app extension at",{link:{label:`http://127.0.0.1:${a}`,url:`http://127.0.0.1:${a}`}}]]}),{type:"theme-app-extensions",prefix:"theme-extensions",function:us,options:{theme:f,adminSession:l,storefrontPassword:u,themeExtensionDirectory:i,themeExtensionPort:a}}}var us=async(t,{theme:e,adminSession:r,storefrontPassword:n,themeExtensionDirectory:o,themeExtensionPort:s})=>{await(await Dr(e,{adminSession:r,storefrontPassword:n,themeExtensionDirectory:o,themeExtensionPort:s})).start()};async function ms(t,e){let r;if(e)y(`Fetching theme with provided id ${e}`),r=await Ke(parseInt(e,10),t);else{let n=new rt(t,{devPreview:!0});await He([{title:"Configuring host theme for theme app extension",task:async()=>{y("Finding or creating host theme for theme app extensions"),r=await n.findOrCreate()}}])}if(!r)throw new O("Could not find or create a host theme for theme app extensions");return r}async function fs(t){return t.developerPlatformClient?.clientName==="app-management"?`https://${await Fe()}/?organization_id=${t.organizationId}&no_redirect=true&redirect=/oauth/redirect_from_developer_dashboard?client_id%3D${t.apiKey}`:`https://${await or()}/${t.organizationId}/apps/${t.id}/test`}c();c();c();c();c();c();async function gs(t){let e=I(t.directory,"locales");return $e([I(e,"*.json")])}async function zn(t,e){let r=await gs(t);if(!r.length)return{localization:void 0,status:""};let n=e.currentLocalizationPayload??{defaultLocale:"en",translations:{},lastUpdated:0},o="success";try{await Promise.all(r.map(async s=>{let[i,...a]=s.split("/").pop().split(".");if(i)return a[0]==="default"&&(n.defaultLocale=i),hs(i,s,n,t,e)})),n.lastUpdated=Date.now(),y(`Parsed locales for extension ${t.handle} at ${t.directory}`,e.stdout)}catch{o="error"}return{localization:n,status:o}}async function hs(t,e,r,n,o){let s;try{s=await W(e),r.translations[t]=JSON.parse(s)}catch(i){let a=`Error parsing ${t} locale for ${n.handle} at ${e}: ${i.message}`;throw G(a,o.stderr),new ur.ExtendableError(a)}}c();function nt(t,e){switch(t){case"checkout_ui_extension":return{url:e.checkoutCartUrl};case"checkout_post_purchase":return{url:e.checkoutCartUrl};case"product_subscription":return{url:e.subscriptionProductUrl??""};default:return{url:""}}}async function ye(t,e,r,n){return X({outputPrefix:t.outputPrefix},async()=>{n?.clear();let o=t.getOutputPathForDirectory(e),s=`${r.url}/extensions/${t.devUUID}`,{localization:i,status:a}=await zn(t,r),l=await jr(t),d=t.outputRelativePath?de(o):o,p=await vs(t,s,d,n),u=null;return"metafields"in t.configuration&&Array.isArray(t.configuration.metafields)&&t.configuration.metafields.length>0&&(u=t.configuration.metafields),{assets:{main:Le(p)&&p[0]?.assets?.main?p[0].assets.main:{name:"main",url:`${s}/assets/${t.outputFileName}`,lastUpdated:await Re(o)??0}},supportedFeatures:{runsOffline:t.configuration.supported_features?.runs_offline??!1},capabilities:{blockProgress:t.configuration.capabilities?.block_progress??!1,networkAccess:t.configuration.capabilities?.network_access??!1,apiAccess:t.configuration.capabilities?.api_access??!1,collectBuyerConsent:{smsMarketing:t.configuration.capabilities?.collect_buyer_consent?.sms_marketing??!1,customerPrivacy:t.configuration.capabilities?.collect_buyer_consent?.customer_privacy??!1},iframe:{sources:t.configuration.capabilities?.iframe?.sources??[]}},development:{...r.currentDevelopmentPayload,resource:nt(t.type,r),root:{url:s},hidden:r.currentDevelopmentPayload?.hidden??!1,localizationStatus:a,status:r.currentDevelopmentPayload?.status??"success",...r.currentDevelopmentPayload??{status:"success"}},extensionPoints:p,localization:i??null,metafields:u,type:t.type,externalType:t.externalType,uuid:t.devUUID,surface:t.surface,version:l?.version,title:t.name,handle:t.handle,name:t.name,description:t.configuration.description,apiVersion:t.configuration.api_version,approvalScopes:r.grantedScopes,settings:t.configuration.settings}})}async function vs(t,e,r,n){let o=t.configuration,s=o.extension_points??o.targeting;if(t.type==="checkout_post_purchase"&&(s=[{target:"purchase.post.render"}]),Le(s)){let i=await ys(r);return Promise.all(s.map(async a=>{let{target:l,resource:d}=a,p={...a,surface:tt(l),root:{url:`${e}/${l}`},resource:d||{url:""}},u=i?.[l];if(!u)return p;let h=await Ss(u,{target:l,extensionPoint:a,url:e,extension:t,buildDirectory:r,resolver:n});return{...p,...h}}))}return s}async function ys(t){try{let e=I(t,"manifest.json"),r=await W(e);return JSON.parse(r)}catch(e){if(e instanceof SyntaxError)throw new Error(`Invalid manifest.json in ${t}: ${e.message}`);return null}}async function Ps({target:t,extensionPoint:e,url:r,extension:n,resolver:o},s,i){let a=`${t}/${s}`,l=e[s];if(typeof l=="string"){let h=await ot(s,a,typeof i=="string"?i:l,r,n,o,typeof i=="string"?l:void 0);return{assets:{[h.name]:h}}}let p=e.build_manifest?.assets?.[s];if(p?.filepath){let u=await ot(s,a,p.filepath,r,n,o,p.module);return{assets:{[u.name]:u}}}return{}}async function ws({target:t,url:e,buildDirectory:r,resolver:n},o,s){if(s.length===0)return{};for(let a of s)n?.set(`${t}/${a}`,a);let i=await Promise.all(s.map(async a=>await Re(I(r,a))??0));return{assets:{[o]:{name:o,url:`${e}/assets/${t}/`,lastUpdated:Math.max(...i)}}}}async function xs({target:t,extensionPoint:e,url:r,extension:n,resolver:o},s){return e.intents?{intents:await Promise.all(e.intents.map(async(a,l)=>{let d=a.schema,p=s[l]?.schema,u=typeof p=="string"?p:d,f=typeof p=="string"?d:void 0;return{...a,schema:await ot("schema",`${t}/intents/${l}/schema`,u,r,n,o,f)}}))}:{}}async function bs({target:t,url:e,extension:r,resolver:n},o,s){let i=await ot(o,`${t}/${o}`,s,e,r,n);return{assets:{[i.name]:i}}}async function Ss(t,e){return(await Promise.all(Object.keys(t).map(async n=>{let o=t[n];return Es(n,o)?xs(e,o):Cs(n,o)?bs(e,n,o):As(n,o)?ws(e,n,o):Ps(e,n,o)}))).reduce((n,o)=>({...n,...o,assets:{...n.assets,...o.assets}}),{})}function Le(t){return Array.isArray(t)&&t.every(e=>typeof e=="object")}async function ot(t,e,r,n,o,s,i){let a=`${e}${Oe(r)}`;return s?.set(a,r),{name:t,url:`${n}/assets/${a}`,lastUpdated:await Re(I(o.directory,i??r))??0}}function Es(t,e){return t==="intents"&&Array.isArray(e)}function Cs(t,e){return(t==="main"||t==="should_render")&&typeof e=="string"}function As(t,e){return t==="assets"&&Array.isArray(e)&&e.every(r=>typeof r=="string")}c();function st(t,e){let r=re(t);return`https://${vt(r)}/admin/oauth/redirect_from_cli?client_id=${e}`}function jn(t,e,r){let o=re(t).split(".")[0];return`https://${r}/store/${o}/apps/${e}?dev-console=show`}function Lt(t){return`https://${re(t)}/admin?dev-console=show`}function Kn(t,e){let r=re(t),o=`${vt(r)}/admin/apps/${e}`,s=Buffer.from(o).toString("base64").replace(/[=]/g,"");return`https://${o}?shop=${r}&host=${s}`}import{EventEmitter as Us}from"events";async function Qn(t,e,r){return{app:{title:t.appName,apiKey:t.apiKey,url:st(t.storeFqdn,t.apiKey),mobileUrl:Kn(t.storeFqdn,t.apiKey)},appId:t.id,version:t.manifestVersion,root:{url:new URL("/extensions",t.url).toString()},socket:{url:t.websocketURL},devConsole:{url:new URL("/extensions/dev-console",t.url).toString()},store:t.storeFqdn,extensions:await Promise.all(t.extensions.filter(o=>o.isPreviewable).map(o=>ye(o,e,t,r&&It(r,o.devUUID))))}}function It(t,e){let r=t.get(e);return r||(r=new Map,t.set(e,r)),r}var it=class extends Us{constructor(e,r,n=new Map){super(),this.rawPayload=e,this.options=r,this.assetResolvers=n}getAssetResolver(e){return this.assetResolvers.get(e)}getConnectedPayload(){let e=this.getRawPayload();return{app:e.app,appId:e.appId,store:e.store,extensions:e.extensions}}getRawPayloadFilteredByExtensionIds(e){return{...this.rawPayload,extensions:this.rawPayload.extensions.filter(r=>e.includes(r.uuid))}}getRawPayload(){return this.rawPayload}updateApp(e){this.rawPayload=ge(this.rawPayload,{app:e}),this.emitUpdate([])}updateExtensions(e){let r=this.rawPayload.extensions.map(n=>{let o=e.find(s=>s.uuid===n.uuid);if(o){if(Le(o.extensionPoints)&&Le(n.extensionPoints)){let s=o.extensionPoints.reduce((l,d)=>({...l,[d.target]:d}),{});n.extensionPoints=ge(n.extensionPoints,o.extensionPoints,l=>l.map(d=>{let p=s[d.target];return p?ge(d,p,(u,f)=>f):d}));let{extensionPoints:i,...a}=o;return ge(n,a)}return ge(n,o)}return n});this.rawPayload={...this.rawPayload,extensions:r},this.emitUpdate(e.map(n=>n.uuid))}async updateExtension(e,r,n,o){let s=this.rawPayload.extensions,i=s.findIndex(a=>a.uuid===e.devUUID);if(i===-1){y(T`Could not updateExtension() for extension with uuid: ${e.devUUID}`,r.stderr);return}s[i]=await ye(e,n,{...this.options,currentDevelopmentPayload:o??{status:s[i]?.development.status},currentLocalizationPayload:s[i]?.localization},It(this.assetResolvers,e.devUUID)),this.rawPayload.extensions=s,this.emitUpdate([e.devUUID])}deleteExtension(e){let r=this.rawPayload.extensions.findIndex(n=>n.uuid===e.devUUID);r!==-1&&(this.rawPayload.extensions.splice(r,1),this.assetResolvers.delete(e.devUUID),this.emitUpdate([e.devUUID]))}async addExtension(e,r){this.rawPayload.extensions.push(await ye(e,r,this.options,It(this.assetResolvers,e.devUUID))),this.emitUpdate([e.devUUID])}emitUpdate(e){this.emit("PayloadUpdatedEvent:UPDATE",e)}};c();c();function Vn(t,e){return(r,n,o)=>{r.url==="/extensions"&&(y("Upgrading HTTP request to a websocket connection",e.stdout),t.handleUpgrade(r,n,o,ks(t,e)))}}function ks(t,e){return r=>{y("Websocket connection successfully established",e.stdout);let n={event:"connected",data:e.payloadStore.getConnectedPayload(),version:e.manifestVersion};y(T`Sending connected payload: ${U.json(n)}`,e.stdout),r.send(JSON.stringify(n)),r.on("message",Os(t,e))}}function Ds(t){try{let e=JSON.parse(t);if(!Array.isArray(e))return t;let r=e.map(n=>typeof n=="object"&&n!==null?U.json(n).output():String(n)).join(" ");return T`${r}`.value}catch(e){if(e instanceof SyntaxError)return t;throw e}}var Ts={debug:t=>U.gray(t),warn:t=>U.yellow(t),error:t=>U.errorText(t)};function Ls({type:t,message:e}){let r=Ds(e);switch(t){case"debug":case"warn":case"error":return T`${Ts[t](t.toUpperCase())}: ${r}`.value;case"log":case"info":return r;default:return`${t.toUpperCase()}: ${r}`}}function Is(t,e){X({outputPrefix:t.extensionName,stripAnsi:!1},()=>{e.stdout.write(Ls(t))})}function Os(t,e){return r=>{let n=JSON.parse(r.toString()),{event:o,data:s}=n;if(y(T`Received websocket message with event type ${o} and data: ${U.json(s)} `,e.stdout),o==="update"){let i=e.payloadStore.getRawPayload().app.apiKey,a=s.app?.apiKey;if(s.app){if(i!==a)return;e.payloadStore.updateApp(s.app)}s.extensions&&e.payloadStore.updateExtensions(s.extensions)}else if(o==="dispatch"){let i=Ms(n,e);Jn(t,i,e)}else o==="log"&&Is(s,e)}}function Yn(t,e){return r=>{let n={event:"update",version:e.manifestVersion,data:{...e.payloadStore.getRawPayloadFilteredByExtensionIds(r)}};y(T`Sending websocket update event to the websocket clients: ${U.json(n)} `,e.stdout),Jn(t,n,e)}}function Jn(t,e,r){y(T`Sending websocket with event type ${e.event} and data: ${U.json(e.data)} `,r.stdout);let n=JSON.stringify(e);t.clients.forEach(o=>o.send(n))}function Ms(t,e){let r=e.payloadStore.getRawPayload();return{...t,version:e.manifestVersion,data:{...t.data,extensions:[],store:r.store,app:r.app}}}var _s=10;function Xn(t){let e=new Qt.default({noServer:!0,clientTracking:!0}),r=Rs(e);return t.httpServer.on("upgrade",Vn(e,t)),t.payloadStore.on("PayloadUpdatedEvent:UPDATE",Yn(e,t)),{close:()=>{e.close(),clearInterval(r)}}}function Rs(t){return setInterval(()=>{t.clients.forEach(e=>{e.readyState<2&&e.ping()})},_s*1e3)}c();c();c();function Zn(t,e){let{url:r}=nt(t.type,e);if(t.surface==="checkout"&&r){let n=new URL(`https://${e.storeFqdn}/`);return n.pathname=r,n.searchParams.append("dev",`${e.url}/extensions`),n.toString()}else{let n=new URL(`https://${e.storeFqdn}/`);return n.pathname="admin/extensions-dev",n.searchParams.append("url",at(t,e)),n.toString()}}function eo(t,e,r){let n=tt(t),o=new URL(`https://${r.storeFqdn}/`);switch(n){case"checkout":o.pathname=r.checkoutCartUrl,o.searchParams.append("dev",`${r.url}/extensions`);break;case"post_purchase":if(o.pathname=r.checkoutCartUrl,o.searchParams.set("script_url",`${r.url}/extensions/${e.devUUID}/assets/${e.localIdentifier}.js`),o.searchParams.set("post_purchase_dev_api_key",r.apiKey),e.devUUID&&r.websocketURL&&(o.searchParams.set("uuid",e.devUUID),o.searchParams.set("socket_url",r.websocketURL)),"metafields"in e.configuration){let s={config:{metafields:e.configuration.metafields}};o.searchParams.set("config",JSON.stringify(s))}break;case"admin":o.pathname="admin/extensions-dev",o.searchParams.append("url",at(e,r)),o.searchParams.append("target",t);break;case"customer-accounts":o=$s(e,r,t);break;default:return}return o.toString()}function $s(t,e,r=""){let n=`${e.url}/extensions`,o=e.storeId,s="shopify.com",i=new URL(`https://${s}/${o}/account/extensions-development`);return i.searchParams.append("origin",n),i.searchParams.append("extensionId",t.devUUID),i.searchParams.append("source","CUSTOMER_ACCOUNT_EXTENSION"),i.searchParams.append("appId",e.id??""),r!==""&&i.searchParams.append("target",r),i}function at(t,e){let r=new URL(e.url);return r.pathname=`/extensions/${t.devUUID}`,r.toString()}function te(t,e){Ar(t,Cr(e))}c();var Ot=class extends he{constructor(e){super(`Couldn't find template ${e.template} for extension surface ${e.extensionSurface}`)}};async function to(t){let e=await Fs(t),r=await W(e);return De(r,t.data)}async function Fs(t){let e=await Ws(),r=[];t.extensionSurface&&r.push(I(e,`${t.extensionSurface}/${t.template}.html.liquid`)),r.push(I(e,`${t.template}.html.liquid`));let n=await $e(r);if(n.length===0)throw new Ot(t);return n[0]}async function Ws(){return await Se("templates/ui-extensions/html",{type:"directory",cwd:be(import.meta.url)})}var ro=R(t=>{z(t,"Access-Control-Allow-Origin","*"),z(t,"Access-Control-Allow-Methods","GET, OPTIONS"),z(t,"Access-Control-Allow-Headers","Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, ngrok-skip-browser-warning")}),no=R(t=>{z(t,"Cache-Control","no-cache")}),oo=R(async t=>Qe(t,"/extensions/dev-console",307));async function Mt(t,e){let{filePath:r}=e;if(!await oe(r))return te(t,{statusCode:404,statusMessage:`Not Found: ${r}`});if(await jt(r)&&(r+=r.endsWith("/")?"index.html":"/index.html",!await oe(r)))return te(t,{statusCode:404,statusMessage:`Not Found: ${r}`});let n=await W(r,{}),o={".ico":"image/x-icon",".html":"text/html",".js":"text/javascript",".json":"application/json",".wasm":"application/wasm",".css":"text/css",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".wav":"audio/wav",".mp3":"audio/mpeg",".svg":"image/svg+xml",".pdf":"application/pdf",".doc":"application/msword"},s=Oe(r),i=o[s]||"text/plain";return z(t,"Content-Type",i),n}function so({getExtensions:t,payloadStore:e}){return R(async r=>{let{extensionId:n,assetPath:o=""}=Ae(r),s=t().find(u=>u.devUUID===n);if(!s)return te(r,{statusCode:404,statusMessage:`Extension with id ${n} not found`});let a=e.getAssetResolver(s.devUUID)?.get(o)??o,l=ft(Qr(s.outputPath)),d=ft(I(l,a)),p=ce(l,d);return p.startsWith("..")||Gt(p)?te(r,{statusCode:404,statusMessage:"Not Found"}):Mt(r,{filePath:d})})}function _t({payloadStore:t}){return R(e=>(z(e,"content-type","application/json"),t.getRawPayload()))}var io=R(async t=>{let e=await Se(I("assets","dev-console"),{type:"directory",cwd:be(import.meta.url)});return e?Mt(t,{filePath:e}):te(t,{statusCode:404,statusMessage:"Could not find root directory for dev console"})}),ao=R(async t=>{let{assetPath:e=""}=Ae(t),r=await Se(I("assets","dev-console","extensions","dev-console","assets"),{type:"directory",cwd:be(import.meta.url)});return r?Mt(t,{filePath:I(r,e)}):te(t,{statusCode:404,statusMessage:"Could not find root directory for dev console asset"})});function po({devOptions:t}){return R(e=>{y(`UI extensions server received a ${e.method} request to URL ${e.path}`,t.stdout)})}function Rt({devOptions:t,getExtensions:e}){return R(async r=>{let{extensionId:n}=Ae(r),o=e().find(a=>a.devUUID===n);if(!o)return te(r,{statusCode:404,statusMessage:`Extension with id ${n} not found`});if(Ue(r,"accept")?.startsWith("text/html")){if(o.type==="checkout_post_purchase")return to({data:{url:at(o,t)},template:"index",extensionSurface:"post_purchase"});{let a=Zn(o,t);return Qe(r,a,307)}}let i=t.appWatcher.buildOutputPath;return z(r,"content-type","application/json"),{app:{apiKey:t.apiKey},version:t.manifestVersion,root:{url:new URL("/extensions",t.url).toString()},socket:{url:Pe(t.url)},devConsole:{url:new URL("/extensions/dev-console",t.url).toString()},store:t.storeFqdn,extension:await ye(o,i,t)}})}function lo({devOptions:t,getExtensions:e}){return R(async r=>{let{extensionId:n,extensionPointTarget:o=""}=Ae(r),s=e().find(a=>a.devUUID===n);if(!s)return te(r,{statusCode:404,statusMessage:`Extension with id ${n} not found`});if(s.configuration.type!=="checkout_post_purchase"&&!s.hasExtensionPointTarget(o))return te(r,{statusCode:404,statusMessage:`Extension with id ${n} has not configured the "${o}" extension target`});let i=eo(o,s,t);return i?Qe(r,i,307):te(r,{statusCode:404,statusMessage:`Redirect url can't be constructed for extension with id ${n} and extension target "${o}"`})})}import{createServer as Ns}from"http";function co(t){let e=Ve(),r=Ye();e.use(po(t)),e.use(ro),e.use(no),r.use("/extensions/dev-console",io),r.use("/extensions/dev-console/assets/**:assetPath",ao),r.use("/extensions/:extensionId",Rt(t)),r.use("/extensions/:extensionId/",Rt(t)),r.use("/extensions/:extensionId/:extensionPointTarget",lo(t)),r.use("/extensions/:extensionId/assets/**:assetPath",so(t)),r.use("/extensions",_t(t)),r.use("/extensions/",_t(t)),r.use("/",oo),e.use(r);let n=Ns(Je(e));return n.listen(t.devOptions.port,"localhost"),n}async function mo(t){let e={...t,websocketURL:Pe(t.url)},r=e.appWatcher.buildOutputPath,n=new Map,o=await Qn(e,r,n),s=new it(o,e,n),i=e.extensions.filter(u=>u.isPreviewable),a=()=>i;y("Setting up the UI extensions HTTP server...",e.stdout);let l=co({devOptions:e,payloadStore:s,getExtensions:a});y("Setting up the UI extensions Websocket server...",e.stdout);let d=Xn({...e,httpServer:l,payloadStore:s});y("Setting up the UI extensions bundler and file watching...",e.stdout);let p=async({appWasReloaded:u,app:f,extensionEvents:h})=>{u&&(i=f.allExtensions.filter(m=>m.isPreviewable));for(let m of h){if(!m.extension.isPreviewable)continue;let g=m.buildResult?.status==="ok"?"success":"error",w=m.buildResult?.status==="error"?{message:m.buildResult.error,file:m.buildResult.file}:void 0;switch(m.type){case"created":if(e.extensions.push(m.extension),!e.checkoutCartUrl){let x=await et(e.extensions,e.storeFqdn);e.checkoutCartUrl=x}await s.addExtension(m.extension,r);break;case"changed":await s.updateExtension(m.extension,e,r,{status:g,error:w});break;case"deleted":e.extensions=e.extensions.filter(x=>x.devUUID!==m.extension.devUUID),await s.deleteExtension(m.extension);break}}};e.appWatcher.onEvent(p).onStart(p),e.signal.addEventListener("abort",()=>{y("Closing the UI extensions dev server..."),d.close(),l.close()})}function Pe(t){let e=new URL("/extensions",t);return e.protocol="wss:",e.toString()}var qs="3",Bs=async({stderr:t,stdout:e,abortSignal:r},{apiKey:n,storeFqdn:o,storeId:s,subscriptionProductUrl:i,port:a,cartUrl:l,proxyUrl:d,appName:p,appDotEnvFile:u,appId:f,grantedScopes:h,allExtensions:m,appDirectory:g,appWatcher:w})=>{await mo({appName:p,appDotEnvFile:u,appDirectory:g,id:f,extensions:m,stdout:e,stderr:t,signal:r,url:d,port:a,storeFqdn:re(o),storeId:s,apiKey:n,grantedScopes:h,checkoutCartUrl:l,subscriptionProductUrl:i,manifestVersion:qs,appWatcher:w})};async function fo({allExtensions:t,storeFqdn:e,checkoutCartUrl:r,...n}){let o=t.filter(i=>i.isPreviewable),s=await et(o,e,r);return{prefix:"extensions",type:"previewable-extension",function:Bs,options:{pathPrefix:"/extensions",port:-1,storeFqdn:e,allExtensions:t,cartUrl:s,...n}}}c();c();c();async function go(t){let e={},r=await Kr(t);return await Promise.all(r.map(async n=>{let o=ce(t.directory,n),i=de(o)==="assets"?"binary":"utf8",a=await W(n,{encoding:i});e[o]=Buffer.from(a,i).toString("base64")})),{theme_extension:{files:e}}}async function ho({extension:t,developerPlatformClient:e,apiKey:r,registrationId:n,stdout:o,stderr:s,appConfiguration:i,bundlePath:a}){let l,d=t.getOutputPathForDirectory(a);if(t.features.includes("esbuild")){let w=await W(d);if(!w)return;l=Buffer.from(w).toString("base64")}let p;t.isThemeExtension?p=await go(t):p=await t.deployConfig({apiKey:r,appConfiguration:i})??{};let u={...p,serialized_script:l};if(t.isFunctionExtension){let w=await W(t.outputPath,{encoding:"base64"});u.uploaded_files={"dist/index.wasm":w}}let f={apiKey:r,config:JSON.stringify(u),handle:t.handle,context:t.contextValue,registrationId:n},h,m=[];try{h=await e.updateExtension(f)}catch(w){if(m=[{message:"Unknown error"}],w&&typeof w=="object"){let x=w;x.errors?.length?m=x.errors:x.message&&(m=[{message:x.message}])}else typeof w=="string"&&(m=[{message:w}])}let g=h?.extensionUpdateDraft?.userErrors;if(g?.length&&m.push(...g),m.length>0){let w=m.map(x=>x.message).join(", ");s.write(`${t.draftMessages.errorMessage}: ${w}`)}else{let w=t.draftMessages.successMessage;w&&ne(w,o)}}var Hs=async({stderr:t,stdout:e},{developerPlatformClient:r,apiKey:n,remoteExtensionIds:o,localApp:s,appWatcher:i})=>{await Br(s);let a=s.draftableExtensions.map(d=>d.handle),l=async d=>{let u=d.extensionEvents.filter(f=>f.type==="changed").filter(f=>f.buildResult?.status==="ok").filter(f=>a.includes(f.extension.handle)).map(async f=>{let h=f.extension,m=o[h.localIdentifier];if(!m)throw new O(`Extension ${h.localIdentifier} not found on remote app.`);await X({outputPrefix:h.outputPrefix},async()=>{await ho({extension:h,developerPlatformClient:r,apiKey:n,registrationId:m,stdout:e,stderr:t,appConfiguration:s.configuration,bundlePath:i.buildOutputPath})})});await Promise.all(u)};i.onEvent(l).onStart(l)};async function vo({localApp:t,apiKey:e,developerPlatformClient:r,remoteApp:n,...o}){let s=t.draftableExtensions;if(s.length===0)return;let i=un({app:t}),{extensionIds:a,extensions:l}=await dn({app:t,remoteApp:n,appId:e,appName:n.title,force:!0,release:!0,developerPlatformClient:r,envIdentifiers:i,includeDraftExtensions:!0});return t.updateExtensionUUIDS(l),{type:"draftable-extension",prefix:"extensions",function:Hs,options:{localApp:t,apiKey:e,developerPlatformClient:r,...o,extensions:s,remoteExtensionIds:a}}}c();c();function pe(t){let e=t.find(n=>ve(n,"frontend")),r=t.find(n=>ve(n,"backend"));return{frontendConfig:e,backendConfig:r}}c();async function Po(t){let r={topic:"app/uninstalled",api_version:(await an(t.developerPlatformClient,t.organizationId))[1],address:t.address,delivery_method:Un.LOCALHOST,shared_secret:t.sharedSecret},n=await sn(t.developerPlatformClient,r,t.organizationId);t.stdout.write("Sending APP_UNINSTALLED webhook to app server"),await Ce(3);let o=await Gs(t,n);return t.stdout.write(o?"APP_UNINSTALLED webhook delivered":"APP_UNINSTALLED webhook delivery failed"),o}async function Gs(t,e){let r=0;for(;r<3;){try{return await An(t.address,e.samplePayload,JSON.stringify({...JSON.parse(e.headers),"X-Shopify-Shop-Domain":t.storeFqdn}))}catch(n){if(n instanceof rr&&n.code==="ECONNREFUSED")r<3&&(t.stdout.write("App isn't responding yet, retrying in 5 seconds"),await Ce(5));else throw n}r++}return t.stdout.write("App hasn't started in time, giving up"),!1}var zs=async({stdout:t},e)=>{await Po({stdout:t,developerPlatformClient:e.developerPlatformClient,address:`http://localhost:${e.deliveryPort}${e.webhooksPath}`,sharedSecret:e.apiSecret,storeFqdn:e.storeFqdn,organizationId:e.organizationId})};function wo({webs:t,remoteAppUpdated:e,backendPort:r,frontendPort:n,organizationId:o,...s}){let{backendConfig:i,frontendConfig:a}=pe(t),l=t.map(({configuration:p})=>p.webhooks_path).find(p=>p)??"/api/webhooks";if(l&&e&&(a??i))return{type:"send-webhook",prefix:"webhooks",function:zs,options:{deliveryPort:i?r:n,webhooksPath:l,organizationId:o,...s}}}c();c();c();var C=Y(ie(),1),$t=Y(Rr(),1),L=Y($r(),1);var pt=ar().platform==="darwin"?"MAC_COMMAND_KEY":"Ctrl",js=` # Welcome to GraphiQL for the Shopify Admin API! If you've used # GraphiQL before, you can jump to the next tab. # # GraphiQL is an in-browser tool for writing, validating, and # testing GraphQL queries. # # Type queries into this side of the screen, and you will see intelligent # typeaheads aware of the current GraphQL type schema and live syntax and # validation errors highlighted within the text. # # GraphQL queries typically start with a "{" character. Lines that start # with a # are ignored. # # Keyboard shortcuts: # # Prettify query: Shift-${pt}-P (or press the prettify button) # # Merge fragments: Shift-${pt}-M (or press the merge button) # # Run Query: ${pt}-Enter (or press the play button) # # Auto Complete: ${pt}-Space (or just start typing) # `,bo=`query shopInfo { shop { name url myshopifyDomain plan { displayName partnerDevelopment shopifyPlus } } } `.replace(/\n/g,"\\n");function So({apiVersion:t,apiVersions:e,appName:r,appUrl:n,key:o,storeFqdn:s}){return`<!DOCTYPE html> <html lang="en"> <head> <title>GraphiQL</title> <link rel="shortcut icon" href="{{url}}/graphiql/favicon.ico" type="image/x-icon" /> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shopify/polaris@12.10.0/build/esm/styles.css" /> <style> body { height: 100%; margin: 0; width: 100%; overflow: hidden; } .Polaris-Page--fullWidth { width: 100%; } #top-bar { border-bottom: 1px solid var(--p-color-border); } #top-bar #top-error-bar { display: none; } #top-error-bar .Polaris-FullscreenBar__BackAction { /* hide default back button in FullscreenBar component */ display: none; } #top-error-bar button { /* hide X to dismiss banner */ display: none; } #top-bar .top-bar-section { display: inline-flex; align-items: center; gap: 8px; } #top-bar .Polaris-Grid-Cell:nth-child(2) { justify-self: right; } #top-bar #scopes-note { display: inline-flex; align-items: center; height: 100%; } #top-bar .status-badge-option { gap: 8px; display: none; } #top-bar #status-badge-running { display: flex; } #graphiql { height: 100vh; display: flex; flex-direction: column; } #graphiql-explorer { flex-grow: 1; overflow: auto; } #top-bar #outbound-links a { line-height: 0; } #top-bar #outbound-links a:hover .Polaris-Text--root { text-decoration: underline; } #top-bar #outbound-links a span.Polaris-Text--root { max-width: max(12vw, 150px); text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } .with-shrunk-icon .Polaris-Icon { height: 1rem; width: 1rem; margin: 0.125rem; } @media only screen and (max-width: 1550px) { .top-bar-section-title { display: none; } } @media only screen and (max-width: 1150px) { #top-bar #outbound-links a span.Polaris-Text--root { max-width: max(12vw, 140px); } } @media only screen and (max-width: 1080px) { #top-bar .Polaris-Grid-Cell:nth-child(2) { justify-self: left; } } @media only screen and (max-width: 650px) { #top-bar #outbound-links a span.Polaris-Text--root { max-width: 17vw; } } </style> <script src="https://cdn.jsdelivr.net/npm/react@17/umd/react.development.js" integrity="sha512-Vf2xGDzpqUOEIKO+X2rgTLWPY+65++WPwCHkX2nFMu9IcstumPsf/uKKRd5prX3wOu8Q0GBylRpsDB26R6ExOg==" crossorigin="anonymous" ></script> <script src="https://cdn.jsdelivr.net/npm/react-dom@17/umd/react-dom.development.js" integrity="sha512-Wr9OKCTtq1anK0hq5bY3X/AvDI5EflDSAh0mE9gma+4hl+kXdTJPKZ3TwLMBcrgUeoY0s3dq9JjhCQc7vddtFg==" crossorigin="anonymous" ></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/graphiql@3.0.4/graphiql.min.css" /> </head> <body> <div id="graphiql"> ${(0,$t.renderToStaticMarkup)(C.default.createElement(L.AppProvider,{i18n:{}},C.default.createElement("div",{id:"top-bar"},C.default.createElement(L.Box,{background:"bg-surface",padding:"400"},C.default.createElement(L.BlockStack,{gap:"300"},C.default.createElement(L.Grid,{columns:{xs:3,sm:3,md:3}},C.default.createElement(L.Grid.Cell,{columnSpan:{xs:3,sm:3,md:3,lg:7,xl:7}},C.default.createElement(L.InlineStack,{gap:"400"},C.default.createElement("div",{id:"status-badge",className:"top-bar-section"},C.default.createElement("div",{className:"status-badge-option",id:"status-badge-running"},C.default.createElement("span",{className:"top-bar-section-title"},"Status: "),C.default.createElement(L.Badge,{tone:"success",progress:"complete"},"Running")),C.default.createElement("div",{className:"status-badge-option with-shrunk-icon",id:"status-badge-unauthorized"},C.default.createElement("span",{className:"top-bar-section-title"},"Status: "),C.default.createElement(L.Badge,{tone:"attention",icon:Fr},"App uninstalled")),C.default.createElement("div",{className:"status-badge-option with-shrunk-icon",id:"status-badge-disconnected"},C.default.createElement("span",{className:"top-bar-section-title"},"Status: "),C.default.createElement(L.Badge,{tone:"critical",icon:Ct},"Disconnected"))),C.default.createElement("div",{id:"version-select",className:"top-bar-section"},C.default.createElement("span",{className:"top-bar-section-title"},"API version: "),C.default.createElement(L.Select,{label:"API version",labelHidden:!0,options:e,value:t,onChange:()=>{}})),xo({storeFqdn:s,appName:r,appUrl:n}))),C.default.createElement(L.Grid.Cell,{columnSpan:{xs:3,sm:3,md:3,lg:5,xl:5}},C.default.createElement("div",{id:"scopes-note",className:"top-bar-section"},C.default.createElement(L.Text,{as:"span",tone:"subdued"},"GraphiQL runs on the same access scopes you've defined in the TOML file for your app.")))),C.default.createElement("div",{id:"top-error-bar"},C.default.createElement(L.Banner,{tone:"critical",onDismiss:()=>{},icon:Ct},C.default.createElement("p",null,"The server has been stopped. Restart ",C.default.createElement("code",null,"dev")," from the CLI."))))))))} <div id="graphiql-explorer">Loading...</div> </div> <script src="https://cdn.jsdelivr.net/npm/graphiql@3.0.4/graphiql.min.js" type="application/javascript" ></script> <script> const macCommandKey = String.fromCodePoint(8984) const renderGraphiQL = function(apiVersion) { ReactDOM.render( React.createElement(GraphiQL, { fetcher: GraphiQL.createFetcher({ url: '{{url}}/graphiql/graphql.json?key=${encodeURIComponent(o)}&api_version=' + apiVersion, }), defaultEditorToolsVisibility: true, {% if query %} query: {{query}}, {% endif %} {% if variables %} variables: {{variables}}, {% endif %} defaultTabs: [ {query: "${js.replace(/"/g,'\\"').replace(/\n/g,"\\n")}".replace(/MAC_COMMAND_KEY/g, macCommandKey)}, {%for query in defaultQueries%} {query: "{%if query.preface %}{{query.preface}}\\n{% endif %}{{query.query}}", variables: "{{query.variables}}"}, {%endfor%} ], isHeadersEditorEnabled: true, }), document.getElementById('graphiql-explorer'), ) } renderGraphiQL('${t}') // Update the version when the select changes document.getElementById('version-select').addEventListener('change', function(event) { document.querySelector('#version-select .Polaris-Select__SelectedOption').innerText = event.target.value renderGraphiQL(event.target.value) }) // Start out optimistic let serverIsLive = true let appIsInstalled = true const updateBadge = function() { const topErrorBar = document.querySelector('#graphiql #top-error-bar') const statusDiv = document.querySelector('#graphiql #status-badge') const allBadgeDivs = Array.from(statusDiv.querySelectorAll('.status-badge-option')) let activeBadge = 'running' if (!appIsInstalled) activeBadge = 'unauthorized' if (!serverIsLive) activeBadge = 'disconnected' allBadgeDivs.forEach(function(badge) { if (badge.id == ('status-badge-' + activeBadge)) { badge.style.display = 'flex' } else { badge.style.display = 'none' } }) topErrorBar.style.display = serverIsLive ? 'none' : 'block' } const statusInterval = setInterval(updateBadge, 1000) // Warn when the server has been stopped const displayErrorServerStoppedTimeouts = [] const pingInterval = setInterval(function() { displayErrorServerStoppedTimeouts.push(setTimeout(function() { serverIsLive = false }, 3000)) fetch('{{url}}/graphiql/ping') .then(function(response) { if (response.status === 200) { while (displayErrorServerStoppedTimeouts.length > 0) { const timeout = displayErrorServerStoppedTimeouts.pop() clearTimeout(timeout) } serverIsLive = true } else { serverIsLive = false } }) }, 2000) // Verify the current store/app connection setInterval(function() { fetch('{{ url }}/graphiql/status?key=${encodeURIComponent(o)}') .then(async function(response) { const {status, storeFqdn, appName, appUrl} = await response.json() appIsInstalled = status === 'OK' if (storeFqdn) { document.getElementById('outbound-links').innerHTML = \`${(0,$t.renderToStaticMarkup)(C.default.createElement(L.AppProvider,{i18n:{}},xo({storeFqdn:"${storeFqdn}",appName:"${appName}",appUrl:"${appUrl}"})))}\` } }) }, 5000) </script> </body> </html> `}function xo({storeFqdn:t,appName:e,appUrl:r}){return C.default.createElement("div",{id:"outbound-links",className:"top-bar-section with-shrunk-icon"},C.default.createElement("span",{className:"top-bar-section-title"},"Store: "),C.default.createElement(L.Link,{url:`https://${t}/admin`,target:"_blank"},C.default.createElement(L.Badge,{tone:"info",icon:At,children:t})),C.default.createElement("span",{className:"top-bar-section-title"},"App: "),C.default.createElement(L.Link,{url:r,target:"_blank"},C.default.createElement(L.Badge,{tone:"info",icon:At,children:e})))}c();var k=Y(ie(),1),Eo=Y(Rr(),1),H=Y($r(),1),Ks=k.default.createElement("svg",{width:"102",height:"28",viewBox:"0 0 102 28",fill:"none",xmlns:"http://www.w3.org/2000/svg"},k.default.createElement("path",{d:"M21.4028 5.3032C21.3836 5.16414 21.2615 5.08697 21.16 5.07856C21.0594 5.07016 19.0881 5.04036 19.0881 5.04036C19.0881 5.04036 17.4395 3.44802 17.2767 3.28603C17.1138 3.12405 16.7957 3.17295 16.6721 3.20962C16.6705 3.21039 16.3625 3.30513 15.8439 3.46483C15.7571 3.18517 15.6296 2.84134 15.4475 2.49597C14.8606 1.38194 14.0009 0.792838 12.9623 0.79131C12.9608 0.79131 12.96 0.79131 12.9585 0.79131C12.8862 0.79131 12.8148 0.798187 12.7426 0.804299C12.7119 0.767624 12.6811 0.731712 12.6489 0.696564C12.1964 0.215194 11.6164 -0.0193788 10.9211 0.00125134C9.57979 0.0394553 8.24384 1.00296 7.16064 2.7145C6.39856 3.91869 5.81855 5.43157 5.65415 6.6029C4.11386 7.0774 3.0368 7.40901 3.01299 7.41665C2.23554 7.65962 2.21096 7.68331 2.10955 8.41224C2.03427 8.96314 0 24.6084 0 24.6084L17.0477 27.541L24.4365 25.7141C24.4365 25.7141 21.422 5.44226 21.4028 5.3032ZM14.9904 3.72767C14.5979 3.84839 14.1515 3.98593 13.6675 4.13492C13.6575 3.45948 13.5769 2.51966 13.2604 1.70744C14.2783 1.89923 14.7792 3.04458 14.9904 3.72767ZM12.7756 4.40999C11.8822 4.68506 10.9073 4.98534 9.92933 5.28639C10.2044 4.23884 10.726 3.19587 11.3667 2.51202C11.6048 2.25758 11.9382 1.97411 12.3331 1.81212C12.7042 2.58231 12.7848 3.67266 12.7756 4.40999ZM10.948 0.889112C11.263 0.882236 11.528 0.951003 11.7546 1.09923C11.392 1.28643 11.0417 1.55539 10.7129 1.9061C9.86096 2.81536 9.20797 4.22661 8.94754 5.5882C8.13552 5.83806 7.34118 6.08333 6.60983 6.30797C7.07153 4.16472 8.87763 0.94871 10.948 0.889112Z",fill:"#95BF47"}),k.default.createElement("path",{d:"M21.1611 5.07934C21.0605 5.07093 19.0892 5.04114 19.0892 5.04114C19.0892 5.04114 17.4406 3.44879 17.2778 3.28681C17.2171 3.22645 17.1349 3.19512 17.0488 3.18213L17.0496 27.5402L24.4376 25.7141C24.4376 25.7141 21.4231 5.44304 21.4039 5.30398C21.3847 5.16492 21.2618 5.08774 21.1611 5.07934Z",fill:"#5E8E3E"}),k.default.createElement("path",{d:"M12.9528 8.85773L12.0947 12.0508C12.0947 12.0508 11.1375 11.6176 10.0028 11.6886C8.33885 11.7933 8.32118 12.8371 8.33808 13.0991C8.42873 14.5272 12.2061 14.8389 12.4181 18.1841C12.5848 20.8156 11.0146 22.6158 8.75216 22.7579C6.03647 22.9283 4.5415 21.3352 4.5415 21.3352L5.11691 18.9008C5.11691 18.9008 6.62186 20.0301 7.82644 19.9545C8.61311 19.9048 8.89428 19.2683 8.86585 18.8183C8.74755 16.9554 5.67157 17.0655 5.4772 14.0046C5.31357 11.4289 7.01443 8.81876 10.7672 8.58343C12.213 8.49097 12.9528 8.85773 12.9528 8.85773Z",fill:"white"}),k.default.createElement("path",{d:"M34.1664 15.544C33.3168 15.0855 32.8802 14.699 32.8802 14.1677C32.8802 13.4917 33.4867 13.0575 34.4338 13.0575C35.5364 13.0575 36.5208 13.516 36.5208 13.516L37.2973 11.15C37.2973 11.15 36.5833 10.5945 34.4818 10.5945C31.5574 10.5945 29.5306 12.2602 29.5306 14.602C29.5306 15.9297 30.4769 16.9437 31.7395 17.6675C32.759 18.2465 33.1232 18.6572 33.1232 19.2605C33.1232 19.888 32.6135 20.395 31.6671 20.395C30.2567 20.395 28.9248 19.6705 28.9248 19.6705L28.0996 22.0365C28.0996 22.0365 29.3302 22.8572 31.4004 22.8572C34.4102 22.8572 36.5704 21.3847 36.5704 18.7292C36.5696 17.306 35.4777 16.292 34.1664 15.544Z",fill:"black"}),k.default.createElement("path",{d:"M46.1564 10.571C44.6759 10.571 43.5108 11.2712 42.6132 12.333L42.5645 12.3087L43.8507 5.62222H40.5011L37.249 22.6405H40.5986L41.7149 16.8232C42.1515 14.6262 43.2922 13.275 44.3604 13.275C45.1125 13.275 45.4043 13.782 45.4043 14.5065C45.4043 14.965 45.3555 15.5205 45.2588 15.979L43.997 22.6412H47.3466L48.6571 15.7615C48.8027 15.037 48.9002 14.1685 48.9002 13.5887C48.8987 11.7055 47.9036 10.571 46.1564 10.571Z",fill:"black"}),k.default.createElement("path",{d:"M56.4709 10.571C52.4416 10.571 49.7725 14.192 49.7725 18.223C49.7725 20.8058 51.3741 22.8815 54.3839 22.8815C58.34 22.8815 61.0099 19.3575 61.0099 15.2295C61.0099 12.84 59.6018 10.571 56.4709 10.571ZM54.8205 20.3238C53.6798 20.3238 53.1944 19.3583 53.1944 18.151C53.1944 16.2443 54.1896 13.1303 56.0099 13.1303C57.1993 13.1303 57.5872 14.1443 57.5872 15.134C57.5872 17.1855 56.5928 20.3238 54.8205 20.3238Z",fill:"black"}),k.default.createElement("path",{d:"M69.5778 10.571C67.3171 10.571 66.0339 12.5505 66.0339 12.5505H65.9859L66.1802 10.7643H63.2192C63.0737 11.9715 62.8062 13.8055 62.5396 15.1818L60.2095 27.3718H63.5591L64.481 22.4473H64.5542C64.5542 22.4473 65.2415 22.8815 66.5201 22.8815C70.4518 22.8815 73.0242 18.8748 73.0242 14.8187C73.0242 12.5748 72.029 10.571 69.5778 10.571ZM66.3738 20.3715C65.5044 20.3715 64.99 19.8888 64.99 19.8888L65.5485 16.7748C65.9371 14.699 67.029 13.3228 68.1941 13.3228C69.2136 13.3228 69.529 14.264 69.529 15.1575C69.529 17.306 68.2428 20.3715 66.3738 20.3715Z",fill:"black"}),k.default.createElement("path",{d:"M77.8058 5.79121C76.7383 5.79121 75.8887 6.63622 75.8887 7.72221C75.8887 8.71197 76.5196 9.38797 77.4659 9.38797H77.5147C78.5586 9.38797 79.4562 8.68771 79.4806 7.45697C79.4806 6.49147 78.8253 5.79121 77.8058 5.79121Z",fill:"black"}),k.default.createElement("path",{d:"M73.1216 22.6405H76.4704L78.7525 10.837H75.3785L73.1216 22.6405Z",fill:"black"}),k.default.createElement("path",{d:"M87.2711 10.8127H84.9411L85.0622 10.2572C85.2565 9.12274 85.9362 8.10874 87.0525 8.10874C87.6483 8.10874 88.12 8.27774 88.12 8.27774L88.7753 5.67074C88.7753 5.67074 88.1931 5.38124 86.9549 5.38124C85.7655 5.38124 84.5768 5.71924 83.6785 6.49149C82.5378 7.45699 82.0037 8.85674 81.737 10.2572L81.6402 10.8127H80.0866L79.6012 13.3235H81.1549L79.3833 22.6413H82.7329L84.5045 13.3235H86.8102L87.2711 10.8127Z",fill:"black"}),k.default.createElement("path",{d:"M95.3288 10.837C95.3288 10.837 93.2349 16.0836 92.2947 18.9475H92.2459C92.1819 18.0252 91.4207 10.837 91.4207 10.837H87.9012L89.9166 21.675C89.9653 21.916 89.9409 22.0615 89.8434 22.2305C89.4548 22.9785 88.7995 23.703 88.0231 24.2343C87.3922 24.6928 86.6881 24.9823 86.1304 25.1755L87.0523 28C87.732 27.8553 89.1394 27.2998 90.3288 26.1895C91.858 24.7655 93.2654 22.5685 94.7215 19.575L98.8231 10.8362H95.3288V10.837Z",fill:"black"})),Qs=(0,Eo.renderToStaticMarkup)(k.default.createElement(H.AppProvider,{i18n:{}},k.default.createElement(H.Page,{narrowWidth:!0},k.default.createElement("div",{className:"card-wrapper"},k.default.createElement(H.Card,{padding:"600"},k.default.createElement(H.BlockStack,{gap:"500"},Ks,k.default.createElement("div",{id:"pre-install"},k.default.createElement(H.BlockStack,{gap:"200"},k.default.createElement(H.Text,{variant:"headingMd",as:"h2"},"Install your app to access GraphiQL"),k.default.createElement("p",null,"The GraphiQL Explorer relies on your app being installed on your dev store to access its data."),k.default.createElement("p",{id:"card-cta"},k.default.createElement(H.Button,{id:"app-install-button"},"Install your app")))),k.default.createElement("div",{id:"post-install"},k.default.createElement(H.BlockStack,{gap:"200"},k.default.createElement(H.Text,{variant:"headingMd",as:"h2"},"Loading GraphiQL..."),k.default.createElement("p",null,"If you're not redirected automatically, ",k.default.createElement(H.Link,{url:"{{url}}/graphiql"},"click here"),"."))))))))),Co=` <!DOCTYPE html> <html> <head> <title>GraphiQL Explorer - App Not Installed</title> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shopify/polaris@12.10.0/build/esm/styles.css" /> <style> .vertical-center { display: flex; flex-direction: row; align-items: center; height: 100%; } .card-wrapper { max-width: 480px; margin-left: 20px; margin-right: 20px; } #post-install { display: none; } </style> <script type="text/javascript">