create-warlock 1.0.0

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 (169) hide show
  1. package/README.md +29 -0
  2. package/cjs/commands/create-new-app/get-app-path.d.ts +2 -0
  3. package/cjs/commands/create-new-app/get-app-path.d.ts.map +1 -0
  4. package/cjs/commands/create-new-app/get-app-path.js +8 -0
  5. package/cjs/commands/create-new-app/get-app-path.js.map +1 -0
  6. package/cjs/commands/create-new-app/index.d.ts +2 -0
  7. package/cjs/commands/create-new-app/index.d.ts.map +1 -0
  8. package/cjs/commands/create-new-app/index.js +42 -0
  9. package/cjs/commands/create-new-app/index.js.map +1 -0
  10. package/cjs/commands/create-new-app/select-app-type.d.ts +2 -0
  11. package/cjs/commands/create-new-app/select-app-type.d.ts.map +1 -0
  12. package/cjs/commands/create-new-app/types.d.ts +8 -0
  13. package/cjs/commands/create-new-app/types.d.ts.map +1 -0
  14. package/cjs/commands/create-warlock-app/index.d.ts +3 -0
  15. package/cjs/commands/create-warlock-app/index.d.ts.map +1 -0
  16. package/cjs/commands/create-warlock-app/index.js +18 -0
  17. package/cjs/commands/create-warlock-app/index.js.map +1 -0
  18. package/cjs/commands/vite-react/headless-ui/index.d.ts +3 -0
  19. package/cjs/commands/vite-react/headless-ui/index.d.ts.map +1 -0
  20. package/cjs/commands/vite-react/headless-ui/types.d.ts +4 -0
  21. package/cjs/commands/vite-react/headless-ui/types.d.ts.map +1 -0
  22. package/cjs/commands/vite-react/index.d.ts +3 -0
  23. package/cjs/commands/vite-react/index.d.ts.map +1 -0
  24. package/cjs/commands/vite-react/mantine/index.d.ts +3 -0
  25. package/cjs/commands/vite-react/mantine/index.d.ts.map +1 -0
  26. package/cjs/commands/vite-react/mantine/types.d.ts +4 -0
  27. package/cjs/commands/vite-react/mantine/types.d.ts.map +1 -0
  28. package/cjs/commands/vite-react/select-react-app.d.ts +4 -0
  29. package/cjs/commands/vite-react/select-react-app.d.ts.map +1 -0
  30. package/cjs/commands/vite-react/selectAppConfigurations.d.ts +3 -0
  31. package/cjs/commands/vite-react/selectAppConfigurations.d.ts.map +1 -0
  32. package/cjs/commands/vite-react/tailwind-css/index.d.ts +3 -0
  33. package/cjs/commands/vite-react/tailwind-css/index.d.ts.map +1 -0
  34. package/cjs/commands/vite-react/tailwind-css/types.d.ts +4 -0
  35. package/cjs/commands/vite-react/tailwind-css/types.d.ts.map +1 -0
  36. package/cjs/commands/vite-react/types.d.ts +4 -0
  37. package/cjs/commands/vite-react/types.d.ts.map +1 -0
  38. package/cjs/helpers/app.d.ts +51 -0
  39. package/cjs/helpers/app.d.ts.map +1 -0
  40. package/cjs/helpers/app.js +127 -0
  41. package/cjs/helpers/app.js.map +1 -0
  42. package/cjs/helpers/exec.d.ts +10 -0
  43. package/cjs/helpers/exec.d.ts.map +1 -0
  44. package/cjs/helpers/exec.js +69 -0
  45. package/cjs/helpers/exec.js.map +1 -0
  46. package/cjs/helpers/package-manager.d.ts +5 -0
  47. package/cjs/helpers/package-manager.d.ts.map +1 -0
  48. package/cjs/helpers/package-manager.js +16 -0
  49. package/cjs/helpers/package-manager.js.map +1 -0
  50. package/cjs/helpers/paths.d.ts +4 -0
  51. package/cjs/helpers/paths.d.ts.map +1 -0
  52. package/cjs/helpers/paths.js +5 -0
  53. package/cjs/helpers/paths.js.map +1 -0
  54. package/cjs/helpers/project-builder-helpers.d.ts +7 -0
  55. package/cjs/helpers/project-builder-helpers.d.ts.map +1 -0
  56. package/cjs/helpers/project-builder-helpers.js +44 -0
  57. package/cjs/helpers/project-builder-helpers.js.map +1 -0
  58. package/cjs/index.d.ts +2 -0
  59. package/cjs/index.d.ts.map +1 -0
  60. package/cjs/index.js +7 -0
  61. package/cjs/index.js.map +1 -0
  62. package/create-app.js +5 -0
  63. package/esm/commands/create-new-app/get-app-path.d.ts +2 -0
  64. package/esm/commands/create-new-app/get-app-path.d.ts.map +1 -0
  65. package/esm/commands/create-new-app/get-app-path.js +8 -0
  66. package/esm/commands/create-new-app/get-app-path.js.map +1 -0
  67. package/esm/commands/create-new-app/index.d.ts +2 -0
  68. package/esm/commands/create-new-app/index.d.ts.map +1 -0
  69. package/esm/commands/create-new-app/index.js +42 -0
  70. package/esm/commands/create-new-app/index.js.map +1 -0
  71. package/esm/commands/create-new-app/select-app-type.d.ts +2 -0
  72. package/esm/commands/create-new-app/select-app-type.d.ts.map +1 -0
  73. package/esm/commands/create-new-app/types.d.ts +8 -0
  74. package/esm/commands/create-new-app/types.d.ts.map +1 -0
  75. package/esm/commands/create-warlock-app/index.d.ts +3 -0
  76. package/esm/commands/create-warlock-app/index.d.ts.map +1 -0
  77. package/esm/commands/create-warlock-app/index.js +18 -0
  78. package/esm/commands/create-warlock-app/index.js.map +1 -0
  79. package/esm/commands/vite-react/headless-ui/index.d.ts +3 -0
  80. package/esm/commands/vite-react/headless-ui/index.d.ts.map +1 -0
  81. package/esm/commands/vite-react/headless-ui/types.d.ts +4 -0
  82. package/esm/commands/vite-react/headless-ui/types.d.ts.map +1 -0
  83. package/esm/commands/vite-react/index.d.ts +3 -0
  84. package/esm/commands/vite-react/index.d.ts.map +1 -0
  85. package/esm/commands/vite-react/mantine/index.d.ts +3 -0
  86. package/esm/commands/vite-react/mantine/index.d.ts.map +1 -0
  87. package/esm/commands/vite-react/mantine/types.d.ts +4 -0
  88. package/esm/commands/vite-react/mantine/types.d.ts.map +1 -0
  89. package/esm/commands/vite-react/select-react-app.d.ts +4 -0
  90. package/esm/commands/vite-react/select-react-app.d.ts.map +1 -0
  91. package/esm/commands/vite-react/selectAppConfigurations.d.ts +3 -0
  92. package/esm/commands/vite-react/selectAppConfigurations.d.ts.map +1 -0
  93. package/esm/commands/vite-react/tailwind-css/index.d.ts +3 -0
  94. package/esm/commands/vite-react/tailwind-css/index.d.ts.map +1 -0
  95. package/esm/commands/vite-react/tailwind-css/types.d.ts +4 -0
  96. package/esm/commands/vite-react/tailwind-css/types.d.ts.map +1 -0
  97. package/esm/commands/vite-react/types.d.ts +4 -0
  98. package/esm/commands/vite-react/types.d.ts.map +1 -0
  99. package/esm/helpers/app.d.ts +51 -0
  100. package/esm/helpers/app.d.ts.map +1 -0
  101. package/esm/helpers/app.js +127 -0
  102. package/esm/helpers/app.js.map +1 -0
  103. package/esm/helpers/exec.d.ts +10 -0
  104. package/esm/helpers/exec.d.ts.map +1 -0
  105. package/esm/helpers/exec.js +69 -0
  106. package/esm/helpers/exec.js.map +1 -0
  107. package/esm/helpers/package-manager.d.ts +5 -0
  108. package/esm/helpers/package-manager.d.ts.map +1 -0
  109. package/esm/helpers/package-manager.js +16 -0
  110. package/esm/helpers/package-manager.js.map +1 -0
  111. package/esm/helpers/paths.d.ts +4 -0
  112. package/esm/helpers/paths.d.ts.map +1 -0
  113. package/esm/helpers/paths.js +5 -0
  114. package/esm/helpers/paths.js.map +1 -0
  115. package/esm/helpers/project-builder-helpers.d.ts +7 -0
  116. package/esm/helpers/project-builder-helpers.d.ts.map +1 -0
  117. package/esm/helpers/project-builder-helpers.js +44 -0
  118. package/esm/helpers/project-builder-helpers.js.map +1 -0
  119. package/esm/index.d.ts +2 -0
  120. package/esm/index.d.ts.map +1 -0
  121. package/esm/index.js +7 -0
  122. package/esm/index.js.map +1 -0
  123. package/package.json +44 -0
  124. package/templates/warlock/.env.example +35 -0
  125. package/templates/warlock/.eslintrc.json +44 -0
  126. package/templates/warlock/.gitattributes +1 -0
  127. package/templates/warlock/.prettierrc.json +11 -0
  128. package/templates/warlock/README.md +57 -0
  129. package/templates/warlock/_.gitignore +7 -0
  130. package/templates/warlock/package.json +60 -0
  131. package/templates/warlock/src/app/main.ts +12 -0
  132. package/templates/warlock/src/app/uploads/routes.ts +27 -0
  133. package/templates/warlock/src/app/users/controllers/auth/activate-account.ts +48 -0
  134. package/templates/warlock/src/app/users/controllers/auth/admin-login.ts +40 -0
  135. package/templates/warlock/src/app/users/controllers/auth/create-account.ts +23 -0
  136. package/templates/warlock/src/app/users/controllers/auth/forget-password.ts +39 -0
  137. package/templates/warlock/src/app/users/controllers/auth/login.ts +49 -0
  138. package/templates/warlock/src/app/users/controllers/auth/logout.ts +10 -0
  139. package/templates/warlock/src/app/users/controllers/auth/resend-activation-code.ts +45 -0
  140. package/templates/warlock/src/app/users/controllers/auth/reset-password.ts +43 -0
  141. package/templates/warlock/src/app/users/controllers/auth/verify-forget-password-code.ts +18 -0
  142. package/templates/warlock/src/app/users/controllers/profile/change-password.ts +31 -0
  143. package/templates/warlock/src/app/users/controllers/profile/my-profile.ts +10 -0
  144. package/templates/warlock/src/app/users/controllers/profile/update-profile.ts +25 -0
  145. package/templates/warlock/src/app/users/controllers/restful-users.ts +27 -0
  146. package/templates/warlock/src/app/users/events/attach-user-to-response.ts +18 -0
  147. package/templates/warlock/src/app/users/events/register-current-user-to-model-authors.ts +28 -0
  148. package/templates/warlock/src/app/users/events/update-authors.ts +19 -0
  149. package/templates/warlock/src/app/users/mail/send-forget-password-email.ts +20 -0
  150. package/templates/warlock/src/app/users/models/user/index.ts +1 -0
  151. package/templates/warlock/src/app/users/models/user/migration.ts +15 -0
  152. package/templates/warlock/src/app/users/models/user/user.ts +54 -0
  153. package/templates/warlock/src/app/users/output/user-output.ts +12 -0
  154. package/templates/warlock/src/app/users/repositories/users-repository.ts +28 -0
  155. package/templates/warlock/src/app/users/routes.ts +58 -0
  156. package/templates/warlock/src/app/users/utils/locales.ts +16 -0
  157. package/templates/warlock/src/app/utils/output.ts +18 -0
  158. package/templates/warlock/src/app/utils/router.ts +104 -0
  159. package/templates/warlock/src/config/app.ts +12 -0
  160. package/templates/warlock/src/config/auth.ts +16 -0
  161. package/templates/warlock/src/config/cache.ts +33 -0
  162. package/templates/warlock/src/config/database.ts +14 -0
  163. package/templates/warlock/src/config/http.ts +22 -0
  164. package/templates/warlock/src/config/log.ts +19 -0
  165. package/templates/warlock/src/config/mail.ts +16 -0
  166. package/templates/warlock/src/config/uploads.ts +12 -0
  167. package/templates/warlock/src/config/validation.ts +76 -0
  168. package/templates/warlock/tsconfig.json +30 -0
  169. package/templates/warlock/warlock.config.ts +9 -0
@@ -0,0 +1,4 @@
1
+ export type Template = "warlock";
2
+ export declare function template(templateName: Template): string;
3
+ export declare function packageRoot(...paths: string[]): string;
4
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/helpers/paths.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AAEjC,wBAAgB,QAAQ,CAAC,YAAY,EAAE,QAAQ,GAAG,MAAM,CAEvD;AAED,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,5 @@
1
+ import path__default from'path';import {fileURLToPath}from'url';const __filename = fileURLToPath(import.meta.url);
2
+ const __dirname = path__default.dirname(__filename);
3
+ function template(templateName) {
4
+ return path__default.resolve(__dirname, "../", "../", "templates", templateName);
5
+ }export{template};//# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sources":["../../src/helpers/paths.ts"],"sourcesContent":[null],"names":["path"],"mappings":"gEAGA,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAElD,MAAM,SAAS,GAAGA,aAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAIrC,SAAU,QAAQ,CAAC,YAAsB,EAAA;AAC7C,IAAA,OAAOA,aAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAC1E"}
@@ -0,0 +1,7 @@
1
+ import { Template } from "./paths";
2
+ export declare function initializeGitRepository(appPath: string): Promise<boolean>;
3
+ export declare function installDependencies(appPath: string): Promise<boolean>;
4
+ export declare function updateEnvFile(appPath: string, appName: string): Promise<void>;
5
+ export declare function copyTemplateFiles(templateName: Template, appPath: string, _appName: string): Promise<void>;
6
+ export declare function allDone(appName: string): Promise<void>;
7
+ //# sourceMappingURL=project-builder-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-builder-helpers.d.ts","sourceRoot":"","sources":["../../src/helpers/project-builder-helpers.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAY,MAAM,SAAS,CAAC;AAE7C,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,oBA2B5D;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,oBAuBxD;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAiCnE;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,QAAQ,EACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,iBAUjB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,iBAiB5C"}
@@ -0,0 +1,44 @@
1
+ import {confirm,spinner,outro}from'@clack/prompts';import {colors}from'@mongez/copper';import'@mongez/fs';import'path';import {executeCommand,runCommand}from'./exec.js';import {getPackageManager,startCommand}from'./package-manager.js';import'./paths.js';async function initializeGitRepository(appPath) {
2
+ if ((await confirm({
3
+ message: "Do you want to initialize a git repository?",
4
+ initialValue: true,
5
+ })) === false)
6
+ return false;
7
+ const loading = spinner();
8
+ loading.start("📂 Initializing git repository 🚀");
9
+ // initialize git repository
10
+ await executeCommand(`git`, ["init"], appPath);
11
+ // switching to `main` branch
12
+ await executeCommand(`git`, ["checkout", "-b", "main"], appPath);
13
+ // add files
14
+ await executeCommand(`git`, ["add", "."], appPath);
15
+ // commit files
16
+ await executeCommand(`git`, ["commit", "-m", "Initial commit ⚡️"], appPath);
17
+ loading.stop("📂 Git initialized 🔗");
18
+ return true;
19
+ }
20
+ async function installDependencies(appPath) {
21
+ const result = await runCommand(getPackageManager(), ["install"], appPath);
22
+ const confirmed = await confirm({
23
+ message: "Do you want to install the project dependencies?",
24
+ initialValue: true,
25
+ });
26
+ if (confirmed === false) {
27
+ result.abort();
28
+ return false;
29
+ }
30
+ const loading = spinner();
31
+ loading.start("📦 Installing dependencies ⏳");
32
+ await result.install;
33
+ loading.stop("📦 Dependencies installed successfully ✅");
34
+ return true;
35
+ }
36
+ async function allDone(appName) {
37
+ outro("🌟 " +
38
+ colors.bgGreenBright("DONE") +
39
+ " now you're ready to go! Type the following or copy/paste it into your terminal to get started 🚀 ✅");
40
+ console.log(colors.cyan(`cd ${appName} && ${startCommand()}`));
41
+ // make an empty line
42
+ console.log();
43
+ console.log(`If you are using VSCode, it's recommended to install the 🛠️ ${colors.yellow(`Generator Z`)} extension. It generates code snippets for you! 🚀`);
44
+ }export{allDone,initializeGitRepository,installDependencies};//# sourceMappingURL=project-builder-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-builder-helpers.js","sources":["../../src/helpers/project-builder-helpers.ts"],"sourcesContent":[null],"names":[],"mappings":"8PAeO,eAAe,uBAAuB,CAAC,OAAe,EAAA;IAC3D,IACE,CAAC,MAAM,OAAO,CAAC;AACb,QAAA,OAAO,EAAE,6CAA6C;AACtD,QAAA,YAAY,EAAE,IAAI;KACnB,CAAC,MAAM,KAAK;AAEb,QAAA,OAAO,KAAK,CAAC;AAEf,IAAA,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;AAE1B,IAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;;IAGnD,MAAM,cAAc,CAAC,CAAA,GAAA,CAAK,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;;AAE/C,IAAA,MAAM,cAAc,CAAC,CAAK,GAAA,CAAA,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;;AAGjE,IAAA,MAAM,cAAc,CAAC,CAAK,GAAA,CAAA,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;;AAGnD,IAAA,MAAM,cAAc,CAAC,CAAK,GAAA,CAAA,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;AAE5E,IAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;AAEtC,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,eAAe,mBAAmB,CAAC,OAAe,EAAA;AACvD,IAAA,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AAE3E,IAAA,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;AAC9B,QAAA,OAAO,EAAE,kDAAkD;AAC3D,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA,CAAC,CAAC;IAEH,IAAI,SAAS,KAAK,KAAK,EAAE;QACvB,MAAM,CAAC,KAAK,EAAE,CAAC;AAEf,QAAA,OAAO,KAAK,CAAC;AACd,KAAA;AAED,IAAA,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;AAE1B,IAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE9C,MAAM,MAAM,CAAC,OAAO,CAAC;AAErB,IAAA,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;AAEzD,IAAA,OAAO,IAAI,CAAC;AACd,CAAC;AAoDM,eAAe,OAAO,CAAC,OAAe,EAAA;AAC3C,IAAA,KAAK,CACH,KAAK;AACH,QAAA,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;AAC5B,QAAA,qGAAqG,CACxG,CAAC;AAEF,IAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAM,GAAA,EAAA,OAAO,OAAO,YAAY,EAAE,CAAE,CAAA,CAAC,CAAC,CAAC;;IAG/D,OAAO,CAAC,GAAG,EAAE,CAAC;AAEd,IAAA,OAAO,CAAC,GAAG,CACT,CAAA,6DAAA,EAAgE,MAAM,CAAC,MAAM,CAC3E,CAAa,WAAA,CAAA,CACd,CAAoD,kDAAA,CAAA,CACtD,CAAC;AACJ"}
package/esm/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export default function createApp(): void;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,OAAO,UAAU,SAAS,SAQhC"}
package/esm/index.js ADDED
@@ -0,0 +1,7 @@
1
+ import {getJsonFile}from'@mongez/fs';import {program}from'commander';import*as path from'path';import {fileURLToPath}from'url';import createNewApp from'./commands/create-new-app/index.js';const __filename = fileURLToPath(import.meta.url);
2
+ const __dirname = path.dirname(__filename);
3
+ function createApp() {
4
+ const packageJson = getJsonFile(path.resolve(__dirname, "../", "package.json"));
5
+ program.version(packageJson["version"]);
6
+ createNewApp();
7
+ }export{createApp as default};//# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":[],"mappings":"4LAMA,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAElD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE7B,SAAU,SAAS,GAAA;AAC/B,IAAA,MAAM,WAAW,GAAQ,WAAW,CAClC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAC/C,CAAC;IAEF,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AAExC,IAAA,YAAY,EAAE,CAAC;AACjB"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "create-warlock",
3
+ "version": "1.0.0",
4
+ "main": "./esm/index.js",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "create-warlock": "./create-warlock.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
+ "commander": "^12.0.0",
23
+ "inquirer": "^9",
24
+ "which-pm-runs": "^1.1.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/inquirer": "^9.0.7",
28
+ "@types/node": "^20.12.7",
29
+ "@typescript-eslint/eslint-plugin": "^7.7.0",
30
+ "@typescript-eslint/parser": "^7.7.0",
31
+ "eslint": "^8.56.0",
32
+ "eslint-config-prettier": "^9.1.0",
33
+ "eslint-plugin-prettier": "^5.1.3",
34
+ "eslint-plugin-unused-imports": "^3.1.0",
35
+ "npm-check-updates": "^16.14.18",
36
+ "prettier": "^3.2.5",
37
+ "prettier-plugin-organize-imports": "^3.2.4",
38
+ "ts-node": "^10.9.2",
39
+ "tsconfig-paths": "^4.2.0",
40
+ "typescript": "^5.4.5"
41
+ },
42
+ "module": "./esm/index.js",
43
+ "typings": "./esm/index.d.ts"
44
+ }
@@ -0,0 +1,35 @@
1
+ # App Configurations
2
+ APP_NAME="appName"
3
+ LOCALE_CODE=en
4
+
5
+ TIMEZONE=UTC
6
+
7
+ # Http Configurations
8
+ PORT=1911
9
+ HOST=127.0.0.1
10
+ BASE_URL=http://${HOST}:${PORT}
11
+
12
+ # Database Configurations
13
+ DB_AUTH=admin
14
+ DB_PORT=27017
15
+ DB_HOST=127.0.0.1
16
+ DB_NAME=appName
17
+ DB_USERNAME=root
18
+ DB_PASSWORD=root
19
+
20
+ # Redis
21
+ REDIS_PREFIX=appName
22
+ REDIS_HOST=127.0.0.1
23
+ REDIS_PORT=6379
24
+ # or using redis url
25
+ #REDIS_URL=
26
+
27
+ # Mail
28
+ MAIL_HOST=
29
+ MAIL_PORT=465
30
+ MAIL_ENCRYPTION=ssl
31
+ MAIL_SECURE=true
32
+ MAIL_USERNAME=
33
+ MAIL_PASSWORD=
34
+ MAIL_FROM_NAME=${APP_NAME}
35
+ MAIL_FROM_ADDRESS=
@@ -0,0 +1,44 @@
1
+ {
2
+ "env": {
3
+ "node": true,
4
+ "es2021": true,
5
+ "jest": true
6
+ },
7
+ "extends": [
8
+ "eslint:recommended",
9
+ "plugin:@typescript-eslint/recommended",
10
+ "plugin:prettier/recommended"
11
+ ],
12
+ "parser": "@typescript-eslint/parser",
13
+ "parserOptions": {
14
+ "ecmaVersion": "latest",
15
+ "sourceType": "module"
16
+ },
17
+ "plugins": ["@typescript-eslint", "prettier", "unused-imports"],
18
+ "rules": {
19
+ "@typescript-eslint/no-explicit-any": "off",
20
+ "@typescript-eslint/no-unused-vars": "off",
21
+ "no-unused-vars": "off",
22
+ "unused-imports/no-unused-vars": [
23
+ "warn",
24
+ {
25
+ "vars": "all",
26
+ "varsIgnorePattern": "^_",
27
+ "args": "after-used",
28
+ "argsIgnorePattern": "^_"
29
+ }
30
+ ],
31
+ "unused-imports/no-unused-imports": "error",
32
+ "@typescript-eslint/explicit-member-accessibility": [
33
+ "error",
34
+ { "accessibility": "explicit" }
35
+ ],
36
+ "@typescript-eslint/consistent-type-imports": [
37
+ "error",
38
+ {
39
+ "prefer": "type-imports",
40
+ "disallowTypeAnnotations": false
41
+ }
42
+ ]
43
+ }
44
+ }
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,11 @@
1
+ {
2
+ "semi": true,
3
+ "tabWidth": 2,
4
+ "printWidth": 80,
5
+ "singleQuote": false,
6
+ "arrowParens": "avoid",
7
+ "trailingComma": "all",
8
+ "bracketSameLine": true,
9
+ "endOfLine": "auto",
10
+ "plugins": ["prettier-plugin-organize-imports"]
11
+ }
@@ -0,0 +1,57 @@
1
+ # Warlock.js
2
+
3
+ A Blazing fast Nodejs framework to build comprehensive APIs.
4
+
5
+ For more knowledge about Warlock js, please visit Full documentation is in [Official Documentation](https://warlock.js.org).
6
+
7
+ ## Start Development Server
8
+
9
+ To start the development server, run the following command
10
+
11
+ ```bash
12
+ yarn start
13
+ ```
14
+
15
+ OR
16
+
17
+ ```bash
18
+ npm start
19
+ ```
20
+
21
+ ## Build for Production
22
+
23
+ To build the project for production, run the following command
24
+
25
+ ```bash
26
+ yarn build
27
+ ```
28
+
29
+ OR
30
+
31
+ ```bash
32
+ npm run build
33
+ ```
34
+
35
+ ## Start Production Server
36
+
37
+ After building the project, run the following command to start the production server
38
+
39
+ ```bash
40
+ yarn prod
41
+ ```
42
+
43
+ To run it in background, run the following command
44
+
45
+ ```bash
46
+ yarn serve
47
+ ```
48
+
49
+ > Please note that you should have nohup installed on your system to run the server in background
50
+
51
+ ## Tests
52
+
53
+ To run tests, run the following command
54
+
55
+ ```bash
56
+ yarn test
57
+ ```
@@ -0,0 +1,7 @@
1
+ node_modules
2
+ build
3
+ dist
4
+ storage/*
5
+ .env
6
+ .warlock/
7
+ nohup.out
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "app-nme",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "start": "warlock dev",
7
+ "build": "tsc && warlock build",
8
+ "prod": "warlock start",
9
+ "postman": "warlock postman",
10
+ "migrate": "warlock migrate",
11
+ "migrate.fresh": "warlock migrate --fresh",
12
+ "migrate.list": "warlock migrate --list",
13
+ "jwt": "warlock jwt.generate",
14
+ "test": "warlock test.init && vitest",
15
+ "prod.start": "yarn build && yarn prod",
16
+ "serve": "yarn build && nohup warlock start > /dev/null 2>&1",
17
+ "lint": "npx eslint --fix -c ./.eslintrc.json ./src --max-warnings=0",
18
+ "format": "npx prettier --write ./src/**/*.{js,jsx,ts,tsx,css,md,json} --config ./.prettierrc.json",
19
+ "tsc": "npx tsc --noEmit"
20
+ },
21
+ "dependencies": {
22
+ "@mongez/collection": "^1.1.2",
23
+ "@mongez/encryption": "^1.0.4",
24
+ "@mongez/fs": "^3.0.5",
25
+ "@mongez/reinforcements": "^2.3.10",
26
+ "@mongez/localization": "^2.2.4",
27
+ "@mongez/dotenv": "^1.1.9",
28
+ "@mongez/supportive-is": "^2.0.3",
29
+ "@warlock.js/auth": "^1.0.2",
30
+ "@warlock.js/cache": "^1.1.0",
31
+ "@warlock.js/cascade": "^1.0.4",
32
+ "@warlock.js/core": "^1.0.18",
33
+ "@warlock.js/logger": "^1.0.6",
34
+ "@warlock.js/postman": "^1.0.2",
35
+ "dayjs": "^1.11.10"
36
+ },
37
+ "devDependencies": {
38
+ "eslint": "^8.53.0",
39
+ "@typescript-eslint/eslint-plugin": "^6.11.0",
40
+ "@typescript-eslint/parser": "^6.11.0",
41
+ "eslint-config-prettier": "^9.0.0",
42
+ "eslint-plugin-prettier": "^5.0.1",
43
+ "eslint-plugin-unused-imports": "^3.0.0",
44
+ "@mongez/huskier": "^2.0.0",
45
+ "prettier": "^3.2.5",
46
+ "prettier-plugin-organize-imports": "^3.2.4",
47
+ "typescript": "^5.4.5",
48
+ "vite": "^5.2.8",
49
+ "vitest": "^1.5.0"
50
+ },
51
+ "huskier": {
52
+ "hooks": {
53
+ "pre-commit": [
54
+ "yarn format",
55
+ "yarn lint",
56
+ "yarn tsc"
57
+ ]
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,12 @@
1
+ // this file is called before any main file in the other modules
2
+ // This will be called directly when the app starts
3
+ import { onceConnected } from "@warlock.js/cascade";
4
+
5
+ // This function will be called once the app is connected to the database
6
+ // it will be called on app start
7
+ // If the app is running in development mode, this function will be called
8
+ // every time a file is changed
9
+ // it could be useful to test some code or do small database modifications
10
+ onceConnected(() => {
11
+ //
12
+ });
@@ -0,0 +1,27 @@
1
+ import {
2
+ deleteFile,
3
+ getUploadedFile,
4
+ getUploadedFileUsingHash,
5
+ router,
6
+ uploadChunkedFiles,
7
+ uploadFiles,
8
+ } from "@warlock.js/core";
9
+ import { adminPath, guarded } from "app/utils/router";
10
+
11
+ guarded(() => {
12
+ // Upload files
13
+ router.post(["/uploads", adminPath("/uploads")], uploadFiles);
14
+ // Upload chunked files
15
+ router.post(
16
+ ["/uploads/chunks", adminPath("/uploads/chunks")],
17
+ uploadChunkedFiles,
18
+ );
19
+ // Delete file by hash from the database
20
+ router.delete(["/uploads/:hash", adminPath("/uploads/:hash")], deleteFile);
21
+ });
22
+
23
+ // Please note that the uploaded files should not be grouped in protected middleware i.e guarded with JWT
24
+ // Get uploaded file using the file path directly
25
+ router.get("/uploads/*", getUploadedFile);
26
+ // Get uploaded file using hash
27
+ router.get("/uploads/:hash", getUploadedFileUsingHash);
@@ -0,0 +1,48 @@
1
+ import type { Request, Response } from "@warlock.js/core";
2
+ import { User } from "app/users/models/user";
3
+
4
+ export default async function activateAccount(
5
+ request: Request,
6
+ response: Response,
7
+ ) {
8
+ const currentUser = request.user;
9
+
10
+ currentUser.unset("codeExpiresAt", "activationCode");
11
+
12
+ currentUser.save({
13
+ isActive: true,
14
+ activatedAt: new Date(),
15
+ });
16
+
17
+ const accessToken = await currentUser.generateAccessToken();
18
+
19
+ return response.success({
20
+ user: {
21
+ ...(await currentUser.toJSON()),
22
+ accessToken: accessToken,
23
+ userType: currentUser.userType,
24
+ },
25
+ });
26
+ }
27
+
28
+ activateAccount.validation = {
29
+ rules: {
30
+ code: ["required"],
31
+ email: ["required", "email"],
32
+ },
33
+ validate: async (request: Request, response: Response) => {
34
+ const user = await User.aggregate()
35
+ .where("email", String(request.input("email")).toLowerCase())
36
+ .where("isActive", false)
37
+ .where("activationCode", request.input("code"))
38
+ .first();
39
+
40
+ if (!user) {
41
+ return response.notFound({
42
+ error: "Invalid activation code",
43
+ });
44
+ }
45
+
46
+ request.user = user;
47
+ },
48
+ };
@@ -0,0 +1,40 @@
1
+ import type { Request, Response } from "@warlock.js/core";
2
+ import { User } from "app/users/models/user";
3
+
4
+ export default async function adminLogin(request: Request, response: Response) {
5
+ const user = request.user;
6
+
7
+ const auth = await user.generateAccessToken();
8
+
9
+ return response.success({
10
+ user: {
11
+ ...(await user.toJSON()),
12
+ accessToken: auth,
13
+ userType: user.userType,
14
+ },
15
+ });
16
+ }
17
+
18
+ adminLogin.validation = {
19
+ rules: {
20
+ password: ["required"],
21
+ email: ["required", "email"],
22
+ },
23
+ validate: async (request: Request, response: Response) => {
24
+ const user = await User.attempt(request.only(["email", "password"]));
25
+
26
+ if (!user) {
27
+ return response.badRequest({
28
+ error: "Invalid credentials",
29
+ });
30
+ }
31
+
32
+ if (!user.get("isActive")) {
33
+ return response.badRequest({
34
+ error: "Your account is suspended!",
35
+ });
36
+ }
37
+
38
+ request.user = user;
39
+ },
40
+ };
@@ -0,0 +1,23 @@
1
+ import { Random } from "@mongez/reinforcements";
2
+ import { UniqueRule, type Request, type Response } from "@warlock.js/core";
3
+ import { User } from "app/users/models/user";
4
+
5
+ export default async function createAccount(
6
+ request: Request,
7
+ response: Response,
8
+ ) {
9
+ User.create({
10
+ ...request.validated(),
11
+ activationCode: Random.int(100000, 999999),
12
+ });
13
+
14
+ return response.success();
15
+ }
16
+
17
+ createAccount.validation = {
18
+ rules: {
19
+ name: ["required", "minLength:2"],
20
+ email: ["required", "email", new UniqueRule(User)],
21
+ password: ["required", "minLength:8"],
22
+ },
23
+ };
@@ -0,0 +1,39 @@
1
+ import { Random } from "@mongez/reinforcements";
2
+ import { UniqueRule, type Request, type Response } from "@warlock.js/core";
3
+ import sendForgetPasswordEmail from "app/users/mail/send-forget-password-email";
4
+ import { User } from "app/users/models/user";
5
+
6
+ export default async function forgetPassword(
7
+ request: Request<User>,
8
+ response: Response,
9
+ ) {
10
+ const currentUser = request.user;
11
+
12
+ currentUser
13
+ .save({
14
+ activatedAt: new Date(),
15
+ activationCode: Random.int(100000, 999999),
16
+ })
17
+ .then(sendForgetPasswordEmail);
18
+
19
+ return response.success();
20
+ }
21
+
22
+ forgetPassword.validation = {
23
+ rules: {
24
+ email: ["required", "email", new UniqueRule(User)],
25
+ },
26
+ validate: async (request: Request, response: Response) => {
27
+ const user = await User.first({
28
+ email: request.input("email"),
29
+ // if the app requires an active account, uncomment the following line
30
+ // isActive: true,
31
+ });
32
+
33
+ if (!user) {
34
+ return response.notFound();
35
+ }
36
+
37
+ request.user = user;
38
+ },
39
+ };
@@ -0,0 +1,49 @@
1
+ import { t, type Request, type Response } from "@warlock.js/core";
2
+ import { User } from "app/users/models/user";
3
+
4
+ export default async function login(
5
+ request: Request<User>,
6
+ response: Response,
7
+ ) {
8
+ const user = request.user;
9
+
10
+ const auth = await user.generateAccessToken();
11
+
12
+ user.save({
13
+ lastLogin: new Date(),
14
+ });
15
+
16
+ return response.success({
17
+ user: {
18
+ ...(await user.toJSON()),
19
+ accessToken: auth,
20
+ userType: user.userType,
21
+ },
22
+ });
23
+ }
24
+
25
+ login.validation = {
26
+ rules: {
27
+ email: ["required", "email"],
28
+ password: ["required", "string"],
29
+ },
30
+ validate: async (request: Request, response: Response) => {
31
+ const user = await User.attempt(request.only(["email", "password"]));
32
+
33
+ if (!user) {
34
+ return response.badRequest({
35
+ error: t("auth.invalidCredentials"),
36
+ });
37
+ }
38
+
39
+ if (!user.isActive) {
40
+ // you can send the activation code again
41
+ // or just return a bad request with an error message
42
+ return response.forbidden({
43
+ error: t("auth.accountNotActivated"),
44
+ });
45
+ }
46
+
47
+ request.user = user;
48
+ },
49
+ };
@@ -0,0 +1,10 @@
1
+ import type { Request, Response } from "@warlock.js/core";
2
+ import type { User } from "app/users/models/user";
3
+
4
+ export default function logout(request: Request<User>, response: Response) {
5
+ const user = request.user;
6
+
7
+ user.removeAccessToken(request.accessToken);
8
+
9
+ return response.success();
10
+ }