diff --git a/apps/cartesify/frontend/next-app/app/cartesi/services/Portal.ts b/apps/cartesify/frontend/next-app/app/cartesi/services/Portal.ts index 84cee58..a690ea8 100644 --- a/apps/cartesify/frontend/next-app/app/cartesi/services/Portal.ts +++ b/apps/cartesify/frontend/next-app/app/cartesi/services/Portal.ts @@ -7,7 +7,7 @@ import { Voucher, Batch } from "../model"; import { DAPP_ADDRESS } from "@/app/utils/constants"; import { errorAlert, successAlert } from "@/app/utils/customAlert"; // import { Chain } from "@rainbow-me/rainbowkit"; -import configFile from "../../cartesi/config.json" +import configFile from "../config.json" import { toHex } from "viem"; import { Chain } from "viem"; diff --git a/apps/cartesify/frontend/next-app/app/components/examples/Transfers.tsx b/apps/cartesify/frontend/next-app/app/components/examples/Transfers.tsx index 9bea675..d88e4e1 100644 --- a/apps/cartesify/frontend/next-app/app/components/examples/Transfers.tsx +++ b/apps/cartesify/frontend/next-app/app/components/examples/Transfers.tsx @@ -13,7 +13,7 @@ import { import { Text } from "@chakra-ui/react"; import { useEthersSigner } from "../../utils/useEtherSigner"; import { useAccount } from "wagmi"; -import VoucherView from "../../components/examples/VoucherView"; +import VoucherView from "./VoucherView"; import { DAPP_ADDRESS } from "../../utils/constants"; import { Epoch } from "./Epoch"; import { depositBatchERC1155, depositERC20, depositERC721, depositEther, depositSingleERC1155 } from "../../cartesi/services/Portal"; diff --git a/apps/cartesify/frontend/react-app/src/cartesi/services/Portal.ts b/apps/cartesify/frontend/react-app/src/cartesi/services/Portal.ts index 2c99000..b634921 100644 --- a/apps/cartesify/frontend/react-app/src/cartesi/services/Portal.ts +++ b/apps/cartesify/frontend/react-app/src/cartesi/services/Portal.ts @@ -7,7 +7,7 @@ import { Voucher, Batch } from "../model"; import { DAPP_ADDRESS } from "../../utils/constants"; import { errorAlert, successAlert } from "../../utils/customAlert"; // import { Chain } from "@rainbow-me/rainbowkit"; -import configFile from "../../cartesi/config.json" +import configFile from "../config.json" import { toHex } from "viem"; import { Chain } from "viem"; diff --git a/apps/cartesify/frontend/react-app/src/components/examples/Transfers.tsx b/apps/cartesify/frontend/react-app/src/components/examples/Transfers.tsx index 04c2538..effb7e1 100644 --- a/apps/cartesify/frontend/react-app/src/components/examples/Transfers.tsx +++ b/apps/cartesify/frontend/react-app/src/components/examples/Transfers.tsx @@ -12,7 +12,7 @@ import { import { Text } from "@chakra-ui/react"; import { useEthersSigner } from "../../utils/useEtherSigner"; import { useAccount } from "wagmi"; -import VoucherView from "../../components/examples/VoucherView"; +import VoucherView from "./VoucherView"; import { DAPP_ADDRESS } from "../../utils/constants"; import { Epoch } from "./Epoch"; import { depositBatchERC1155, depositERC20, depositERC721, depositEther, depositSingleERC1155 } from "../../cartesi/services/Portal"; diff --git a/bin/create.js b/bin/create.js index fd8056d..670a3f9 100644 --- a/bin/create.js +++ b/bin/create.js @@ -5,14 +5,16 @@ const fs = require("fs-extra"); const path = require('path'); const { ensureDirectory } = require('../utils/directoryUtils'); const { promptTemplateSelection, promptInclude } = require('../helper/promptUtils'); -const { copyTemplateFiles } = require('../helper/copy-template-files'); +const { copyTemplateFiles, printSuccessMessage } = require('../helper/copy-template-files'); const { figletText } = require( "../utils/ascii-image"); const { copyGitTemplateFiles } = require("../helper/fetch-git-repo") -const { installDependencies } = require("../helper/install-dependencies"); -const { generateMonorepo } = require("../helper/generate-monorepo"); +const { generateReadme } = require("../helper/generate-readme") async function createProject(projectName) { + + const { default: chalk } = await import('chalk'); + const inquirer = await import('inquirer'); const templates = { @@ -26,9 +28,9 @@ async function createProject(projectName) { mobileApp: ['react_native_app', 'react_native_with_expo', 'flutter_app'] }; - console.log(await figletText) + console.log(chalk.cyan(await figletText)) - const projectDir = path.resolve(process.cwd(), `${projectName}/packages`); + const projectDir = path.resolve(process.cwd(), `${projectName}`); await ensureDirectory(projectDir); @@ -50,7 +52,6 @@ async function createProject(projectName) { if (include.includeBackend) { selectedBackend = await promptTemplateSelection( 'backend', templates.backend); } - await generateMonorepo(projectDir) break; case 'backend': selectedBackend = await promptTemplateSelection('backend', templates.backend); @@ -63,7 +64,6 @@ async function createProject(projectName) { if(includeConsole.includeConsole){ selectedConsole = await promptTemplateSelection('frontendConsole', templates.frontendConsole ) } - await generateMonorepo(projectDir) break; case 'mobileApp': selectedMobile = await promptTemplateSelection('mobileApp', templates.mobileApp); @@ -71,54 +71,46 @@ async function createProject(projectName) { if (includeBackend.includeBackend) { selectedBackend = await promptTemplateSelection( 'backend', templates.backend); } - await generateMonorepo(projectDir) break; case 'cartesify': selectedCartesifyBackend = await promptTemplateSelection('cartesify', templates.cartesify.backend) selectedCartesifyFrontend = await promptTemplateSelection('cartesify', templates.cartesify.frontend) - await generateMonorepo(projectDir) break case 'frontendConsole': selectedConsole = await promptTemplateSelection('frontendConsole', templates.frontendConsole) - await generateMonorepo(projectDir) break } const frontendProjectDir = `${projectDir}/frontend`; const backendProjectDir = `${projectDir}/backend`; const mobileProjectDir = `${projectDir}/mobile-app` - + + const templateArray = [`${projectDir}/frontend`,`${projectDir}/backend`, `${projectDir}/mobile-app` ] + // Copy template files if (selectedFrontend) { console.log(selectedFrontend) - await copyTemplateFiles(selectedFrontend, frontendProjectDir, "apps/frontend"); - // await installDependencies(selectedFrontend, frontendProjectDir, "apps/frontend"); - + await copyTemplateFiles(selectedFrontend, frontendProjectDir, "apps/frontend", projectName); } if (selectedBackend) { - await copyTemplateFiles(selectedBackend, backendProjectDir, "apps/backend"); - // await installDependencies(selectedBackend, backendProjectDir, "apps/backend"); - + await copyTemplateFiles(selectedBackend, backendProjectDir, "apps/backend", projectName); } if(selectedCartesifyBackend){ - await copyTemplateFiles(selectedCartesifyBackend, backendProjectDir, "apps/cartesify/backend"); - // await installDependencies(selectedCartesifyBackend, backendProjectDir, "apps/cartesify/backend"); - + await copyTemplateFiles(selectedCartesifyBackend, backendProjectDir, "apps/cartesify/backend",projectName); } if(selectedCartesifyFrontend){ - await copyTemplateFiles(selectedCartesifyFrontend, frontendProjectDir, "apps/cartesify/frontend"); - // await installDependencies(selectedCartesifyFrontend, frontendProjectDir, "apps/cartesify/frontend"); - + await copyTemplateFiles(selectedCartesifyFrontend, frontendProjectDir, "apps/cartesify/frontend", projectName); } if(selectedMobile){ - await copyTemplateFiles(selectedMobile, mobileProjectDir, "apps/mobileApp"); - // await installDependencies(selectedMobile, mobileProjectDir, "apps/mobileApp"); - + await copyTemplateFiles(selectedMobile, mobileProjectDir, "apps/mobileApp", projectName); } if(selectedConsole){ const giturl = "https://github.com/Mugen-Builders/sunodo-frontend-console.git" await copyGitTemplateFiles(selectedConsole, projectDir, giturl) } + console.log("Generating template...") + await generateReadme(projectDir, projectName) + await printSuccessMessage() } module.exports = { diff --git a/helper/copy-template-files.js b/helper/copy-template-files.js index e12bd6b..24efcc8 100644 --- a/helper/copy-template-files.js +++ b/helper/copy-template-files.js @@ -1,44 +1,88 @@ const { ensureDir, copy } = require("fs-extra"); const path = require('path'); -const { exludeFiles } = require("../utils/exlude-files"); const { spawn } = require('child_process'); +const fs = require('fs-extra'); +const { updatePackageJson } = require("../helper/update-packageJson") +const { hasPackageJson } = require("../utils/check-package") -const { installDependencies } = require("./install-dependencies") +// use this to see what is been installed +// const runCommand = (command, args, options = {}) => { +// return new Promise((resolve, reject) => { +// const process = spawn(command, args, { stdio: 'inherit', ...options }); +// process.on('close', (code) => { +// if (code !== 0) { +// reject(new Error(`Process exited with code ${code}`)); +// } else { +// resolve(); +// } +// }); +// }); +// }; + // Function to copy template files to the project directory + async function copyTemplateFiles(templateName, destinationDir, templateDirectory, projectName) { + const { default: chalk } = await import('chalk'); -const runCommand = (command, args, options = {}) => { - return new Promise((resolve, reject) => { - const process = spawn(command, args, { stdio: 'inherit', ...options }); - process.on('close', (code) => { - if (code !== 0) { - reject(new Error(`Process exited with code ${code}`)); - } else { - resolve(); - } - }); - }); -}; + const filesToExclude = ['.git', '.env', 'node_modules', 'package-lock.json', 'yarn.lock', '.cartesi']; - // Function to copy template files to the project directory - async function copyTemplateFiles(templateName, destinationDir, templateDirectory) { - try { - // Use spawn to run the npm install command and log the progress - runCommand('npm', ['install'], { stdio: 'inherit' }) + // Use spawn to run the npm install command and log the progress + // runCommand('npm', ['install'], { stdio: 'inherit' }) const templateDir = path.resolve(__dirname,'..', templateDirectory, templateName); const destDir = path.resolve(process.cwd(), destinationDir); await ensureDir(destDir); // Ensure template directory exists - // Function to filter out .git, .env, node_modules, and package-lock.json files/directories - exludeFiles(templateDir, destDir) - await copy(templateDir, destDir); - console.log(`✅ Template ${templateName} created successfully!` ) + + if (fs.existsSync(templateDir)) { + const files = fs.readdirSync(templateDir); + const filesToCopy = files.filter(file => !filesToExclude.includes(file)); + filesToCopy.forEach(file => { + const sourceFilePath = path.join(templateDir, file); + const destFilePath = path.join(destDir, file); + + //update the package directory + if(files.includes('package.json')){ + updatePackageJson(projectName, destDir) + } + // function to update the package.json name to the name of the project + fs.copySync(sourceFilePath, destFilePath); + // await copy(templateDir, destDir); + }); + // console.log(`✅ Starter project successfully created!` ) + // console.log( "Thank you for using CartDevKit! If you have any questions or need further assistance, please refer to the README or reach out to our team.") + // console.log(chalk.magenta("Happy coding! 🎉")) + } else { + console.error('Source directory does not exist.'); + } } catch (err) { console.error(`Error copying template files: ${err}`); } } +async function printSuccessMessage() { + const { default: chalk } = await import('chalk'); + + console.log( chalk.green(`🚀 Starter project successfully created!`)); + // console.log(chalk.bold('Before you start the project, please follow these steps:')) + // console.log( chalk.green('Run the following commands from your project folder to start the project:')) + + // console.log(chalk.yellow( + // 'yarn install' + // )) + // console.log('or') + // console.log(chalk.yellow( + // 'npm install' + // )) + // console.log('Depending on your preference') + + console.log(`${chalk.yellow('Thank you for using CartDevKit!')} If you have any questions or need further assistance, please refer to the README or reach out to our team.`); + console.log("") + console.log(chalk.magenta("Happy coding! 🎉")); + console.log("") + +} module.exports = { - copyTemplateFiles + copyTemplateFiles, + printSuccessMessage }; \ No newline at end of file diff --git a/helper/generate-readme.js b/helper/generate-readme.js new file mode 100644 index 0000000..eefab1f --- /dev/null +++ b/helper/generate-readme.js @@ -0,0 +1,20 @@ +const fs = require("fs-extra") +const path = require('path'); + + +const generateReadme = async (projectDir, projectName) => { + const readmeContent = `# ${projectName}\n\nThis project was scaffolded using CartDevKit CLI tool.`; + + fs.writeFile(path.join(projectDir, 'README.md'), readmeContent, (err) => { + if (err) { + console.error(`Error generating README.md: ${err.message}`); + } else { + // console.log('README.md generated successfully.'); + } + }); + +} + +module.exports = { + generateReadme +} \ No newline at end of file diff --git a/helper/install-dependencies.js b/helper/install-dependencies.js deleted file mode 100644 index 7aff411..0000000 --- a/helper/install-dependencies.js +++ /dev/null @@ -1,34 +0,0 @@ -// Function to install dependencies -const { copyTemplateFiles } = require("./copy-template-files") -const { exec } = require('child_process'); -const fs = require("fs-extra") - - const installDependencies = async (templateName, destinationDir, templateDirectory) => { - console.log('Installing dependencies...'); - fs.ensureDir(destinationDir) - console.log(destinationDir) - process.chdir(destinationDir); - - // npm install -g lerna && npm install -g yarn && lerna init - - exec('npm install', (error, stdout, stderr) => { - if (error) { - console.error(`Error installing dependencies: ${error.message}`); - return; - } - if (stderr) { - console.error(`Error installing dependencies: ${stderr}`); - return; - } - console.log(`Dependencies installed: ${stdout}`); - copyTemplateFiles(templateName, destinationDir, templateDirectory) - }); -} - -module.exports = { - installDependencies -} - - - - diff --git a/helper/promptUtils.js b/helper/promptUtils.js index c0bb7dc..6f017fb 100644 --- a/helper/promptUtils.js +++ b/helper/promptUtils.js @@ -1,3 +1,5 @@ +const { generateReadme } = require("../helper/generate-readme") + const inquirer = require('inquirer'); // let inquirer // Function to prompt user for template selection diff --git a/helper/update-packageJson.js b/helper/update-packageJson.js new file mode 100644 index 0000000..ea8baab --- /dev/null +++ b/helper/update-packageJson.js @@ -0,0 +1,33 @@ +const fs = require('fs'); +const path = require('path'); + +const updatePackageJson = (projectName, templateDir) => { + const packageJsonPath = path.join(templateDir, 'package.json'); + + // Check if the package.json file exists + if (!fs.existsSync(packageJsonPath)) { + // console.log(`No package.json found in ${templateDir}, continuing setup...`); + return; + } + + fs.readFile(packageJsonPath, 'utf8', (err, data) => { + if (err) { + // console.error(`Error reading package.json: ${err.message}`); + // return; + console.log('') + } + + const packageJson = JSON.parse(data); + packageJson.name = projectName; + + fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2), 'utf8', (err) => { + if (err) { + console.error(`Error updating package.json: ${err.message}`); + } else { + // console.log('package.json updated successfully.'); + } + }); + }); +}; + +module.exports = { updatePackageJson }; diff --git a/package-lock.json b/package-lock.json index 25b73c4..266c582 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.7", "license": "Apache-2.0", "workspaces": [ - "packages/*" + "bin/*" ], "dependencies": { "chalk": "^5.3.0", diff --git a/package.json b/package.json index 6bd12d0..e3bd8ef 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "cartesi" ], "workspaces": [ - "packages/*" + "bin/*" ], "bin": { "cartdevkit": "./bin/index.js" diff --git a/utils/check-package.js b/utils/check-package.js index 8798c33..a571544 100644 --- a/utils/check-package.js +++ b/utils/check-package.js @@ -1,3 +1,4 @@ +const { ensureDir, copy } = require("fs-extra"); function isPackageInstalled(packageName) { try { @@ -12,5 +13,5 @@ function isPackageInstalled(packageName) { } module.exports = { - isPackageInstalled + isPackageInstalled, } \ No newline at end of file diff --git a/utils/exlude-files.js b/utils/exlude-files.js deleted file mode 100644 index 2391925..0000000 --- a/utils/exlude-files.js +++ /dev/null @@ -1,31 +0,0 @@ -const fs = require('fs-extra'); -const path = require('path'); - - -const filesToExclude = ['.git', '.env', 'node_modules', 'package-lock.json', 'yarn-lock']; - -const exludeFiles = (sourceDir, destDir) => { - // Check if the source directory exists - if (fs.existsSync(sourceDir)) { - // Get all files and directories in the source directory - const files = fs.readdirSync(sourceDir); - - // Filter out files and directories to exclude - const filesToCopy = files.filter(file => { - !filesToExclude.includes(file) - }); - // Copy each file to the destination directory - filesToCopy.forEach(file => { - const sourceFilePath = path.join(sourceDir, file); - const destFilePath = path.join(destDir, file); - fs.copyFileSync(sourceFilePath, destFilePath); - }); - } else { - console.error('Source directory does not exist.'); - } -} - - -module.exports = { - exludeFiles -} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index b17b131..23396b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -858,24 +858,6 @@ caniuse-lite@^1.0.30001587: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz" integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ== -"cartdevkit@file:": - version "1.0.7" - resolved "file:" - dependencies: - cartdevkit "file:" - chalk "^5.3.0" - child_process "^1.0.2" - commander "^12.0.0" - figlet "^1.7.0" - fs-extra "^11.2.0" - inquirer "^8.2.6" - node-emoji "^2.1.3" - ora "^8.0.1" - path "^0.12.7" - react-error-boundary "^4.0.13" - shelljs "^0.8.5" - url "^0.11.3" - chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"