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.
- package/README.md +29 -0
- package/cjs/commands/create-new-app/get-app-path.d.ts +2 -0
- package/cjs/commands/create-new-app/get-app-path.d.ts.map +1 -0
- package/cjs/commands/create-new-app/get-app-path.js +8 -0
- package/cjs/commands/create-new-app/get-app-path.js.map +1 -0
- package/cjs/commands/create-new-app/index.d.ts +2 -0
- package/cjs/commands/create-new-app/index.d.ts.map +1 -0
- package/cjs/commands/create-new-app/index.js +42 -0
- package/cjs/commands/create-new-app/index.js.map +1 -0
- package/cjs/commands/create-new-app/select-app-type.d.ts +2 -0
- package/cjs/commands/create-new-app/select-app-type.d.ts.map +1 -0
- package/cjs/commands/create-new-app/types.d.ts +8 -0
- package/cjs/commands/create-new-app/types.d.ts.map +1 -0
- package/cjs/commands/create-warlock-app/index.d.ts +3 -0
- package/cjs/commands/create-warlock-app/index.d.ts.map +1 -0
- package/cjs/commands/create-warlock-app/index.js +18 -0
- package/cjs/commands/create-warlock-app/index.js.map +1 -0
- package/cjs/commands/vite-react/headless-ui/index.d.ts +3 -0
- package/cjs/commands/vite-react/headless-ui/index.d.ts.map +1 -0
- package/cjs/commands/vite-react/headless-ui/types.d.ts +4 -0
- package/cjs/commands/vite-react/headless-ui/types.d.ts.map +1 -0
- package/cjs/commands/vite-react/index.d.ts +3 -0
- package/cjs/commands/vite-react/index.d.ts.map +1 -0
- package/cjs/commands/vite-react/mantine/index.d.ts +3 -0
- package/cjs/commands/vite-react/mantine/index.d.ts.map +1 -0
- package/cjs/commands/vite-react/mantine/types.d.ts +4 -0
- package/cjs/commands/vite-react/mantine/types.d.ts.map +1 -0
- package/cjs/commands/vite-react/select-react-app.d.ts +4 -0
- package/cjs/commands/vite-react/select-react-app.d.ts.map +1 -0
- package/cjs/commands/vite-react/selectAppConfigurations.d.ts +3 -0
- package/cjs/commands/vite-react/selectAppConfigurations.d.ts.map +1 -0
- package/cjs/commands/vite-react/tailwind-css/index.d.ts +3 -0
- package/cjs/commands/vite-react/tailwind-css/index.d.ts.map +1 -0
- package/cjs/commands/vite-react/tailwind-css/types.d.ts +4 -0
- package/cjs/commands/vite-react/tailwind-css/types.d.ts.map +1 -0
- package/cjs/commands/vite-react/types.d.ts +4 -0
- package/cjs/commands/vite-react/types.d.ts.map +1 -0
- package/cjs/helpers/app.d.ts +51 -0
- package/cjs/helpers/app.d.ts.map +1 -0
- package/cjs/helpers/app.js +127 -0
- package/cjs/helpers/app.js.map +1 -0
- package/cjs/helpers/exec.d.ts +10 -0
- package/cjs/helpers/exec.d.ts.map +1 -0
- package/cjs/helpers/exec.js +69 -0
- package/cjs/helpers/exec.js.map +1 -0
- package/cjs/helpers/package-manager.d.ts +5 -0
- package/cjs/helpers/package-manager.d.ts.map +1 -0
- package/cjs/helpers/package-manager.js +16 -0
- package/cjs/helpers/package-manager.js.map +1 -0
- package/cjs/helpers/paths.d.ts +4 -0
- package/cjs/helpers/paths.d.ts.map +1 -0
- package/cjs/helpers/paths.js +5 -0
- package/cjs/helpers/paths.js.map +1 -0
- package/cjs/helpers/project-builder-helpers.d.ts +7 -0
- package/cjs/helpers/project-builder-helpers.d.ts.map +1 -0
- package/cjs/helpers/project-builder-helpers.js +44 -0
- package/cjs/helpers/project-builder-helpers.js.map +1 -0
- package/cjs/index.d.ts +2 -0
- package/cjs/index.d.ts.map +1 -0
- package/cjs/index.js +7 -0
- package/cjs/index.js.map +1 -0
- package/create-app.js +5 -0
- package/esm/commands/create-new-app/get-app-path.d.ts +2 -0
- package/esm/commands/create-new-app/get-app-path.d.ts.map +1 -0
- package/esm/commands/create-new-app/get-app-path.js +8 -0
- package/esm/commands/create-new-app/get-app-path.js.map +1 -0
- package/esm/commands/create-new-app/index.d.ts +2 -0
- package/esm/commands/create-new-app/index.d.ts.map +1 -0
- package/esm/commands/create-new-app/index.js +42 -0
- package/esm/commands/create-new-app/index.js.map +1 -0
- package/esm/commands/create-new-app/select-app-type.d.ts +2 -0
- package/esm/commands/create-new-app/select-app-type.d.ts.map +1 -0
- package/esm/commands/create-new-app/types.d.ts +8 -0
- package/esm/commands/create-new-app/types.d.ts.map +1 -0
- package/esm/commands/create-warlock-app/index.d.ts +3 -0
- package/esm/commands/create-warlock-app/index.d.ts.map +1 -0
- package/esm/commands/create-warlock-app/index.js +18 -0
- package/esm/commands/create-warlock-app/index.js.map +1 -0
- package/esm/commands/vite-react/headless-ui/index.d.ts +3 -0
- package/esm/commands/vite-react/headless-ui/index.d.ts.map +1 -0
- package/esm/commands/vite-react/headless-ui/types.d.ts +4 -0
- package/esm/commands/vite-react/headless-ui/types.d.ts.map +1 -0
- package/esm/commands/vite-react/index.d.ts +3 -0
- package/esm/commands/vite-react/index.d.ts.map +1 -0
- package/esm/commands/vite-react/mantine/index.d.ts +3 -0
- package/esm/commands/vite-react/mantine/index.d.ts.map +1 -0
- package/esm/commands/vite-react/mantine/types.d.ts +4 -0
- package/esm/commands/vite-react/mantine/types.d.ts.map +1 -0
- package/esm/commands/vite-react/select-react-app.d.ts +4 -0
- package/esm/commands/vite-react/select-react-app.d.ts.map +1 -0
- package/esm/commands/vite-react/selectAppConfigurations.d.ts +3 -0
- package/esm/commands/vite-react/selectAppConfigurations.d.ts.map +1 -0
- package/esm/commands/vite-react/tailwind-css/index.d.ts +3 -0
- package/esm/commands/vite-react/tailwind-css/index.d.ts.map +1 -0
- package/esm/commands/vite-react/tailwind-css/types.d.ts +4 -0
- package/esm/commands/vite-react/tailwind-css/types.d.ts.map +1 -0
- package/esm/commands/vite-react/types.d.ts +4 -0
- package/esm/commands/vite-react/types.d.ts.map +1 -0
- package/esm/helpers/app.d.ts +51 -0
- package/esm/helpers/app.d.ts.map +1 -0
- package/esm/helpers/app.js +127 -0
- package/esm/helpers/app.js.map +1 -0
- package/esm/helpers/exec.d.ts +10 -0
- package/esm/helpers/exec.d.ts.map +1 -0
- package/esm/helpers/exec.js +69 -0
- package/esm/helpers/exec.js.map +1 -0
- package/esm/helpers/package-manager.d.ts +5 -0
- package/esm/helpers/package-manager.d.ts.map +1 -0
- package/esm/helpers/package-manager.js +16 -0
- package/esm/helpers/package-manager.js.map +1 -0
- package/esm/helpers/paths.d.ts +4 -0
- package/esm/helpers/paths.d.ts.map +1 -0
- package/esm/helpers/paths.js +5 -0
- package/esm/helpers/paths.js.map +1 -0
- package/esm/helpers/project-builder-helpers.d.ts +7 -0
- package/esm/helpers/project-builder-helpers.d.ts.map +1 -0
- package/esm/helpers/project-builder-helpers.js +44 -0
- package/esm/helpers/project-builder-helpers.js.map +1 -0
- package/esm/index.d.ts +2 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +7 -0
- package/esm/index.js.map +1 -0
- package/package.json +44 -0
- package/templates/warlock/.env.example +35 -0
- package/templates/warlock/.eslintrc.json +44 -0
- package/templates/warlock/.gitattributes +1 -0
- package/templates/warlock/.prettierrc.json +11 -0
- package/templates/warlock/README.md +57 -0
- package/templates/warlock/_.gitignore +7 -0
- package/templates/warlock/package.json +60 -0
- package/templates/warlock/src/app/main.ts +12 -0
- package/templates/warlock/src/app/uploads/routes.ts +27 -0
- package/templates/warlock/src/app/users/controllers/auth/activate-account.ts +48 -0
- package/templates/warlock/src/app/users/controllers/auth/admin-login.ts +40 -0
- package/templates/warlock/src/app/users/controllers/auth/create-account.ts +23 -0
- package/templates/warlock/src/app/users/controllers/auth/forget-password.ts +39 -0
- package/templates/warlock/src/app/users/controllers/auth/login.ts +49 -0
- package/templates/warlock/src/app/users/controllers/auth/logout.ts +10 -0
- package/templates/warlock/src/app/users/controllers/auth/resend-activation-code.ts +45 -0
- package/templates/warlock/src/app/users/controllers/auth/reset-password.ts +43 -0
- package/templates/warlock/src/app/users/controllers/auth/verify-forget-password-code.ts +18 -0
- package/templates/warlock/src/app/users/controllers/profile/change-password.ts +31 -0
- package/templates/warlock/src/app/users/controllers/profile/my-profile.ts +10 -0
- package/templates/warlock/src/app/users/controllers/profile/update-profile.ts +25 -0
- package/templates/warlock/src/app/users/controllers/restful-users.ts +27 -0
- package/templates/warlock/src/app/users/events/attach-user-to-response.ts +18 -0
- package/templates/warlock/src/app/users/events/register-current-user-to-model-authors.ts +28 -0
- package/templates/warlock/src/app/users/events/update-authors.ts +19 -0
- package/templates/warlock/src/app/users/mail/send-forget-password-email.ts +20 -0
- package/templates/warlock/src/app/users/models/user/index.ts +1 -0
- package/templates/warlock/src/app/users/models/user/migration.ts +15 -0
- package/templates/warlock/src/app/users/models/user/user.ts +54 -0
- package/templates/warlock/src/app/users/output/user-output.ts +12 -0
- package/templates/warlock/src/app/users/repositories/users-repository.ts +28 -0
- package/templates/warlock/src/app/users/routes.ts +58 -0
- package/templates/warlock/src/app/users/utils/locales.ts +16 -0
- package/templates/warlock/src/app/utils/output.ts +18 -0
- package/templates/warlock/src/app/utils/router.ts +104 -0
- package/templates/warlock/src/config/app.ts +12 -0
- package/templates/warlock/src/config/auth.ts +16 -0
- package/templates/warlock/src/config/cache.ts +33 -0
- package/templates/warlock/src/config/database.ts +14 -0
- package/templates/warlock/src/config/http.ts +22 -0
- package/templates/warlock/src/config/log.ts +19 -0
- package/templates/warlock/src/config/mail.ts +16 -0
- package/templates/warlock/src/config/uploads.ts +12 -0
- package/templates/warlock/src/config/validation.ts +76 -0
- package/templates/warlock/tsconfig.json +30 -0
- package/templates/warlock/warlock.config.ts +9 -0
|
@@ -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 @@
|
|
|
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
|
package/esm/index.js.map
ADDED
|
@@ -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,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,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
|
+
}
|