@coinbase/create-cdp-app 0.0.32 → 0.0.34
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/dist/index.js +107 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/template-react-native/android/_gitignore +16 -0
- package/template-react-native/app.json +5 -1
- package/template-react-native/ios/Podfile.lock +166 -160
- package/template-react-native/ios/_gitignore +30 -0
- package/template-react-native/ios/reactnativeexpo.xcodeproj/project.pbxproj +2 -2
- package/template-react-native/package.json +2 -0
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
import { green, yellow, reset, red } from "kolorist";
|
|
6
6
|
import minimist from "minimist";
|
|
7
7
|
import prompts from "prompts";
|
|
8
|
+
import os from "node:os";
|
|
8
9
|
function prepareAppDirectory(targetDir, shouldOverwrite) {
|
|
9
10
|
const root = path.join(process.cwd(), targetDir);
|
|
10
11
|
if (!fs.existsSync(root)) {
|
|
@@ -126,6 +127,66 @@ function isDirEmpty(dirPath) {
|
|
|
126
127
|
const files = fs.readdirSync(dirPath);
|
|
127
128
|
return files.length === 0 || files.length === 1 && files[0] === ".git";
|
|
128
129
|
}
|
|
130
|
+
function customizeReactNativeFiles(templateDir, appName) {
|
|
131
|
+
const username = os.userInfo().username || "user";
|
|
132
|
+
const cleanUsername = username.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
133
|
+
const cleanAppName = appName.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
134
|
+
const safeBundleId = `com.${cleanUsername}.${cleanAppName}`;
|
|
135
|
+
const newPackagePath = `com/${cleanUsername}/${cleanAppName}`;
|
|
136
|
+
const customizedFiles = { safeBundleId, newPackagePath };
|
|
137
|
+
const appJsonPath = path.join(templateDir, "app.json");
|
|
138
|
+
if (fs.existsSync(appJsonPath)) {
|
|
139
|
+
const appJsonContent = fs.readFileSync(appJsonPath, "utf-8");
|
|
140
|
+
customizedFiles.appJson = appJsonContent.replace(/com\.anonymous\.reactnativeexpo/g, safeBundleId).replace(/"name": "react-native-expo"/g, `"name": "${appName}"`);
|
|
141
|
+
}
|
|
142
|
+
const infoPlistPath = path.join(templateDir, "ios/reactnativeexpo/Info.plist");
|
|
143
|
+
if (fs.existsSync(infoPlistPath)) {
|
|
144
|
+
const infoPlistContent = fs.readFileSync(infoPlistPath, "utf-8");
|
|
145
|
+
customizedFiles.infoPlist = infoPlistContent.replace(
|
|
146
|
+
/com\.anonymous\.reactnativeexpo/g,
|
|
147
|
+
safeBundleId
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
const buildGradlePath = path.join(templateDir, "android/app/build.gradle");
|
|
151
|
+
if (fs.existsSync(buildGradlePath)) {
|
|
152
|
+
const buildGradleContent = fs.readFileSync(buildGradlePath, "utf-8");
|
|
153
|
+
customizedFiles.buildGradle = buildGradleContent.replace(
|
|
154
|
+
/com\.anonymous\.reactnativeexpo/g,
|
|
155
|
+
safeBundleId
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
const mainActivityPath = path.join(
|
|
159
|
+
templateDir,
|
|
160
|
+
"android/app/src/main/java/com/anonymous/reactnativeexpo/MainActivity.kt"
|
|
161
|
+
);
|
|
162
|
+
if (fs.existsSync(mainActivityPath)) {
|
|
163
|
+
const mainActivityContent = fs.readFileSync(mainActivityPath, "utf-8");
|
|
164
|
+
customizedFiles.mainActivity = mainActivityContent.replace(
|
|
165
|
+
/package com\.anonymous\.reactnativeexpo/g,
|
|
166
|
+
`package ${safeBundleId}`
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
const mainApplicationPath = path.join(
|
|
170
|
+
templateDir,
|
|
171
|
+
"android/app/src/main/java/com/anonymous/reactnativeexpo/MainApplication.kt"
|
|
172
|
+
);
|
|
173
|
+
if (fs.existsSync(mainApplicationPath)) {
|
|
174
|
+
const mainApplicationContent = fs.readFileSync(mainApplicationPath, "utf-8");
|
|
175
|
+
customizedFiles.mainApplication = mainApplicationContent.replace(
|
|
176
|
+
/package com\.anonymous\.reactnativeexpo/g,
|
|
177
|
+
`package ${safeBundleId}`
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
const xcodeProjectPath = path.join(templateDir, "ios/reactnativeexpo.xcodeproj/project.pbxproj");
|
|
181
|
+
if (fs.existsSync(xcodeProjectPath)) {
|
|
182
|
+
const xcodeProjectContent = fs.readFileSync(xcodeProjectPath, "utf-8");
|
|
183
|
+
customizedFiles.xcodeProject = xcodeProjectContent.replace(
|
|
184
|
+
/com\.anonymous\.reactnativeexpo/g,
|
|
185
|
+
safeBundleId
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
return customizedFiles;
|
|
189
|
+
}
|
|
129
190
|
function detectPackageManager() {
|
|
130
191
|
const userAgent = process.env.npm_config_user_agent;
|
|
131
192
|
if (userAgent) {
|
|
@@ -386,6 +447,8 @@ function copyTemplateFiles({
|
|
|
386
447
|
}
|
|
387
448
|
};
|
|
388
449
|
const isNextjs = templateDir.includes("nextjs");
|
|
450
|
+
const isReactNative = templateDir.includes("react-native");
|
|
451
|
+
const reactNativeCustomizations = isReactNative ? customizeReactNativeFiles(templateDir, appName) : null;
|
|
389
452
|
const files = fs.readdirSync(templateDir);
|
|
390
453
|
for (const file of files) {
|
|
391
454
|
if (file === "package.json") {
|
|
@@ -408,11 +471,12 @@ function copyTemplateFiles({
|
|
|
408
471
|
console.log("Configuring Smart Accounts in environment");
|
|
409
472
|
}
|
|
410
473
|
writeFileToTarget(".env", customizedEnv);
|
|
474
|
+
} else if (file === "app.json" && isReactNative && (reactNativeCustomizations == null ? void 0 : reactNativeCustomizations.appJson)) {
|
|
475
|
+
writeFileToTarget(file, reactNativeCustomizations.appJson);
|
|
411
476
|
} else {
|
|
412
477
|
writeFileToTarget(file);
|
|
413
478
|
}
|
|
414
479
|
}
|
|
415
|
-
const isReactNative = templateDir.includes("react-native");
|
|
416
480
|
if (useSmartAccounts && !isReactNative) {
|
|
417
481
|
const configFileName = isNextjs ? "src/components/Providers.tsx" : "src/config.ts";
|
|
418
482
|
const customizedConfig = customizeConfig(templateDir, useSmartAccounts, isNextjs);
|
|
@@ -429,7 +493,48 @@ function copyTemplateFiles({
|
|
|
429
493
|
const transactionContent = generateTransactionComponent(useSmartAccounts);
|
|
430
494
|
writeFileToTarget(transactionFileName, transactionContent);
|
|
431
495
|
}
|
|
432
|
-
if (isReactNative) {
|
|
496
|
+
if (isReactNative && reactNativeCustomizations) {
|
|
497
|
+
if (reactNativeCustomizations.infoPlist) {
|
|
498
|
+
writeFileToTarget("ios/reactnativeexpo/Info.plist", reactNativeCustomizations.infoPlist);
|
|
499
|
+
}
|
|
500
|
+
if (reactNativeCustomizations.buildGradle) {
|
|
501
|
+
writeFileToTarget("android/app/build.gradle", reactNativeCustomizations.buildGradle);
|
|
502
|
+
}
|
|
503
|
+
if (reactNativeCustomizations.xcodeProject) {
|
|
504
|
+
writeFileToTarget(
|
|
505
|
+
"ios/reactnativeexpo.xcodeproj/project.pbxproj",
|
|
506
|
+
reactNativeCustomizations.xcodeProject
|
|
507
|
+
);
|
|
508
|
+
}
|
|
509
|
+
const newPackageDir = path.join(
|
|
510
|
+
root,
|
|
511
|
+
"android/app/src/main/java",
|
|
512
|
+
reactNativeCustomizations.newPackagePath
|
|
513
|
+
);
|
|
514
|
+
fs.mkdirSync(newPackageDir, { recursive: true });
|
|
515
|
+
if (reactNativeCustomizations.mainActivity) {
|
|
516
|
+
const newMainActivityPath = path.join(
|
|
517
|
+
"android/app/src/main/java",
|
|
518
|
+
reactNativeCustomizations.newPackagePath,
|
|
519
|
+
"MainActivity.kt"
|
|
520
|
+
);
|
|
521
|
+
writeFileToTarget(newMainActivityPath, reactNativeCustomizations.mainActivity);
|
|
522
|
+
}
|
|
523
|
+
if (reactNativeCustomizations.mainApplication) {
|
|
524
|
+
const newMainApplicationPath = path.join(
|
|
525
|
+
"android/app/src/main/java",
|
|
526
|
+
reactNativeCustomizations.newPackagePath,
|
|
527
|
+
"MainApplication.kt"
|
|
528
|
+
);
|
|
529
|
+
writeFileToTarget(newMainApplicationPath, reactNativeCustomizations.mainApplication);
|
|
530
|
+
}
|
|
531
|
+
const oldPackageDir = path.join(
|
|
532
|
+
root,
|
|
533
|
+
"android/app/src/main/java/com/anonymous/reactnativeexpo"
|
|
534
|
+
);
|
|
535
|
+
if (fs.existsSync(oldPackageDir)) {
|
|
536
|
+
fs.rmSync(oldPackageDir, { recursive: true, force: true });
|
|
537
|
+
}
|
|
433
538
|
const gradlewPath = path.join(root, "android", "gradlew");
|
|
434
539
|
if (fs.existsSync(gradlewPath)) {
|
|
435
540
|
fs.chmodSync(gradlewPath, 493);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils.ts","../src/getAppDetails.ts","../src/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Prepare the app directory\n *\n * @param targetDir - The target directory for the app\n * @param shouldOverwrite - Whether to overwrite the existing directory\n * @returns The path to the prepared app directory\n */\nexport function prepareAppDirectory(targetDir: string, shouldOverwrite: boolean): string {\n const root = path.join(process.cwd(), targetDir);\n\n if (shouldOverwrite) {\n emptyDir(root);\n } else if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n\n return root;\n}\n\n/**\n * Customize package.json for the new app\n *\n * @param templateDir - The directory containing the template files\n * @param appName - The name of the app\n * @param includeSdk - Whether to include the CDP SDK in the dependencies\n * @returns The customized package.json content\n */\nexport function customizePackageJson(\n templateDir: string,\n appName: string,\n includeSdk?: boolean,\n): string {\n const packageJsonPath = path.join(templateDir, \"package.json\");\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n packageJson.name = appName;\n if (includeSdk) {\n packageJson.dependencies[\"@coinbase/cdp-sdk\"] = \"latest\";\n }\n return JSON.stringify(packageJson, null, 2) + \"\\n\";\n}\n\n/**\n * Set up the .env file for the new app\n *\n * @param params - The parameters for the function\n * @param params.templateDir - The directory containing the template files\n * @param params.projectId - The CDP Project ID\n * @param params.useSmartAccounts - Whether to enable smart accounts\n * @param params.apiKeyId - The API Key ID\n * @param params.apiKeySecret - The API Key Secret\n * @returns The customized .env content\n */\nexport function customizeEnv({\n templateDir,\n projectId,\n useSmartAccounts,\n apiKeyId,\n apiKeySecret,\n}: {\n templateDir: string;\n projectId: string;\n useSmartAccounts?: boolean;\n apiKeyId?: string;\n apiKeySecret?: string;\n}): string {\n const exampleEnvPath = path.join(templateDir, \"env.example\");\n const exampleEnv = fs.readFileSync(exampleEnvPath, \"utf-8\");\n\n let envContent = exampleEnv.replace(/(.*PROJECT_ID=).*(\\r?\\n|$)/, `$1${projectId}\\n`);\n\n // Set the account type based on user choice\n const accountType = useSmartAccounts ? \"evm-smart\" : \"evm-eoa\";\n let prefix: string;\n if (templateDir.includes(\"nextjs\")) {\n prefix = \"NEXT_PUBLIC_\";\n } else if (templateDir.includes(\"react-native\")) {\n prefix = \"EXPO_PUBLIC_\";\n } else {\n prefix = \"VITE_\";\n }\n envContent = envContent.replace(\n new RegExp(`(${prefix}CDP_CREATE_ACCOUNT_TYPE=).*(\\r?\\n|$)`),\n `$1${accountType}\\n`,\n );\n\n // Replace CDP API credentials if provided\n if (apiKeyId && apiKeySecret) {\n // Replace the commented API Key ID\n envContent = envContent.replace(/# CDP_API_KEY_ID=.*/, `CDP_API_KEY_ID=${apiKeyId}`);\n // Replace the commented API Key Secret\n envContent = envContent.replace(\n /# CDP_API_KEY_SECRET=.*/,\n `CDP_API_KEY_SECRET=${apiKeySecret}`,\n );\n }\n\n return envContent;\n}\n\n/**\n * Customize configuration files for smart accounts\n *\n * @param templateDir - The directory containing the template files\n * @param useSmartAccounts - Whether to enable smart accounts\n * @param isNextjs - Whether this is a Next.js template\n * @returns The customized config content\n */\nexport function customizeConfig(\n templateDir: string,\n useSmartAccounts: boolean,\n isNextjs: boolean,\n): string | null {\n if (!useSmartAccounts) return null;\n\n const configFileName = isNextjs ? \"src/components/Providers.tsx\" : \"src/config.ts\";\n const configPath = path.join(templateDir, configFileName);\n\n if (!fs.existsSync(configPath)) return null;\n\n let configContent = fs.readFileSync(configPath, \"utf-8\");\n\n if (isNextjs) {\n // For Next.js Providers.tsx\n configContent = configContent.replace(\n /const CDP_CONFIG: Config = \\{[\\s\\S]*?\\};/,\n `const CDP_CONFIG: Config = {\n projectId: process.env.NEXT_PUBLIC_CDP_PROJECT_ID ?? \"\",\n createAccountOnLogin: process.env.NEXT_PUBLIC_CDP_CREATE_ACCOUNT_TYPE === \"evm-smart\" ? \"evm-smart\" : \"evm-eoa\",\n};`,\n );\n } else {\n // For React config.ts\n configContent = configContent.replace(\n /export const CDP_CONFIG: Config = \\{[\\s\\S]*?\\};/,\n `export const CDP_CONFIG: Config = {\n projectId: import.meta.env.VITE_CDP_PROJECT_ID,\n createAccountOnLogin: import.meta.env.VITE_CDP_CREATE_ACCOUNT_TYPE === \"evm-smart\" ? \"evm-smart\" : \"evm-eoa\",\n};`,\n );\n }\n\n return configContent;\n}\n\n/**\n * Copy a file or directory recursively\n *\n * @param filePath - The source path\n * @param destPath - The destination path\n */\nexport function copyFile(filePath: string, destPath: string): void {\n const stat = fs.statSync(filePath);\n if (stat.isDirectory()) {\n copyDir(filePath, destPath);\n } else {\n fs.copyFileSync(filePath, destPath);\n }\n}\n\n/**\n * Copy a file or directory recursively with selective filtering for transaction components\n *\n * @param params - The parameters for the function\n * @param params.filePath - The source path\n * @param params.destPath - The destination path\n * @param params.useSmartAccounts - Whether to use Smart Accounts\n * @param params.enableOnramp - Whether to include Onramp\n */\nexport function copyFileSelectively({\n filePath,\n destPath,\n useSmartAccounts,\n enableOnramp,\n}: {\n filePath: string;\n destPath: string;\n useSmartAccounts?: boolean;\n enableOnramp?: boolean;\n}): void {\n const stat = fs.statSync(filePath);\n if (stat.isDirectory()) {\n const baseDir = path.basename(filePath);\n // skip api and lib directories if Onramp is not enabled\n if (!enableOnramp && (baseDir === \"api\" || baseDir === \"lib\")) return;\n // copy the directory\n copyDirSelectively({ srcDir: filePath, destDir: destPath, useSmartAccounts, enableOnramp });\n } else {\n const fileName = path.basename(filePath);\n\n // Skip transaction components that don't match the user's choice\n if (useSmartAccounts && fileName === \"EOATransaction.tsx\") return;\n if (!useSmartAccounts && fileName === \"SmartAccountTransaction.tsx\") return;\n\n // Skip Onramp files if the user didn't enable Onramp\n if (!enableOnramp && [\"FundWallet.tsx\", \"SignedInScreenWithOnramp.tsx\"].includes(fileName))\n return;\n // Onramp-specific SignedInScreen\n if (enableOnramp) {\n // Skip the default SignedInScreen.tsx file\n if (fileName === \"SignedInScreen.tsx\") return;\n // Copy the SignedInScreenWithOnramp.tsx file to SignedInScreen.tsx\n if (fileName === \"SignedInScreenWithOnramp.tsx\") {\n const newDestPath = destPath.replace(\"SignedInScreenWithOnramp.tsx\", \"SignedInScreen.tsx\");\n fs.copyFileSync(filePath, newDestPath);\n return;\n }\n }\n\n fs.copyFileSync(filePath, destPath);\n }\n}\n\n/**\n * Copy a directory recursively\n *\n * @param srcDir - The source directory path\n * @param destDir - The destination directory path\n */\nfunction copyDir(srcDir: string, destDir: string): void {\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n const destFile = path.resolve(destDir, file);\n copyFile(srcFile, destFile);\n }\n}\n\n/**\n * Copy a directory recursively with selective filtering\n *\n * @param params - The parameters for the function\n * @param params.srcDir - The source directory path\n * @param params.destDir - The destination directory path\n * @param params.useSmartAccounts - Whether to use Smart Accounts\n * @param params.enableOnramp - Whether to include Onramp\n */\nfunction copyDirSelectively({\n srcDir,\n destDir,\n useSmartAccounts,\n enableOnramp,\n}: {\n srcDir: string;\n destDir: string;\n useSmartAccounts?: boolean;\n enableOnramp?: boolean;\n}): void {\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n const destFile = path.resolve(destDir, file);\n copyFileSelectively({ filePath: srcFile, destPath: destFile, useSmartAccounts, enableOnramp });\n }\n}\n\n/**\n * Check if a directory is empty\n *\n * @param dirPath - The path to the directory\n * @returns True if the directory is empty, false otherwise\n */\nexport function isDirEmpty(dirPath: string): boolean {\n const files = fs.readdirSync(dirPath);\n return files.length === 0 || (files.length === 1 && files[0] === \".git\");\n}\n\n/**\n * Empty a directory while preserving .git\n *\n * @param dirPath - The path to the directory\n */\nfunction emptyDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n return;\n }\n for (const file of fs.readdirSync(dirPath)) {\n if (file === \".git\") {\n continue;\n }\n fs.rmSync(path.resolve(dirPath, file), { recursive: true, force: true });\n }\n}\n\n/**\n * Detect which package manager invoked the create command\n *\n * @returns The detected package manager or 'pnpm' as default\n */\nexport function detectPackageManager(): \"npm\" | \"pnpm\" | \"yarn\" {\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith(\"yarn\")) return \"yarn\";\n if (userAgent.startsWith(\"pnpm\")) return \"pnpm\";\n if (userAgent.startsWith(\"npm\")) return \"npm\";\n }\n\n return \"npm\"; // Default to npm if we can't detect\n}\n","#!/usr/bin/env node\n\nimport fs from \"node:fs\";\n\nimport { green, red, reset, yellow } from \"kolorist\";\nimport minimist from \"minimist\";\nimport prompts from \"prompts\";\n\nimport { isDirEmpty } from \"./utils.js\";\n\nconst defaultTargetDir = \"cdp-app\";\n\n// Available templates for app creation\nconst TEMPLATES = [\n {\n name: \"react\",\n display: \"React Single Page App\",\n color: green,\n },\n {\n name: \"nextjs\",\n display: \"Next.js Full Stack App\",\n color: green,\n },\n {\n name: \"react-native\",\n display: \"React Native with Expo\",\n color: green,\n },\n] as const;\n\nconst TEMPLATE_NAMES = TEMPLATES.map(template => template.name);\n\ntype TemplateName = (typeof TEMPLATE_NAMES)[number];\n\n/**\n * App options\n */\nexport interface AppOptions {\n appName: string;\n template: TemplateName;\n targetDirectory: string;\n projectId: string;\n useSmartAccounts: boolean;\n enableOnramp: boolean;\n apiKeyId?: string;\n apiKeySecret?: string;\n}\n\ntype CommandLineArgs = {\n \"project-id\": string;\n template: TemplateName;\n \"smart-accounts\"?: boolean;\n onramp?: boolean;\n};\n\nconst uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Get app details from command line arguments or prompt the user\n *\n * @returns The app details\n */\nexport async function getAppDetails(): Promise<AppOptions> {\n const argv = minimist<CommandLineArgs>(process.argv.slice(2));\n\n // Get target directory from command line args (first non-option argument)\n let targetDir = argv._[0];\n const defaultAppName = targetDir ?? defaultTargetDir;\n let templateFromArgs: TemplateName | undefined = undefined;\n let projectIdFromArgs: string | undefined = undefined;\n let enableOnrampFromArgs: boolean | undefined = undefined;\n const useSmartAccountsFromArgs = argv[\"smart-accounts\"];\n\n // Validate template from argv\n if (argv.template) {\n if (!TEMPLATE_NAMES.includes(argv.template)) {\n console.log(\n yellow(\n `✖ Invalid template provided: \"${argv.template}\". Please choose from: ${TEMPLATE_NAMES.join(\", \")}.`,\n ),\n );\n } else {\n templateFromArgs = argv.template;\n }\n }\n\n // Validate projectId from argv\n if (argv[\"project-id\"]) {\n if (!uuidRegex.test(argv[\"project-id\"])) {\n console.log(\n yellow(`✖ Invalid Project ID provided: \"${argv.projectId}\". Please enter a valid UUID.`),\n );\n } else {\n projectIdFromArgs = argv[\"project-id\"];\n }\n }\n\n // Validate compatible template for onramp\n if (argv[\"onramp\"] !== undefined) {\n if (!argv[\"onramp\"]) {\n enableOnrampFromArgs = false;\n } else {\n // if template is not provided and onramp is enabled, force nextjs template\n if (!templateFromArgs) {\n templateFromArgs = \"nextjs\";\n }\n if (templateFromArgs !== \"nextjs\") {\n console.log(yellow(`✖ Onramp is only supported with the Next.js template.`));\n } else {\n enableOnrampFromArgs = true;\n }\n }\n }\n\n try {\n const result = await prompts(\n [\n {\n type: targetDir ? null : \"text\",\n name: \"appName\",\n message: reset(\"App Name:\"),\n initial: defaultAppName,\n onState: state => {\n targetDir = String(state.value).trim() || defaultAppName;\n },\n },\n {\n type: templateFromArgs ? null : \"select\",\n name: \"template\",\n message: reset(\"Template:\"),\n initial: 0,\n choices: TEMPLATES.map(template => ({\n title: template.color(template.display),\n value: template.name,\n })),\n },\n {\n type: projectIdFromArgs ? null : \"text\",\n name: \"projectId\",\n message: reset(\n \"CDP Project ID (Find your project ID at https://portal.cdp.coinbase.com/projects/overview):\",\n ),\n validate: value => {\n if (!value) {\n return \"Project ID is required\";\n } else if (!uuidRegex.test(value)) {\n return \"Project ID must be a valid UUID\";\n }\n return true;\n },\n initial: \"\",\n },\n {\n type: useSmartAccountsFromArgs !== undefined ? null : \"confirm\",\n name: \"useSmartAccounts\",\n message: reset(\n \"Enable Smart Accounts? (Smart Accounts enable gasless transactions and improved UX):\",\n ),\n initial: false,\n },\n {\n type: (_, { template }: { template?: string }) =>\n enableOnrampFromArgs !== undefined || (templateFromArgs || template) !== \"nextjs\"\n ? null\n : \"confirm\",\n name: \"enableOnramp\",\n message: reset(\"Enable Coinbase Onramp? (Onramp enables users to buy crypto with fiat):\"),\n initial: false,\n },\n {\n type: (_, { enableOnramp }: { enableOnramp?: boolean }) =>\n enableOnramp || enableOnrampFromArgs ? \"text\" : null,\n name: \"apiKeyId\",\n message: reset(\"CDP API Key ID (Create at https://portal.cdp.coinbase.com/api-keys):\"),\n validate: value => {\n if (!value) {\n return \"API Key ID is required for Onramp\";\n }\n return true;\n },\n },\n {\n type: (_, { enableOnramp }: { enableOnramp?: boolean }) =>\n enableOnramp || enableOnrampFromArgs ? \"password\" : null,\n name: \"apiKeySecret\",\n message: reset(\"CDP API Key Secret (paste your private key - it will be hidden):\"),\n validate: value => {\n if (!value) {\n return \"API Key Secret is required for Onramp\";\n }\n return true;\n },\n },\n {\n type: (_, { template }: { template?: string }) =>\n (templateFromArgs || template) === \"react-native\" ? null : \"confirm\",\n name: \"corsConfirmation\",\n message: reset(\n \"Confirm you have whitelisted 'http://localhost:3000' at https://portal.cdp.coinbase.com/products/embedded-wallets/domains:\",\n ),\n initial: true,\n },\n {\n type: () => (!fs.existsSync(targetDir) || isDirEmpty(targetDir) ? null : \"confirm\"),\n name: \"overwrite\",\n message: () =>\n (targetDir === \".\" ? \"Current directory\" : `Target directory \"${targetDir}\"`) +\n \" is not empty. Remove existing files and continue?\",\n },\n {\n type: (_, { overwrite }: { overwrite?: boolean }) => {\n if (overwrite === false) {\n throw new Error(red(\"✖\") + \" Operation cancelled\");\n }\n return null;\n },\n name: \"overwriteChecker\",\n },\n ],\n {\n onCancel: () => {\n throw new Error(red(\"✖\") + \" Operation cancelled\");\n },\n },\n );\n\n return {\n appName: result.appName || targetDir,\n template: templateFromArgs || result.template,\n targetDirectory: targetDir,\n projectId: projectIdFromArgs || result.projectId,\n useSmartAccounts: useSmartAccountsFromArgs ?? result.useSmartAccounts,\n enableOnramp: enableOnrampFromArgs ?? result.enableOnramp ?? false,\n apiKeyId: result.apiKeyId,\n apiKeySecret: result.apiKeySecret,\n };\n } catch (cancelled: unknown) {\n if (cancelled instanceof Error) {\n console.log(cancelled.message);\n }\n process.exit(0);\n }\n}\n","#!/usr/bin/env node\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { green } from \"kolorist\";\n\nimport { getAppDetails } from \"./getAppDetails.js\";\nimport {\n prepareAppDirectory,\n customizePackageJson,\n copyFileSelectively,\n customizeEnv,\n customizeConfig,\n detectPackageManager,\n} from \"./utils.js\";\n\nconst fileRenames: Record<string, string | undefined> = {\n _gitignore: \".gitignore\",\n};\n\n/**\n * Initialize a new CDP app\n */\nasync function init(): Promise<void> {\n const {\n appName,\n template,\n targetDirectory,\n projectId,\n useSmartAccounts,\n enableOnramp,\n apiKeyId,\n apiKeySecret,\n } = await getAppDetails();\n\n console.log(`\\nScaffolding app in ${targetDirectory}...`);\n\n const root = prepareAppDirectory(targetDirectory, false);\n const templateDir = path.resolve(fileURLToPath(import.meta.url), \"../..\", `template-${template}`);\n\n copyTemplateFiles({\n templateDir,\n root,\n appName,\n projectId,\n useSmartAccounts,\n enableOnramp,\n apiKeyId,\n apiKeySecret,\n });\n printNextSteps(root, template);\n}\n\n/**\n * Print next steps for the user\n *\n * @param appRoot - The root directory of the app\n * @param template - The template that was used\n */\nfunction printNextSteps(appRoot: string, template: string): void {\n const packageManager = detectPackageManager();\n\n console.log(green(\"\\nDone. Now run your app:\\n\"));\n if (appRoot !== process.cwd()) {\n console.log(`cd ${path.relative(process.cwd(), appRoot)}`);\n }\n\n console.log(`${packageManager} install`);\n\n if (template === \"react-native\") {\n const startCommand =\n packageManager === \"npm\"\n ? \"npm run ios # or npm run android\"\n : `${packageManager} run ios # or ${packageManager} run android`;\n console.log(startCommand);\n } else {\n const devCommand = packageManager === \"npm\" ? \"npm run dev\" : `${packageManager} dev`;\n console.log(devCommand);\n }\n}\n\n/**\n * Copy template files to the app directory\n *\n * @param params - The parameters for the function\n * @param params.templateDir - The directory containing the template files\n * @param params.root - The root directory of the app\n * @param params.appName - The name of the app\n * @param params.projectId - The CDP Project ID\n * @param params.useSmartAccounts - Whether to enable smart accounts\n * @param params.enableOnramp - Whether to include Onramp\n * @param params.apiKeyId - The API Key ID\n * @param params.apiKeySecret - The API Key Secret\n */\nfunction copyTemplateFiles({\n templateDir,\n root,\n appName,\n projectId,\n useSmartAccounts,\n enableOnramp,\n apiKeyId,\n apiKeySecret,\n}: {\n templateDir: string;\n root: string;\n appName: string;\n projectId?: string;\n useSmartAccounts?: boolean;\n enableOnramp?: boolean;\n apiKeyId?: string;\n apiKeySecret?: string;\n}): void {\n const writeFileToTarget = (file: string, content?: string) => {\n const targetPath = path.join(root, fileRenames[file] ?? file);\n if (content) {\n fs.writeFileSync(targetPath, content);\n } else {\n copyFileSelectively({\n filePath: path.join(templateDir, file),\n destPath: targetPath,\n useSmartAccounts,\n enableOnramp,\n });\n }\n };\n\n const isNextjs = templateDir.includes(\"nextjs\");\n\n const files = fs.readdirSync(templateDir);\n for (const file of files) {\n if (file === \"package.json\") {\n const customizedPackageJson = customizePackageJson(templateDir, appName, enableOnramp);\n writeFileToTarget(file, customizedPackageJson);\n } else if (file === \"env.example\" && projectId) {\n writeFileToTarget(file);\n const customizedEnv = customizeEnv({\n templateDir,\n projectId,\n useSmartAccounts,\n apiKeyId,\n apiKeySecret,\n });\n console.log(\"Copying CDP Project ID to .env\");\n if (apiKeyId && apiKeySecret) {\n console.log(\"Copying CDP API credentials to .env\");\n }\n if (useSmartAccounts) {\n console.log(\"Configuring Smart Accounts in environment\");\n }\n writeFileToTarget(\".env\", customizedEnv);\n } else {\n writeFileToTarget(file);\n }\n }\n\n const isReactNative = templateDir.includes(\"react-native\");\n\n // Handle smart account configuration in config files\n if (useSmartAccounts && !isReactNative) {\n const configFileName = isNextjs ? \"src/components/Providers.tsx\" : \"src/config.ts\";\n const customizedConfig = customizeConfig(templateDir, useSmartAccounts, isNextjs);\n if (customizedConfig) {\n console.log(\"Configuring Smart Accounts in application config\");\n writeFileToTarget(configFileName, customizedConfig);\n }\n }\n\n // Generate the appropriate Transaction.tsx component\n if (isReactNative) {\n // For React Native, create the Transaction.tsx barrel file\n const transactionContent = generateTransactionComponent(useSmartAccounts);\n writeFileToTarget(\"Transaction.tsx\", transactionContent);\n } else {\n // For React/Next.js templates\n const transactionFileName = isNextjs ? \"src/components/Transaction.tsx\" : \"src/Transaction.tsx\";\n const transactionContent = generateTransactionComponent(useSmartAccounts);\n writeFileToTarget(transactionFileName, transactionContent);\n }\n\n // Update android/gradlew permissions so that the template is runnable\n if (isReactNative) {\n const gradlewPath = path.join(root, \"android\", \"gradlew\");\n if (fs.existsSync(gradlewPath)) {\n fs.chmodSync(gradlewPath, 0o755);\n }\n }\n}\n\n/**\n * Generate the appropriate Transaction component based on account type\n *\n * @param useSmartAccounts - Whether to use Smart Accounts\n * @returns The generated Transaction component content\n */\nfunction generateTransactionComponent(useSmartAccounts?: boolean): string {\n if (useSmartAccounts) {\n return `export { default } from \"./SmartAccountTransaction\";`;\n } else {\n return `export { default } from \"./EOATransaction\";`;\n }\n}\n\ninit().catch(e => {\n console.error(e);\n process.exit(1);\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils.ts","../src/getAppDetails.ts","../src/index.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\n/**\n * Prepare the app directory\n *\n * @param targetDir - The target directory for the app\n * @param shouldOverwrite - Whether to overwrite the existing directory\n * @returns The path to the prepared app directory\n */\nexport function prepareAppDirectory(targetDir: string, shouldOverwrite: boolean): string {\n const root = path.join(process.cwd(), targetDir);\n\n if (shouldOverwrite) {\n emptyDir(root);\n } else if (!fs.existsSync(root)) {\n fs.mkdirSync(root, { recursive: true });\n }\n\n return root;\n}\n\n/**\n * Customize package.json for the new app\n *\n * @param templateDir - The directory containing the template files\n * @param appName - The name of the app\n * @param includeSdk - Whether to include the CDP SDK in the dependencies\n * @returns The customized package.json content\n */\nexport function customizePackageJson(\n templateDir: string,\n appName: string,\n includeSdk?: boolean,\n): string {\n const packageJsonPath = path.join(templateDir, \"package.json\");\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n packageJson.name = appName;\n if (includeSdk) {\n packageJson.dependencies[\"@coinbase/cdp-sdk\"] = \"latest\";\n }\n return JSON.stringify(packageJson, null, 2) + \"\\n\";\n}\n\n/**\n * Set up the .env file for the new app\n *\n * @param params - The parameters for the function\n * @param params.templateDir - The directory containing the template files\n * @param params.projectId - The CDP Project ID\n * @param params.useSmartAccounts - Whether to enable smart accounts\n * @param params.apiKeyId - The API Key ID\n * @param params.apiKeySecret - The API Key Secret\n * @returns The customized .env content\n */\nexport function customizeEnv({\n templateDir,\n projectId,\n useSmartAccounts,\n apiKeyId,\n apiKeySecret,\n}: {\n templateDir: string;\n projectId: string;\n useSmartAccounts?: boolean;\n apiKeyId?: string;\n apiKeySecret?: string;\n}): string {\n const exampleEnvPath = path.join(templateDir, \"env.example\");\n const exampleEnv = fs.readFileSync(exampleEnvPath, \"utf-8\");\n\n let envContent = exampleEnv.replace(/(.*PROJECT_ID=).*(\\r?\\n|$)/, `$1${projectId}\\n`);\n\n // Set the account type based on user choice\n const accountType = useSmartAccounts ? \"evm-smart\" : \"evm-eoa\";\n let prefix: string;\n if (templateDir.includes(\"nextjs\")) {\n prefix = \"NEXT_PUBLIC_\";\n } else if (templateDir.includes(\"react-native\")) {\n prefix = \"EXPO_PUBLIC_\";\n } else {\n prefix = \"VITE_\";\n }\n envContent = envContent.replace(\n new RegExp(`(${prefix}CDP_CREATE_ACCOUNT_TYPE=).*(\\r?\\n|$)`),\n `$1${accountType}\\n`,\n );\n\n // Replace CDP API credentials if provided\n if (apiKeyId && apiKeySecret) {\n // Replace the commented API Key ID\n envContent = envContent.replace(/# CDP_API_KEY_ID=.*/, `CDP_API_KEY_ID=${apiKeyId}`);\n // Replace the commented API Key Secret\n envContent = envContent.replace(\n /# CDP_API_KEY_SECRET=.*/,\n `CDP_API_KEY_SECRET=${apiKeySecret}`,\n );\n }\n\n return envContent;\n}\n\n/**\n * Customize configuration files for smart accounts\n *\n * @param templateDir - The directory containing the template files\n * @param useSmartAccounts - Whether to enable smart accounts\n * @param isNextjs - Whether this is a Next.js template\n * @returns The customized config content\n */\nexport function customizeConfig(\n templateDir: string,\n useSmartAccounts: boolean,\n isNextjs: boolean,\n): string | null {\n if (!useSmartAccounts) return null;\n\n const configFileName = isNextjs ? \"src/components/Providers.tsx\" : \"src/config.ts\";\n const configPath = path.join(templateDir, configFileName);\n\n if (!fs.existsSync(configPath)) return null;\n\n let configContent = fs.readFileSync(configPath, \"utf-8\");\n\n if (isNextjs) {\n // For Next.js Providers.tsx\n configContent = configContent.replace(\n /const CDP_CONFIG: Config = \\{[\\s\\S]*?\\};/,\n `const CDP_CONFIG: Config = {\n projectId: process.env.NEXT_PUBLIC_CDP_PROJECT_ID ?? \"\",\n createAccountOnLogin: process.env.NEXT_PUBLIC_CDP_CREATE_ACCOUNT_TYPE === \"evm-smart\" ? \"evm-smart\" : \"evm-eoa\",\n};`,\n );\n } else {\n // For React config.ts\n configContent = configContent.replace(\n /export const CDP_CONFIG: Config = \\{[\\s\\S]*?\\};/,\n `export const CDP_CONFIG: Config = {\n projectId: import.meta.env.VITE_CDP_PROJECT_ID,\n createAccountOnLogin: import.meta.env.VITE_CDP_CREATE_ACCOUNT_TYPE === \"evm-smart\" ? \"evm-smart\" : \"evm-eoa\",\n};`,\n );\n }\n\n return configContent;\n}\n\n/**\n * Copy a file or directory recursively\n *\n * @param filePath - The source path\n * @param destPath - The destination path\n */\nexport function copyFile(filePath: string, destPath: string): void {\n const stat = fs.statSync(filePath);\n if (stat.isDirectory()) {\n copyDir(filePath, destPath);\n } else {\n fs.copyFileSync(filePath, destPath);\n }\n}\n\n/**\n * Copy a file or directory recursively with selective filtering for transaction components\n *\n * @param params - The parameters for the function\n * @param params.filePath - The source path\n * @param params.destPath - The destination path\n * @param params.useSmartAccounts - Whether to use Smart Accounts\n * @param params.enableOnramp - Whether to include Onramp\n */\nexport function copyFileSelectively({\n filePath,\n destPath,\n useSmartAccounts,\n enableOnramp,\n}: {\n filePath: string;\n destPath: string;\n useSmartAccounts?: boolean;\n enableOnramp?: boolean;\n}): void {\n const stat = fs.statSync(filePath);\n if (stat.isDirectory()) {\n const baseDir = path.basename(filePath);\n // skip api and lib directories if Onramp is not enabled\n if (!enableOnramp && (baseDir === \"api\" || baseDir === \"lib\")) return;\n // copy the directory\n copyDirSelectively({ srcDir: filePath, destDir: destPath, useSmartAccounts, enableOnramp });\n } else {\n const fileName = path.basename(filePath);\n\n // Skip transaction components that don't match the user's choice\n if (useSmartAccounts && fileName === \"EOATransaction.tsx\") return;\n if (!useSmartAccounts && fileName === \"SmartAccountTransaction.tsx\") return;\n\n // Skip Onramp files if the user didn't enable Onramp\n if (!enableOnramp && [\"FundWallet.tsx\", \"SignedInScreenWithOnramp.tsx\"].includes(fileName))\n return;\n // Onramp-specific SignedInScreen\n if (enableOnramp) {\n // Skip the default SignedInScreen.tsx file\n if (fileName === \"SignedInScreen.tsx\") return;\n // Copy the SignedInScreenWithOnramp.tsx file to SignedInScreen.tsx\n if (fileName === \"SignedInScreenWithOnramp.tsx\") {\n const newDestPath = destPath.replace(\"SignedInScreenWithOnramp.tsx\", \"SignedInScreen.tsx\");\n fs.copyFileSync(filePath, newDestPath);\n return;\n }\n }\n\n fs.copyFileSync(filePath, destPath);\n }\n}\n\n/**\n * Copy a directory recursively\n *\n * @param srcDir - The source directory path\n * @param destDir - The destination directory path\n */\nfunction copyDir(srcDir: string, destDir: string): void {\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n const destFile = path.resolve(destDir, file);\n copyFile(srcFile, destFile);\n }\n}\n\n/**\n * Copy a directory recursively with selective filtering\n *\n * @param params - The parameters for the function\n * @param params.srcDir - The source directory path\n * @param params.destDir - The destination directory path\n * @param params.useSmartAccounts - Whether to use Smart Accounts\n * @param params.enableOnramp - Whether to include Onramp\n */\nfunction copyDirSelectively({\n srcDir,\n destDir,\n useSmartAccounts,\n enableOnramp,\n}: {\n srcDir: string;\n destDir: string;\n useSmartAccounts?: boolean;\n enableOnramp?: boolean;\n}): void {\n fs.mkdirSync(destDir, { recursive: true });\n for (const file of fs.readdirSync(srcDir)) {\n const srcFile = path.resolve(srcDir, file);\n const destFile = path.resolve(destDir, file);\n copyFileSelectively({ filePath: srcFile, destPath: destFile, useSmartAccounts, enableOnramp });\n }\n}\n\n/**\n * Check if a directory is empty\n *\n * @param dirPath - The path to the directory\n * @returns True if the directory is empty, false otherwise\n */\nexport function isDirEmpty(dirPath: string): boolean {\n const files = fs.readdirSync(dirPath);\n return files.length === 0 || (files.length === 1 && files[0] === \".git\");\n}\n\n/**\n * Empty a directory while preserving .git\n *\n * @param dirPath - The path to the directory\n */\nfunction emptyDir(dirPath: string): void {\n if (!fs.existsSync(dirPath)) {\n return;\n }\n for (const file of fs.readdirSync(dirPath)) {\n if (file === \".git\") {\n continue;\n }\n fs.rmSync(path.resolve(dirPath, file), { recursive: true, force: true });\n }\n}\n\n/**\n * Customize React Native specific files with unique bundle identifier\n *\n * @param templateDir - The directory containing the template files\n * @param appName - The name of the app\n * @returns Object containing customized file contents and new package path\n */\nexport function customizeReactNativeFiles(\n templateDir: string,\n appName: string,\n): {\n appJson?: string;\n infoPlist?: string;\n buildGradle?: string;\n mainActivity?: string;\n mainApplication?: string;\n xcodeProject?: string;\n newPackagePath: string;\n safeBundleId: string;\n} {\n const username = os.userInfo().username || \"user\";\n const cleanUsername = username.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n const cleanAppName = appName.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n const safeBundleId = `com.${cleanUsername}.${cleanAppName}`;\n const newPackagePath = `com/${cleanUsername}/${cleanAppName}`;\n\n const customizedFiles: {\n appJson?: string;\n infoPlist?: string;\n buildGradle?: string;\n mainActivity?: string;\n mainApplication?: string;\n xcodeProject?: string;\n newPackagePath: string;\n safeBundleId: string;\n } = { safeBundleId, newPackagePath };\n\n // Customize app.json\n const appJsonPath = path.join(templateDir, \"app.json\");\n if (fs.existsSync(appJsonPath)) {\n const appJsonContent = fs.readFileSync(appJsonPath, \"utf-8\");\n customizedFiles.appJson = appJsonContent\n .replace(/com\\.anonymous\\.reactnativeexpo/g, safeBundleId)\n .replace(/\"name\": \"react-native-expo\"/g, `\"name\": \"${appName}\"`);\n }\n\n // Customize iOS Info.plist\n const infoPlistPath = path.join(templateDir, \"ios/reactnativeexpo/Info.plist\");\n if (fs.existsSync(infoPlistPath)) {\n const infoPlistContent = fs.readFileSync(infoPlistPath, \"utf-8\");\n customizedFiles.infoPlist = infoPlistContent.replace(\n /com\\.anonymous\\.reactnativeexpo/g,\n safeBundleId,\n );\n }\n\n // Customize Android build.gradle\n const buildGradlePath = path.join(templateDir, \"android/app/build.gradle\");\n if (fs.existsSync(buildGradlePath)) {\n const buildGradleContent = fs.readFileSync(buildGradlePath, \"utf-8\");\n customizedFiles.buildGradle = buildGradleContent.replace(\n /com\\.anonymous\\.reactnativeexpo/g,\n safeBundleId,\n );\n }\n\n // Customize MainActivity.kt\n const mainActivityPath = path.join(\n templateDir,\n \"android/app/src/main/java/com/anonymous/reactnativeexpo/MainActivity.kt\",\n );\n if (fs.existsSync(mainActivityPath)) {\n const mainActivityContent = fs.readFileSync(mainActivityPath, \"utf-8\");\n customizedFiles.mainActivity = mainActivityContent.replace(\n /package com\\.anonymous\\.reactnativeexpo/g,\n `package ${safeBundleId}`,\n );\n }\n\n // Customize MainApplication.kt\n const mainApplicationPath = path.join(\n templateDir,\n \"android/app/src/main/java/com/anonymous/reactnativeexpo/MainApplication.kt\",\n );\n if (fs.existsSync(mainApplicationPath)) {\n const mainApplicationContent = fs.readFileSync(mainApplicationPath, \"utf-8\");\n customizedFiles.mainApplication = mainApplicationContent.replace(\n /package com\\.anonymous\\.reactnativeexpo/g,\n `package ${safeBundleId}`,\n );\n }\n\n // Customize iOS Xcode project file - only replace bundle identifier\n const xcodeProjectPath = path.join(templateDir, \"ios/reactnativeexpo.xcodeproj/project.pbxproj\");\n if (fs.existsSync(xcodeProjectPath)) {\n const xcodeProjectContent = fs.readFileSync(xcodeProjectPath, \"utf-8\");\n customizedFiles.xcodeProject = xcodeProjectContent.replace(\n /com\\.anonymous\\.reactnativeexpo/g,\n safeBundleId,\n );\n }\n\n return customizedFiles;\n}\n\n/**\n * Detect which package manager invoked the create command\n *\n * @returns The detected package manager or 'pnpm' as default\n */\nexport function detectPackageManager(): \"npm\" | \"pnpm\" | \"yarn\" {\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith(\"yarn\")) return \"yarn\";\n if (userAgent.startsWith(\"pnpm\")) return \"pnpm\";\n if (userAgent.startsWith(\"npm\")) return \"npm\";\n }\n\n return \"npm\"; // Default to npm if we can't detect\n}\n","#!/usr/bin/env node\n\nimport fs from \"node:fs\";\n\nimport { green, red, reset, yellow } from \"kolorist\";\nimport minimist from \"minimist\";\nimport prompts from \"prompts\";\n\nimport { isDirEmpty } from \"./utils.js\";\n\nconst defaultTargetDir = \"cdp-app\";\n\n// Available templates for app creation\nconst TEMPLATES = [\n {\n name: \"react\",\n display: \"React Single Page App\",\n color: green,\n },\n {\n name: \"nextjs\",\n display: \"Next.js Full Stack App\",\n color: green,\n },\n {\n name: \"react-native\",\n display: \"React Native with Expo\",\n color: green,\n },\n] as const;\n\nconst TEMPLATE_NAMES = TEMPLATES.map(template => template.name);\n\ntype TemplateName = (typeof TEMPLATE_NAMES)[number];\n\n/**\n * App options\n */\nexport interface AppOptions {\n appName: string;\n template: TemplateName;\n targetDirectory: string;\n projectId: string;\n useSmartAccounts: boolean;\n enableOnramp: boolean;\n apiKeyId?: string;\n apiKeySecret?: string;\n}\n\ntype CommandLineArgs = {\n \"project-id\": string;\n template: TemplateName;\n \"smart-accounts\"?: boolean;\n onramp?: boolean;\n};\n\nconst uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Get app details from command line arguments or prompt the user\n *\n * @returns The app details\n */\nexport async function getAppDetails(): Promise<AppOptions> {\n const argv = minimist<CommandLineArgs>(process.argv.slice(2));\n\n // Get target directory from command line args (first non-option argument)\n let targetDir = argv._[0];\n const defaultAppName = targetDir ?? defaultTargetDir;\n let templateFromArgs: TemplateName | undefined = undefined;\n let projectIdFromArgs: string | undefined = undefined;\n let enableOnrampFromArgs: boolean | undefined = undefined;\n const useSmartAccountsFromArgs = argv[\"smart-accounts\"];\n\n // Validate template from argv\n if (argv.template) {\n if (!TEMPLATE_NAMES.includes(argv.template)) {\n console.log(\n yellow(\n `✖ Invalid template provided: \"${argv.template}\". Please choose from: ${TEMPLATE_NAMES.join(\", \")}.`,\n ),\n );\n } else {\n templateFromArgs = argv.template;\n }\n }\n\n // Validate projectId from argv\n if (argv[\"project-id\"]) {\n if (!uuidRegex.test(argv[\"project-id\"])) {\n console.log(\n yellow(`✖ Invalid Project ID provided: \"${argv.projectId}\". Please enter a valid UUID.`),\n );\n } else {\n projectIdFromArgs = argv[\"project-id\"];\n }\n }\n\n // Validate compatible template for onramp\n if (argv[\"onramp\"] !== undefined) {\n if (!argv[\"onramp\"]) {\n enableOnrampFromArgs = false;\n } else {\n // if template is not provided and onramp is enabled, force nextjs template\n if (!templateFromArgs) {\n templateFromArgs = \"nextjs\";\n }\n if (templateFromArgs !== \"nextjs\") {\n console.log(yellow(`✖ Onramp is only supported with the Next.js template.`));\n } else {\n enableOnrampFromArgs = true;\n }\n }\n }\n\n try {\n const result = await prompts(\n [\n {\n type: targetDir ? null : \"text\",\n name: \"appName\",\n message: reset(\"App Name:\"),\n initial: defaultAppName,\n onState: state => {\n targetDir = String(state.value).trim() || defaultAppName;\n },\n },\n {\n type: templateFromArgs ? null : \"select\",\n name: \"template\",\n message: reset(\"Template:\"),\n initial: 0,\n choices: TEMPLATES.map(template => ({\n title: template.color(template.display),\n value: template.name,\n })),\n },\n {\n type: projectIdFromArgs ? null : \"text\",\n name: \"projectId\",\n message: reset(\n \"CDP Project ID (Find your project ID at https://portal.cdp.coinbase.com/projects/overview):\",\n ),\n validate: value => {\n if (!value) {\n return \"Project ID is required\";\n } else if (!uuidRegex.test(value)) {\n return \"Project ID must be a valid UUID\";\n }\n return true;\n },\n initial: \"\",\n },\n {\n type: useSmartAccountsFromArgs !== undefined ? null : \"confirm\",\n name: \"useSmartAccounts\",\n message: reset(\n \"Enable Smart Accounts? (Smart Accounts enable gasless transactions and improved UX):\",\n ),\n initial: false,\n },\n {\n type: (_, { template }: { template?: string }) =>\n enableOnrampFromArgs !== undefined || (templateFromArgs || template) !== \"nextjs\"\n ? null\n : \"confirm\",\n name: \"enableOnramp\",\n message: reset(\"Enable Coinbase Onramp? (Onramp enables users to buy crypto with fiat):\"),\n initial: false,\n },\n {\n type: (_, { enableOnramp }: { enableOnramp?: boolean }) =>\n enableOnramp || enableOnrampFromArgs ? \"text\" : null,\n name: \"apiKeyId\",\n message: reset(\"CDP API Key ID (Create at https://portal.cdp.coinbase.com/api-keys):\"),\n validate: value => {\n if (!value) {\n return \"API Key ID is required for Onramp\";\n }\n return true;\n },\n },\n {\n type: (_, { enableOnramp }: { enableOnramp?: boolean }) =>\n enableOnramp || enableOnrampFromArgs ? \"password\" : null,\n name: \"apiKeySecret\",\n message: reset(\"CDP API Key Secret (paste your private key - it will be hidden):\"),\n validate: value => {\n if (!value) {\n return \"API Key Secret is required for Onramp\";\n }\n return true;\n },\n },\n {\n type: (_, { template }: { template?: string }) =>\n (templateFromArgs || template) === \"react-native\" ? null : \"confirm\",\n name: \"corsConfirmation\",\n message: reset(\n \"Confirm you have whitelisted 'http://localhost:3000' at https://portal.cdp.coinbase.com/products/embedded-wallets/domains:\",\n ),\n initial: true,\n },\n {\n type: () => (!fs.existsSync(targetDir) || isDirEmpty(targetDir) ? null : \"confirm\"),\n name: \"overwrite\",\n message: () =>\n (targetDir === \".\" ? \"Current directory\" : `Target directory \"${targetDir}\"`) +\n \" is not empty. Remove existing files and continue?\",\n },\n {\n type: (_, { overwrite }: { overwrite?: boolean }) => {\n if (overwrite === false) {\n throw new Error(red(\"✖\") + \" Operation cancelled\");\n }\n return null;\n },\n name: \"overwriteChecker\",\n },\n ],\n {\n onCancel: () => {\n throw new Error(red(\"✖\") + \" Operation cancelled\");\n },\n },\n );\n\n return {\n appName: result.appName || targetDir,\n template: templateFromArgs || result.template,\n targetDirectory: targetDir,\n projectId: projectIdFromArgs || result.projectId,\n useSmartAccounts: useSmartAccountsFromArgs ?? result.useSmartAccounts,\n enableOnramp: enableOnrampFromArgs ?? result.enableOnramp ?? false,\n apiKeyId: result.apiKeyId,\n apiKeySecret: result.apiKeySecret,\n };\n } catch (cancelled: unknown) {\n if (cancelled instanceof Error) {\n console.log(cancelled.message);\n }\n process.exit(0);\n }\n}\n","#!/usr/bin/env node\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { green } from \"kolorist\";\n\nimport { getAppDetails } from \"./getAppDetails.js\";\nimport {\n prepareAppDirectory,\n customizePackageJson,\n copyFileSelectively,\n customizeEnv,\n customizeConfig,\n customizeReactNativeFiles,\n detectPackageManager,\n} from \"./utils.js\";\n\nconst fileRenames: Record<string, string | undefined> = {\n _gitignore: \".gitignore\",\n};\n\n/**\n * Initialize a new CDP app\n */\nasync function init(): Promise<void> {\n const {\n appName,\n template,\n targetDirectory,\n projectId,\n useSmartAccounts,\n enableOnramp,\n apiKeyId,\n apiKeySecret,\n } = await getAppDetails();\n\n console.log(`\\nScaffolding app in ${targetDirectory}...`);\n\n const root = prepareAppDirectory(targetDirectory, false);\n const templateDir = path.resolve(fileURLToPath(import.meta.url), \"../..\", `template-${template}`);\n\n copyTemplateFiles({\n templateDir,\n root,\n appName,\n projectId,\n useSmartAccounts,\n enableOnramp,\n apiKeyId,\n apiKeySecret,\n });\n printNextSteps(root, template);\n}\n\n/**\n * Print next steps for the user\n *\n * @param appRoot - The root directory of the app\n * @param template - The template that was used\n */\nfunction printNextSteps(appRoot: string, template: string): void {\n const packageManager = detectPackageManager();\n\n console.log(green(\"\\nDone. Now run your app:\\n\"));\n if (appRoot !== process.cwd()) {\n console.log(`cd ${path.relative(process.cwd(), appRoot)}`);\n }\n\n console.log(`${packageManager} install`);\n\n if (template === \"react-native\") {\n const startCommand =\n packageManager === \"npm\"\n ? \"npm run ios # or npm run android\"\n : `${packageManager} run ios # or ${packageManager} run android`;\n console.log(startCommand);\n } else {\n const devCommand = packageManager === \"npm\" ? \"npm run dev\" : `${packageManager} dev`;\n console.log(devCommand);\n }\n}\n\n/**\n * Copy template files to the app directory\n *\n * @param params - The parameters for the function\n * @param params.templateDir - The directory containing the template files\n * @param params.root - The root directory of the app\n * @param params.appName - The name of the app\n * @param params.projectId - The CDP Project ID\n * @param params.useSmartAccounts - Whether to enable smart accounts\n * @param params.enableOnramp - Whether to include Onramp\n * @param params.apiKeyId - The API Key ID\n * @param params.apiKeySecret - The API Key Secret\n */\nfunction copyTemplateFiles({\n templateDir,\n root,\n appName,\n projectId,\n useSmartAccounts,\n enableOnramp,\n apiKeyId,\n apiKeySecret,\n}: {\n templateDir: string;\n root: string;\n appName: string;\n projectId?: string;\n useSmartAccounts?: boolean;\n enableOnramp?: boolean;\n apiKeyId?: string;\n apiKeySecret?: string;\n}): void {\n const writeFileToTarget = (file: string, content?: string) => {\n const targetPath = path.join(root, fileRenames[file] ?? file);\n if (content) {\n fs.writeFileSync(targetPath, content);\n } else {\n copyFileSelectively({\n filePath: path.join(templateDir, file),\n destPath: targetPath,\n useSmartAccounts,\n enableOnramp,\n });\n }\n };\n\n const isNextjs = templateDir.includes(\"nextjs\");\n const isReactNative = templateDir.includes(\"react-native\");\n\n // Get React Native customizations if needed\n const reactNativeCustomizations = isReactNative\n ? customizeReactNativeFiles(templateDir, appName)\n : null;\n\n const files = fs.readdirSync(templateDir);\n for (const file of files) {\n if (file === \"package.json\") {\n const customizedPackageJson = customizePackageJson(templateDir, appName, enableOnramp);\n writeFileToTarget(file, customizedPackageJson);\n } else if (file === \"env.example\" && projectId) {\n writeFileToTarget(file);\n const customizedEnv = customizeEnv({\n templateDir,\n projectId,\n useSmartAccounts,\n apiKeyId,\n apiKeySecret,\n });\n console.log(\"Copying CDP Project ID to .env\");\n if (apiKeyId && apiKeySecret) {\n console.log(\"Copying CDP API credentials to .env\");\n }\n if (useSmartAccounts) {\n console.log(\"Configuring Smart Accounts in environment\");\n }\n writeFileToTarget(\".env\", customizedEnv);\n } else if (file === \"app.json\" && isReactNative && reactNativeCustomizations?.appJson) {\n writeFileToTarget(file, reactNativeCustomizations.appJson);\n } else {\n writeFileToTarget(file);\n }\n }\n\n // Handle smart account configuration in config files\n if (useSmartAccounts && !isReactNative) {\n const configFileName = isNextjs ? \"src/components/Providers.tsx\" : \"src/config.ts\";\n const customizedConfig = customizeConfig(templateDir, useSmartAccounts, isNextjs);\n if (customizedConfig) {\n console.log(\"Configuring Smart Accounts in application config\");\n writeFileToTarget(configFileName, customizedConfig);\n }\n }\n\n // Generate the appropriate Transaction.tsx component\n if (isReactNative) {\n // For React Native, create the Transaction.tsx barrel file\n const transactionContent = generateTransactionComponent(useSmartAccounts);\n writeFileToTarget(\"Transaction.tsx\", transactionContent);\n } else {\n // For React/Next.js templates\n const transactionFileName = isNextjs ? \"src/components/Transaction.tsx\" : \"src/Transaction.tsx\";\n const transactionContent = generateTransactionComponent(useSmartAccounts);\n writeFileToTarget(transactionFileName, transactionContent);\n }\n\n // Apply React Native specific customizations\n if (isReactNative && reactNativeCustomizations) {\n // Write customized React Native files\n if (reactNativeCustomizations.infoPlist) {\n writeFileToTarget(\"ios/reactnativeexpo/Info.plist\", reactNativeCustomizations.infoPlist);\n }\n if (reactNativeCustomizations.buildGradle) {\n writeFileToTarget(\"android/app/build.gradle\", reactNativeCustomizations.buildGradle);\n }\n if (reactNativeCustomizations.xcodeProject) {\n writeFileToTarget(\n \"ios/reactnativeexpo.xcodeproj/project.pbxproj\",\n reactNativeCustomizations.xcodeProject,\n );\n }\n\n // Create new package directory structure for Android Kotlin files\n const newPackageDir = path.join(\n root,\n \"android/app/src/main/java\",\n reactNativeCustomizations.newPackagePath,\n );\n fs.mkdirSync(newPackageDir, { recursive: true });\n\n if (reactNativeCustomizations.mainActivity) {\n const newMainActivityPath = path.join(\n \"android/app/src/main/java\",\n reactNativeCustomizations.newPackagePath,\n \"MainActivity.kt\",\n );\n writeFileToTarget(newMainActivityPath, reactNativeCustomizations.mainActivity);\n }\n if (reactNativeCustomizations.mainApplication) {\n const newMainApplicationPath = path.join(\n \"android/app/src/main/java\",\n reactNativeCustomizations.newPackagePath,\n \"MainApplication.kt\",\n );\n writeFileToTarget(newMainApplicationPath, reactNativeCustomizations.mainApplication);\n }\n\n // Remove old package directory\n const oldPackageDir = path.join(\n root,\n \"android/app/src/main/java/com/anonymous/reactnativeexpo\",\n );\n if (fs.existsSync(oldPackageDir)) {\n fs.rmSync(oldPackageDir, { recursive: true, force: true });\n }\n\n // Update android/gradlew permissions so that the template is runnable\n const gradlewPath = path.join(root, \"android\", \"gradlew\");\n if (fs.existsSync(gradlewPath)) {\n fs.chmodSync(gradlewPath, 0o755);\n }\n }\n}\n\n/**\n * Generate the appropriate Transaction component based on account type\n *\n * @param useSmartAccounts - Whether to use Smart Accounts\n * @returns The generated Transaction component content\n */\nfunction generateTransactionComponent(useSmartAccounts?: boolean): string {\n if (useSmartAccounts) {\n return `export { default } from \"./SmartAccountTransaction\";`;\n } else {\n return `export { default } from \"./EOATransaction\";`;\n }\n}\n\ninit().catch(e => {\n console.error(e);\n process.exit(1);\n});\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -67,6 +67,8 @@ PODS:
|
|
|
67
67
|
- ReactCommon/turbomodule/bridging
|
|
68
68
|
- ReactCommon/turbomodule/core
|
|
69
69
|
- Yoga
|
|
70
|
+
- ExpoSecureStore (15.0.7):
|
|
71
|
+
- ExpoModulesCore
|
|
70
72
|
- fast_float (6.1.4)
|
|
71
73
|
- FBLazyVector (0.79.6)
|
|
72
74
|
- fmt (11.0.2)
|
|
@@ -1777,90 +1779,91 @@ PODS:
|
|
|
1777
1779
|
- Yoga (0.0.0)
|
|
1778
1780
|
|
|
1779
1781
|
DEPENDENCIES:
|
|
1780
|
-
- boost (from
|
|
1781
|
-
- DoubleConversion (from
|
|
1782
|
-
- EXConstants (from
|
|
1783
|
-
- Expo (from
|
|
1784
|
-
- ExpoAsset (from
|
|
1782
|
+
- boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
|
|
1783
|
+
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
|
1784
|
+
- EXConstants (from `../node_modules/expo-constants/ios`)
|
|
1785
|
+
- Expo (from `../node_modules/expo`)
|
|
1786
|
+
- ExpoAsset (from `../node_modules/expo-asset/ios`)
|
|
1785
1787
|
- ExpoClipboard (from `../node_modules/expo-clipboard/ios`)
|
|
1786
|
-
- ExpoCrypto (from
|
|
1787
|
-
- ExpoFileSystem (from
|
|
1788
|
-
- ExpoFont (from
|
|
1789
|
-
- ExpoKeepAwake (from
|
|
1790
|
-
- ExpoModulesCore (from
|
|
1791
|
-
-
|
|
1792
|
-
-
|
|
1793
|
-
-
|
|
1794
|
-
-
|
|
1795
|
-
-
|
|
1796
|
-
-
|
|
1797
|
-
- RCT-Folly
|
|
1798
|
-
-
|
|
1799
|
-
-
|
|
1800
|
-
-
|
|
1801
|
-
-
|
|
1802
|
-
- React
|
|
1803
|
-
- React-
|
|
1804
|
-
- React-Core
|
|
1805
|
-
- React-
|
|
1806
|
-
- React-
|
|
1807
|
-
- React-
|
|
1808
|
-
- React-
|
|
1809
|
-
- React-
|
|
1810
|
-
- React-
|
|
1811
|
-
- React-
|
|
1812
|
-
- React-
|
|
1813
|
-
- React-
|
|
1814
|
-
- React-
|
|
1815
|
-
- React-
|
|
1816
|
-
- React-
|
|
1817
|
-
- React-
|
|
1818
|
-
- React-
|
|
1819
|
-
- React-
|
|
1820
|
-
- React-
|
|
1821
|
-
- React-
|
|
1822
|
-
- React-
|
|
1823
|
-
- React-
|
|
1824
|
-
- React-
|
|
1825
|
-
- React-
|
|
1826
|
-
- React-
|
|
1827
|
-
- React-
|
|
1828
|
-
- React-
|
|
1829
|
-
-
|
|
1830
|
-
- react-native-
|
|
1831
|
-
-
|
|
1832
|
-
- React-
|
|
1833
|
-
- React-
|
|
1834
|
-
- React-
|
|
1835
|
-
- React-
|
|
1836
|
-
- React-
|
|
1837
|
-
- React-
|
|
1838
|
-
- React-
|
|
1839
|
-
- React-
|
|
1840
|
-
- React-
|
|
1841
|
-
- React-
|
|
1842
|
-
- React-
|
|
1843
|
-
- React-
|
|
1844
|
-
- React-
|
|
1845
|
-
- React-
|
|
1846
|
-
- React-
|
|
1847
|
-
- React-
|
|
1848
|
-
- React-
|
|
1849
|
-
- React-
|
|
1850
|
-
- React-
|
|
1851
|
-
- React-
|
|
1852
|
-
- React-
|
|
1853
|
-
- React-
|
|
1854
|
-
- React-
|
|
1855
|
-
- React-
|
|
1856
|
-
- React-
|
|
1857
|
-
- React-
|
|
1858
|
-
- React-
|
|
1788
|
+
- ExpoCrypto (from `../node_modules/expo-crypto/ios`)
|
|
1789
|
+
- ExpoFileSystem (from `../node_modules/expo-file-system/ios`)
|
|
1790
|
+
- ExpoFont (from `../node_modules/expo-font/ios`)
|
|
1791
|
+
- ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
|
|
1792
|
+
- ExpoModulesCore (from `../node_modules/expo-modules-core`)
|
|
1793
|
+
- ExpoSecureStore (from `../node_modules/expo-secure-store/ios`)
|
|
1794
|
+
- fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
|
|
1795
|
+
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
|
1796
|
+
- fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`)
|
|
1797
|
+
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
|
1798
|
+
- hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
|
|
1799
|
+
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
|
1800
|
+
- RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
|
1801
|
+
- RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
|
|
1802
|
+
- RCTRequired (from `../node_modules/react-native/Libraries/Required`)
|
|
1803
|
+
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
|
|
1804
|
+
- React (from `../node_modules/react-native/`)
|
|
1805
|
+
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
|
|
1806
|
+
- React-Core (from `../node_modules/react-native/`)
|
|
1807
|
+
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
|
|
1808
|
+
- React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
|
|
1809
|
+
- React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
|
|
1810
|
+
- React-debug (from `../node_modules/react-native/ReactCommon/react/debug`)
|
|
1811
|
+
- React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`)
|
|
1812
|
+
- React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`)
|
|
1813
|
+
- React-Fabric (from `../node_modules/react-native/ReactCommon`)
|
|
1814
|
+
- React-FabricComponents (from `../node_modules/react-native/ReactCommon`)
|
|
1815
|
+
- React-FabricImage (from `../node_modules/react-native/ReactCommon`)
|
|
1816
|
+
- React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`)
|
|
1817
|
+
- React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`)
|
|
1818
|
+
- React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`)
|
|
1819
|
+
- React-hermes (from `../node_modules/react-native/ReactCommon/hermes`)
|
|
1820
|
+
- React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`)
|
|
1821
|
+
- React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`)
|
|
1822
|
+
- React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`)
|
|
1823
|
+
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
|
|
1824
|
+
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
|
|
1825
|
+
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`)
|
|
1826
|
+
- React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`)
|
|
1827
|
+
- React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`)
|
|
1828
|
+
- React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`)
|
|
1829
|
+
- React-logger (from `../node_modules/react-native/ReactCommon/logger`)
|
|
1830
|
+
- React-Mapbuffer (from `../node_modules/react-native/ReactCommon`)
|
|
1831
|
+
- React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)
|
|
1832
|
+
- react-native-get-random-values (from `../node_modules/react-native-get-random-values`)
|
|
1833
|
+
- react-native-quick-crypto (from `../node_modules/react-native-quick-crypto`)
|
|
1834
|
+
- React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
|
|
1835
|
+
- React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`)
|
|
1836
|
+
- React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
|
|
1837
|
+
- React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`)
|
|
1838
|
+
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
|
|
1839
|
+
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
|
|
1840
|
+
- React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`)
|
|
1841
|
+
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
|
|
1842
|
+
- React-RCTFabric (from `../node_modules/react-native/React`)
|
|
1843
|
+
- React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`)
|
|
1844
|
+
- React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
|
|
1845
|
+
- React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
|
|
1846
|
+
- React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
|
|
1847
|
+
- React-RCTRuntime (from `../node_modules/react-native/React/Runtime`)
|
|
1848
|
+
- React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
|
|
1849
|
+
- React-RCTText (from `../node_modules/react-native/Libraries/Text`)
|
|
1850
|
+
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
|
|
1851
|
+
- React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`)
|
|
1852
|
+
- React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`)
|
|
1853
|
+
- React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`)
|
|
1854
|
+
- React-rncore (from `../node_modules/react-native/ReactCommon`)
|
|
1855
|
+
- React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`)
|
|
1856
|
+
- React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`)
|
|
1857
|
+
- React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
|
|
1858
|
+
- React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`)
|
|
1859
|
+
- React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
|
|
1860
|
+
- React-timing (from `../node_modules/react-native/ReactCommon/react/timing`)
|
|
1861
|
+
- React-utils (from `../node_modules/react-native/ReactCommon/react/utils`)
|
|
1859
1862
|
- ReactAppDependencyProvider (from `build/generated/ios`)
|
|
1860
1863
|
- ReactCodegen (from `build/generated/ios`)
|
|
1861
|
-
- ReactCommon/turbomodule/core (from
|
|
1862
|
-
- "RNCAsyncStorage (from
|
|
1863
|
-
- Yoga (from
|
|
1864
|
+
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
|
|
1865
|
+
- "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
|
|
1866
|
+
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
|
|
1864
1867
|
|
|
1865
1868
|
SPEC REPOS:
|
|
1866
1869
|
trunk:
|
|
@@ -1869,170 +1872,172 @@ SPEC REPOS:
|
|
|
1869
1872
|
|
|
1870
1873
|
EXTERNAL SOURCES:
|
|
1871
1874
|
boost:
|
|
1872
|
-
:podspec: "
|
|
1875
|
+
:podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
|
|
1873
1876
|
DoubleConversion:
|
|
1874
|
-
:podspec: "
|
|
1877
|
+
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
|
1875
1878
|
EXConstants:
|
|
1876
|
-
:path: "
|
|
1879
|
+
:path: "../node_modules/expo-constants/ios"
|
|
1877
1880
|
Expo:
|
|
1878
|
-
:path: "
|
|
1881
|
+
:path: "../node_modules/expo"
|
|
1879
1882
|
ExpoAsset:
|
|
1880
|
-
:path: "
|
|
1883
|
+
:path: "../node_modules/expo-asset/ios"
|
|
1881
1884
|
ExpoClipboard:
|
|
1882
1885
|
:path: "../node_modules/expo-clipboard/ios"
|
|
1883
1886
|
ExpoCrypto:
|
|
1884
|
-
:path: "
|
|
1887
|
+
:path: "../node_modules/expo-crypto/ios"
|
|
1885
1888
|
ExpoFileSystem:
|
|
1886
|
-
:path: "
|
|
1889
|
+
:path: "../node_modules/expo-file-system/ios"
|
|
1887
1890
|
ExpoFont:
|
|
1888
|
-
:path: "
|
|
1891
|
+
:path: "../node_modules/expo-font/ios"
|
|
1889
1892
|
ExpoKeepAwake:
|
|
1890
|
-
:path: "
|
|
1893
|
+
:path: "../node_modules/expo-keep-awake/ios"
|
|
1891
1894
|
ExpoModulesCore:
|
|
1892
|
-
:path: "
|
|
1895
|
+
:path: "../node_modules/expo-modules-core"
|
|
1896
|
+
ExpoSecureStore:
|
|
1897
|
+
:path: "../node_modules/expo-secure-store/ios"
|
|
1893
1898
|
fast_float:
|
|
1894
|
-
:podspec: "
|
|
1899
|
+
:podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec"
|
|
1895
1900
|
FBLazyVector:
|
|
1896
|
-
:path: "
|
|
1901
|
+
:path: "../node_modules/react-native/Libraries/FBLazyVector"
|
|
1897
1902
|
fmt:
|
|
1898
|
-
:podspec: "
|
|
1903
|
+
:podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec"
|
|
1899
1904
|
glog:
|
|
1900
|
-
:podspec: "
|
|
1905
|
+
:podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
|
|
1901
1906
|
hermes-engine:
|
|
1902
|
-
:podspec: "
|
|
1907
|
+
:podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
|
|
1903
1908
|
:tag: hermes-2025-06-04-RNv0.79.3-7f9a871eefeb2c3852365ee80f0b6733ec12ac3b
|
|
1904
1909
|
RCT-Folly:
|
|
1905
|
-
:podspec: "
|
|
1910
|
+
:podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
|
|
1906
1911
|
RCTDeprecation:
|
|
1907
|
-
:path: "
|
|
1912
|
+
:path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation"
|
|
1908
1913
|
RCTRequired:
|
|
1909
|
-
:path: "
|
|
1914
|
+
:path: "../node_modules/react-native/Libraries/Required"
|
|
1910
1915
|
RCTTypeSafety:
|
|
1911
|
-
:path: "
|
|
1916
|
+
:path: "../node_modules/react-native/Libraries/TypeSafety"
|
|
1912
1917
|
React:
|
|
1913
|
-
:path: "
|
|
1918
|
+
:path: "../node_modules/react-native/"
|
|
1914
1919
|
React-callinvoker:
|
|
1915
|
-
:path: "
|
|
1920
|
+
:path: "../node_modules/react-native/ReactCommon/callinvoker"
|
|
1916
1921
|
React-Core:
|
|
1917
|
-
:path: "
|
|
1922
|
+
:path: "../node_modules/react-native/"
|
|
1918
1923
|
React-CoreModules:
|
|
1919
|
-
:path: "
|
|
1924
|
+
:path: "../node_modules/react-native/React/CoreModules"
|
|
1920
1925
|
React-cxxreact:
|
|
1921
|
-
:path: "
|
|
1926
|
+
:path: "../node_modules/react-native/ReactCommon/cxxreact"
|
|
1922
1927
|
React-debug:
|
|
1923
|
-
:path: "
|
|
1928
|
+
:path: "../node_modules/react-native/ReactCommon/react/debug"
|
|
1924
1929
|
React-defaultsnativemodule:
|
|
1925
|
-
:path: "
|
|
1930
|
+
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults"
|
|
1926
1931
|
React-domnativemodule:
|
|
1927
|
-
:path: "
|
|
1932
|
+
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom"
|
|
1928
1933
|
React-Fabric:
|
|
1929
|
-
:path: "
|
|
1934
|
+
:path: "../node_modules/react-native/ReactCommon"
|
|
1930
1935
|
React-FabricComponents:
|
|
1931
|
-
:path: "
|
|
1936
|
+
:path: "../node_modules/react-native/ReactCommon"
|
|
1932
1937
|
React-FabricImage:
|
|
1933
|
-
:path: "
|
|
1938
|
+
:path: "../node_modules/react-native/ReactCommon"
|
|
1934
1939
|
React-featureflags:
|
|
1935
|
-
:path: "
|
|
1940
|
+
:path: "../node_modules/react-native/ReactCommon/react/featureflags"
|
|
1936
1941
|
React-featureflagsnativemodule:
|
|
1937
|
-
:path: "
|
|
1942
|
+
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags"
|
|
1938
1943
|
React-graphics:
|
|
1939
|
-
:path: "
|
|
1944
|
+
:path: "../node_modules/react-native/ReactCommon/react/renderer/graphics"
|
|
1940
1945
|
React-hermes:
|
|
1941
|
-
:path: "
|
|
1946
|
+
:path: "../node_modules/react-native/ReactCommon/hermes"
|
|
1942
1947
|
React-idlecallbacksnativemodule:
|
|
1943
|
-
:path: "
|
|
1948
|
+
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks"
|
|
1944
1949
|
React-ImageManager:
|
|
1945
|
-
:path: "
|
|
1950
|
+
:path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios"
|
|
1946
1951
|
React-jserrorhandler:
|
|
1947
|
-
:path: "
|
|
1952
|
+
:path: "../node_modules/react-native/ReactCommon/jserrorhandler"
|
|
1948
1953
|
React-jsi:
|
|
1949
|
-
:path: "
|
|
1954
|
+
:path: "../node_modules/react-native/ReactCommon/jsi"
|
|
1950
1955
|
React-jsiexecutor:
|
|
1951
|
-
:path: "
|
|
1956
|
+
:path: "../node_modules/react-native/ReactCommon/jsiexecutor"
|
|
1952
1957
|
React-jsinspector:
|
|
1953
|
-
:path: "
|
|
1958
|
+
:path: "../node_modules/react-native/ReactCommon/jsinspector-modern"
|
|
1954
1959
|
React-jsinspectortracing:
|
|
1955
|
-
:path: "
|
|
1960
|
+
:path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing"
|
|
1956
1961
|
React-jsitooling:
|
|
1957
|
-
:path: "
|
|
1962
|
+
:path: "../node_modules/react-native/ReactCommon/jsitooling"
|
|
1958
1963
|
React-jsitracing:
|
|
1959
|
-
:path: "
|
|
1964
|
+
:path: "../node_modules/react-native/ReactCommon/hermes/executor/"
|
|
1960
1965
|
React-logger:
|
|
1961
|
-
:path: "
|
|
1966
|
+
:path: "../node_modules/react-native/ReactCommon/logger"
|
|
1962
1967
|
React-Mapbuffer:
|
|
1963
|
-
:path: "
|
|
1968
|
+
:path: "../node_modules/react-native/ReactCommon"
|
|
1964
1969
|
React-microtasksnativemodule:
|
|
1965
|
-
:path: "
|
|
1970
|
+
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
|
|
1966
1971
|
react-native-get-random-values:
|
|
1967
|
-
:path: "
|
|
1972
|
+
:path: "../node_modules/react-native-get-random-values"
|
|
1968
1973
|
react-native-quick-crypto:
|
|
1969
|
-
:path: "
|
|
1974
|
+
:path: "../node_modules/react-native-quick-crypto"
|
|
1970
1975
|
React-NativeModulesApple:
|
|
1971
|
-
:path: "
|
|
1976
|
+
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
|
|
1972
1977
|
React-oscompat:
|
|
1973
|
-
:path: "
|
|
1978
|
+
:path: "../node_modules/react-native/ReactCommon/oscompat"
|
|
1974
1979
|
React-perflogger:
|
|
1975
|
-
:path: "
|
|
1980
|
+
:path: "../node_modules/react-native/ReactCommon/reactperflogger"
|
|
1976
1981
|
React-performancetimeline:
|
|
1977
|
-
:path: "
|
|
1982
|
+
:path: "../node_modules/react-native/ReactCommon/react/performance/timeline"
|
|
1978
1983
|
React-RCTActionSheet:
|
|
1979
|
-
:path: "
|
|
1984
|
+
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
|
|
1980
1985
|
React-RCTAnimation:
|
|
1981
|
-
:path: "
|
|
1986
|
+
:path: "../node_modules/react-native/Libraries/NativeAnimation"
|
|
1982
1987
|
React-RCTAppDelegate:
|
|
1983
|
-
:path: "
|
|
1988
|
+
:path: "../node_modules/react-native/Libraries/AppDelegate"
|
|
1984
1989
|
React-RCTBlob:
|
|
1985
|
-
:path: "
|
|
1990
|
+
:path: "../node_modules/react-native/Libraries/Blob"
|
|
1986
1991
|
React-RCTFabric:
|
|
1987
|
-
:path: "
|
|
1992
|
+
:path: "../node_modules/react-native/React"
|
|
1988
1993
|
React-RCTFBReactNativeSpec:
|
|
1989
|
-
:path: "
|
|
1994
|
+
:path: "../node_modules/react-native/React"
|
|
1990
1995
|
React-RCTImage:
|
|
1991
|
-
:path: "
|
|
1996
|
+
:path: "../node_modules/react-native/Libraries/Image"
|
|
1992
1997
|
React-RCTLinking:
|
|
1993
|
-
:path: "
|
|
1998
|
+
:path: "../node_modules/react-native/Libraries/LinkingIOS"
|
|
1994
1999
|
React-RCTNetwork:
|
|
1995
|
-
:path: "
|
|
2000
|
+
:path: "../node_modules/react-native/Libraries/Network"
|
|
1996
2001
|
React-RCTRuntime:
|
|
1997
|
-
:path: "
|
|
2002
|
+
:path: "../node_modules/react-native/React/Runtime"
|
|
1998
2003
|
React-RCTSettings:
|
|
1999
|
-
:path: "
|
|
2004
|
+
:path: "../node_modules/react-native/Libraries/Settings"
|
|
2000
2005
|
React-RCTText:
|
|
2001
|
-
:path: "
|
|
2006
|
+
:path: "../node_modules/react-native/Libraries/Text"
|
|
2002
2007
|
React-RCTVibration:
|
|
2003
|
-
:path: "
|
|
2008
|
+
:path: "../node_modules/react-native/Libraries/Vibration"
|
|
2004
2009
|
React-rendererconsistency:
|
|
2005
|
-
:path: "
|
|
2010
|
+
:path: "../node_modules/react-native/ReactCommon/react/renderer/consistency"
|
|
2006
2011
|
React-renderercss:
|
|
2007
|
-
:path: "
|
|
2012
|
+
:path: "../node_modules/react-native/ReactCommon/react/renderer/css"
|
|
2008
2013
|
React-rendererdebug:
|
|
2009
|
-
:path: "
|
|
2014
|
+
:path: "../node_modules/react-native/ReactCommon/react/renderer/debug"
|
|
2010
2015
|
React-rncore:
|
|
2011
|
-
:path: "
|
|
2016
|
+
:path: "../node_modules/react-native/ReactCommon"
|
|
2012
2017
|
React-RuntimeApple:
|
|
2013
|
-
:path: "
|
|
2018
|
+
:path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios"
|
|
2014
2019
|
React-RuntimeCore:
|
|
2015
|
-
:path: "
|
|
2020
|
+
:path: "../node_modules/react-native/ReactCommon/react/runtime"
|
|
2016
2021
|
React-runtimeexecutor:
|
|
2017
|
-
:path: "
|
|
2022
|
+
:path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
|
|
2018
2023
|
React-RuntimeHermes:
|
|
2019
|
-
:path: "
|
|
2024
|
+
:path: "../node_modules/react-native/ReactCommon/react/runtime"
|
|
2020
2025
|
React-runtimescheduler:
|
|
2021
|
-
:path: "
|
|
2026
|
+
:path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler"
|
|
2022
2027
|
React-timing:
|
|
2023
|
-
:path: "
|
|
2028
|
+
:path: "../node_modules/react-native/ReactCommon/react/timing"
|
|
2024
2029
|
React-utils:
|
|
2025
|
-
:path: "
|
|
2030
|
+
:path: "../node_modules/react-native/ReactCommon/react/utils"
|
|
2026
2031
|
ReactAppDependencyProvider:
|
|
2027
2032
|
:path: build/generated/ios
|
|
2028
2033
|
ReactCodegen:
|
|
2029
2034
|
:path: build/generated/ios
|
|
2030
2035
|
ReactCommon:
|
|
2031
|
-
:path: "
|
|
2036
|
+
:path: "../node_modules/react-native/ReactCommon"
|
|
2032
2037
|
RNCAsyncStorage:
|
|
2033
|
-
:path: "
|
|
2038
|
+
:path: "../node_modules/@react-native-async-storage/async-storage"
|
|
2034
2039
|
Yoga:
|
|
2035
|
-
:path: "
|
|
2040
|
+
:path: "../node_modules/react-native/ReactCommon/yoga"
|
|
2036
2041
|
|
|
2037
2042
|
SPEC CHECKSUMS:
|
|
2038
2043
|
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
|
|
@@ -2046,6 +2051,7 @@ SPEC CHECKSUMS:
|
|
|
2046
2051
|
ExpoFont: cf508bc2e6b70871e05386d71cab927c8524cc8e
|
|
2047
2052
|
ExpoKeepAwake: bf0811570c8da182bfb879169437d4de298376e7
|
|
2048
2053
|
ExpoModulesCore: 00a1b5c73248465bd0b93f59f8538c4573dac579
|
|
2054
|
+
ExpoSecureStore: 9c6571fe3fcb045a671c4011c451546eaaab98fd
|
|
2049
2055
|
fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6
|
|
2050
2056
|
FBLazyVector: 07309209b7b914451b8f822544a18e2a0a85afff
|
|
2051
2057
|
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# OSX
|
|
2
|
+
#
|
|
3
|
+
.DS_Store
|
|
4
|
+
|
|
5
|
+
# Xcode
|
|
6
|
+
#
|
|
7
|
+
build/
|
|
8
|
+
*.pbxuser
|
|
9
|
+
!default.pbxuser
|
|
10
|
+
*.mode1v3
|
|
11
|
+
!default.mode1v3
|
|
12
|
+
*.mode2v3
|
|
13
|
+
!default.mode2v3
|
|
14
|
+
*.perspectivev3
|
|
15
|
+
!default.perspectivev3
|
|
16
|
+
xcuserdata
|
|
17
|
+
*.xccheckout
|
|
18
|
+
*.moved-aside
|
|
19
|
+
DerivedData
|
|
20
|
+
*.hmap
|
|
21
|
+
*.ipa
|
|
22
|
+
*.xcuserstate
|
|
23
|
+
project.xcworkspace
|
|
24
|
+
.xcode.env.local
|
|
25
|
+
|
|
26
|
+
# Bundle artifacts
|
|
27
|
+
*.jsbundle
|
|
28
|
+
|
|
29
|
+
# CocoaPods
|
|
30
|
+
/Pods/
|
|
@@ -453,7 +453,7 @@
|
|
|
453
453
|
"$(inherited)",
|
|
454
454
|
" ",
|
|
455
455
|
);
|
|
456
|
-
REACT_NATIVE_PATH = "${PODS_ROOT}
|
|
456
|
+
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
|
457
457
|
SDKROOT = iphoneos;
|
|
458
458
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
|
|
459
459
|
USE_HERMES = true;
|
|
@@ -511,7 +511,7 @@
|
|
|
511
511
|
"$(inherited)",
|
|
512
512
|
" ",
|
|
513
513
|
);
|
|
514
|
-
REACT_NATIVE_PATH = "${PODS_ROOT}
|
|
514
|
+
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
|
515
515
|
SDKROOT = iphoneos;
|
|
516
516
|
USE_HERMES = true;
|
|
517
517
|
VALIDATE_PRODUCT = YES;
|
|
@@ -15,8 +15,10 @@
|
|
|
15
15
|
"@react-native-async-storage/async-storage": "^2.2.0",
|
|
16
16
|
"@ungap/structured-clone": "^1.3.0",
|
|
17
17
|
"expo": "~53.0.22",
|
|
18
|
+
"expo-asset": "~11.1.7",
|
|
18
19
|
"expo-clipboard": "~7.1.5",
|
|
19
20
|
"expo-crypto": "^14.1.5",
|
|
21
|
+
"expo-secure-store": "^15.0.7",
|
|
20
22
|
"expo-status-bar": "~2.2.3",
|
|
21
23
|
"react": "19.1.0",
|
|
22
24
|
"react-native": "0.79.6",
|