create-croissant 0.1.45 → 0.1.47

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 (143) hide show
  1. package/dist/add.js +8 -8
  2. package/dist/index.js +8 -8
  3. package/package.json +10 -10
  4. package/template/.env.example +2 -2
  5. package/template/README.md +23 -23
  6. package/template/apps/desktop/README.md +5 -5
  7. package/template/apps/desktop/package.json +5 -5
  8. package/template/apps/mobile/README.md +3 -3
  9. package/template/apps/mobile/app/(tabs)/explore.tsx +1 -0
  10. package/template/apps/mobile/app/(tabs)/index.tsx +23 -27
  11. package/template/apps/mobile/app/index.tsx +9 -16
  12. package/template/apps/mobile/app.json +6 -1
  13. package/template/apps/mobile/lib/auth-client.ts +1 -1
  14. package/template/apps/mobile/lib/orpc.ts +10 -5
  15. package/template/apps/mobile/package.json +6 -5
  16. package/template/apps/mobile/scripts/reset-project.js +0 -0
  17. package/template/apps/platform/.env.example +1 -1
  18. package/template/apps/platform/package.json +8 -5
  19. package/template/apps/platform/portless.json +3 -0
  20. package/template/apps/platform/src/router.tsx +0 -1
  21. package/template/package.json +21 -16
  22. package/template/packages/auth/package.json +2 -2
  23. package/template/packages/db/package.json +1 -1
  24. package/template/packages/orpc/package.json +4 -3
  25. package/template/packages/ui/package.json +3 -2
  26. package/template/pnpm-workspace.yaml +3 -0
  27. package/template/.expo/README.md +0 -13
  28. package/template/.expo/devices.json +0 -3
  29. package/template/.husky/pre-push +0 -11
  30. package/template/packages/orpc/node_modules/@types/node/LICENSE +0 -21
  31. package/template/packages/orpc/node_modules/@types/node/README.md +0 -15
  32. package/template/packages/orpc/node_modules/@types/node/assert/strict.d.ts +0 -111
  33. package/template/packages/orpc/node_modules/@types/node/assert.d.ts +0 -1078
  34. package/template/packages/orpc/node_modules/@types/node/async_hooks.d.ts +0 -603
  35. package/template/packages/orpc/node_modules/@types/node/buffer.buffer.d.ts +0 -472
  36. package/template/packages/orpc/node_modules/@types/node/buffer.d.ts +0 -1934
  37. package/template/packages/orpc/node_modules/@types/node/child_process.d.ts +0 -1476
  38. package/template/packages/orpc/node_modules/@types/node/cluster.d.ts +0 -578
  39. package/template/packages/orpc/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  40. package/template/packages/orpc/node_modules/@types/node/compatibility/index.d.ts +0 -9
  41. package/template/packages/orpc/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  42. package/template/packages/orpc/node_modules/@types/node/compatibility/iterators.d.ts +0 -20
  43. package/template/packages/orpc/node_modules/@types/node/console.d.ts +0 -452
  44. package/template/packages/orpc/node_modules/@types/node/constants.d.ts +0 -21
  45. package/template/packages/orpc/node_modules/@types/node/crypto.d.ts +0 -4545
  46. package/template/packages/orpc/node_modules/@types/node/dgram.d.ts +0 -600
  47. package/template/packages/orpc/node_modules/@types/node/diagnostics_channel.d.ts +0 -578
  48. package/template/packages/orpc/node_modules/@types/node/dns/promises.d.ts +0 -503
  49. package/template/packages/orpc/node_modules/@types/node/dns.d.ts +0 -923
  50. package/template/packages/orpc/node_modules/@types/node/domain.d.ts +0 -170
  51. package/template/packages/orpc/node_modules/@types/node/events.d.ts +0 -976
  52. package/template/packages/orpc/node_modules/@types/node/fs/promises.d.ts +0 -1295
  53. package/template/packages/orpc/node_modules/@types/node/fs.d.ts +0 -4461
  54. package/template/packages/orpc/node_modules/@types/node/globals.d.ts +0 -172
  55. package/template/packages/orpc/node_modules/@types/node/globals.typedarray.d.ts +0 -38
  56. package/template/packages/orpc/node_modules/@types/node/http.d.ts +0 -2089
  57. package/template/packages/orpc/node_modules/@types/node/http2.d.ts +0 -2644
  58. package/template/packages/orpc/node_modules/@types/node/https.d.ts +0 -579
  59. package/template/packages/orpc/node_modules/@types/node/index.d.ts +0 -97
  60. package/template/packages/orpc/node_modules/@types/node/inspector.d.ts +0 -253
  61. package/template/packages/orpc/node_modules/@types/node/inspector.generated.d.ts +0 -4052
  62. package/template/packages/orpc/node_modules/@types/node/module.d.ts +0 -891
  63. package/template/packages/orpc/node_modules/@types/node/net.d.ts +0 -1076
  64. package/template/packages/orpc/node_modules/@types/node/os.d.ts +0 -506
  65. package/template/packages/orpc/node_modules/@types/node/package.json +0 -145
  66. package/template/packages/orpc/node_modules/@types/node/path.d.ts +0 -200
  67. package/template/packages/orpc/node_modules/@types/node/perf_hooks.d.ts +0 -968
  68. package/template/packages/orpc/node_modules/@types/node/process.d.ts +0 -2084
  69. package/template/packages/orpc/node_modules/@types/node/punycode.d.ts +0 -117
  70. package/template/packages/orpc/node_modules/@types/node/querystring.d.ts +0 -152
  71. package/template/packages/orpc/node_modules/@types/node/readline/promises.d.ts +0 -161
  72. package/template/packages/orpc/node_modules/@types/node/readline.d.ts +0 -594
  73. package/template/packages/orpc/node_modules/@types/node/repl.d.ts +0 -428
  74. package/template/packages/orpc/node_modules/@types/node/sea.d.ts +0 -153
  75. package/template/packages/orpc/node_modules/@types/node/sqlite.d.ts +0 -721
  76. package/template/packages/orpc/node_modules/@types/node/stream/consumers.d.ts +0 -38
  77. package/template/packages/orpc/node_modules/@types/node/stream/promises.d.ts +0 -90
  78. package/template/packages/orpc/node_modules/@types/node/stream/web.d.ts +0 -622
  79. package/template/packages/orpc/node_modules/@types/node/stream.d.ts +0 -1687
  80. package/template/packages/orpc/node_modules/@types/node/string_decoder.d.ts +0 -67
  81. package/template/packages/orpc/node_modules/@types/node/test.d.ts +0 -2163
  82. package/template/packages/orpc/node_modules/@types/node/timers/promises.d.ts +0 -108
  83. package/template/packages/orpc/node_modules/@types/node/timers.d.ts +0 -287
  84. package/template/packages/orpc/node_modules/@types/node/tls.d.ts +0 -1319
  85. package/template/packages/orpc/node_modules/@types/node/trace_events.d.ts +0 -197
  86. package/template/packages/orpc/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -468
  87. package/template/packages/orpc/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -34
  88. package/template/packages/orpc/node_modules/@types/node/ts5.6/index.d.ts +0 -97
  89. package/template/packages/orpc/node_modules/@types/node/tty.d.ts +0 -208
  90. package/template/packages/orpc/node_modules/@types/node/url.d.ts +0 -984
  91. package/template/packages/orpc/node_modules/@types/node/util.d.ts +0 -2606
  92. package/template/packages/orpc/node_modules/@types/node/v8.d.ts +0 -920
  93. package/template/packages/orpc/node_modules/@types/node/vm.d.ts +0 -1000
  94. package/template/packages/orpc/node_modules/@types/node/wasi.d.ts +0 -181
  95. package/template/packages/orpc/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -34
  96. package/template/packages/orpc/node_modules/@types/node/web-globals/domexception.d.ts +0 -68
  97. package/template/packages/orpc/node_modules/@types/node/web-globals/events.d.ts +0 -97
  98. package/template/packages/orpc/node_modules/@types/node/web-globals/fetch.d.ts +0 -55
  99. package/template/packages/orpc/node_modules/@types/node/web-globals/navigator.d.ts +0 -22
  100. package/template/packages/orpc/node_modules/@types/node/web-globals/storage.d.ts +0 -24
  101. package/template/packages/orpc/node_modules/@types/node/worker_threads.d.ts +0 -784
  102. package/template/packages/orpc/node_modules/@types/node/zlib.d.ts +0 -747
  103. package/template/packages/orpc/node_modules/undici-types/LICENSE +0 -21
  104. package/template/packages/orpc/node_modules/undici-types/README.md +0 -6
  105. package/template/packages/orpc/node_modules/undici-types/agent.d.ts +0 -31
  106. package/template/packages/orpc/node_modules/undici-types/api.d.ts +0 -43
  107. package/template/packages/orpc/node_modules/undici-types/balanced-pool.d.ts +0 -29
  108. package/template/packages/orpc/node_modules/undici-types/cache.d.ts +0 -36
  109. package/template/packages/orpc/node_modules/undici-types/client.d.ts +0 -108
  110. package/template/packages/orpc/node_modules/undici-types/connector.d.ts +0 -34
  111. package/template/packages/orpc/node_modules/undici-types/content-type.d.ts +0 -21
  112. package/template/packages/orpc/node_modules/undici-types/cookies.d.ts +0 -28
  113. package/template/packages/orpc/node_modules/undici-types/diagnostics-channel.d.ts +0 -66
  114. package/template/packages/orpc/node_modules/undici-types/dispatcher.d.ts +0 -256
  115. package/template/packages/orpc/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -21
  116. package/template/packages/orpc/node_modules/undici-types/errors.d.ts +0 -149
  117. package/template/packages/orpc/node_modules/undici-types/eventsource.d.ts +0 -61
  118. package/template/packages/orpc/node_modules/undici-types/fetch.d.ts +0 -209
  119. package/template/packages/orpc/node_modules/undici-types/file.d.ts +0 -39
  120. package/template/packages/orpc/node_modules/undici-types/filereader.d.ts +0 -54
  121. package/template/packages/orpc/node_modules/undici-types/formdata.d.ts +0 -108
  122. package/template/packages/orpc/node_modules/undici-types/global-dispatcher.d.ts +0 -9
  123. package/template/packages/orpc/node_modules/undici-types/global-origin.d.ts +0 -7
  124. package/template/packages/orpc/node_modules/undici-types/handlers.d.ts +0 -15
  125. package/template/packages/orpc/node_modules/undici-types/header.d.ts +0 -4
  126. package/template/packages/orpc/node_modules/undici-types/index.d.ts +0 -71
  127. package/template/packages/orpc/node_modules/undici-types/interceptors.d.ts +0 -17
  128. package/template/packages/orpc/node_modules/undici-types/mock-agent.d.ts +0 -50
  129. package/template/packages/orpc/node_modules/undici-types/mock-client.d.ts +0 -25
  130. package/template/packages/orpc/node_modules/undici-types/mock-errors.d.ts +0 -12
  131. package/template/packages/orpc/node_modules/undici-types/mock-interceptor.d.ts +0 -93
  132. package/template/packages/orpc/node_modules/undici-types/mock-pool.d.ts +0 -25
  133. package/template/packages/orpc/node_modules/undici-types/package.json +0 -55
  134. package/template/packages/orpc/node_modules/undici-types/patch.d.ts +0 -33
  135. package/template/packages/orpc/node_modules/undici-types/pool-stats.d.ts +0 -19
  136. package/template/packages/orpc/node_modules/undici-types/pool.d.ts +0 -39
  137. package/template/packages/orpc/node_modules/undici-types/proxy-agent.d.ts +0 -28
  138. package/template/packages/orpc/node_modules/undici-types/readable.d.ts +0 -65
  139. package/template/packages/orpc/node_modules/undici-types/retry-agent.d.ts +0 -8
  140. package/template/packages/orpc/node_modules/undici-types/retry-handler.d.ts +0 -116
  141. package/template/packages/orpc/node_modules/undici-types/util.d.ts +0 -18
  142. package/template/packages/orpc/node_modules/undici-types/webidl.d.ts +0 -228
  143. package/template/packages/orpc/node_modules/undici-types/websocket.d.ts +0 -150
package/dist/add.js CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import i from"path";import{fileURLToPath as E}from"url";import s from"chalk";import{Command as P}from"commander";import{execa as j}from"execa";import e from"fs-extra";import k from"inquirer";import g from"ora";var A=E(import.meta.url),x=i.dirname(A),y=new P;y.name("croissant-add").description("Add a mobile or desktop app to an existing Croissant Stack project").action(async()=>{console.log(s.bold.yellow(`
2
+ import i from"path";import{fileURLToPath as E}from"url";import s from"chalk";import{Command as P}from"commander";import{execa as j}from"execa";import t from"fs-extra";import k from"inquirer";import g from"ora";var A=E(import.meta.url),x=i.dirname(A),v=new P;v.name("croissant-add").description("Add a mobile or desktop app to an existing Croissant Stack project").action(async()=>{console.log(s.bold.yellow(`
3
3
  \u{1F950} Croissant Stack: Add App
4
- `));let p=i.join(process.cwd(),"package.json");await e.pathExists(p)||(console.error(s.red(`
4
+ `));let p=i.join(process.cwd(),"package.json");await t.pathExists(p)||(console.error(s.red(`
5
5
  Error: package.json not found. Are you in the root of your project?
6
- `)),process.exit(1));let t=await e.readJson(p);(!t.scripts||!t.scripts.dev&&!t.scripts.build)&&(console.error(s.red(`
6
+ `)),process.exit(1));let e=await t.readJson(p);(!e.scripts||!e.scripts.dev&&!e.scripts.build)&&(console.error(s.red(`
7
7
  Error: This doesn't look like a Croissant Stack project.
8
- `)),process.exit(1));let u=i.join(process.cwd(),"apps/mobile"),h=i.join(process.cwd(),"apps/desktop"),f=await e.pathExists(u),b=await e.pathExists(h);if(f&&b){console.log(s.blue(`Both mobile and desktop apps are already present. Nothing to add!
9
- `));return}let l=[];f||l.push({name:"Mobile App (Expo)",value:"mobile"}),b||l.push({name:"Desktop App (Electron)",value:"desktop"});let{type:a}=await k.prompt([{type:"list",name:"type",message:"Which app would you like to add?",choices:l}]),c=process.cwd(),w=g(`Adding ${a} app...`).start();try{let n=i.join(x,"..","template");if(await e.pathExists(n)||(n=i.resolve(x,"../../..")),a==="mobile"){let r=i.join(n,"apps/mobile");await e.copy(r,u),t.scripts=t.scripts||{},t.scripts["dev:mobile"]="turbo run dev --filter=mobile",t.scripts["build:mobile"]="turbo run build --filter=mobile",await e.writeJson(p,t,{spaces:2});let d=i.join(c,"packages/auth/src/lib/auth.ts");if(await e.pathExists(d)){let o=await e.readFile(d,"utf8");o.includes("@better-auth/expo")||(o=`import { expo } from "@better-auth/expo";
8
+ `)),process.exit(1));let u=i.join(process.cwd(),"apps/mobile"),h=i.join(process.cwd(),"apps/desktop"),b=await t.pathExists(u),f=await t.pathExists(h);if(b&&f){console.log(s.blue(`Both mobile and desktop apps are already present. Nothing to add!
9
+ `));return}let l=[];b||l.push({name:"Mobile App (Expo)",value:"mobile"}),f||l.push({name:"Desktop App (Electron)",value:"desktop"});let{type:a}=await k.prompt([{type:"list",name:"type",message:"Which app would you like to add?",choices:l}]),c=process.cwd(),w=g(`Adding ${a} app...`).start();try{let n=i.join(x,"..","template");if(await t.pathExists(n)||(n=i.resolve(x,"../../..")),a==="mobile"){let r=i.join(n,"apps/mobile");await t.copy(r,u),e.scripts=e.scripts||{},e.scripts["dev:mobile"]="turbo run dev --filter=mobile",e.scripts["dev:ios"]="turbo run dev --filter=mobile -- --ios",e.scripts["dev:android"]="turbo run dev --filter=mobile -- --android",e.scripts["build:mobile"]="turbo run build --filter=mobile",await t.writeJson(p,e,{spaces:2});let d=i.join(c,"packages/auth/src/lib/auth.ts");if(await t.pathExists(d)){let o=await t.readFile(d,"utf8");o.includes("@better-auth/expo")||(o=`import { expo } from "@better-auth/expo";
10
10
  ${o}`),o.includes("plugins: [expo()]")||(o=o.replace("emailAndPassword: { enabled: true },",`emailAndPassword: { enabled: true },
11
11
  plugins: [expo()],
12
12
  trustedOrigins: [
@@ -19,7 +19,7 @@ ${o}`),o.includes("plugins: [expo()]")||(o=o.replace("emailAndPassword: { enable
19
19
  "http://localhost:8081",
20
20
  ]
21
21
  : []),
22
- ],`)),await e.writeFile(d,o)}let m=i.join(c,"packages/auth/package.json");if(await e.pathExists(m)){let o=await e.readJson(m);o.dependencies=o.dependencies||{},o.dependencies["@better-auth/expo"]||(o.dependencies["@better-auth/expo"]="latest",await e.writeJson(m,o,{spaces:2}))}}else if(a==="desktop"){let r=i.join(n,"apps/desktop");await e.copy(r,h),t.scripts=t.scripts||{},t.scripts["dev:desktop"]="turbo run dev --filter=desktop",t.scripts["build:desktop"]="turbo run build --filter=desktop",await e.writeJson(p,t,{spaces:2})}w.succeed(s.green(`${a==="mobile"?"Mobile":"Desktop"} app added successfully!`));let{install:v}=await k.prompt([{type:"confirm",name:"install",message:"Would you like to install dependencies now?",default:!0}]);if(v){let r=g("Installing dependencies...").start();try{await j("npm",["install"],{cwd:c}),r.succeed(s.green("Dependencies installed!"))}catch{r.fail(s.red("Failed to install dependencies. Run npm install manually."))}}console.log(s.bold.cyan(`
23
- Next steps:`)),console.log(a==="mobile"?" npm run dev:mobile # Start Expo development server":" npm run dev:desktop # Start Electron development server"),console.log(s.yellow(`
22
+ ],`)),await t.writeFile(d,o)}let m=i.join(c,"packages/auth/package.json");if(await t.pathExists(m)){let o=await t.readJson(m);o.dependencies=o.dependencies||{},o.dependencies["@better-auth/expo"]||(o.dependencies["@better-auth/expo"]="latest",await t.writeJson(m,o,{spaces:2}))}}else if(a==="desktop"){let r=i.join(n,"apps/desktop");await t.copy(r,h),e.scripts=e.scripts||{},e.scripts["dev:desktop"]="turbo run dev --filter=desktop",e.scripts["build:desktop"]="turbo run build --filter=desktop",await t.writeJson(p,e,{spaces:2})}w.succeed(s.green(`${a==="mobile"?"Mobile":"Desktop"} app added successfully!`));let{install:y}=await k.prompt([{type:"confirm",name:"install",message:"Would you like to install dependencies now?",default:!0}]);if(y){let r=g("Installing dependencies...").start();try{await j("pnpm",["install"],{cwd:c}),r.succeed(s.green("Dependencies installed!"))}catch{r.fail(s.red("Failed to install dependencies. Run pnpm install manually."))}}console.log(s.bold.cyan(`
23
+ Next steps:`)),console.log(a==="mobile"?" pnpm run dev:mobile # Start Expo development server":" pnpm run dev:desktop # Start Electron development server"),console.log(s.yellow(`
24
24
  Happy hacking! \u{1F950}
25
- `))}catch(n){w.fail(s.red(`An error occurred while adding the ${a} app.`)),console.error(n),process.exit(1)}});y.parse(process.argv);
25
+ `))}catch(n){w.fail(s.red(`An error occurred while adding the ${a} app.`)),console.error(n),process.exit(1)}});v.parse(process.argv);
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import i from"path";import{fileURLToPath as x}from"url";import c from"chalk";import{Command as b}from"commander";import{execa as P}from"execa";import e from"fs-extra";import y from"inquirer";import g from"ora";var j=x(import.meta.url),w=i.dirname(j),k=new b;k.name("create-croissant").description("Scaffold a new project using the Croissant Stack").argument("[project-name]","Name of the project").action(async m=>{console.log(c.bold.yellow(`
2
+ import i from"path";import{fileURLToPath as k}from"url";import p from"chalk";import{Command as b}from"commander";import{execa as P}from"execa";import e from"fs-extra";import y from"inquirer";import g from"ora";var j=k(import.meta.url),w=i.dirname(j),x=new b;x.name("create-croissant").description("Scaffold a new project using the Croissant Stack").argument("[project-name]","Name of the project").action(async u=>{console.log(p.bold.yellow(`
3
3
  \u{1F950} Welcome to the Croissant Stack!
4
- `));let l=await y.prompt([{type:"input",name:"name",message:"What is your project named?",default:m||"my-croissant-app",when:!m},{type:"confirm",name:"install",message:"Would you like to install dependencies?",default:!0},{type:"confirm",name:"mobile",message:"Would you like to include the mobile app (Expo)?",default:!0},{type:"confirm",name:"desktop",message:"Would you like to include the desktop app (Electron)?",default:!0}]),p=m||l.name,s=i.resolve(process.cwd(),p);e.existsSync(s)&&(console.error(c.red(`
5
- Error: Directory ${p} already exists.
6
- `)),process.exit(1));let h=g("Scaffolding your project...").start();try{await e.ensureDir(s);let d=i.join(w,"..","template");if(await e.pathExists(d))await e.copy(d,s);else{let a=i.resolve(w,"../../.."),n=["node_modules","dist",".git","packages/create-croissant",".turbo","package-lock.json"];await e.copy(a,s,{filter:t=>{let r=i.relative(a,t);return!n.some(o=>r.startsWith(o))}})}if(l.mobile){let a=i.join(s,"packages/auth/src/lib/auth.ts");if(await e.pathExists(a)){let t=await e.readFile(a,"utf8");t.includes("@better-auth/expo")||(t=`import { expo } from "@better-auth/expo";
4
+ `));let l=await y.prompt([{type:"input",name:"name",message:"What is your project named?",default:u||"my-croissant-app",when:!u},{type:"confirm",name:"install",message:"Would you like to install dependencies?",default:!0},{type:"confirm",name:"mobile",message:"Would you like to include the mobile app (Expo)?",default:!0},{type:"confirm",name:"desktop",message:"Would you like to include the desktop app (Electron)?",default:!0}]),c=u||l.name,s=i.resolve(process.cwd(),c);e.existsSync(s)&&(console.error(p.red(`
5
+ Error: Directory ${c} already exists.
6
+ `)),process.exit(1));let f=g("Scaffolding your project...").start();try{await e.ensureDir(s);let d=i.join(w,"..","template");if(await e.pathExists(d))await e.copy(d,s);else{let a=i.resolve(w,"../../.."),n=["node_modules","dist",".git","packages/create-croissant",".turbo","pnpm-lock.yaml"];await e.copy(a,s,{filter:t=>{let r=i.relative(a,t);return!n.some(o=>r.startsWith(o))}})}if(l.mobile){let a=i.join(s,"packages/auth/src/lib/auth.ts");if(await e.pathExists(a)){let t=await e.readFile(a,"utf8");t.includes("@better-auth/expo")||(t=`import { expo } from "@better-auth/expo";
7
7
  ${t}`),t.includes("plugins: [expo()]")||(t=t.replace("emailAndPassword: { enabled: true },",`emailAndPassword: { enabled: true },
8
8
  plugins: [expo()],
9
9
  trustedOrigins: [
@@ -16,7 +16,7 @@ ${t}`),t.includes("plugins: [expo()]")||(t=t.replace("emailAndPassword: { enable
16
16
  "http://localhost:8081",
17
17
  ]
18
18
  : []),
19
- ],`)),await e.writeFile(a,t)}let n=i.join(s,"packages/auth/package.json");if(await e.pathExists(n)){let t=await e.readJson(n);t.dependencies=t.dependencies||{},t.dependencies["@better-auth/expo"]||(t.dependencies["@better-auth/expo"]="latest",await e.writeJson(n,t,{spaces:2}))}}else{let a=i.join(s,"apps/mobile");if(await e.pathExists(a)){await e.remove(a);let n=i.join(s,"package.json");if(await e.pathExists(n)){let o=await e.readJson(n);o.scripts&&Object.keys(o.scripts).forEach(f=>{f.includes("mobile")&&delete o.scripts[f]}),await e.writeJson(n,o,{spaces:2})}let t=i.join(s,"packages/auth/src/lib/auth.ts");if(await e.pathExists(t)){let o=await e.readFile(t,"utf8");o=o.replace(/import \{ expo \} from "@better-auth\/expo";\n/,""),o=o.replace(/\s+plugins: \[expo\(\)\],/,""),o=o.replace(/\s+trustedOrigins: \[[\s\S]*?\],/,""),await e.writeFile(t,o)}let r=i.join(s,"packages/auth/package.json");if(await e.pathExists(r)){let o=await e.readJson(r);o.dependencies&&o.dependencies["@better-auth/expo"]&&(delete o.dependencies["@better-auth/expo"],await e.writeJson(r,o,{spaces:2}))}}}if(!l.desktop){let a=i.join(s,"apps/desktop");if(await e.pathExists(a)){await e.remove(a);let n=i.join(s,"package.json");if(await e.pathExists(n)){let t=await e.readJson(n);t.scripts&&Object.keys(t.scripts).forEach(r=>{r.includes("desktop")&&delete t.scripts[r]}),await e.writeJson(n,t,{spaces:2})}}}let u=i.join(s,"package.json");if(await e.pathExists(u)){let a=await e.readJson(u);a.name=p,a.version="0.1.0",delete a.private,await e.writeJson(u,a,{spaces:2})}if(h.succeed(c.green(`Project ${p} created at ${s}`)),l.install){let a=g("Installing dependencies...").start();try{await P("npm",["install"],{cwd:s}),a.succeed(c.green("Dependencies installed!"))}catch{a.fail(c.red("Failed to install dependencies. You may need to run npm install manually."))}}console.log(c.bold.cyan(`
20
- Next steps:`)),console.log(` cd ${p}`),console.log(" npm run db:up # Start your PostgreSQL database"),console.log(` npm run dev # Start development server
21
- `),console.log(c.yellow(`Happy hacking! \u{1F950}
22
- `))}catch(d){h.fail(c.red("An error occurred during scaffolding.")),console.error(d),process.exit(1)}});k.parse(process.argv);
19
+ ],`)),await e.writeFile(a,t)}let n=i.join(s,"packages/auth/package.json");if(await e.pathExists(n)){let t=await e.readJson(n);t.dependencies=t.dependencies||{},t.dependencies["@better-auth/expo"]||(t.dependencies["@better-auth/expo"]="latest",await e.writeJson(n,t,{spaces:2}))}}else{let a=i.join(s,"apps/mobile");if(await e.pathExists(a)){await e.remove(a);let n=i.join(s,"package.json");if(await e.pathExists(n)){let o=await e.readJson(n);o.scripts&&Object.keys(o.scripts).forEach(m=>{(m.includes("mobile")||m.includes("ios")||m.includes("android"))&&delete o.scripts[m]}),await e.writeJson(n,o,{spaces:2})}let t=i.join(s,"packages/auth/src/lib/auth.ts");if(await e.pathExists(t)){let o=await e.readFile(t,"utf8");o=o.replace(/import \{ expo \} from "@better-auth\/expo";\n/,""),o=o.replace(/\s+plugins: \[expo\(\)\],/,""),o=o.replace(/\s+trustedOrigins: \[[\s\S]*?\],/,""),await e.writeFile(t,o)}let r=i.join(s,"packages/auth/package.json");if(await e.pathExists(r)){let o=await e.readJson(r);o.dependencies&&o.dependencies["@better-auth/expo"]&&(delete o.dependencies["@better-auth/expo"],await e.writeJson(r,o,{spaces:2}))}}}if(!l.desktop){let a=i.join(s,"apps/desktop");if(await e.pathExists(a)){await e.remove(a);let n=i.join(s,"package.json");if(await e.pathExists(n)){let t=await e.readJson(n);t.scripts&&Object.keys(t.scripts).forEach(r=>{r.includes("desktop")&&delete t.scripts[r]}),await e.writeJson(n,t,{spaces:2})}}}let h=i.join(s,"package.json");if(await e.pathExists(h)){let a=await e.readJson(h);a.name=c,a.version="0.1.0",delete a.private,await e.writeJson(h,a,{spaces:2})}if(f.succeed(p.green(`Project ${c} created at ${s}`)),l.install){let a=g("Installing dependencies...").start();try{await P("pnpm",["install"],{cwd:s}),a.succeed(p.green("Dependencies installed!"))}catch{a.fail(p.red("Failed to install dependencies. You may need to run pnpm install manually."))}}console.log(p.bold.cyan(`
20
+ Next steps:`)),console.log(` cd ${c}`),console.log(" pnpm run db:up # Start your PostgreSQL database"),console.log(` pnpm run dev # Start development server
21
+ `),console.log(p.yellow(`Happy hacking! \u{1F950}
22
+ `))}catch(d){f.fail(p.red("An error occurred during scaffolding.")),console.error(d),process.exit(1)}});x.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-croissant",
3
- "version": "0.1.45",
3
+ "version": "0.1.47",
4
4
  "description": "Scaffold a new project using the Croissant Stack",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,12 +20,6 @@
20
20
  "publishConfig": {
21
21
  "access": "public"
22
22
  },
23
- "scripts": {
24
- "build": "npm run prepare-template && tsup src/index.ts src/add.ts --format esm --clean --minify",
25
- "dev": "tsup src/index.ts src/add.ts --format esm --watch",
26
- "typecheck": "tsc --noEmit",
27
- "prepare-template": "node scripts/prepare-template.js"
28
- },
29
23
  "dependencies": {
30
24
  "chalk": "^5.6.2",
31
25
  "commander": "^14.0.3",
@@ -38,7 +32,13 @@
38
32
  "@types/fs-extra": "^11.0.4",
39
33
  "@types/inquirer": "^9.0.9",
40
34
  "@types/node": "^25.6.0",
41
- "@workspace/config-typescript": "*",
42
- "tsup": "^8.5.1"
35
+ "tsup": "^8.5.1",
36
+ "@workspace/config-typescript": "0.0.0"
37
+ },
38
+ "scripts": {
39
+ "build": "pnpm run prepare-template && tsup src/index.ts src/add.ts --format esm --clean --minify",
40
+ "dev": "tsup src/index.ts src/add.ts --format esm --watch",
41
+ "typecheck": "tsc --noEmit",
42
+ "prepare-template": "node scripts/prepare-template.js"
43
43
  }
44
- }
44
+ }
@@ -1,5 +1,5 @@
1
1
  DATABASE_URL=postgresql://postgres:postgres@localhost:5432/auth
2
- BETTER_AUTH_URL=http://localhost:3000
2
+ BETTER_AUTH_URL=https://platform.local
3
3
  BETTER_AUTH_SECRET=your-secret-here
4
4
  # For production, set this to your domain
5
- # NEXT_PUBLIC_APP_URL=http://localhost:3000
5
+ # NEXT_PUBLIC_APP_URL=https://platform.local
@@ -7,7 +7,7 @@ A modern, type-safe full-stack monorepo powered by **TanStack Start**, **Better
7
7
  The fastest way to scaffold a new project with the Croissant Stack is using our CLI:
8
8
 
9
9
  ```bash
10
- npx create-croissant@latest
10
+ pnpm dlx create-croissant@latest
11
11
  ```
12
12
 
13
13
  ---
@@ -21,7 +21,7 @@ npx create-croissant@latest
21
21
  - **API**: [oRPC](https://orpc.sh/) with a modular, namespaced router for end-to-end type-safety.
22
22
  - **Database**: [Drizzle ORM](https://orm.drizzle.team/) with PostgreSQL and Docker Compose setup.
23
23
  - **Styling**: [shadcn/ui](https://ui.shadcn.com/) components with Tailwind CSS.
24
- - **Monorepo Management**: Powered by [Turborepo](https://turbo.build/) for lightning-fast builds and smart task orchestration.
24
+ - **Monorepo Management**: Powered by [pnpm](https://pnpm.io/) and [Turborepo](https://turbo.build/) for lightning-fast builds and smart task orchestration.
25
25
  - **Developer Experience**:
26
26
  - Path aliases (`@/`) for clean imports.
27
27
  - Strict TypeScript across the entire stack.
@@ -47,7 +47,7 @@ npx create-croissant@latest
47
47
  ### 1. Install Dependencies
48
48
 
49
49
  ```bash
50
- npm install
50
+ pnpm install
51
51
  ```
52
52
 
53
53
  ### 2. Set Up the Database
@@ -55,7 +55,7 @@ npm install
55
55
  Start the PostgreSQL database using Docker Compose:
56
56
 
57
57
  ```bash
58
- npm run db:up
58
+ pnpm run db:up
59
59
  ```
60
60
 
61
61
  This command runs a PostgreSQL container named `samstack` on port `5432`.
@@ -72,7 +72,7 @@ Ensure you provide the necessary variables:
72
72
 
73
73
  ```env
74
74
  DATABASE_URL=postgresql://postgres:postgres@localhost:5432/auth
75
- BETTER_AUTH_URL=http://localhost:3000
75
+ BETTER_AUTH_URL=https://platform.local
76
76
  BETTER_AUTH_SECRET=your-secret-here
77
77
  ```
78
78
 
@@ -82,36 +82,36 @@ Synchronize your schema with the database:
82
82
 
83
83
  ```bash
84
84
  # From packages/db or via turbo
85
- npm run db:push --filter @workspace/db
85
+ pnpm run db:push --filter @workspace/db
86
86
  ```
87
87
 
88
88
  ### 5. Run Development Server
89
89
 
90
90
  ```bash
91
- npm run dev
91
+ pnpm run dev
92
92
  ```
93
93
 
94
- The web application will be available at `http://localhost:3000`.
94
+ The web application will be available at `https://platform.local`.
95
95
 
96
96
  ## 📦 Scripts
97
97
 
98
98
  All scripts are orchestrated by Turborepo. You can run them from the root directory:
99
99
 
100
100
  ### Core Scripts
101
- - `npm run dev`: Start all applications in development mode.
102
- - `npm run build`: Build all applications for production.
103
- - `npm run quality`: Run all quality checks (linting and formatting) using Oxc.
104
- - `npm run quality:fix`: Automatically fix linting and formatting issues using Oxc.
105
- - `npm run typecheck`: Run TypeScript type checking across the workspace.
106
- - `npm run ci`: Run linting, type-checking, and build (used in CI/CD).
101
+ - `pnpm run dev`: Start all applications in development mode.
102
+ - `pnpm run build`: Build all applications for production.
103
+ - `pnpm run quality`: Run all quality checks (linting and formatting) using Oxc.
104
+ - `pnpm run quality:fix`: Automatically fix linting and formatting issues using Oxc.
105
+ - `pnpm run typecheck`: Run TypeScript type checking across the workspace.
106
+ - `pnpm run ci`: Run linting, type-checking, and build (used in CI/CD).
107
107
 
108
108
  ### 🗄️ Database Scripts
109
109
  These handle Docker and Drizzle operations:
110
- - `npm run db:up`: Start the PostgreSQL Docker container.
111
- - `npm run db:down`: Stop and remove the database container.
112
- - `npm run db:logs`: Tail logs from the database container.
113
- - `npm run db:push --filter @workspace/db`: Push Drizzle schema to the database.
114
- - `npm run db:studio --filter @workspace/db`: Open Drizzle Studio to explore your data.
110
+ - `pnpm run db:up`: Start the PostgreSQL Docker container.
111
+ - `pnpm run db:down`: Stop and remove the database container.
112
+ - `pnpm run db:logs`: Tail logs from the database container.
113
+ - `pnpm run db:push --filter @workspace/db`: Push Drizzle schema to the database.
114
+ - `pnpm run db:studio --filter @workspace/db`: Open Drizzle Studio to explore your data.
115
115
 
116
116
  ## 🎯 Turborepo Power
117
117
 
@@ -120,10 +120,10 @@ Turbo allows you to run tasks for specific packages using the `--filter` flag:
120
120
 
121
121
  ```bash
122
122
  # Only lint the platform app
123
- npm run lint -- --filter platform
123
+ pnpm run lint --filter platform
124
124
 
125
125
  # Build the db package and everything that depends on it
126
- npm run build -- --filter @workspace/db...
126
+ pnpm run build --filter @workspace/db...
127
127
  ```
128
128
 
129
129
  ### Smart Caching
@@ -151,14 +151,14 @@ type Outputs = InferRouterOutputs<typeof router>;
151
151
  To add components to the shared UI package:
152
152
 
153
153
  ```bash
154
- npx shadcn@latest add [component-name] -c apps/platform
154
+ pnpm dlx shadcn@latest add [component-name] -c apps/platform
155
155
  ```
156
156
 
157
157
  This will place the UI components in `packages/ui/src/components`.
158
158
 
159
159
  ## 🛡️ Quality & Git Hooks
160
160
 
161
- This project uses **Husky** to ensure code quality. When pushing to the `main` branch, it automatically runs the CI pipeline (`npm run ci`) to prevent broken code from being pushed.
161
+ This project uses **Husky** to ensure code quality. When pushing to the `main` branch, it automatically runs the CI pipeline (`pnpm run ci`) to prevent broken code from being pushed.
162
162
 
163
163
  Formatting and linting are handled by **Oxc**, which is significantly faster than ESLint and Prettier.
164
164
 
@@ -11,24 +11,24 @@ An Electron application with React and TypeScript
11
11
  ### Install
12
12
 
13
13
  ```bash
14
- $ npm install
14
+ $ pnpm install
15
15
  ```
16
16
 
17
17
  ### Development
18
18
 
19
19
  ```bash
20
- $ npm run dev
20
+ $ pnpm run dev
21
21
  ```
22
22
 
23
23
  ### Build
24
24
 
25
25
  ```bash
26
26
  # For windows
27
- $ npm run build:win
27
+ $ pnpm run build:win
28
28
 
29
29
  # For macOS
30
- $ npm run build:mac
30
+ $ pnpm run build:mac
31
31
 
32
32
  # For Linux
33
- $ npm run build:linux
33
+ $ pnpm run build:linux
34
34
  ```
@@ -8,13 +8,13 @@
8
8
  "scripts": {
9
9
  "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
10
10
  "typecheck:web": "tsc --noEmit -p tsconfig.web.json --composite false",
11
- "typecheck": "npm run typecheck:node && npm run typecheck:web",
11
+ "typecheck": "pnpm run typecheck:node && pnpm run typecheck:web",
12
12
  "start": "electron-vite preview",
13
13
  "dev": "electron-vite dev",
14
- "build": "npm run typecheck && electron-vite build",
14
+ "build": "pnpm run typecheck && electron-vite build",
15
15
  "postinstall": "electron-builder install-app-deps",
16
- "build:unpack": "npm run build && electron-builder --dir",
17
- "build:win": "npm run build && electron-builder --win",
16
+ "build:unpack": "pnpm run build && electron-builder --dir",
17
+ "build:win": "pnpm run build && electron-builder --win",
18
18
  "build:mac": "electron-vite build && electron-builder --mac",
19
19
  "build:linux": "electron-vite build && electron-builder --linux"
20
20
  },
@@ -27,7 +27,7 @@
27
27
  "@electron-toolkit/tsconfig": "^2.0.0",
28
28
  "@types/node": "^22.19.1",
29
29
  "@vitejs/plugin-react": "^5.1.1",
30
- "@workspace/config-typescript": "*",
30
+ "@workspace/config-typescript": "workspace:*",
31
31
  "electron": "39.8.9",
32
32
  "electron-builder": "^26.0.12",
33
33
  "electron-vite": "^5.0.0"
@@ -7,13 +7,13 @@ This is an [Expo](https://expo.dev) project created with [`create-expo-app`](htt
7
7
  1. Install dependencies
8
8
 
9
9
  ```bash
10
- npm install
10
+ pnpm install
11
11
  ```
12
12
 
13
13
  2. Start the app
14
14
 
15
15
  ```bash
16
- npx expo start
16
+ pnpm dlx expo start
17
17
  ```
18
18
 
19
19
  In the output, you'll find options to open the app in a
@@ -30,7 +30,7 @@ You can start developing by editing the files inside the **app** directory. This
30
30
  When you're ready, run:
31
31
 
32
32
  ```bash
33
- npm run reset-project
33
+ pnpm run reset-project
34
34
  ```
35
35
 
36
36
  This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing.
@@ -51,6 +51,7 @@ export default function ExploreScreen() {
51
51
  diameter: parseFloat(value.diameter) || 0,
52
52
  hasRings: false,
53
53
  };
54
+ console.log('connard')
54
55
 
55
56
  try {
56
57
  if (editingId) {
@@ -1,45 +1,30 @@
1
- import { useEffect, useState } from "react";
2
- import { View, Text, StyleSheet, ScrollView, TouchableOpacity, Platform } from "react-native";
1
+ import { useEffect } from "react";
2
+ import { View, Text, StyleSheet, ScrollView, Platform } from "react-native";
3
3
  import { useRouter } from "expo-router";
4
4
  import { authClient } from "@/lib/auth-client";
5
- import { orpc } from "@/lib/orpc";
5
+ import { useSecretData } from "@workspace/orpc/react";
6
6
  import { Button } from "@/components/ui/button";
7
7
 
8
8
  export default function DashboardScreen() {
9
9
  const router = useRouter();
10
- const { data: session, isPending } = authClient.useSession();
11
- const [secretData, setSecretData] = useState<string>("");
12
- const [loadingSecret, setLoadingSecret] = useState(false);
10
+ const { data: session, isPending: isAuthPending } = authClient.useSession();
11
+
12
+ const { data: secretData, isLoading: isLoadingSecret, error: secretError } = useSecretData({
13
+ enabled: !!session,
14
+ });
13
15
 
14
16
  useEffect(() => {
15
- if (!isPending && !session) {
17
+ if (!isAuthPending && !session) {
16
18
  router.replace("/login");
17
- return;
18
19
  }
19
-
20
- if (session) {
21
- const fetchSecret = async () => {
22
- setLoadingSecret(true);
23
- try {
24
- const res = await orpc.getSecretData();
25
- setSecretData(res.secret);
26
- } catch (err: any) {
27
- setSecretData("Error: " + (err.message || "Unknown error"));
28
- } finally {
29
- setLoadingSecret(false);
30
- }
31
- };
32
-
33
- fetchSecret();
34
- }
35
- }, [session, isPending, router]);
20
+ }, [session, isAuthPending, router]);
36
21
 
37
22
  const handleSignOut = async () => {
38
23
  await authClient.signOut();
39
24
  router.replace("/");
40
25
  };
41
26
 
42
- if (isPending) {
27
+ if (isAuthPending) {
43
28
  return (
44
29
  <View style={styles.center}>
45
30
  <Text>Loading dashboard...</Text>
@@ -57,7 +42,15 @@ export default function DashboardScreen() {
57
42
 
58
43
  <View style={styles.secureBox}>
59
44
  <Text style={styles.secureTitle}>Secure oRPC Data:</Text>
60
- <Text style={styles.secureContent}>{secretData}</Text>
45
+ {isLoadingSecret ? (
46
+ <Text style={styles.secureContent}>Loading secret data...</Text>
47
+ ) : secretError ? (
48
+ <Text style={[styles.secureContent, styles.errorText]}>
49
+ Error: {secretError.message || "Unknown error"}
50
+ </Text>
51
+ ) : (
52
+ <Text style={styles.secureContent}>{secretData?.secret}</Text>
53
+ )}
61
54
  </View>
62
55
 
63
56
  <Button variant="destructive" onPress={handleSignOut} style={styles.signOutBtn}>
@@ -110,6 +103,9 @@ const styles = StyleSheet.create({
110
103
  fontFamily: Platform.OS === "ios" ? "Courier" : "monospace",
111
104
  fontSize: 12,
112
105
  },
106
+ errorText: {
107
+ color: "#ef4444",
108
+ },
113
109
  signOutBtn: {
114
110
  marginTop: 12,
115
111
  },
@@ -1,34 +1,27 @@
1
- import { View, Text, StyleSheet, ScrollView, FlatList } from "react-native";
2
- import { Link, useRouter } from "expo-router";
3
- import { useQueryClient } from "@tanstack/react-query";
1
+ import { View, Text, StyleSheet, ScrollView } from "react-native";
2
+ import { useRouter } from "expo-router";
4
3
  import { Button } from "@/components/ui/button";
5
- import { usePlanets } from "@workspace/orpc/react";
6
- import { orpc } from "@/lib/orpc";
7
- import { useEffect, useState } from "react";
4
+ import { usePlanets, useHello } from "@workspace/orpc/react";
8
5
 
9
6
  export default function LandingScreen() {
10
7
  const router = useRouter();
11
- const [helloMessage, setHelloMessage] = useState("");
12
- const { data: planets = [], isLoading } = usePlanets();
13
-
14
- useEffect(() => {
15
- orpc.hello({ name: "Croissant Stack Mobile" }).then((res) => {
16
- setHelloMessage(res.message);
17
- });
18
- }, []);
8
+ const { data: helloData, isLoading: isHelloLoading } = useHello("Croissant Stack Mobile");
9
+ const { data: planets = [], isLoading: isPlanetsLoading } = usePlanets();
19
10
 
20
11
  return (
21
12
  <ScrollView style={styles.container} contentContainerStyle={styles.content}>
22
13
  <View style={styles.header}>
23
14
  <Text style={styles.title}>Project ready!</Text>
24
15
  <Text style={styles.subtitle}>
25
- oRPC integration: <Text style={styles.bold}>{helloMessage || "Loading..."}</Text>
16
+ oRPC integration: <Text style={styles.bold}>
17
+ {isHelloLoading ? "Loading..." : helloData?.message}
18
+ </Text>
26
19
  </Text>
27
20
  </View>
28
21
 
29
22
  <View style={styles.section}>
30
23
  <Text style={styles.sectionTitle}>Planets from Database:</Text>
31
- {isLoading ? (
24
+ {isPlanetsLoading ? (
32
25
  <Text style={styles.loading}>Loading planets...</Text>
33
26
  ) : planets.length === 0 ? (
34
27
  <Text style={styles.empty}>
@@ -9,7 +9,12 @@
9
9
  "userInterfaceStyle": "automatic",
10
10
  "newArchEnabled": true,
11
11
  "ios": {
12
- "supportsTablet": true
12
+ "supportsTablet": true,
13
+ "infoPlist": {
14
+ "NSAppTransportSecurity": {
15
+ "NSAllowsLocalNetworking": true
16
+ }
17
+ }
13
18
  },
14
19
  "android": {
15
20
  "adaptiveIcon": {
@@ -3,7 +3,7 @@ import { expoClient } from "@better-auth/expo/client";
3
3
  import * as SecureStore from "expo-secure-store";
4
4
 
5
5
  export const authClient = createAuthClient({
6
- baseURL: process.env.EXPO_PUBLIC_BETTER_AUTH_URL || "http://localhost:3000",
6
+ baseURL: process.env.EXPO_PUBLIC_BETTER_AUTH_URL || "https://platform.local",
7
7
  plugins: [
8
8
  expoClient({
9
9
  scheme: "mobile",
@@ -2,17 +2,22 @@ import { createORPCClient } from '@orpc/client'
2
2
  import { RPCLink } from '@orpc/client/fetch'
3
3
  import { RouterClient } from '@orpc/server'
4
4
  import { router } from '@workspace/orpc/router'
5
+ import { authClient } from './auth-client'
5
6
 
6
7
  export const link = new RPCLink({
7
- url: `http://localhost:3000/api/rpc`,
8
+ url: `https://platform.local/api/rpc`,
8
9
  async fetch(request, init) {
9
10
  const { fetch } = await import('expo/fetch')
10
-
11
+ const headers = new Map<string, string>();
12
+ const cookies = authClient.getCookie();
13
+ if (cookies) {
14
+ headers.set("Cookie", cookies);
15
+ }
16
+
11
17
  const resp = await fetch(request.url, {
12
- body: await request.blob(),
13
- headers: request.headers,
18
+ body: request.body,
19
+ headers: Object.fromEntries(headers),
14
20
  method: request.method,
15
- signal: request.signal,
16
21
  ...init,
17
22
  })
18
23
 
@@ -23,8 +23,8 @@
23
23
  "@react-navigation/native": "^7.1.8",
24
24
  "@tanstack/react-form": "^1.29.1",
25
25
  "@tanstack/react-query": "^5.100.5",
26
- "@workspace/orpc": "^0.0.0",
27
- "@workspace/ui": "^0.0.0",
26
+ "@workspace/orpc": "workspace:*",
27
+ "@workspace/ui": "workspace:*",
28
28
  "better-auth": "^1.6.9",
29
29
  "expo": "^55.0.17",
30
30
  "expo-constants": "~55.0.15",
@@ -40,14 +40,15 @@
40
40
  "expo-symbols": "~55.0.7",
41
41
  "expo-system-ui": "~55.0.16",
42
42
  "expo-web-browser": "~55.0.14",
43
- "react-native": "^0.84.0",
43
+ "react": "19.2.5",
44
+ "react-dom": "19.2.5",
45
+ "react-native": "0.83.6",
44
46
  "react-native-gesture-handler": "~2.30.0",
45
47
  "react-native-reanimated": "4.2.1",
46
48
  "react-native-safe-area-context": "~5.6.0",
47
49
  "react-native-screens": "~4.23.0",
48
50
  "react-native-web": "~0.21.0",
49
- "react-native-worklets": "0.7.4",
50
- "zod": "4.3.6"
51
+ "react-native-worklets": "0.7.4"
51
52
  },
52
53
  "devDependencies": {
53
54
  "babel-plugin-transform-import-meta": "^2.3.3",
File without changes
@@ -1,4 +1,4 @@
1
1
  BETTER_AUTH_SECRET=your-super-secret-key-change-this-in-production
2
- BETTER_AUTH_URL=http://localhost:3000
2
+ BETTER_AUTH_URL=https://platform.local
3
3
 
4
4
  DATABASE_URL=postgresql://postgres:postgres@localhost:5432/auth
@@ -4,7 +4,7 @@
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
7
- "dev": "vite dev --port 3000",
7
+ "dev": "portless platform vite dev",
8
8
  "build": "vite build",
9
9
  "preview": "vite preview",
10
10
  "typecheck": "tsc --noEmit",
@@ -22,12 +22,13 @@
22
22
  "@tanstack/react-router": "^1.168.24",
23
23
  "@tanstack/react-start": "^1.167.49",
24
24
  "@tanstack/router-plugin": "^1.167.27",
25
- "@workspace/auth": "*",
26
- "@workspace/orpc": "*",
27
- "@workspace/ui": "*",
25
+ "@workspace/auth": "workspace:*",
26
+ "@workspace/orpc": "workspace:*",
27
+ "@workspace/ui": "workspace:*",
28
28
  "better-auth": "^1.6.9",
29
29
  "lucide-react": "^1.11.0",
30
30
  "nitro": "latest",
31
+ "sonner": "^2.0.7",
31
32
  "tailwindcss": "^4.2.4",
32
33
  "vite-tsconfig-paths": "^6.1.1",
33
34
  "zod": "4.3.6"
@@ -35,7 +36,9 @@
35
36
  "devDependencies": {
36
37
  "@types/node": "^25.6.0",
37
38
  "@vitejs/plugin-react": "^6.0.1",
38
- "@workspace/config-typescript": "*",
39
+ "@workspace/config-typescript": "workspace:*",
40
+ "dotenv": "^17.4.2",
41
+ "drizzle-kit": "^0.31.10",
39
42
  "vite": "^8.0.10"
40
43
  }
41
44
  }
@@ -0,0 +1,3 @@
1
+ {
2
+ "name": "platform"
3
+ }
@@ -4,7 +4,6 @@ import { routeTree } from "./routeTree.gen";
4
4
  export function getRouter() {
5
5
  const router = createTanStackRouter({
6
6
  routeTree,
7
-
8
7
  scrollRestoration: true,
9
8
  defaultPreload: "intent",
10
9
  defaultPreloadStaleTime: 0,