create-warlock 4.0.30 → 4.0.39

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.
Files changed (121) hide show
  1. package/cjs/index.js +10 -5
  2. package/cjs/index.js.map +1 -1
  3. package/create-app.js +0 -0
  4. package/esm/index.js +10 -5
  5. package/esm/index.js.map +1 -1
  6. package/package.json +32 -38
  7. package/templates/warlock/docs/new-module.md +123 -61
  8. package/templates/warlock/package.json +60 -67
  9. package/templates/warlock/src/app/auth/controllers/forgot-password.controller.ts +3 -2
  10. package/templates/warlock/src/app/auth/controllers/login.controller.ts +1 -4
  11. package/templates/warlock/src/app/auth/main.ts +6 -3
  12. package/templates/warlock/src/app/auth/models/otp/migrations/22-12-2025_10-30-20.otp-migration.ts +13 -16
  13. package/templates/warlock/src/app/auth/models/otp/otp.model.ts +26 -31
  14. package/templates/warlock/src/app/auth/requests/login.request.ts +1 -1
  15. package/templates/warlock/src/app/auth/services/auth.service.ts +10 -5
  16. package/templates/warlock/src/app/auth/services/otp.service.ts +2 -12
  17. package/templates/warlock/src/app/auth/services/reset-password.service.ts +1 -1
  18. package/templates/warlock/src/app/posts/controllers/create-new-post.controller.ts +20 -0
  19. package/templates/warlock/src/app/posts/controllers/update-post.controller.ts +24 -0
  20. package/templates/warlock/src/app/posts/models/post/psot.model.ts +33 -0
  21. package/templates/warlock/src/app/posts/routes.ts +11 -0
  22. package/templates/warlock/src/app/shared/utils/global-columns-schema.ts +8 -0
  23. package/templates/warlock/src/app/shared/utils/locales.ts +4 -0
  24. package/templates/warlock/src/app/uploads/controllers/fetch-uploaded-file.controller.ts +32 -0
  25. package/templates/warlock/src/app/uploads/routes.ts +4 -0
  26. package/templates/warlock/src/app/users/controllers/create-new-user.controller.ts +28 -0
  27. package/templates/warlock/src/app/users/controllers/get-users.controller.ts +7 -2
  28. package/templates/warlock/src/app/users/events/inject-created-by-user.into-model.event.ts +32 -0
  29. package/templates/warlock/src/app/users/events/sync.ts +5 -0
  30. package/templates/warlock/src/app/users/main.ts +5 -0
  31. package/templates/warlock/src/app/users/models/user/migrations/11-12-2025_23-58-03-user.migration.ts +12 -12
  32. package/templates/warlock/src/app/users/models/user/user.model.ts +54 -27
  33. package/templates/warlock/src/app/users/repositories/users.repository.ts +16 -20
  34. package/templates/warlock/src/app/users/routes.ts +7 -1
  35. package/templates/warlock/src/app/users/seeds/users.seed.ts +21 -0
  36. package/templates/warlock/src/app/utils/cloud-upload.middleware.ts +14 -0
  37. package/templates/warlock/src/app/utils/router.ts +11 -1
  38. package/templates/warlock/src/config/auth.ts +2 -0
  39. package/templates/warlock/src/config/database.ts +24 -7
  40. package/templates/warlock/src/config/storage.ts +17 -8
  41. package/templates/warlock/tsconfig.json +6 -5
  42. package/templates/warlock/yarn.lock +4831 -0
  43. package/cjs/commands/create-new-app/get-app-path.d.ts +0 -2
  44. package/cjs/commands/create-new-app/get-app-path.d.ts.map +0 -1
  45. package/cjs/commands/create-new-app/get-app-path.js +0 -8
  46. package/cjs/commands/create-new-app/get-app-path.js.map +0 -1
  47. package/cjs/commands/create-new-app/index.d.ts +0 -2
  48. package/cjs/commands/create-new-app/index.d.ts.map +0 -1
  49. package/cjs/commands/create-new-app/index.js +0 -50
  50. package/cjs/commands/create-new-app/index.js.map +0 -1
  51. package/cjs/commands/create-new-app/select-app-type.d.ts +0 -2
  52. package/cjs/commands/create-new-app/select-app-type.d.ts.map +0 -1
  53. package/cjs/commands/create-new-app/types.d.ts +0 -9
  54. package/cjs/commands/create-new-app/types.d.ts.map +0 -1
  55. package/cjs/commands/create-warlock-app/index.d.ts +0 -3
  56. package/cjs/commands/create-warlock-app/index.d.ts.map +0 -1
  57. package/cjs/commands/create-warlock-app/index.js +0 -51
  58. package/cjs/commands/create-warlock-app/index.js.map +0 -1
  59. package/cjs/helpers/app.d.ts +0 -54
  60. package/cjs/helpers/app.d.ts.map +0 -1
  61. package/cjs/helpers/app.js +0 -126
  62. package/cjs/helpers/app.js.map +0 -1
  63. package/cjs/helpers/exec.d.ts +0 -10
  64. package/cjs/helpers/exec.d.ts.map +0 -1
  65. package/cjs/helpers/exec.js +0 -69
  66. package/cjs/helpers/exec.js.map +0 -1
  67. package/cjs/helpers/package-manager.d.ts +0 -6
  68. package/cjs/helpers/package-manager.d.ts.map +0 -1
  69. package/cjs/helpers/package-manager.js +0 -22
  70. package/cjs/helpers/package-manager.js.map +0 -1
  71. package/cjs/helpers/paths.d.ts +0 -4
  72. package/cjs/helpers/paths.d.ts.map +0 -1
  73. package/cjs/helpers/paths.js +0 -8
  74. package/cjs/helpers/paths.js.map +0 -1
  75. package/cjs/helpers/project-builder-helpers.d.ts +0 -6
  76. package/cjs/helpers/project-builder-helpers.d.ts.map +0 -1
  77. package/cjs/helpers/project-builder-helpers.js +0 -18
  78. package/cjs/helpers/project-builder-helpers.js.map +0 -1
  79. package/cjs/index.d.ts +0 -2
  80. package/cjs/index.d.ts.map +0 -1
  81. package/esm/commands/create-new-app/get-app-path.d.ts +0 -2
  82. package/esm/commands/create-new-app/get-app-path.d.ts.map +0 -1
  83. package/esm/commands/create-new-app/get-app-path.js +0 -8
  84. package/esm/commands/create-new-app/get-app-path.js.map +0 -1
  85. package/esm/commands/create-new-app/index.d.ts +0 -2
  86. package/esm/commands/create-new-app/index.d.ts.map +0 -1
  87. package/esm/commands/create-new-app/index.js +0 -50
  88. package/esm/commands/create-new-app/index.js.map +0 -1
  89. package/esm/commands/create-new-app/select-app-type.d.ts +0 -2
  90. package/esm/commands/create-new-app/select-app-type.d.ts.map +0 -1
  91. package/esm/commands/create-new-app/types.d.ts +0 -9
  92. package/esm/commands/create-new-app/types.d.ts.map +0 -1
  93. package/esm/commands/create-warlock-app/index.d.ts +0 -3
  94. package/esm/commands/create-warlock-app/index.d.ts.map +0 -1
  95. package/esm/commands/create-warlock-app/index.js +0 -51
  96. package/esm/commands/create-warlock-app/index.js.map +0 -1
  97. package/esm/helpers/app.d.ts +0 -54
  98. package/esm/helpers/app.d.ts.map +0 -1
  99. package/esm/helpers/app.js +0 -126
  100. package/esm/helpers/app.js.map +0 -1
  101. package/esm/helpers/exec.d.ts +0 -10
  102. package/esm/helpers/exec.d.ts.map +0 -1
  103. package/esm/helpers/exec.js +0 -69
  104. package/esm/helpers/exec.js.map +0 -1
  105. package/esm/helpers/package-manager.d.ts +0 -6
  106. package/esm/helpers/package-manager.d.ts.map +0 -1
  107. package/esm/helpers/package-manager.js +0 -22
  108. package/esm/helpers/package-manager.js.map +0 -1
  109. package/esm/helpers/paths.d.ts +0 -4
  110. package/esm/helpers/paths.d.ts.map +0 -1
  111. package/esm/helpers/paths.js +0 -8
  112. package/esm/helpers/paths.js.map +0 -1
  113. package/esm/helpers/project-builder-helpers.d.ts +0 -6
  114. package/esm/helpers/project-builder-helpers.d.ts.map +0 -1
  115. package/esm/helpers/project-builder-helpers.js +0 -18
  116. package/esm/helpers/project-builder-helpers.js.map +0 -1
  117. package/esm/index.d.ts +0 -2
  118. package/esm/index.d.ts.map +0 -1
  119. package/templates/warlock/src/app/users/repositories/users-repository.ts +0 -66
  120. package/templates/warlock/src/app/users/services/get-new-customers.ts +0 -5
  121. package/templates/warlock/src/app/utils/output.ts +0 -5
package/cjs/index.js CHANGED
@@ -1,5 +1,10 @@
1
- 'use strict';var fs=require('@mongez/fs'),index=require('./commands/create-new-app/index.js'),paths=require('./helpers/paths.js');function createApp() {
2
- const packageJson = fs.getJsonFile(paths.packageRoot("package.json"));
3
- const createWarlockVersion = packageJson.version;
4
- index(createWarlockVersion);
5
- }module.exports=createApp;//# sourceMappingURL=index.js.map
1
+ 'use strict';var fs=require('@mongez/fs'),prompts=require('@clack/prompts'),copper=require('@mongez/copper'),x=require('path'),T=require('cross-spawn'),url=require('url'),V=require('which-pm-runs'),rimraf=require('rimraf');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var x__namespace=/*#__PURE__*/_interopNamespace(x);var T__default=/*#__PURE__*/_interopDefault(T);var V__default=/*#__PURE__*/_interopDefault(V);var o=(e,t,r)=>new Promise((n,s)=>{var i=l=>{try{a(r.next(l));}catch(y){s(y);}},p=l=>{try{a(r.throw(l));}catch(y){s(y);}},a=l=>l.done?n(l.value):Promise.resolve(l.value).then(i,p);a((r=r.apply(e,t)).next());});function m(e,t,r){return o(this,null,function*(){return new Promise(n=>{let s=T__default.default(e,t,{cwd:r,stdio:"ignore"});s.on("error",i=>{i&&(i.message?prompts.log.error(copper.colors.red(String(i.message))+`
2
+
3
+ `):prompts.log.error(copper.colors.red(String(i))+`
4
+
5
+ `)),n(false);}),s.on("close",i=>{n(i===0);});})})}function J(e,t,r){let n,s=new Promise(p=>{try{n=T__default.default(e,t,{cwd:r,stdio:"ignore"}),n.on("error",a=>{a&&(a.message?prompts.log.error(copper.colors.red(String(a.message))+`
6
+
7
+ `):prompts.log.error(copper.colors.red(String(a))+`
8
+
9
+ `)),p(!1);}),n.on("close",a=>{p(a===0);});}catch(a){p(false);}});return {abort:()=>o(null,null,function*(){n&&n.kill("SIGINT");}),install:s}}var O={},B=url.fileURLToPath(O.url),j=x__namespace.default.dirname(B);function k(e){return x__namespace.default.resolve(j,"../","../","templates",e)}function M(...e){return x__namespace.default.resolve(j,"../","../",...e)}var w;function c(){return w||V__default.default().name||"npm"}function N(e){w=e;}function F(){return c()==="npm"?"npm run dev":`${c()} dev`}function D(e){let t=c();return t==="npm"?`npm run ${e}`:`${t} ${e}`}function $(e){return o(this,null,function*(){return yield m("git",["init"],e),yield m("git",["checkout","-b","main"],e),yield m("git",["add","."],e),yield m("git",["commit","-m","Initial commit \u26A1\uFE0F"],e),true})}function _(e){return o(this,null,function*(){prompts.outro("\u{1F31F} Awesome! Your project is ready to rock! Run the following command to start development:"),console.log(copper.colors.cyan(`cd ${e} && ${F()}`)),console.log(),console.log(`\u{1F4A1} Pro tip: Install the ${copper.colors.yellow("Generator Z")} extension in VSCode for helpful code snippets and productivity boosters! \u{1F680}`);})}var h=class{constructor(t){this.app=t;this.files={};this.isInstalled=false;}use(t){return fs.copyDirectory(k(t),this.path),fs.fileExists(this.path+"/.env.example")&&fs.copyFile(this.path+"/.env.example",this.path+"/.env"),fs.renameFile(this.path+"/_.gitignore",this.path+"/.gitignore"),this}init(){return this}terminate(){_(this.name);}install(){return J(c(),["install"],this.path)}exec(t){return o(this,null,function*(){let[r,...n]=t.split(" ");return yield m(r,n,this.path)})}git(){return o(this,null,function*(){return yield $(this.path)})}updatePackageJson(){return this.package.replace("name",this.name.replaceAll("/","-")).replaceAll("yarn",c()).save(),this}get package(){return this.json("package.json")}updateDotEnv(){return this.file(".env").replaceAll("appName",this.name).save(),this}get env(){return this.file(".env")}get name(){return this.app.appName}get path(){return this.app.appPath}file(t){let r=x__namespace.default.resolve(this.path,t);return this.files[r]||(this.files[r]=te(r)),this.files[r]}json(t){let r=x__namespace.default.resolve(this.path,t);return this.files[r]||(this.files[r]=re(r)),this.files[r]}};var d=class{constructor(t){this.filePath=t;this.parseContent();}parseContent(){this.content=fs.getFile(this.filePath);}replace(t,r){return this.content=this.content.replace(t,r),this}replaceAll(t,r){return this.content=this.content.replaceAll(t,r),this}save(){fs.putFile(this.filePath,this.content);}},v=class extends d{parseContent(){this.content=fs.getJsonFile(this.filePath);}save(){fs.putJsonFile(this.filePath,this.content);}has(t){return this.content[t]!==void 0}replace(t,r){return this.content[t]=r,this}replaceAll(t,r){let n=JSON.stringify(this.content);return this.content=JSON.parse(n.replaceAll(t,r)),this}};function te(e){return new d(e)}function re(e){return new v(e)}function R(e){return o(this,null,function*(){e.init().use("warlock").updatePackageJson().updateDotEnv();let t=e.install(),r=(yield prompts.confirm({message:"Do you want to install dependencies?"}))===true;if(!r){t.abort();let i=x__namespace.default.join(e.path,"node_modules");rimraf.rimraf(i);}let n=(yield prompts.confirm({message:"Do you want to initialize Git repository?"}))===true,s=false;if(r&&(s=(yield prompts.confirm({message:"Do you want to generate JWT Secret key?"}))===true),n){let i=prompts.spinner();i.start("\u{1F4C2} Initializing Git repository..."),yield e.git(),i.stop("\u{1F4C2} Git repository initialized \u2705");}if(r){let i=prompts.spinner();if(i.start("\u{1F4E6} Installing dependencies..."),yield t.install,i.stop("\u{1F4E6} Dependencies installed successfully!"),s){let p=prompts.spinner();p.start("\u{1F511} Generating JWT Secret..."),yield e.exec(D("jwt")),p.stop("\u{1F511} JWT Secret generated \u{1F512}");}}e.terminate();})}function P(e){let t=x__namespace.resolve(process.cwd(),e);return fs.isDirectory(t)&&(console.log(copper.colors.redBright(`${process.cwd()} has an existing directory \`${copper.colors.cyan(e)}\`, please choose another app name or another directory to run the command from.`)),process.exit(1)),t}var u={appName:"",appType:"",appPath:"",pkgManager:"",options:{}};function C(e){return o(this,null,function*(){prompts.intro(`\u2728 Let's create a new ${copper.colors.yellowBright("Warlock Js App")} \u2728 ${copper.colors.greenBright("v"+e)}`);let t=yield prompts.text({message:"Enter the app name",placeholder:"warlock-app"});(prompts.isCancel(t)||!t.trim())&&(prompts.cancel("Application name is required to create a new app"),process.exit(0));let[r]=process.versions.node.split(".").map(Number);r<20&&(prompts.cancel("Node.js version must be at least 20.0.0"),process.exit(0));let n=yield prompts.select({message:"Select package manager to use \u{1F4E6} ",initialValue:c(),options:[{label:"Npm",value:"npm"},{label:"Yarn",value:"yarn"},{label:"Pnpm",value:"pnpm"}]});N(n),u.appName=t,u.appPath=P(t),u.pkgManager=n,u.appPath&&(u.appType="warlock",R(new h(u)));})}function me(){let t=fs.getJsonFile(M("package.json")).version;C(t);}module.exports=me;//# sourceMappingURL=index.js.map
10
+ //# sourceMappingURL=index.js.map
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":["getJsonFile","packageRoot","createNewApp"],"mappings":"kIAIc,SAAU,SAAS,GAAA;IAC/B,MAAM,WAAW,GAAQA,cAAW,CAACC,iBAAW,CAAC,cAAc,CAAC,CAAC,CAAC;AAClE,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC;IACjDC,KAAY,CAAC,oBAAoB,CAAC,CAAC;AACrC"}
1
+ {"version":3,"sources":["../../../../../../warlock.js/create-warlock/src/helpers/exec.ts","../../../../../../warlock.js/create-warlock/src/helpers/paths.ts","../../../../../../warlock.js/create-warlock/src/helpers/package-manager.ts","../../../../../../warlock.js/create-warlock/src/helpers/project-builder-helpers.ts","../../../../../../warlock.js/create-warlock/src/helpers/app.ts","../../../../../../warlock.js/create-warlock/src/commands/create-warlock-app/index.ts","../../../../../../warlock.js/create-warlock/src/commands/create-new-app/get-app-path.ts","../../../../../../warlock.js/create-warlock/src/commands/create-new-app/index.ts","../../../../../../warlock.js/create-warlock/src/index.ts"],"names":["executeCommand","cmd","args","cwd","__async","resolve","child","spawn","e","log","colors","code","runCommand","install","import_meta","__filename","fileURLToPath","__dirname","path","template","templateName","packageRoot","paths","detectedPackageManager","getPackageManager","detectPackageManager","setPackageManager","packageManager","startCommand","runPackageManagerCommand","command","initializeGitRepository","appPath","allDone","appName","outro","App","app","copyDirectory","fileExists","copyFile","renameFile","commandName","optionsList","relativePath","fullPath","file","jsonFile","FileManager","filePath","getFile","search","replace","putFile","JsonFileManager","getJsonFile","putJsonFile","key","value","contentAsString","createWarlockApp","application","installProcess","installDeps","confirm","nodeModulesPath","rimraf","useGit","useJWT","loading","spinner","jwtLoading","getAppPath","E","isDirectory","appDetails","createNewApp","createWarlockVersion","intro","text","isCancel","cancel","major","select","createApp"],"mappings":"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","file":"index.js","sourcesContent":["import { log } from \"@clack/prompts\";\r\nimport { colors } from \"@mongez/copper\";\r\nimport { ChildProcess } from \"child_process\";\r\nimport { default as childProcess, default as spawn } from \"cross-spawn\";\r\n\r\nexport default async function exec(command: string, options: any = {}) {\r\n const [commandName, ...optionsList] = command.split(\" \");\r\n\r\n const commandOutput = childProcess.sync(commandName, optionsList, options);\r\n\r\n // it means command didn't end as expected, then stop the rest of the program\r\n if (commandOutput.error !== null) {\r\n process.exit(1);\r\n }\r\n\r\n return commandOutput;\r\n}\r\n\r\n/**\r\n * This function directly executes a command\r\n */\r\nexport async function executeCommand(cmd: string, args: string[], cwd: string) {\r\n return new Promise<boolean>(resolve => {\r\n const child = spawn(cmd, args, {\r\n cwd,\r\n stdio: \"ignore\",\r\n });\r\n\r\n child.on(\"error\", e => {\r\n if (e) {\r\n if (e.message) {\r\n log.error(colors.red(String(e.message)) + `\\n\\n`);\r\n } else {\r\n log.error(colors.red(String(e)) + `\\n\\n`);\r\n }\r\n }\r\n resolve(false);\r\n });\r\n\r\n child.on(\"close\", code => {\r\n if (code === 0) {\r\n resolve(true);\r\n } else {\r\n resolve(false);\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport function runCommand(cmd: string, args: string[], cwd: string) {\r\n let child: ChildProcess;\r\n\r\n const install = new Promise<boolean>(resolve => {\r\n try {\r\n child = spawn(cmd, args, {\r\n cwd,\r\n stdio: \"ignore\",\r\n });\r\n\r\n child.on(\"error\", e => {\r\n if (e) {\r\n if (e.message) {\r\n log.error(colors.red(String(e.message)) + `\\n\\n`);\r\n } else {\r\n log.error(colors.red(String(e)) + `\\n\\n`);\r\n }\r\n }\r\n resolve(false);\r\n });\r\n\r\n child.on(\"close\", code => {\r\n if (code === 0) {\r\n resolve(true);\r\n } else {\r\n resolve(false);\r\n }\r\n });\r\n } catch (e) {\r\n resolve(false);\r\n }\r\n });\r\n\r\n const abort = async () => {\r\n if (child) {\r\n child.kill(\"SIGINT\");\r\n }\r\n };\r\n\r\n return { abort, install };\r\n}\r\n","import path from \"path\";\r\nimport { fileURLToPath } from \"url\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\n\r\nconst __dirname = path.dirname(__filename);\r\n\r\nexport type Template = \"warlock\";\r\n\r\nexport function template(templateName: Template): string {\r\n return path.resolve(__dirname, \"../\", \"../\", \"templates\", templateName);\r\n}\r\n\r\nexport function packageRoot(...paths: string[]): string {\r\n return path.resolve(__dirname, \"../\", \"../\", ...paths);\r\n}\r\n","import detectPackageManager from \"which-pm-runs\";\r\n\r\nlet detectedPackageManager: string | undefined;\r\n\r\nexport function getPackageManager() {\r\n if (detectedPackageManager) {\r\n return detectedPackageManager;\r\n }\r\n\r\n const packageManager = detectPackageManager();\r\n\r\n return packageManager.name || \"npm\";\r\n}\r\n\r\nexport function setPackageManager(packageManager: string) {\r\n detectedPackageManager = packageManager;\r\n}\r\n\r\nexport function installCommand() {\r\n return `${getPackageManager()} install`;\r\n}\r\n\r\nexport function startCommand() {\r\n if (getPackageManager() === \"npm\") return \"npm run dev\";\r\n\r\n return `${getPackageManager()} dev`;\r\n}\r\n\r\nexport function runPackageManagerCommand(command: string) {\r\n const packageManager = getPackageManager();\r\n\r\n if (packageManager === \"npm\") return `npm run ${command}`;\r\n\r\n return `${packageManager} ${command}`;\r\n}\r\n","import { outro } from \"@clack/prompts\";\r\nimport { colors } from \"@mongez/copper\";\r\nimport {\r\n copyDirectory,\r\n getFile,\r\n getJsonFile,\r\n putFile,\r\n putJsonFile,\r\n renameFile,\r\n} from \"@mongez/fs\";\r\nimport path from \"path\";\r\nimport { executeCommand } from \"./exec\";\r\nimport { startCommand } from \"./package-manager\";\r\nimport { Template, template } from \"./paths\";\r\n\r\nexport async function initializeGitRepository(appPath: string) {\r\n // initialize git repository\r\n await executeCommand(`git`, [\"init\"], appPath);\r\n // switching to `main` branch\r\n await executeCommand(`git`, [\"checkout\", \"-b\", \"main\"], appPath);\r\n\r\n // add files\r\n await executeCommand(`git`, [\"add\", \".\"], appPath);\r\n\r\n // commit files\r\n await executeCommand(`git`, [\"commit\", \"-m\", \"Initial commit ⚡️\"], appPath);\r\n\r\n return true;\r\n}\r\n\r\nexport async function updateEnvFile(appPath: string, appName: string) {\r\n // update package.json file\r\n const packageJson: any = getJsonFile(path.resolve(appPath, \"package.json\"));\r\n\r\n packageJson.name = appName;\r\n\r\n putJsonFile(path.resolve(appPath, \"package.json\"), packageJson);\r\n\r\n // update env file\r\n const dotEnv = getFile(path.resolve(appPath, \".env\"))\r\n .replace(\"AppName\", appName)\r\n .replace(\r\n \"AppCodeName\",\r\n appName\r\n .split(/-|_/g)\r\n .map(word => word[0])\r\n .join(\"\"),\r\n );\r\n\r\n putFile(path.resolve(appPath, \".env\"), dotEnv);\r\n\r\n // update .env.production file\r\n let dotEnvProduction = getFile(path.resolve(appPath, \".env.shared\"));\r\n\r\n dotEnvProduction = dotEnvProduction.replace(\"AppName\", appName).replace(\r\n \"AppCodeName\",\r\n appName\r\n .split(/-|_/g)\r\n .map(word => word[0])\r\n .join(\"\"),\r\n );\r\n\r\n putFile(path.resolve(appPath, \".env.shared\"), dotEnvProduction);\r\n}\r\n\r\nexport async function copyTemplateFiles(\r\n templateName: Template,\r\n appPath: string,\r\n _appName: string,\r\n) {\r\n // copy project files\r\n copyDirectory(template(templateName), appPath);\r\n\r\n // replace _.gitignore to\r\n renameFile(\r\n path.resolve(appPath, \"_.gitignore\"),\r\n path.resolve(appPath, \".gitignore\"),\r\n );\r\n}\r\n\r\nexport async function allDone(appName: string) {\r\n outro(\r\n \"🌟 Awesome! Your project is ready to rock! \" +\r\n \"Run the following command to start development:\",\r\n );\r\n\r\n console.log(colors.cyan(`cd ${appName} && ${startCommand()}`));\r\n\r\n console.log();\r\n\r\n console.log(\r\n `💡 Pro tip: Install the ${colors.yellow(\r\n \"Generator Z\",\r\n )} extension in VSCode for helpful code snippets and productivity boosters! 🚀`,\r\n );\r\n}\r\n","import {\r\n copyDirectory,\r\n copyFile,\r\n fileExists,\r\n getFile,\r\n getJsonFile,\r\n putFile,\r\n putJsonFile,\r\n renameFile,\r\n} from \"@mongez/fs\";\r\nimport path from \"path\";\r\nimport { Application } from \"src/commands/create-new-app/types\";\r\nimport { executeCommand, runCommand } from \"src/helpers/exec\";\r\nimport { Template, template } from \"src/helpers/paths\";\r\nimport {\r\n allDone,\r\n initializeGitRepository,\r\n} from \"src/helpers/project-builder-helpers\";\r\nimport { getPackageManager } from \"./package-manager\";\r\n\r\nexport class App {\r\n /**\r\n * Resolved files\r\n */\r\n protected files: Record<string, FileManager> = {};\r\n\r\n public isInstalled = false;\r\n\r\n public constructor(protected app: Application) {}\r\n\r\n public use(templateName: Template) {\r\n copyDirectory(template(templateName), this.path);\r\n\r\n if (fileExists(this.path + \"/.env.example\")) {\r\n copyFile(this.path + \"/.env.example\", this.path + \"/.env\");\r\n }\r\n\r\n renameFile(this.path + \"/_.gitignore\", this.path + \"/.gitignore\");\r\n\r\n return this;\r\n }\r\n\r\n public init() {\r\n return this;\r\n }\r\n\r\n public terminate() {\r\n allDone(this.name);\r\n }\r\n\r\n public install() {\r\n return runCommand(getPackageManager(), [\"install\"], this.path);\r\n }\r\n\r\n public async exec(command: string) {\r\n const [commandName, ...optionsList] = command.split(\" \");\r\n return await executeCommand(commandName, optionsList, this.path);\r\n }\r\n\r\n public async git() {\r\n return await initializeGitRepository(this.path);\r\n }\r\n\r\n public updatePackageJson() {\r\n this.package\r\n .replace(\"name\", this.name.replaceAll(\"/\", \"-\"))\r\n .replaceAll(\"yarn\", getPackageManager())\r\n .save();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get package json file\r\n */\r\n public get package() {\r\n return this.json(\"package.json\");\r\n }\r\n\r\n public updateDotEnv() {\r\n this.file(\".env\").replaceAll(\"appName\", this.name).save();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get env file to update\r\n */\r\n public get env() {\r\n return this.file(\".env\");\r\n }\r\n\r\n public get name() {\r\n return this.app.appName;\r\n }\r\n\r\n public get path() {\r\n return this.app.appPath;\r\n }\r\n\r\n public file(relativePath: string) {\r\n const fullPath = path.resolve(this.path, relativePath);\r\n\r\n if (!this.files[fullPath]) {\r\n this.files[fullPath] = file(fullPath);\r\n }\r\n\r\n return this.files[fullPath];\r\n }\r\n\r\n public json(relativePath: string) {\r\n const fullPath = path.resolve(this.path, relativePath);\r\n\r\n if (!this.files[fullPath]) {\r\n this.files[fullPath] = jsonFile(fullPath);\r\n }\r\n\r\n return this.files[fullPath];\r\n }\r\n}\r\n\r\nexport function app(app: Application) {\r\n return new App(app);\r\n}\r\n\r\nexport class FileManager {\r\n public content!: string;\r\n public constructor(protected filePath) {\r\n this.parseContent();\r\n }\r\n\r\n protected parseContent() {\r\n this.content = getFile(this.filePath) as string;\r\n }\r\n\r\n public replace(search: string, replace: string) {\r\n this.content = this.content.replace(search, replace);\r\n\r\n return this;\r\n }\r\n\r\n public replaceAll(search: string, replace: string) {\r\n this.content = this.content.replaceAll(search, replace);\r\n\r\n return this;\r\n }\r\n\r\n public save() {\r\n putFile(this.filePath, this.content);\r\n }\r\n}\r\n\r\nexport class JsonFileManager extends FileManager {\r\n protected parseContent() {\r\n this.content = getJsonFile(this.filePath);\r\n }\r\n\r\n public save() {\r\n putJsonFile(this.filePath, this.content);\r\n }\r\n\r\n public has(key: string) {\r\n return this.content[key] !== undefined;\r\n }\r\n\r\n public replace(key: string, value: any) {\r\n this.content[key] = value;\r\n\r\n return this;\r\n }\r\n\r\n public replaceAll(key: string, value: any) {\r\n const contentAsString = JSON.stringify(this.content);\r\n\r\n this.content = JSON.parse(contentAsString.replaceAll(key, value));\r\n\r\n return this;\r\n }\r\n}\r\n\r\nexport function file(path: string) {\r\n return new FileManager(path);\r\n}\r\n\r\nexport function jsonFile(path: string) {\r\n return new JsonFileManager(path);\r\n}\r\n","import { confirm, spinner } from \"@clack/prompts\";\r\nimport path from \"path\";\r\nimport { rimraf } from \"rimraf\";\r\nimport { App } from \"src/helpers/app\";\r\nimport { runPackageManagerCommand } from \"../../helpers/package-manager\";\r\n\r\nexport async function createWarlockApp(application: App) {\r\n // Initialize the basic app structure\r\n application.init().use(\"warlock\").updatePackageJson().updateDotEnv();\r\n\r\n // Start the installation process in background immediately\r\n const installProcess = application.install();\r\n\r\n // Collect all answers first\r\n const installDeps =\r\n (await confirm({\r\n message: \"Do you want to install dependencies?\",\r\n })) === true;\r\n\r\n // If user doesn't want to install dependencies, abort the background process\r\n if (!installDeps) {\r\n installProcess.abort();\r\n\r\n // Remove node_modules Asynchronously\r\n const nodeModulesPath = path.join(application.path, \"node_modules\");\r\n\r\n rimraf(nodeModulesPath);\r\n }\r\n\r\n const useGit =\r\n (await confirm({\r\n message: \"Do you want to initialize Git repository?\",\r\n })) === true;\r\n\r\n // Only ask about JWT if dependencies will be installed\r\n let useJWT = false;\r\n if (installDeps) {\r\n useJWT =\r\n (await confirm({\r\n message: \"Do you want to generate JWT Secret key?\",\r\n })) === true;\r\n }\r\n\r\n // Now execute all confirmed tasks\r\n\r\n // Handle Git initialization first if requested\r\n if (useGit) {\r\n const loading = spinner();\r\n loading.start(\"📂 Initializing Git repository...\");\r\n await application.git();\r\n loading.stop(\"📂 Git repository initialized ✅\");\r\n }\r\n\r\n // Wait for dependencies installation if it was requested\r\n if (installDeps) {\r\n const loading = spinner();\r\n loading.start(\"📦 Installing dependencies...\");\r\n await installProcess.install;\r\n loading.stop(\"📦 Dependencies installed successfully!\");\r\n\r\n // Generate JWT if requested\r\n if (useJWT) {\r\n const jwtLoading = spinner();\r\n jwtLoading.start(\"🔑 Generating JWT Secret...\");\r\n await application.exec(runPackageManagerCommand(\"jwt\"));\r\n jwtLoading.stop(\"🔑 JWT Secret generated 🔒\");\r\n }\r\n }\r\n\r\n application.terminate();\r\n}\r\n","import { colors } from \"@mongez/copper\";\r\nimport { isDirectory } from \"@mongez/fs\";\r\nimport * as path from \"path\";\r\n\r\nexport default function getAppPath(appName: string) {\r\n const appPath: string = path.resolve(process.cwd(), appName);\r\n\r\n if (isDirectory(appPath)) {\r\n console.log(\r\n colors.redBright(\r\n `${process.cwd()} has an existing directory \\`${colors.cyan(\r\n appName,\r\n )}\\`, please choose another app name or another directory to run the command from.`,\r\n ),\r\n );\r\n\r\n process.exit(1);\r\n }\r\n\r\n return appPath;\r\n}\r\n","import { cancel, intro, isCancel, select, text } from \"@clack/prompts\";\r\nimport { colors } from \"@mongez/copper\";\r\nimport { App } from \"../../helpers/app\";\r\nimport {\r\n getPackageManager,\r\n setPackageManager,\r\n} from \"../../helpers/package-manager\";\r\nimport { createWarlockApp } from \"../create-warlock-app\";\r\nimport getAppPath from \"./get-app-path\";\r\nimport { App as AppType } from \"./types\";\r\n\r\nconst appDetails: Required<AppType> = {\r\n appName: \"\",\r\n appType: \"\",\r\n appPath: \"\",\r\n pkgManager: \"\",\r\n options: {},\r\n};\r\n\r\nexport default async function createNewApp(createWarlockVersion: string) {\r\n intro(\r\n `✨ Let's create a new ${colors.yellowBright(\"Warlock Js App\")} ✨ ${colors.greenBright(`v` + createWarlockVersion)}`,\r\n );\r\n\r\n const appName = await text({\r\n message: \"Enter the app name\",\r\n placeholder: \"warlock-app\",\r\n });\r\n\r\n if (isCancel(appName) || !appName.trim()) {\r\n cancel(\"Application name is required to create a new app\");\r\n process.exit(0);\r\n }\r\n\r\n // Validate the nodejs version to be not less than 20\r\n const [major] = process.versions.node.split(\".\").map(Number);\r\n\r\n if (major < 20) {\r\n cancel(\"Node.js version must be at least 20.0.0\");\r\n process.exit(0);\r\n }\r\n\r\n const packageManager = await select({\r\n message: \"Select package manager to use 📦 \",\r\n initialValue: getPackageManager(),\r\n options: [\r\n {\r\n label: \"Npm\",\r\n value: \"npm\",\r\n },\r\n {\r\n label: \"Yarn\",\r\n value: \"yarn\",\r\n },\r\n {\r\n label: \"Pnpm\",\r\n value: \"pnpm\",\r\n },\r\n ],\r\n });\r\n\r\n setPackageManager(packageManager);\r\n\r\n appDetails.appName = appName;\r\n appDetails.appPath = getAppPath(appName);\r\n appDetails.pkgManager = packageManager;\r\n\r\n if (!appDetails.appPath) return;\r\n\r\n appDetails.appType = \"warlock\";\r\n\r\n createWarlockApp(new App(appDetails));\r\n}\r\n","import { getJsonFile } from \"@mongez/fs\";\r\nimport createNewApp from \"./commands/create-new-app\";\r\nimport { packageRoot } from \"./helpers/paths\";\r\n\r\nexport default function createApp() {\r\n const packageJson: any = getJsonFile(packageRoot(\"package.json\"));\r\n const createWarlockVersion = packageJson.version;\r\n createNewApp(createWarlockVersion);\r\n}\r\n"]}
package/create-app.js CHANGED
File without changes
package/esm/index.js CHANGED
@@ -1,5 +1,10 @@
1
- import {getJsonFile}from'@mongez/fs';import createNewApp from'./commands/create-new-app/index.js';import {packageRoot}from'./helpers/paths.js';function createApp() {
2
- const packageJson = getJsonFile(packageRoot("package.json"));
3
- const createWarlockVersion = packageJson.version;
4
- createNewApp(createWarlockVersion);
5
- }export{createApp as default};//# sourceMappingURL=index.js.map
1
+ import {getJsonFile,isDirectory,copyDirectory,fileExists,copyFile,renameFile,getFile,putFile,putJsonFile}from'@mongez/fs';import {intro,text,isCancel,cancel,select,confirm,spinner,outro,log}from'@clack/prompts';import {colors}from'@mongez/copper';import*as x from'path';import x__default from'path';import T from'cross-spawn';import {fileURLToPath}from'url';import V from'which-pm-runs';import {rimraf}from'rimraf';var o=(e,t,r)=>new Promise((n,s)=>{var i=l=>{try{a(r.next(l));}catch(y){s(y);}},p=l=>{try{a(r.throw(l));}catch(y){s(y);}},a=l=>l.done?n(l.value):Promise.resolve(l.value).then(i,p);a((r=r.apply(e,t)).next());});function m(e,t,r){return o(this,null,function*(){return new Promise(n=>{let s=T(e,t,{cwd:r,stdio:"ignore"});s.on("error",i=>{i&&(i.message?log.error(colors.red(String(i.message))+`
2
+
3
+ `):log.error(colors.red(String(i))+`
4
+
5
+ `)),n(false);}),s.on("close",i=>{n(i===0);});})})}function J(e,t,r){let n,s=new Promise(p=>{try{n=T(e,t,{cwd:r,stdio:"ignore"}),n.on("error",a=>{a&&(a.message?log.error(colors.red(String(a.message))+`
6
+
7
+ `):log.error(colors.red(String(a))+`
8
+
9
+ `)),p(!1);}),n.on("close",a=>{p(a===0);});}catch(a){p(false);}});return {abort:()=>o(null,null,function*(){n&&n.kill("SIGINT");}),install:s}}var O={},B=fileURLToPath(O.url),j=x__default.dirname(B);function k(e){return x__default.resolve(j,"../","../","templates",e)}function M(...e){return x__default.resolve(j,"../","../",...e)}var w;function c(){return w||V().name||"npm"}function N(e){w=e;}function F(){return c()==="npm"?"npm run dev":`${c()} dev`}function D(e){let t=c();return t==="npm"?`npm run ${e}`:`${t} ${e}`}function $(e){return o(this,null,function*(){return yield m("git",["init"],e),yield m("git",["checkout","-b","main"],e),yield m("git",["add","."],e),yield m("git",["commit","-m","Initial commit \u26A1\uFE0F"],e),true})}function _(e){return o(this,null,function*(){outro("\u{1F31F} Awesome! Your project is ready to rock! Run the following command to start development:"),console.log(colors.cyan(`cd ${e} && ${F()}`)),console.log(),console.log(`\u{1F4A1} Pro tip: Install the ${colors.yellow("Generator Z")} extension in VSCode for helpful code snippets and productivity boosters! \u{1F680}`);})}var h=class{constructor(t){this.app=t;this.files={};this.isInstalled=false;}use(t){return copyDirectory(k(t),this.path),fileExists(this.path+"/.env.example")&&copyFile(this.path+"/.env.example",this.path+"/.env"),renameFile(this.path+"/_.gitignore",this.path+"/.gitignore"),this}init(){return this}terminate(){_(this.name);}install(){return J(c(),["install"],this.path)}exec(t){return o(this,null,function*(){let[r,...n]=t.split(" ");return yield m(r,n,this.path)})}git(){return o(this,null,function*(){return yield $(this.path)})}updatePackageJson(){return this.package.replace("name",this.name.replaceAll("/","-")).replaceAll("yarn",c()).save(),this}get package(){return this.json("package.json")}updateDotEnv(){return this.file(".env").replaceAll("appName",this.name).save(),this}get env(){return this.file(".env")}get name(){return this.app.appName}get path(){return this.app.appPath}file(t){let r=x__default.resolve(this.path,t);return this.files[r]||(this.files[r]=te(r)),this.files[r]}json(t){let r=x__default.resolve(this.path,t);return this.files[r]||(this.files[r]=re(r)),this.files[r]}};var d=class{constructor(t){this.filePath=t;this.parseContent();}parseContent(){this.content=getFile(this.filePath);}replace(t,r){return this.content=this.content.replace(t,r),this}replaceAll(t,r){return this.content=this.content.replaceAll(t,r),this}save(){putFile(this.filePath,this.content);}},v=class extends d{parseContent(){this.content=getJsonFile(this.filePath);}save(){putJsonFile(this.filePath,this.content);}has(t){return this.content[t]!==void 0}replace(t,r){return this.content[t]=r,this}replaceAll(t,r){let n=JSON.stringify(this.content);return this.content=JSON.parse(n.replaceAll(t,r)),this}};function te(e){return new d(e)}function re(e){return new v(e)}function R(e){return o(this,null,function*(){e.init().use("warlock").updatePackageJson().updateDotEnv();let t=e.install(),r=(yield confirm({message:"Do you want to install dependencies?"}))===true;if(!r){t.abort();let i=x__default.join(e.path,"node_modules");rimraf(i);}let n=(yield confirm({message:"Do you want to initialize Git repository?"}))===true,s=false;if(r&&(s=(yield confirm({message:"Do you want to generate JWT Secret key?"}))===true),n){let i=spinner();i.start("\u{1F4C2} Initializing Git repository..."),yield e.git(),i.stop("\u{1F4C2} Git repository initialized \u2705");}if(r){let i=spinner();if(i.start("\u{1F4E6} Installing dependencies..."),yield t.install,i.stop("\u{1F4E6} Dependencies installed successfully!"),s){let p=spinner();p.start("\u{1F511} Generating JWT Secret..."),yield e.exec(D("jwt")),p.stop("\u{1F511} JWT Secret generated \u{1F512}");}}e.terminate();})}function P(e){let t=x.resolve(process.cwd(),e);return isDirectory(t)&&(console.log(colors.redBright(`${process.cwd()} has an existing directory \`${colors.cyan(e)}\`, please choose another app name or another directory to run the command from.`)),process.exit(1)),t}var u={appName:"",appType:"",appPath:"",pkgManager:"",options:{}};function C(e){return o(this,null,function*(){intro(`\u2728 Let's create a new ${colors.yellowBright("Warlock Js App")} \u2728 ${colors.greenBright("v"+e)}`);let t=yield text({message:"Enter the app name",placeholder:"warlock-app"});(isCancel(t)||!t.trim())&&(cancel("Application name is required to create a new app"),process.exit(0));let[r]=process.versions.node.split(".").map(Number);r<20&&(cancel("Node.js version must be at least 20.0.0"),process.exit(0));let n=yield select({message:"Select package manager to use \u{1F4E6} ",initialValue:c(),options:[{label:"Npm",value:"npm"},{label:"Yarn",value:"yarn"},{label:"Pnpm",value:"pnpm"}]});N(n),u.appName=t,u.appPath=P(t),u.pkgManager=n,u.appPath&&(u.appType="warlock",R(new h(u)));})}function me(){let t=getJsonFile(M("package.json")).version;C(t);}export{me as default};//# sourceMappingURL=index.js.map
10
+ //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":"+IAIc,SAAU,SAAS,GAAA;IAC/B,MAAM,WAAW,GAAQ,WAAW,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;AAClE,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,OAAO,CAAC;IACjD,YAAY,CAAC,oBAAoB,CAAC,CAAC;AACrC"}
1
+ {"version":3,"sources":["../../../../../../warlock.js/create-warlock/src/helpers/exec.ts","../../../../../../warlock.js/create-warlock/src/helpers/paths.ts","../../../../../../warlock.js/create-warlock/src/helpers/package-manager.ts","../../../../../../warlock.js/create-warlock/src/helpers/project-builder-helpers.ts","../../../../../../warlock.js/create-warlock/src/helpers/app.ts","../../../../../../warlock.js/create-warlock/src/commands/create-warlock-app/index.ts","../../../../../../warlock.js/create-warlock/src/commands/create-new-app/get-app-path.ts","../../../../../../warlock.js/create-warlock/src/commands/create-new-app/index.ts","../../../../../../warlock.js/create-warlock/src/index.ts"],"names":["executeCommand","cmd","args","cwd","__async","resolve","child","spawn","e","log","colors","code","runCommand","install","import_meta","__filename","fileURLToPath","__dirname","path","template","templateName","packageRoot","paths","detectedPackageManager","getPackageManager","detectPackageManager","setPackageManager","packageManager","startCommand","runPackageManagerCommand","command","initializeGitRepository","appPath","allDone","appName","outro","App","app","copyDirectory","fileExists","copyFile","renameFile","commandName","optionsList","relativePath","fullPath","file","jsonFile","FileManager","filePath","getFile","search","replace","putFile","JsonFileManager","getJsonFile","putJsonFile","key","value","contentAsString","createWarlockApp","application","installProcess","installDeps","confirm","nodeModulesPath","rimraf","useGit","useJWT","loading","spinner","jwtLoading","getAppPath","E","isDirectory","appDetails","createNewApp","createWarlockVersion","intro","text","isCancel","cancel","major","select","createApp"],"mappings":"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","file":"index.js","sourcesContent":["import { log } from \"@clack/prompts\";\r\nimport { colors } from \"@mongez/copper\";\r\nimport { ChildProcess } from \"child_process\";\r\nimport { default as childProcess, default as spawn } from \"cross-spawn\";\r\n\r\nexport default async function exec(command: string, options: any = {}) {\r\n const [commandName, ...optionsList] = command.split(\" \");\r\n\r\n const commandOutput = childProcess.sync(commandName, optionsList, options);\r\n\r\n // it means command didn't end as expected, then stop the rest of the program\r\n if (commandOutput.error !== null) {\r\n process.exit(1);\r\n }\r\n\r\n return commandOutput;\r\n}\r\n\r\n/**\r\n * This function directly executes a command\r\n */\r\nexport async function executeCommand(cmd: string, args: string[], cwd: string) {\r\n return new Promise<boolean>(resolve => {\r\n const child = spawn(cmd, args, {\r\n cwd,\r\n stdio: \"ignore\",\r\n });\r\n\r\n child.on(\"error\", e => {\r\n if (e) {\r\n if (e.message) {\r\n log.error(colors.red(String(e.message)) + `\\n\\n`);\r\n } else {\r\n log.error(colors.red(String(e)) + `\\n\\n`);\r\n }\r\n }\r\n resolve(false);\r\n });\r\n\r\n child.on(\"close\", code => {\r\n if (code === 0) {\r\n resolve(true);\r\n } else {\r\n resolve(false);\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport function runCommand(cmd: string, args: string[], cwd: string) {\r\n let child: ChildProcess;\r\n\r\n const install = new Promise<boolean>(resolve => {\r\n try {\r\n child = spawn(cmd, args, {\r\n cwd,\r\n stdio: \"ignore\",\r\n });\r\n\r\n child.on(\"error\", e => {\r\n if (e) {\r\n if (e.message) {\r\n log.error(colors.red(String(e.message)) + `\\n\\n`);\r\n } else {\r\n log.error(colors.red(String(e)) + `\\n\\n`);\r\n }\r\n }\r\n resolve(false);\r\n });\r\n\r\n child.on(\"close\", code => {\r\n if (code === 0) {\r\n resolve(true);\r\n } else {\r\n resolve(false);\r\n }\r\n });\r\n } catch (e) {\r\n resolve(false);\r\n }\r\n });\r\n\r\n const abort = async () => {\r\n if (child) {\r\n child.kill(\"SIGINT\");\r\n }\r\n };\r\n\r\n return { abort, install };\r\n}\r\n","import path from \"path\";\r\nimport { fileURLToPath } from \"url\";\r\n\r\nconst __filename = fileURLToPath(import.meta.url);\r\n\r\nconst __dirname = path.dirname(__filename);\r\n\r\nexport type Template = \"warlock\";\r\n\r\nexport function template(templateName: Template): string {\r\n return path.resolve(__dirname, \"../\", \"../\", \"templates\", templateName);\r\n}\r\n\r\nexport function packageRoot(...paths: string[]): string {\r\n return path.resolve(__dirname, \"../\", \"../\", ...paths);\r\n}\r\n","import detectPackageManager from \"which-pm-runs\";\r\n\r\nlet detectedPackageManager: string | undefined;\r\n\r\nexport function getPackageManager() {\r\n if (detectedPackageManager) {\r\n return detectedPackageManager;\r\n }\r\n\r\n const packageManager = detectPackageManager();\r\n\r\n return packageManager.name || \"npm\";\r\n}\r\n\r\nexport function setPackageManager(packageManager: string) {\r\n detectedPackageManager = packageManager;\r\n}\r\n\r\nexport function installCommand() {\r\n return `${getPackageManager()} install`;\r\n}\r\n\r\nexport function startCommand() {\r\n if (getPackageManager() === \"npm\") return \"npm run dev\";\r\n\r\n return `${getPackageManager()} dev`;\r\n}\r\n\r\nexport function runPackageManagerCommand(command: string) {\r\n const packageManager = getPackageManager();\r\n\r\n if (packageManager === \"npm\") return `npm run ${command}`;\r\n\r\n return `${packageManager} ${command}`;\r\n}\r\n","import { outro } from \"@clack/prompts\";\r\nimport { colors } from \"@mongez/copper\";\r\nimport {\r\n copyDirectory,\r\n getFile,\r\n getJsonFile,\r\n putFile,\r\n putJsonFile,\r\n renameFile,\r\n} from \"@mongez/fs\";\r\nimport path from \"path\";\r\nimport { executeCommand } from \"./exec\";\r\nimport { startCommand } from \"./package-manager\";\r\nimport { Template, template } from \"./paths\";\r\n\r\nexport async function initializeGitRepository(appPath: string) {\r\n // initialize git repository\r\n await executeCommand(`git`, [\"init\"], appPath);\r\n // switching to `main` branch\r\n await executeCommand(`git`, [\"checkout\", \"-b\", \"main\"], appPath);\r\n\r\n // add files\r\n await executeCommand(`git`, [\"add\", \".\"], appPath);\r\n\r\n // commit files\r\n await executeCommand(`git`, [\"commit\", \"-m\", \"Initial commit ⚡️\"], appPath);\r\n\r\n return true;\r\n}\r\n\r\nexport async function updateEnvFile(appPath: string, appName: string) {\r\n // update package.json file\r\n const packageJson: any = getJsonFile(path.resolve(appPath, \"package.json\"));\r\n\r\n packageJson.name = appName;\r\n\r\n putJsonFile(path.resolve(appPath, \"package.json\"), packageJson);\r\n\r\n // update env file\r\n const dotEnv = getFile(path.resolve(appPath, \".env\"))\r\n .replace(\"AppName\", appName)\r\n .replace(\r\n \"AppCodeName\",\r\n appName\r\n .split(/-|_/g)\r\n .map(word => word[0])\r\n .join(\"\"),\r\n );\r\n\r\n putFile(path.resolve(appPath, \".env\"), dotEnv);\r\n\r\n // update .env.production file\r\n let dotEnvProduction = getFile(path.resolve(appPath, \".env.shared\"));\r\n\r\n dotEnvProduction = dotEnvProduction.replace(\"AppName\", appName).replace(\r\n \"AppCodeName\",\r\n appName\r\n .split(/-|_/g)\r\n .map(word => word[0])\r\n .join(\"\"),\r\n );\r\n\r\n putFile(path.resolve(appPath, \".env.shared\"), dotEnvProduction);\r\n}\r\n\r\nexport async function copyTemplateFiles(\r\n templateName: Template,\r\n appPath: string,\r\n _appName: string,\r\n) {\r\n // copy project files\r\n copyDirectory(template(templateName), appPath);\r\n\r\n // replace _.gitignore to\r\n renameFile(\r\n path.resolve(appPath, \"_.gitignore\"),\r\n path.resolve(appPath, \".gitignore\"),\r\n );\r\n}\r\n\r\nexport async function allDone(appName: string) {\r\n outro(\r\n \"🌟 Awesome! Your project is ready to rock! \" +\r\n \"Run the following command to start development:\",\r\n );\r\n\r\n console.log(colors.cyan(`cd ${appName} && ${startCommand()}`));\r\n\r\n console.log();\r\n\r\n console.log(\r\n `💡 Pro tip: Install the ${colors.yellow(\r\n \"Generator Z\",\r\n )} extension in VSCode for helpful code snippets and productivity boosters! 🚀`,\r\n );\r\n}\r\n","import {\r\n copyDirectory,\r\n copyFile,\r\n fileExists,\r\n getFile,\r\n getJsonFile,\r\n putFile,\r\n putJsonFile,\r\n renameFile,\r\n} from \"@mongez/fs\";\r\nimport path from \"path\";\r\nimport { Application } from \"src/commands/create-new-app/types\";\r\nimport { executeCommand, runCommand } from \"src/helpers/exec\";\r\nimport { Template, template } from \"src/helpers/paths\";\r\nimport {\r\n allDone,\r\n initializeGitRepository,\r\n} from \"src/helpers/project-builder-helpers\";\r\nimport { getPackageManager } from \"./package-manager\";\r\n\r\nexport class App {\r\n /**\r\n * Resolved files\r\n */\r\n protected files: Record<string, FileManager> = {};\r\n\r\n public isInstalled = false;\r\n\r\n public constructor(protected app: Application) {}\r\n\r\n public use(templateName: Template) {\r\n copyDirectory(template(templateName), this.path);\r\n\r\n if (fileExists(this.path + \"/.env.example\")) {\r\n copyFile(this.path + \"/.env.example\", this.path + \"/.env\");\r\n }\r\n\r\n renameFile(this.path + \"/_.gitignore\", this.path + \"/.gitignore\");\r\n\r\n return this;\r\n }\r\n\r\n public init() {\r\n return this;\r\n }\r\n\r\n public terminate() {\r\n allDone(this.name);\r\n }\r\n\r\n public install() {\r\n return runCommand(getPackageManager(), [\"install\"], this.path);\r\n }\r\n\r\n public async exec(command: string) {\r\n const [commandName, ...optionsList] = command.split(\" \");\r\n return await executeCommand(commandName, optionsList, this.path);\r\n }\r\n\r\n public async git() {\r\n return await initializeGitRepository(this.path);\r\n }\r\n\r\n public updatePackageJson() {\r\n this.package\r\n .replace(\"name\", this.name.replaceAll(\"/\", \"-\"))\r\n .replaceAll(\"yarn\", getPackageManager())\r\n .save();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get package json file\r\n */\r\n public get package() {\r\n return this.json(\"package.json\");\r\n }\r\n\r\n public updateDotEnv() {\r\n this.file(\".env\").replaceAll(\"appName\", this.name).save();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get env file to update\r\n */\r\n public get env() {\r\n return this.file(\".env\");\r\n }\r\n\r\n public get name() {\r\n return this.app.appName;\r\n }\r\n\r\n public get path() {\r\n return this.app.appPath;\r\n }\r\n\r\n public file(relativePath: string) {\r\n const fullPath = path.resolve(this.path, relativePath);\r\n\r\n if (!this.files[fullPath]) {\r\n this.files[fullPath] = file(fullPath);\r\n }\r\n\r\n return this.files[fullPath];\r\n }\r\n\r\n public json(relativePath: string) {\r\n const fullPath = path.resolve(this.path, relativePath);\r\n\r\n if (!this.files[fullPath]) {\r\n this.files[fullPath] = jsonFile(fullPath);\r\n }\r\n\r\n return this.files[fullPath];\r\n }\r\n}\r\n\r\nexport function app(app: Application) {\r\n return new App(app);\r\n}\r\n\r\nexport class FileManager {\r\n public content!: string;\r\n public constructor(protected filePath) {\r\n this.parseContent();\r\n }\r\n\r\n protected parseContent() {\r\n this.content = getFile(this.filePath) as string;\r\n }\r\n\r\n public replace(search: string, replace: string) {\r\n this.content = this.content.replace(search, replace);\r\n\r\n return this;\r\n }\r\n\r\n public replaceAll(search: string, replace: string) {\r\n this.content = this.content.replaceAll(search, replace);\r\n\r\n return this;\r\n }\r\n\r\n public save() {\r\n putFile(this.filePath, this.content);\r\n }\r\n}\r\n\r\nexport class JsonFileManager extends FileManager {\r\n protected parseContent() {\r\n this.content = getJsonFile(this.filePath);\r\n }\r\n\r\n public save() {\r\n putJsonFile(this.filePath, this.content);\r\n }\r\n\r\n public has(key: string) {\r\n return this.content[key] !== undefined;\r\n }\r\n\r\n public replace(key: string, value: any) {\r\n this.content[key] = value;\r\n\r\n return this;\r\n }\r\n\r\n public replaceAll(key: string, value: any) {\r\n const contentAsString = JSON.stringify(this.content);\r\n\r\n this.content = JSON.parse(contentAsString.replaceAll(key, value));\r\n\r\n return this;\r\n }\r\n}\r\n\r\nexport function file(path: string) {\r\n return new FileManager(path);\r\n}\r\n\r\nexport function jsonFile(path: string) {\r\n return new JsonFileManager(path);\r\n}\r\n","import { confirm, spinner } from \"@clack/prompts\";\r\nimport path from \"path\";\r\nimport { rimraf } from \"rimraf\";\r\nimport { App } from \"src/helpers/app\";\r\nimport { runPackageManagerCommand } from \"../../helpers/package-manager\";\r\n\r\nexport async function createWarlockApp(application: App) {\r\n // Initialize the basic app structure\r\n application.init().use(\"warlock\").updatePackageJson().updateDotEnv();\r\n\r\n // Start the installation process in background immediately\r\n const installProcess = application.install();\r\n\r\n // Collect all answers first\r\n const installDeps =\r\n (await confirm({\r\n message: \"Do you want to install dependencies?\",\r\n })) === true;\r\n\r\n // If user doesn't want to install dependencies, abort the background process\r\n if (!installDeps) {\r\n installProcess.abort();\r\n\r\n // Remove node_modules Asynchronously\r\n const nodeModulesPath = path.join(application.path, \"node_modules\");\r\n\r\n rimraf(nodeModulesPath);\r\n }\r\n\r\n const useGit =\r\n (await confirm({\r\n message: \"Do you want to initialize Git repository?\",\r\n })) === true;\r\n\r\n // Only ask about JWT if dependencies will be installed\r\n let useJWT = false;\r\n if (installDeps) {\r\n useJWT =\r\n (await confirm({\r\n message: \"Do you want to generate JWT Secret key?\",\r\n })) === true;\r\n }\r\n\r\n // Now execute all confirmed tasks\r\n\r\n // Handle Git initialization first if requested\r\n if (useGit) {\r\n const loading = spinner();\r\n loading.start(\"📂 Initializing Git repository...\");\r\n await application.git();\r\n loading.stop(\"📂 Git repository initialized ✅\");\r\n }\r\n\r\n // Wait for dependencies installation if it was requested\r\n if (installDeps) {\r\n const loading = spinner();\r\n loading.start(\"📦 Installing dependencies...\");\r\n await installProcess.install;\r\n loading.stop(\"📦 Dependencies installed successfully!\");\r\n\r\n // Generate JWT if requested\r\n if (useJWT) {\r\n const jwtLoading = spinner();\r\n jwtLoading.start(\"🔑 Generating JWT Secret...\");\r\n await application.exec(runPackageManagerCommand(\"jwt\"));\r\n jwtLoading.stop(\"🔑 JWT Secret generated 🔒\");\r\n }\r\n }\r\n\r\n application.terminate();\r\n}\r\n","import { colors } from \"@mongez/copper\";\r\nimport { isDirectory } from \"@mongez/fs\";\r\nimport * as path from \"path\";\r\n\r\nexport default function getAppPath(appName: string) {\r\n const appPath: string = path.resolve(process.cwd(), appName);\r\n\r\n if (isDirectory(appPath)) {\r\n console.log(\r\n colors.redBright(\r\n `${process.cwd()} has an existing directory \\`${colors.cyan(\r\n appName,\r\n )}\\`, please choose another app name or another directory to run the command from.`,\r\n ),\r\n );\r\n\r\n process.exit(1);\r\n }\r\n\r\n return appPath;\r\n}\r\n","import { cancel, intro, isCancel, select, text } from \"@clack/prompts\";\r\nimport { colors } from \"@mongez/copper\";\r\nimport { App } from \"../../helpers/app\";\r\nimport {\r\n getPackageManager,\r\n setPackageManager,\r\n} from \"../../helpers/package-manager\";\r\nimport { createWarlockApp } from \"../create-warlock-app\";\r\nimport getAppPath from \"./get-app-path\";\r\nimport { App as AppType } from \"./types\";\r\n\r\nconst appDetails: Required<AppType> = {\r\n appName: \"\",\r\n appType: \"\",\r\n appPath: \"\",\r\n pkgManager: \"\",\r\n options: {},\r\n};\r\n\r\nexport default async function createNewApp(createWarlockVersion: string) {\r\n intro(\r\n `✨ Let's create a new ${colors.yellowBright(\"Warlock Js App\")} ✨ ${colors.greenBright(`v` + createWarlockVersion)}`,\r\n );\r\n\r\n const appName = await text({\r\n message: \"Enter the app name\",\r\n placeholder: \"warlock-app\",\r\n });\r\n\r\n if (isCancel(appName) || !appName.trim()) {\r\n cancel(\"Application name is required to create a new app\");\r\n process.exit(0);\r\n }\r\n\r\n // Validate the nodejs version to be not less than 20\r\n const [major] = process.versions.node.split(\".\").map(Number);\r\n\r\n if (major < 20) {\r\n cancel(\"Node.js version must be at least 20.0.0\");\r\n process.exit(0);\r\n }\r\n\r\n const packageManager = await select({\r\n message: \"Select package manager to use 📦 \",\r\n initialValue: getPackageManager(),\r\n options: [\r\n {\r\n label: \"Npm\",\r\n value: \"npm\",\r\n },\r\n {\r\n label: \"Yarn\",\r\n value: \"yarn\",\r\n },\r\n {\r\n label: \"Pnpm\",\r\n value: \"pnpm\",\r\n },\r\n ],\r\n });\r\n\r\n setPackageManager(packageManager);\r\n\r\n appDetails.appName = appName;\r\n appDetails.appPath = getAppPath(appName);\r\n appDetails.pkgManager = packageManager;\r\n\r\n if (!appDetails.appPath) return;\r\n\r\n appDetails.appType = \"warlock\";\r\n\r\n createWarlockApp(new App(appDetails));\r\n}\r\n","import { getJsonFile } from \"@mongez/fs\";\r\nimport createNewApp from \"./commands/create-new-app\";\r\nimport { packageRoot } from \"./helpers/paths\";\r\n\r\nexport default function createApp() {\r\n const packageJson: any = getJsonFile(packageRoot(\"package.json\"));\r\n const createWarlockVersion = packageJson.version;\r\n createNewApp(createWarlockVersion);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,40 +1,34 @@
1
1
  {
2
- "name": "create-warlock",
3
- "version": "4.0.30",
4
- "main": "./esm/index.js",
5
- "license": "MIT",
6
- "type": "module",
7
- "bin": {
8
- "create-warlock": "./create-app.js"
9
- },
10
- "scripts": {
11
- "start": "npx tsx ./index.dev.ts",
12
- "lint": "npx eslint -c ./.eslintrc.json ./src",
13
- "fix": "npx eslint --fix -c ./.eslintrc.json ./src --max-warnings=0",
14
- "format": "npx prettier --write ./src/**/*.{js,jsx,ts,tsx,css,md,json} --config ./.prettierrc.json",
15
- "update": "npx tsx version-checker.ts"
16
- },
17
- "dependencies": {
18
- "@clack/prompts": "^0.7.0",
19
- "@mongez/copper": "^1.0.1",
20
- "@mongez/fs": "^3.0.5",
21
- "@mongez/reinforcements": "^2.3.10",
22
- "cross-spawn": "^7.0.3",
23
- "rimraf": "^6.0.1",
24
- "which-pm-runs": "^1.1.0"
25
- },
26
- "devDependencies": {
27
- "@types/node": "^20.12.7",
28
- "@typescript-eslint/eslint-plugin": "^7.7.0",
29
- "@typescript-eslint/parser": "^7.7.0",
30
- "eslint": "^8.56.0",
31
- "eslint-config-prettier": "^9.1.0",
32
- "eslint-plugin-prettier": "^5.1.3",
33
- "eslint-plugin-unused-imports": "^3.1.0",
34
- "prettier": "^3.2.5",
35
- "prettier-plugin-organize-imports": "^3.2.4",
36
- "typescript": "^5.4.5"
37
- },
38
- "module": "./esm/index.js",
39
- "typings": "./esm/index.d.ts"
2
+ "name": "create-warlock",
3
+ "version": "4.0.39",
4
+ "license": "MIT",
5
+ "main": "./cjs/index.js",
6
+ "module": "./esm/index.js",
7
+ "types": "./esm/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": {
11
+ "types": "./esm/index.d.ts",
12
+ "default": "./esm/index.js"
13
+ },
14
+ "require": {
15
+ "types": "./cjs/index.d.ts",
16
+ "default": "./cjs/index.js"
17
+ }
18
+ }
19
+ },
20
+ "type": "module",
21
+ "sideEffects": false,
22
+ "dependencies": {
23
+ "@clack/prompts": "^0.7.0",
24
+ "@mongez/copper": "^1.0.1",
25
+ "@mongez/fs": "^3.0.5",
26
+ "@mongez/reinforcements": "^2.3.10",
27
+ "cross-spawn": "^7.0.3",
28
+ "rimraf": "^6.0.1",
29
+ "which-pm-runs": "^1.1.0"
30
+ },
31
+ "bin": {
32
+ "create-warlock": "./create-app.js"
33
+ }
40
34
  }