nodejs-structure-cli 1.0.2 → 1.0.3

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 (66) hide show
  1. package/lib/generator.js +1 -3
  2. package/package.json +1 -1
  3. package/templates/clean-architecture/js/src/domain/models/User.js.ejs +1 -1
  4. package/templates/clean-architecture/js/src/errors/ApiError.js +1 -1
  5. package/templates/clean-architecture/js/src/errors/BadRequestError.js +4 -4
  6. package/templates/clean-architecture/js/src/errors/NotFoundError.js +4 -4
  7. package/templates/clean-architecture/js/src/index.js.ejs +6 -8
  8. package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +5 -6
  9. package/templates/clean-architecture/js/src/infrastructure/log/logger.js +3 -3
  10. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.js.ejs +2 -2
  11. package/templates/clean-architecture/js/src/infrastructure/webserver/middleware/errorMiddleware.js +4 -4
  12. package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +28 -21
  13. package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.js.ejs +7 -3
  14. package/templates/clean-architecture/js/src/interfaces/controllers/userController.js.ejs +12 -12
  15. package/templates/clean-architecture/js/src/interfaces/controllers/userController.spec.js.ejs +13 -15
  16. package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +2 -2
  17. package/templates/clean-architecture/js/src/interfaces/graphql/index.js.ejs +4 -4
  18. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/index.js.ejs +3 -3
  19. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.js.ejs +2 -2
  20. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/index.js.ejs +3 -3
  21. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/user.types.js.ejs +1 -3
  22. package/templates/clean-architecture/js/src/interfaces/routes/api.js.ejs +6 -6
  23. package/templates/clean-architecture/js/src/usecases/CreateUser.js.ejs +2 -2
  24. package/templates/clean-architecture/js/src/usecases/DeleteUser.js +1 -1
  25. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +1 -1
  26. package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +5 -5
  27. package/templates/clean-architecture/js/src/usecases/UpdateUser.js.ejs +1 -1
  28. package/templates/clean-architecture/js/src/utils/errorMessages.js +1 -1
  29. package/templates/clean-architecture/js/src/utils/httpCodes.js +1 -1
  30. package/templates/common/SECURITY.md +18 -0
  31. package/templates/common/caching/clean/js/CreateUser.js.ejs +5 -5
  32. package/templates/common/caching/clean/js/DeleteUser.js.ejs +4 -4
  33. package/templates/common/caching/clean/js/GetAllUsers.js.ejs +4 -4
  34. package/templates/common/caching/clean/js/UpdateUser.js.ejs +4 -4
  35. package/templates/common/caching/js/memoryCache.js.ejs +3 -3
  36. package/templates/common/caching/js/redisClient.js.ejs +6 -4
  37. package/templates/common/ecosystem.config.js.ejs +1 -1
  38. package/templates/common/health/js/healthRoute.spec.js.ejs +10 -9
  39. package/templates/common/jest.config.js.ejs +1 -1
  40. package/templates/common/jest.e2e.config.js.ejs +4 -3
  41. package/templates/common/kafka/js/config/kafka.js +3 -3
  42. package/templates/common/kafka/js/messaging/baseConsumer.js.ejs +2 -2
  43. package/templates/common/kafka/js/messaging/userEventSchema.js.ejs +3 -3
  44. package/templates/common/kafka/js/messaging/welcomeEmailConsumer.js.ejs +6 -6
  45. package/templates/common/kafka/js/services/kafkaService.js.ejs +5 -7
  46. package/templates/common/kafka/js/utils/kafkaEvents.js.ejs +1 -3
  47. package/templates/common/migrate-mongo-config.js.ejs +2 -2
  48. package/templates/common/migrations/init.js.ejs +18 -20
  49. package/templates/common/scripts/run-e2e.js.ejs +6 -3
  50. package/templates/common/src/dummy.ts +3 -0
  51. package/templates/common/src/tests/e2e/e2e.users.test.js.ejs +1 -1
  52. package/templates/common/src/utils/errorMiddleware.spec.js.ejs +5 -6
  53. package/templates/common/tsconfig.json +2 -1
  54. package/templates/mvc/js/src/controllers/userController.spec.js.ejs +12 -12
  55. package/templates/mvc/js/src/errors/ApiError.js +1 -1
  56. package/templates/mvc/js/src/errors/BadRequestError.js +4 -4
  57. package/templates/mvc/js/src/errors/BadRequestError.spec.js.ejs +4 -4
  58. package/templates/mvc/js/src/errors/NotFoundError.js +4 -4
  59. package/templates/mvc/js/src/errors/NotFoundError.spec.js.ejs +4 -4
  60. package/templates/mvc/js/src/graphql/context.js.ejs +1 -1
  61. package/templates/mvc/js/src/graphql/index.js.ejs +4 -4
  62. package/templates/mvc/js/src/graphql/resolvers/index.js.ejs +3 -3
  63. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.js.ejs +2 -2
  64. package/templates/mvc/js/src/graphql/typeDefs/index.js.ejs +3 -3
  65. package/templates/mvc/js/src/graphql/typeDefs/user.types.js.ejs +2 -2
  66. package/templates/mvc/js/src/routes/api.spec.js.ejs +4 -4
@@ -1,5 +1,5 @@
1
- const NodeCache = require('node-cache');
2
- const logger = require('<%- loggerPath %>');
1
+ import NodeCache from 'node-cache';
2
+ import logger from '<%- loggerPath %>.js';
3
3
 
4
4
  class MemoryCacheService {
5
5
  constructor() {
@@ -57,4 +57,4 @@ class MemoryCacheService {
57
57
  }
58
58
  }
59
59
 
60
- module.exports = MemoryCacheService.getInstance();
60
+ export default MemoryCacheService.getInstance();
@@ -1,6 +1,8 @@
1
- const Redis = require('ioredis');
2
- require('dotenv').config();
3
- const logger = require('<%- loggerPath %>');
1
+ import Redis from 'ioredis';
2
+ import dotenv from 'dotenv';
3
+ import logger from '<%- loggerPath %>.js';
4
+
5
+ dotenv.config();
4
6
 
5
7
  class RedisService {
6
8
  constructor() {
@@ -72,4 +74,4 @@ class RedisService {
72
74
  }
73
75
  }
74
76
 
75
- module.exports = RedisService.getInstance();
77
+ export default RedisService.getInstance();
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  apps: [{
3
3
  name: "<%= projectName %>",
4
4
  script: "<% if (language === 'TypeScript') { %>./dist/index.js<% } else { %>./src/index.js<% } %>", // Entry point
@@ -1,13 +1,14 @@
1
- const request = require('supertest');
2
- const express = require('express');
1
+ import request from 'supertest';
2
+ import express from 'express';
3
3
  <% if (architecture === 'MVC') { -%>
4
- const healthRoute = require('@/routes/healthRoute');
4
+ import healthRoute from '@/routes/healthRoute.js';
5
5
  <% } else { -%>
6
- const healthRoute = require('@/interfaces/routes/healthRoute');
6
+ import healthRoute from '@/interfaces/routes/healthRoute.js';
7
7
  <% } -%>
8
- const HTTP_STATUS = require('@/utils/httpCodes');
8
+ import HTTP_STATUS from '@/utils/httpCodes.js';
9
9
 
10
10
  <%_ if (database === 'MongoDB') { -%>
11
+ import mongoose from 'mongoose';
11
12
  jest.mock('mongoose', () => {
12
13
  return {
13
14
  connection: {
@@ -21,9 +22,11 @@ jest.mock('mongoose', () => {
21
22
  };
22
23
  });
23
24
  <%_ } else if (database !== 'None') { -%>
24
- jest.mock('<% if (architecture === "MVC") { %>@/config/database<% } else { %>@/infrastructure/database/database<% } %>', () => {
25
+ import sequelize from '<% if (architecture === "MVC") { %>@/config/database.js<% } else { %>@/infrastructure/database/database.js<% } %>';
26
+ jest.mock('<% if (architecture === "MVC") { %>@/config/database.js<% } else { %>@/infrastructure/database/database.js<% } %>', () => {
25
27
  return {
26
- authenticate: jest.fn()
28
+ authenticate: jest.fn(),
29
+ sync: jest.fn()
27
30
  };
28
31
  });
29
32
  <%_ } -%>
@@ -46,7 +49,6 @@ describe('Health Route', () => {
46
49
 
47
50
  <%_ if (database === 'MongoDB') { -%>
48
51
  it('should handle database ping failure and return 500', async () => {
49
- const mongoose = require('mongoose');
50
52
  mongoose.connection.db.admin.mockReturnValueOnce({
51
53
  ping: jest.fn().mockRejectedValueOnce(new Error('DB Error'))
52
54
  });
@@ -58,7 +60,6 @@ describe('Health Route', () => {
58
60
  });
59
61
  <%_ } else if (database !== 'None') { -%>
60
62
  it('should handle database authentication failure and return 500', async () => {
61
- const sequelize = require('<% if (architecture === "MVC") { %>@/config/database<% } else { %>@/infrastructure/database/database<% } %>');
62
63
  sequelize.authenticate.mockRejectedValueOnce(new Error('DB Error'));
63
64
 
64
65
  const res = await request(app).get('/health');
@@ -1,4 +1,4 @@
1
- module.exports = {
1
+ export default {
2
2
  testEnvironment: 'node',
3
3
  coverageDirectory: 'coverage',
4
4
  collectCoverageFrom: ['src/**/*.{js,ts}'],
@@ -1,6 +1,7 @@
1
- <%_ if (language === 'TypeScript') { -%>/* eslint-disable @typescript-eslint/no-require-imports */<%_ } -%>
2
- module.exports = {
3
- ...require('./jest.config'),
1
+ import baseConfig from './jest.config.js';
2
+
3
+ export default {
4
+ ...baseConfig,
4
5
  testMatch: ['<rootDir>/tests/e2e/**/*.test.ts', '<rootDir>/tests/e2e/**/*.test.js'],
5
6
  testPathIgnorePatterns: ['/node_modules/'],
6
7
  testTimeout: 30000,
@@ -1,9 +1,9 @@
1
- const { Kafka } = require('kafkajs');
2
- const { env } = require('./env');
1
+ import { Kafka } from 'kafkajs';
2
+ import { env } from '../config/env.js';
3
3
 
4
4
  const kafka = new Kafka({
5
5
  clientId: 'nodejs-service',
6
6
  brokers: [env.KAFKA_BROKER]
7
7
  });
8
8
 
9
- module.exports = { kafka };
9
+ export { kafka };
@@ -1,4 +1,4 @@
1
- const logger = require('<%- loggerPath %>');
1
+ import logger from '<%- loggerPath %>.js';
2
2
 
3
3
  class BaseConsumer {
4
4
  constructor() {
@@ -27,4 +27,4 @@ class BaseConsumer {
27
27
  }
28
28
  }
29
29
 
30
- module.exports = BaseConsumer;
30
+ export default BaseConsumer;
@@ -1,5 +1,5 @@
1
- const { z } = require('zod');
2
- const { KAFKA_ACTIONS } = require('<%- kafkaEventsPath %>');
1
+ import { z } from 'zod';
2
+ import { KAFKA_ACTIONS } from '<%- kafkaEventsPath %>.js';
3
3
 
4
4
  const UserEventSchema = z.object({
5
5
  action: z.enum(Object.values(KAFKA_ACTIONS)),
@@ -9,4 +9,4 @@ const UserEventSchema = z.object({
9
9
  }),
10
10
  });
11
11
 
12
- module.exports = { UserEventSchema };
12
+ export { UserEventSchema };
@@ -1,8 +1,8 @@
1
- const BaseConsumer = require('<%- baseConsumerPath %>');
2
- const logger = require('<%- loggerPath %>');
3
- const { UserEventSchema } = require('<%- userEventSchemaPath %>');
4
- const ERROR_MESSAGES = require('<%- errorMessagesPath %>');
5
- const { KAFKA_ACTIONS } = require('<%- kafkaEventsPath %>');
1
+ import BaseConsumer from '<%- baseConsumerPath %>.js';
2
+ import logger from '<%- loggerPath %>.js';
3
+ import { UserEventSchema } from '<%- userEventSchemaPath %>.js';
4
+ import ERROR_MESSAGES from '<%- errorMessagesPath %>.js';
5
+ import { KAFKA_ACTIONS } from '<%- kafkaEventsPath %>.js';
6
6
 
7
7
  class WelcomeEmailConsumer extends BaseConsumer {
8
8
  constructor() {
@@ -41,4 +41,4 @@ class WelcomeEmailConsumer extends BaseConsumer {
41
41
  }
42
42
  }
43
43
 
44
- module.exports = WelcomeEmailConsumer;
44
+ export default WelcomeEmailConsumer;
@@ -1,5 +1,6 @@
1
- const { kafka } = require('../config/kafka');
2
- const logger = require('<% if (architecture === "Clean Architecture") { %>../log/logger<% } else { %>../utils/logger<% } %>');
1
+ import { kafka } from '../config/kafka.js';
2
+ import logger from '<% if (architecture === "Clean Architecture") { %>../log/logger.js<% } else { %>../utils/logger.js<% } %>';
3
+ import WelcomeEmailConsumer from '<% if (architecture === "Clean Architecture") { %>../../interfaces/messaging/consumers/instances/welcomeEmailConsumer.js<% } else { %>../messaging/consumers/instances/welcomeEmailConsumer.js<% } %>';
3
4
 
4
5
  let producer = null;
5
6
  let consumer = null;
@@ -14,10 +15,7 @@ const connectKafka = async (retries = 10) => {
14
15
  if (!consumer) consumer = kafka.consumer({ groupId: 'test-group' });
15
16
 
16
17
  let attempt = 0;
17
- // Auto-register WelcomeEmailConsumer if it exists
18
- // Note: Dynamic import used here for simplicity and to avoid startup crashes.
19
- // In enterprise production, consider using Dependency Injection.
20
- const WelcomeEmailConsumer = require('<% if (architecture === "Clean Architecture") { %>../../interfaces/messaging/consumers/instances/welcomeEmailConsumer<% } else { %>../messaging/consumers/instances/welcomeEmailConsumer<% } %>');
18
+
21
19
  while (attempt < retries) {
22
20
  try {
23
21
  await producer.connect();
@@ -90,4 +88,4 @@ const disconnectKafka = async () => {
90
88
  if (consumer) await consumer.disconnect();
91
89
  };
92
90
 
93
- module.exports = { connectKafka, sendMessage, disconnectKafka };
91
+ export { connectKafka, sendMessage, disconnectKafka };
@@ -1,7 +1,5 @@
1
- const KAFKA_ACTIONS = {
1
+ export const KAFKA_ACTIONS = {
2
2
  USER_CREATED: 'USER_CREATED',
3
3
  USER_UPDATED: 'USER_UPDATED',
4
4
  USER_DELETED: 'USER_DELETED',
5
5
  };
6
-
7
- module.exports = { KAFKA_ACTIONS };
@@ -25,7 +25,7 @@ const config = {
25
25
  useFileHash: false,
26
26
 
27
27
  // Don't change this, unless you know what you are doing
28
- moduleSystem: 'commonjs',
28
+ moduleSystem: 'esm',
29
29
  };
30
30
 
31
- module.exports = config;
31
+ export default config;
@@ -1,23 +1,21 @@
1
- module.exports = {
2
- async up(db, client) {
3
- const adminEmail = 'admin@example.com';
4
- const existingAdmin = await db.collection('users').findOne({ email: adminEmail });
1
+ export const up = async (db, client) => {
2
+ const adminEmail = 'admin@example.com';
3
+ const existingAdmin = await db.collection('users').findOne({ email: adminEmail });
5
4
 
6
- if (!existingAdmin) {
7
- await db.collection('users').insertOne({
8
- name: 'Admin User',
9
- email: adminEmail,
10
- createdAt: new Date(),
11
- updatedAt: new Date()
12
- });
13
- console.log('Admin User seeded successfully');
14
- } else {
15
- console.log('Admin User already exists, skipping seed');
16
- }
17
- },
18
-
19
- async down(db, client) {
20
- // Optional: Undo the seed. Usually for seeds we might want to keep data, but strictly speaking 'down' should reverse 'up'.
21
- // await db.collection('users').deleteOne({ email: 'admin@example.com' });
5
+ if (!existingAdmin) {
6
+ await db.collection('users').insertOne({
7
+ name: 'Admin User',
8
+ email: adminEmail,
9
+ createdAt: new Date(),
10
+ updatedAt: new Date()
11
+ });
12
+ console.log('Admin User seeded successfully');
13
+ } else {
14
+ console.log('Admin User already exists, skipping seed');
22
15
  }
23
16
  };
17
+
18
+ export const down = async (db, client) => {
19
+ // Optional: Undo the seed. Usually for seeds we might want to keep data, but strictly speaking 'down' should reverse 'up'.
20
+ // await db.collection('users').deleteOne({ email: 'admin@example.com' });
21
+ };
@@ -1,6 +1,9 @@
1
- /* eslint-disable */
2
- const { execSync } = require('child_process');
3
- const path = require('path');
1
+ import { execSync } from 'child_process';
2
+ import path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
4
7
 
5
8
  // Set a specific port for E2E tests to avoid collisions with local development
6
9
  process.env.PORT = '3001';
@@ -0,0 +1,3 @@
1
+ // This file exists to satisfy the TypeScript compiler in the template directory.
2
+ // It can be safely ignored or deleted in generated projects.
3
+ export const dummy = true;
@@ -1,4 +1,4 @@
1
- const request = require('supertest');
1
+ import request from 'supertest';
2
2
 
3
3
  const SERVER_URL = process.env.TEST_URL || `http://127.0.0.1:${process.env.PORT || 3001}`;
4
4
 
@@ -1,9 +1,9 @@
1
- const { errorMiddleware } = require('<% if (architecture === "MVC") { %>@/utils/errorMiddleware<% } else { %>@/infrastructure/webserver/middleware/errorMiddleware<% } %>');
2
- const { ApiError } = require('@/errors/ApiError');
3
- const HTTP_STATUS = require('@/utils/httpCodes');
4
- const logger = require('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
1
+ import { errorMiddleware } from '<% if (architecture === "MVC") { %>@/utils/errorMiddleware.js<% } else { %>@/infrastructure/webserver/middleware/errorMiddleware.js<% } %>';
2
+ import { ApiError } from '@/errors/ApiError.js';
3
+ import HTTP_STATUS from '@/utils/httpCodes.js';
4
+ import logger from '<% if (architecture === "MVC") { %>@/utils/logger.js<% } else { %>@/infrastructure/log/logger.js<% } %>';
5
5
 
6
- jest.mock('<% if (architecture === "MVC") { %>@/utils/logger<% } else { %>@/infrastructure/log/logger<% } %>');
6
+ jest.mock('<% if (architecture === "MVC") { %>@/utils/logger.js<% } else { %>@/infrastructure/log/logger.js<% } %>');
7
7
 
8
8
  describe('Error Middleware', () => {
9
9
  let mockRequest;
@@ -68,7 +68,6 @@ describe('Error Middleware', () => {
68
68
  });
69
69
 
70
70
  it('should handle error without stack trace', () => {
71
- const { ApiError } = require('@/errors/ApiError');
72
71
  const customError = new ApiError(500, 'No Stack', false);
73
72
  delete customError.stack;
74
73
  errorMiddleware(customError, mockRequest, mockResponse, nextFunction);
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "target": "es2020",
4
- "module": "commonjs",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
5
6
  "outDir": "./dist",
6
7
  "rootDir": "./src",
7
8
  "strict": true,
@@ -1,17 +1,17 @@
1
- const HTTP_STATUS = require('@/utils/httpCodes');
2
- const ERROR_MESSAGES = require('@/utils/errorMessages');
1
+ import HTTP_STATUS from '@/utils/httpCodes.js';
2
+ import ERROR_MESSAGES from '@/utils/errorMessages.js';
3
3
  <% if (communication !== 'GraphQL') { -%>
4
4
  // Express-only imports would go here
5
5
  <% } -%>
6
- const { getUsers, createUser, updateUser, deleteUser } = require('@/controllers/userController');
6
+ import { getUsers, createUser, updateUser, deleteUser } from '@/controllers/userController.js';
7
7
  <%_ if (caching === 'Redis') { -%>
8
- const cacheService = require('@/config/redisClient');
8
+ import cacheService from '@/config/redisClient.js';
9
9
  <%_ } else if (caching === 'Memory Cache') { -%>
10
- const cacheService = require('@/config/memoryCache');
10
+ import cacheService from '@/config/memoryCache.js';
11
11
  <%_ } -%>
12
12
 
13
13
  // Mock dependencies
14
- jest.mock('@/models/User', () => {
14
+ jest.mock('@/models/User.js', () => {
15
15
  return {
16
16
  create: jest.fn(),
17
17
  find: jest.fn(),
@@ -25,23 +25,23 @@ jest.mock('@/models/User', () => {
25
25
  mockData: []
26
26
  };
27
27
  });
28
- const User = require('@/models/User');
28
+ import User from '@/models/User.js';
29
29
  <%_ if (caching === 'Redis') { -%>
30
- jest.mock('@/config/redisClient', () => ({
30
+ jest.mock('@/config/redisClient.js', () => ({
31
31
  getOrSet: jest.fn((_key, fetcher) => fetcher()),
32
32
  del: jest.fn(),
33
33
  flush: jest.fn()
34
34
  }));
35
35
  <%_ } else if (caching === 'Memory Cache') { -%>
36
- jest.mock('@/config/memoryCache', () => ({
36
+ jest.mock('@/config/memoryCache.js', () => ({
37
37
  getOrSet: jest.fn((_key, fetcher) => fetcher()),
38
38
  del: jest.fn(),
39
39
  flush: jest.fn()
40
40
  }));
41
41
  <%_ } -%>
42
- jest.mock('@/utils/logger');
42
+ jest.mock('@/utils/logger.js');
43
43
  <%_ if (communication === 'Kafka') { -%>
44
- jest.mock('@/services/kafkaService', () => {
44
+ jest.mock('@/services/kafkaService.js', () => {
45
45
  const mockSendMessage = jest.fn().mockResolvedValue(undefined);
46
46
  return {
47
47
  sendMessage: mockSendMessage,
@@ -53,7 +53,7 @@ jest.mock('@/services/kafkaService', () => {
53
53
  }))
54
54
  };
55
55
  });
56
- const { sendMessage } = require('@/services/kafkaService');
56
+ import { sendMessage } from '@/services/kafkaService.js';
57
57
  <%_ } -%>
58
58
 
59
59
 
@@ -11,4 +11,4 @@ class ApiError extends Error {
11
11
  }
12
12
  }
13
13
 
14
- module.exports = { ApiError };
14
+ export { ApiError };
@@ -1,6 +1,6 @@
1
- const { ApiError } = require('./ApiError');
2
- const HTTP_STATUS = require('../utils/httpCodes');
3
- const ERROR_MESSAGES = require('../utils/errorMessages');
1
+ import { ApiError } from './ApiError.js';
2
+ import HTTP_STATUS from '../utils/httpCodes.js';
3
+ import ERROR_MESSAGES from '../utils/errorMessages.js';
4
4
 
5
5
  class BadRequestError extends ApiError {
6
6
  constructor(message = ERROR_MESSAGES.BAD_REQUEST) {
@@ -8,4 +8,4 @@ class BadRequestError extends ApiError {
8
8
  }
9
9
  }
10
10
 
11
- module.exports = { BadRequestError };
11
+ export { BadRequestError };
@@ -1,7 +1,7 @@
1
- const { BadRequestError } = require('@/errors/BadRequestError');
2
- const { ApiError } = require('@/errors/ApiError');
3
- const HTTP_STATUS = require('@/utils/httpCodes');
4
- const ERROR_MESSAGES = require('@/utils/errorMessages');
1
+ import { BadRequestError } from '@/errors/BadRequestError.js';
2
+ import { ApiError } from '@/errors/ApiError.js';
3
+ import HTTP_STATUS from '@/utils/httpCodes.js';
4
+ import ERROR_MESSAGES from '@/utils/errorMessages.js';
5
5
 
6
6
  describe('BadRequestError', () => {
7
7
  it('should extend ApiError', () => {
@@ -1,6 +1,6 @@
1
- const { ApiError } = require('./ApiError');
2
- const HTTP_STATUS = require('../utils/httpCodes');
3
- const ERROR_MESSAGES = require('../utils/errorMessages');
1
+ import { ApiError } from './ApiError.js';
2
+ import HTTP_STATUS from '../utils/httpCodes.js';
3
+ import ERROR_MESSAGES from '../utils/errorMessages.js';
4
4
 
5
5
  class NotFoundError extends ApiError {
6
6
  constructor(message = ERROR_MESSAGES.RESOURCE_NOT_FOUND) {
@@ -8,4 +8,4 @@ class NotFoundError extends ApiError {
8
8
  }
9
9
  }
10
10
 
11
- module.exports = { NotFoundError };
11
+ export { NotFoundError };
@@ -1,7 +1,7 @@
1
- const { NotFoundError } = require('@/errors/NotFoundError');
2
- const { ApiError } = require('@/errors/ApiError');
3
- const HTTP_STATUS = require('@/utils/httpCodes');
4
- const ERROR_MESSAGES = require('@/utils/errorMessages');
1
+ import { NotFoundError } from '@/errors/NotFoundError.js';
2
+ import { ApiError } from '@/errors/ApiError.js';
3
+ import HTTP_STATUS from '@/utils/httpCodes.js';
4
+ import ERROR_MESSAGES from '@/utils/errorMessages.js';
5
5
 
6
6
  describe('NotFoundError', () => {
7
7
  it('should extend ApiError', () => {
@@ -4,4 +4,4 @@ const gqlContext = async ({ req }) => {
4
4
  return { token };
5
5
  };
6
6
 
7
- module.exports = { gqlContext };
7
+ export { gqlContext };
@@ -1,5 +1,5 @@
1
- const { typeDefs } = require('./typeDefs');
2
- const { resolvers } = require('./resolvers');
3
- const { gqlContext } = require('./context');
1
+ import { typeDefs } from './typeDefs/index.js';
2
+ import { resolvers } from './resolvers/index.js';
3
+ import { gqlContext } from './context.js';
4
4
 
5
- module.exports = { typeDefs, resolvers, gqlContext };
5
+ export { typeDefs, resolvers, gqlContext };
@@ -1,6 +1,6 @@
1
- const { mergeResolvers } = require('@graphql-tools/merge');
2
- const { userResolvers } = require('./user.resolvers');
1
+ import { mergeResolvers } from '@graphql-tools/merge';
2
+ import { userResolvers } from './user.resolvers.js';
3
3
 
4
4
  const resolvers = mergeResolvers([userResolvers]);
5
5
 
6
- module.exports = { resolvers };
6
+ export { resolvers };
@@ -1,4 +1,4 @@
1
- const userController = require('../../controllers/userController');
1
+ import * as userController from '../../controllers/userController.js';
2
2
 
3
3
  const userResolvers = {
4
4
  Query: {
@@ -22,4 +22,4 @@ const userResolvers = {
22
22
  }<%_ } %>
23
23
  };
24
24
 
25
- module.exports = { userResolvers };
25
+ export { userResolvers };
@@ -1,6 +1,6 @@
1
- const { mergeTypeDefs } = require('@graphql-tools/merge');
2
- const { userTypes } = require('./user.types');
1
+ import { mergeTypeDefs } from '@graphql-tools/merge';
2
+ import { userTypes } from './user.types.js';
3
3
 
4
4
  const typeDefs = mergeTypeDefs([userTypes]);
5
5
 
6
- module.exports = { typeDefs };
6
+ export { typeDefs };
@@ -1,4 +1,4 @@
1
- const userTypes = `#graphql
1
+ export const userTypes = `#graphql
2
2
  type User {
3
3
  id: ID!
4
4
  name: String!
@@ -16,4 +16,4 @@ const userTypes = `#graphql
16
16
  }
17
17
  `;
18
18
 
19
- module.exports = { userTypes };
19
+
@@ -1,6 +1,6 @@
1
- const request = require('supertest');
2
- const express = require('express');
3
- const router = require('@/routes/api');
1
+ import request from 'supertest';
2
+ import express from 'express';
3
+ import router from '@/routes/api.js';
4
4
 
5
5
  const mockGetUsers = jest.fn().mockImplementation((req, res) => res.status(200).json([{ id: '1', name: 'John Doe' }]));
6
6
  const mockCreateUser = jest.fn().mockImplementation((req, res) => res.status(201).json({ id: '1', name: 'Test' }));
@@ -8,7 +8,7 @@ const mockCreateUser = jest.fn().mockImplementation((req, res) => res.status(201
8
8
  const mockUpdateUser = jest.fn().mockImplementation((req, res) => res.status(200).json({ id: '1', name: 'Updated' }));
9
9
  const mockDeleteUser = jest.fn().mockImplementation((req, res) => res.status(200).json({ message: 'User deleted successfully' }));
10
10
 
11
- jest.mock('@/controllers/userController', () => ({
11
+ jest.mock('@/controllers/userController.js', () => ({
12
12
  getUsers: (...args) => mockGetUsers(...args),
13
13
  createUser: (...args) => mockCreateUser(...args),
14
14
  updateUser: (...args) => mockUpdateUser(...args),