import{b as we}from"./chunk-6XLVKD6Q.js";import{a as he,c as ye}from"./chunk-VSZS3FAJ.js";import{b as ue}from"./chunk-3GMW7IEC.js";import{a as Fe}from"./chunk-6ZRHK4ON.js";import{Ca as Re,Fa as Le,G as ve,L as Pe,O as Ae,Q as ke,ca as Ce,ea as xe,h as ge}from"./chunk-UZ7U322K.js";import{$ as G,da as Ie,o as be}from"./chunk-IRH6IGFT.js";import{B as re,D as ie,E as ne,f as R,g as te,i as ae,p as oe}from"./chunk-VRRDIXFQ.js";import{a as U}from"./chunk-J3KRY2SD.js";import{b as de}from"./chunk-Q6LCSRIW.js";import{b as X}from"./chunk-4TC4M4RC.js";import{D as me,f as se,u as le,v as ce,z as S}from"./chunk-E24W34C4.js";import{d as pe}from"./chunk-3QVXHF6I.js";import{d as f}from"./chunk-ELIH6GCC.js";import{$ as O,$a as Q,Ab as ee,Ca as I,Fb as h,Gb as L,Hb as g,Ja as B,Oa as W,Ta as C,Ua as x,Va as q,Wa as Z,ka as V,ma as Y,sa as _,ua as $,wa as K,zb as J}from"./chunk-EYDNSYYE.js";import{e as fe}from"./chunk-JCNRQYRP.js";import{d as p,e as k,f as z,p as D,q as H}from"./chunk-773TIA5M.js";import{r as De}from"./chunk-T6CC5WUU.js";import{e as ze,g as c}from"./chunk-VKWPEFWQ.js";c();c();var b={reactRouter:{url:"https://github.com/Shopify/shopify-app-template-react-router",label:"Build a React Router app (recommended)",visible:!0,branches:{prompt:"For your React Router template, which language do you want?",options:{javascript:{branch:"javascript-cli",label:"JavaScript"},typescript:{branch:"main-cli",label:"TypeScript"}}}},remix:{url:"https://github.com/Shopify/shopify-app-template-remix",label:"Build a Remix app",visible:!1,branches:{prompt:"For your Remix template, which language do you want?",options:{javascript:{branch:"javascript",label:"JavaScript"},typescript:{branch:"main",label:"TypeScript"}}}},none:{url:"https://github.com/Shopify/shopify-app-template-extension-only",label:"Build an extension-only app",visible:!0},node:{url:"https://github.com/Shopify/shopify-app-template-node",visible:!1},ruby:{url:"https://github.com/Shopify/shopify-app-template-ruby",visible:!1}},E=Object.keys(b),F=E.filter(e=>b[e].visible),He=["reactRouter","none"],Oe=async e=>{let t=e.template,a=e.flavor,r={template:b.reactRouter.url};t??(t=await S({choices:He.map(i=>({label:b[i].label||i,value:i})),message:"Get started building your app:",defaultValue:E.find(i=>b[i].url===r.template)}));let o={...e,template:t,templateType:T(t)?t:"custom",globalCLIResult:{install:!1,alreadyInstalled:!1}},n,s;if(o.templateType!=="custom"){let i=b[o.templateType];n=i.url,i.branches&&(a?s=i.branches.options[a]?.branch:s=await S({message:i.branches.prompt||"Choose a flavor:",choices:Object.entries(i.branches.options).map(([d,m])=>({value:m.branch,label:m.label}))}))}return s&&(n=`${n}#${s}`),o.template=n||o.template||r.template,o.globalCLIResult=await ee(),o},Te=Oe;function T(e){return E.includes(e)}c();c();import{platform as Ve}from"os";async function _e({packageJSON:e,local:t,useGlobalCLI:a}){if(e.dependencies=e.dependencies??{},a?delete e.dependencies["@shopify/cli"]:e.dependencies["@shopify/cli"]=U,delete e.dependencies["@shopify/app"],t){let r=await Ye("cli");e.dependencies["@shopify/cli"]=r;let o={"@shopify/cli":r};e.overrides=e.overrides?{...e.overrides,...o}:o,e.resolutions=e.resolutions?{...e.resolutions,...o}:o}return e}async function Ye(e){return`file:${await Q(`packages/${e}`,{type:"directory",cwd:D(import.meta.url)})}`}async function $e({from:e,packageManager:t}){let a=Ve()==="win32"&&t==="yarn"?["--network-concurrency","1"]:[];return oe({directory:k(e),packageManager:t,args:a})}c();async function j(e,t){let r=(await Z([p(e,"**",".git"),p(e,"**",".github"),p(e,"**",".gitmodules"),p(e,"**",".cli-liquid-bypass"),p(e,"LICENSE*"),p(e,"**","frontend/LICENSE*"),p(e,"package.json.cli2")],{dot:!0,onlyFiles:!1,onlyDirectories:!1,ignore:["**/node_modules/**"]})).map(s=>I(s,{force:!0})),o=new Set(te[t]),n=R.filter(s=>!o.has(s)).map(s=>{let i=p(e,s);if(x(i))return B(i)});return Promise.all([...r,...n])}async function Ke(e){let t=e.packageManager,a=O(e.name),r=p(e.directory,a),o=we(e.template);await Se(r,a),await Be(r),le({body:["Initializing project with",{command:t},`
Use the`,{command:"--package-manager"},"flag to select a different package manager."]}),await V(async i=>{let d=p(i,"download"),m=o.filePath?p(d,o.filePath):d,u=p(i,"app"),A=o.branch?`${o.baseURL}#${o.branch}`:o.baseURL;await K(d);let w=[{title:`Downloading template from ${A}`,task:async()=>{await ye({repoUrl:A,destination:d,shallow:!0})}}];w.push({title:"Parsing liquid",task:async()=>{await ue(m,u,{dependency_manager:t,app_name:e.name})}},{title:"Updating package.json",task:async()=>{let l=(await re(u)).content;l.name=a,l.author=await se()??"",l.private=!0;let v=["extensions/*"].concat(We(u));switch(t){case"npm":case"yarn":case"bun":l.workspaces=v;break;case"pnpm":{await qe(u,v),await _(p(u,".npmrc"),`auto-install-peers=true
`);break}case"homebrew":case"unknown":throw new ae}await _e({packageJSON:l,local:e.local,directory:u,useGlobalCLI:e.useGlobalCLI}),await ie(u,l)}}),e.postCloneActions.removeLockfilesFromGitignore&&w.push({title:"Removing lockfiles from .gitignore",task:async()=>{let l=p(u,".gitignore");if(await C(l)){let v=await Y(l);R.forEach(Me=>{let Ue=new RegExp(`^${Me.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}$`,"gm");v=v.replace(Ue,"")}),await $(l,v.trim())}}}),await fe()&&w.push({title:"[Shopifolks-only] Configuring the project's NPM registry",task:async()=>{let l=p(u,".npmrc");await _(l,`@shopify:registry=https://registry.npmjs.org
`)}});let M=!1;w.push({title:"Preparing project directory",task:async()=>{await Se(r,a),M=!0,await W(u,r)}}),w.push({title:`Installing dependencies with ${t}`,task:async()=>{await $e({from:r,packageManager:t})}},{title:"Cleaning up",task:async()=>{await j(r,t)}},{title:"Initializing a Git repository...",task:async()=>{await he(r)}});try{await me(w)}catch(l){throw M&&await I(r).catch(()=>{}),l}});let n;if(e.selectedAppOrNameResult.result==="new"){let i=await ve(r,e.name),d=e.selectedAppOrNameResult.org;n=await e.developerPlatformClient.createApp(d,i)}else n=e.selectedAppOrNameResult.app;await Re({directory:r,apiKey:n.apiKey,appId:n.id,organizationId:n.organizationId,configName:"shopify.app.toml",developerPlatformClient:e.developerPlatformClient,isNewApp:!0},!1);let s=await Le({directory:r,clientId:void 0,forceRelink:!1,userProvidedConfigName:void 0});return ce({headline:[{userInput:a},"is ready for you to build!"],nextSteps:[["Run",{command:`cd ${a}`}],["For extensions, run",{command:L(t,"shopify app generate extension")}],["To see your app, run",{command:L(t,"shopify app dev")}]],reference:[{link:{label:"Shopify docs",url:"https://shopify.dev"}},[{link:{label:"Shopify Dev MCP,",url:"https://shopify.dev/docs/apps/build/devmcp"}},"connect your AI assistant to development resources"],["For an overview of commands, run",{command:L(t,"shopify app","--help")}]]}),{app:s.app}}async function Se(e,t){if(await C(e))throw new f(`
A directory with this name (${t}) already exists.
Choose a new name for your app.`)}async function Be(e){let t=new X({projectName:"shopify-cli-app"}),a=k(e);t.delete(a)}function We(e){return["web","web/frontend"].filter(t=>x(p(e,t)))}async function qe(e,t){let a=p(e,"pnpm-workspace.yaml");if(await C(a))return;let r=t.map(o=>` - '${o}'`).join(`
`);await $(a,`packages:
${r}`)}var Ge=Ke;c();c();function N(e){try{return new URL(e)}catch{return}}function Ze(e){if(!e)return;let t=e.toLowerCase();for(let r of[t,`https://${t}`]){let o=N(r)?.hostname;if(o)return o}let a=t.replace(/^https?:\/\//,"").split("/")[0];if(a)return a}function Et(e){let t=Ze(e);if(!t)return;let a=t.match(/^([^.]+)\.myshopify\.com$/);return a?a[1]:void 0}function Ee(e){if(!e)return;let t=N(e);if(t&&t.origin!=="https://github.com")throw new f("Only GitHub repository references are supported, e.g., https://github.com/Shopify/<repository>/[subpath]#[branch]");if(!t&&!T(e))throw new f(g`Only ${F.map(a=>g`${h.yellow(a)}`.value).join(", ")} template aliases are supported, please provide a valid URL`)}function je(e,t){if(!e){if(t)throw new f(g`The ${h.yellow("--flavor")} flag requires the ${h.yellow("--template")} flag to be set`);return}if(!t)return;if(!T(e))throw new f(g`The ${h.yellow("--flavor")} flag is not supported for custom templates`);let a=b[e];if(!a.branches)throw new f(g`The ${h.yellow(e)} template does not support flavors`);if(!a.branches.options[t])throw new f(g`Invalid option for ${h.yellow("--flavor")}\nThe ${h.yellow("--flavor")} flag for ${h.yellow(e)} accepts only ${Object.keys(a.branches.options).map(r=>g`${h.yellow(r)}`.value).join(", ")}`)}var y=ze(De(),1);var Ne,P=class extends Fe{async run(){let{flags:t}=await this.parse(Ne);if(Ee(t.template),je(t.template,t.flavor),t.name!==void 0&&t.name.trim()==="")throw new f("The --name flag can't be empty","Provide a valid app name, for example: --name my-app");let a=ne(t["package-manager"]),r=t.name??await Qe(t.path),o=G();await o.session();let n=await Te({template:t.template,flavor:t.flavor}),s,i;if(t["client-id"]){let m=await Ce({apiKey:t["client-id"]});i=m.title,o=m.developerPlatformClient??o,s={result:"existing",app:m}}else{let m;t["organization-id"]?m=await Ie(t["organization-id"],o):m=await xe(),o=G({organization:m});let{organization:u,apps:A,hasMorePages:w}=await o.orgAndApps(m.id);s=await Xe(t.name!==void 0,r,A,w,u,o),i=s.result==="new"?s.name:s.app.title}n.globalCLIResult.install&&await J(a),await pe(()=>({cmd_create_app_template:n.templateType,cmd_create_app_template_url:n.template}));let{app:d}=await Ge({name:i,selectedAppOrNameResult:s,packageManager:a,template:n.template,local:t.local,directory:t.path,useGlobalCLI:n.globalCLIResult.alreadyInstalled||n.globalCLIResult.install,developerPlatformClient:o,postCloneActions:{removeLockfilesFromGitignore:n.templateType!=="custom"}});return{app:d}}};Ne=P;P.summary="Create a new app project";P.flags={...de,name:y.Flags.string({char:"n",env:"SHOPIFY_FLAG_NAME",hidden:!1,description:"The name for the new app. When provided, skips the app selection prompt and creates a new app with this name."}),path:y.Flags.string({char:"p",env:"SHOPIFY_FLAG_PATH",parse:async e=>z(e),default:async()=>H(),hidden:!1}),template:y.Flags.string({description:`The app template. Accepts one of the following:
       - <${F.join("|")}>
       - Any GitHub repo with optional branch and subpath, e.g., https://github.com/Shopify/<repository>/[subpath]#[branch]`,env:"SHOPIFY_FLAG_TEMPLATE"}),flavor:y.Flags.string({description:"Which flavor of the given template to use.",env:"SHOPIFY_FLAG_TEMPLATE_FLAVOR"}),"package-manager":y.Flags.string({char:"d",env:"SHOPIFY_FLAG_PACKAGE_MANAGER",hidden:!1,options:["npm","yarn","pnpm","bun"]}),local:y.Flags.boolean({char:"l",env:"SHOPIFY_FLAG_LOCAL",default:!1,hidden:!0}),"client-id":y.Flags.string({hidden:!1,description:"The Client ID of your app. Use this to automatically link your new project to an existing app. Using this flag avoids the app selection prompt.",env:"SHOPIFY_FLAG_CLIENT_ID",exclusive:["config"]}),"organization-id":y.Flags.string({hidden:!1,description:"The organization ID. Your organization ID can be found in your Dev Dashboard URL: https://dev.shopify.com/dashboard/<organization-id>",env:"SHOPIFY_FLAG_ORGANIZATION_ID",exclusive:["client-id"]})};var sa=P;async function Qe(e){for(let t=0;t<3;t++){let a=await q({suffix:"app",directory:e});if(be(a))return a}return""}async function Xe(e,t,a,r,o,n){let s=a.length===0||e;if(s||(s=await ke()),s)return{result:"new",name:e?t:await Ae(t),org:o};{let i=await Pe(ge(n,o.id),a,r);if(!i)throw new f("Unable to select an app: the selection prompt was interrupted.");let d=await n.appFromIdentifiers(i.apiKey);if(!d)throw new f(`App with id ${i.id} not found`);return{result:"existing",app:d}}}export{Ze as a,Et as b,sa as c};
