@sundaysf/cli-v2 0.0.1 → 0.0.2
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/bin/index.js +1 -1
- package/dist/bin/index.js.map +1 -1
- package/package.json +1 -1
package/dist/bin/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command}from"commander";import inquirer from"inquirer";import{generateController,generateRouter}from"./generators/class.js";import fs from"fs-extra";import path from"path";import{fileURLToPath}from"url";import{exec}from"child_process";import ora from"ora";import{generateBasePostman,getItemFormatted}from"./generators/postman.js";const __dirname=path.dirname(fileURLToPath(import.meta.url)),pkg=fs.readJsonSync(
|
|
2
|
+
import{Command}from"commander";import inquirer from"inquirer";import{generateController,generateRouter}from"./generators/class.js";import fs from"fs-extra";import path from"path";import{fileURLToPath}from"url";import{exec}from"child_process";import ora from"ora";import{generateBasePostman,getItemFormatted}from"./generators/postman.js";const __dirname=path.dirname(fileURLToPath(import.meta.url)),pkg=fs.readJsonSync(path.join(__dirname,"../../package.json")),program=new Command;program.version(pkg.version,"-v, --version").option("--init","Initialize a new project").option("--backend","Initialize with backend template").option("--module","Initialize with module template").option("--db-sql","Initialize with db-sql template").option("--create-controller","Create a controller and its associated route"),program.parse(process.argv);const options=program.opts();function runFormatter(e="."){return new Promise(((t,r)=>{const s=exec("npm run format",{cwd:e});s.stdout.on("data",(e=>process.stdout.write(e))),s.stderr.on("data",(e=>process.stderr.write(e))),s.on("close",(e=>{0===e?t():r(new Error(`npm format exited with code ${e}`))}))}))}function runNpmInstall(e){return new Promise(((t,r)=>{const s=exec("npm install",{cwd:e});s.stdout.on("data",(e=>process.stdout.write(e))),s.stderr.on("data",(e=>process.stderr.write(e))),s.on("close",(e=>{0===e?t():r(new Error(`npm install exited with code ${e}`))}))}))}function initGitRepo(e){return new Promise(((t,r)=>{const s=exec("git init",{cwd:e});s.stdout.on("data",(e=>process.stdout.write(e))),s.stderr.on("data",(e=>process.stderr.write(e))),s.on("close",(e=>{0===e?t():r(new Error(`Git init exited with code ${e}`))}))}))}options.init&&(options.backend||options.module||options.dbSql)?(console.log("Hello! I'm Paul Sundays, your backend architect. Let's craft an awesome backend together!"),inquirer.prompt([{type:"input",name:"projectName",message:"Name of the project:",validate:e=>!!e||"The name of the project can not be empty"}]).then((async({projectName:e})=>{const t=options.backend?"backend":options.module?"module":"db-sql",r=path.join(__dirname,`../templates/${t}`),s=e.toLowerCase().replace(/\s+/g,"-"),o=path.resolve(s);fs.existsSync(o)&&(console.error(`Directory "${s}" already exists.`),process.exit(1));try{await fs.mkdir(o,{recursive:!0}),await fs.copy(r,o,{overwrite:!1,errorOnExist:!0,filter:(e,t)=>!0}),console.log("Template files copied successfully")}catch(e){console.error("Error copying the files:",e),process.exit(1)}let n;if(n="db-sql"===t?{name:s,version:"0.0.1",description:"Knex Module",main:"dist/index.js",scripts:{test:"jest",format:"prettier --write .",build:"tsc",clean:"rimraf dist && npm run format && npm run build","npm:publish":"npm run clean && npm publish","migrate:create":"knex migrate:make migration -x ts","migrate:deploy":"knex migrate:latest","seed:create":"knex seed:make seed -x ts","seed:run":"knex seed:run"},repository:{type:"git",url:""},author:"",license:"MIT",bugs:{url:""},homepage:"",devDependencies:{"@eslint/js":"^9.23.0","@types/node":"^22.13.13",eslint:"^9.23.0",globals:"^16.0.0",prettier:"^3.5.3",rimraf:"^6.0.1","ts-node":"^10.9.2",typescript:"^5.8.2","typescript-eslint":"^8.28.0"},dependencies:{dotenv:"^16.4.7",knex:"^3.1.0",lodash:"^4.17.21",pg:"^8.14.1",uuid:"^11.1.0"}}:"backend"===t?{name:s,version:"1.0.0",description:"Backend project generated with Sundays Framework",main:"dist/server.js",scripts:{test:"jest",start:"node dist/server.js",build:"tsc","start:dev":"nodemon src/server.ts",format:"prettier --write .","create:controller":"sundaysf --create-controller"},dependencies:{morgan:"^1.10.0",cors:"^2.8.5",dotenv:"^16.4.7",express:"^4.18.2"},devDependencies:{"@types/morgan":"^1.9.9","@types/cors":"^2.8.17","@types/express":"^4.17.21",nodemon:"^3.0.2",prettier:"^3.5.3","ts-node":"^10.9.2",typescript:"^5.8.2","@eslint/js":"^9.23.0",eslint:"^9.23.0","typescript-eslint":"^8.28.0"},author:"",license:"MIT"}:{name:s,version:"1.0.0",description:"Module generated with Sundays Framework",main:"dist/index.js",types:"dist/index.d.ts",scripts:{test:"jest",build:"tsc",format:"prettier --write .",clean:"rimraf dist && npm run build"},dependencies:{},devDependencies:{prettier:"^3.5.3",rimraf:"^6.0.1",typescript:"^5.8.2"},author:"",license:"MIT"},await fs.writeJson(path.join(o,"package.json"),n,{spaces:2}),"backend"===t){const t=generateBasePostman(e);await fs.writeJson(path.join(o,"postman.json"),t,{spaces:2})}const i=ora("Git init...").start();await initGitRepo(o),i.succeed("Git initialized");const a=ora("Installing dependencies...").start();await runNpmInstall(o),a.succeed("Dependencies installed"),await runFormatter(o),console.log(`Project '${e}' created successfully in ./${s}`)}))):options.createController?(fs.existsSync("./src/controllers")&&fs.existsSync("./postman.json")||(console.error("This command must be run inside a Sundays backend project."),console.error("Expected ./src/controllers/ and ./postman.json to exist."),process.exit(1)),inquirer.prompt([{type:"input",name:"controllerName",message:"Controller name:",validate:e=>e?!!/^[a-zA-Z][a-zA-Z0-9]*$/.test(e)||"Name must start with a letter and contain only letters and numbers":"The controller name is empty"}]).then((async({controllerName:e})=>{try{const t=e.charAt(0).toLowerCase()+e.slice(1),r=e.charAt(0).toUpperCase()+e.slice(1),s=`${r}Controller`,o=`${t}.controller.ts`,n=`${t}`,i=`${r}Router`,a=`${t}.router.ts`,c=`${t}`,p=`./src/controllers/${n}`,l=`./src/routes/${c}`;fs.existsSync(p)&&(console.error(`Controller directory "${p}" already exists.`),process.exit(1));const d=generateController(s),m=generateRouter(i,s,n),u=`${p}/${o}`,w=`${l}/${a}`;await fs.mkdir(p,{recursive:!0}),await fs.mkdir(l,{recursive:!0}),await fs.writeFile(u,d),await fs.writeFile(w,m);const f=await fs.readFile("./postman.json","utf-8"),g=JSON.parse(f),h=getItemFormatted(c,g.info.name);g.item.push(h),await fs.writeJson(path.join(".","postman.json"),g,{spaces:2}),await runFormatter("."),console.log(`Created ${s} in ${n}/${o} and ${i} in ${c}/${a}`)}catch(e){console.error("Error generating controller:",e.message),process.exit(1)}}))):program.help();
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/bin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Command","inquirer","generateController","generateRouter","fs","path","fileURLToPath","exec","ora","generateBasePostman","getItemFormatted","__dirname","dirname","url","pkg","readJsonSync","URL","program","version","option","parse","process","argv","options","opts","runFormatter","cwd","Promise","resolve","reject","formatProcess","stdout","on","data","write","stderr","code","Error","runNpmInstall","destDir","installProcess","initGitRepo","gitProcess","init","backend","module","dbSql","console","log","prompt","type","name","message","validate","input","then","async","projectName","templateType","srcDir","join","dirName","toLowerCase","replace","existsSync","error","exit","mkdir","recursive","copy","overwrite","errorOnExist","filter","src","dest","err","packageJson","description","main","scripts","test","format","build","clean","repository","author","license","bugs","homepage","devDependencies","eslint","globals","prettier","rimraf","typescript","dependencies","dotenv","knex","lodash","pg","uuid","start","morgan","cors","express","nodemon","types","writeJson","spaces","postmanBaseData","spinnerGit","succeed","spinner","createController","controllerName","nonCapitalized","charAt","slice","capitalized","toUpperCase","controllerClassName","controllerFileName","controllerDirectoryName","routerClassName","routerFileName","routerDirectoryName","controllerDir","routerDir","classControllerContentGenerator","classRouterContentGenerator","controllerPath","routerPath","writeFile","readFile","leanData","JSON","itemToPush","info","item","push","help"],"sources":["bin/index.js"],"mappings":"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","ignoreList":[],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport inquirer from 'inquirer';\r\nimport { generateController, generateRouter } from './generators/class.js';\r\nimport fs from 'fs-extra';\r\nimport path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport { exec } from 'child_process';\r\nimport ora from 'ora';\r\nimport { generateBasePostman, getItemFormatted } from './generators/postman.js';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst pkg = fs.readJsonSync(new URL('../package.json', import.meta.url));\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .version(pkg.version, '-v, --version')\r\n .option('--init', 'Initialize a new project')\r\n .option('--backend', 'Initialize with backend template')\r\n .option('--module', 'Initialize with module template')\r\n .option('--db-sql', 'Initialize with db-sql template')\r\n .option('--create-controller', 'Create a controller and its associated route');\r\n\r\nprogram.parse(process.argv);\r\n\r\nconst options = program.opts();\r\n\r\nif (options.init && (options.backend || options.module || options.dbSql)) {\r\n console.log(\"Hello! I'm Paul Sundays, your backend architect. Let's craft an awesome backend together!\");\r\n inquirer.prompt([\r\n {\r\n type: 'input',\r\n name: 'projectName',\r\n message: 'Name of the project:',\r\n validate: input => input ? true : 'The name of the project can not be empty'\r\n }\r\n ]).then(async ({ projectName }) => {\r\n const templateType = options.backend ? 'backend' : options.module ? 'module' : 'db-sql';\r\n const srcDir = path.join(__dirname, `../templates/${templateType}`);\r\n const dirName = projectName.toLowerCase().replace(/\\s+/g, '-');\r\n const destDir = path.resolve(dirName);\r\n\r\n if (fs.existsSync(destDir)) {\r\n console.error(`Directory \"${dirName}\" already exists.`);\r\n process.exit(1);\r\n }\r\n\r\n try {\r\n await fs.mkdir(destDir, { recursive: true });\r\n await fs.copy(srcDir, destDir, {\r\n overwrite: false,\r\n errorOnExist: true,\r\n filter: (src, dest) => {\r\n return true;\r\n }\r\n });\r\n console.log('Template files copied successfully');\r\n } catch (err) {\r\n console.error('Error copying the files:', err);\r\n process.exit(1);\r\n }\r\n\r\n let packageJson;\r\n if (templateType === 'db-sql') {\r\n packageJson = {\r\n name: dirName,\r\n version: \"0.0.1\",\r\n description: \"Knex Module\",\r\n main: \"dist/index.js\",\r\n scripts: {\r\n test: \"jest\",\r\n format: \"prettier --write .\",\r\n build: \"tsc\",\r\n clean: \"rimraf dist && npm run format && npm run build\",\r\n \"npm:publish\": \"npm run clean && npm publish\",\r\n \"migrate:create\": \"knex migrate:make migration -x ts\",\r\n \"migrate:deploy\": \"knex migrate:latest\",\r\n \"seed:create\": \"knex seed:make seed -x ts\",\r\n \"seed:run\": \"knex seed:run\"\r\n },\r\n repository: {\r\n type: \"git\",\r\n url: \"\"\r\n },\r\n author: \"\",\r\n license: \"MIT\",\r\n bugs: {\r\n url: \"\"\r\n },\r\n homepage: \"\",\r\n devDependencies: {\r\n \"@eslint/js\": \"^9.23.0\",\r\n \"@types/node\": \"^22.13.13\",\r\n eslint: \"^9.23.0\",\r\n globals: \"^16.0.0\",\r\n prettier: \"^3.5.3\",\r\n rimraf: \"^6.0.1\",\r\n \"ts-node\": \"^10.9.2\",\r\n typescript: \"^5.8.2\",\r\n \"typescript-eslint\": \"^8.28.0\"\r\n },\r\n dependencies: {\r\n dotenv: \"^16.4.7\",\r\n knex: \"^3.1.0\",\r\n lodash: \"^4.17.21\",\r\n pg: \"^8.14.1\",\r\n uuid: \"^11.1.0\"\r\n }\r\n };\r\n } else if (templateType === 'backend') {\r\n packageJson = {\r\n name: dirName,\r\n version: \"1.0.0\",\r\n description: `Backend project generated with Sundays Framework`,\r\n main: \"dist/server.js\",\r\n scripts: {\r\n \"test\": \"jest\",\r\n \"start\": \"node dist/server.js\",\r\n \"build\": \"tsc\",\r\n \"start:dev\": \"nodemon src/server.ts\",\r\n \"format\": \"prettier --write .\",\r\n \"create:controller\": \"sundaysf --create-controller\"\r\n },\r\n dependencies: {\r\n \"morgan\": \"^1.10.0\",\r\n \"cors\": \"^2.8.5\",\r\n \"dotenv\": \"^16.4.7\",\r\n \"express\": \"^4.18.2\"\r\n },\r\n devDependencies: {\r\n \"@types/morgan\": \"^1.9.9\",\r\n \"@types/cors\": \"^2.8.17\",\r\n \"@types/express\": \"^4.17.21\",\r\n \"nodemon\": \"^3.0.2\",\r\n \"prettier\": \"^3.5.3\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"typescript\": \"^5.8.2\",\r\n \"@eslint/js\": \"^9.23.0\",\r\n \"eslint\": \"^9.23.0\",\r\n \"typescript-eslint\": \"^8.28.0\"\r\n },\r\n author: \"\",\r\n license: \"MIT\"\r\n };\r\n } else {\r\n // module\r\n packageJson = {\r\n name: dirName,\r\n version: \"1.0.0\",\r\n description: `Module generated with Sundays Framework`,\r\n main: \"dist/index.js\",\r\n types: \"dist/index.d.ts\",\r\n scripts: {\r\n \"test\": \"jest\",\r\n \"build\": \"tsc\",\r\n \"format\": \"prettier --write .\",\r\n \"clean\": \"rimraf dist && npm run build\"\r\n },\r\n dependencies: {},\r\n devDependencies: {\r\n \"prettier\": \"^3.5.3\",\r\n \"rimraf\": \"^6.0.1\",\r\n \"typescript\": \"^5.8.2\"\r\n },\r\n author: \"\",\r\n license: \"MIT\"\r\n };\r\n }\r\n\r\n await fs.writeJson(path.join(destDir, 'package.json'), packageJson, { spaces: 2 });\r\n\r\n if (templateType === 'backend') {\r\n const postmanBaseData = generateBasePostman(projectName);\r\n await fs.writeJson(path.join(destDir, 'postman.json'), postmanBaseData, { spaces: 2 });\r\n }\r\n\r\n const spinnerGit = ora('Git init...').start();\r\n await initGitRepo(destDir);\r\n spinnerGit.succeed('Git initialized');\r\n\r\n const spinner = ora('Installing dependencies...').start();\r\n await runNpmInstall(destDir);\r\n spinner.succeed('Dependencies installed');\r\n\r\n await runFormatter(destDir);\r\n console.log(`Project '${projectName}' created successfully in ./${dirName}`);\r\n });\r\n} else if (options.createController) {\r\n // Verify we're inside a backend project\r\n if (!fs.existsSync('./src/controllers') || !fs.existsSync('./postman.json')) {\r\n console.error('This command must be run inside a Sundays backend project.');\r\n console.error('Expected ./src/controllers/ and ./postman.json to exist.');\r\n process.exit(1);\r\n }\r\n\r\n inquirer.prompt([\r\n {\r\n type: 'input',\r\n name: 'controllerName',\r\n message: 'Controller name:',\r\n validate: input => {\r\n if (!input) return 'The controller name is empty';\r\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(input)) {\r\n return 'Name must start with a letter and contain only letters and numbers';\r\n }\r\n return true;\r\n }\r\n }\r\n ]).then(async ({ controllerName }) => {\r\n try {\r\n const nonCapitalized = controllerName.charAt(0).toLowerCase() + controllerName.slice(1);\r\n const capitalized = controllerName.charAt(0).toUpperCase() + controllerName.slice(1);\r\n const controllerClassName = `${capitalized}Controller`;\r\n const controllerFileName = `${nonCapitalized}.controller.ts`;\r\n const controllerDirectoryName = `${nonCapitalized}`;\r\n const routerClassName = `${capitalized}Router`;\r\n const routerFileName = `${nonCapitalized}.router.ts`;\r\n const routerDirectoryName = `${nonCapitalized}`;\r\n\r\n const controllerDir = `./src/controllers/${controllerDirectoryName}`;\r\n const routerDir = `./src/routes/${routerDirectoryName}`;\r\n\r\n if (fs.existsSync(controllerDir)) {\r\n console.error(`Controller directory \"${controllerDir}\" already exists.`);\r\n process.exit(1);\r\n }\r\n\r\n const classControllerContentGenerator = generateController(controllerClassName);\r\n const classRouterContentGenerator = generateRouter(routerClassName, controllerClassName, controllerDirectoryName);\r\n const controllerPath = `${controllerDir}/${controllerFileName}`;\r\n const routerPath = `${routerDir}/${routerFileName}`;\r\n\r\n await fs.mkdir(controllerDir, { recursive: true });\r\n await fs.mkdir(routerDir, { recursive: true });\r\n await fs.writeFile(controllerPath, classControllerContentGenerator);\r\n await fs.writeFile(routerPath, classRouterContentGenerator);\r\n\r\n const postmanBaseData = await fs.readFile('./postman.json', 'utf-8');\r\n const leanData = JSON.parse(postmanBaseData);\r\n const itemToPush = getItemFormatted(routerDirectoryName, leanData.info.name);\r\n leanData.item.push(itemToPush);\r\n await fs.writeJson(path.join('.', 'postman.json'), leanData, { spaces: 2 });\r\n\r\n await runFormatter('.');\r\n console.log(`Created ${controllerClassName} in ${controllerDirectoryName}/${controllerFileName} and ${routerClassName} in ${routerDirectoryName}/${routerFileName}`);\r\n } catch (err) {\r\n console.error('Error generating controller:', err.message);\r\n process.exit(1);\r\n }\r\n });\r\n} else {\r\n program.help();\r\n}\r\n\r\n\r\nfunction runFormatter(cwd = '.') {\r\n return new Promise((resolve, reject) => {\r\n const formatProcess = exec('npm run format', { cwd });\r\n\r\n formatProcess.stdout.on('data', data => process.stdout.write(data));\r\n formatProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n formatProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`npm format exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n\r\n\r\nfunction runNpmInstall(destDir) {\r\n return new Promise((resolve, reject) => {\r\n const installProcess = exec('npm install', { cwd: destDir });\r\n\r\n installProcess.stdout.on('data', data => process.stdout.write(data));\r\n installProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n installProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`npm install exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction initGitRepo(destDir) {\r\n return new Promise((resolve, reject) => {\r\n const gitProcess = exec('git init', { cwd: destDir });\r\n\r\n gitProcess.stdout.on('data', data => process.stdout.write(data));\r\n gitProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n gitProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`Git init exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Command","inquirer","generateController","generateRouter","fs","path","fileURLToPath","exec","ora","generateBasePostman","getItemFormatted","__dirname","dirname","url","pkg","readJsonSync","join","program","version","option","parse","process","argv","options","opts","runFormatter","cwd","Promise","resolve","reject","formatProcess","stdout","on","data","write","stderr","code","Error","runNpmInstall","destDir","installProcess","initGitRepo","gitProcess","init","backend","module","dbSql","console","log","prompt","type","name","message","validate","input","then","async","projectName","templateType","srcDir","dirName","toLowerCase","replace","existsSync","error","exit","mkdir","recursive","copy","overwrite","errorOnExist","filter","src","dest","err","packageJson","description","main","scripts","test","format","build","clean","repository","author","license","bugs","homepage","devDependencies","eslint","globals","prettier","rimraf","typescript","dependencies","dotenv","knex","lodash","pg","uuid","start","morgan","cors","express","nodemon","types","writeJson","spaces","postmanBaseData","spinnerGit","succeed","spinner","createController","controllerName","nonCapitalized","charAt","slice","capitalized","toUpperCase","controllerClassName","controllerFileName","controllerDirectoryName","routerClassName","routerFileName","routerDirectoryName","controllerDir","routerDir","classControllerContentGenerator","classRouterContentGenerator","controllerPath","routerPath","writeFile","readFile","leanData","JSON","itemToPush","info","item","push","help"],"sources":["bin/index.js"],"mappings":"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","ignoreList":[],"sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Command } from 'commander';\r\nimport inquirer from 'inquirer';\r\nimport { generateController, generateRouter } from './generators/class.js';\r\nimport fs from 'fs-extra';\r\nimport path from 'path';\r\nimport { fileURLToPath } from 'url';\r\nimport { exec } from 'child_process';\r\nimport ora from 'ora';\r\nimport { generateBasePostman, getItemFormatted } from './generators/postman.js';\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\r\nconst pkg = fs.readJsonSync(path.join(__dirname, '../../package.json'));\r\n\r\nconst program = new Command();\r\n\r\nprogram\r\n .version(pkg.version, '-v, --version')\r\n .option('--init', 'Initialize a new project')\r\n .option('--backend', 'Initialize with backend template')\r\n .option('--module', 'Initialize with module template')\r\n .option('--db-sql', 'Initialize with db-sql template')\r\n .option('--create-controller', 'Create a controller and its associated route');\r\n\r\nprogram.parse(process.argv);\r\n\r\nconst options = program.opts();\r\n\r\nif (options.init && (options.backend || options.module || options.dbSql)) {\r\n console.log(\"Hello! I'm Paul Sundays, your backend architect. Let's craft an awesome backend together!\");\r\n inquirer.prompt([\r\n {\r\n type: 'input',\r\n name: 'projectName',\r\n message: 'Name of the project:',\r\n validate: input => input ? true : 'The name of the project can not be empty'\r\n }\r\n ]).then(async ({ projectName }) => {\r\n const templateType = options.backend ? 'backend' : options.module ? 'module' : 'db-sql';\r\n const srcDir = path.join(__dirname, `../templates/${templateType}`);\r\n const dirName = projectName.toLowerCase().replace(/\\s+/g, '-');\r\n const destDir = path.resolve(dirName);\r\n\r\n if (fs.existsSync(destDir)) {\r\n console.error(`Directory \"${dirName}\" already exists.`);\r\n process.exit(1);\r\n }\r\n\r\n try {\r\n await fs.mkdir(destDir, { recursive: true });\r\n await fs.copy(srcDir, destDir, {\r\n overwrite: false,\r\n errorOnExist: true,\r\n filter: (src, dest) => {\r\n return true;\r\n }\r\n });\r\n console.log('Template files copied successfully');\r\n } catch (err) {\r\n console.error('Error copying the files:', err);\r\n process.exit(1);\r\n }\r\n\r\n let packageJson;\r\n if (templateType === 'db-sql') {\r\n packageJson = {\r\n name: dirName,\r\n version: \"0.0.1\",\r\n description: \"Knex Module\",\r\n main: \"dist/index.js\",\r\n scripts: {\r\n test: \"jest\",\r\n format: \"prettier --write .\",\r\n build: \"tsc\",\r\n clean: \"rimraf dist && npm run format && npm run build\",\r\n \"npm:publish\": \"npm run clean && npm publish\",\r\n \"migrate:create\": \"knex migrate:make migration -x ts\",\r\n \"migrate:deploy\": \"knex migrate:latest\",\r\n \"seed:create\": \"knex seed:make seed -x ts\",\r\n \"seed:run\": \"knex seed:run\"\r\n },\r\n repository: {\r\n type: \"git\",\r\n url: \"\"\r\n },\r\n author: \"\",\r\n license: \"MIT\",\r\n bugs: {\r\n url: \"\"\r\n },\r\n homepage: \"\",\r\n devDependencies: {\r\n \"@eslint/js\": \"^9.23.0\",\r\n \"@types/node\": \"^22.13.13\",\r\n eslint: \"^9.23.0\",\r\n globals: \"^16.0.0\",\r\n prettier: \"^3.5.3\",\r\n rimraf: \"^6.0.1\",\r\n \"ts-node\": \"^10.9.2\",\r\n typescript: \"^5.8.2\",\r\n \"typescript-eslint\": \"^8.28.0\"\r\n },\r\n dependencies: {\r\n dotenv: \"^16.4.7\",\r\n knex: \"^3.1.0\",\r\n lodash: \"^4.17.21\",\r\n pg: \"^8.14.1\",\r\n uuid: \"^11.1.0\"\r\n }\r\n };\r\n } else if (templateType === 'backend') {\r\n packageJson = {\r\n name: dirName,\r\n version: \"1.0.0\",\r\n description: `Backend project generated with Sundays Framework`,\r\n main: \"dist/server.js\",\r\n scripts: {\r\n \"test\": \"jest\",\r\n \"start\": \"node dist/server.js\",\r\n \"build\": \"tsc\",\r\n \"start:dev\": \"nodemon src/server.ts\",\r\n \"format\": \"prettier --write .\",\r\n \"create:controller\": \"sundaysf --create-controller\"\r\n },\r\n dependencies: {\r\n \"morgan\": \"^1.10.0\",\r\n \"cors\": \"^2.8.5\",\r\n \"dotenv\": \"^16.4.7\",\r\n \"express\": \"^4.18.2\"\r\n },\r\n devDependencies: {\r\n \"@types/morgan\": \"^1.9.9\",\r\n \"@types/cors\": \"^2.8.17\",\r\n \"@types/express\": \"^4.17.21\",\r\n \"nodemon\": \"^3.0.2\",\r\n \"prettier\": \"^3.5.3\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"typescript\": \"^5.8.2\",\r\n \"@eslint/js\": \"^9.23.0\",\r\n \"eslint\": \"^9.23.0\",\r\n \"typescript-eslint\": \"^8.28.0\"\r\n },\r\n author: \"\",\r\n license: \"MIT\"\r\n };\r\n } else {\r\n // module\r\n packageJson = {\r\n name: dirName,\r\n version: \"1.0.0\",\r\n description: `Module generated with Sundays Framework`,\r\n main: \"dist/index.js\",\r\n types: \"dist/index.d.ts\",\r\n scripts: {\r\n \"test\": \"jest\",\r\n \"build\": \"tsc\",\r\n \"format\": \"prettier --write .\",\r\n \"clean\": \"rimraf dist && npm run build\"\r\n },\r\n dependencies: {},\r\n devDependencies: {\r\n \"prettier\": \"^3.5.3\",\r\n \"rimraf\": \"^6.0.1\",\r\n \"typescript\": \"^5.8.2\"\r\n },\r\n author: \"\",\r\n license: \"MIT\"\r\n };\r\n }\r\n\r\n await fs.writeJson(path.join(destDir, 'package.json'), packageJson, { spaces: 2 });\r\n\r\n if (templateType === 'backend') {\r\n const postmanBaseData = generateBasePostman(projectName);\r\n await fs.writeJson(path.join(destDir, 'postman.json'), postmanBaseData, { spaces: 2 });\r\n }\r\n\r\n const spinnerGit = ora('Git init...').start();\r\n await initGitRepo(destDir);\r\n spinnerGit.succeed('Git initialized');\r\n\r\n const spinner = ora('Installing dependencies...').start();\r\n await runNpmInstall(destDir);\r\n spinner.succeed('Dependencies installed');\r\n\r\n await runFormatter(destDir);\r\n console.log(`Project '${projectName}' created successfully in ./${dirName}`);\r\n });\r\n} else if (options.createController) {\r\n // Verify we're inside a backend project\r\n if (!fs.existsSync('./src/controllers') || !fs.existsSync('./postman.json')) {\r\n console.error('This command must be run inside a Sundays backend project.');\r\n console.error('Expected ./src/controllers/ and ./postman.json to exist.');\r\n process.exit(1);\r\n }\r\n\r\n inquirer.prompt([\r\n {\r\n type: 'input',\r\n name: 'controllerName',\r\n message: 'Controller name:',\r\n validate: input => {\r\n if (!input) return 'The controller name is empty';\r\n if (!/^[a-zA-Z][a-zA-Z0-9]*$/.test(input)) {\r\n return 'Name must start with a letter and contain only letters and numbers';\r\n }\r\n return true;\r\n }\r\n }\r\n ]).then(async ({ controllerName }) => {\r\n try {\r\n const nonCapitalized = controllerName.charAt(0).toLowerCase() + controllerName.slice(1);\r\n const capitalized = controllerName.charAt(0).toUpperCase() + controllerName.slice(1);\r\n const controllerClassName = `${capitalized}Controller`;\r\n const controllerFileName = `${nonCapitalized}.controller.ts`;\r\n const controllerDirectoryName = `${nonCapitalized}`;\r\n const routerClassName = `${capitalized}Router`;\r\n const routerFileName = `${nonCapitalized}.router.ts`;\r\n const routerDirectoryName = `${nonCapitalized}`;\r\n\r\n const controllerDir = `./src/controllers/${controllerDirectoryName}`;\r\n const routerDir = `./src/routes/${routerDirectoryName}`;\r\n\r\n if (fs.existsSync(controllerDir)) {\r\n console.error(`Controller directory \"${controllerDir}\" already exists.`);\r\n process.exit(1);\r\n }\r\n\r\n const classControllerContentGenerator = generateController(controllerClassName);\r\n const classRouterContentGenerator = generateRouter(routerClassName, controllerClassName, controllerDirectoryName);\r\n const controllerPath = `${controllerDir}/${controllerFileName}`;\r\n const routerPath = `${routerDir}/${routerFileName}`;\r\n\r\n await fs.mkdir(controllerDir, { recursive: true });\r\n await fs.mkdir(routerDir, { recursive: true });\r\n await fs.writeFile(controllerPath, classControllerContentGenerator);\r\n await fs.writeFile(routerPath, classRouterContentGenerator);\r\n\r\n const postmanBaseData = await fs.readFile('./postman.json', 'utf-8');\r\n const leanData = JSON.parse(postmanBaseData);\r\n const itemToPush = getItemFormatted(routerDirectoryName, leanData.info.name);\r\n leanData.item.push(itemToPush);\r\n await fs.writeJson(path.join('.', 'postman.json'), leanData, { spaces: 2 });\r\n\r\n await runFormatter('.');\r\n console.log(`Created ${controllerClassName} in ${controllerDirectoryName}/${controllerFileName} and ${routerClassName} in ${routerDirectoryName}/${routerFileName}`);\r\n } catch (err) {\r\n console.error('Error generating controller:', err.message);\r\n process.exit(1);\r\n }\r\n });\r\n} else {\r\n program.help();\r\n}\r\n\r\n\r\nfunction runFormatter(cwd = '.') {\r\n return new Promise((resolve, reject) => {\r\n const formatProcess = exec('npm run format', { cwd });\r\n\r\n formatProcess.stdout.on('data', data => process.stdout.write(data));\r\n formatProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n formatProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`npm format exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n\r\n\r\nfunction runNpmInstall(destDir) {\r\n return new Promise((resolve, reject) => {\r\n const installProcess = exec('npm install', { cwd: destDir });\r\n\r\n installProcess.stdout.on('data', data => process.stdout.write(data));\r\n installProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n installProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`npm install exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction initGitRepo(destDir) {\r\n return new Promise((resolve, reject) => {\r\n const gitProcess = exec('git init', { cwd: destDir });\r\n\r\n gitProcess.stdout.on('data', data => process.stdout.write(data));\r\n gitProcess.stderr.on('data', data => process.stderr.write(data));\r\n\r\n gitProcess.on('close', code => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`Git init exited with code ${code}`));\r\n }\r\n });\r\n });\r\n}\r\n"]}
|