@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.
- package/README.md +97 -0
- package/dist/api/client.d.ts +49 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +247 -0
- package/dist/api/errors.d.ts +9 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +29 -0
- package/dist/api/types.d.ts +155 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +58 -0
- package/dist/auth/polling-flow.d.ts +7 -0
- package/dist/auth/polling-flow.d.ts.map +1 -0
- package/dist/auth/polling-flow.js +94 -0
- package/dist/auth/session-manager.d.ts +7 -0
- package/dist/auth/session-manager.d.ts.map +1 -0
- package/dist/auth/session-manager.js +42 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +151 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +18 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +70 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +45 -0
- package/dist/commands/auth/status.d.ts +3 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +54 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +122 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +587 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +67 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +45 -0
- package/dist/commands/keys/archive.d.ts +3 -0
- package/dist/commands/keys/archive.d.ts.map +1 -0
- package/dist/commands/keys/archive.js +49 -0
- package/dist/commands/keys/config/branding.d.ts +23 -0
- package/dist/commands/keys/config/branding.d.ts.map +1 -0
- package/dist/commands/keys/config/branding.js +246 -0
- package/dist/commands/keys/config/categories.d.ts +15 -0
- package/dist/commands/keys/config/categories.d.ts.map +1 -0
- package/dist/commands/keys/config/categories.js +67 -0
- package/dist/commands/keys/config/index.d.ts +3 -0
- package/dist/commands/keys/config/index.d.ts.map +1 -0
- package/dist/commands/keys/config/index.js +56 -0
- package/dist/commands/keys/config/ramps.d.ts +18 -0
- package/dist/commands/keys/config/ramps.d.ts.map +1 -0
- package/dist/commands/keys/config/ramps.js +185 -0
- package/dist/commands/keys/config/security.d.ts +15 -0
- package/dist/commands/keys/config/security.d.ts.map +1 -0
- package/dist/commands/keys/config/security.js +212 -0
- package/dist/commands/keys/config/setup.d.ts +16 -0
- package/dist/commands/keys/config/setup.d.ts.map +1 -0
- package/dist/commands/keys/config/setup.js +235 -0
- package/dist/commands/keys/config/webhooks.d.ts +18 -0
- package/dist/commands/keys/config/webhooks.d.ts.map +1 -0
- package/dist/commands/keys/config/webhooks.js +279 -0
- package/dist/commands/keys/create.d.ts +3 -0
- package/dist/commands/keys/create.d.ts.map +1 -0
- package/dist/commands/keys/create.js +64 -0
- package/dist/commands/keys/get.d.ts +3 -0
- package/dist/commands/keys/get.d.ts.map +1 -0
- package/dist/commands/keys/get.js +91 -0
- package/dist/commands/keys/index.d.ts +3 -0
- package/dist/commands/keys/index.d.ts.map +1 -0
- package/dist/commands/keys/index.js +22 -0
- package/dist/commands/keys/list.d.ts +3 -0
- package/dist/commands/keys/list.d.ts.map +1 -0
- package/dist/commands/keys/list.js +66 -0
- package/dist/commands/keys/rotate.d.ts +3 -0
- package/dist/commands/keys/rotate.d.ts.map +1 -0
- package/dist/commands/keys/rotate.js +59 -0
- package/dist/commands/orgs/index.d.ts +3 -0
- package/dist/commands/orgs/index.d.ts.map +1 -0
- package/dist/commands/orgs/index.js +15 -0
- package/dist/commands/orgs/list.d.ts +3 -0
- package/dist/commands/orgs/list.d.ts.map +1 -0
- package/dist/commands/orgs/list.js +53 -0
- package/dist/commands/orgs/switch.d.ts +3 -0
- package/dist/commands/orgs/switch.d.ts.map +1 -0
- package/dist/commands/orgs/switch.js +61 -0
- package/dist/commands/projects/archive.d.ts +3 -0
- package/dist/commands/projects/archive.d.ts.map +1 -0
- package/dist/commands/projects/archive.js +51 -0
- package/dist/commands/projects/create.d.ts +3 -0
- package/dist/commands/projects/create.d.ts.map +1 -0
- package/dist/commands/projects/create.js +48 -0
- package/dist/commands/projects/index.d.ts +3 -0
- package/dist/commands/projects/index.d.ts.map +1 -0
- package/dist/commands/projects/index.js +25 -0
- package/dist/commands/projects/list.d.ts +3 -0
- package/dist/commands/projects/list.d.ts.map +1 -0
- package/dist/commands/projects/list.js +52 -0
- package/dist/commands/projects/restore.d.ts +3 -0
- package/dist/commands/projects/restore.d.ts.map +1 -0
- package/dist/commands/projects/restore.js +36 -0
- package/dist/commands/projects/switch.d.ts +3 -0
- package/dist/commands/projects/switch.d.ts.map +1 -0
- package/dist/commands/projects/switch.js +57 -0
- package/dist/commands/projects/update.d.ts +3 -0
- package/dist/commands/projects/update.d.ts.map +1 -0
- package/dist/commands/projects/update.js +67 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +61 -0
- package/dist/config/config-manager.d.ts +3 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +32 -0
- package/dist/config/config-store.d.ts +10 -0
- package/dist/config/config-store.d.ts.map +1 -0
- package/dist/config/config-store.js +37 -0
- package/dist/config/credential-store.d.ts +12 -0
- package/dist/config/credential-store.d.ts.map +1 -0
- package/dist/config/credential-store.js +94 -0
- package/dist/config/paths.d.ts +5 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +29 -0
- package/dist/config/project-config.d.ts +8 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +41 -0
- package/dist/core/constants.d.ts +27 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +60 -0
- package/dist/core/error-handler.d.ts +24 -0
- package/dist/core/error-handler.d.ts.map +1 -0
- package/dist/core/error-handler.js +83 -0
- package/dist/core/types.d.ts +21 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +0 -0
- package/dist/core/update-check.d.ts +6 -0
- package/dist/core/update-check.d.ts.map +1 -0
- package/dist/core/update-check.js +78 -0
- package/dist/diagnostics/checks/chain-dependencies.d.ts +2 -0
- package/dist/diagnostics/checks/chain-dependencies.d.ts.map +1 -0
- package/dist/diagnostics/checks/chain-dependencies.js +130 -0
- package/dist/diagnostics/checks/css-import.d.ts +2 -0
- package/dist/diagnostics/checks/css-import.d.ts.map +1 -0
- package/dist/diagnostics/checks/css-import.js +57 -0
- package/dist/diagnostics/checks/deprecated-packages.d.ts +2 -0
- package/dist/diagnostics/checks/deprecated-packages.d.ts.map +1 -0
- package/dist/diagnostics/checks/deprecated-packages.js +93 -0
- package/dist/diagnostics/checks/env-api-key.d.ts +2 -0
- package/dist/diagnostics/checks/env-api-key.d.ts.map +1 -0
- package/dist/diagnostics/checks/env-api-key.js +75 -0
- package/dist/diagnostics/checks/env-var-prefix.d.ts +2 -0
- package/dist/diagnostics/checks/env-var-prefix.d.ts.map +1 -0
- package/dist/diagnostics/checks/env-var-prefix.js +52 -0
- package/dist/diagnostics/checks/index.d.ts +13 -0
- package/dist/diagnostics/checks/index.d.ts.map +1 -0
- package/dist/diagnostics/checks/index.js +32 -0
- package/dist/diagnostics/checks/para-provider.d.ts +2 -0
- package/dist/diagnostics/checks/para-provider.d.ts.map +1 -0
- package/dist/diagnostics/checks/para-provider.js +42 -0
- package/dist/diagnostics/checks/query-client.d.ts +2 -0
- package/dist/diagnostics/checks/query-client.d.ts.map +1 -0
- package/dist/diagnostics/checks/query-client.js +58 -0
- package/dist/diagnostics/checks/use-client-directive.d.ts +2 -0
- package/dist/diagnostics/checks/use-client-directive.d.ts.map +1 -0
- package/dist/diagnostics/checks/use-client-directive.js +81 -0
- package/dist/diagnostics/checks/version-consistency.d.ts +2 -0
- package/dist/diagnostics/checks/version-consistency.d.ts.map +1 -0
- package/dist/diagnostics/checks/version-consistency.js +93 -0
- package/dist/diagnostics/context.d.ts +3 -0
- package/dist/diagnostics/context.d.ts.map +1 -0
- package/dist/diagnostics/context.js +56 -0
- package/dist/diagnostics/detectors/framework.d.ts +5 -0
- package/dist/diagnostics/detectors/framework.d.ts.map +1 -0
- package/dist/diagnostics/detectors/framework.js +73 -0
- package/dist/diagnostics/detectors/package-manager.d.ts +3 -0
- package/dist/diagnostics/detectors/package-manager.d.ts.map +1 -0
- package/dist/diagnostics/detectors/package-manager.js +17 -0
- package/dist/diagnostics/detectors/sdk.d.ts +7 -0
- package/dist/diagnostics/detectors/sdk.d.ts.map +1 -0
- package/dist/diagnostics/detectors/sdk.js +48 -0
- package/dist/diagnostics/runner.d.ts +3 -0
- package/dist/diagnostics/runner.d.ts.map +1 -0
- package/dist/diagnostics/runner.js +44 -0
- package/dist/diagnostics/types.d.ts +70 -0
- package/dist/diagnostics/types.d.ts.map +1 -0
- package/dist/diagnostics/types.js +14 -0
- package/dist/diagnostics/utils/code-search.d.ts +10 -0
- package/dist/diagnostics/utils/code-search.d.ts.map +1 -0
- package/dist/diagnostics/utils/code-search.js +98 -0
- package/dist/diagnostics/utils/file-system.d.ts +7 -0
- package/dist/diagnostics/utils/file-system.d.ts.map +1 -0
- package/dist/diagnostics/utils/file-system.js +72 -0
- package/dist/diagnostics/utils/package-json.d.ts +12 -0
- package/dist/diagnostics/utils/package-json.d.ts.map +1 -0
- package/dist/diagnostics/utils/package-json.js +51 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/output/formatter.d.ts +25 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +76 -0
- package/dist/output/mask.d.ts +2 -0
- package/dist/output/mask.d.ts.map +1 -0
- package/dist/output/mask.js +15 -0
- package/dist/output/prompts.d.ts +25 -0
- package/dist/output/prompts.d.ts.map +1 -0
- package/dist/output/prompts.js +86 -0
- package/dist/output/spinner.d.ts +6 -0
- package/dist/output/spinner.d.ts.map +1 -0
- package/dist/output/spinner.js +7 -0
- package/dist/output/table.d.ts +9 -0
- package/dist/output/table.d.ts.map +1 -0
- package/dist/output/table.js +21 -0
- package/dist/scaffolding/scaffolder.d.ts +3 -0
- package/dist/scaffolding/scaffolder.d.ts.map +1 -0
- package/dist/scaffolding/scaffolder.js +78 -0
- package/dist/scaffolding/strategies/expo-template.d.ts +16 -0
- package/dist/scaffolding/strategies/expo-template.d.ts.map +1 -0
- package/dist/scaffolding/strategies/expo-template.js +160 -0
- package/dist/scaffolding/strategies/index.d.ts +5 -0
- package/dist/scaffolding/strategies/index.d.ts.map +1 -0
- package/dist/scaffolding/strategies/index.js +25 -0
- package/dist/scaffolding/strategies/nextjs-template.d.ts +12 -0
- package/dist/scaffolding/strategies/nextjs-template.d.ts.map +1 -0
- package/dist/scaffolding/strategies/nextjs-template.js +122 -0
- package/dist/scaffolding/template-renderer.d.ts +11 -0
- package/dist/scaffolding/template-renderer.d.ts.map +1 -0
- package/dist/scaffolding/template-renderer.js +99 -0
- package/dist/scaffolding/types.d.ts +69 -0
- package/dist/scaffolding/types.d.ts.map +1 -0
- package/dist/scaffolding/types.js +21 -0
- package/dist/scaffolding/utils/detect-package-manager.d.ts +23 -0
- package/dist/scaffolding/utils/detect-package-manager.d.ts.map +1 -0
- package/dist/scaffolding/utils/detect-package-manager.js +57 -0
- package/dist/scaffolding/utils/fs.d.ts +11 -0
- package/dist/scaffolding/utils/fs.d.ts.map +1 -0
- package/dist/scaffolding/utils/fs.js +45 -0
- package/dist/scaffolding/utils/resolve-para-version.d.ts +7 -0
- package/dist/scaffolding/utils/resolve-para-version.d.ts.map +1 -0
- package/dist/scaffolding/utils/resolve-para-version.js +21 -0
- package/dist/validation/auth-methods.d.ts +14 -0
- package/dist/validation/auth-methods.d.ts.map +1 -0
- package/dist/validation/auth-methods.js +23 -0
- package/dist/validation/cidr.d.ts +11 -0
- package/dist/validation/cidr.d.ts.map +1 -0
- package/dist/validation/cidr.js +35 -0
- package/dist/validation/hex-color.d.ts +7 -0
- package/dist/validation/hex-color.d.ts.map +1 -0
- package/dist/validation/hex-color.js +10 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +49 -0
- package/dist/validation/native-passkey.d.ts +31 -0
- package/dist/validation/native-passkey.d.ts.map +1 -0
- package/dist/validation/native-passkey.js +45 -0
- package/dist/validation/session-length.d.ts +18 -0
- package/dist/validation/session-length.d.ts.map +1 -0
- package/dist/validation/session-length.js +30 -0
- package/dist/validation/url.d.ts +26 -0
- package/dist/validation/url.d.ts.map +1 -0
- package/dist/validation/url.js +50 -0
- package/dist/validation/wallet-types.d.ts +14 -0
- package/dist/validation/wallet-types.d.ts.map +1 -0
- package/dist/validation/wallet-types.js +22 -0
- package/dist/validation/webhook.d.ts +4 -0
- package/dist/validation/webhook.d.ts.map +1 -0
- package/dist/validation/webhook.js +33 -0
- package/package.json +60 -0
- package/templates/expo/_env.example +3 -0
- package/templates/expo/_gitignore +48 -0
- package/templates/expo/_yarnrc.yml +1 -0
- package/templates/expo/app/(auth)/_layout.tsx +12 -0
- package/templates/expo/app/(auth)/index.tsx.template +86 -0
- package/templates/expo/app/(tabs)/_layout.tsx +16 -0
- package/templates/expo/app/(tabs)/index.tsx +112 -0
- package/templates/expo/app/(tabs)/send.tsx +111 -0
- package/templates/expo/app/_layout.tsx +17 -0
- package/templates/expo/app/index.tsx +22 -0
- package/templates/expo/app.json.template +32 -0
- package/templates/expo/assets/adaptive-icon.png +0 -0
- package/templates/expo/assets/favicon.png +0 -0
- package/templates/expo/assets/icon.png +0 -0
- package/templates/expo/assets/splash.png +0 -0
- package/templates/expo/babel.config.cjs +12 -0
- package/templates/expo/components/features/AuthForm.tsx.template +138 -0
- package/templates/expo/components/features/OAuthButtons.tsx.template +27 -0
- package/templates/expo/components/features/index.ts.template +4 -0
- package/templates/expo/components/ui/Button.tsx +58 -0
- package/templates/expo/components/ui/Card.tsx +11 -0
- package/templates/expo/components/ui/Divider.tsx +19 -0
- package/templates/expo/components/ui/Input.tsx +23 -0
- package/templates/expo/components/ui/WalletCard.tsx +44 -0
- package/templates/expo/components/ui/index.ts +5 -0
- package/templates/expo/eslint.config.cjs +15 -0
- package/templates/expo/global.css +3 -0
- package/templates/expo/hooks/useOneClickLogin.ts.template +161 -0
- package/templates/expo/hooks/useViemClient.ts +118 -0
- package/templates/expo/hooks/useWallets.ts +52 -0
- package/templates/expo/index.js +2 -0
- package/templates/expo/lib/auth.ts +54 -0
- package/templates/expo/lib/constants.ts.template +2 -0
- package/templates/expo/lib/para.ts +14 -0
- package/templates/expo/metro.config.cjs +14 -0
- package/templates/expo/nativewind-env.d.ts +2 -0
- package/templates/expo/prettier.config.cjs +10 -0
- package/templates/expo/providers/ParaProvider.tsx +140 -0
- package/templates/expo/tailwind.config.cjs +23 -0
- package/templates/expo/tsconfig.json +11 -0
- package/templates/expo/types/index.ts +28 -0
- package/templates/nextjs/README.md +69 -0
- package/templates/nextjs/_env.example +8 -0
- package/templates/nextjs/_gitignore +36 -0
- package/templates/nextjs/_yarnrc.yml +1 -0
- package/templates/nextjs/eslint.config.mjs +10 -0
- package/templates/nextjs/next.config.ts +5 -0
- package/templates/nextjs/postcss.config.mjs +7 -0
- package/templates/nextjs/public/para.svg +3 -0
- package/templates/nextjs/src/app/layout.tsx +30 -0
- package/templates/nextjs/src/app/page.tsx +40 -0
- package/templates/nextjs/src/components/ParaProvider.tsx +116 -0
- package/templates/nextjs/src/components/layout/Header.tsx +44 -0
- package/templates/nextjs/src/components/ui/ConnectCard.tsx +24 -0
- package/templates/nextjs/src/components/ui/SignMessage.tsx +53 -0
- package/templates/nextjs/src/components/ui/WalletInfo.tsx +22 -0
- package/templates/nextjs/src/hooks/useSignHelloWorld.ts +23 -0
- package/templates/nextjs/src/styles/globals.css +1 -0
- 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,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,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,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,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'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
|
+
}
|