@friggframework/devtools 2.0.0--canary.522.cbd3d5a.0 → 2.0.0--canary.517.21b69ac.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 (247) hide show
  1. package/.eslintrc.json +3 -0
  2. package/CHANGELOG.md +132 -0
  3. package/frigg-cli/README.md +1 -1
  4. package/frigg-cli/__tests__/unit/commands/doctor.test.js +2 -0
  5. package/frigg-cli/__tests__/unit/commands/install.test.js +17 -21
  6. package/frigg-cli/doctor-command/index.js +16 -17
  7. package/frigg-cli/index.js +6 -21
  8. package/frigg-cli/index.test.js +1 -7
  9. package/frigg-cli/init-command/backend-first-handler.js +42 -124
  10. package/frigg-cli/init-command/index.js +1 -2
  11. package/frigg-cli/init-command/template-handler.js +3 -13
  12. package/frigg-cli/install-command/backend-js.js +3 -3
  13. package/frigg-cli/install-command/environment-variables.js +19 -16
  14. package/frigg-cli/install-command/environment-variables.test.js +13 -12
  15. package/frigg-cli/install-command/index.js +9 -14
  16. package/frigg-cli/install-command/integration-file.js +3 -3
  17. package/frigg-cli/install-command/logger.js +12 -0
  18. package/frigg-cli/install-command/validate-package.js +9 -5
  19. package/frigg-cli/jest.config.js +1 -4
  20. package/frigg-cli/repair-command/index.js +128 -101
  21. package/frigg-cli/start-command/index.js +2 -246
  22. package/frigg-cli/ui-command/index.js +36 -58
  23. package/frigg-cli/utils/repo-detection.js +37 -85
  24. package/infrastructure/docs/iam-policy-templates.md +1 -1
  25. package/infrastructure/domains/networking/vpc-builder.test.js +4 -2
  26. package/infrastructure/domains/networking/vpc-resolver.test.js +1 -1
  27. package/infrastructure/domains/shared/cloudformation-discovery.test.js +7 -4
  28. package/infrastructure/domains/shared/resource-discovery.js +5 -5
  29. package/infrastructure/domains/shared/types/discovery-result.test.js +1 -1
  30. package/infrastructure/domains/shared/utilities/base-definition-factory.js +2 -25
  31. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +2 -2
  32. package/infrastructure/infrastructure-composer.test.js +2 -2
  33. package/layers/prisma/.build-complete +3 -0
  34. package/layers/prisma/nodejs/package.json +8 -0
  35. package/management-ui/.eslintrc.js +22 -0
  36. package/management-ui/README.md +109 -245
  37. package/management-ui/components.json +21 -0
  38. package/management-ui/docs/phase2-integration-guide.md +320 -0
  39. package/management-ui/index.html +13 -0
  40. package/management-ui/package.json +76 -0
  41. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  42. package/management-ui/postcss.config.js +6 -0
  43. package/management-ui/server/api/backend.js +256 -0
  44. package/management-ui/server/api/cli.js +315 -0
  45. package/management-ui/server/api/codegen.js +663 -0
  46. package/management-ui/server/api/connections.js +857 -0
  47. package/management-ui/server/api/discovery.js +185 -0
  48. package/management-ui/server/api/environment/index.js +1 -0
  49. package/management-ui/server/api/environment/router.js +378 -0
  50. package/management-ui/server/api/environment.js +328 -0
  51. package/management-ui/server/api/integrations.js +876 -0
  52. package/management-ui/server/api/logs.js +248 -0
  53. package/management-ui/server/api/monitoring.js +282 -0
  54. package/management-ui/server/api/open-ide.js +31 -0
  55. package/management-ui/server/api/project.js +1029 -0
  56. package/management-ui/server/api/users/sessions.js +371 -0
  57. package/management-ui/server/api/users/simulation.js +254 -0
  58. package/management-ui/server/api/users.js +362 -0
  59. package/management-ui/server/api-contract.md +275 -0
  60. package/management-ui/server/index.js +873 -0
  61. package/management-ui/server/middleware/errorHandler.js +93 -0
  62. package/management-ui/server/middleware/security.js +32 -0
  63. package/management-ui/server/processManager.js +296 -0
  64. package/management-ui/server/server.js +346 -0
  65. package/management-ui/server/services/aws-monitor.js +413 -0
  66. package/management-ui/server/services/npm-registry.js +347 -0
  67. package/management-ui/server/services/template-engine.js +538 -0
  68. package/management-ui/server/utils/cliIntegration.js +220 -0
  69. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  70. package/management-ui/server/utils/environment/awsParameterStore.js +275 -0
  71. package/management-ui/server/utils/environment/encryption.js +278 -0
  72. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  73. package/management-ui/server/utils/import-commonjs.js +28 -0
  74. package/management-ui/server/utils/response.js +83 -0
  75. package/management-ui/server/websocket/handler.js +325 -0
  76. package/management-ui/src/App.jsx +25 -0
  77. package/management-ui/src/assets/FriggLogo.svg +1 -0
  78. package/management-ui/src/components/AppRouter.jsx +65 -0
  79. package/management-ui/src/components/Button.jsx +70 -0
  80. package/management-ui/src/components/Card.jsx +97 -0
  81. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  82. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  83. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  84. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  85. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  86. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  87. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  88. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  89. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  90. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  91. package/management-ui/src/components/Layout.jsx +716 -0
  92. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  93. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  94. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  95. package/management-ui/src/components/StatusBadge.jsx +208 -0
  96. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  97. package/management-ui/src/components/UserSimulation.jsx +327 -0
  98. package/management-ui/src/components/Welcome.jsx +434 -0
  99. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  100. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  101. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  102. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  103. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  104. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  105. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  106. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  107. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  108. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  109. package/management-ui/src/components/codegen/index.js +10 -0
  110. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  111. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  112. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  113. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  114. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  115. package/management-ui/src/components/connections/index.js +5 -0
  116. package/management-ui/src/components/index.js +21 -0
  117. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  118. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  119. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  120. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  121. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  122. package/management-ui/src/components/monitoring/index.js +6 -0
  123. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  124. package/management-ui/src/components/theme-provider.jsx +52 -0
  125. package/management-ui/src/components/theme-toggle.jsx +39 -0
  126. package/management-ui/src/components/ui/badge.tsx +36 -0
  127. package/management-ui/src/components/ui/button.test.jsx +56 -0
  128. package/management-ui/src/components/ui/button.tsx +57 -0
  129. package/management-ui/src/components/ui/card.tsx +76 -0
  130. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  131. package/management-ui/src/components/ui/select.tsx +157 -0
  132. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  133. package/management-ui/src/hooks/useFrigg.jsx +387 -0
  134. package/management-ui/src/hooks/useSocket.jsx +58 -0
  135. package/management-ui/src/index.css +193 -0
  136. package/management-ui/src/lib/utils.ts +6 -0
  137. package/management-ui/src/main.jsx +10 -0
  138. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  139. package/management-ui/src/pages/Connections.jsx +252 -0
  140. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  141. package/management-ui/src/pages/Dashboard.jsx +311 -0
  142. package/management-ui/src/pages/Environment.jsx +314 -0
  143. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  144. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  145. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  146. package/management-ui/src/pages/Integrations.jsx +253 -0
  147. package/management-ui/src/pages/Monitoring.jsx +17 -0
  148. package/management-ui/src/pages/Simulation.jsx +155 -0
  149. package/management-ui/src/pages/Users.jsx +492 -0
  150. package/management-ui/src/services/api.js +41 -0
  151. package/management-ui/src/services/apiModuleService.js +193 -0
  152. package/management-ui/src/services/websocket-handlers.js +120 -0
  153. package/management-ui/src/test/api/project.test.js +273 -0
  154. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  155. package/management-ui/src/test/mocks/server.js +178 -0
  156. package/management-ui/src/test/setup.js +61 -0
  157. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  158. package/management-ui/src/utils/repository.js +98 -0
  159. package/management-ui/src/utils/repository.test.js +118 -0
  160. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  161. package/management-ui/tailwind.config.js +63 -0
  162. package/management-ui/tsconfig.json +37 -0
  163. package/management-ui/tsconfig.node.json +10 -0
  164. package/management-ui/vite.config.js +26 -0
  165. package/management-ui/vitest.config.js +38 -0
  166. package/package.json +7 -17
  167. package/frigg-cli/__tests__/application/use-cases/AddApiModuleToIntegrationUseCase.test.js +0 -326
  168. package/frigg-cli/__tests__/application/use-cases/CreateApiModuleUseCase.test.js +0 -337
  169. package/frigg-cli/__tests__/domain/entities/ApiModule.test.js +0 -373
  170. package/frigg-cli/__tests__/domain/entities/AppDefinition.test.js +0 -313
  171. package/frigg-cli/__tests__/domain/services/IntegrationValidator.test.js +0 -269
  172. package/frigg-cli/__tests__/domain/value-objects/IntegrationName.test.js +0 -82
  173. package/frigg-cli/__tests__/infrastructure/adapters/IntegrationJsUpdater.test.js +0 -408
  174. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemApiModuleRepository.test.js +0 -583
  175. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemAppDefinitionRepository.test.js +0 -314
  176. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemIntegrationRepository.test.js +0 -430
  177. package/frigg-cli/__tests__/unit/commands/init.test.js +0 -406
  178. package/frigg-cli/__tests__/unit/commands/repair.test.js +0 -275
  179. package/frigg-cli/__tests__/unit/start-command/application/RunPreflightChecksUseCase.test.js +0 -411
  180. package/frigg-cli/__tests__/unit/start-command/infrastructure/DatabaseAdapter.test.js +0 -405
  181. package/frigg-cli/__tests__/unit/start-command/infrastructure/DockerAdapter.test.js +0 -496
  182. package/frigg-cli/__tests__/unit/start-command/presentation/InteractivePromptAdapter.test.js +0 -474
  183. package/frigg-cli/__tests__/unit/utils/output.test.js +0 -196
  184. package/frigg-cli/application/use-cases/AddApiModuleToIntegrationUseCase.js +0 -93
  185. package/frigg-cli/application/use-cases/CreateApiModuleUseCase.js +0 -93
  186. package/frigg-cli/application/use-cases/CreateIntegrationUseCase.js +0 -103
  187. package/frigg-cli/container.js +0 -172
  188. package/frigg-cli/docs/OUTPUT_MIGRATION_GUIDE.md +0 -286
  189. package/frigg-cli/domain/entities/ApiModule.js +0 -272
  190. package/frigg-cli/domain/entities/AppDefinition.js +0 -227
  191. package/frigg-cli/domain/entities/Integration.js +0 -198
  192. package/frigg-cli/domain/exceptions/DomainException.js +0 -24
  193. package/frigg-cli/domain/ports/IApiModuleRepository.js +0 -53
  194. package/frigg-cli/domain/ports/IAppDefinitionRepository.js +0 -43
  195. package/frigg-cli/domain/ports/IIntegrationRepository.js +0 -61
  196. package/frigg-cli/domain/services/IntegrationValidator.js +0 -185
  197. package/frigg-cli/domain/value-objects/IntegrationId.js +0 -42
  198. package/frigg-cli/domain/value-objects/IntegrationName.js +0 -60
  199. package/frigg-cli/domain/value-objects/SemanticVersion.js +0 -70
  200. package/frigg-cli/infrastructure/UnitOfWork.js +0 -46
  201. package/frigg-cli/infrastructure/adapters/BackendJsUpdater.js +0 -197
  202. package/frigg-cli/infrastructure/adapters/FileSystemAdapter.js +0 -224
  203. package/frigg-cli/infrastructure/adapters/IntegrationJsUpdater.js +0 -249
  204. package/frigg-cli/infrastructure/adapters/SchemaValidator.js +0 -92
  205. package/frigg-cli/infrastructure/repositories/FileSystemApiModuleRepository.js +0 -373
  206. package/frigg-cli/infrastructure/repositories/FileSystemAppDefinitionRepository.js +0 -116
  207. package/frigg-cli/infrastructure/repositories/FileSystemIntegrationRepository.js +0 -277
  208. package/frigg-cli/package-lock.json +0 -16226
  209. package/frigg-cli/start-command/application/RunPreflightChecksUseCase.js +0 -376
  210. package/frigg-cli/start-command/infrastructure/DatabaseAdapter.js +0 -591
  211. package/frigg-cli/start-command/infrastructure/DockerAdapter.js +0 -306
  212. package/frigg-cli/start-command/presentation/InteractivePromptAdapter.js +0 -329
  213. package/frigg-cli/templates/backend/.env.example +0 -62
  214. package/frigg-cli/templates/backend/.eslintrc.json +0 -12
  215. package/frigg-cli/templates/backend/.prettierrc +0 -6
  216. package/frigg-cli/templates/backend/docker-compose.yml +0 -22
  217. package/frigg-cli/templates/backend/index.js +0 -96
  218. package/frigg-cli/templates/backend/infrastructure.js +0 -12
  219. package/frigg-cli/templates/backend/jest.config.js +0 -17
  220. package/frigg-cli/templates/backend/package.json +0 -50
  221. package/frigg-cli/templates/backend/src/api-modules/.gitkeep +0 -10
  222. package/frigg-cli/templates/backend/src/base/.gitkeep +0 -7
  223. package/frigg-cli/templates/backend/src/integrations/.gitkeep +0 -10
  224. package/frigg-cli/templates/backend/src/integrations/ExampleIntegration.js +0 -65
  225. package/frigg-cli/templates/backend/src/utils/.gitkeep +0 -7
  226. package/frigg-cli/templates/backend/test/setup.js +0 -30
  227. package/frigg-cli/templates/backend/ui-extensions/.gitkeep +0 -0
  228. package/frigg-cli/templates/backend/ui-extensions/README.md +0 -77
  229. package/frigg-cli/utils/__tests__/repo-detection.test.js +0 -436
  230. package/frigg-cli/utils/output.js +0 -382
  231. package/frigg-cli/validate-command/__tests__/adapters/validate-command.test.js +0 -205
  232. package/frigg-cli/validate-command/__tests__/application/validate-app-use-case.test.js +0 -104
  233. package/frigg-cli/validate-command/__tests__/domain/fix-suggestion.test.js +0 -153
  234. package/frigg-cli/validate-command/__tests__/domain/validation-error.test.js +0 -162
  235. package/frigg-cli/validate-command/__tests__/domain/validation-result.test.js +0 -152
  236. package/frigg-cli/validate-command/__tests__/infrastructure/api-module-validator.test.js +0 -332
  237. package/frigg-cli/validate-command/__tests__/infrastructure/app-definition-validator.test.js +0 -191
  238. package/frigg-cli/validate-command/__tests__/infrastructure/integration-class-validator.test.js +0 -146
  239. package/frigg-cli/validate-command/__tests__/infrastructure/template-validation.test.js +0 -155
  240. package/frigg-cli/validate-command/adapters/cli/validate-command.js +0 -199
  241. package/frigg-cli/validate-command/application/use-cases/validate-app-use-case.js +0 -35
  242. package/frigg-cli/validate-command/domain/entities/validation-result.js +0 -74
  243. package/frigg-cli/validate-command/domain/value-objects/fix-suggestion.js +0 -74
  244. package/frigg-cli/validate-command/domain/value-objects/validation-error.js +0 -68
  245. package/frigg-cli/validate-command/infrastructure/validators/api-module-validator.js +0 -181
  246. package/frigg-cli/validate-command/infrastructure/validators/app-definition-validator.js +0 -128
  247. package/frigg-cli/validate-command/infrastructure/validators/integration-class-validator.js +0 -113
@@ -1,153 +0,0 @@
1
- const { FixSuggestion } = require('../../domain/value-objects/fix-suggestion');
2
-
3
- describe('FixSuggestion', () => {
4
- describe('creation', () => {
5
- it('creates fix with action and description', () => {
6
- const fix = FixSuggestion.create({
7
- action: 'add',
8
- description: 'Add the name field to the configuration'
9
- });
10
- expect(fix.action).toBe('add');
11
- expect(fix.description).toBe('Add the name field to the configuration');
12
- });
13
-
14
- it('creates fix with template', () => {
15
- const fix = FixSuggestion.create({
16
- action: 'add',
17
- description: 'Add database configuration',
18
- template: { database: { mongoDB: { enable: true } } }
19
- });
20
- expect(fix.template).toEqual({ database: { mongoDB: { enable: true } } });
21
- });
22
-
23
- it('creates fix with code snippet', () => {
24
- const fix = FixSuggestion.create({
25
- action: 'replace',
26
- description: 'Update the export',
27
- codeSnippet: 'module.exports = { Definition };'
28
- });
29
- expect(fix.codeSnippet).toBe('module.exports = { Definition };');
30
- });
31
-
32
- it('throws for missing action', () => {
33
- expect(() => FixSuggestion.create({ description: 'Fix it' }))
34
- .toThrow('action is required');
35
- });
36
-
37
- it('throws for missing description', () => {
38
- expect(() => FixSuggestion.create({ action: 'add' }))
39
- .toThrow('description is required');
40
- });
41
-
42
- it('throws for invalid action', () => {
43
- expect(() => FixSuggestion.create({ action: 'destroy', description: 'd' }))
44
- .toThrow('Invalid action');
45
- });
46
- });
47
-
48
- describe('actions', () => {
49
- it('supports add action', () => {
50
- const fix = FixSuggestion.create({ action: 'add', description: 'd' });
51
- expect(fix.isAdd()).toBe(true);
52
- expect(fix.isRemove()).toBe(false);
53
- });
54
-
55
- it('supports remove action', () => {
56
- const fix = FixSuggestion.create({ action: 'remove', description: 'd' });
57
- expect(fix.isRemove()).toBe(true);
58
- });
59
-
60
- it('supports replace action', () => {
61
- const fix = FixSuggestion.create({ action: 'replace', description: 'd' });
62
- expect(fix.isReplace()).toBe(true);
63
- });
64
-
65
- it('supports rename action', () => {
66
- const fix = FixSuggestion.create({ action: 'rename', description: 'd' });
67
- expect(fix.isRename()).toBe(true);
68
- });
69
-
70
- it('supports update action', () => {
71
- const fix = FixSuggestion.create({ action: 'update', description: 'd' });
72
- expect(fix.isUpdate()).toBe(true);
73
- });
74
- });
75
-
76
- describe('applicability', () => {
77
- it('is auto-applicable with template', () => {
78
- const fix = FixSuggestion.create({
79
- action: 'add',
80
- description: 'd',
81
- template: { key: 'value' }
82
- });
83
- expect(fix.isAutoApplicable()).toBe(true);
84
- });
85
-
86
- it('is auto-applicable with code snippet', () => {
87
- const fix = FixSuggestion.create({
88
- action: 'replace',
89
- description: 'd',
90
- codeSnippet: 'const x = 1;'
91
- });
92
- expect(fix.isAutoApplicable()).toBe(true);
93
- });
94
-
95
- it('is not auto-applicable without template or snippet', () => {
96
- const fix = FixSuggestion.create({ action: 'add', description: 'd' });
97
- expect(fix.isAutoApplicable()).toBe(false);
98
- });
99
- });
100
-
101
- describe('target', () => {
102
- it('sets target path', () => {
103
- const fix = FixSuggestion.create({
104
- action: 'add',
105
- description: 'd',
106
- targetPath: 'config.database'
107
- });
108
- expect(fix.targetPath).toBe('config.database');
109
- });
110
-
111
- it('sets target file', () => {
112
- const fix = FixSuggestion.create({
113
- action: 'update',
114
- description: 'd',
115
- targetFile: 'backend/index.js'
116
- });
117
- expect(fix.targetFile).toBe('backend/index.js');
118
- });
119
- });
120
-
121
- describe('serialization', () => {
122
- it('converts to JSON', () => {
123
- const fix = FixSuggestion.create({
124
- action: 'add',
125
- description: 'Add config',
126
- template: { key: 'value' },
127
- targetPath: 'config'
128
- });
129
- const json = fix.toJSON();
130
- expect(json).toEqual({
131
- action: 'add',
132
- description: 'Add config',
133
- template: { key: 'value' },
134
- codeSnippet: null,
135
- targetPath: 'config',
136
- targetFile: null
137
- });
138
- });
139
- });
140
-
141
- describe('formatting', () => {
142
- it('formats for console display', () => {
143
- const fix = FixSuggestion.create({
144
- action: 'add',
145
- description: 'Add the name field',
146
- template: { name: 'my-app' }
147
- });
148
- const formatted = fix.format();
149
- expect(formatted).toContain('add');
150
- expect(formatted).toContain('Add the name field');
151
- });
152
- });
153
- });
@@ -1,162 +0,0 @@
1
- const { ValidationError } = require('../../domain/value-objects/validation-error');
2
- const { FixSuggestion } = require('../../domain/value-objects/fix-suggestion');
3
-
4
- describe('ValidationError', () => {
5
- describe('creation', () => {
6
- it('creates error with required fields', () => {
7
- const error = ValidationError.create({
8
- path: 'integrations[0].name',
9
- message: 'Integration name is required'
10
- });
11
- expect(error.path).toBe('integrations[0].name');
12
- expect(error.message).toBe('Integration name is required');
13
- expect(error.severity).toBe('error');
14
- });
15
-
16
- it('creates error with custom severity', () => {
17
- const warning = ValidationError.create({
18
- path: 'config.timeout',
19
- message: 'Timeout value seems high',
20
- severity: 'warning'
21
- });
22
- expect(warning.severity).toBe('warning');
23
- expect(warning.isWarning()).toBe(true);
24
- expect(warning.isError()).toBe(false);
25
- });
26
-
27
- it('creates error with fix suggestion', () => {
28
- const fix = FixSuggestion.create({
29
- action: 'add',
30
- description: 'Add the name field to integration'
31
- });
32
- const error = ValidationError.create({
33
- path: 'integrations[0].name',
34
- message: 'Required field missing',
35
- fix
36
- });
37
- expect(error.fix).toBe(fix);
38
- expect(error.hasFix()).toBe(true);
39
- });
40
-
41
- it('throws for missing path', () => {
42
- expect(() => ValidationError.create({ message: 'error' }))
43
- .toThrow('path is required');
44
- });
45
-
46
- it('throws for missing message', () => {
47
- expect(() => ValidationError.create({ path: 'a.b' }))
48
- .toThrow('message is required');
49
- });
50
-
51
- it('throws for invalid severity', () => {
52
- expect(() => ValidationError.create({
53
- path: 'a',
54
- message: 'b',
55
- severity: 'critical'
56
- })).toThrow('Invalid severity');
57
- });
58
- });
59
-
60
- describe('path parsing', () => {
61
- it('parses simple path', () => {
62
- const error = ValidationError.create({ path: 'name', message: 'm' });
63
- expect(error.getPathSegments()).toEqual(['name']);
64
- });
65
-
66
- it('parses nested path', () => {
67
- const error = ValidationError.create({ path: 'config.database.uri', message: 'm' });
68
- expect(error.getPathSegments()).toEqual(['config', 'database', 'uri']);
69
- });
70
-
71
- it('parses array path', () => {
72
- const error = ValidationError.create({ path: 'integrations[0].modules[1].name', message: 'm' });
73
- expect(error.getPathSegments()).toEqual(['integrations', '0', 'modules', '1', 'name']);
74
- });
75
-
76
- it('gets root path', () => {
77
- const error = ValidationError.create({ path: 'integrations[0].config.timeout', message: 'm' });
78
- expect(error.getRootPath()).toBe('integrations');
79
- });
80
- });
81
-
82
- describe('severity helpers', () => {
83
- it('identifies error severity', () => {
84
- const error = ValidationError.create({ path: 'a', message: 'm', severity: 'error' });
85
- expect(error.isError()).toBe(true);
86
- expect(error.isWarning()).toBe(false);
87
- expect(error.isInfo()).toBe(false);
88
- });
89
-
90
- it('identifies warning severity', () => {
91
- const error = ValidationError.create({ path: 'a', message: 'm', severity: 'warning' });
92
- expect(error.isError()).toBe(false);
93
- expect(error.isWarning()).toBe(true);
94
- });
95
-
96
- it('identifies info severity', () => {
97
- const error = ValidationError.create({ path: 'a', message: 'm', severity: 'info' });
98
- expect(error.isError()).toBe(false);
99
- expect(error.isInfo()).toBe(true);
100
- });
101
- });
102
-
103
- describe('code', () => {
104
- it('assigns error code', () => {
105
- const error = ValidationError.create({
106
- path: 'name',
107
- message: 'Required',
108
- code: 'REQUIRED_FIELD'
109
- });
110
- expect(error.code).toBe('REQUIRED_FIELD');
111
- });
112
-
113
- it('defaults to null code', () => {
114
- const error = ValidationError.create({ path: 'a', message: 'm' });
115
- expect(error.code).toBeNull();
116
- });
117
- });
118
-
119
- describe('serialization', () => {
120
- it('converts to JSON', () => {
121
- const error = ValidationError.create({
122
- path: 'config.name',
123
- message: 'Name required',
124
- severity: 'error',
125
- code: 'REQUIRED'
126
- });
127
- const json = error.toJSON();
128
- expect(json).toEqual({
129
- path: 'config.name',
130
- message: 'Name required',
131
- severity: 'error',
132
- code: 'REQUIRED',
133
- fix: null
134
- });
135
- });
136
-
137
- it('includes fix in JSON', () => {
138
- const fix = FixSuggestion.create({ action: 'add', description: 'Add field' });
139
- const error = ValidationError.create({
140
- path: 'a',
141
- message: 'm',
142
- fix
143
- });
144
- const json = error.toJSON();
145
- expect(json.fix).toMatchObject({ action: 'add', description: 'Add field' });
146
- });
147
- });
148
-
149
- describe('equality', () => {
150
- it('considers errors equal by path and message', () => {
151
- const error1 = ValidationError.create({ path: 'a.b', message: 'Required' });
152
- const error2 = ValidationError.create({ path: 'a.b', message: 'Required' });
153
- expect(error1.equals(error2)).toBe(true);
154
- });
155
-
156
- it('considers errors different by path', () => {
157
- const error1 = ValidationError.create({ path: 'a.b', message: 'Required' });
158
- const error2 = ValidationError.create({ path: 'a.c', message: 'Required' });
159
- expect(error1.equals(error2)).toBe(false);
160
- });
161
- });
162
- });
@@ -1,152 +0,0 @@
1
- const { ValidationResult } = require('../../domain/entities/validation-result');
2
- const { ValidationError } = require('../../domain/value-objects/validation-error');
3
- const { FixSuggestion } = require('../../domain/value-objects/fix-suggestion');
4
-
5
- describe('ValidationResult', () => {
6
- describe('creation', () => {
7
- it('creates empty result with no errors', () => {
8
- const result = ValidationResult.create();
9
- expect(result.isValid()).toBe(true);
10
- expect(result.getErrors()).toHaveLength(0);
11
- expect(result.getWarnings()).toHaveLength(0);
12
- });
13
-
14
- it('creates result with errors', () => {
15
- const error = ValidationError.create({
16
- path: 'integrations[0].name',
17
- message: 'Integration name is required',
18
- severity: 'error'
19
- });
20
- const result = ValidationResult.create({ errors: [error] });
21
- expect(result.isValid()).toBe(false);
22
- expect(result.getErrors()).toHaveLength(1);
23
- });
24
-
25
- it('creates result with warnings', () => {
26
- const warning = ValidationError.create({
27
- path: 'config.timeout',
28
- message: 'Timeout value is unusually high',
29
- severity: 'warning'
30
- });
31
- const result = ValidationResult.create({ errors: [warning] });
32
- expect(result.isValid()).toBe(true);
33
- expect(result.getWarnings()).toHaveLength(1);
34
- });
35
- });
36
-
37
- describe('addError', () => {
38
- it('adds error to result', () => {
39
- const result = ValidationResult.create();
40
- const error = ValidationError.create({
41
- path: 'name',
42
- message: 'Name is required',
43
- severity: 'error'
44
- });
45
- result.addError(error);
46
- expect(result.isValid()).toBe(false);
47
- expect(result.getErrors()).toContain(error);
48
- });
49
-
50
- it('adds warning without affecting validity', () => {
51
- const result = ValidationResult.create();
52
- const warning = ValidationError.create({
53
- path: 'description',
54
- message: 'Description is recommended',
55
- severity: 'warning'
56
- });
57
- result.addError(warning);
58
- expect(result.isValid()).toBe(true);
59
- expect(result.getWarnings()).toContain(warning);
60
- });
61
- });
62
-
63
- describe('merge', () => {
64
- it('merges two valid results', () => {
65
- const result1 = ValidationResult.create();
66
- const result2 = ValidationResult.create();
67
- const merged = result1.merge(result2);
68
- expect(merged.isValid()).toBe(true);
69
- });
70
-
71
- it('merges results with errors', () => {
72
- const error1 = ValidationError.create({
73
- path: 'name',
74
- message: 'Name required',
75
- severity: 'error'
76
- });
77
- const error2 = ValidationError.create({
78
- path: 'version',
79
- message: 'Version required',
80
- severity: 'error'
81
- });
82
- const result1 = ValidationResult.create({ errors: [error1] });
83
- const result2 = ValidationResult.create({ errors: [error2] });
84
- const merged = result1.merge(result2);
85
- expect(merged.isValid()).toBe(false);
86
- expect(merged.getErrors()).toHaveLength(2);
87
- });
88
-
89
- it('preserves context from both results', () => {
90
- const result1 = ValidationResult.create({ context: { file: 'index.js' } });
91
- const result2 = ValidationResult.create({ context: { integration: 'oauth' } });
92
- const merged = result1.merge(result2);
93
- expect(merged.getContext()).toMatchObject({ file: 'index.js', integration: 'oauth' });
94
- });
95
- });
96
-
97
- describe('filtering', () => {
98
- it('filters errors by path prefix', () => {
99
- const errors = [
100
- ValidationError.create({ path: 'integrations[0].name', message: 'a', severity: 'error' }),
101
- ValidationError.create({ path: 'integrations[1].config', message: 'b', severity: 'error' }),
102
- ValidationError.create({ path: 'database.uri', message: 'c', severity: 'error' })
103
- ];
104
- const result = ValidationResult.create({ errors });
105
- const filtered = result.filterByPath('integrations');
106
- expect(filtered.getErrors()).toHaveLength(2);
107
- });
108
-
109
- it('filters by severity', () => {
110
- const errors = [
111
- ValidationError.create({ path: 'a', message: 'error1', severity: 'error' }),
112
- ValidationError.create({ path: 'b', message: 'warning1', severity: 'warning' }),
113
- ValidationError.create({ path: 'c', message: 'info1', severity: 'info' })
114
- ];
115
- const result = ValidationResult.create({ errors });
116
- expect(result.getBySeverity('error')).toHaveLength(1);
117
- expect(result.getBySeverity('warning')).toHaveLength(1);
118
- expect(result.getBySeverity('info')).toHaveLength(1);
119
- });
120
- });
121
-
122
- describe('summary', () => {
123
- it('generates summary statistics', () => {
124
- const errors = [
125
- ValidationError.create({ path: 'a', message: 'm1', severity: 'error' }),
126
- ValidationError.create({ path: 'b', message: 'm2', severity: 'error' }),
127
- ValidationError.create({ path: 'c', message: 'm3', severity: 'warning' })
128
- ];
129
- const result = ValidationResult.create({ errors });
130
- const summary = result.getSummary();
131
- expect(summary.errorCount).toBe(2);
132
- expect(summary.warningCount).toBe(1);
133
- expect(summary.isValid).toBe(false);
134
- });
135
- });
136
-
137
- describe('serialization', () => {
138
- it('converts to JSON', () => {
139
- const error = ValidationError.create({
140
- path: 'name',
141
- message: 'Required',
142
- severity: 'error',
143
- fix: FixSuggestion.create({ action: 'add', description: 'Add name field' })
144
- });
145
- const result = ValidationResult.create({ errors: [error] });
146
- const json = result.toJSON();
147
- expect(json).toHaveProperty('valid', false);
148
- expect(json).toHaveProperty('errors');
149
- expect(json.errors[0]).toHaveProperty('path', 'name');
150
- });
151
- });
152
- });