@friggframework/devtools 2.0.0--canary.545.ae2019f.0 → 2.0.0--canary.549.a579cca.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 (127) hide show
  1. package/frigg-cli/README.md +1 -1
  2. package/frigg-cli/__tests__/unit/commands/build.test.js +1 -1
  3. package/frigg-cli/__tests__/unit/commands/doctor.test.js +2 -0
  4. package/frigg-cli/__tests__/unit/commands/install.test.js +19 -23
  5. package/frigg-cli/__tests__/unit/dependencies.test.js +2 -2
  6. package/frigg-cli/build-command/index.js +11 -123
  7. package/frigg-cli/deploy-command/index.js +1 -83
  8. package/frigg-cli/doctor-command/index.js +16 -37
  9. package/frigg-cli/generate-iam-command.js +1 -21
  10. package/frigg-cli/index.js +6 -21
  11. package/frigg-cli/index.test.js +2 -7
  12. package/frigg-cli/init-command/backend-first-handler.js +42 -124
  13. package/frigg-cli/init-command/index.js +1 -2
  14. package/frigg-cli/init-command/template-handler.js +3 -13
  15. package/frigg-cli/install-command/backend-js.js +3 -3
  16. package/frigg-cli/install-command/environment-variables.js +19 -16
  17. package/frigg-cli/install-command/environment-variables.test.js +13 -12
  18. package/frigg-cli/install-command/index.js +9 -14
  19. package/frigg-cli/install-command/integration-file.js +3 -3
  20. package/frigg-cli/install-command/logger.js +12 -0
  21. package/frigg-cli/install-command/validate-package.js +9 -5
  22. package/frigg-cli/jest.config.js +1 -4
  23. package/frigg-cli/repair-command/index.js +128 -121
  24. package/frigg-cli/start-command/index.js +2 -324
  25. package/frigg-cli/ui-command/index.js +36 -58
  26. package/frigg-cli/utils/repo-detection.js +37 -85
  27. package/infrastructure/create-frigg-infrastructure.js +0 -93
  28. package/infrastructure/docs/iam-policy-templates.md +1 -1
  29. package/infrastructure/domains/networking/vpc-builder.test.js +4 -2
  30. package/infrastructure/domains/networking/vpc-resolver.test.js +1 -1
  31. package/infrastructure/domains/shared/resource-discovery.js +5 -5
  32. package/infrastructure/domains/shared/types/app-definition.js +0 -21
  33. package/infrastructure/domains/shared/types/discovery-result.test.js +1 -1
  34. package/infrastructure/domains/shared/utilities/base-definition-factory.js +1 -10
  35. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +2 -2
  36. package/infrastructure/infrastructure-composer.js +0 -2
  37. package/infrastructure/infrastructure-composer.test.js +2 -2
  38. package/management-ui/README.md +109 -245
  39. package/package.json +7 -8
  40. package/frigg-cli/__tests__/application/use-cases/AddApiModuleToIntegrationUseCase.test.js +0 -326
  41. package/frigg-cli/__tests__/application/use-cases/CreateApiModuleUseCase.test.js +0 -337
  42. package/frigg-cli/__tests__/domain/entities/ApiModule.test.js +0 -373
  43. package/frigg-cli/__tests__/domain/entities/AppDefinition.test.js +0 -313
  44. package/frigg-cli/__tests__/domain/services/IntegrationValidator.test.js +0 -269
  45. package/frigg-cli/__tests__/domain/value-objects/IntegrationName.test.js +0 -82
  46. package/frigg-cli/__tests__/infrastructure/adapters/IntegrationJsUpdater.test.js +0 -408
  47. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemApiModuleRepository.test.js +0 -583
  48. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemAppDefinitionRepository.test.js +0 -314
  49. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemIntegrationRepository.test.js +0 -383
  50. package/frigg-cli/__tests__/unit/commands/init.test.js +0 -406
  51. package/frigg-cli/__tests__/unit/commands/provider-dispatch.test.js +0 -383
  52. package/frigg-cli/__tests__/unit/commands/repair.test.js +0 -275
  53. package/frigg-cli/__tests__/unit/start-command/application/RunPreflightChecksUseCase.test.js +0 -411
  54. package/frigg-cli/__tests__/unit/start-command/infrastructure/DatabaseAdapter.test.js +0 -405
  55. package/frigg-cli/__tests__/unit/start-command/infrastructure/DockerAdapter.test.js +0 -496
  56. package/frigg-cli/__tests__/unit/start-command/presentation/InteractivePromptAdapter.test.js +0 -474
  57. package/frigg-cli/__tests__/unit/utils/output.test.js +0 -196
  58. package/frigg-cli/application/use-cases/AddApiModuleToIntegrationUseCase.js +0 -93
  59. package/frigg-cli/application/use-cases/CreateApiModuleUseCase.js +0 -93
  60. package/frigg-cli/application/use-cases/CreateIntegrationUseCase.js +0 -103
  61. package/frigg-cli/container.js +0 -172
  62. package/frigg-cli/docs/OUTPUT_MIGRATION_GUIDE.md +0 -286
  63. package/frigg-cli/domain/entities/ApiModule.js +0 -272
  64. package/frigg-cli/domain/entities/AppDefinition.js +0 -227
  65. package/frigg-cli/domain/entities/Integration.js +0 -198
  66. package/frigg-cli/domain/exceptions/DomainException.js +0 -24
  67. package/frigg-cli/domain/ports/IApiModuleRepository.js +0 -53
  68. package/frigg-cli/domain/ports/IAppDefinitionRepository.js +0 -43
  69. package/frigg-cli/domain/ports/IIntegrationRepository.js +0 -61
  70. package/frigg-cli/domain/services/IntegrationValidator.js +0 -185
  71. package/frigg-cli/domain/value-objects/IntegrationId.js +0 -42
  72. package/frigg-cli/domain/value-objects/IntegrationName.js +0 -60
  73. package/frigg-cli/domain/value-objects/SemanticVersion.js +0 -70
  74. package/frigg-cli/infrastructure/UnitOfWork.js +0 -46
  75. package/frigg-cli/infrastructure/adapters/BackendJsUpdater.js +0 -197
  76. package/frigg-cli/infrastructure/adapters/FileSystemAdapter.js +0 -224
  77. package/frigg-cli/infrastructure/adapters/IntegrationJsUpdater.js +0 -249
  78. package/frigg-cli/infrastructure/adapters/SchemaValidator.js +0 -92
  79. package/frigg-cli/infrastructure/repositories/FileSystemApiModuleRepository.js +0 -373
  80. package/frigg-cli/infrastructure/repositories/FileSystemAppDefinitionRepository.js +0 -116
  81. package/frigg-cli/infrastructure/repositories/FileSystemIntegrationRepository.js +0 -277
  82. package/frigg-cli/package-lock.json +0 -16226
  83. package/frigg-cli/start-command/application/RunPreflightChecksUseCase.js +0 -376
  84. package/frigg-cli/start-command/infrastructure/DatabaseAdapter.js +0 -591
  85. package/frigg-cli/start-command/infrastructure/DockerAdapter.js +0 -306
  86. package/frigg-cli/start-command/presentation/InteractivePromptAdapter.js +0 -329
  87. package/frigg-cli/templates/backend/.env.example +0 -62
  88. package/frigg-cli/templates/backend/.eslintrc.json +0 -12
  89. package/frigg-cli/templates/backend/.prettierrc +0 -6
  90. package/frigg-cli/templates/backend/docker-compose.yml +0 -22
  91. package/frigg-cli/templates/backend/index.js +0 -96
  92. package/frigg-cli/templates/backend/infrastructure.js +0 -12
  93. package/frigg-cli/templates/backend/jest.config.js +0 -17
  94. package/frigg-cli/templates/backend/package.json +0 -50
  95. package/frigg-cli/templates/backend/src/api-modules/.gitkeep +0 -10
  96. package/frigg-cli/templates/backend/src/base/.gitkeep +0 -7
  97. package/frigg-cli/templates/backend/src/integrations/.gitkeep +0 -10
  98. package/frigg-cli/templates/backend/src/integrations/ExampleIntegration.js +0 -65
  99. package/frigg-cli/templates/backend/src/utils/.gitkeep +0 -7
  100. package/frigg-cli/templates/backend/test/setup.js +0 -30
  101. package/frigg-cli/templates/backend/ui-extensions/.gitkeep +0 -0
  102. package/frigg-cli/templates/backend/ui-extensions/README.md +0 -77
  103. package/frigg-cli/utils/__tests__/provider-helper.test.js +0 -55
  104. package/frigg-cli/utils/__tests__/repo-detection.test.js +0 -436
  105. package/frigg-cli/utils/output.js +0 -382
  106. package/frigg-cli/utils/provider-helper.js +0 -75
  107. package/frigg-cli/validate-command/__tests__/adapters/validate-command.test.js +0 -205
  108. package/frigg-cli/validate-command/__tests__/application/validate-app-use-case.test.js +0 -104
  109. package/frigg-cli/validate-command/__tests__/domain/fix-suggestion.test.js +0 -153
  110. package/frigg-cli/validate-command/__tests__/domain/validation-error.test.js +0 -162
  111. package/frigg-cli/validate-command/__tests__/domain/validation-result.test.js +0 -152
  112. package/frigg-cli/validate-command/__tests__/infrastructure/api-module-validator.test.js +0 -332
  113. package/frigg-cli/validate-command/__tests__/infrastructure/app-definition-validator.test.js +0 -191
  114. package/frigg-cli/validate-command/__tests__/infrastructure/integration-class-validator.test.js +0 -146
  115. package/frigg-cli/validate-command/__tests__/infrastructure/template-validation.test.js +0 -155
  116. package/frigg-cli/validate-command/adapters/cli/validate-command.js +0 -199
  117. package/frigg-cli/validate-command/application/use-cases/validate-app-use-case.js +0 -35
  118. package/frigg-cli/validate-command/domain/entities/validation-result.js +0 -74
  119. package/frigg-cli/validate-command/domain/value-objects/fix-suggestion.js +0 -74
  120. package/frigg-cli/validate-command/domain/value-objects/validation-error.js +0 -68
  121. package/frigg-cli/validate-command/infrastructure/validators/api-module-validator.js +0 -181
  122. package/frigg-cli/validate-command/infrastructure/validators/app-definition-validator.js +0 -128
  123. package/frigg-cli/validate-command/infrastructure/validators/integration-class-validator.js +0 -113
  124. package/infrastructure/domains/admin-scripts/admin-script-builder.js +0 -200
  125. package/infrastructure/domains/admin-scripts/admin-script-builder.test.js +0 -499
  126. package/infrastructure/domains/admin-scripts/index.js +0 -5
  127. package/infrastructure/jest.config.js +0 -16
@@ -1,405 +0,0 @@
1
- /**
2
- * DatabaseAdapter Tests
3
- * Infrastructure adapter for database connectivity checks
4
- *
5
- * Tests follow TDD pattern - written BEFORE implementation
6
- */
7
-
8
- // Mock net module for TCP connection testing
9
- jest.mock('net', () => ({
10
- createConnection: jest.fn()
11
- }));
12
-
13
- const net = require('net');
14
-
15
- // Import after mocks
16
- const { DatabaseAdapter } = require('../../../../start-command/infrastructure/DatabaseAdapter');
17
-
18
- describe('DatabaseAdapter', () => {
19
- let adapter;
20
-
21
- beforeEach(() => {
22
- jest.clearAllMocks();
23
- adapter = new DatabaseAdapter();
24
- });
25
-
26
- describe('parseConnectionString()', () => {
27
- describe('MongoDB connection strings', () => {
28
- it('should parse mongodb:// connection string', () => {
29
- const url = 'mongodb://localhost:27017/frigg';
30
- const result = adapter.parseConnectionString(url);
31
-
32
- expect(result.type).toBe('mongodb');
33
- expect(result.host).toBe('localhost');
34
- expect(result.port).toBe(27017);
35
- expect(result.database).toBe('frigg');
36
- });
37
-
38
- it('should parse mongodb+srv:// connection string', () => {
39
- const url = 'mongodb+srv://cluster.mongodb.net/frigg';
40
- const result = adapter.parseConnectionString(url);
41
-
42
- expect(result.type).toBe('mongodb');
43
- expect(result.host).toBe('cluster.mongodb.net');
44
- expect(result.port).toBe(27017); // Default MongoDB port
45
- expect(result.database).toBe('frigg');
46
- });
47
-
48
- it('should parse mongodb connection with authentication', () => {
49
- const url = 'mongodb://user:password@localhost:27017/frigg?authSource=admin';
50
- const result = adapter.parseConnectionString(url);
51
-
52
- expect(result.type).toBe('mongodb');
53
- expect(result.host).toBe('localhost');
54
- expect(result.port).toBe(27017);
55
- expect(result.database).toBe('frigg');
56
- expect(result.user).toBe('user');
57
- });
58
-
59
- it('should use default port 27017 for mongodb without port', () => {
60
- const url = 'mongodb://localhost/frigg';
61
- const result = adapter.parseConnectionString(url);
62
-
63
- expect(result.port).toBe(27017);
64
- });
65
-
66
- it('should handle replica set connection string', () => {
67
- const url = 'mongodb://mongo1:27017,mongo2:27017,mongo3:27017/frigg?replicaSet=rs0';
68
- const result = adapter.parseConnectionString(url);
69
-
70
- expect(result.type).toBe('mongodb');
71
- expect(result.host).toBe('mongo1'); // First host
72
- expect(result.port).toBe(27017);
73
- });
74
- });
75
-
76
- describe('PostgreSQL connection strings', () => {
77
- it('should parse postgresql:// connection string', () => {
78
- const url = 'postgresql://localhost:5432/frigg';
79
- const result = adapter.parseConnectionString(url);
80
-
81
- expect(result.type).toBe('postgresql');
82
- expect(result.host).toBe('localhost');
83
- expect(result.port).toBe(5432);
84
- expect(result.database).toBe('frigg');
85
- });
86
-
87
- it('should parse postgres:// connection string (alias)', () => {
88
- const url = 'postgres://localhost:5432/frigg';
89
- const result = adapter.parseConnectionString(url);
90
-
91
- expect(result.type).toBe('postgresql');
92
- expect(result.host).toBe('localhost');
93
- expect(result.port).toBe(5432);
94
- });
95
-
96
- it('should parse postgresql connection with authentication', () => {
97
- const url = 'postgresql://user:password@localhost:5432/frigg?schema=public';
98
- const result = adapter.parseConnectionString(url);
99
-
100
- expect(result.type).toBe('postgresql');
101
- expect(result.host).toBe('localhost');
102
- expect(result.port).toBe(5432);
103
- expect(result.user).toBe('user');
104
- });
105
-
106
- it('should use default port 5432 for postgresql without port', () => {
107
- const url = 'postgresql://localhost/frigg';
108
- const result = adapter.parseConnectionString(url);
109
-
110
- expect(result.port).toBe(5432);
111
- });
112
- });
113
-
114
- describe('Invalid connection strings', () => {
115
- it('should return error for unknown protocol', () => {
116
- const url = 'mysql://localhost:3306/frigg';
117
- const result = adapter.parseConnectionString(url);
118
-
119
- expect(result.error).toBeDefined();
120
- expect(result.error).toContain('Unsupported database type');
121
- });
122
-
123
- it('should return error for malformed URL', () => {
124
- const url = 'not-a-valid-url';
125
- const result = adapter.parseConnectionString(url);
126
-
127
- expect(result.error).toBeDefined();
128
- });
129
-
130
- it('should return error for empty string', () => {
131
- const result = adapter.parseConnectionString('');
132
-
133
- expect(result.error).toBeDefined();
134
- });
135
-
136
- it('should return error for null', () => {
137
- const result = adapter.parseConnectionString(null);
138
-
139
- expect(result.error).toBeDefined();
140
- });
141
- });
142
- });
143
-
144
- describe('getDatabaseType()', () => {
145
- it('should return mongodb for mongodb:// URLs', () => {
146
- const url = 'mongodb://localhost:27017/frigg';
147
- const result = adapter.getDatabaseType(url);
148
-
149
- expect(result).toBe('mongodb');
150
- });
151
-
152
- it('should return mongodb for mongodb+srv:// URLs', () => {
153
- const url = 'mongodb+srv://cluster.mongodb.net/frigg';
154
- const result = adapter.getDatabaseType(url);
155
-
156
- expect(result).toBe('mongodb');
157
- });
158
-
159
- it('should return postgresql for postgresql:// URLs', () => {
160
- const url = 'postgresql://localhost:5432/frigg';
161
- const result = adapter.getDatabaseType(url);
162
-
163
- expect(result).toBe('postgresql');
164
- });
165
-
166
- it('should return postgresql for postgres:// URLs', () => {
167
- const url = 'postgres://localhost:5432/frigg';
168
- const result = adapter.getDatabaseType(url);
169
-
170
- expect(result).toBe('postgresql');
171
- });
172
-
173
- it('should return null for unknown database types', () => {
174
- const url = 'mysql://localhost:3306/frigg';
175
- const result = adapter.getDatabaseType(url);
176
-
177
- expect(result).toBeNull();
178
- });
179
- });
180
-
181
- describe('isPortReachable()', () => {
182
- let mockSocket;
183
-
184
- beforeEach(() => {
185
- mockSocket = {
186
- on: jest.fn(),
187
- destroy: jest.fn(),
188
- setTimeout: jest.fn()
189
- };
190
- net.createConnection.mockReturnValue(mockSocket);
191
- });
192
-
193
- it('should return true when port is reachable', async () => {
194
- // Simulate successful connection
195
- mockSocket.on.mockImplementation((event, callback) => {
196
- if (event === 'connect') {
197
- setTimeout(() => callback(), 10);
198
- }
199
- return mockSocket;
200
- });
201
-
202
- const result = await adapter.isPortReachable('localhost', 27017);
203
-
204
- expect(result).toBe(true);
205
- expect(mockSocket.destroy).toHaveBeenCalled();
206
- });
207
-
208
- it('should return false when connection is refused', async () => {
209
- // Simulate connection refused
210
- mockSocket.on.mockImplementation((event, callback) => {
211
- if (event === 'error') {
212
- setTimeout(() => callback(new Error('ECONNREFUSED')), 10);
213
- }
214
- return mockSocket;
215
- });
216
-
217
- const result = await adapter.isPortReachable('localhost', 27017);
218
-
219
- expect(result).toBe(false);
220
- });
221
-
222
- it('should return false when connection times out', async () => {
223
- // Simulate timeout
224
- mockSocket.on.mockImplementation((event, callback) => {
225
- if (event === 'timeout') {
226
- setTimeout(() => callback(), 10);
227
- }
228
- return mockSocket;
229
- });
230
-
231
- const result = await adapter.isPortReachable('localhost', 27017, 100);
232
-
233
- expect(result).toBe(false);
234
- });
235
-
236
- it('should use custom timeout value', async () => {
237
- mockSocket.on.mockImplementation((event, callback) => {
238
- if (event === 'connect') {
239
- setTimeout(() => callback(), 10);
240
- }
241
- return mockSocket;
242
- });
243
-
244
- await adapter.isPortReachable('localhost', 27017, 5000);
245
-
246
- expect(mockSocket.setTimeout).toHaveBeenCalledWith(5000);
247
- });
248
-
249
- it('should use default timeout of 3000ms', async () => {
250
- mockSocket.on.mockImplementation((event, callback) => {
251
- if (event === 'connect') {
252
- setTimeout(() => callback(), 10);
253
- }
254
- return mockSocket;
255
- });
256
-
257
- await adapter.isPortReachable('localhost', 27017);
258
-
259
- expect(mockSocket.setTimeout).toHaveBeenCalledWith(3000);
260
- });
261
- });
262
-
263
- describe('isDatabaseReachable()', () => {
264
- let mockSocket;
265
-
266
- beforeEach(() => {
267
- mockSocket = {
268
- on: jest.fn(),
269
- destroy: jest.fn(),
270
- setTimeout: jest.fn()
271
- };
272
- net.createConnection.mockReturnValue(mockSocket);
273
- });
274
-
275
- it('should return reachable: true when database port is open', async () => {
276
- // Simulate successful connection
277
- mockSocket.on.mockImplementation((event, callback) => {
278
- if (event === 'connect') {
279
- setTimeout(() => callback(), 10);
280
- }
281
- return mockSocket;
282
- });
283
-
284
- const result = await adapter.isDatabaseReachable('mongodb://localhost:27017/frigg');
285
-
286
- expect(result.reachable).toBe(true);
287
- expect(result.host).toBe('localhost');
288
- expect(result.port).toBe(27017);
289
- });
290
-
291
- it('should return reachable: false when database port is closed', async () => {
292
- mockSocket.on.mockImplementation((event, callback) => {
293
- if (event === 'error') {
294
- setTimeout(() => callback(new Error('ECONNREFUSED')), 10);
295
- }
296
- return mockSocket;
297
- });
298
-
299
- const result = await adapter.isDatabaseReachable('mongodb://localhost:27017/frigg');
300
-
301
- expect(result.reachable).toBe(false);
302
- expect(result.error).toContain('ECONNREFUSED');
303
- });
304
-
305
- it('should return error for invalid connection string', async () => {
306
- const result = await adapter.isDatabaseReachable('not-valid');
307
-
308
- expect(result.reachable).toBe(false);
309
- expect(result.error).toBeDefined();
310
- });
311
-
312
- it('should include database type in result', async () => {
313
- mockSocket.on.mockImplementation((event, callback) => {
314
- if (event === 'connect') {
315
- setTimeout(() => callback(), 10);
316
- }
317
- return mockSocket;
318
- });
319
-
320
- const result = await adapter.isDatabaseReachable('postgresql://localhost:5432/frigg');
321
-
322
- expect(result.type).toBe('postgresql');
323
- });
324
- });
325
-
326
- describe('getConnectionDetails()', () => {
327
- it('should extract all connection details from MongoDB URL', () => {
328
- const url = 'mongodb://user:pass@localhost:27017/frigg?replicaSet=rs0';
329
- const result = adapter.getConnectionDetails(url);
330
-
331
- expect(result).toEqual({
332
- type: 'mongodb',
333
- host: 'localhost',
334
- port: 27017,
335
- database: 'frigg',
336
- user: 'user',
337
- hasCredentials: true
338
- });
339
- });
340
-
341
- it('should extract all connection details from PostgreSQL URL', () => {
342
- const url = 'postgresql://user:pass@localhost:5432/frigg?schema=public';
343
- const result = adapter.getConnectionDetails(url);
344
-
345
- expect(result).toEqual({
346
- type: 'postgresql',
347
- host: 'localhost',
348
- port: 5432,
349
- database: 'frigg',
350
- user: 'user',
351
- hasCredentials: true
352
- });
353
- });
354
-
355
- it('should indicate no credentials when not provided', () => {
356
- const url = 'mongodb://localhost:27017/frigg';
357
- const result = adapter.getConnectionDetails(url);
358
-
359
- expect(result.hasCredentials).toBe(false);
360
- expect(result.user).toBeUndefined();
361
- });
362
-
363
- it('should return error object for invalid URL', () => {
364
- const result = adapter.getConnectionDetails('invalid');
365
-
366
- expect(result.error).toBeDefined();
367
- });
368
- });
369
-
370
- describe('suggestDockerService()', () => {
371
- it('should suggest mongodb service for MongoDB database', () => {
372
- const result = adapter.suggestDockerService('mongodb');
373
-
374
- expect(result).toEqual({
375
- serviceName: 'mongodb',
376
- image: 'mongo:7',
377
- port: 27017,
378
- envVars: expect.objectContaining({
379
- MONGO_INITDB_DATABASE: 'frigg'
380
- })
381
- });
382
- });
383
-
384
- it('should suggest postgres service for PostgreSQL database', () => {
385
- const result = adapter.suggestDockerService('postgresql');
386
-
387
- expect(result).toEqual({
388
- serviceName: 'postgres',
389
- image: 'postgres:16',
390
- port: 5432,
391
- envVars: expect.objectContaining({
392
- POSTGRES_DB: 'frigg',
393
- POSTGRES_USER: expect.any(String),
394
- POSTGRES_PASSWORD: expect.any(String)
395
- })
396
- });
397
- });
398
-
399
- it('should return null for unknown database type', () => {
400
- const result = adapter.suggestDockerService('mysql');
401
-
402
- expect(result).toBeNull();
403
- });
404
- });
405
- });