@imksh/create 1.0.31 → 1.0.33

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 (158) hide show
  1. package/README.md +2 -0
  2. package/package.json +1 -1
  3. package/src/commands/create.js +2 -0
  4. package/src/index.js +1 -1
  5. package/templates/layers/next/javascript/package.json +8 -2
  6. package/templates/layers/next/typescript/.eslintrc.json +12 -0
  7. package/templates/layers/next/typescript/package.json +14 -3
  8. package/templates/layers/next/typescript/src/components/common/Loading.tsx +1 -1
  9. package/templates/layers/next/typescript/src/components/common/LottieIcon.tsx +2 -2
  10. package/templates/layers/next/typescript/src/components/common/Table.tsx +4 -4
  11. package/templates/layers/next/typescript/src/components/modals/ConfirmModal.tsx +2 -1
  12. package/templates/layers/next/typescript/src/components/ui/Header.tsx +2 -2
  13. package/templates/layers/next/typescript/src/hooks/usePwaInstall.ts +10 -4
  14. package/templates/layers/next/typescript/src/services/authService.ts +1 -1
  15. package/templates/layers/next/typescript/src/store/useAuthStore.ts +24 -9
  16. package/templates/layers/node/javascript/.env.example +3 -1
  17. package/templates/layers/node/javascript/package.json +12 -3
  18. package/templates/layers/node/javascript/src/app.js +2 -1
  19. package/templates/layers/node/javascript/src/controllers/auth.controller.js +106 -168
  20. package/templates/layers/node/javascript/src/controllers/push.controller.js +51 -58
  21. package/templates/layers/node/javascript/src/controllers/upload.controller.js +12 -19
  22. package/templates/layers/node/javascript/src/middleware/auth.middleware.js +5 -11
  23. package/templates/layers/node/javascript/src/middleware/errorHandler.js +6 -4
  24. package/templates/layers/node/javascript/src/routes/auth.route.js +2 -0
  25. package/templates/layers/node/javascript/src/services/auth.service.js +159 -164
  26. package/templates/layers/node/javascript/src/utils/ApiError.js +20 -0
  27. package/templates/layers/node/javascript/src/utils/SuccessResponse.js +15 -0
  28. package/templates/layers/node/javascript/src/utils/apiResponse.js +4 -0
  29. package/templates/layers/node/javascript/src/utils/asyncHandler.js +5 -0
  30. package/templates/layers/node/typescript/.env.example +3 -1
  31. package/templates/layers/node/typescript/.eslintrc.cjs +28 -0
  32. package/templates/layers/node/typescript/package.json +16 -2
  33. package/templates/layers/node/typescript/src/app.ts +3 -2
  34. package/templates/layers/node/typescript/src/config/db.ts +3 -2
  35. package/templates/layers/node/typescript/src/config/socket.ts +5 -4
  36. package/templates/layers/node/typescript/src/controllers/auth.controller.ts +104 -132
  37. package/templates/layers/node/typescript/src/controllers/push.controller.ts +52 -59
  38. package/templates/layers/node/typescript/src/controllers/upload.controller.ts +12 -19
  39. package/templates/layers/node/typescript/src/middleware/auth.middleware.ts +13 -7
  40. package/templates/layers/node/typescript/src/middleware/errorHandler.ts +18 -5
  41. package/templates/layers/node/typescript/src/middleware/rateLimiter.ts +2 -2
  42. package/templates/layers/node/typescript/src/routes/auth.route.ts +2 -0
  43. package/templates/layers/node/typescript/src/services/auth.service.ts +86 -43
  44. package/templates/layers/node/typescript/src/types/express.d.ts +5 -3
  45. package/templates/layers/node/typescript/src/utils/ApiError.ts +25 -0
  46. package/templates/layers/node/typescript/src/utils/SuccessResponse.ts +17 -0
  47. package/templates/layers/node/typescript/src/utils/apiResponse.ts +4 -0
  48. package/templates/layers/node/typescript/src/utils/asyncHandler.ts +13 -0
  49. package/templates/layers/node/typescript/src/utils/cloudinaryUpload.ts +18 -7
  50. package/templates/layers/node/typescript/src/utils/expoNotification.ts +1 -1
  51. package/templates/layers/node/typescript/src/utils/genOtpToken.ts +7 -1
  52. package/templates/layers/node/typescript/src/utils/jwt.ts +8 -2
  53. package/templates/layers/node/typescript/src/utils/logger.ts +2 -1
  54. package/templates/layers/node/typescript/src/utils/pushHelper.ts +13 -9
  55. package/templates/layers/node-prisma/javascript/.env.example +3 -1
  56. package/templates/layers/node-prisma/javascript/package.json +11 -2
  57. package/templates/layers/node-prisma/javascript/src/app.js +2 -1
  58. package/templates/layers/node-prisma/javascript/src/controllers/auth.controller.js +90 -135
  59. package/templates/layers/node-prisma/javascript/src/controllers/push.controller.js +64 -76
  60. package/templates/layers/node-prisma/javascript/src/controllers/upload.controller.js +12 -19
  61. package/templates/layers/node-prisma/javascript/src/middleware/auth.middleware.js +5 -4
  62. package/templates/layers/node-prisma/javascript/src/middleware/errorHandler.js +6 -4
  63. package/templates/layers/node-prisma/javascript/src/routes/auth.route.js +2 -0
  64. package/templates/layers/node-prisma/javascript/src/services/auth.service.js +145 -122
  65. package/templates/layers/node-prisma/javascript/src/utils/ApiError.js +20 -0
  66. package/templates/layers/node-prisma/javascript/src/utils/SuccessResponse.js +15 -0
  67. package/templates/layers/node-prisma/javascript/src/utils/apiResponse.js +4 -0
  68. package/templates/layers/node-prisma/javascript/src/utils/asyncHandler.js +5 -0
  69. package/templates/layers/node-prisma/typescript/.env.example +3 -1
  70. package/templates/layers/node-prisma/typescript/.eslintrc.cjs +28 -0
  71. package/templates/layers/node-prisma/typescript/package.json +19 -5
  72. package/templates/layers/node-prisma/typescript/src/app.ts +3 -2
  73. package/templates/layers/node-prisma/typescript/src/config/prisma.ts +3 -2
  74. package/templates/layers/node-prisma/typescript/src/config/socket.ts +5 -4
  75. package/templates/layers/node-prisma/typescript/src/controllers/auth.controller.ts +89 -105
  76. package/templates/layers/node-prisma/typescript/src/controllers/push.controller.ts +67 -83
  77. package/templates/layers/node-prisma/typescript/src/controllers/upload.controller.ts +12 -19
  78. package/templates/layers/node-prisma/typescript/src/middleware/auth.middleware.ts +9 -13
  79. package/templates/layers/node-prisma/typescript/src/middleware/errorHandler.ts +18 -5
  80. package/templates/layers/node-prisma/typescript/src/middleware/rateLimiter.ts +2 -2
  81. package/templates/layers/node-prisma/typescript/src/routes/auth.route.ts +2 -0
  82. package/templates/layers/node-prisma/typescript/src/services/auth.service.ts +83 -31
  83. package/templates/layers/node-prisma/typescript/src/types/express.d.ts +5 -3
  84. package/templates/layers/node-prisma/typescript/src/utils/ApiError.ts +25 -0
  85. package/templates/layers/node-prisma/typescript/src/utils/SuccessResponse.ts +17 -0
  86. package/templates/layers/node-prisma/typescript/src/utils/apiResponse.ts +4 -0
  87. package/templates/layers/node-prisma/typescript/src/utils/asyncHandler.ts +13 -0
  88. package/templates/layers/node-prisma/typescript/src/utils/cloudinaryUpload.ts +18 -7
  89. package/templates/layers/node-prisma/typescript/src/utils/genOtpToken.ts +7 -1
  90. package/templates/layers/node-prisma/typescript/src/utils/jwt.ts +8 -2
  91. package/templates/layers/node-prisma/typescript/src/utils/logger.ts +2 -1
  92. package/templates/layers/node-prisma/typescript/src/utils/pushHelper.ts +10 -6
  93. package/templates/layers/prisma/javascript/package.json +8 -0
  94. package/templates/layers/prisma/typescript/package.json +14 -1
  95. package/templates/layers/prisma/typescript/src/config/db.ts +3 -2
  96. package/templates/layers/react/javascript/package.json +6 -0
  97. package/templates/layers/react/typescript/.eslintrc.cjs +20 -0
  98. package/templates/layers/react/typescript/package.json +11 -2
  99. package/templates/layers/react/typescript/src/components/common/Table.tsx +4 -4
  100. package/templates/layers/react/typescript/src/components/ui/Sidebar.tsx +1 -1
  101. package/templates/layers/react/typescript/src/main.tsx +11 -11
  102. package/templates/layers/react/typescript/src/services/authService.ts +1 -1
  103. package/templates/layers/react/typescript/src/store/useAuthStore.ts +24 -9
  104. package/templates/layers/react-native/base/app.json +9 -22
  105. package/templates/layers/react-native/base/eslint.config.js +5 -1
  106. package/templates/layers/react-native/base/package.json +40 -33
  107. package/templates/layers/react-native/base/src/app/(auth)/edit-profile.tsx +7 -7
  108. package/templates/layers/react-native/base/src/app/(auth)/login.tsx +31 -7
  109. package/templates/layers/react-native/base/src/app/(tabs)/_layout.tsx +3 -3
  110. package/templates/layers/react-native/base/src/app/(tabs)/index.tsx +6 -5
  111. package/templates/layers/react-native/base/src/app/_layout.tsx +4 -8
  112. package/templates/layers/react-native/base/src/app/screens/doc-viewer.tsx +378 -0
  113. package/templates/layers/react-native/base/src/components/common/ConfirmationToast.tsx +58 -40
  114. package/templates/layers/react-native/base/src/components/common/GoogleAuthButton.tsx +123 -0
  115. package/templates/layers/react-native/base/src/components/common/LocationLoader.tsx +64 -9
  116. package/templates/layers/react-native/base/src/components/common/Typography.tsx +54 -19
  117. package/templates/layers/react-native/base/src/components/ui/BiometricLock.tsx +3 -3
  118. package/templates/layers/react-native/base/src/components/ui/ClassicTabBar.tsx +15 -12
  119. package/templates/layers/react-native/base/src/components/ui/CustomTabBar.tsx +90 -91
  120. package/templates/layers/react-native/base/src/components/ui/Drawer.tsx +344 -0
  121. package/templates/layers/react-native/base/src/components/ui/Sidebar.tsx +4 -4
  122. package/templates/layers/react-native/base/src/components/ui/buttons/Button.tsx +29 -6
  123. package/templates/layers/react-native/base/src/components/ui/data-display/Accordion.tsx +2 -2
  124. package/templates/layers/react-native/base/src/components/ui/data-display/Badge.tsx +1 -2
  125. package/templates/layers/react-native/base/src/components/ui/data-display/Image.tsx +3 -3
  126. package/templates/layers/react-native/base/src/components/ui/data-display/SwipeableRow.tsx +28 -7
  127. package/templates/layers/react-native/base/src/components/ui/feedback/GestureWrapper.tsx +11 -4
  128. package/templates/layers/react-native/base/src/components/ui/inputs/DatePicker.tsx +3 -3
  129. package/templates/layers/react-native/base/src/components/ui/inputs/ImagePickerModal.tsx +45 -19
  130. package/templates/layers/react-native/base/src/components/ui/inputs/Input.tsx +28 -9
  131. package/templates/layers/react-native/base/src/components/ui/inputs/SearchablePicker.tsx +199 -0
  132. package/templates/layers/react-native/base/src/components/ui/inputs/Switch.tsx +7 -7
  133. package/templates/layers/react-native/base/src/components/ui/inputs/WebLocationPicker.tsx +146 -72
  134. package/templates/layers/react-native/base/src/config/api.ts +5 -5
  135. package/templates/layers/react-native/base/src/services/auth.service.ts +3 -1
  136. package/templates/layers/react-native/base/src/services/permission.service.ts +168 -44
  137. package/templates/layers/react-native/base/src/services/socket.service.ts +0 -7
  138. package/templates/layers/react-native/base/src/store/useAuthStore.ts +61 -16
  139. package/templates/layers/react-native/base/src/store/useNotificationStore.ts +36 -42
  140. package/templates/layers/react-native/base/src/types/images.d.ts +7 -5
  141. package/templates/layers/react-native/base/src/utils/env.ts +47 -0
  142. package/templates/layers/react-native/base/src/utils/fileDownload.ts +206 -0
  143. package/templates/layers/react-native/base/src/utils/storage.ts +1 -1
  144. package/templates/presets/production-fullstack/overrides/client/package.json +9 -0
  145. package/templates/presets/production-fullstack/overrides/mobile/app.json +2 -15
  146. package/templates/presets/production-fullstack/overrides/mobile/package.json +39 -29
  147. package/templates/presets/production-fullstack/overrides/mobile/src/app/_layout.tsx +3 -3
  148. package/templates/presets/production-fullstack/overrides/mobile/src/components/ui/Drawer.tsx +344 -0
  149. package/templates/presets/production-fullstack/overrides/mobile/src/components/ui/inputs/DatePicker.tsx +3 -3
  150. package/templates/presets/production-fullstack/overrides/mobile/src/components/ui/inputs/ImagePickerModal.tsx +3 -3
  151. package/templates/presets/production-fullstack/overrides/mobile/src/services/permission.service.ts +168 -44
  152. package/templates/presets/production-fullstack/overrides/mobile/src/store/useNotificationStore.ts +16 -0
  153. package/templates/presets/production-fullstack/overrides/mobile/src/utils/env.ts +47 -0
  154. package/templates/presets/production-fullstack/overrides/server/package.json +11 -2
  155. package/templates/layers/react-native/base/src/app/doc-viewer.tsx +0 -193
  156. package/templates/layers/react-native/base/src/components/ui/BottomModal.tsx +0 -176
  157. package/templates/presets/production-fullstack/overrides/mobile/src/components/ui/BottomModal.tsx +0 -159
  158. /package/templates/layers/react-native/base/assets/images/logo/{logoWithBg.png → icon.png} +0 -0
package/README.md CHANGED
@@ -58,6 +58,8 @@ imksh create my-app --template next --skip-install
58
58
  - `next-ts`: Next.js App Router boilerplate with TypeScript.
59
59
  - `react-native`: Expo React Native template with NativeWind, Zustand, and React Navigation.
60
60
  - `mern-react-native`: Full-stack Expo React Native client + Express/Node server.
61
+ - `electron`: Electron + React boilerplate.
62
+ - `electron-ts`: Electron + React boilerplate with TypeScript.
61
63
 
62
64
  ## Adding Templates
63
65
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@imksh/create",
3
- "version": "1.0.31",
3
+ "version": "1.0.33",
4
4
  "description": "A production-ready create for scaffolding modern applications.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -39,6 +39,8 @@ export default async function createCommand(projectName, options) {
39
39
  'next-ts',
40
40
  'react-native',
41
41
  'mern-react-native',
42
+ 'electron',
43
+ 'electron-ts',
42
44
  'production-fullstack',
43
45
  'fullstack-prisma'
44
46
  ];
package/src/index.js CHANGED
@@ -24,7 +24,7 @@ program
24
24
  .argument("<project-name>", "Name of the project")
25
25
  .option(
26
26
  "-t, --template <template>",
27
- "Template to use (react, react-ts, node, node-ts, node-prisma, node-prisma-ts, mern, mern-ts, next, next-ts, react-native, mern-react-native, production-fullstack, fullstack-prisma)",
27
+ "Template to use (react, react-ts, node, node-ts, node-prisma, node-prisma-ts, mern, mern-ts, next, next-ts, react-native, mern-react-native, electron, electron-ts, production-fullstack, fullstack-prisma)",
28
28
  )
29
29
  .option("--skip-install", "Skip installing dependencies")
30
30
  .option("--no-git", "Skip initializing a git repository")
@@ -6,7 +6,11 @@
6
6
  "dev": "next dev",
7
7
  "build": "next build",
8
8
  "start": "next start",
9
- "lint": "next lint"
9
+ "lint": "next lint",
10
+ "lint:fix": "next lint --fix",
11
+ "format": "prettier --write \"src/**/*.{js,jsx,css,json}\"",
12
+ "format:check": "prettier --check \"src/**/*.{js,jsx,css,json}\"",
13
+ "circular-check": "dpdm --circular --no-warning --no-tree --exit-code circular:1 \"src/**/*.{js,jsx}\""
10
14
  },
11
15
  "dependencies": {
12
16
  "@ducanh2912/next-pwa": "latest",
@@ -27,7 +31,9 @@
27
31
  "zustand": "^4.5.2"
28
32
  },
29
33
  "devDependencies": {
34
+ "dpdm": "^3.14.0",
30
35
  "eslint": "^10.8.1",
31
- "eslint-config-next": "^16.3.0"
36
+ "eslint-config-next": "^16.3.0",
37
+ "prettier": "^3.4.2"
32
38
  }
33
39
  }
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": [
3
+ "next/core-web-vitals",
4
+ "plugin:@typescript-eslint/recommended"
5
+ ],
6
+ "parser": "@typescript-eslint/parser",
7
+ "plugins": ["@typescript-eslint"],
8
+ "rules": {
9
+ "@typescript-eslint/no-explicit-any": "error",
10
+ "no-console": "error"
11
+ }
12
+ }
@@ -6,7 +6,13 @@
6
6
  "dev": "next dev",
7
7
  "build": "next build",
8
8
  "start": "next start",
9
- "lint": "next lint"
9
+ "lint": "next lint",
10
+ "lint:fix": "next lint --fix",
11
+ "format": "prettier --write \"src/**/*.{ts,tsx,css,json}\"",
12
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,css,json}\"",
13
+ "circular-check": "dpdm --circular --no-warning --no-tree --exit-code circular:1 \"src/**/*.{ts,tsx}\"",
14
+ "ts-prune": "ts-prune",
15
+ "ts-purns": "ts-prune"
10
16
  },
11
17
  "dependencies": {
12
18
  "@ducanh2912/next-pwa": "latest",
@@ -30,8 +36,13 @@
30
36
  "@types/node": "^20",
31
37
  "@types/react": "^19.2.18",
32
38
  "@types/react-dom": "^19.2.4",
33
- "eslint": "^10.8.1",
34
- "eslint-config-next": "^16.3.0",
39
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
40
+ "@typescript-eslint/parser": "^8.0.0",
41
+ "dpdm": "^3.14.0",
42
+ "eslint": "^9.0.0",
43
+ "eslint-config-next": "^15.0.0",
44
+ "prettier": "^3.4.2",
45
+ "ts-prune": "^0.10.3",
35
46
  "typescript": "^5"
36
47
  }
37
48
  }
@@ -10,7 +10,7 @@ const Loading = ({
10
10
  }: {
11
11
  className?: string;
12
12
  bgClass?: string;
13
- animationData?: any;
13
+ animationData?: object;
14
14
  }) => {
15
15
  return (
16
16
  <div
@@ -10,12 +10,12 @@ const LottieIcon = memo(
10
10
  loop = true,
11
11
  autoplay = true,
12
12
  }: {
13
- animation: any;
13
+ animation: object;
14
14
  className?: string;
15
15
  loop?: boolean;
16
16
  autoplay?: boolean;
17
17
  }) => {
18
- const containerRef = useRef(null);
18
+ const containerRef = useRef<HTMLDivElement>(null);
19
19
 
20
20
  const isInView = useInView(containerRef, {
21
21
  once: true,
@@ -2,14 +2,14 @@
2
2
  import React, { useEffect, useRef } from "react";
3
3
  import { Pagination } from "./Pagination";
4
4
 
5
- export interface TableColumn<T = any> {
5
+ export interface TableColumn<T = Record<string, unknown>> {
6
6
  header: React.ReactNode | string;
7
7
  accessor?: keyof T | string;
8
- render?: (value: any, row: T, index: number) => React.ReactNode;
8
+ render?: (value: unknown, row: T, index: number) => React.ReactNode;
9
9
  headerClass?: string;
10
10
  }
11
11
 
12
- interface TableProps<T = any> {
12
+ interface TableProps<T = Record<string, unknown>> {
13
13
  columns: TableColumn<T>[];
14
14
  data: T[];
15
15
  loading?: boolean;
@@ -24,7 +24,7 @@ interface TableProps<T = any> {
24
24
  header?: React.ReactNode; // custom header content to render above the table
25
25
  }
26
26
 
27
- const Table = <T extends Record<string, any>>({
27
+ const Table = <T extends Record<string, unknown>>({
28
28
  columns = [],
29
29
  data = [],
30
30
  loading = false,
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { useEffect } from "react";
3
3
  import { createPortal } from "react-dom";
4
+ import { IconType } from "react-icons";
4
5
  import {
5
6
  FaTriangleExclamation,
6
7
  FaCircleInfo,
@@ -10,7 +11,7 @@ import {
10
11
 
11
12
  const variants: Record<
12
13
  "warning" | "error" | "success" | "info",
13
- { icon: any; iconBg: string; iconColor: string; button: string }
14
+ { icon: IconType; iconBg: string; iconColor: string; button: string }
14
15
  > = {
15
16
  warning: {
16
17
  icon: FaTriangleExclamation,
@@ -21,7 +21,7 @@ const Header = () => {
21
21
  const { user } = useAuthStore();
22
22
  const router = useRouter();
23
23
  const pathname = usePathname();
24
- const headerRef = useRef<HTMLHeadingElement>(null);
24
+ const headerRef = useRef<HTMLElement>(null);
25
25
 
26
26
  // Close mobile menu on scroll
27
27
  useEffect(() => {
@@ -44,7 +44,7 @@ const Header = () => {
44
44
  }, [setIsMobilemenuOpen]);
45
45
 
46
46
  return (
47
- <header ref={headerRef as any} className="sticky top-0 z-40 p-4">
47
+ <header ref={headerRef} className="sticky top-0 z-40 p-4">
48
48
  <div className="max-w-7xl mx-auto relative">
49
49
  {/* Main Navbar Bar */}
50
50
  <div className="bg-primary text-primary-content rounded-full shadow-lg px-5 py-2.5 flex items-center justify-between relative">
@@ -1,14 +1,20 @@
1
1
  import { useState, useEffect } from "react";
2
2
 
3
+ interface BeforeInstallPromptEvent extends Event {
4
+ prompt: () => Promise<void>;
5
+ userChoice: Promise<{ outcome: "accepted" | "dismissed"; platform: string }>;
6
+ }
7
+
3
8
  const usePwaInstall = () => {
4
9
  const [canInstall, setCanInstall] = useState(false);
5
10
  const [isInstalled, setIsInstalled] = useState(false);
6
- const [deferredPrompt, setDeferredPrompt] = useState<any>(null);
11
+ const [deferredPrompt, setDeferredPrompt] = useState<BeforeInstallPromptEvent | null>(null);
7
12
 
8
13
  useEffect(() => {
9
- const handleBeforeInstallPrompt = (e: any) => {
10
- e.preventDefault();
11
- setDeferredPrompt(e);
14
+ const handleBeforeInstallPrompt = (e: Event) => {
15
+ const event = e as BeforeInstallPromptEvent;
16
+ event.preventDefault();
17
+ setDeferredPrompt(event);
12
18
  setCanInstall(true);
13
19
  };
14
20
 
@@ -12,7 +12,7 @@ export const authService = {
12
12
 
13
13
  getMe: () => api.get("/auth/me"),
14
14
 
15
- updateMe: (data: any) => api.put("/auth/me", data),
15
+ updateMe: (data: FormData | Record<string, unknown>) => api.put("/auth/me", data),
16
16
 
17
17
  logout: () =>
18
18
  api.post("/auth/logout"),
@@ -7,6 +7,7 @@ export interface User {
7
7
  email: string;
8
8
  phone?: string;
9
9
  role: string;
10
+ orgRole?: string;
10
11
  avatar?: {
11
12
  url?: string;
12
13
  publicId?: string;
@@ -15,6 +16,20 @@ export interface User {
15
16
  updatedAt?: string;
16
17
  }
17
18
 
19
+ interface ApiErrorResponse {
20
+ response?: {
21
+ data?: {
22
+ message?: string;
23
+ };
24
+ };
25
+ message?: string;
26
+ }
27
+
28
+ const getErrorMessage = (err: unknown): string => {
29
+ const apiErr = err as ApiErrorResponse;
30
+ return apiErr.response?.data?.message || apiErr.message || "An unexpected error occurred";
31
+ };
32
+
18
33
  export interface AuthState {
19
34
  user: User | null;
20
35
  loading: boolean;
@@ -39,9 +54,9 @@ export const useAuthStore = create<AuthState>((set) => ({
39
54
  try {
40
55
  await authService.sendOtp(email);
41
56
  return true;
42
- } catch (err: any) {
57
+ } catch (err: unknown) {
43
58
  set({
44
- error: err.response?.data?.message || err.message,
59
+ error: getErrorMessage(err),
45
60
  loading: false,
46
61
  });
47
62
  return false;
@@ -62,9 +77,9 @@ export const useAuthStore = create<AuthState>((set) => ({
62
77
  loading: false,
63
78
  });
64
79
  return true;
65
- } catch (err: any) {
80
+ } catch (err: unknown) {
66
81
  set({
67
- error: err.response?.data?.message || err.message,
82
+ error: getErrorMessage(err),
68
83
  loading: false,
69
84
  });
70
85
  return false;
@@ -85,9 +100,9 @@ export const useAuthStore = create<AuthState>((set) => ({
85
100
  loading: false,
86
101
  });
87
102
  return true;
88
- } catch (err: any) {
103
+ } catch (err: unknown) {
89
104
  set({
90
- error: err.response?.data?.message || err.message,
105
+ error: getErrorMessage(err),
91
106
  loading: false,
92
107
  });
93
108
  return false;
@@ -101,7 +116,7 @@ export const useAuthStore = create<AuthState>((set) => ({
101
116
  try {
102
117
  const { data } = await authService.getMe();
103
118
  set({ user: data.data, isCheckingAuth: false });
104
- } catch (err: any) {
119
+ } catch {
105
120
  set({ isCheckingAuth: false });
106
121
  } finally {
107
122
  set({ isCheckingAuth: false });
@@ -114,9 +129,9 @@ export const useAuthStore = create<AuthState>((set) => ({
114
129
  const { data } = await authService.updateMe(updates);
115
130
  set({ user: data.data, loading: false });
116
131
  return true;
117
- } catch (err: any) {
132
+ } catch (err: unknown) {
118
133
  set({
119
- error: err.response?.data?.message || err.message,
134
+ error: getErrorMessage(err),
120
135
  loading: false,
121
136
  });
122
137
  return false;
@@ -59,4 +59,6 @@ RATE_LIMIT_MAX=100
59
59
  # ==========================
60
60
  VAPID_PRIVATE_KEY=
61
61
  VAPID_PUBLIC_KEY=
62
- VAPID_SUBJECT=mailto:noreply@example.com
62
+ VAPID_SUBJECT=mailto:noreply@example.com
63
+ # Google Auth
64
+ GOOGLE_CLIENT_ID=your-google-client-id
@@ -6,6 +6,11 @@
6
6
  "scripts": {
7
7
  "start": "node src/index.js",
8
8
  "dev": "nodemon src/index.js",
9
+ "lint": "eslint src/**/*.js",
10
+ "lint:fix": "eslint src/**/*.js --fix",
11
+ "format": "prettier --write \"src/**/*.{js,json}\"",
12
+ "format:check": "prettier --check \"src/**/*.{js,json}\"",
13
+ "circular-check": "dpdm --circular --no-warning --no-tree --exit-code circular:1 \"src/**/*.js\"",
9
14
  "generate:vapid": "node ./src/utils/generateVapidKeys.js"
10
15
  },
11
16
  "dependencies": {
@@ -25,9 +30,13 @@
25
30
  "nodemailer": "^6.9.7",
26
31
  "socket.io": "^4.7.2",
27
32
  "web-push": "^3.6.6",
28
- "expo-server-sdk": "^3.10.0"
33
+ "expo-server-sdk": "^3.10.0",
34
+ "google-auth-library": "^9.14.2"
29
35
  },
30
36
  "devDependencies": {
31
- "nodemon": "^3.0.1"
37
+ "dpdm": "^3.14.0",
38
+ "eslint": "^8.53.0",
39
+ "nodemon": "^3.0.1",
40
+ "prettier": "^3.4.2"
32
41
  }
33
- }
42
+ }
@@ -7,6 +7,7 @@ import morgan from "morgan";
7
7
  import apiRoutes from "./routes/index.js";
8
8
  import { notFound, errorHandler } from "./middleware/errorHandler.js";
9
9
  import { apiLimiter } from "./middleware/rateLimiter.js";
10
+ import { SuccessResponse } from "./utils/SuccessResponse.js";
10
11
 
11
12
  const app = express();
12
13
 
@@ -32,7 +33,7 @@ app.use("/api", apiRoutes);
32
33
 
33
34
  // Example health route
34
35
  app.get("/api/health", (req, res) => {
35
- res.status(200).json({ success: true, message: "API is running" });
36
+ SuccessResponse(res, 200, "API is running");
36
37
  });
37
38
 
38
39
  // Error handling middlewares