|
|
#!/usr/bin/env node |
|
|
|
|
|
/** |
|
|
* This script is used to reset the project to a blank state. |
|
|
* It deletes or moves the /app, /components, /hooks, /scripts, and /constants directories to /app-example based on user input and creates a new /app directory with an index.tsx and _layout.tsx file. |
|
|
* You can remove the `reset-project` script from package.json and safely delete this file after running it. |
|
|
*/ |
|
|
|
|
|
const fs = require("fs"); |
|
|
const path = require("path"); |
|
|
const readline = require("readline"); |
|
|
|
|
|
const root = process.cwd(); |
|
|
const oldDirs = ["app", "components", "hooks", "constants", "scripts"]; |
|
|
const exampleDir = "app-example"; |
|
|
const newAppDir = "app"; |
|
|
const exampleDirPath = path.join(root, exampleDir); |
|
|
|
|
|
const indexContent = `import { Text, View } from "react-native"; |
|
|
|
|
|
export default function Index() { |
|
|
return ( |
|
|
<View |
|
|
style={{ |
|
|
flex: 1, |
|
|
justifyContent: "center", |
|
|
alignItems: "center", |
|
|
}} |
|
|
> |
|
|
<Text>Edit app/index.tsx to edit this screen.</Text> |
|
|
</View> |
|
|
); |
|
|
} |
|
|
`; |
|
|
|
|
|
const layoutContent = `import { Stack } from "expo-router"; |
|
|
|
|
|
export default function RootLayout() { |
|
|
return <Stack />; |
|
|
} |
|
|
`; |
|
|
|
|
|
const rl = readline.createInterface({ |
|
|
input: process.stdin, |
|
|
output: process.stdout, |
|
|
}); |
|
|
|
|
|
const moveDirectories = async (userInput) => { |
|
|
try { |
|
|
if (userInput === "y") { |
|
|
// Create the app-example directory |
|
|
await fs.promises.mkdir(exampleDirPath, { recursive: true }); |
|
|
console.log(`📁 /${exampleDir} directory created.`); |
|
|
} |
|
|
|
|
|
// Move old directories to new app-example directory or delete them |
|
|
for (const dir of oldDirs) { |
|
|
const oldDirPath = path.join(root, dir); |
|
|
if (fs.existsSync(oldDirPath)) { |
|
|
if (userInput === "y") { |
|
|
const newDirPath = path.join(root, exampleDir, dir); |
|
|
await fs.promises.rename(oldDirPath, newDirPath); |
|
|
console.log(`➡️ /${dir} moved to /${exampleDir}/${dir}.`); |
|
|
} else { |
|
|
await fs.promises.rm(oldDirPath, { recursive: true, force: true }); |
|
|
console.log(`❌ /${dir} deleted.`); |
|
|
} |
|
|
} else { |
|
|
console.log(`➡️ /${dir} does not exist, skipping.`); |
|
|
} |
|
|
} |
|
|
|
|
|
// Create new /app directory |
|
|
const newAppDirPath = path.join(root, newAppDir); |
|
|
await fs.promises.mkdir(newAppDirPath, { recursive: true }); |
|
|
console.log("\n📁 New /app directory created."); |
|
|
|
|
|
// Create index.tsx |
|
|
const indexPath = path.join(newAppDirPath, "index.tsx"); |
|
|
await fs.promises.writeFile(indexPath, indexContent); |
|
|
console.log("📄 app/index.tsx created."); |
|
|
|
|
|
// Create _layout.tsx |
|
|
const layoutPath = path.join(newAppDirPath, "_layout.tsx"); |
|
|
await fs.promises.writeFile(layoutPath, layoutContent); |
|
|
console.log("📄 app/_layout.tsx created."); |
|
|
|
|
|
console.log("\n✅ Project reset complete. Next steps:"); |
|
|
console.log( |
|
|
`1. Run \`npx expo start\` to start a development server.\n2. Edit app/index.tsx to edit the main screen.${ |
|
|
userInput === "y" |
|
|
? `\n3. Delete the /${exampleDir} directory when you're done referencing it.` |
|
|
: "" |
|
|
}` |
|
|
); |
|
|
} catch (error) { |
|
|
console.error(`❌ Error during script execution: ${error.message}`); |
|
|
} |
|
|
}; |
|
|
|
|
|
rl.question( |
|
|
"Do you want to move existing files to /app-example instead of deleting them? (Y/n): ", |
|
|
(answer) => { |
|
|
const userInput = answer.trim().toLowerCase() || "y"; |
|
|
if (userInput === "y" || userInput === "n") { |
|
|
moveDirectories(userInput).finally(() => rl.close()); |
|
|
} else { |
|
|
console.log("❌ Invalid input. Please enter 'Y' or 'N'."); |
|
|
rl.close(); |
|
|
} |
|
|
} |
|
|
);
|
|
|
|