From 6f0300fd7c23fd4ff733bb7425e48da22b7250bd Mon Sep 17 00:00:00 2001 From: veganbeef Date: Tue, 1 Jul 2025 17:27:24 -0700 Subject: [PATCH] feat: update constant writes --- bin/init.js | 74 ++++++++++++++++++++-------- src/app/providers.tsx | 3 +- src/components/ui/tabs/WalletTab.tsx | 13 ----- src/lib/constants.ts | 9 ++++ 4 files changed, 65 insertions(+), 34 deletions(-) diff --git a/bin/init.js b/bin/init.js index eceba28..df33f7d 100644 --- a/bin/init.js +++ b/bin/init.js @@ -453,47 +453,81 @@ export async function init(projectName = null, autoAcceptDefaults = false) { if (fs.existsSync(constantsPath)) { let constantsContent = fs.readFileSync(constantsPath, 'utf8'); + // Helper function to escape single quotes in strings + const escapeString = (str) => str.replace(/'/g, "\\'"); + + // Helper function to safely replace constants with validation + const safeReplace = (content, pattern, replacement, constantName) => { + const newContent = content.replace(pattern, replacement); + if (newContent === content) { + console.log(`⚠️ Warning: Could not update ${constantName} in constants.ts`); + } + return newContent; + }; + // Update APP_NAME - constantsContent = constantsContent.replace( - /export const APP_NAME = ['"`][^'"`]*['"`];/, - `export const APP_NAME = '${answers.projectName}';` + constantsContent = safeReplace( + constantsContent, + /export const APP_NAME\s*=\s*['"`][^'"`]*['"`];/, + `export const APP_NAME = '${escapeString(answers.projectName)}';`, + 'APP_NAME' ); // Update APP_DESCRIPTION - constantsContent = constantsContent.replace( - /export const APP_DESCRIPTION = ['"`][^'"`]*['"`];/, - `export const APP_DESCRIPTION = '${answers.description}';` + constantsContent = safeReplace( + constantsContent, + /export const APP_DESCRIPTION\s*=\s*['"`][^'"`]*['"`];/, + `export const APP_DESCRIPTION = '${escapeString(answers.description)}';`, + 'APP_DESCRIPTION' ); // Update APP_PRIMARY_CATEGORY if (answers.primaryCategory) { - constantsContent = constantsContent.replace( - /export const APP_PRIMARY_CATEGORY = ['"`][^'"`]*['"`];/, - `export const APP_PRIMARY_CATEGORY = '${answers.primaryCategory}';` + constantsContent = safeReplace( + constantsContent, + /export const APP_PRIMARY_CATEGORY\s*=\s*['"`][^'"`]*['"`];/, + `export const APP_PRIMARY_CATEGORY = '${escapeString(answers.primaryCategory)}';`, + 'APP_PRIMARY_CATEGORY' ); } // Update APP_TAGS - const tagsString = answers.tags.length > 0 ? `['${answers.tags.join("', '")}']` : "['neynar', 'starter-kit', 'demo']"; - constantsContent = constantsContent.replace( - /export const APP_TAGS = \[[^\]]*\];/, - `export const APP_TAGS = ${tagsString};` + const tagsString = answers.tags.length > 0 + ? `['${answers.tags.map(tag => escapeString(tag)).join("', '")}']` + : "['neynar', 'starter-kit', 'demo']"; + constantsContent = safeReplace( + constantsContent, + /export const APP_TAGS\s*=\s*\[[^\]]*\];/, + `export const APP_TAGS = ${tagsString};`, + 'APP_TAGS' ); // Update APP_BUTTON_TEXT - constantsContent = constantsContent.replace( - /export const APP_BUTTON_TEXT = ['"`][^'"`]*['"`];/, - `export const APP_BUTTON_TEXT = '${answers.buttonText}';` + constantsContent = safeReplace( + constantsContent, + /export const APP_BUTTON_TEXT\s*=\s*['"`][^'"`]*['"`];/, + `export const APP_BUTTON_TEXT = '${escapeString(answers.buttonText)}';`, + 'APP_BUTTON_TEXT' ); // Update USE_WALLET - constantsContent = constantsContent.replace( - /export const USE_WALLET = (true|false);/, - `export const USE_WALLET = ${answers.useWallet};` + constantsContent = safeReplace( + constantsContent, + /export const USE_WALLET\s*=\s*(true|false);/, + `export const USE_WALLET = ${answers.useWallet};`, + 'USE_WALLET' + ); + + // Update ANALYTICS_ENABLED + constantsContent = safeReplace( + constantsContent, + /export const ANALYTICS_ENABLED\s*=\s*(true|false);/, + `export const ANALYTICS_ENABLED = ${answers.enableAnalytics};`, + 'ANALYTICS_ENABLED' ); fs.writeFileSync(constantsPath, constantsContent); - console.log('Updated constants.ts with user configuration'); + console.log('✅ Updated constants.ts with user configuration'); } else { console.log('⚠️ constants.ts not found, skipping constants update'); } diff --git a/src/app/providers.tsx b/src/app/providers.tsx index 56c2f1f..959cf90 100644 --- a/src/app/providers.tsx +++ b/src/app/providers.tsx @@ -5,6 +5,7 @@ import type { Session } from "next-auth"; import { SessionProvider } from "next-auth/react"; import { MiniAppProvider } from "@neynar/react"; import { SafeFarcasterSolanaProvider } from "~/components/providers/SafeFarcasterSolanaProvider"; +import { ANALYTICS_ENABLED } from "~/lib/constants"; const WagmiProvider = dynamic( () => import("~/components/providers/WagmiProvider"), @@ -18,7 +19,7 @@ export function Providers({ session, children }: { session: Session | null, chil return ( - + {children} diff --git a/src/components/ui/tabs/WalletTab.tsx b/src/components/ui/tabs/WalletTab.tsx index 8acb8c4..0d2d08d 100644 --- a/src/components/ui/tabs/WalletTab.tsx +++ b/src/components/ui/tabs/WalletTab.tsx @@ -157,19 +157,6 @@ export function WalletTab() { } = useSwitchChain(); // --- Effects --- - /** - * Debug logging for wallet auto-connection and state changes. - * Logs context, connection status, address, and available connectors. - */ - useEffect(() => { - console.log("WalletTab Debug Info:"); - console.log("- context:", context); - console.log("- isConnected:", isConnected); - console.log("- address:", address); - console.log("- connectors:", connectors); - console.log("- context?.user:", context?.user); - }, [context, isConnected, address, connectors]); - /** * Auto-connect when Farcaster context is available. * diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 60e5a8b..1c54227 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -90,3 +90,12 @@ export const APP_WEBHOOK_URL = process.env.NEYNAR_API_KEY && process.env.NEYNAR_ * Useful for mini apps that don't require wallet integration. */ export const USE_WALLET = true; + +/** + * Flag to enable/disable analytics tracking. + * + * When true, usage analytics are collected and sent to Neynar. + * When false, analytics collection is disabled. + * Useful for privacy-conscious users or development environments. + */ +export const ANALYTICS_ENABLED = true;