@hazeljs/cli 0.5.4 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/@template-ai-native/package.json +1 -1
  2. package/README.md +122 -591
  3. package/dist/commands/add.js +26 -126
  4. package/dist/commands/generate-app.js +17 -230
  5. package/dist/commands/generate-simple.d.ts +27 -0
  6. package/dist/commands/generate-simple.js +448 -0
  7. package/dist/commands/generate-simple.test.js +100 -0
  8. package/dist/index.js +5 -47
  9. package/dist/index.list.test.js +8 -22
  10. package/dist/index.test.js +19 -56
  11. package/dist/utils/generator-registry.js +29 -65
  12. package/dist/utils/generator.d.ts +0 -1
  13. package/dist/utils/generator.js +0 -22
  14. package/dist/utils/generator.test.js +0 -28
  15. package/dist/utils/packages-registry.d.ts +25 -0
  16. package/dist/utils/packages-registry.js +371 -0
  17. package/package.json +3 -5
  18. package/dist/commands/build.d.ts +0 -2
  19. package/dist/commands/build.js +0 -52
  20. package/dist/commands/generate-agent.d.ts +0 -4
  21. package/dist/commands/generate-agent.js +0 -64
  22. package/dist/commands/generate-agent.test.js +0 -36
  23. package/dist/commands/generate-ai-service.d.ts +0 -4
  24. package/dist/commands/generate-ai-service.js +0 -54
  25. package/dist/commands/generate-ai-service.test.d.ts +0 -1
  26. package/dist/commands/generate-ai-service.test.js +0 -41
  27. package/dist/commands/generate-cache.d.ts +0 -4
  28. package/dist/commands/generate-cache.js +0 -66
  29. package/dist/commands/generate-cache.test.d.ts +0 -1
  30. package/dist/commands/generate-cache.test.js +0 -36
  31. package/dist/commands/generate-config.d.ts +0 -4
  32. package/dist/commands/generate-config.js +0 -59
  33. package/dist/commands/generate-config.test.d.ts +0 -1
  34. package/dist/commands/generate-config.test.js +0 -35
  35. package/dist/commands/generate-controller.d.ts +0 -4
  36. package/dist/commands/generate-controller.js +0 -66
  37. package/dist/commands/generate-controller.test.d.ts +0 -1
  38. package/dist/commands/generate-controller.test.js +0 -48
  39. package/dist/commands/generate-cron.d.ts +0 -4
  40. package/dist/commands/generate-cron.js +0 -61
  41. package/dist/commands/generate-cron.test.d.ts +0 -1
  42. package/dist/commands/generate-cron.test.js +0 -42
  43. package/dist/commands/generate-discovery.d.ts +0 -4
  44. package/dist/commands/generate-discovery.js +0 -63
  45. package/dist/commands/generate-discovery.test.d.ts +0 -1
  46. package/dist/commands/generate-discovery.test.js +0 -36
  47. package/dist/commands/generate-exception-filter.d.ts +0 -4
  48. package/dist/commands/generate-exception-filter.js +0 -54
  49. package/dist/commands/generate-exception-filter.test.d.ts +0 -1
  50. package/dist/commands/generate-exception-filter.test.js +0 -43
  51. package/dist/commands/generate-guard.d.ts +0 -4
  52. package/dist/commands/generate-guard.js +0 -42
  53. package/dist/commands/generate-guard.test.d.ts +0 -1
  54. package/dist/commands/generate-guard.test.js +0 -41
  55. package/dist/commands/generate-interceptor.d.ts +0 -4
  56. package/dist/commands/generate-interceptor.js +0 -43
  57. package/dist/commands/generate-interceptor.test.d.ts +0 -1
  58. package/dist/commands/generate-interceptor.test.js +0 -41
  59. package/dist/commands/generate-middleware.d.ts +0 -4
  60. package/dist/commands/generate-middleware.js +0 -47
  61. package/dist/commands/generate-middleware.test.d.ts +0 -1
  62. package/dist/commands/generate-middleware.test.js +0 -41
  63. package/dist/commands/generate-pipe.d.ts +0 -4
  64. package/dist/commands/generate-pipe.js +0 -39
  65. package/dist/commands/generate-pipe.test.d.ts +0 -1
  66. package/dist/commands/generate-pipe.test.js +0 -35
  67. package/dist/commands/generate-rag.d.ts +0 -4
  68. package/dist/commands/generate-rag.js +0 -68
  69. package/dist/commands/generate-rag.test.d.ts +0 -1
  70. package/dist/commands/generate-rag.test.js +0 -35
  71. package/dist/commands/generate-repository.d.ts +0 -4
  72. package/dist/commands/generate-repository.js +0 -46
  73. package/dist/commands/generate-repository.test.d.ts +0 -1
  74. package/dist/commands/generate-repository.test.js +0 -41
  75. package/dist/commands/generate-serverless-handler.d.ts +0 -4
  76. package/dist/commands/generate-serverless-handler.js +0 -57
  77. package/dist/commands/generate-serverless-handler.test.d.ts +0 -1
  78. package/dist/commands/generate-serverless-handler.test.js +0 -42
  79. package/dist/commands/generate-service.d.ts +0 -4
  80. package/dist/commands/generate-service.js +0 -58
  81. package/dist/commands/generate-service.test.d.ts +0 -1
  82. package/dist/commands/generate-service.test.js +0 -41
  83. package/dist/commands/generate-setup.d.ts +0 -4
  84. package/dist/commands/generate-setup.js +0 -187
  85. package/dist/commands/generate-setup.test.d.ts +0 -1
  86. package/dist/commands/generate-setup.test.js +0 -50
  87. package/dist/commands/generate-websocket-gateway.d.ts +0 -4
  88. package/dist/commands/generate-websocket-gateway.js +0 -53
  89. package/dist/commands/generate-websocket-gateway.test.d.ts +0 -1
  90. package/dist/commands/generate-websocket-gateway.test.js +0 -41
  91. package/dist/commands/pdf-to-audio.d.ts +0 -2
  92. package/dist/commands/pdf-to-audio.js +0 -170
  93. package/dist/commands/pdf-to-audio.test.d.ts +0 -1
  94. package/dist/commands/pdf-to-audio.test.js +0 -92
  95. package/dist/commands/start.d.ts +0 -2
  96. package/dist/commands/start.js +0 -61
  97. package/dist/commands/test.d.ts +0 -2
  98. package/dist/commands/test.js +0 -63
  99. package/dist/commands/utility-commands.test.d.ts +0 -1
  100. package/dist/commands/utility-commands.test.js +0 -95
  101. /package/dist/commands/{generate-agent.test.d.ts → generate-simple.test.d.ts} +0 -0
@@ -1,43 +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_exception_filter_1 = require("./generate-exception-filter");
9
- jest.mock('fs');
10
- describe('generateExceptionFilter', () => {
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 filter command with alias', () => {
24
- (0, generate_exception_filter_1.generateExceptionFilter)(program);
25
- const cmd = program.commands.find(c => c.name() === 'filter');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('f');
28
- });
29
- it('should generate a filter file with correct suffix', async () => {
30
- (0, generate_exception_filter_1.generateExceptionFilter)(program);
31
- await program.parseAsync(['node', 'test', 'filter', 'http']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('http.filter.ts'), expect.stringContaining('HttpExceptionFilter'));
33
- });
34
- it('should import correctly from @hazeljs/core', async () => {
35
- (0, generate_exception_filter_1.generateExceptionFilter)(program);
36
- await program.parseAsync(['node', 'test', 'filter', 'http']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/core'");
39
- expect(writtenContent).toContain('Catch');
40
- expect(writtenContent).toContain('logger');
41
- expect(writtenContent).not.toContain("import logger from");
42
- });
43
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runGuard(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateGuard(program: Command): void;
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runGuard = runGuard;
4
- exports.generateGuard = generateGuard;
5
- const generator_1 = require("../utils/generator");
6
- const GUARD_TEMPLATE = `import { Injectable, type CanActivate, type ExecutionContext } from '@hazeljs/core';
7
-
8
- @Injectable()
9
- export class {{className}}Guard implements CanActivate {
10
- canActivate(context: ExecutionContext): boolean {
11
- const request = context.switchToHttp().getRequest();
12
- // Add your guard logic here
13
- return true;
14
- }
15
- }
16
- `;
17
- class GuardGenerator extends generator_1.Generator {
18
- constructor() {
19
- super(...arguments);
20
- this.suffix = 'guard';
21
- }
22
- getDefaultTemplate() {
23
- return GUARD_TEMPLATE;
24
- }
25
- }
26
- async function runGuard(name, options) {
27
- const generator = new GuardGenerator();
28
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
29
- }
30
- function generateGuard(program) {
31
- program
32
- .command('guard <name>')
33
- .description('Generate a new guard')
34
- .alias('gu')
35
- .option('-p, --path <path>', 'Path where the guard should be generated')
36
- .option('--dry-run', 'Preview files without writing them')
37
- .option('--json', 'Output result as JSON')
38
- .action(async (name, options) => {
39
- const result = await runGuard(name, options);
40
- (0, generator_1.printGenerateResult)(result, { json: options.json });
41
- });
42
- }
@@ -1 +0,0 @@
1
- export {};
@@ -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_guard_1 = require("./generate-guard");
9
- jest.mock('fs');
10
- describe('generateGuard', () => {
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 guard command with alias', () => {
24
- (0, generate_guard_1.generateGuard)(program);
25
- const cmd = program.commands.find(c => c.name() === 'guard');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('gu');
28
- });
29
- it('should generate a guard file with correct suffix', async () => {
30
- (0, generate_guard_1.generateGuard)(program);
31
- await program.parseAsync(['node', 'test', 'guard', 'auth']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('auth.guard.ts'), expect.stringContaining('AuthGuard'));
33
- });
34
- it('should include CanActivate interface', async () => {
35
- (0, generate_guard_1.generateGuard)(program);
36
- await program.parseAsync(['node', 'test', 'guard', 'auth']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain('CanActivate');
39
- expect(writtenContent).toContain('canActivate');
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runInterceptor(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateInterceptor(program: Command): void;
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runInterceptor = runInterceptor;
4
- exports.generateInterceptor = generateInterceptor;
5
- const generator_1 = require("../utils/generator");
6
- const INTERCEPTOR_TEMPLATE = `import { Injectable, Interceptor, type ExecutionContext } from '@hazeljs/core';
7
-
8
- @Injectable()
9
- export class {{className}}Interceptor implements Interceptor {
10
- async intercept(context: ExecutionContext, next: () => Promise<unknown>): Promise<unknown> {
11
- // Pre-processing logic here (before handler execution)
12
- const result = await next();
13
- // Post-processing logic here (after handler execution)
14
- return result;
15
- }
16
- }
17
- `;
18
- class InterceptorGenerator extends generator_1.Generator {
19
- constructor() {
20
- super(...arguments);
21
- this.suffix = 'interceptor';
22
- }
23
- getDefaultTemplate() {
24
- return INTERCEPTOR_TEMPLATE;
25
- }
26
- }
27
- async function runInterceptor(name, options) {
28
- const generator = new InterceptorGenerator();
29
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
30
- }
31
- function generateInterceptor(program) {
32
- program
33
- .command('interceptor <name>')
34
- .description('Generate a new interceptor')
35
- .alias('i')
36
- .option('-p, --path <path>', 'Path where the interceptor should be generated')
37
- .option('--dry-run', 'Preview files without writing them')
38
- .option('--json', 'Output result as JSON')
39
- .action(async (name, options) => {
40
- const result = await runInterceptor(name, options);
41
- (0, generator_1.printGenerateResult)(result, { json: options.json });
42
- });
43
- }
@@ -1 +0,0 @@
1
- export {};
@@ -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_interceptor_1 = require("./generate-interceptor");
9
- jest.mock('fs');
10
- describe('generateInterceptor', () => {
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 interceptor command with alias', () => {
24
- (0, generate_interceptor_1.generateInterceptor)(program);
25
- const cmd = program.commands.find(c => c.name() === 'interceptor');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('i');
28
- });
29
- it('should generate an interceptor file with correct suffix', async () => {
30
- (0, generate_interceptor_1.generateInterceptor)(program);
31
- await program.parseAsync(['node', 'test', 'interceptor', 'logging']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('logging.interceptor.ts'), expect.stringContaining('LoggingInterceptor'));
33
- });
34
- it('should implement the Interceptor interface', async () => {
35
- (0, generate_interceptor_1.generateInterceptor)(program);
36
- await program.parseAsync(['node', 'test', 'interceptor', 'logging']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain('implements Interceptor');
39
- expect(writtenContent).toContain('intercept');
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runMiddleware(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateMiddleware(command: Command): void;
@@ -1,47 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runMiddleware = runMiddleware;
4
- exports.generateMiddleware = generateMiddleware;
5
- const generator_1 = require("../utils/generator");
6
- const MIDDLEWARE_TEMPLATE = `import { Injectable, type MiddlewareHandler, type Request, type Response, type NextFunction } from '@hazeljs/core';
7
-
8
- @Injectable()
9
- export class {{className}}Middleware implements MiddlewareHandler {
10
- use(req: Request, res: Response, next: NextFunction) {
11
- // Add your middleware logic here
12
- console.log(\`[{{className}}Middleware] \${req.method} \${req.url}\`);
13
-
14
- // Continue to next middleware
15
- next();
16
- }
17
- }
18
- `;
19
- class MiddlewareGenerator extends generator_1.Generator {
20
- constructor() {
21
- super(...arguments);
22
- this.suffix = 'middleware';
23
- }
24
- getDefaultTemplate() {
25
- return MIDDLEWARE_TEMPLATE;
26
- }
27
- }
28
- async function runMiddleware(name, options) {
29
- const generator = new MiddlewareGenerator();
30
- const result = await generator.generate({ name, path: options.path, dryRun: options.dryRun });
31
- result.nextSteps = result.nextSteps ?? [];
32
- result.nextSteps.push('Import the middleware in your module or apply it globally.');
33
- return result;
34
- }
35
- function generateMiddleware(command) {
36
- command
37
- .command('middleware <name>')
38
- .alias('mw')
39
- .description('Generate a middleware')
40
- .option('-p, --path <path>', 'Specify the path', 'src/middleware')
41
- .option('--dry-run', 'Preview files without writing them')
42
- .option('--json', 'Output result as JSON')
43
- .action(async (name, options) => {
44
- const result = await runMiddleware(name, options);
45
- (0, generator_1.printGenerateResult)(result, { json: options.json });
46
- });
47
- }
@@ -1 +0,0 @@
1
- export {};
@@ -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_middleware_1 = require("./generate-middleware");
9
- jest.mock('fs');
10
- describe('generateMiddleware', () => {
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 middleware command with alias', () => {
24
- (0, generate_middleware_1.generateMiddleware)(program);
25
- const cmd = program.commands.find(c => c.name() === 'middleware');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('mw');
28
- });
29
- it('should generate a middleware file with correct suffix', async () => {
30
- (0, generate_middleware_1.generateMiddleware)(program);
31
- await program.parseAsync(['node', 'test', 'middleware', 'logger']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('logger.middleware.ts'), expect.stringContaining('LoggerMiddleware'));
33
- });
34
- it('should import from @hazeljs/core not express', async () => {
35
- (0, generate_middleware_1.generateMiddleware)(program);
36
- await program.parseAsync(['node', 'test', 'middleware', 'logger']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/core'");
39
- expect(writtenContent).not.toContain("from 'express'");
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runPipe(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generatePipe(program: Command): void;
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runPipe = runPipe;
4
- exports.generatePipe = generatePipe;
5
- const generator_1 = require("../utils/generator");
6
- const PIPE_TEMPLATE = `import { type PipeTransform, type RequestContext } from '@hazeljs/core';
7
-
8
- export class {{className}}Pipe implements PipeTransform {
9
- transform(value: unknown, context: RequestContext): unknown {
10
- // Transform logic here
11
- return value;
12
- }
13
- }
14
- `;
15
- class PipeGenerator extends generator_1.Generator {
16
- constructor() {
17
- super(...arguments);
18
- this.suffix = 'pipe';
19
- }
20
- getDefaultTemplate() {
21
- return PIPE_TEMPLATE;
22
- }
23
- }
24
- async function runPipe(name, options) {
25
- const generator = new PipeGenerator();
26
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
27
- }
28
- function generatePipe(program) {
29
- program
30
- .command('pipe <name>')
31
- .description('Generate a new pipe')
32
- .option('-p, --path <path>', 'Path where the pipe should be generated')
33
- .option('--dry-run', 'Preview files without writing them')
34
- .option('--json', 'Output result as JSON')
35
- .action(async (name, options) => {
36
- const result = await runPipe(name, options);
37
- (0, generator_1.printGenerateResult)(result, { json: options.json });
38
- });
39
- }
@@ -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_pipe_1 = require("./generate-pipe");
9
- jest.mock('fs');
10
- describe('generatePipe', () => {
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 pipe file with correct suffix', async () => {
24
- (0, generate_pipe_1.generatePipe)(program);
25
- await program.parseAsync(['node', 'test', 'pipe', 'validation']);
26
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('validation.pipe.ts'), expect.stringContaining('ValidationPipe'));
27
- });
28
- it('should implement PipeTransform interface', async () => {
29
- (0, generate_pipe_1.generatePipe)(program);
30
- await program.parseAsync(['node', 'test', 'pipe', 'validation']);
31
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
32
- expect(writtenContent).toContain('PipeTransform');
33
- expect(writtenContent).toContain('transform');
34
- });
35
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runRag(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateRag(command: Command): void;
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runRag = runRag;
4
- exports.generateRag = generateRag;
5
- const generator_1 = require("../utils/generator");
6
- const RAG_SERVICE_TEMPLATE = `import { Service } from '@hazeljs/core';
7
- import { RAGPipeline, MemoryVectorStore } from '@hazeljs/rag';
8
-
9
- @Service()
10
- export class {{className}}RagService {
11
- private pipeline: RAGPipeline;
12
-
13
- constructor() {
14
- // Initialize with a memory vector store (swap for Pinecone, Qdrant, etc. in production)
15
- const vectorStore = new MemoryVectorStore();
16
-
17
- this.pipeline = new RAGPipeline({
18
- vectorStore,
19
- topK: 5,
20
- });
21
- }
22
-
23
- async addDocument(content: string, metadata?: Record<string, unknown>) {
24
- // Add a document to the vector store for retrieval
25
- await this.pipeline.addDocument({
26
- content,
27
- metadata: metadata || {},
28
- });
29
- }
30
-
31
- async query(question: string) {
32
- // Retrieve relevant documents and generate a response
33
- const results = await this.pipeline.query(question);
34
- return results;
35
- }
36
- }
37
- `;
38
- class RagServiceGenerator extends generator_1.Generator {
39
- constructor() {
40
- super(...arguments);
41
- this.suffix = 'rag';
42
- }
43
- getDefaultTemplate() {
44
- return RAG_SERVICE_TEMPLATE;
45
- }
46
- }
47
- async function runRag(name, options) {
48
- const generator = new RagServiceGenerator();
49
- const result = await generator.generate({ name, path: options.path, dryRun: options.dryRun });
50
- result.nextSteps = [
51
- 'npm install @hazeljs/rag',
52
- 'Register this service as a provider in your module',
53
- 'Configure your embedding provider and vector store',
54
- ];
55
- return result;
56
- }
57
- function generateRag(command) {
58
- command
59
- .command('rag <name>')
60
- .description('Generate a RAG (Retrieval-Augmented Generation) service')
61
- .option('-p, --path <path>', 'Specify the path')
62
- .option('--dry-run', 'Preview files without writing them')
63
- .option('--json', 'Output result as JSON')
64
- .action(async (name, options) => {
65
- const result = await runRag(name, options);
66
- (0, generator_1.printGenerateResult)(result, { json: options.json });
67
- });
68
- }
@@ -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_rag_1 = require("./generate-rag");
9
- jest.mock('fs');
10
- describe('generateRag', () => {
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 RAG service file', async () => {
24
- (0, generate_rag_1.generateRag)(program);
25
- await program.parseAsync(['node', 'test', 'rag', 'knowledge']);
26
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('knowledge.rag.ts'), expect.stringContaining('KnowledgeRagService'));
27
- });
28
- it('should import from @hazeljs/rag', async () => {
29
- (0, generate_rag_1.generateRag)(program);
30
- await program.parseAsync(['node', 'test', 'rag', 'knowledge']);
31
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
32
- expect(writtenContent).toContain("from '@hazeljs/rag'");
33
- expect(writtenContent).toContain('RAGPipeline');
34
- });
35
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runRepository(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateRepository(program: Command): void;
@@ -1,46 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runRepository = runRepository;
4
- exports.generateRepository = generateRepository;
5
- const generator_1 = require("../utils/generator");
6
- const REPOSITORY_TEMPLATE = `import { Repository, BaseRepository, PrismaService } from '@hazeljs/prisma';
7
-
8
- // @Repository implies @Injectable() — no need for both decorators
9
- @Repository({ model: '{{modelName}}' })
10
- export class {{className}}Repository extends BaseRepository<any> {
11
- constructor(prisma: PrismaService) {
12
- super(prisma, '{{modelName}}');
13
- }
14
-
15
- // Add custom repository methods here
16
- async findByName(name: string) {
17
- return this.findMany({ where: { name } });
18
- }
19
- }
20
- `;
21
- class RepositoryGenerator extends generator_1.Generator {
22
- constructor() {
23
- super(...arguments);
24
- this.suffix = 'repository';
25
- }
26
- getDefaultTemplate() {
27
- return REPOSITORY_TEMPLATE;
28
- }
29
- }
30
- async function runRepository(name, options) {
31
- const generator = new RepositoryGenerator();
32
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
33
- }
34
- function generateRepository(program) {
35
- program
36
- .command('repository <name>')
37
- .description('Generate a new Prisma repository')
38
- .alias('repo')
39
- .option('-p, --path <path>', 'Path where the repository should be generated')
40
- .option('--dry-run', 'Preview files without writing them')
41
- .option('--json', 'Output result as JSON')
42
- .action(async (name, options) => {
43
- const result = await runRepository(name, options);
44
- (0, generator_1.printGenerateResult)(result, { json: options.json });
45
- });
46
- }
@@ -1 +0,0 @@
1
- export {};
@@ -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_repository_1 = require("./generate-repository");
9
- jest.mock('fs');
10
- describe('generateRepository', () => {
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 repository command with alias', () => {
24
- (0, generate_repository_1.generateRepository)(program);
25
- const cmd = program.commands.find(c => c.name() === 'repository');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('repo');
28
- });
29
- it('should generate a repository file with correct suffix', async () => {
30
- (0, generate_repository_1.generateRepository)(program);
31
- await program.parseAsync(['node', 'test', 'repository', 'user']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('user.repository.ts'), expect.stringContaining('UserRepository'));
33
- });
34
- it('should import from @hazeljs/prisma', async () => {
35
- (0, generate_repository_1.generateRepository)(program);
36
- await program.parseAsync(['node', 'test', 'repository', 'user']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/prisma'");
39
- expect(writtenContent).toContain('BaseRepository');
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runServerlessHandler(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateServerlessHandler(program: Command): void;