create-warlock 4.0.174 → 4.1.1

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 (173) hide show
  1. package/cjs/index.cjs +780 -0
  2. package/cjs/index.cjs.map +1 -0
  3. package/cjs/paths-Bl9Wn7qV.cjs +247 -0
  4. package/cjs/paths-Bl9Wn7qV.cjs.map +1 -0
  5. package/cjs/project-builder-helpers-DGcgf60P.cjs +27 -0
  6. package/cjs/project-builder-helpers-DGcgf60P.cjs.map +1 -0
  7. package/esm/commands/create-new-app/get-app-path.mjs +17 -0
  8. package/esm/commands/create-new-app/get-app-path.mjs.map +1 -0
  9. package/esm/commands/create-new-app/index.mjs +152 -0
  10. package/esm/commands/create-new-app/index.mjs.map +1 -0
  11. package/esm/commands/create-new-app/types.d.mts +18 -0
  12. package/esm/commands/create-warlock-app/index.mjs +57 -0
  13. package/esm/commands/create-warlock-app/index.mjs.map +1 -0
  14. package/esm/features/database-drivers.mjs +47 -0
  15. package/esm/features/database-drivers.mjs.map +1 -0
  16. package/esm/features/features-map.mjs +157 -0
  17. package/esm/features/features-map.mjs.map +1 -0
  18. package/esm/helpers/app.mjs +157 -0
  19. package/esm/helpers/app.mjs.map +1 -0
  20. package/esm/helpers/exec.mjs +58 -0
  21. package/esm/helpers/exec.mjs.map +1 -0
  22. package/esm/helpers/package-manager.mjs +84 -0
  23. package/esm/helpers/package-manager.mjs.map +1 -0
  24. package/esm/helpers/paths.mjs +16 -0
  25. package/esm/helpers/paths.mjs.map +1 -0
  26. package/esm/helpers/project-builder-helpers.mjs +28 -0
  27. package/esm/helpers/project-builder-helpers.mjs.map +1 -0
  28. package/esm/index.d.mts +14 -0
  29. package/esm/index.mjs +83 -0
  30. package/esm/index.mjs.map +1 -0
  31. package/esm/ui/{banner.js → banner.mjs} +51 -67
  32. package/esm/ui/banner.mjs.map +1 -0
  33. package/esm/ui/spinners.mjs +23 -0
  34. package/esm/ui/spinners.mjs.map +1 -0
  35. package/llms-full.txt +121 -0
  36. package/llms.txt +9 -0
  37. package/package.json +36 -40
  38. package/skills/create-a-warlock-project/SKILL.md +111 -0
  39. package/templates/warlock/.prettierrc.json +10 -11
  40. package/templates/warlock/_.gitignore +0 -1
  41. package/templates/warlock/package.json +71 -66
  42. package/templates/warlock/src/app/auth/controllers/login.controller.ts +5 -6
  43. package/templates/warlock/src/app/auth/controllers/reset-password.controller.ts +5 -6
  44. package/templates/warlock/src/app/auth/models/otp/migrations/22-12-2025_10-30-20.otp-migration.ts +33 -43
  45. package/templates/warlock/src/app/auth/requests/guarded.request.ts +5 -1
  46. package/templates/warlock/src/app/posts/controllers/create-new-post.controller.ts +5 -6
  47. package/templates/warlock/src/app/posts/controllers/update-post.controller.ts +4 -5
  48. package/templates/warlock/src/app/posts/models/post/migrations/09-01-2026_02-07-51-post.migration.ts +21 -34
  49. package/templates/warlock/src/app/posts/models/post/post.model.ts +0 -2
  50. package/templates/warlock/src/app/posts/{validation → schema}/create-post.schema.ts +1 -1
  51. package/templates/warlock/src/app/posts/{validation → schema}/update-post.schema.ts +1 -1
  52. package/templates/warlock/src/app/shared/utils/locales.ts +34 -0
  53. package/templates/warlock/src/app/shared/utils/router.ts +1 -1
  54. package/templates/warlock/src/app/uploads/controllers/fetch-uploaded-file.controller.ts +1 -1
  55. package/templates/warlock/src/app/users/controllers/create-new-user.controller.ts +4 -4
  56. package/templates/warlock/src/app/users/controllers/list-users.controller.ts +3 -12
  57. package/templates/warlock/src/app/users/models/user/migrations/11-12-2025_23-58-03-user.migration.ts +13 -33
  58. package/templates/warlock/src/app/users/{validation → schema}/create-user.schema.ts +1 -1
  59. package/templates/warlock/storage/.gitignore +2 -0
  60. package/templates/warlock/yarn.lock +2332 -0
  61. package/cjs/commands/create-new-app/get-app-path.d.ts +0 -2
  62. package/cjs/commands/create-new-app/get-app-path.d.ts.map +0 -1
  63. package/cjs/commands/create-new-app/get-app-path.js +0 -8
  64. package/cjs/commands/create-new-app/get-app-path.js.map +0 -1
  65. package/cjs/commands/create-new-app/index.d.ts +0 -2
  66. package/cjs/commands/create-new-app/index.d.ts.map +0 -1
  67. package/cjs/commands/create-new-app/index.js +0 -96
  68. package/cjs/commands/create-new-app/index.js.map +0 -1
  69. package/cjs/commands/create-new-app/types.d.ts +0 -16
  70. package/cjs/commands/create-new-app/types.d.ts.map +0 -1
  71. package/cjs/commands/create-warlock-app/index.d.ts +0 -3
  72. package/cjs/commands/create-warlock-app/index.d.ts.map +0 -1
  73. package/cjs/commands/create-warlock-app/index.js +0 -55
  74. package/cjs/commands/create-warlock-app/index.js.map +0 -1
  75. package/cjs/features/database-drivers.d.ts +0 -31
  76. package/cjs/features/database-drivers.d.ts.map +0 -1
  77. package/cjs/features/database-drivers.js +0 -53
  78. package/cjs/features/database-drivers.js.map +0 -1
  79. package/cjs/features/features-map.d.ts +0 -35
  80. package/cjs/features/features-map.d.ts.map +0 -1
  81. package/cjs/features/features-map.js +0 -120
  82. package/cjs/features/features-map.js.map +0 -1
  83. package/cjs/helpers/app.d.ts +0 -71
  84. package/cjs/helpers/app.d.ts.map +0 -1
  85. package/cjs/helpers/app.js +0 -196
  86. package/cjs/helpers/app.js.map +0 -1
  87. package/cjs/helpers/exec.d.ts +0 -10
  88. package/cjs/helpers/exec.d.ts.map +0 -1
  89. package/cjs/helpers/exec.js +0 -69
  90. package/cjs/helpers/exec.js.map +0 -1
  91. package/cjs/helpers/package-manager.d.ts +0 -18
  92. package/cjs/helpers/package-manager.d.ts.map +0 -1
  93. package/cjs/helpers/package-manager.js +0 -104
  94. package/cjs/helpers/package-manager.js.map +0 -1
  95. package/cjs/helpers/paths.d.ts +0 -4
  96. package/cjs/helpers/paths.d.ts.map +0 -1
  97. package/cjs/helpers/paths.js +0 -8
  98. package/cjs/helpers/paths.js.map +0 -1
  99. package/cjs/helpers/project-builder-helpers.d.ts +0 -6
  100. package/cjs/helpers/project-builder-helpers.d.ts.map +0 -1
  101. package/cjs/helpers/project-builder-helpers.js +0 -11
  102. package/cjs/helpers/project-builder-helpers.js.map +0 -1
  103. package/cjs/index.d.ts +0 -2
  104. package/cjs/index.d.ts.map +0 -1
  105. package/cjs/index.js +0 -3
  106. package/cjs/index.js.map +0 -1
  107. package/cjs/ui/banner.d.ts +0 -29
  108. package/cjs/ui/banner.d.ts.map +0 -1
  109. package/cjs/ui/banner.js +0 -142
  110. package/cjs/ui/banner.js.map +0 -1
  111. package/cjs/ui/spinners.d.ts +0 -18
  112. package/cjs/ui/spinners.d.ts.map +0 -1
  113. package/cjs/ui/spinners.js +0 -17
  114. package/cjs/ui/spinners.js.map +0 -1
  115. package/create-app.js +0 -5
  116. package/esm/commands/create-new-app/get-app-path.d.ts +0 -2
  117. package/esm/commands/create-new-app/get-app-path.d.ts.map +0 -1
  118. package/esm/commands/create-new-app/get-app-path.js +0 -8
  119. package/esm/commands/create-new-app/get-app-path.js.map +0 -1
  120. package/esm/commands/create-new-app/index.d.ts +0 -2
  121. package/esm/commands/create-new-app/index.d.ts.map +0 -1
  122. package/esm/commands/create-new-app/index.js +0 -96
  123. package/esm/commands/create-new-app/index.js.map +0 -1
  124. package/esm/commands/create-new-app/types.d.ts +0 -16
  125. package/esm/commands/create-new-app/types.d.ts.map +0 -1
  126. package/esm/commands/create-warlock-app/index.d.ts +0 -3
  127. package/esm/commands/create-warlock-app/index.d.ts.map +0 -1
  128. package/esm/commands/create-warlock-app/index.js +0 -55
  129. package/esm/commands/create-warlock-app/index.js.map +0 -1
  130. package/esm/features/database-drivers.d.ts +0 -31
  131. package/esm/features/database-drivers.d.ts.map +0 -1
  132. package/esm/features/database-drivers.js +0 -53
  133. package/esm/features/database-drivers.js.map +0 -1
  134. package/esm/features/features-map.d.ts +0 -35
  135. package/esm/features/features-map.d.ts.map +0 -1
  136. package/esm/features/features-map.js +0 -120
  137. package/esm/features/features-map.js.map +0 -1
  138. package/esm/helpers/app.d.ts +0 -71
  139. package/esm/helpers/app.d.ts.map +0 -1
  140. package/esm/helpers/app.js +0 -196
  141. package/esm/helpers/app.js.map +0 -1
  142. package/esm/helpers/exec.d.ts +0 -10
  143. package/esm/helpers/exec.d.ts.map +0 -1
  144. package/esm/helpers/exec.js +0 -69
  145. package/esm/helpers/exec.js.map +0 -1
  146. package/esm/helpers/package-manager.d.ts +0 -18
  147. package/esm/helpers/package-manager.d.ts.map +0 -1
  148. package/esm/helpers/package-manager.js +0 -104
  149. package/esm/helpers/package-manager.js.map +0 -1
  150. package/esm/helpers/paths.d.ts +0 -4
  151. package/esm/helpers/paths.d.ts.map +0 -1
  152. package/esm/helpers/paths.js +0 -8
  153. package/esm/helpers/paths.js.map +0 -1
  154. package/esm/helpers/project-builder-helpers.d.ts +0 -6
  155. package/esm/helpers/project-builder-helpers.d.ts.map +0 -1
  156. package/esm/helpers/project-builder-helpers.js +0 -11
  157. package/esm/helpers/project-builder-helpers.js.map +0 -1
  158. package/esm/index.d.ts +0 -2
  159. package/esm/index.d.ts.map +0 -1
  160. package/esm/index.js +0 -3
  161. package/esm/index.js.map +0 -1
  162. package/esm/ui/banner.d.ts +0 -29
  163. package/esm/ui/banner.d.ts.map +0 -1
  164. package/esm/ui/banner.js.map +0 -1
  165. package/esm/ui/spinners.d.ts +0 -18
  166. package/esm/ui/spinners.d.ts.map +0 -1
  167. package/esm/ui/spinners.js +0 -17
  168. package/esm/ui/spinners.js.map +0 -1
  169. package/templates/warlock/src/app/auth/requests/login.request.ts +0 -4
  170. package/templates/warlock/src/app/auth/requests/reset-password.request.ts +0 -4
  171. package/templates/warlock/src/app/posts/requests/create-post.request.ts +0 -4
  172. package/templates/warlock/src/app/posts/requests/update-post.request.ts +0 -4
  173. package/templates/warlock/src/app/users/requests/create-user.request.ts +0 -4
@@ -1,10 +1,9 @@
1
- import { type RequestHandler } from "@warlock.js/core";
1
+ import { type GuardedRequestHandler } from "app/auth/requests/guarded.request";
2
2
  import { Post } from "../models/post/post.model";
3
- import { type CreatePostRequest } from "../requests/create-post.request";
4
- import { createPostSchema } from "../validation/create-post.schema";
3
+ import { type CreatePostSchema, createPostSchema } from "../schema/create-post.schema";
5
4
 
6
- export const createNewPostController: RequestHandler = async (
7
- request: CreatePostRequest,
5
+ export const createNewPostController: GuardedRequestHandler<CreatePostSchema> = async (
6
+ request,
8
7
  response,
9
8
  ) => {
10
9
  const post = await Post.create({
@@ -12,7 +11,7 @@ export const createNewPostController: RequestHandler = async (
12
11
  authorId: request.user.id,
13
12
  });
14
13
 
15
- return response.success({
14
+ return response.successCreate({
16
15
  post,
17
16
  });
18
17
  };
@@ -1,10 +1,9 @@
1
- import { type RequestHandler } from "@warlock.js/core";
1
+ import { type GuardedRequestHandler } from "app/auth/requests/guarded.request";
2
2
  import { Post } from "../models/post/post.model";
3
- import { type UpdatePostRequest } from "../requests/update-post.request";
4
- import { updatePostSchema } from "../validation/update-post.schema";
3
+ import { type UpdatePostSchema, updatePostSchema } from "../schema/update-post.schema";
5
4
 
6
- export const updatePostController: RequestHandler = async (
7
- request: UpdatePostRequest,
5
+ export const updatePostController: GuardedRequestHandler<UpdatePostSchema> = async (
6
+ request,
8
7
  response,
9
8
  ) => {
10
9
  const post = await Post.find(request.int("id"));
@@ -1,36 +1,23 @@
1
- import { Migration } from "@warlock.js/cascade";
1
+ import {
2
+ bool,
3
+ integer,
4
+ json,
5
+ Migration,
6
+ string,
7
+ text,
8
+ timestamp,
9
+ } from "@warlock.js/cascade";
2
10
  import { Post } from "../post.model";
3
11
 
4
- export default class PostsMigration extends Migration.for(Post) {
5
- public up() {
6
- // Create table
7
- this.createTableIfNotExists();
8
-
9
- // Primary key
10
- this.id();
11
-
12
- // Post fields
13
- this.string("title", 255);
14
- this.text("description");
15
- this.string("slug", 255).unique();
16
- this.string("image", 500).nullable();
17
-
18
- // Status
19
- this.boolean("isActive").default(true);
20
-
21
- this.int("authorId").notNullable();
22
-
23
- // Embedded user references (JSONB for PostgreSQL)
24
- this.json("createdBy").nullable();
25
- this.json("updatedBy").nullable();
26
- this.json("deletedBy").nullable();
27
-
28
- // Timestamps
29
- this.timestamps();
30
- this.timestamp("deletedAt").nullable();
31
- }
32
-
33
- public down() {
34
- this.dropTableIfExists();
35
- }
36
- }
12
+ export default Migration.create(Post, {
13
+ title: string(255),
14
+ description: text(),
15
+ slug: string(255).unique(),
16
+ image: string(500).nullable(),
17
+ isActive: bool(),
18
+ authorId: integer().notNullable(),
19
+ createdBy: json().nullable(),
20
+ updatedBy: json().nullable(),
21
+ deletedBy: json().nullable(),
22
+ deletedAt: timestamp().nullable(),
23
+ });
@@ -19,7 +19,5 @@ export class Post extends Model<PostSchema> {
19
19
 
20
20
  public static schema = postSchema;
21
21
 
22
- public static relations = {};
23
-
24
22
  public static resource = PostResource;
25
23
  }
@@ -1,4 +1,4 @@
1
- import { v, type Infer } from "@warlock.js/core";
1
+ import { type Infer, v } from "@warlock.js/seal";
2
2
 
3
3
  export const createPostSchema = v.object({
4
4
  title: v.string().required(),
@@ -1,4 +1,4 @@
1
- import { v, type Infer } from "@warlock.js/core";
1
+ import { type Infer, v } from "@warlock.js/seal";
2
2
 
3
3
  export const updatePostSchema = v.object({
4
4
  title: v.string().required(),
@@ -699,6 +699,40 @@ groupedTranslations("validation", {
699
699
  },
700
700
  });
701
701
 
702
+ // HTTP middleware error messages — surfaced by @warlock.js/core's built-in
703
+ // middleware (rateLimit, concurrencyLimit, maxBodySize, idempotency, maintenance,
704
+ // ipFilter). Keys are flat under the "http" group, mirroring the validation group.
705
+ groupedTranslations("http", {
706
+ rateLimitExceeded: {
707
+ en: "Too many requests. Please slow down and try again shortly.",
708
+ ar: "عدد كبير من الطلبات. يرجى التمهل وإعادة المحاولة قريباً.",
709
+ },
710
+ concurrencyLimitReached: {
711
+ en: "This endpoint is busy. Please retry in a moment.",
712
+ ar: "هذه النقطة الطرفية مشغولة. يرجى إعادة المحاولة بعد قليل.",
713
+ },
714
+ bodyTooLarge: {
715
+ en: "Request body is too large.",
716
+ ar: "حجم الطلب كبير جداً.",
717
+ },
718
+ idempotencyKeyInvalid: {
719
+ en: "Idempotency-Key header is malformed.",
720
+ ar: "ترويسة Idempotency-Key غير صالحة.",
721
+ },
722
+ idempotencyKeyConflict: {
723
+ en: "Idempotency-Key was reused with a different request body.",
724
+ ar: "تم إعادة استخدام Idempotency-Key مع طلب مختلف.",
725
+ },
726
+ ipForbidden: {
727
+ en: "Access denied for your IP address.",
728
+ ar: "تم رفض الوصول من عنوان IP الخاص بك.",
729
+ },
730
+ maintenance: {
731
+ en: "Service is temporarily unavailable for maintenance.",
732
+ ar: "الخدمة غير متاحة مؤقتاً للصيانة.",
733
+ },
734
+ });
735
+
702
736
  // Attributes translations
703
737
  groupedTranslations("attributes", {
704
738
  email: {
@@ -14,7 +14,7 @@ export function guardedAdmin(callback: () => void) {
14
14
  router.group(
15
15
  {
16
16
  prefix: "/admin",
17
- middleware: [authMiddleware()],
17
+ middleware: [authMiddleware([])],
18
18
  },
19
19
  callback,
20
20
  );
@@ -1,4 +1,4 @@
1
- import { fileExistsAsync } from "@mongez/fs";
1
+ import { fileExistsAsync } from "@warlock.js/fs";
2
2
  import { CACHE_FOR } from "@warlock.js/cache";
3
3
  import { Image, type RequestHandler, storage, v } from "@warlock.js/core";
4
4
 
@@ -1,8 +1,8 @@
1
- import { type RequestHandler } from "@warlock.js/core";
1
+ import { type GuardedRequestHandler } from "app/auth/requests/guarded.request";
2
2
  import { User } from "../models/user";
3
- import { createUserSchema } from "../validation/create-user.schema";
3
+ import { type CreateUserSchema, createUserSchema } from "../schema/create-user.schema";
4
4
 
5
- export const createNewUserController: RequestHandler = async (
5
+ export const createNewUserController: GuardedRequestHandler<CreateUserSchema> = async (
6
6
  request,
7
7
  response,
8
8
  ) => {
@@ -16,7 +16,7 @@ export const createNewUserController: RequestHandler = async (
16
16
  imageMetadata: await file.metadata(),
17
17
  });
18
18
 
19
- return response.success({
19
+ return response.successCreate({
20
20
  message: "File uploaded successfully",
21
21
  user,
22
22
  });
@@ -1,17 +1,8 @@
1
- import {
2
- type Request,
3
- type RequestHandler,
4
- type Response,
5
- } from "@warlock.js/core";
1
+ import { type GuardedRequestHandler } from "app/auth/requests/guarded.request";
6
2
  import { usersRepository } from "../repositories/users.repository";
7
3
 
8
- export const listUsersController: RequestHandler = async (
9
- request: Request,
10
- response: Response,
11
- ) => {
12
- const users = await usersRepository.listCached({
13
- ...request.all(),
14
- });
4
+ export const listUsersController: GuardedRequestHandler = async (request, response) => {
5
+ const users = await usersRepository.listCached(request.all());
15
6
 
16
7
  return response.success({
17
8
  users,
@@ -1,35 +1,15 @@
1
- import { Migration } from "@warlock.js/cascade";
1
+ import { bool, json, Migration, string, timestamp } from "@warlock.js/cascade";
2
2
  import { User } from "../user.model";
3
3
 
4
- export default class UsersMigration extends Migration.for(User) {
5
- public up() {
6
- // Create table
7
- this.createTableIfNotExists();
8
-
9
- // Primary key
10
- this.id(); // Creates "id" SERIAL PRIMARY KEY
11
-
12
- // User fields
13
- this.string("name", 255);
14
- this.string("email", 255).unique();
15
- this.string("password", 255);
16
- this.string("image", 500).nullable();
17
- this.json("imageMetadata").nullable();
18
-
19
- // Status
20
- this.boolean("isActive").default(true);
21
-
22
- // Embedded user references (JSONB for PostgreSQL)
23
- this.json("createdBy").nullable();
24
- this.json("updatedBy").nullable();
25
- this.json("deletedBy").nullable();
26
-
27
- // Timestamps (auto-managed by the model)
28
- this.timestamps(); // Creates createdAt and updatedAt
29
- this.timestamp("deletedAt").nullable(); // Soft deletes
30
- }
31
-
32
- public down() {
33
- this.dropTableIfExists();
34
- }
35
- }
4
+ export default Migration.create(User, {
5
+ name: string(255),
6
+ email: string(255).unique(),
7
+ password: string(255),
8
+ image: string(500).nullable(),
9
+ imageMetadata: json().nullable(),
10
+ isActive: bool(),
11
+ createdBy: json().nullable(),
12
+ updatedBy: json().nullable(),
13
+ deletedBy: json().nullable(),
14
+ deletedAt: timestamp().nullable(),
15
+ });
@@ -1,4 +1,4 @@
1
- import { v, type Infer } from "@warlock.js/core";
1
+ import { type Infer, v } from "@warlock.js/seal";
2
2
  import { User } from "../models/user";
3
3
 
4
4
  export const createUserSchema = v.object({
@@ -0,0 +1,2 @@
1
+ *
2
+ !.gitignore