create-instant-app 0.22.108-experimental.drewh-use-clone.21267754740.1 → 0.22.108-experimental.drewh-use-clone.21267978145.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +6 -6
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -7,13 +7,13 @@ import{Command as Ie,Option as l}from"commander";import*as F from"@clack/prompts
7
7
  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 |_|_| |_|___/\\__\\__,_|_| |_|\\__|`,Y=()=>{Pe(`
8
8
  `+ve.split(`
9
9
  `).map(e=>`${J.gray("\u2502")}${J.hex("#EA580D").bold(" "+e)}`).join(`
10
- `))};import f from"path";import g from"fs-extra";import Ne from"degit";import k from"chalk";var x=()=>{let e=process.env.npm_config_user_agent;return e?e.startsWith("yarn")?"yarn":e.startsWith("pnpm")?"pnpm":e.startsWith("bun")?"bun":"npm":"npm"};import{renderUnwrap as Se,UI as h}from"instant-cli/ui";import Ce from"slugify";import je from"ignore";var K=async(e,t)=>{let n=f.resolve(process.cwd(),t);if(g.existsSync(n))if(g.readdirSync(n).length===0)h.log(`${k.cyan.bold(e.appName)} exists but is empty, continuing...`,h.ciaModifier(null));else{let i=await Se(new h.Select({promptText:k.redBright(`${k.bold("Warning:")} ${k.bold(e.appName)} already exists and isn't empty. How would you like to proceed?`),options:[{label:"Abort installation",value:"abort"},{label:"Clear the directory and continue installation",value:"clear"}],defaultValue:"abort",modifyOutput:h.ciaModifier()}));i==="abort"&&(h.log("Aborting installation..."),process.exit(1)),i==="clear"&&g.emptyDirSync(n)}if(await Me({projectDir:n,baseTemplateName:e.base}),g.pathExistsSync(f.join(n,"pnpm-lock.yaml"))&&g.removeSync(f.join(n,"pnpm-lock.yaml")),g.pathExistsSync(f.join(n,".env.example"))&&g.copyFileSync(f.join(n,".env.example"),f.join(n,".env")),x()==="pnpm"&&e.base==="expo"&&g.appendFile(f.join(n,".npmrc"),`node-linker=hoisted
11
- enable-pre-post-scripts=true`),e.base==="expo"){let i=Ce.default(t);R(f.join(n,"app.json"),'"name": "expo-template"',`"name": "${t}"`),R(f.join(n,"app.json"),'"slug": "expo-template"',`"slug": "${i}"`),R(f.join(n,"app/_layout.tsx"),'"My Instant App"',`"${t}"`)}let o=e.appName==="."?"App":k.hex("#EA570B").bold(e.appName);return h.log(k.dim(`${o} scaffolded successfully!`),h.ciaModifier(null)),n},R=(e,t,n)=>{let i=g.readFileSync(e,"utf8").replaceAll(t,n);g.writeFileSync(e,i)},Ee=async({projectDir:e,baseTemplateName:t})=>{let n=`instantdb/instant/examples/${t}`;await Ne(n).clone(e)};async function Oe(e,t){let n=f.join(e,".gitignore"),o=je();o.add(".git");try{let i=await g.readFile(n,"utf8");o.add(i)}catch{}await g.copy(e,t,{filter:i=>{let a=f.relative(e,i);return a===""?!0:!o.ignores(a)}})}var Me=async({projectDir:e,baseTemplateName:t})=>{if(process.env.INSTANT_CLI_DEV&&process.env.INSTANT_REPO_FOLDER){let n=f.join(process.env.INSTANT_REPO_FOLDER,"examples",t);await Oe(n,e);return}process.env.INSTANT_CLI_DEV&&h.log(k.bold.yellowBright(`WARNING: INSTANT_CLI_DEV is TRUE but no INSTANT_REPO_FOLDER is set.
12
- Using git to clone from main...`),h.ciaModifier(null)),await Ee({projectDir:e,baseTemplateName:t})};import{execa as $e}from"execa";import{renderUnwrap as Fe,UI as j}from"instant-cli/ui";var X=async(e,t)=>{let n=$e(e,["install"],{cwd:t}),o=await Fe(new j.Spinner({promise:n,workingText:`Installing dependencies with ${e}...`,doneText:"Successfully installed dependencies!",modifyOutput:j.ciaModifier(null)}));o.exitCode!==0&&(j.log(o.stderr,j.ciaModifier(null)),process.exit(1))};import gt from"chalk";import y from"fs-extra";import c from"path";import q from"path";import{fileURLToPath as Re}from"url";var Ge=Re(import.meta.url),De=q.dirname(Ge),b=q.join(De,"../");var Z=({projectDir:e,ruleFilesToAdd:t})=>{if(t!==null)switch(t){case"cursor":y.ensureDirSync(c.join(e,".cursor/rules")),y.copyFileSync(c.join(b,"template/rules/cursor-rules.md"),c.join(e,".cursor/rules/instant.mdc"));break;case"claude":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"CLAUDE.md"));break;case"codex":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"gemini":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"GEMINI.md"));break;case"zed":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"windsurf":y.ensureDirSync(c.join(e,".windsurf/rules")),y.copyFileSync(c.join(b,"template/rules/windsurf-rules.md"),c.join(e,".windsurf/rules/instant.md"));break}};import{execSync as D}from"child_process";import G from"path";import*as te from"@clack/prompts";import Q from"chalk";import{execa as P}from"execa";import ne from"fs-extra";import{renderUnwrap as ee,UI as A}from"instant-cli/ui";var Be=e=>{try{return D("git --version",{cwd:e}),!0}catch{return!1}},Ue=e=>ne.existsSync(G.join(e,".git")),We=async e=>{try{return await P("git",["rev-parse","--is-inside-work-tree"],{cwd:e,stdout:"ignore"}),!0}catch{return!1}},Le=()=>{let t=D("git --version").toString().trim().split(" ")[2],n=t?.split(".")[0],o=t?.split(".")[1];return{major:Number(n),minor:Number(o)}},Ve=()=>D("git config --global init.defaultBranch || echo main").toString().trim(),oe=async e=>{if(!Be(e)){te.log.warn("Git is not installed. Skipping Git initialization.");return}let t=Ue(e),n=await We(e),o=G.parse(e).name;if(n&&t){if(!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} Git is already initialized in "${o}". Initializing a new git repository would delete the previous history. Would you like to continue anyways?`,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;ne.removeSync(G.join(e,".git"))}else if(n&&!t&&!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} "${o}" is already in a git worktree.
10
+ `))};import f from"path";import g from"fs-extra";import Ne from"degit";import k from"chalk";var x=()=>{let e=process.env.npm_config_user_agent;return e?e.startsWith("yarn")?"yarn":e.startsWith("pnpm")?"pnpm":e.startsWith("bun")?"bun":"npm":"npm"};import{renderUnwrap as Se,UI as h}from"instant-cli/ui";import Ce from"slugify";import Oe from"ignore";var K=async(e,t)=>{let n=f.resolve(process.cwd(),t);if(g.existsSync(n))if(g.readdirSync(n).length===0)h.log(`${k.cyan.bold(e.appName)} exists but is empty, continuing...`,h.ciaModifier(null));else{let i=await Se(new h.Select({promptText:k.redBright(`${k.bold("Warning:")} ${k.bold(e.appName)} already exists and isn't empty. How would you like to proceed?`),options:[{label:"Abort installation",value:"abort"},{label:"Clear the directory and continue installation",value:"clear"}],defaultValue:"abort",modifyOutput:h.ciaModifier()}));i==="abort"&&(h.log("Aborting installation..."),process.exit(1)),i==="clear"&&g.emptyDirSync(n)}if(await Me({projectDir:n,baseTemplateName:e.base}),g.pathExistsSync(f.join(n,"pnpm-lock.yaml"))&&g.removeSync(f.join(n,"pnpm-lock.yaml")),x()==="pnpm"&&e.base==="expo"&&g.appendFile(f.join(n,".npmrc"),`node-linker=hoisted
11
+ enable-pre-post-scripts=true`),e.base==="expo"){let i=Ce.default(t);R(f.join(n,"app.json"),'"name": "expo-template"',`"name": "${t}"`),R(f.join(n,"app.json"),'"slug": "expo-template"',`"slug": "${i}"`),R(f.join(n,"app/_layout.tsx"),'"My Instant App"',`"${t}"`)}let o=e.appName==="."?"App":k.hex("#EA570B").bold(e.appName);return h.log(k.dim(`${o} scaffolded successfully!`),h.ciaModifier(null)),n},R=(e,t,n)=>{let i=g.readFileSync(e,"utf8").replaceAll(t,n);g.writeFileSync(e,i)},je=async({projectDir:e,baseTemplateName:t})=>{let n=`instantdb/instant/examples/${t}`;await Ne(n).clone(e)};async function Ee(e,t){let n=f.join(e,".gitignore"),o=Oe();o.add(".git");try{let i=await g.readFile(n,"utf8");o.add(i)}catch{}await g.copy(e,t,{filter:i=>{let a=f.relative(e,i);return a===""?!0:!o.ignores(a)}})}var Me=async({projectDir:e,baseTemplateName:t})=>{if(process.env.INSTANT_CLI_DEV&&process.env.INSTANT_REPO_FOLDER){let n=f.join(process.env.INSTANT_REPO_FOLDER,"examples",t);await Ee(n,e);return}process.env.INSTANT_CLI_DEV&&h.log(k.bold.yellowBright(`WARNING: INSTANT_CLI_DEV is TRUE but no INSTANT_REPO_FOLDER is set.
12
+ Using git to clone from main...`),h.ciaModifier(null)),await je({projectDir:e,baseTemplateName:t})};import{execa as $e}from"execa";import{renderUnwrap as Fe,UI as O}from"instant-cli/ui";var X=async(e,t)=>{let n=$e(e,["install"],{cwd:t}),o=await Fe(new O.Spinner({promise:n,workingText:`Installing dependencies with ${e}...`,doneText:"Successfully installed dependencies!",modifyOutput:O.ciaModifier(null)}));o.exitCode!==0&&(O.log(o.stderr,O.ciaModifier(null)),process.exit(1))};import gt from"chalk";import y from"fs-extra";import c from"path";import q from"path";import{fileURLToPath as Re}from"url";var Ge=Re(import.meta.url),De=q.dirname(Ge),b=q.join(De,"../");var Z=({projectDir:e,ruleFilesToAdd:t})=>{if(t!==null)switch(t){case"cursor":y.ensureDirSync(c.join(e,".cursor/rules")),y.copyFileSync(c.join(b,"template/rules/cursor-rules.md"),c.join(e,".cursor/rules/instant.mdc"));break;case"claude":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"CLAUDE.md"));break;case"codex":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"gemini":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"GEMINI.md"));break;case"zed":y.copyFileSync(c.join(b,"template/rules/AGENTS.md"),c.join(e,"AGENTS.md"));break;case"windsurf":y.ensureDirSync(c.join(e,".windsurf/rules")),y.copyFileSync(c.join(b,"template/rules/windsurf-rules.md"),c.join(e,".windsurf/rules/instant.md"));break}};import{execSync as D}from"child_process";import G from"path";import*as te from"@clack/prompts";import Q from"chalk";import{execa as P}from"execa";import ne from"fs-extra";import{renderUnwrap as ee,UI as A}from"instant-cli/ui";var Be=e=>{try{return D("git --version",{cwd:e}),!0}catch{return!1}},Ue=e=>ne.existsSync(G.join(e,".git")),We=async e=>{try{return await P("git",["rev-parse","--is-inside-work-tree"],{cwd:e,stdout:"ignore"}),!0}catch{return!1}},Le=()=>{let t=D("git --version").toString().trim().split(" ")[2],n=t?.split(".")[0],o=t?.split(".")[1];return{major:Number(n),minor:Number(o)}},Ve=()=>D("git config --global init.defaultBranch || echo main").toString().trim(),oe=async e=>{if(!Be(e)){te.log.warn("Git is not installed. Skipping Git initialization.");return}let t=Ue(e),n=await We(e),o=G.parse(e).name;if(n&&t){if(!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} Git is already initialized in "${o}". Initializing a new git repository would delete the previous history. Would you like to continue anyways?`,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;ne.removeSync(G.join(e,".git"))}else if(n&&!t&&!await ee(new A.Confirmation({promptText:`${Q.redBright.bold("Warning:")} "${o}" is already in a git worktree.
13
13
  Would you still like to initialize a new git repository in this directory?
14
- `,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;try{let i=Ve(),{major:a,minor:r}=Le();a<2||a==2&&r<28?(await P("git",["init"],{cwd:e}),await P("git",["symbolic-ref","HEAD",`refs/heads/${i}`],{cwd:e})):await P("git",["init",`--initial-branch=${i}`],{cwd:e}),await P("git",["add","."],{cwd:e}),await P("git",["commit","-m","Initial commit (create-instant-app)"],{cwd:e}),A.log("Git repository initialized successfully.",A.ciaModifier(null))}catch{}};import He from"env-paths";import*as Je from"@clack/prompts";import{mkdir as Ye,readFile as Ke,writeFile as Xe}from"node:fs/promises";import qe from"open";import{join as Ze}from"node:path";import{randomUUID as ae}from"node:crypto";import{version as ze}from"@instantdb/version";var re=!!process.env.INSTANT_CLI_DEV,ie=re?"http://localhost:3000":"https://instantdb.com",B=process.env.INSTANT_CLI_API_URI||(re?"http://localhost:8888":"https://api.instantdb.com");async function T({path:e,body:t,method:n="GET",authToken:o,metadata:i}){let r={"Content-Type":"application/json","X-Instant-Source":"create-instant-app","X-Instant-Version":ze,"X-Instant-Command":"create"};o&&(r.Authorization=`Bearer ${o}`),i&&(r["X-Instant-Metadata"]=JSON.stringify(i));let p=await fetch(`${B}${e}`,{method:n??"GET",headers:r,body:t?JSON.stringify(t):void 0,signal:AbortSignal.timeout(3e5)}),s;try{s=await p.json()}catch{s=null}if(!p.ok){let u=s.message||s.hint?.errors?.[0]?.message||"There was an error";throw new Error(u)}return s}import{renderUnwrap as E,UI as d}from"instant-cli/ui";var Qe=!!process.env.INSTANT_CLI_DEV,et=!!process.env.INSTANT_CLI_FORCE_EPHEMERAL;function pe(){let e=`instantdb-${Qe?"dev":"prod"}`,{config:t}=He(e);return{authConfigFilePath:Ze(t,"a"),appConfigDirPath:t}}var tt=async(e,t,n,o)=>{let i=ae(),a=ae();return await T({method:"POST",authToken:t,path:"/dash/apps",body:{id:i,title:e,admin_token:a,org_id:n},metadata:o}),{appID:i,adminToken:a,source:"created"}},U=(e,t,n)=>{T({method:"POST",path:`/dash/apps/${e}/track-import`,authToken:t,metadata:n}).catch(()=>{})},le=async e=>await T({method:"GET",path:"/dash",authToken:e}),ce=async(e,t)=>await T({method:"GET",path:`/dash/orgs/${t}`,authToken:e});var nt=async(e,t)=>{try{let n=await le(e),o=n.apps.find(i=>i.id===t);if(o)return{appId:o.id,adminToken:o.admin_token};for(let i of n.orgs){let{apps:a}=await ce(e,i.id),r=a.find(p=>p.id===t);if(r)return{appId:r.id,adminToken:r.admin_token}}return null}catch{return null}},ot=async(e,t)=>{try{return await T({method:"GET",path:`/dash/apps/${e}/schema/pull`,authToken:t}),!0}catch{return!1}},rt=async()=>et?null:process.env.INSTANT_CLI_AUTH_TOKEN?process.env.INSTANT_CLI_AUTH_TOKEN:await Ke(pe().authConfigFilePath,"utf-8").catch(()=>null),se=async(e,t)=>{let n=await T({authToken:null,method:"POST",path:"/dash/apps/ephemeral",body:{title:e,rules:{$users:{view:"true"},$files:{allow:{view:"true",create:"true",delete:"true"}}}},metadata:t});return{appId:n.app.id,adminToken:n.app["admin-token"]}},de=async(e,t)=>{let n=await rt();if(e?.app){if(e.token){if(!await ot(e.app,e.token))throw new Error("Invalid app ID and token combination. Please verify both the app ID and token are correct.");return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(e.app,e.token,t),{appId:e.app,adminToken:e.token,approach:"import"}}if(n){let r=await nt(n,e.app);if(!r)throw new Error(`You don't have access to app "${e.app}". Please check the app ID or use --token to provide a token.`);return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(r.appId,n,t),{appId:r.appId,adminToken:r.adminToken,approach:"import"}}throw new Error(`You must be logged in or provide --token when using --app. Either run 'npx instant-cli login' first, or use: --app ${e.app} --token <token>`)}if(!n){let r=await E(new d.Select({promptText:"You are not logged in.",options:[{label:"Login to your Instant account",value:"login"},{label:"Create a temporary app",value:"ephemeral"},{label:"Create an app later",value:"skip"}],modifyOutput:d.ciaModifier()}));if(r==="login"){let p=await T({authToken:null,method:"POST",path:"/dash/cli/auth/register"}),{secret:s,ticket:u}=p;qe(`${ie}/dash?ticket=${u}`);let _=at({secret:s}),w=await E(new d.Spinner({promise:_,workingText:"Waiting for login in browser",disappearWhenDone:!0,modifyOutput:d.ciaModifier(null)}));await st(w.token),n=w.token}if(r==="skip")return d.log("Skipping app link step",d.ciaModifier(null)),null;if(r==="ephemeral"){let p=await E(new d.TextInput({defaultValue:"my-cool-app",prompt:"Enter a name for your temporary app:",placeholder:"my-cool-app",modifyOutput:d.ciaModifier()}));return{...await se(p,t),approach:"ephemeral"}}}if(!n)return null;let o=await le(n),i=o.orgs.filter(r=>r.role!=="app-member");o.orgs=i;let a=await E(new d.AppSelector({startingMenuIndex:0,allowCreate:!0,allowEphemeral:!0,api:{getDash(){return o},createEphemeralApp(r){return se(r,t)},getAppsForOrg:async r=>{let{apps:p}=await ce(n,r);return{apps:p}},createApp:async(r,p)=>{let{appID:s,adminToken:u}=await tt(r,n,p,t);return{appId:s,adminToken:u}}},modifyOutput:d.ciaModifier()}));return a?.approach==="import"&&U(a.appId,n,t),a};function it(e){return new Promise(t=>setTimeout(t,e))}async function at({secret:e}){for(let t=1;t<=120;t++){await it(1e3);let n=await fetch(`${B}/dash/cli/auth/check`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:e})});if(!(!n.ok&&(await n.json()).hint.errors?.[0]?.issue==="waiting-for-user")&&n.ok)return n.json()}throw new Error("Timed out waiting for login")}async function st(e){let t=pe();return await Ye(t.appConfigDirPath,{recursive:!0}),Xe(t.authConfigFilePath,e,"utf-8")}import pt from"fs-extra";import lt from"path";var ct={"next-js-app-dir":"NEXT_PUBLIC_INSTANT_APP_ID","vite-vanilla":"VITE_INSTANT_APP_ID",expo:"EXPO_PUBLIC_INSTANT_APP_ID"},ue=(e,t,n,o)=>{let i=lt.join(t,".env"),r=`${ct[e.base]}=${n}
14
+ `,defaultValue:!1,modifyOutput:A.ciaModifier()})))return;try{let i=Ve(),{major:a,minor:r}=Le();a<2||a==2&&r<28?(await P("git",["init"],{cwd:e}),await P("git",["symbolic-ref","HEAD",`refs/heads/${i}`],{cwd:e})):await P("git",["init",`--initial-branch=${i}`],{cwd:e}),await P("git",["add","."],{cwd:e}),await P("git",["commit","-m","Initial commit (create-instant-app)"],{cwd:e}),A.log("Git repository initialized successfully.",A.ciaModifier(null))}catch{}};import He from"env-paths";import*as Je from"@clack/prompts";import{mkdir as Ye,readFile as Ke,writeFile as Xe}from"node:fs/promises";import qe from"open";import{join as Ze}from"node:path";import{randomUUID as ae}from"node:crypto";import{version as ze}from"@instantdb/version";var re=!!process.env.INSTANT_CLI_DEV,ie=re?"http://localhost:3000":"https://instantdb.com",B=process.env.INSTANT_CLI_API_URI||(re?"http://localhost:8888":"https://api.instantdb.com");async function T({path:e,body:t,method:n="GET",authToken:o,metadata:i}){let r={"Content-Type":"application/json","X-Instant-Source":"create-instant-app","X-Instant-Version":ze,"X-Instant-Command":"create"};o&&(r.Authorization=`Bearer ${o}`),i&&(r["X-Instant-Metadata"]=JSON.stringify(i));let p=await fetch(`${B}${e}`,{method:n??"GET",headers:r,body:t?JSON.stringify(t):void 0,signal:AbortSignal.timeout(3e5)}),s;try{s=await p.json()}catch{s=null}if(!p.ok){let u=s.message||s.hint?.errors?.[0]?.message||"There was an error";throw new Error(u)}return s}import{renderUnwrap as j,UI as d}from"instant-cli/ui";var Qe=!!process.env.INSTANT_CLI_DEV,et=!!process.env.INSTANT_CLI_FORCE_EPHEMERAL;function pe(){let e=`instantdb-${Qe?"dev":"prod"}`,{config:t}=He(e);return{authConfigFilePath:Ze(t,"a"),appConfigDirPath:t}}var tt=async(e,t,n,o)=>{let i=ae(),a=ae();return await T({method:"POST",authToken:t,path:"/dash/apps",body:{id:i,title:e,admin_token:a,org_id:n},metadata:o}),{appID:i,adminToken:a,source:"created"}},U=(e,t,n)=>{T({method:"POST",path:`/dash/apps/${e}/track-import`,authToken:t,metadata:n}).catch(()=>{})},le=async e=>await T({method:"GET",path:"/dash",authToken:e}),ce=async(e,t)=>await T({method:"GET",path:`/dash/orgs/${t}`,authToken:e});var nt=async(e,t)=>{try{let n=await le(e),o=n.apps.find(i=>i.id===t);if(o)return{appId:o.id,adminToken:o.admin_token};for(let i of n.orgs){let{apps:a}=await ce(e,i.id),r=a.find(p=>p.id===t);if(r)return{appId:r.id,adminToken:r.admin_token}}return null}catch{return null}},ot=async(e,t)=>{try{return await T({method:"GET",path:`/dash/apps/${e}/schema/pull`,authToken:t}),!0}catch{return!1}},rt=async()=>et?null:process.env.INSTANT_CLI_AUTH_TOKEN?process.env.INSTANT_CLI_AUTH_TOKEN:await Ke(pe().authConfigFilePath,"utf-8").catch(()=>null),se=async(e,t)=>{let n=await T({authToken:null,method:"POST",path:"/dash/apps/ephemeral",body:{title:e,rules:{$users:{view:"true"},$files:{allow:{view:"true",create:"true",delete:"true"}}}},metadata:t});return{appId:n.app.id,adminToken:n.app["admin-token"]}},de=async(e,t)=>{let n=await rt();if(e?.app){if(e.token){if(!await ot(e.app,e.token))throw new Error("Invalid app ID and token combination. Please verify both the app ID and token are correct.");return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(e.app,e.token,t),{appId:e.app,adminToken:e.token,approach:"import"}}if(n){let r=await nt(n,e.app);if(!r)throw new Error(`You don't have access to app "${e.app}". Please check the app ID or use --token to provide a token.`);return d.log(`Linking to app: ${e.app}`,d.ciaModifier(null)),U(r.appId,n,t),{appId:r.appId,adminToken:r.adminToken,approach:"import"}}throw new Error(`You must be logged in or provide --token when using --app. Either run 'npx instant-cli login' first, or use: --app ${e.app} --token <token>`)}if(!n){let r=await j(new d.Select({promptText:"You are not logged in.",options:[{label:"Login to your Instant account",value:"login"},{label:"Create a temporary app",value:"ephemeral"},{label:"Create an app later",value:"skip"}],modifyOutput:d.ciaModifier()}));if(r==="login"){let p=await T({authToken:null,method:"POST",path:"/dash/cli/auth/register"}),{secret:s,ticket:u}=p;qe(`${ie}/dash?ticket=${u}`);let _=at({secret:s}),w=await j(new d.Spinner({promise:_,workingText:"Waiting for login in browser",disappearWhenDone:!0,modifyOutput:d.ciaModifier(null)}));await st(w.token),n=w.token}if(r==="skip")return d.log("Skipping app link step",d.ciaModifier(null)),null;if(r==="ephemeral"){let p=await j(new d.TextInput({defaultValue:"my-cool-app",prompt:"Enter a name for your temporary app:",placeholder:"my-cool-app",modifyOutput:d.ciaModifier()}));return{...await se(p,t),approach:"ephemeral"}}}if(!n)return null;let o=await le(n),i=o.orgs.filter(r=>r.role!=="app-member");o.orgs=i;let a=await j(new d.AppSelector({startingMenuIndex:0,allowCreate:!0,allowEphemeral:!0,api:{getDash(){return o},createEphemeralApp(r){return se(r,t)},getAppsForOrg:async r=>{let{apps:p}=await ce(n,r);return{apps:p}},createApp:async(r,p)=>{let{appID:s,adminToken:u}=await tt(r,n,p,t);return{appId:s,adminToken:u}}},modifyOutput:d.ciaModifier()}));return a?.approach==="import"&&U(a.appId,n,t),a};function it(e){return new Promise(t=>setTimeout(t,e))}async function at({secret:e}){for(let t=1;t<=120;t++){await it(1e3);let n=await fetch(`${B}/dash/cli/auth/check`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secret:e})});if(!(!n.ok&&(await n.json()).hint.errors?.[0]?.issue==="waiting-for-user")&&n.ok)return n.json()}throw new Error("Timed out waiting for login")}async function st(e){let t=pe();return await Ye(t.appConfigDirPath,{recursive:!0}),Xe(t.authConfigFilePath,e,"utf-8")}import pt from"fs-extra";import lt from"path";var ct={"next-js-app-dir":"NEXT_PUBLIC_INSTANT_APP_ID","vite-vanilla":"VITE_INSTANT_APP_ID",expo:"EXPO_PUBLIC_INSTANT_APP_ID"},ue=(e,t,n,o)=>{let i=lt.join(t,".env"),r=`${ct[e.base]}=${n}
15
15
  INSTANT_APP_ADMIN_TOKEN=${o}`;pt.writeFileSync(i,r)};import{stdin as I,stdout as me}from"process";import{setRawModeWindowsFriendly as fe}from"instant-cli/ui";async function dt(){return new Promise(e=>{if(!me.isTTY||!I.isTTY){e(null);return}let t=I.isRaw;t||fe(I,!0);let n=setTimeout(()=>{i(),e(null)},100),o="",i=()=>{clearTimeout(n),I.removeListener("data",a),!t&&I.isTTY&&fe(I,!1)},a=r=>{let p=r.toString();o+=p;let s=o.match(/\x1b\]11;rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)(?:\x1b\\|\x07)/);if(s){i();let[,u,_,w]=s;e(`rgb:${u}/${_}/${w}`)}};I.on("data",a),me.write("\x1B]11;?\x1B\\")})}function ut(e){let t=e.match(/rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)/);if(!t)return null;let[,n,o,i]=t,a=Math.round(parseInt(n,16)/257),r=Math.round(parseInt(o,16)/257),p=Math.round(parseInt(i,16)/257);return{r:a,g:r,b:p}}function mt(e){return(.299*e.r+.587*e.g+.114*e.b)/255>.5}async function ge(){try{let e=await dt();if(!e)return"unknown";let t=ut(e);return t?mt(t)?"light":"dark":"unknown"}catch(e){return console.error("Error detecting terminal theme:",e),"unknown"}}import S from"chalk";var v=(e,t)=>e==="light"?S.bgYellowBright(t):S.bgBlackBright(t),he=(e,t=console.log,n=!1)=>{let o=(process.stdout.columns||80)-4,i=e.split(`
16
- `),a=!0;i.forEach(r=>{if(r.length===0){a?(t(""),a=!1):console.log(S.gray("\u2502"));return}for(let p=0;p<r.length;p+=o){let s=r.slice(p,p+o);p+o<r.length&&s.length===o&&(s=s+"-"),a?(t(s),a=!1):console.log(S.gray("\u2502 ")+s)}}),n&&console.log(S.gray("\u2502"))};var O="\x1B[?25h";import{execa as ht}from"execa";var wt=async()=>{process.argv.some(w=>["-h","--help","--version","-V"].includes(w))||Y();let e=await ge(),{project:t,appFlags:n}=await H(),[o,i]=z(t.appName),a=x(),r=await K(t,i);Z({projectDir:r,ruleFilesToAdd:t.ruleFiles});let p={template:t.base,aiTool:t.ruleFiles??"none",usedAiPrompt:!!t.prompt},s=await de(n,p);s&&ue(t,r,s.appId,s.adminToken);let u=ye.readJSONSync(we.join(r,"package.json"));if(u.name=o,u.packageManager&&delete u.packageManager,a!=="bun"){let{stdout:w}=await ht(a,["-v"],{cwd:r});u.packageManager=`${a}@${w.trim()}`}ye.writeJSONSync(we.join(r,"package.json"),u,{spaces:2}),await X(x(),r),t.createRepo&&await oe(r),t.prompt&&(await W(t.prompt,r),process.stdout.write(O)),ft("Done!");let _=t.base==="expo"?"start":"dev";s?(console.log(`
16
+ `),a=!0;i.forEach(r=>{if(r.length===0){a?(t(""),a=!1):console.log(S.gray("\u2502"));return}for(let p=0;p<r.length;p+=o){let s=r.slice(p,p+o);p+o<r.length&&s.length===o&&(s=s+"-"),a?(t(s),a=!1):console.log(S.gray("\u2502 ")+s)}}),n&&console.log(S.gray("\u2502"))};var E="\x1B[?25h";import{execa as ht}from"execa";var wt=async()=>{process.argv.some(w=>["-h","--help","--version","-V"].includes(w))||Y();let e=await ge(),{project:t,appFlags:n}=await H(),[o,i]=z(t.appName),a=x(),r=await K(t,i);Z({projectDir:r,ruleFilesToAdd:t.ruleFiles});let p={template:t.base,aiTool:t.ruleFiles??"none",usedAiPrompt:!!t.prompt},s=await de(n,p);s&&ue(t,r,s.appId,s.adminToken);let u=ye.readJSONSync(we.join(r,"package.json"));if(u.name=o,u.packageManager&&delete u.packageManager,a!=="bun"){let{stdout:w}=await ht(a,["-v"],{cwd:r});u.packageManager=`${a}@${w.trim()}`}ye.writeJSONSync(we.join(r,"package.json"),u,{spaces:2}),await X(x(),r),t.createRepo&&await oe(r),t.prompt&&(await W(t.prompt,r),process.stdout.write(E)),ft("Done!");let _=t.base==="expo"?"start":"dev";s?(console.log(`
17
17
  \u{1F389} Success! Your project is ready to go!
18
18
 
19
19
  To get started:
@@ -30,4 +30,4 @@ INSTANT_APP_ADMIN_TOKEN=${o}`;pt.writeFileSync(i,r)};import{stdin as I,stdout as
30
30
  2. Create a new app on ${gt.underline("www.instantdb.com")}
31
31
  3. Add your APP_ID to the .env file
32
32
  4. ${v(e,x()+" run "+_)}
33
- `)};wt().catch(e=>{Te.error("Aborting installation..."),he(e.message,Te.error),process.stdout.write(O),process.exit(1)});process.on("SIGINT",()=>{process.stdout.write(O),process.exit(0)});
33
+ `)};wt().catch(e=>{Te.error("Aborting installation..."),he(e.message,Te.error),process.stdout.write(E),process.exit(1)});process.on("SIGINT",()=>{process.stdout.write(E),process.exit(0)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-instant-app",
3
- "version": "0.22.108-experimental.drewh-use-clone.21267754740.1",
3
+ "version": "0.22.108-experimental.drewh-use-clone.21267978145.1",
4
4
  "description": "Scaffold a new web/mobile app with InstantDB",
5
5
  "homepage": "https://github.com/instantdb/instant/tree/main/client/packages/create-instant-app",
6
6
  "repository": {
@@ -35,8 +35,8 @@
35
35
  "ora": "6.3.1",
36
36
  "slugify": "^1.6.6",
37
37
  "sort-package-json": "^2.10.0",
38
- "@instantdb/version": "0.22.108-experimental.drewh-use-clone.21267754740.1",
39
- "instant-cli": "0.22.108-experimental.drewh-use-clone.21267754740.1"
38
+ "@instantdb/version": "0.22.108-experimental.drewh-use-clone.21267978145.1",
39
+ "instant-cli": "0.22.108-experimental.drewh-use-clone.21267978145.1"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@anthropic-ai/sdk": "^0.60.0",