UNPKG

rtk-ready

Version:

Redux utilities package for a boilerplate setup with persisted state, authentication handling, API integration, and typed hooks, providing a structured and scalable state management solution for React applications.

210 lines (188 loc) 6.87 kB
#!/usr/bin/env node // import fs from "fs"; // import path from "path"; // import { execSync } from "child_process"; // const mainProjectRoot = process.env.INIT_CWD || process.cwd(); // const srcPath = path.join(mainProjectRoot, "src"); // const srcPathWithRedux = path.join(srcPath, 'redux'); // const reduxWithPath = path.join(mainProjectRoot, "redux"); // const reduxPath = fs.existsSync(srcPath) // ? path.join(srcPath, "redux") // : path.join(mainProjectRoot, "redux"); // const templatePath = path.join( // mainProjectRoot, // "./node_modules/rtk-ready/src/redux" // ); // const markerFilePath = path.join(reduxPath, ".rtk-ready-installed"); // // Utility to copy folder content recursively // function copyFolderSync(from: string, to: string) { // if (!fs.existsSync(from)) { // console.log(`Source folder does not exist: ${from}`); // return; // } // fs.mkdirSync(to, { recursive: true }); // fs.readdirSync(from).forEach((element) => { // const stat = fs.lstatSync(path.join(from, element)); // if (stat.isFile()) { // fs.copyFileSync(path.join(from, element), path.join(to, element)); // } else if (stat.isDirectory()) { // copyFolderSync(path.join(from, element), path.join(to, element)); // } // }); // } // // Create the Redux folder structure // function createReduxFolder() { // if (!fs.existsSync(templatePath)) { // console.error( // "Template folder does not exist. Please ensure the src/redux-template folder exists." // ); // return; // } // if (!fs.existsSync(reduxPath)) { // console.log(`Creating Redux folder at ${reduxPath}...`); // copyFolderSync(templatePath, reduxPath); // fs.writeFileSync(markerFilePath, "true"); // console.log("Redux folder created."); // } else if (!fs.existsSync(markerFilePath)) { // console.log("Redux folder already exists but marker file is missing. Skipping."); // } else { // console.log("Redux folder and marker file already exist. Skipping."); // } // } // // Install required dependencies // function installDependencies() { // const dependencies = [ // "@reduxjs/toolkit@latest", // "js-cookie@latest", // "react-redux@latest", // "redux-persist@latest", // ]; // const devDependencies = [ // "@types/js-cookie@latest", // "@types/react-redux@latest", // ]; // console.log("Installing dependencies in the main project..."); // try { // execSync(`npm install ${dependencies.join(" ")}`, { // cwd: mainProjectRoot, // stdio: "inherit", // }); // // Check for TypeScript support // const tsconfigPath = path.join(mainProjectRoot, "tsconfig.json"); // if (fs.existsSync(tsconfigPath)) { // console.log("TypeScript detected. Installing dev dependencies..."); // execSync(`npm install --save-dev ${devDependencies.join(" ")}`, { // cwd: mainProjectRoot, // stdio: "inherit", // }); // } // console.log("Dependencies installed successfully."); // } catch (error: any) { // console.error("Error installing dependencies:", error.message); // // Exit process with a success code to prevent npm from failing. // process.exit(0); // } // } // // Main execution // createReduxFolder(); // installDependencies(); import fs from 'fs'; import path from 'path'; import { execSync } from 'child_process'; const mainProjectRoot = process.env.INIT_CWD || process.cwd(); const srcPath = path.join(mainProjectRoot, 'src'); const reduxPath = fs.existsSync(srcPath) ? path.join(srcPath, 'redux') : path.join(mainProjectRoot, 'redux'); const templatePath = path.join( mainProjectRoot, './node_modules/rtk-ready/src/redux' ); const markerFilePath = path.join(reduxPath, '.rtk-ready-installed'); // Utility to copy folder content recursively function copyFolderSync(from: string, to: string) { if (!fs.existsSync(from)) { console.log(`Source folder does not exist: ${from}`); return; } fs.mkdirSync(to, { recursive: true }); fs.readdirSync(from).forEach((element) => { const stat = fs.lstatSync(path.join(from, element)); if (stat.isFile()) { fs.copyFileSync(path.join(from, element), path.join(to, element)); } else if (stat.isDirectory()) { copyFolderSync(path.join(from, element), path.join(to, element)); } }); } // Utility to find a unique folder name function getUniqueFolderName(basePath: string, folderName: string): string { let uniqueName = folderName; let counter = 0; while (fs.existsSync(path.join(basePath, uniqueName))) { counter++; uniqueName = `${folderName}(${counter})`; } return path.join(basePath, uniqueName); } // Create the Redux folder structure function createReduxFolder() { if (!fs.existsSync(templatePath)) { console.error( 'Template folder does not exist. Please ensure the src/redux-template folder exists.' ); return; } let targetPath = reduxPath; if (fs.existsSync(reduxPath)) { // Find a unique folder name if redux already exists console.log( 'Redux folder already exists. Searching for a unique folder name...' ); targetPath = getUniqueFolderName( fs.existsSync(srcPath) ? srcPath : mainProjectRoot, 'redux' ); } console.log(`Creating Redux folder at ${targetPath}...`); copyFolderSync(templatePath, targetPath); fs.writeFileSync(path.join(targetPath, '.rtk-ready-installed'), 'true'); console.log('Redux folder created.'); } // Install required dependencies function installDependencies() { const dependencies = [ '@reduxjs/toolkit@latest', 'js-cookie@latest', 'react-redux@latest', 'redux-persist@latest', ]; const devDependencies = [ '@types/js-cookie@latest', '@types/react-redux@latest', ]; console.log('Installing dependencies in the main project...'); try { execSync(`npm install ${dependencies.join(' ')}`, { cwd: mainProjectRoot, stdio: 'inherit', }); // Check for TypeScript support const tsconfigPath = path.join(mainProjectRoot, 'tsconfig.json'); if (fs.existsSync(tsconfigPath)) { console.log('TypeScript detected. Installing dev dependencies...'); execSync(`npm install --save-dev ${devDependencies.join(' ')}`, { cwd: mainProjectRoot, stdio: 'inherit', }); } console.log('Dependencies installed successfully.'); } catch (error: any) { console.error('Error installing dependencies:', error.message); // Exit process with a success code to prevent npm from failing. process.exit(0); } } // Main execution createReduxFolder(); installDependencies();