@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,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runServerlessHandler = runServerlessHandler;
4
- exports.generateServerlessHandler = generateServerlessHandler;
5
- const generator_1 = require("../utils/generator");
6
- const SERVERLESS_LAMBDA_TEMPLATE = `import { createLambdaHandler } from '@hazeljs/serverless';
7
- import { AppModule } from './app.module';
8
-
9
- export const handler = createLambdaHandler(AppModule);
10
- `;
11
- const SERVERLESS_CLOUD_FUNCTION_TEMPLATE = `import { createCloudFunctionHandler } from '@hazeljs/serverless';
12
- import { AppModule } from './app.module';
13
-
14
- export const handler = createCloudFunctionHandler(AppModule);
15
- `;
16
- class ServerlessHandlerGenerator extends generator_1.Generator {
17
- constructor() {
18
- super(...arguments);
19
- this.suffix = 'handler';
20
- }
21
- getDefaultTemplate() {
22
- return SERVERLESS_LAMBDA_TEMPLATE;
23
- }
24
- async generate(options) {
25
- const { platform = 'lambda', ...restOptions } = options;
26
- const template = platform === 'lambda'
27
- ? SERVERLESS_LAMBDA_TEMPLATE
28
- : SERVERLESS_CLOUD_FUNCTION_TEMPLATE;
29
- return super.generate({
30
- ...restOptions,
31
- template,
32
- });
33
- }
34
- }
35
- async function runServerlessHandler(name, options) {
36
- const generator = new ServerlessHandlerGenerator();
37
- return generator.generate({
38
- name,
39
- path: options.path,
40
- platform: options.platform,
41
- dryRun: options.dryRun,
42
- });
43
- }
44
- function generateServerlessHandler(program) {
45
- program
46
- .command('serverless <name>')
47
- .description('Generate a serverless handler (Lambda or Cloud Function)')
48
- .alias('sls')
49
- .option('-p, --path <path>', 'Path where the handler should be generated', 'src')
50
- .option('--platform <platform>', 'Platform: lambda or cloud-function', 'lambda')
51
- .option('--dry-run', 'Preview files without writing them')
52
- .option('--json', 'Output result as JSON')
53
- .action(async (name, options) => {
54
- const result = await runServerlessHandler(name, options);
55
- (0, generator_1.printGenerateResult)(result, { json: options.json });
56
- });
57
- }
@@ -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_serverless_handler_1 = require("./generate-serverless-handler");
9
- jest.mock('fs');
10
- describe('generateServerlessHandler', () => {
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 serverless command with alias', () => {
24
- (0, generate_serverless_handler_1.generateServerlessHandler)(program);
25
- const cmd = program.commands.find(c => c.name() === 'serverless');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('sls');
28
- });
29
- it('should generate a lambda handler by default', async () => {
30
- (0, generate_serverless_handler_1.generateServerlessHandler)(program);
31
- await program.parseAsync(['node', 'test', 'serverless', 'api']);
32
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
33
- expect(writtenContent).toContain('createLambdaHandler');
34
- expect(writtenContent).toContain("from '@hazeljs/serverless'");
35
- });
36
- it('should generate a cloud function handler', async () => {
37
- (0, generate_serverless_handler_1.generateServerlessHandler)(program);
38
- await program.parseAsync(['node', 'test', 'serverless', 'api', '--platform', 'cloud-function']);
39
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
40
- expect(writtenContent).toContain('createCloudFunctionHandler');
41
- });
42
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runService(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateService(program: Command): void;
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runService = runService;
4
- exports.generateService = generateService;
5
- const generator_1 = require("../utils/generator");
6
- const SERVICE_TEMPLATE = `import { Service } from '@hazeljs/core';
7
-
8
- @Service()
9
- export class {{className}}Service {
10
- constructor() {}
11
-
12
- async findAll() {
13
- return [];
14
- }
15
-
16
- async findOne(id: string) {
17
- return { id };
18
- }
19
-
20
- async create(createDto: any) {
21
- return createDto;
22
- }
23
-
24
- async update(id: string, updateDto: any) {
25
- return { id, ...updateDto };
26
- }
27
-
28
- async remove(id: string) {
29
- return { id };
30
- }
31
- }
32
- `;
33
- class ServiceGenerator extends generator_1.Generator {
34
- constructor() {
35
- super(...arguments);
36
- this.suffix = 'service';
37
- }
38
- getDefaultTemplate() {
39
- return SERVICE_TEMPLATE;
40
- }
41
- }
42
- async function runService(name, options) {
43
- const generator = new ServiceGenerator();
44
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
45
- }
46
- function generateService(program) {
47
- program
48
- .command('service <name>')
49
- .description('Generate a new service')
50
- .alias('s')
51
- .option('-p, --path <path>', 'Path where the service should be generated')
52
- .option('--dry-run', 'Preview files without writing them')
53
- .option('--json', 'Output result as JSON')
54
- .action(async (name, options) => {
55
- const result = await runService(name, options);
56
- (0, generator_1.printGenerateResult)(result, { json: options.json });
57
- });
58
- }
@@ -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_service_1 = require("./generate-service");
9
- jest.mock('fs');
10
- describe('generateService', () => {
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 service command with alias', () => {
24
- (0, generate_service_1.generateService)(program);
25
- const cmd = program.commands.find(c => c.name() === 'service');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('s');
28
- });
29
- it('should generate a service file with correct suffix', async () => {
30
- (0, generate_service_1.generateService)(program);
31
- await program.parseAsync(['node', 'test', 'service', 'user']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('user.service.ts'), expect.stringContaining('UserService'));
33
- });
34
- it('should include Service decorator', async () => {
35
- (0, generate_service_1.generateService)(program);
36
- await program.parseAsync(['node', 'test', 'service', 'user']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain('@Service()');
39
- expect(writtenContent).toContain("from '@hazeljs/core'");
40
- });
41
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateCLIOptions, GenerateResult } from '../utils/generator';
3
- export declare function runSetup(pkg: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateSetup(program: Command): void;
@@ -1,187 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runSetup = runSetup;
4
- exports.generateSetup = generateSetup;
5
- const generator_1 = require("../utils/generator");
6
- function packageToNpmName(input) {
7
- if (input.startsWith('@hazeljs/'))
8
- return input;
9
- return `@hazeljs/${input}`;
10
- }
11
- function packageToTemplate(pkg) {
12
- const npmName = packageToNpmName(pkg);
13
- const short = npmName.replace('@hazeljs/', '');
14
- // Keep these templates intentionally minimal: a real import + a tiny “hello usage”
15
- // so users can immediately search/expand, without forcing a specific app structure.
16
- switch (short) {
17
- case 'swagger':
18
- return `import { SwaggerModule } from '@hazeljs/swagger';
19
- import { AppModule } from './app.module';
20
-
21
- // Setup Swagger once before creating your app:
22
- SwaggerModule.setRootModule(AppModule);
23
- `;
24
- case 'prisma':
25
- return `import { PrismaModule } from '@hazeljs/prisma';
26
-
27
- // Add PrismaModule to your HazelModule imports.
28
- export const prismaImports = [PrismaModule];
29
- `;
30
- case 'typeorm':
31
- return `import { TypeOrmModule } from '@hazeljs/typeorm';
32
-
33
- // Add TypeOrmModule to your HazelModule imports.
34
- export const typeormImports = [TypeOrmModule];
35
- `;
36
- case 'oauth':
37
- return `import { OAuthModule } from '@hazeljs/oauth';
38
-
39
- // Example (Google). Put secrets in env vars:
40
- // GOOGLE_CLIENT_ID=...
41
- // GOOGLE_CLIENT_SECRET=...
42
- // OAUTH_REDIRECT_URI=...
43
- export const oauthImports = [
44
- OAuthModule.forRoot({
45
- providers: {
46
- google: {
47
- clientId: process.env.GOOGLE_CLIENT_ID!,
48
- clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
49
- redirectUri: process.env.OAUTH_REDIRECT_URI!,
50
- },
51
- },
52
- }),
53
- ];
54
- `;
55
- case 'kafka':
56
- return `import { KafkaModule } from '@hazeljs/kafka';
57
-
58
- // Add KafkaModule to your HazelModule imports and configure brokers via env/config.
59
- export const kafkaImports = [KafkaModule];
60
- `;
61
- case 'grpc':
62
- return `import { GrpcModule } from '@hazeljs/grpc';
63
-
64
- // Add GrpcModule to your HazelModule imports. Define services in your module.
65
- export const grpcImports = [GrpcModule];
66
- `;
67
- case 'graphql':
68
- return `import { GraphQLModule } from '@hazeljs/graphql';
69
-
70
- // Add GraphQLModule to your HazelModule imports.
71
- export const graphqlImports = [GraphQLModule];
72
- `;
73
- case 'gateway':
74
- return `import { GatewayModule } from '@hazeljs/gateway';
75
-
76
- // Add GatewayModule to your HazelModule imports.
77
- export const gatewayImports = [GatewayModule];
78
- `;
79
- case 'event-emitter':
80
- return `import { EventEmitterModule } from '@hazeljs/event-emitter';
81
-
82
- // Add EventEmitterModule.forRoot() to your HazelModule imports.
83
- export const eventEmitterImports = [EventEmitterModule.forRoot()];
84
- `;
85
- case 'audit':
86
- return `import { AuditModule, ConsoleAuditTransport } from '@hazeljs/audit';
87
-
88
- // Add AuditModule.forRoot(...) to your HazelModule imports.
89
- export const auditImports = [AuditModule.forRoot({ transports: [new ConsoleAuditTransport()] })];
90
- `;
91
- case 'queue':
92
- return `import { QueueModule } from '@hazeljs/queue';
93
-
94
- // Add QueueModule to your HazelModule imports. Configure Redis / BullMQ via env/config.
95
- export const queueImports = [QueueModule];
96
- `;
97
- case 'messaging':
98
- return `import { MessagingModule } from '@hazeljs/messaging';
99
-
100
- // Add MessagingModule to your HazelModule imports. Configure channels (WhatsApp/Telegram) via env/config.
101
- export const messagingImports = [MessagingModule];
102
- `;
103
- case 'mcp':
104
- return `import { createMcpServer } from '@hazeljs/mcp';
105
-
106
- // Minimal MCP server example:
107
- const server = createMcpServer({ name: 'hazel-mcp', version: '0.1.0' });
108
- server.start();
109
- `;
110
- case 'prompts':
111
- return `import { PromptTemplate } from '@hazeljs/prompts';
112
-
113
- export const helloPrompt = new PromptTemplate({
114
- name: 'hello',
115
- template: 'Hello {{name}}',
116
- });
117
- `;
118
- case 'data':
119
- return `import { DataModule } from '@hazeljs/data';
120
-
121
- // Add DataModule.forRoot() to your HazelModule imports.
122
- export const dataImports = [DataModule.forRoot()];
123
- `;
124
- case 'ml':
125
- return `import { MLModule } from '@hazeljs/ml';
126
-
127
- // Add MLModule.forRoot() to your HazelModule imports.
128
- export const mlImports = [MLModule.forRoot()];
129
- `;
130
- case 'resilience':
131
- return `import { CircuitBreaker, WithRetry } from '@hazeljs/resilience';
132
-
133
- export class ExampleResilienceService {
134
- @WithRetry({ retries: 3 })
135
- @CircuitBreaker({ failureThreshold: 5, resetTimeoutMs: 10000 })
136
- async callRemote(): Promise<string> {
137
- return 'ok';
138
- }
139
- }
140
- `;
141
- case 'pdf-to-audio':
142
- return `import { PdfToAudioModule } from '@hazeljs/pdf-to-audio';
143
-
144
- // Add PdfToAudioModule to your HazelModule imports.
145
- export const pdfToAudioImports = [PdfToAudioModule];
146
- `;
147
- default:
148
- return `import '${npmName}';
149
-
150
- // Starter file generated for ${npmName}.
151
- // Tip: check the package README for setup details and examples.
152
- `;
153
- }
154
- }
155
- class SetupGenerator extends generator_1.Generator {
156
- constructor() {
157
- super(...arguments);
158
- this.suffix = 'setup';
159
- }
160
- }
161
- async function runSetup(pkg, options) {
162
- const npmName = packageToNpmName(pkg);
163
- const template = packageToTemplate(pkg);
164
- const generator = new SetupGenerator();
165
- const result = await generator.generate({
166
- name: pkg,
167
- path: options.path,
168
- template,
169
- dryRun: options.dryRun,
170
- });
171
- result.nextSteps = result.nextSteps ?? [];
172
- result.nextSteps.push(`npm install ${npmName}`);
173
- return result;
174
- }
175
- function generateSetup(program) {
176
- program
177
- .command('setup <package>')
178
- .description('Generate a minimal setup starter file for a HazelJS package')
179
- .alias('st')
180
- .option('-p, --path <path>', 'Path where the setup file should be generated', 'src')
181
- .option('--dry-run', 'Preview files without writing them')
182
- .option('--json', 'Output result as JSON')
183
- .action(async (pkg, options) => {
184
- const result = await runSetup(pkg, options);
185
- (0, generator_1.printGenerateResult)(result, { json: options.json });
186
- });
187
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,50 +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 path_1 = __importDefault(require("path"));
8
- const generate_setup_1 = require("./generate-setup");
9
- const commander_1 = require("commander");
10
- jest.mock('fs');
11
- describe('generateSetup', () => {
12
- const mockFs = fs_1.default;
13
- beforeEach(() => {
14
- jest.clearAllMocks();
15
- mockFs.existsSync.mockReturnValue(true);
16
- mockFs.writeFileSync.mockImplementation(() => { });
17
- mockFs.mkdirSync.mockImplementation(() => undefined);
18
- });
19
- it('should register setup command with alias', () => {
20
- const program = new commander_1.Command();
21
- (0, generate_setup_1.generateSetup)(program);
22
- const cmd = program.commands.find((c) => c.name() === 'setup');
23
- expect(cmd).toBeTruthy();
24
- expect(cmd?.aliases()).toContain('st');
25
- });
26
- it('runSetup should generate a setup file and include npm install in next steps', async () => {
27
- const result = await (0, generate_setup_1.runSetup)('swagger', { path: 'src', dryRun: false });
28
- expect(result.ok).toBe(true);
29
- expect(result.created).toHaveLength(1);
30
- expect(result.created[0]).toBe(path_1.default.join(process.cwd(), 'src', 'swagger.setup.ts'));
31
- expect(result.nextSteps?.some((s) => s.includes('npm install @hazeljs/swagger'))).toBe(true);
32
- });
33
- it('runSetup should accept package names with and without @hazeljs prefix', async () => {
34
- const r1 = await (0, generate_setup_1.runSetup)('oauth', { path: 'src', dryRun: true });
35
- expect(r1.ok).toBe(true);
36
- expect(r1.dryRun).toBe(true);
37
- expect(r1.nextSteps?.some((s) => s.includes('npm install @hazeljs/oauth'))).toBe(true);
38
- const r2 = await (0, generate_setup_1.runSetup)('@hazeljs/oauth', { path: 'src', dryRun: true });
39
- expect(r2.ok).toBe(true);
40
- expect(r2.nextSteps?.some((s) => s.includes('npm install @hazeljs/oauth'))).toBe(true);
41
- });
42
- it('covers several common setup templates', async () => {
43
- const pkgs = ['grpc', 'graphql', 'kafka', 'resilience', 'mcp', 'pdf-to-audio'];
44
- for (const p of pkgs) {
45
- const result = await (0, generate_setup_1.runSetup)(p, { path: 'src', dryRun: true });
46
- expect(result.ok).toBe(true);
47
- expect(result.created[0]).toContain(`${p}.setup.ts`);
48
- }
49
- });
50
- });
@@ -1,4 +0,0 @@
1
- import { Command } from 'commander';
2
- import { GenerateResult, GenerateCLIOptions } from '../utils/generator';
3
- export declare function runWebSocketGateway(name: string, options: GenerateCLIOptions): Promise<GenerateResult>;
4
- export declare function generateWebSocketGateway(program: Command): void;
@@ -1,53 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.runWebSocketGateway = runWebSocketGateway;
4
- exports.generateWebSocketGateway = generateWebSocketGateway;
5
- const generator_1 = require("../utils/generator");
6
- const WEBSOCKET_GATEWAY_TEMPLATE = `import { Realtime, OnConnect, OnDisconnect, OnMessage, Subscribe, Client, Data, WebSocketClient } from '@hazeljs/websocket';
7
-
8
- @Realtime('/{{fileName}}')
9
- export class {{className}}Gateway {
10
- @OnConnect()
11
- handleConnection(@Client() client: WebSocketClient) {
12
- console.log('Client connected:', client.id);
13
- }
14
-
15
- @OnDisconnect()
16
- handleDisconnect(@Client() client: WebSocketClient) {
17
- console.log('Client disconnected:', client.id);
18
- }
19
-
20
- @Subscribe('message')
21
- @OnMessage('message')
22
- handleMessage(@Client() client: WebSocketClient, @Data() data: unknown) {
23
- console.log('Message received from', client.id, ':', data);
24
- // Handle message logic here
25
- }
26
- }
27
- `;
28
- class WebSocketGatewayGenerator extends generator_1.Generator {
29
- constructor() {
30
- super(...arguments);
31
- this.suffix = 'gateway';
32
- }
33
- getDefaultTemplate() {
34
- return WEBSOCKET_GATEWAY_TEMPLATE;
35
- }
36
- }
37
- async function runWebSocketGateway(name, options) {
38
- const generator = new WebSocketGatewayGenerator();
39
- return generator.generate({ name, path: options.path, dryRun: options.dryRun });
40
- }
41
- function generateWebSocketGateway(program) {
42
- program
43
- .command('gateway <name>')
44
- .description('Generate a new WebSocket gateway')
45
- .alias('ws')
46
- .option('-p, --path <path>', 'Path where the gateway should be generated')
47
- .option('--dry-run', 'Preview files without writing them')
48
- .option('--json', 'Output result as JSON')
49
- .action(async (name, options) => {
50
- const result = await runWebSocketGateway(name, options);
51
- (0, generator_1.printGenerateResult)(result, { json: options.json });
52
- });
53
- }
@@ -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_websocket_gateway_1 = require("./generate-websocket-gateway");
9
- jest.mock('fs');
10
- describe('generateWebSocketGateway', () => {
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 gateway command with alias', () => {
24
- (0, generate_websocket_gateway_1.generateWebSocketGateway)(program);
25
- const cmd = program.commands.find(c => c.name() === 'gateway');
26
- expect(cmd).toBeDefined();
27
- expect(cmd?.alias()).toBe('ws');
28
- });
29
- it('should generate a gateway file with correct suffix', async () => {
30
- (0, generate_websocket_gateway_1.generateWebSocketGateway)(program);
31
- await program.parseAsync(['node', 'test', 'gateway', 'chat']);
32
- expect(mockFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('chat.gateway.ts'), expect.stringContaining('ChatGateway'));
33
- });
34
- it('should import from @hazeljs/websocket', async () => {
35
- (0, generate_websocket_gateway_1.generateWebSocketGateway)(program);
36
- await program.parseAsync(['node', 'test', 'gateway', 'chat']);
37
- const writtenContent = mockFs.writeFileSync.mock.calls[0][1];
38
- expect(writtenContent).toContain("from '@hazeljs/websocket'");
39
- expect(writtenContent).toContain('@Realtime');
40
- });
41
- });
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function pdfToAudioCommand(program: Command): void;