@getpara/cli 2.15.0

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 (331) hide show
  1. package/README.md +97 -0
  2. package/dist/api/client.d.ts +49 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +247 -0
  5. package/dist/api/errors.d.ts +9 -0
  6. package/dist/api/errors.d.ts.map +1 -0
  7. package/dist/api/errors.js +29 -0
  8. package/dist/api/types.d.ts +155 -0
  9. package/dist/api/types.d.ts.map +1 -0
  10. package/dist/api/types.js +58 -0
  11. package/dist/auth/polling-flow.d.ts +7 -0
  12. package/dist/auth/polling-flow.d.ts.map +1 -0
  13. package/dist/auth/polling-flow.js +94 -0
  14. package/dist/auth/session-manager.d.ts +7 -0
  15. package/dist/auth/session-manager.d.ts.map +1 -0
  16. package/dist/auth/session-manager.js +42 -0
  17. package/dist/cli.d.ts +16 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +151 -0
  20. package/dist/commands/auth/index.d.ts +3 -0
  21. package/dist/commands/auth/index.d.ts.map +1 -0
  22. package/dist/commands/auth/index.js +18 -0
  23. package/dist/commands/auth/login.d.ts +3 -0
  24. package/dist/commands/auth/login.d.ts.map +1 -0
  25. package/dist/commands/auth/login.js +70 -0
  26. package/dist/commands/auth/logout.d.ts +3 -0
  27. package/dist/commands/auth/logout.d.ts.map +1 -0
  28. package/dist/commands/auth/logout.js +45 -0
  29. package/dist/commands/auth/status.d.ts +3 -0
  30. package/dist/commands/auth/status.d.ts.map +1 -0
  31. package/dist/commands/auth/status.js +54 -0
  32. package/dist/commands/config.d.ts +3 -0
  33. package/dist/commands/config.d.ts.map +1 -0
  34. package/dist/commands/config.js +122 -0
  35. package/dist/commands/create.d.ts +3 -0
  36. package/dist/commands/create.d.ts.map +1 -0
  37. package/dist/commands/create.js +587 -0
  38. package/dist/commands/doctor.d.ts +3 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +67 -0
  41. package/dist/commands/init.d.ts +3 -0
  42. package/dist/commands/init.d.ts.map +1 -0
  43. package/dist/commands/init.js +45 -0
  44. package/dist/commands/keys/archive.d.ts +3 -0
  45. package/dist/commands/keys/archive.d.ts.map +1 -0
  46. package/dist/commands/keys/archive.js +49 -0
  47. package/dist/commands/keys/config/branding.d.ts +23 -0
  48. package/dist/commands/keys/config/branding.d.ts.map +1 -0
  49. package/dist/commands/keys/config/branding.js +246 -0
  50. package/dist/commands/keys/config/categories.d.ts +15 -0
  51. package/dist/commands/keys/config/categories.d.ts.map +1 -0
  52. package/dist/commands/keys/config/categories.js +67 -0
  53. package/dist/commands/keys/config/index.d.ts +3 -0
  54. package/dist/commands/keys/config/index.d.ts.map +1 -0
  55. package/dist/commands/keys/config/index.js +56 -0
  56. package/dist/commands/keys/config/ramps.d.ts +18 -0
  57. package/dist/commands/keys/config/ramps.d.ts.map +1 -0
  58. package/dist/commands/keys/config/ramps.js +185 -0
  59. package/dist/commands/keys/config/security.d.ts +15 -0
  60. package/dist/commands/keys/config/security.d.ts.map +1 -0
  61. package/dist/commands/keys/config/security.js +212 -0
  62. package/dist/commands/keys/config/setup.d.ts +16 -0
  63. package/dist/commands/keys/config/setup.d.ts.map +1 -0
  64. package/dist/commands/keys/config/setup.js +235 -0
  65. package/dist/commands/keys/config/webhooks.d.ts +18 -0
  66. package/dist/commands/keys/config/webhooks.d.ts.map +1 -0
  67. package/dist/commands/keys/config/webhooks.js +279 -0
  68. package/dist/commands/keys/create.d.ts +3 -0
  69. package/dist/commands/keys/create.d.ts.map +1 -0
  70. package/dist/commands/keys/create.js +64 -0
  71. package/dist/commands/keys/get.d.ts +3 -0
  72. package/dist/commands/keys/get.d.ts.map +1 -0
  73. package/dist/commands/keys/get.js +91 -0
  74. package/dist/commands/keys/index.d.ts +3 -0
  75. package/dist/commands/keys/index.d.ts.map +1 -0
  76. package/dist/commands/keys/index.js +22 -0
  77. package/dist/commands/keys/list.d.ts +3 -0
  78. package/dist/commands/keys/list.d.ts.map +1 -0
  79. package/dist/commands/keys/list.js +66 -0
  80. package/dist/commands/keys/rotate.d.ts +3 -0
  81. package/dist/commands/keys/rotate.d.ts.map +1 -0
  82. package/dist/commands/keys/rotate.js +59 -0
  83. package/dist/commands/orgs/index.d.ts +3 -0
  84. package/dist/commands/orgs/index.d.ts.map +1 -0
  85. package/dist/commands/orgs/index.js +15 -0
  86. package/dist/commands/orgs/list.d.ts +3 -0
  87. package/dist/commands/orgs/list.d.ts.map +1 -0
  88. package/dist/commands/orgs/list.js +53 -0
  89. package/dist/commands/orgs/switch.d.ts +3 -0
  90. package/dist/commands/orgs/switch.d.ts.map +1 -0
  91. package/dist/commands/orgs/switch.js +61 -0
  92. package/dist/commands/projects/archive.d.ts +3 -0
  93. package/dist/commands/projects/archive.d.ts.map +1 -0
  94. package/dist/commands/projects/archive.js +51 -0
  95. package/dist/commands/projects/create.d.ts +3 -0
  96. package/dist/commands/projects/create.d.ts.map +1 -0
  97. package/dist/commands/projects/create.js +48 -0
  98. package/dist/commands/projects/index.d.ts +3 -0
  99. package/dist/commands/projects/index.d.ts.map +1 -0
  100. package/dist/commands/projects/index.js +25 -0
  101. package/dist/commands/projects/list.d.ts +3 -0
  102. package/dist/commands/projects/list.d.ts.map +1 -0
  103. package/dist/commands/projects/list.js +52 -0
  104. package/dist/commands/projects/restore.d.ts +3 -0
  105. package/dist/commands/projects/restore.d.ts.map +1 -0
  106. package/dist/commands/projects/restore.js +36 -0
  107. package/dist/commands/projects/switch.d.ts +3 -0
  108. package/dist/commands/projects/switch.d.ts.map +1 -0
  109. package/dist/commands/projects/switch.js +57 -0
  110. package/dist/commands/projects/update.d.ts +3 -0
  111. package/dist/commands/projects/update.d.ts.map +1 -0
  112. package/dist/commands/projects/update.js +67 -0
  113. package/dist/commands/whoami.d.ts +3 -0
  114. package/dist/commands/whoami.d.ts.map +1 -0
  115. package/dist/commands/whoami.js +61 -0
  116. package/dist/config/config-manager.d.ts +3 -0
  117. package/dist/config/config-manager.d.ts.map +1 -0
  118. package/dist/config/config-manager.js +32 -0
  119. package/dist/config/config-store.d.ts +10 -0
  120. package/dist/config/config-store.d.ts.map +1 -0
  121. package/dist/config/config-store.js +37 -0
  122. package/dist/config/credential-store.d.ts +12 -0
  123. package/dist/config/credential-store.d.ts.map +1 -0
  124. package/dist/config/credential-store.js +94 -0
  125. package/dist/config/paths.d.ts +5 -0
  126. package/dist/config/paths.d.ts.map +1 -0
  127. package/dist/config/paths.js +29 -0
  128. package/dist/config/project-config.d.ts +8 -0
  129. package/dist/config/project-config.d.ts.map +1 -0
  130. package/dist/config/project-config.js +41 -0
  131. package/dist/core/constants.d.ts +27 -0
  132. package/dist/core/constants.d.ts.map +1 -0
  133. package/dist/core/constants.js +60 -0
  134. package/dist/core/error-handler.d.ts +24 -0
  135. package/dist/core/error-handler.d.ts.map +1 -0
  136. package/dist/core/error-handler.js +83 -0
  137. package/dist/core/types.d.ts +21 -0
  138. package/dist/core/types.d.ts.map +1 -0
  139. package/dist/core/types.js +0 -0
  140. package/dist/core/update-check.d.ts +6 -0
  141. package/dist/core/update-check.d.ts.map +1 -0
  142. package/dist/core/update-check.js +78 -0
  143. package/dist/diagnostics/checks/chain-dependencies.d.ts +2 -0
  144. package/dist/diagnostics/checks/chain-dependencies.d.ts.map +1 -0
  145. package/dist/diagnostics/checks/chain-dependencies.js +130 -0
  146. package/dist/diagnostics/checks/css-import.d.ts +2 -0
  147. package/dist/diagnostics/checks/css-import.d.ts.map +1 -0
  148. package/dist/diagnostics/checks/css-import.js +57 -0
  149. package/dist/diagnostics/checks/deprecated-packages.d.ts +2 -0
  150. package/dist/diagnostics/checks/deprecated-packages.d.ts.map +1 -0
  151. package/dist/diagnostics/checks/deprecated-packages.js +93 -0
  152. package/dist/diagnostics/checks/env-api-key.d.ts +2 -0
  153. package/dist/diagnostics/checks/env-api-key.d.ts.map +1 -0
  154. package/dist/diagnostics/checks/env-api-key.js +75 -0
  155. package/dist/diagnostics/checks/env-var-prefix.d.ts +2 -0
  156. package/dist/diagnostics/checks/env-var-prefix.d.ts.map +1 -0
  157. package/dist/diagnostics/checks/env-var-prefix.js +52 -0
  158. package/dist/diagnostics/checks/index.d.ts +13 -0
  159. package/dist/diagnostics/checks/index.d.ts.map +1 -0
  160. package/dist/diagnostics/checks/index.js +32 -0
  161. package/dist/diagnostics/checks/para-provider.d.ts +2 -0
  162. package/dist/diagnostics/checks/para-provider.d.ts.map +1 -0
  163. package/dist/diagnostics/checks/para-provider.js +42 -0
  164. package/dist/diagnostics/checks/query-client.d.ts +2 -0
  165. package/dist/diagnostics/checks/query-client.d.ts.map +1 -0
  166. package/dist/diagnostics/checks/query-client.js +58 -0
  167. package/dist/diagnostics/checks/use-client-directive.d.ts +2 -0
  168. package/dist/diagnostics/checks/use-client-directive.d.ts.map +1 -0
  169. package/dist/diagnostics/checks/use-client-directive.js +81 -0
  170. package/dist/diagnostics/checks/version-consistency.d.ts +2 -0
  171. package/dist/diagnostics/checks/version-consistency.d.ts.map +1 -0
  172. package/dist/diagnostics/checks/version-consistency.js +93 -0
  173. package/dist/diagnostics/context.d.ts +3 -0
  174. package/dist/diagnostics/context.d.ts.map +1 -0
  175. package/dist/diagnostics/context.js +56 -0
  176. package/dist/diagnostics/detectors/framework.d.ts +5 -0
  177. package/dist/diagnostics/detectors/framework.d.ts.map +1 -0
  178. package/dist/diagnostics/detectors/framework.js +73 -0
  179. package/dist/diagnostics/detectors/package-manager.d.ts +3 -0
  180. package/dist/diagnostics/detectors/package-manager.d.ts.map +1 -0
  181. package/dist/diagnostics/detectors/package-manager.js +17 -0
  182. package/dist/diagnostics/detectors/sdk.d.ts +7 -0
  183. package/dist/diagnostics/detectors/sdk.d.ts.map +1 -0
  184. package/dist/diagnostics/detectors/sdk.js +48 -0
  185. package/dist/diagnostics/runner.d.ts +3 -0
  186. package/dist/diagnostics/runner.d.ts.map +1 -0
  187. package/dist/diagnostics/runner.js +44 -0
  188. package/dist/diagnostics/types.d.ts +70 -0
  189. package/dist/diagnostics/types.d.ts.map +1 -0
  190. package/dist/diagnostics/types.js +14 -0
  191. package/dist/diagnostics/utils/code-search.d.ts +10 -0
  192. package/dist/diagnostics/utils/code-search.d.ts.map +1 -0
  193. package/dist/diagnostics/utils/code-search.js +98 -0
  194. package/dist/diagnostics/utils/file-system.d.ts +7 -0
  195. package/dist/diagnostics/utils/file-system.d.ts.map +1 -0
  196. package/dist/diagnostics/utils/file-system.js +72 -0
  197. package/dist/diagnostics/utils/package-json.d.ts +12 -0
  198. package/dist/diagnostics/utils/package-json.d.ts.map +1 -0
  199. package/dist/diagnostics/utils/package-json.js +51 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.d.ts.map +1 -0
  202. package/dist/index.js +20 -0
  203. package/dist/output/formatter.d.ts +25 -0
  204. package/dist/output/formatter.d.ts.map +1 -0
  205. package/dist/output/formatter.js +76 -0
  206. package/dist/output/mask.d.ts +2 -0
  207. package/dist/output/mask.d.ts.map +1 -0
  208. package/dist/output/mask.js +15 -0
  209. package/dist/output/prompts.d.ts +25 -0
  210. package/dist/output/prompts.d.ts.map +1 -0
  211. package/dist/output/prompts.js +86 -0
  212. package/dist/output/spinner.d.ts +6 -0
  213. package/dist/output/spinner.d.ts.map +1 -0
  214. package/dist/output/spinner.js +7 -0
  215. package/dist/output/table.d.ts +9 -0
  216. package/dist/output/table.d.ts.map +1 -0
  217. package/dist/output/table.js +21 -0
  218. package/dist/scaffolding/scaffolder.d.ts +3 -0
  219. package/dist/scaffolding/scaffolder.d.ts.map +1 -0
  220. package/dist/scaffolding/scaffolder.js +78 -0
  221. package/dist/scaffolding/strategies/expo-template.d.ts +16 -0
  222. package/dist/scaffolding/strategies/expo-template.d.ts.map +1 -0
  223. package/dist/scaffolding/strategies/expo-template.js +160 -0
  224. package/dist/scaffolding/strategies/index.d.ts +5 -0
  225. package/dist/scaffolding/strategies/index.d.ts.map +1 -0
  226. package/dist/scaffolding/strategies/index.js +25 -0
  227. package/dist/scaffolding/strategies/nextjs-template.d.ts +12 -0
  228. package/dist/scaffolding/strategies/nextjs-template.d.ts.map +1 -0
  229. package/dist/scaffolding/strategies/nextjs-template.js +122 -0
  230. package/dist/scaffolding/template-renderer.d.ts +11 -0
  231. package/dist/scaffolding/template-renderer.d.ts.map +1 -0
  232. package/dist/scaffolding/template-renderer.js +99 -0
  233. package/dist/scaffolding/types.d.ts +69 -0
  234. package/dist/scaffolding/types.d.ts.map +1 -0
  235. package/dist/scaffolding/types.js +21 -0
  236. package/dist/scaffolding/utils/detect-package-manager.d.ts +23 -0
  237. package/dist/scaffolding/utils/detect-package-manager.d.ts.map +1 -0
  238. package/dist/scaffolding/utils/detect-package-manager.js +57 -0
  239. package/dist/scaffolding/utils/fs.d.ts +11 -0
  240. package/dist/scaffolding/utils/fs.d.ts.map +1 -0
  241. package/dist/scaffolding/utils/fs.js +45 -0
  242. package/dist/scaffolding/utils/resolve-para-version.d.ts +7 -0
  243. package/dist/scaffolding/utils/resolve-para-version.d.ts.map +1 -0
  244. package/dist/scaffolding/utils/resolve-para-version.js +21 -0
  245. package/dist/validation/auth-methods.d.ts +14 -0
  246. package/dist/validation/auth-methods.d.ts.map +1 -0
  247. package/dist/validation/auth-methods.js +23 -0
  248. package/dist/validation/cidr.d.ts +11 -0
  249. package/dist/validation/cidr.d.ts.map +1 -0
  250. package/dist/validation/cidr.js +35 -0
  251. package/dist/validation/hex-color.d.ts +7 -0
  252. package/dist/validation/hex-color.d.ts.map +1 -0
  253. package/dist/validation/hex-color.js +10 -0
  254. package/dist/validation/index.d.ts +9 -0
  255. package/dist/validation/index.d.ts.map +1 -0
  256. package/dist/validation/index.js +49 -0
  257. package/dist/validation/native-passkey.d.ts +31 -0
  258. package/dist/validation/native-passkey.d.ts.map +1 -0
  259. package/dist/validation/native-passkey.js +45 -0
  260. package/dist/validation/session-length.d.ts +18 -0
  261. package/dist/validation/session-length.d.ts.map +1 -0
  262. package/dist/validation/session-length.js +30 -0
  263. package/dist/validation/url.d.ts +26 -0
  264. package/dist/validation/url.d.ts.map +1 -0
  265. package/dist/validation/url.js +50 -0
  266. package/dist/validation/wallet-types.d.ts +14 -0
  267. package/dist/validation/wallet-types.d.ts.map +1 -0
  268. package/dist/validation/wallet-types.js +22 -0
  269. package/dist/validation/webhook.d.ts +4 -0
  270. package/dist/validation/webhook.d.ts.map +1 -0
  271. package/dist/validation/webhook.js +33 -0
  272. package/package.json +60 -0
  273. package/templates/expo/_env.example +3 -0
  274. package/templates/expo/_gitignore +48 -0
  275. package/templates/expo/_yarnrc.yml +1 -0
  276. package/templates/expo/app/(auth)/_layout.tsx +12 -0
  277. package/templates/expo/app/(auth)/index.tsx.template +86 -0
  278. package/templates/expo/app/(tabs)/_layout.tsx +16 -0
  279. package/templates/expo/app/(tabs)/index.tsx +112 -0
  280. package/templates/expo/app/(tabs)/send.tsx +111 -0
  281. package/templates/expo/app/_layout.tsx +17 -0
  282. package/templates/expo/app/index.tsx +22 -0
  283. package/templates/expo/app.json.template +32 -0
  284. package/templates/expo/assets/adaptive-icon.png +0 -0
  285. package/templates/expo/assets/favicon.png +0 -0
  286. package/templates/expo/assets/icon.png +0 -0
  287. package/templates/expo/assets/splash.png +0 -0
  288. package/templates/expo/babel.config.cjs +12 -0
  289. package/templates/expo/components/features/AuthForm.tsx.template +138 -0
  290. package/templates/expo/components/features/OAuthButtons.tsx.template +27 -0
  291. package/templates/expo/components/features/index.ts.template +4 -0
  292. package/templates/expo/components/ui/Button.tsx +58 -0
  293. package/templates/expo/components/ui/Card.tsx +11 -0
  294. package/templates/expo/components/ui/Divider.tsx +19 -0
  295. package/templates/expo/components/ui/Input.tsx +23 -0
  296. package/templates/expo/components/ui/WalletCard.tsx +44 -0
  297. package/templates/expo/components/ui/index.ts +5 -0
  298. package/templates/expo/eslint.config.cjs +15 -0
  299. package/templates/expo/global.css +3 -0
  300. package/templates/expo/hooks/useOneClickLogin.ts.template +161 -0
  301. package/templates/expo/hooks/useViemClient.ts +118 -0
  302. package/templates/expo/hooks/useWallets.ts +52 -0
  303. package/templates/expo/index.js +2 -0
  304. package/templates/expo/lib/auth.ts +54 -0
  305. package/templates/expo/lib/constants.ts.template +2 -0
  306. package/templates/expo/lib/para.ts +14 -0
  307. package/templates/expo/metro.config.cjs +14 -0
  308. package/templates/expo/nativewind-env.d.ts +2 -0
  309. package/templates/expo/prettier.config.cjs +10 -0
  310. package/templates/expo/providers/ParaProvider.tsx +140 -0
  311. package/templates/expo/tailwind.config.cjs +23 -0
  312. package/templates/expo/tsconfig.json +11 -0
  313. package/templates/expo/types/index.ts +28 -0
  314. package/templates/nextjs/README.md +69 -0
  315. package/templates/nextjs/_env.example +8 -0
  316. package/templates/nextjs/_gitignore +36 -0
  317. package/templates/nextjs/_yarnrc.yml +1 -0
  318. package/templates/nextjs/eslint.config.mjs +10 -0
  319. package/templates/nextjs/next.config.ts +5 -0
  320. package/templates/nextjs/postcss.config.mjs +7 -0
  321. package/templates/nextjs/public/para.svg +3 -0
  322. package/templates/nextjs/src/app/layout.tsx +30 -0
  323. package/templates/nextjs/src/app/page.tsx +40 -0
  324. package/templates/nextjs/src/components/ParaProvider.tsx +116 -0
  325. package/templates/nextjs/src/components/layout/Header.tsx +44 -0
  326. package/templates/nextjs/src/components/ui/ConnectCard.tsx +24 -0
  327. package/templates/nextjs/src/components/ui/SignMessage.tsx +53 -0
  328. package/templates/nextjs/src/components/ui/WalletInfo.tsx +22 -0
  329. package/templates/nextjs/src/hooks/useSignHelloWorld.ts +23 -0
  330. package/templates/nextjs/src/styles/globals.css +1 -0
  331. package/templates/nextjs/tsconfig.json +27 -0
@@ -0,0 +1,54 @@
1
+ import { openAuthSessionAsync } from 'expo-web-browser';
2
+ import { APP_SCHEME } from './constants';
3
+
4
+ /**
5
+ * Opens an authentication URL in the system browser with deep link callback
6
+ */
7
+ export async function openAuthUrl(url: string): Promise<{ success: boolean }> {
8
+ const authUrl = new URL(url);
9
+ authUrl.searchParams.set('nativeCallbackUrl', APP_SCHEME);
10
+
11
+ const result = await openAuthSessionAsync(authUrl.toString(), APP_SCHEME);
12
+
13
+ return {
14
+ success: result.type === 'success',
15
+ };
16
+ }
17
+
18
+ /**
19
+ * Formats a phone number for display
20
+ */
21
+ export function formatPhoneNumber(phone: string): string {
22
+ const cleaned = phone.replace(/\D/g, '');
23
+ if (cleaned.length === 10) {
24
+ return `(${cleaned.slice(0, 3)}) ${cleaned.slice(3, 6)}-${cleaned.slice(6)}`;
25
+ }
26
+ if (cleaned.length === 11 && cleaned.startsWith('1')) {
27
+ return `+1 (${cleaned.slice(1, 4)}) ${cleaned.slice(4, 7)}-${cleaned.slice(7)}`;
28
+ }
29
+ return phone;
30
+ }
31
+
32
+ /**
33
+ * Validates an email address
34
+ */
35
+ export function isValidEmail(email: string): boolean {
36
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
37
+ return emailRegex.test(email);
38
+ }
39
+
40
+ /**
41
+ * Validates a phone number (basic validation)
42
+ */
43
+ export function isValidPhone(phone: string): boolean {
44
+ const cleaned = phone.replace(/\D/g, '');
45
+ return cleaned.length >= 10 && cleaned.length <= 15;
46
+ }
47
+
48
+ /**
49
+ * Truncates an address for display
50
+ */
51
+ export function truncateAddress(address: string, chars = 6): string {
52
+ if (address.length <= chars * 2 + 3) return address;
53
+ return `${address.slice(0, chars)}...${address.slice(-chars)}`;
54
+ }
@@ -0,0 +1,2 @@
1
+ // App scheme for deep linking
2
+ export const APP_SCHEME = '{{expoScheme}}://';
@@ -0,0 +1,14 @@
1
+ import { ParaMobile, Environment } from '@getpara/react-native-wallet';
2
+
3
+ const API_KEY = process.env.EXPO_PUBLIC_PARA_API_KEY || '';
4
+ const ENVIRONMENT = (process.env.EXPO_PUBLIC_PARA_ENVIRONMENT as Environment) || Environment.BETA;
5
+
6
+ if (!API_KEY) {
7
+ console.warn('EXPO_PUBLIC_PARA_API_KEY is not set. Please add it to your environment variables.');
8
+ }
9
+
10
+ // Create Para singleton instance
11
+ // disableWorkers is required for React Native (no Web Worker support)
12
+ export const para = new ParaMobile(ENVIRONMENT, API_KEY, undefined, {
13
+ disableWorkers: true,
14
+ });
@@ -0,0 +1,14 @@
1
+ // Learn more https://docs.expo.io/guides/customizing-metro
2
+ const { getDefaultConfig } = require('expo/metro-config');
3
+ const { withNativeWind } = require('nativewind/metro');
4
+
5
+ /** @type {import('expo/metro-config').MetroConfig} */
6
+ const config = getDefaultConfig(__dirname);
7
+
8
+ // Para SDK requires crypto and buffer polyfills
9
+ config.resolver.extraNodeModules = {
10
+ crypto: require.resolve('react-native-quick-crypto'),
11
+ buffer: require.resolve('@craftzdog/react-native-buffer'),
12
+ };
13
+
14
+ module.exports = withNativeWind(config, { input: './global.css' });
@@ -0,0 +1,2 @@
1
+ // @ts-ignore
2
+ /// <reference types="nativewind/types" />
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ printWidth: 100,
3
+ tabWidth: 2,
4
+ singleQuote: true,
5
+ bracketSameLine: true,
6
+ trailingComma: 'es5',
7
+
8
+ plugins: [require.resolve('prettier-plugin-tailwindcss')],
9
+ tailwindAttributes: ['className'],
10
+ };
@@ -0,0 +1,140 @@
1
+ import { createContext, useContext, useEffect, useState, useCallback, type ReactNode } from 'react';
2
+ import { View, ActivityIndicator, Text } from 'react-native';
3
+ import { para } from '@/lib/para';
4
+ import { useWallets } from '@/hooks/useWallets';
5
+ import type { User, Wallet } from '@/types';
6
+
7
+ interface ParaContextValue {
8
+ isReady: boolean;
9
+ isAuthenticated: boolean;
10
+ isLoading: boolean;
11
+ user: User | null;
12
+ wallets: Wallet[];
13
+ logout: () => Promise<void>;
14
+ refreshAuth: () => Promise<void>;
15
+ setAuthenticated: (authenticated: boolean) => void;
16
+ }
17
+
18
+ const ParaContext = createContext<ParaContextValue | null>(null);
19
+
20
+ interface ParaProviderProps {
21
+ children: ReactNode;
22
+ }
23
+
24
+ export function ParaProvider({ children }: ParaProviderProps) {
25
+ const [isReady, setIsReady] = useState(false);
26
+ const [initError, setInitError] = useState<string | null>(null);
27
+ const [isAuthenticated, setIsAuthenticated] = useState(false);
28
+ const [isLoading, setIsLoading] = useState(true);
29
+ const [user, setUser] = useState<User | null>(null);
30
+
31
+ const { wallets, loadWallets, clearWallets } = useWallets();
32
+
33
+ const checkAuth = useCallback(async () => {
34
+ try {
35
+ setIsLoading(true);
36
+
37
+ const loggedIn = await para.isFullyLoggedIn();
38
+
39
+ if (loggedIn) {
40
+ setIsAuthenticated(true);
41
+ await loadWallets();
42
+ } else {
43
+ setIsAuthenticated(false);
44
+ setUser(null);
45
+ clearWallets();
46
+ }
47
+ } catch {
48
+ setIsAuthenticated(false);
49
+ } finally {
50
+ setIsLoading(false);
51
+ }
52
+ }, [loadWallets, clearWallets]);
53
+
54
+ const logout = useCallback(async () => {
55
+ try {
56
+ await para.logout();
57
+ setIsAuthenticated(false);
58
+ setUser(null);
59
+ clearWallets();
60
+ } catch {
61
+ // Logout failed silently
62
+ }
63
+ }, [clearWallets]);
64
+
65
+ const refreshAuth = useCallback(async () => {
66
+ await checkAuth();
67
+ }, [checkAuth]);
68
+
69
+ const setAuthenticated = useCallback(
70
+ (authenticated: boolean) => {
71
+ setIsAuthenticated(authenticated);
72
+ if (authenticated) {
73
+ loadWallets();
74
+ } else {
75
+ clearWallets();
76
+ }
77
+ },
78
+ [loadWallets, clearWallets]
79
+ );
80
+
81
+ // Initialize Para SDK, then check auth
82
+ useEffect(() => {
83
+ const initialize = async () => {
84
+ try {
85
+ await para.init();
86
+ setIsReady(true);
87
+ await checkAuth();
88
+ } catch (err) {
89
+ const message = err instanceof Error ? err.message : 'Failed to initialize Para';
90
+ setInitError(message);
91
+ }
92
+ };
93
+
94
+ initialize();
95
+ }, [checkAuth]);
96
+
97
+ if (initError) {
98
+ return (
99
+ <View className="flex-1 items-center justify-center bg-white p-6">
100
+ <Text className="mb-2 text-center text-lg font-semibold text-red-500">
101
+ Initialization Error
102
+ </Text>
103
+ <Text className="text-center text-gray-600">{initError}</Text>
104
+ </View>
105
+ );
106
+ }
107
+
108
+ if (!isReady) {
109
+ return (
110
+ <View className="flex-1 items-center justify-center bg-white">
111
+ <ActivityIndicator size="large" color="#4F46E5" />
112
+ <Text className="mt-4 text-gray-500">Initializing...</Text>
113
+ </View>
114
+ );
115
+ }
116
+
117
+ return (
118
+ <ParaContext.Provider
119
+ value={{
120
+ isReady,
121
+ isAuthenticated,
122
+ isLoading,
123
+ user,
124
+ wallets,
125
+ logout,
126
+ refreshAuth,
127
+ setAuthenticated,
128
+ }}>
129
+ {children}
130
+ </ParaContext.Provider>
131
+ );
132
+ }
133
+
134
+ export function usePara() {
135
+ const context = useContext(ParaContext);
136
+ if (!context) {
137
+ throw new Error('usePara must be used within a ParaProvider');
138
+ }
139
+ return context;
140
+ }
@@ -0,0 +1,23 @@
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: ['./app/**/*.{js,ts,tsx}', './components/**/*.{js,ts,tsx}'],
4
+
5
+ presets: [require('nativewind/preset')],
6
+ theme: {
7
+ extend: {
8
+ colors: {
9
+ brand: {
10
+ 50: '#fff4ed',
11
+ 100: '#ffe6d5',
12
+ 200: '#ffc9a6',
13
+ 300: '#ffa36d',
14
+ 400: '#ff7635',
15
+ 500: '#ff4e00',
16
+ 600: '#f03d00',
17
+ 700: '#c72c00',
18
+ },
19
+ },
20
+ },
21
+ },
22
+ plugins: [],
23
+ };
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "expo/tsconfig.base",
3
+ "compilerOptions": {
4
+ "strict": true,
5
+ "baseUrl": ".",
6
+ "paths": {
7
+ "@/*": ["*"]
8
+ }
9
+ },
10
+ "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", "nativewind-env.d.ts"]
11
+ }
@@ -0,0 +1,28 @@
1
+ // Auth types
2
+ export type AuthMethod = 'email' | 'phone' | 'google';
3
+
4
+ export type AuthStatus = 'idle' | 'loading' | 'verifying' | 'completing' | 'success' | 'error';
5
+
6
+ export interface AuthState {
7
+ isAuthenticated: boolean;
8
+ isLoading: boolean;
9
+ user: User | null;
10
+ }
11
+
12
+ export interface User {
13
+ id: string;
14
+ email?: string;
15
+ phone?: string;
16
+ }
17
+
18
+ export interface Wallet {
19
+ id: string;
20
+ address: string;
21
+ type: string;
22
+ }
23
+
24
+ // One-click login types
25
+ export interface OneClickLoginResult {
26
+ success: boolean;
27
+ error?: string;
28
+ }
@@ -0,0 +1,69 @@
1
+ # {{appName}}
2
+
3
+ A Next.js application with Para SDK integration, created with `@getpara/create-para-app`.
4
+
5
+ ## Getting Started
6
+
7
+ 1. **Set up environment variables:**
8
+
9
+ ```bash
10
+ cp .env.example .env
11
+ ```
12
+
13
+ Edit `.env` and add your Para API key:
14
+ ```
15
+ NEXT_PUBLIC_PARA_API_KEY=your_api_key_here
16
+ ```
17
+
18
+ Get your API key at [developer.getpara.com](https://developer.getpara.com).
19
+
20
+ 2. **Install dependencies:**
21
+
22
+ ```bash
23
+ npm install
24
+ ```
25
+
26
+ 3. **Run the development server:**
27
+
28
+ ```bash
29
+ npm run dev
30
+ ```
31
+
32
+ 4. Open [http://localhost:3000](http://localhost:3000) in your browser.
33
+
34
+ ## Project Structure
35
+
36
+ ```
37
+ src/
38
+ ├── app/
39
+ │ ├── layout.tsx # Root layout with ParaProvider
40
+ │ └── page.tsx # Home page with auth flow
41
+ ├── components/
42
+ │ ├── ParaProvider.tsx # Para SDK configuration
43
+ │ ├── layout/
44
+ │ │ └── Header.tsx # Navigation header
45
+ │ └── ui/
46
+ │ ├── ConnectCard.tsx # Connect wallet card
47
+ │ ├── WalletInfo.tsx # Wallet display
48
+ │ └── SignMessage.tsx # Message signing
49
+ └── hooks/
50
+ └── useSignHelloWorld.ts # Signing hook
51
+ ```
52
+
53
+ ## Available Scripts
54
+
55
+ - `npm run dev` - Start development server
56
+ - `npm run build` - Build for production
57
+ - `npm run start` - Start production server
58
+ - `npm run lint` - Run ESLint
59
+ - `npm run typecheck` - Run TypeScript type checking
60
+
61
+ ## Learn More
62
+
63
+ - [Para Documentation](https://docs.getpara.com)
64
+ - [Para React SDK](https://docs.getpara.com/react-sdk)
65
+ - [Next.js Documentation](https://nextjs.org/docs)
66
+
67
+ ## License
68
+
69
+ MIT
@@ -0,0 +1,8 @@
1
+ # Para API Configuration
2
+ # Get your API key at https://developer.getpara.com
3
+ NEXT_PUBLIC_PARA_API_KEY=your_api_key_here
4
+ NEXT_PUBLIC_PARA_ENVIRONMENT=BETA
5
+
6
+ # WalletConnect Project ID (required for WalletConnect integration)
7
+ # Get your project ID at https://cloud.walletconnect.com
8
+ NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=
@@ -0,0 +1,36 @@
1
+ # dependencies
2
+ node_modules
3
+ .pnp
4
+ .pnp.js
5
+
6
+ # testing
7
+ coverage
8
+
9
+ # next.js
10
+ .next/
11
+ out/
12
+ build
13
+
14
+ # misc
15
+ .DS_Store
16
+ *.pem
17
+
18
+ # debug
19
+ npm-debug.log*
20
+ yarn-debug.log*
21
+ yarn-error.log*
22
+ .pnpm-debug.log*
23
+
24
+ # env files
25
+ .env
26
+ .env.local
27
+ .env.development.local
28
+ .env.test.local
29
+ .env.production.local
30
+
31
+ # vercel
32
+ .vercel
33
+
34
+ # typescript
35
+ *.tsbuildinfo
36
+ next-env.d.ts
@@ -0,0 +1 @@
1
+ nodeLinker: node-modules
@@ -0,0 +1,10 @@
1
+ import js from '@eslint/js';
2
+ import tseslint from 'typescript-eslint';
3
+
4
+ export default tseslint.config(
5
+ js.configs.recommended,
6
+ ...tseslint.configs.recommended,
7
+ {
8
+ ignores: ['.next/*', 'node_modules/*'],
9
+ },
10
+ );
@@ -0,0 +1,5 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ const nextConfig: NextConfig = {};
4
+
5
+ export default nextConfig;
@@ -0,0 +1,7 @@
1
+ const config = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
6
+
7
+ export default config;
@@ -0,0 +1,3 @@
1
+ <svg width="216" height="204" viewBox="0 0 216 204" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M60 0H144C183.764 0 216 32.2355 216 72C216 111.765 183.764 144 144 144H96C82.7452 144 72 154.745 72 168V204H0V132H36C49.2548 132 60 121.255 60 108L60 0Z" fill="black"/>
3
+ </svg>
@@ -0,0 +1,30 @@
1
+ import type { Metadata } from "next";
2
+ import { Inter } from "next/font/google";
3
+ import "@/styles/globals.css";
4
+ import "@getpara/react-sdk/styles.css";
5
+ import { ParaProvider } from "@/components/ParaProvider";
6
+ import { Header } from "@/components/layout/Header";
7
+
8
+ const inter = Inter({ subsets: ["latin"] });
9
+
10
+ export const metadata: Metadata = {
11
+ title: "{{appName}}",
12
+ description: "Built with Para SDK",
13
+ };
14
+
15
+ export default function RootLayout({
16
+ children,
17
+ }: Readonly<{
18
+ children: React.ReactNode;
19
+ }>) {
20
+ return (
21
+ <html lang="en">
22
+ <body className={inter.className}>
23
+ <ParaProvider>
24
+ <Header />
25
+ {children}
26
+ </ParaProvider>
27
+ </body>
28
+ </html>
29
+ );
30
+ }
@@ -0,0 +1,40 @@
1
+ "use client";
2
+
3
+ import { useModal, useAccount } from "@getpara/react-sdk";
4
+ import { useSignHelloWorld } from "@/hooks/useSignHelloWorld";
5
+ import { ConnectCard } from "@/components/ui/ConnectCard";
6
+ import { WalletInfo } from "@/components/ui/WalletInfo";
7
+ import { SignMessage } from "@/components/ui/SignMessage";
8
+
9
+ export default function Home() {
10
+ const { openModal } = useModal();
11
+ const { isConnected } = useAccount();
12
+ const { sign, message, isPending, error, signature } = useSignHelloWorld();
13
+
14
+ return (
15
+ <div className="container mx-auto px-4 py-12">
16
+ <div className="text-center mb-12">
17
+ <h1 className="text-4xl font-bold tracking-tight mb-4">{{appName}}</h1>
18
+ <p className="text-lg text-gray-600 max-w-3xl mx-auto">
19
+ Sign messages with your Para wallet. This example demonstrates the
20
+ simplest integration using Para&apos;s built-in modal and React SDK hooks.
21
+ </p>
22
+ </div>
23
+
24
+ {!isConnected ? (
25
+ <ConnectCard onConnect={openModal} />
26
+ ) : (
27
+ <div className="max-w-xl mx-auto">
28
+ <WalletInfo />
29
+ <SignMessage
30
+ message={message}
31
+ onSign={sign}
32
+ isPending={isPending}
33
+ error={error}
34
+ signature={signature}
35
+ />
36
+ </div>
37
+ )}
38
+ </div>
39
+ );
40
+ }
@@ -0,0 +1,116 @@
1
+ "use client";
2
+
3
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4
+ import { Environment, ParaProvider as ParaSDKProvider } from "@getpara/react-sdk";
5
+ // @if:evm
6
+ import { sepolia } from "wagmi/chains";
7
+ // @endif
8
+ // @if:cosmos
9
+ import { cosmoshub, osmosis, noble } from "graz/chains";
10
+ // @endif
11
+ // @if:solana
12
+ import { WalletAdapterNetwork } from "@solana/wallet-adapter-base";
13
+ import { clusterApiUrl } from "@solana/web3.js";
14
+ // @endif
15
+
16
+ const API_KEY = process.env.NEXT_PUBLIC_PARA_API_KEY ?? "";
17
+ const ENVIRONMENT = (process.env.NEXT_PUBLIC_PARA_ENVIRONMENT as Environment) || Environment.BETA;
18
+
19
+ const queryClient = new QueryClient();
20
+
21
+ // @if:cosmos
22
+ const cosmosChains = [cosmoshub, osmosis, noble];
23
+ // @endif
24
+ // @if:solana
25
+ const solanaNetwork = WalletAdapterNetwork.Devnet;
26
+ const endpoint = clusterApiUrl(solanaNetwork);
27
+ // @endif
28
+
29
+ export function ParaProvider({ children }: { children: React.ReactNode }) {
30
+ if (!API_KEY) {
31
+ return (
32
+ <div style={{ padding: "20px", textAlign: "center" }}>
33
+ <h2>Missing API Key</h2>
34
+ <p>Please set NEXT_PUBLIC_PARA_API_KEY in your .env file.</p>
35
+ <p>
36
+ Get your API key at{" "}
37
+ <a href="https://developer.getpara.com" target="_blank" rel="noopener noreferrer">
38
+ developer.getpara.com
39
+ </a>
40
+ </p>
41
+ </div>
42
+ );
43
+ }
44
+
45
+ return (
46
+ <QueryClientProvider client={queryClient}>
47
+ <ParaSDKProvider
48
+ paraClientConfig={{
49
+ apiKey: API_KEY,
50
+ env: ENVIRONMENT,
51
+ }}
52
+ // @if:hasExternalWallets
53
+ externalWalletConfig={{
54
+ wallets: [
55
+ // @inject:wallets
56
+ ],
57
+ // @if:evm
58
+ evmConnector: {
59
+ config: {
60
+ chains: [sepolia],
61
+ },
62
+ },
63
+ walletConnect: {
64
+ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID || "",
65
+ },
66
+ // @endif
67
+ // @if:cosmos
68
+ cosmosConnector: {
69
+ config: {
70
+ chains: cosmosChains,
71
+ selectedChainId: cosmoshub.chainId,
72
+ multiChain: false,
73
+ onSwitchChain: (chainId) => {
74
+ console.log("Switched chain to:", chainId);
75
+ },
76
+ },
77
+ },
78
+ // @endif
79
+ // @if:solana
80
+ solanaConnector: {
81
+ config: {
82
+ endpoint,
83
+ chain: solanaNetwork,
84
+ appIdentity: {
85
+ uri: typeof window !== "undefined" ? `${window.location.protocol}//${window.location.host}` : "",
86
+ },
87
+ },
88
+ },
89
+ // @endif
90
+ }}
91
+ // @endif
92
+ config={{ appName: "{{appName}}" }}
93
+ paraModalConfig={{
94
+ disableEmailLogin: {{disableEmail}},
95
+ disablePhoneLogin: {{disablePhone}},
96
+ authLayout: ["AUTH:FULL", "EXTERNAL:FULL"],
97
+ oAuthMethods: [{{oauthMethods}}],
98
+ theme: {
99
+ foregroundColor: "#222222",
100
+ backgroundColor: "#FFFFFF",
101
+ accentColor: "#888888",
102
+ darkForegroundColor: "#EEEEEE",
103
+ darkBackgroundColor: "#111111",
104
+ darkAccentColor: "#AAAAAA",
105
+ mode: "light",
106
+ borderRadius: "none",
107
+ font: "Inter",
108
+ },
109
+ recoverySecretStepEnabled: true,
110
+ twoFactorAuthEnabled: false,
111
+ }}>
112
+ {children}
113
+ </ParaSDKProvider>
114
+ </QueryClientProvider>
115
+ );
116
+ }