@hazeljs/cli 0.5.4 → 0.6.5

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 (117) hide show
  1. package/@template-ai-native/package.json +1 -1
  2. package/README.md +140 -588
  3. package/cli-manifest.json +940 -0
  4. package/dist/commands/add.d.ts +9 -0
  5. package/dist/commands/add.js +35 -126
  6. package/dist/commands/generate-app.js +17 -230
  7. package/dist/commands/generate-auth.d.ts +12 -0
  8. package/dist/commands/generate-auth.js +12 -0
  9. package/dist/commands/generate-crud.d.ts +12 -0
  10. package/dist/commands/generate-crud.js +12 -0
  11. package/dist/commands/generate-dto.d.ts +12 -0
  12. package/dist/commands/generate-dto.js +12 -0
  13. package/dist/commands/generate-module.d.ts +12 -0
  14. package/dist/commands/generate-module.js +12 -0
  15. package/dist/commands/generate-simple.d.ts +74 -0
  16. package/dist/commands/generate-simple.js +104 -0
  17. package/dist/commands/generate-simple.test.js +100 -0
  18. package/dist/commands/info.d.ts +12 -0
  19. package/dist/commands/info.js +12 -0
  20. package/dist/commands/templates.d.ts +34 -0
  21. package/dist/commands/templates.js +387 -0
  22. package/dist/index.d.ts +40 -0
  23. package/dist/index.js +50 -48
  24. package/dist/index.list.test.js +8 -22
  25. package/dist/index.test.js +19 -56
  26. package/dist/utils/generator-registry.d.ts +5 -0
  27. package/dist/utils/generator-registry.js +34 -65
  28. package/dist/utils/generator.d.ts +0 -1
  29. package/dist/utils/generator.js +0 -22
  30. package/dist/utils/generator.test.js +0 -28
  31. package/dist/utils/packages-registry.d.ts +34 -0
  32. package/dist/utils/packages-registry.js +380 -0
  33. package/package.json +7 -7
  34. package/dist/commands/build.d.ts +0 -2
  35. package/dist/commands/build.js +0 -52
  36. package/dist/commands/generate-agent.d.ts +0 -4
  37. package/dist/commands/generate-agent.js +0 -64
  38. package/dist/commands/generate-agent.test.js +0 -36
  39. package/dist/commands/generate-ai-service.d.ts +0 -4
  40. package/dist/commands/generate-ai-service.js +0 -54
  41. package/dist/commands/generate-ai-service.test.d.ts +0 -1
  42. package/dist/commands/generate-ai-service.test.js +0 -41
  43. package/dist/commands/generate-cache.d.ts +0 -4
  44. package/dist/commands/generate-cache.js +0 -66
  45. package/dist/commands/generate-cache.test.d.ts +0 -1
  46. package/dist/commands/generate-cache.test.js +0 -36
  47. package/dist/commands/generate-config.d.ts +0 -4
  48. package/dist/commands/generate-config.js +0 -59
  49. package/dist/commands/generate-config.test.d.ts +0 -1
  50. package/dist/commands/generate-config.test.js +0 -35
  51. package/dist/commands/generate-controller.d.ts +0 -4
  52. package/dist/commands/generate-controller.js +0 -66
  53. package/dist/commands/generate-controller.test.d.ts +0 -1
  54. package/dist/commands/generate-controller.test.js +0 -48
  55. package/dist/commands/generate-cron.d.ts +0 -4
  56. package/dist/commands/generate-cron.js +0 -61
  57. package/dist/commands/generate-cron.test.d.ts +0 -1
  58. package/dist/commands/generate-cron.test.js +0 -42
  59. package/dist/commands/generate-discovery.d.ts +0 -4
  60. package/dist/commands/generate-discovery.js +0 -63
  61. package/dist/commands/generate-discovery.test.d.ts +0 -1
  62. package/dist/commands/generate-discovery.test.js +0 -36
  63. package/dist/commands/generate-exception-filter.d.ts +0 -4
  64. package/dist/commands/generate-exception-filter.js +0 -54
  65. package/dist/commands/generate-exception-filter.test.d.ts +0 -1
  66. package/dist/commands/generate-exception-filter.test.js +0 -43
  67. package/dist/commands/generate-guard.d.ts +0 -4
  68. package/dist/commands/generate-guard.js +0 -42
  69. package/dist/commands/generate-guard.test.d.ts +0 -1
  70. package/dist/commands/generate-guard.test.js +0 -41
  71. package/dist/commands/generate-interceptor.d.ts +0 -4
  72. package/dist/commands/generate-interceptor.js +0 -43
  73. package/dist/commands/generate-interceptor.test.d.ts +0 -1
  74. package/dist/commands/generate-interceptor.test.js +0 -41
  75. package/dist/commands/generate-middleware.d.ts +0 -4
  76. package/dist/commands/generate-middleware.js +0 -47
  77. package/dist/commands/generate-middleware.test.d.ts +0 -1
  78. package/dist/commands/generate-middleware.test.js +0 -41
  79. package/dist/commands/generate-pipe.d.ts +0 -4
  80. package/dist/commands/generate-pipe.js +0 -39
  81. package/dist/commands/generate-pipe.test.d.ts +0 -1
  82. package/dist/commands/generate-pipe.test.js +0 -35
  83. package/dist/commands/generate-rag.d.ts +0 -4
  84. package/dist/commands/generate-rag.js +0 -68
  85. package/dist/commands/generate-rag.test.d.ts +0 -1
  86. package/dist/commands/generate-rag.test.js +0 -35
  87. package/dist/commands/generate-repository.d.ts +0 -4
  88. package/dist/commands/generate-repository.js +0 -46
  89. package/dist/commands/generate-repository.test.d.ts +0 -1
  90. package/dist/commands/generate-repository.test.js +0 -41
  91. package/dist/commands/generate-serverless-handler.d.ts +0 -4
  92. package/dist/commands/generate-serverless-handler.js +0 -57
  93. package/dist/commands/generate-serverless-handler.test.d.ts +0 -1
  94. package/dist/commands/generate-serverless-handler.test.js +0 -42
  95. package/dist/commands/generate-service.d.ts +0 -4
  96. package/dist/commands/generate-service.js +0 -58
  97. package/dist/commands/generate-service.test.d.ts +0 -1
  98. package/dist/commands/generate-service.test.js +0 -41
  99. package/dist/commands/generate-setup.d.ts +0 -4
  100. package/dist/commands/generate-setup.js +0 -187
  101. package/dist/commands/generate-setup.test.d.ts +0 -1
  102. package/dist/commands/generate-setup.test.js +0 -50
  103. package/dist/commands/generate-websocket-gateway.d.ts +0 -4
  104. package/dist/commands/generate-websocket-gateway.js +0 -53
  105. package/dist/commands/generate-websocket-gateway.test.d.ts +0 -1
  106. package/dist/commands/generate-websocket-gateway.test.js +0 -41
  107. package/dist/commands/pdf-to-audio.d.ts +0 -2
  108. package/dist/commands/pdf-to-audio.js +0 -170
  109. package/dist/commands/pdf-to-audio.test.d.ts +0 -1
  110. package/dist/commands/pdf-to-audio.test.js +0 -92
  111. package/dist/commands/start.d.ts +0 -2
  112. package/dist/commands/start.js +0 -61
  113. package/dist/commands/test.d.ts +0 -2
  114. package/dist/commands/test.js +0 -63
  115. package/dist/commands/utility-commands.test.d.ts +0 -1
  116. package/dist/commands/utility-commands.test.js +0 -95
  117. /package/dist/commands/{generate-agent.test.d.ts → generate-simple.test.d.ts} +0 -0
@@ -1,41 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_ai_service_1 = require("./generate-ai-service");
9
- jest.mock('fs');
10
- describe('generateAIService', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should register the ai-service command with alias', () => {
24
- (0, generate_ai_service_1.generateAIService)(program);
25
- const cmd = program.commands.find(c => c.name() === 'ai-service');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('ai');
28
- });
29
- it('should generate an AI service file with correct suffix', async () => {
30
- (0, generate_ai_service_1.generateAIService)(program);
31
- await program.parseAsync(['node', 'test', 'ai-service', 'chat']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('chat.ai-service.ts'), expect.stringContaining('ChatAIService'));
33
- });
34
- it('should import from @hazeljs/ai', async () => {
35
- (0, generate_ai_service_1.generateAIService)(program);
36
- await program.parseAsync(['node', 'test', 'ai-service', 'chat']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/ai'");
39
- expect(writtenContent).toContain('AIFunction');
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runCache(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateCache(command: Command): void;
@@ -1,66 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runCache = runCache;
4
- exports.generateCache = generateCache;
5
- const generator_1 = require("../utils/generator");
6
- const CACHE_SERVICE_TEMPLATE = `import { Service } from '@hazeljs/core';
7
- import { CacheService, Cacheable, CacheEvict } from '@hazeljs/cache';
8
-
9
- @Service()
10
- export class {{className}}CacheService {
11
- constructor(private readonly cacheService: CacheService) {}
12
-
13
- @Cacheable({ key: '{{fileName}}:all', ttl: 60 })
14
- async findAll() {
15
- // This result will be cached for 60 seconds
16
- return [];
17
- }
18
-
19
- @Cacheable({ key: '{{fileName}}:{{=<% %>=}}#{id}<%={{ }}=%>', ttl: 300 })
20
- async findOne(id: string) {
21
- // This result will be cached for 5 minutes
22
- return { id };
23
- }
24
-
25
- @CacheEvict({ key: '{{fileName}}:all' })
26
- async create(data: any) {
27
- // Creating a new item evicts the list cache
28
- return data;
29
- }
30
-
31
- async clearAll() {
32
- await this.cacheService.clear();
33
- }
34
- }
35
- `;
36
- class CacheServiceGenerator extends generator_1.Generator {
37
- constructor() {
38
- super(...arguments);
39
- this.suffix = 'cache';
40
- }
41
- getDefaultTemplate() {
42
- return CACHE_SERVICE_TEMPLATE;
43
- }
44
- }
45
- async function runCache(name, options) {
46
- const generator = new CacheServiceGenerator();
47
- const result = await generator.generate({ name, path: options.path, dryRun: options.dryRun });
48
- result.nextSteps = [
49
- 'npm install @hazeljs/cache',
50
- 'Add CacheModule to your module imports',
51
- 'Configure the cache strategy (memory, redis, or multi-tier)',
52
- ];
53
- return result;
54
- }
55
- function generateCache(command) {
56
- command
57
- .command('cache <name>')
58
- .description('Generate a cache service with decorators')
59
- .option('-p, --path <path>', 'Specify the path')
60
- .option('--dry-run', 'Preview files without writing them')
61
- .option('--json', 'Output result as JSON')
62
- .action(async (name, options) => {
63
- const result = await runCache(name, options);
64
- (0, generator_1.printGenerateResult)(result, { json: options.json });
65
- });
66
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,36 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_cache_1 = require("./generate-cache");
9
- jest.mock('fs');
10
- describe('generateCache', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should generate a cache service file', async () => {
24
- (0, generate_cache_1.generateCache)(program);
25
- await program.parseAsync(['node', 'test', 'cache', 'product']);
26
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('product.cache.ts'), expect.stringContaining('ProductCacheService'));
27
- });
28
- it('should import from @hazeljs/cache', async () => {
29
- (0, generate_cache_1.generateCache)(program);
30
- await program.parseAsync(['node', 'test', 'cache', 'product']);
31
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
32
- expect(writtenContent).toContain("from '@hazeljs/cache'");
33
- expect(writtenContent).toContain('@Cacheable');
34
- expect(writtenContent).toContain('@CacheEvict');
35
- });
36
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runConfig(_name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateConfig(command: Command): void;
@@ -1,59 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runConfig = runConfig;
4
- exports.generateConfig = generateConfig;
5
- const generator_1 = require("../utils/generator");
6
- const CONFIG_TEMPLATE = `import { HazelModule } from '@hazeljs/core';
7
- import { ConfigModule, ConfigService } from '@hazeljs/config';
8
-
9
- // Import ConfigModule.forRoot() in your app module:
10
- //
11
- // @HazelModule({
12
- // imports: [
13
- // ConfigModule.forRoot({
14
- // envFilePath: '.env',
15
- // }),
16
- // ],
17
- // })
18
- //
19
- // Then inject ConfigService wherever you need it:
20
- //
21
- // constructor(private readonly config: ConfigService) {}
22
- //
23
- // Usage:
24
- // this.config.get('DATABASE_URL');
25
- // this.config.get('PORT', '3000'); // with default value
26
-
27
- export { ConfigModule, ConfigService };
28
- `;
29
- class ConfigGenerator extends generator_1.Generator {
30
- constructor() {
31
- super(...arguments);
32
- this.suffix = 'config';
33
- }
34
- getDefaultTemplate() {
35
- return CONFIG_TEMPLATE;
36
- }
37
- }
38
- async function runConfig(_name, options) {
39
- const generator = new ConfigGenerator();
40
- const result = await generator.generate({ name: 'app', path: options.path, dryRun: options.dryRun });
41
- result.nextSteps = [
42
- 'npm install @hazeljs/config',
43
- 'Add ConfigModule.forRoot({ envFilePath: ".env" }) to your app module imports',
44
- 'Create a .env file in your project root',
45
- ];
46
- return result;
47
- }
48
- function generateConfig(command) {
49
- command
50
- .command('config')
51
- .description('Generate a config module setup')
52
- .option('-p, --path <path>', 'Specify the path', 'src')
53
- .option('--dry-run', 'Preview files without writing them')
54
- .option('--json', 'Output result as JSON')
55
- .action(async (options) => {
56
- const result = await runConfig('app', options);
57
- (0, generator_1.printGenerateResult)(result, { json: options.json });
58
- });
59
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,35 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_config_1 = require("./generate-config");
9
- jest.mock('fs');
10
- describe('generateConfig', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should generate a config module file', async () => {
24
- (0, generate_config_1.generateConfig)(program);
25
- await program.parseAsync(['node', 'test', 'config']);
26
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('app.config.ts'), expect.stringContaining('ConfigModule'));
27
- });
28
- it('should import from @hazeljs/config', async () => {
29
- (0, generate_config_1.generateConfig)(program);
30
- await program.parseAsync(['node', 'test', 'config']);
31
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
32
- expect(writtenContent).toContain("from '@hazeljs/config'");
33
- expect(writtenContent).toContain('ConfigService');
34
- });
35
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runController(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateController(program: Command): void;
@@ -1,66 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runController = runController;
4
- exports.generateController = generateController;
5
- const generator_1 = require("../utils/generator");
6
- const CONTROLLER_TEMPLATE = `import { Controller, Get, Post, Body, Param, Delete, Put } from '@hazeljs/core';
7
- import { {{className}}Service } from './{{fileName}}.service';
8
- import { Create{{className}}Dto } from './dto/create-{{fileName}}.dto';
9
- import { Update{{className}}Dto } from './dto/update-{{fileName}}.dto';
10
-
11
- @Controller('{{fileName}}')
12
- export class {{className}}Controller {
13
- constructor(private readonly {{camelName}}Service: {{className}}Service) {}
14
-
15
- @Get()
16
- findAll() {
17
- return this.{{camelName}}Service.findAll();
18
- }
19
-
20
- @Get(':id')
21
- findOne(@Param('id') id: string) {
22
- return this.{{camelName}}Service.findOne(id);
23
- }
24
-
25
- @Post()
26
- create(@Body(Create{{className}}Dto) createDto: Create{{className}}Dto) {
27
- return this.{{camelName}}Service.create(createDto);
28
- }
29
-
30
- @Put(':id')
31
- update(@Param('id') id: string, @Body(Update{{className}}Dto) updateDto: Update{{className}}Dto) {
32
- return this.{{camelName}}Service.update(id, updateDto);
33
- }
34
-
35
- @Delete(':id')
36
- remove(@Param('id') id: string) {
37
- return this.{{camelName}}Service.remove(id);
38
- }
39
- }
40
- `;
41
- class ControllerGenerator extends generator_1.Generator {
42
- constructor() {
43
- super(...arguments);
44
- this.suffix = 'controller';
45
- }
46
- getDefaultTemplate() {
47
- return CONTROLLER_TEMPLATE;
48
- }
49
- }
50
- async function runController(name, options) {
51
- const generator = new ControllerGenerator();
52
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
53
- }
54
- function generateController(program) {
55
- program
56
- .command('controller <name>')
57
- .description('Generate a new controller')
58
- .alias('c')
59
- .option('-p, --path <path>', 'Path where the controller should be generated')
60
- .option('--dry-run', 'Preview files without writing them')
61
- .option('--json', 'Output result as JSON')
62
- .action(async (name, options) => {
63
- const result = await runController(name, options);
64
- (0, generator_1.printGenerateResult)(result, { json: options.json });
65
- });
66
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,48 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_controller_1 = require("./generate-controller");
9
- jest.mock('fs');
10
- describe('generateController', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should register the controller command with alias', () => {
24
- (0, generate_controller_1.generateController)(program);
25
- const cmd = program.commands.find(c => c.name() === 'controller');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('c');
28
- });
29
- it('should generate a controller file with correct suffix', async () => {
30
- (0, generate_controller_1.generateController)(program);
31
- await program.parseAsync(['node', 'test', 'controller', 'user']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('user.controller.ts'), expect.stringContaining('UserController'));
33
- });
34
- it('should include proper imports from @hazeljs/core', async () => {
35
- (0, generate_controller_1.generateController)(program);
36
- await program.parseAsync(['node', 'test', 'controller', 'user']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/core'");
39
- expect(writtenContent).toContain('Controller');
40
- expect(writtenContent).toContain('Get');
41
- expect(writtenContent).toContain('Post');
42
- });
43
- it('should support --dry-run flag', async () => {
44
- (0, generate_controller_1.generateController)(program);
45
- await program.parseAsync(['node', 'test', 'controller', 'user', '--dry-run']);
46
- expect(mockFs.writeFileSync).not.toHaveBeenCalled();
47
- });
48
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runCron(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateCron(command: Command): void;
@@ -1,61 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runCron = runCron;
4
- exports.generateCron = generateCron;
5
- const generator_1 = require("../utils/generator");
6
- const CRON_SERVICE_TEMPLATE = `import { Service } from '@hazeljs/core';
7
- import { Cron, CronExpression } from '@hazeljs/cron';
8
-
9
- @Service()
10
- export class {{className}}CronService {
11
- @Cron(CronExpression.EVERY_MINUTE)
12
- handleEveryMinute() {
13
- console.log('[{{className}}Cron] Running every minute...');
14
- // Add your cron job logic here
15
- }
16
-
17
- @Cron('0 0 * * *') // Every day at midnight
18
- handleDaily() {
19
- console.log('[{{className}}Cron] Running daily task...');
20
- // Add your daily task logic here
21
- }
22
-
23
- @Cron(CronExpression.EVERY_HOUR)
24
- handleHourly() {
25
- console.log('[{{className}}Cron] Running hourly cleanup...');
26
- // Add your hourly task logic here
27
- }
28
- }
29
- `;
30
- class CronServiceGenerator extends generator_1.Generator {
31
- constructor() {
32
- super(...arguments);
33
- this.suffix = 'cron';
34
- }
35
- getDefaultTemplate() {
36
- return CRON_SERVICE_TEMPLATE;
37
- }
38
- }
39
- async function runCron(name, options) {
40
- const generator = new CronServiceGenerator();
41
- const result = await generator.generate({ name, path: options.path, dryRun: options.dryRun });
42
- result.nextSteps = [
43
- 'npm install @hazeljs/cron',
44
- 'Add CronModule to your module imports',
45
- 'Register this service as a provider',
46
- ];
47
- return result;
48
- }
49
- function generateCron(command) {
50
- command
51
- .command('cron <name>')
52
- .description('Generate a cron/scheduled job service')
53
- .alias('job')
54
- .option('-p, --path <path>', 'Specify the path')
55
- .option('--dry-run', 'Preview files without writing them')
56
- .option('--json', 'Output result as JSON')
57
- .action(async (name, options) => {
58
- const result = await runCron(name, options);
59
- (0, generator_1.printGenerateResult)(result, { json: options.json });
60
- });
61
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,42 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_cron_1 = require("./generate-cron");
9
- jest.mock('fs');
10
- describe('generateCron', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should register the cron command with alias', () => {
24
- (0, generate_cron_1.generateCron)(program);
25
- const cmd = program.commands.find(c => c.name() === 'cron');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('job');
28
- });
29
- it('should generate a cron service file', async () => {
30
- (0, generate_cron_1.generateCron)(program);
31
- await program.parseAsync(['node', 'test', 'cron', 'cleanup']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('cleanup.cron.ts'), expect.stringContaining('CleanupCronService'));
33
- });
34
- it('should import from @hazeljs/cron', async () => {
35
- (0, generate_cron_1.generateCron)(program);
36
- await program.parseAsync(['node', 'test', 'cron', 'cleanup']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/cron'");
39
- expect(writtenContent).toContain('@Cron');
40
- expect(writtenContent).toContain('CronExpression');
41
- });
42
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runDiscovery(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateDiscovery(command: Command): void;
@@ -1,63 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runDiscovery = runDiscovery;
4
- exports.generateDiscovery = generateDiscovery;
5
- const generator_1 = require("../utils/generator");
6
- const DISCOVERY_TEMPLATE = `import { Service } from '@hazeljs/core';
7
- import { ServiceRegistry, DiscoveryClient } from '@hazeljs/discovery';
8
-
9
- @Service()
10
- export class {{className}}DiscoveryService {
11
- constructor(
12
- private readonly registry: ServiceRegistry,
13
- private readonly client: DiscoveryClient,
14
- ) {}
15
-
16
- async registerService() {
17
- await this.registry.register({
18
- name: '{{fileName}}-service',
19
- host: 'localhost',
20
- port: 3000,
21
- metadata: {
22
- version: '1.0.0',
23
- },
24
- });
25
- }
26
-
27
- async discoverService(serviceName: string) {
28
- const instances = await this.client.getInstances(serviceName);
29
- return instances;
30
- }
31
- }
32
- `;
33
- class DiscoveryGenerator extends generator_1.Generator {
34
- constructor() {
35
- super(...arguments);
36
- this.suffix = 'discovery';
37
- }
38
- getDefaultTemplate() {
39
- return DISCOVERY_TEMPLATE;
40
- }
41
- }
42
- async function runDiscovery(name, options) {
43
- const generator = new DiscoveryGenerator();
44
- const result = await generator.generate({ name, path: options.path, dryRun: options.dryRun });
45
- result.nextSteps = [
46
- 'npm install @hazeljs/discovery',
47
- 'Register this service as a provider in your module',
48
- 'Configure your discovery backend (memory, redis, consul, or kubernetes)',
49
- ];
50
- return result;
51
- }
52
- function generateDiscovery(command) {
53
- command
54
- .command('discovery <name>')
55
- .description('Generate a service discovery setup')
56
- .option('-p, --path <path>', 'Specify the path')
57
- .option('--dry-run', 'Preview files without writing them')
58
- .option('--json', 'Output result as JSON')
59
- .action(async (name, options) => {
60
- const result = await runDiscovery(name, options);
61
- (0, generator_1.printGenerateResult)(result, { json: options.json });
62
- });
63
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,36 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const fs_1 = __importDefault(require("fs"));
7
- const commander_1 = require("commander");
8
- const generate_discovery_1 = require("./generate-discovery");
9
- jest.mock('fs');
10
- describe('generateDiscovery', () => {
11
- const mockFs = fs_1.default;
12
- let program;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- jest.spyOn(console, 'log').mockImplementation();
18
- program = new commander_1.Command();
19
- });
20
- afterEach(() => {
21
- jest.restoreAllMocks();
22
- });
23
- it('should generate a discovery service file', async () => {
24
- (0, generate_discovery_1.generateDiscovery)(program);
25
- await program.parseAsync(['node', 'test', 'discovery', 'app']);
26
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('app.discovery.ts'), expect.stringContaining('AppDiscoveryService'));
27
- });
28
- it('should import from @hazeljs/discovery', async () => {
29
- (0, generate_discovery_1.generateDiscovery)(program);
30
- await program.parseAsync(['node', 'test', 'discovery', 'app']);
31
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
32
- expect(writtenContent).toContain("from '@hazeljs/discovery'");
33
- expect(writtenContent).toContain('ServiceRegistry');
34
- expect(writtenContent).toContain('DiscoveryClient');
35
- });
36
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runExceptionFilter(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateExceptionFilter(program: Command): void;