@friggframework/devtools 2.0.0-next.44 → 2.0.0-next.46

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 (212) hide show
  1. package/infrastructure/ARCHITECTURE.md +487 -0
  2. package/infrastructure/HEALTH.md +468 -0
  3. package/infrastructure/README.md +51 -0
  4. package/infrastructure/__tests__/postgres-config.test.js +914 -0
  5. package/infrastructure/__tests__/template-generation.test.js +687 -0
  6. package/infrastructure/create-frigg-infrastructure.js +1 -1
  7. package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
  8. package/infrastructure/{DEPLOYMENT-INSTRUCTIONS.md → docs/deployment-instructions.md} +3 -3
  9. package/infrastructure/{IAM-POLICY-TEMPLATES.md → docs/iam-policy-templates.md} +9 -10
  10. package/infrastructure/domains/database/aurora-builder.js +809 -0
  11. package/infrastructure/domains/database/aurora-builder.test.js +950 -0
  12. package/infrastructure/domains/database/aurora-discovery.js +87 -0
  13. package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
  14. package/infrastructure/domains/database/aurora-resolver.js +210 -0
  15. package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
  16. package/infrastructure/domains/database/migration-builder.js +633 -0
  17. package/infrastructure/domains/database/migration-builder.test.js +294 -0
  18. package/infrastructure/domains/database/migration-resolver.js +163 -0
  19. package/infrastructure/domains/database/migration-resolver.test.js +337 -0
  20. package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
  21. package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
  22. package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
  23. package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
  24. package/infrastructure/domains/health/application/ports/index.js +26 -0
  25. package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
  26. package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
  27. package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
  28. package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
  29. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
  30. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
  31. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
  32. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
  33. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
  34. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
  35. package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
  36. package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
  37. package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
  38. package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
  39. package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
  40. package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
  41. package/infrastructure/domains/health/domain/entities/issue.js +299 -0
  42. package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
  43. package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
  44. package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
  45. package/infrastructure/domains/health/domain/entities/resource.js +159 -0
  46. package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
  47. package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
  48. package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
  49. package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
  50. package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
  51. package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
  52. package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
  53. package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
  54. package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
  55. package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
  56. package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
  57. package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
  58. package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
  59. package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
  60. package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
  61. package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
  62. package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
  63. package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
  64. package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
  65. package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
  66. package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
  67. package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
  68. package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
  69. package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
  70. package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
  71. package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
  72. package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
  73. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
  74. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
  75. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
  76. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
  77. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
  78. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
  79. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
  80. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
  81. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
  82. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
  83. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
  84. package/infrastructure/domains/integration/integration-builder.js +397 -0
  85. package/infrastructure/domains/integration/integration-builder.test.js +593 -0
  86. package/infrastructure/domains/integration/integration-resolver.js +170 -0
  87. package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
  88. package/infrastructure/domains/integration/websocket-builder.js +69 -0
  89. package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
  90. package/infrastructure/domains/networking/vpc-builder.js +1829 -0
  91. package/infrastructure/domains/networking/vpc-builder.test.js +1262 -0
  92. package/infrastructure/domains/networking/vpc-discovery.js +177 -0
  93. package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
  94. package/infrastructure/domains/networking/vpc-resolver.js +324 -0
  95. package/infrastructure/domains/networking/vpc-resolver.test.js +501 -0
  96. package/infrastructure/domains/parameters/ssm-builder.js +79 -0
  97. package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
  98. package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
  99. package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
  100. package/infrastructure/{iam-generator.js → domains/security/iam-generator.js} +2 -2
  101. package/infrastructure/domains/security/kms-builder.js +366 -0
  102. package/infrastructure/domains/security/kms-builder.test.js +374 -0
  103. package/infrastructure/domains/security/kms-discovery.js +80 -0
  104. package/infrastructure/domains/security/kms-discovery.test.js +177 -0
  105. package/infrastructure/domains/security/kms-resolver.js +96 -0
  106. package/infrastructure/domains/security/kms-resolver.test.js +216 -0
  107. package/infrastructure/domains/shared/base-builder.js +112 -0
  108. package/infrastructure/domains/shared/base-resolver.js +186 -0
  109. package/infrastructure/domains/shared/base-resolver.test.js +305 -0
  110. package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
  111. package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
  112. package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
  113. package/infrastructure/domains/shared/cloudformation-discovery.js +375 -0
  114. package/infrastructure/domains/shared/cloudformation-discovery.test.js +590 -0
  115. package/infrastructure/domains/shared/environment-builder.js +119 -0
  116. package/infrastructure/domains/shared/environment-builder.test.js +247 -0
  117. package/infrastructure/domains/shared/providers/aws-provider-adapter.js +544 -0
  118. package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +377 -0
  119. package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
  120. package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
  121. package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
  122. package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
  123. package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
  124. package/infrastructure/domains/shared/resource-discovery.js +192 -0
  125. package/infrastructure/domains/shared/resource-discovery.test.js +552 -0
  126. package/infrastructure/domains/shared/types/app-definition.js +205 -0
  127. package/infrastructure/domains/shared/types/discovery-result.js +106 -0
  128. package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
  129. package/infrastructure/domains/shared/types/index.js +46 -0
  130. package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
  131. package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
  132. package/infrastructure/domains/shared/utilities/base-definition-factory.js +380 -0
  133. package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
  134. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +248 -0
  135. package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
  136. package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
  137. package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +55 -0
  138. package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +138 -0
  139. package/infrastructure/{env-validator.js → domains/shared/validation/env-validator.js} +2 -1
  140. package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
  141. package/infrastructure/esbuild.config.js +53 -0
  142. package/infrastructure/infrastructure-composer.js +87 -0
  143. package/infrastructure/{serverless-template.test.js → infrastructure-composer.test.js} +115 -24
  144. package/infrastructure/scripts/build-prisma-layer.js +553 -0
  145. package/infrastructure/scripts/build-prisma-layer.test.js +102 -0
  146. package/infrastructure/{build-time-discovery.js → scripts/build-time-discovery.js} +80 -48
  147. package/infrastructure/{build-time-discovery.test.js → scripts/build-time-discovery.test.js} +5 -4
  148. package/layers/prisma/nodejs/package.json +8 -0
  149. package/management-ui/server/utils/cliIntegration.js +1 -1
  150. package/management-ui/server/utils/environment/awsParameterStore.js +29 -18
  151. package/package.json +11 -11
  152. package/frigg-cli/.eslintrc.js +0 -141
  153. package/frigg-cli/__tests__/unit/commands/build.test.js +0 -251
  154. package/frigg-cli/__tests__/unit/commands/db-setup.test.js +0 -548
  155. package/frigg-cli/__tests__/unit/commands/install.test.js +0 -400
  156. package/frigg-cli/__tests__/unit/commands/ui.test.js +0 -346
  157. package/frigg-cli/__tests__/unit/utils/database-validator.test.js +0 -366
  158. package/frigg-cli/__tests__/unit/utils/error-messages.test.js +0 -304
  159. package/frigg-cli/__tests__/unit/utils/prisma-runner.test.js +0 -486
  160. package/frigg-cli/__tests__/utils/mock-factory.js +0 -270
  161. package/frigg-cli/__tests__/utils/prisma-mock.js +0 -194
  162. package/frigg-cli/__tests__/utils/test-fixtures.js +0 -463
  163. package/frigg-cli/__tests__/utils/test-setup.js +0 -287
  164. package/frigg-cli/build-command/index.js +0 -65
  165. package/frigg-cli/db-setup-command/index.js +0 -193
  166. package/frigg-cli/deploy-command/index.js +0 -175
  167. package/frigg-cli/generate-command/__tests__/generate-command.test.js +0 -301
  168. package/frigg-cli/generate-command/azure-generator.js +0 -43
  169. package/frigg-cli/generate-command/gcp-generator.js +0 -47
  170. package/frigg-cli/generate-command/index.js +0 -332
  171. package/frigg-cli/generate-command/terraform-generator.js +0 -555
  172. package/frigg-cli/generate-iam-command.js +0 -118
  173. package/frigg-cli/index.js +0 -75
  174. package/frigg-cli/index.test.js +0 -158
  175. package/frigg-cli/init-command/backend-first-handler.js +0 -756
  176. package/frigg-cli/init-command/index.js +0 -93
  177. package/frigg-cli/init-command/template-handler.js +0 -143
  178. package/frigg-cli/install-command/backend-js.js +0 -33
  179. package/frigg-cli/install-command/commit-changes.js +0 -16
  180. package/frigg-cli/install-command/environment-variables.js +0 -127
  181. package/frigg-cli/install-command/environment-variables.test.js +0 -136
  182. package/frigg-cli/install-command/index.js +0 -54
  183. package/frigg-cli/install-command/install-package.js +0 -13
  184. package/frigg-cli/install-command/integration-file.js +0 -30
  185. package/frigg-cli/install-command/logger.js +0 -12
  186. package/frigg-cli/install-command/template.js +0 -90
  187. package/frigg-cli/install-command/validate-package.js +0 -75
  188. package/frigg-cli/jest.config.js +0 -124
  189. package/frigg-cli/package.json +0 -54
  190. package/frigg-cli/start-command/index.js +0 -149
  191. package/frigg-cli/start-command/start-command.test.js +0 -297
  192. package/frigg-cli/test/init-command.test.js +0 -180
  193. package/frigg-cli/test/npm-registry.test.js +0 -319
  194. package/frigg-cli/ui-command/index.js +0 -154
  195. package/frigg-cli/utils/app-resolver.js +0 -319
  196. package/frigg-cli/utils/backend-path.js +0 -25
  197. package/frigg-cli/utils/database-validator.js +0 -161
  198. package/frigg-cli/utils/error-messages.js +0 -257
  199. package/frigg-cli/utils/npm-registry.js +0 -167
  200. package/frigg-cli/utils/prisma-runner.js +0 -280
  201. package/frigg-cli/utils/process-manager.js +0 -199
  202. package/frigg-cli/utils/repo-detection.js +0 -405
  203. package/infrastructure/aws-discovery.js +0 -1176
  204. package/infrastructure/aws-discovery.test.js +0 -1220
  205. package/infrastructure/serverless-template.js +0 -2074
  206. /package/infrastructure/{WEBSOCKET-CONFIGURATION.md → docs/WEBSOCKET-CONFIGURATION.md} +0 -0
  207. /package/infrastructure/{GENERATE-IAM-DOCS.md → docs/generate-iam-command.md} +0 -0
  208. /package/infrastructure/{iam-generator.test.js → domains/security/iam-generator.test.js} +0 -0
  209. /package/infrastructure/{frigg-deployment-iam-stack.yaml → domains/security/templates/frigg-deployment-iam-stack.yaml} +0 -0
  210. /package/infrastructure/{iam-policy-basic.json → domains/security/templates/iam-policy-basic.json} +0 -0
  211. /package/infrastructure/{iam-policy-full.json → domains/security/templates/iam-policy-full.json} +0 -0
  212. /package/infrastructure/{run-discovery.js → scripts/run-discovery.js} +0 -0
@@ -1,251 +0,0 @@
1
- /**
2
- * Test suite for build command
3
- *
4
- * Tests the serverless package build functionality including:
5
- * - Command execution with spawnSync
6
- * - Stage option handling
7
- * - Verbose flag support
8
- * - Environment variable setup
9
- * - Error handling and process exit
10
- */
11
-
12
- // Mock dependencies BEFORE requiring modules
13
- jest.mock('child_process', () => ({
14
- spawnSync: jest.fn()
15
- }));
16
-
17
- // Require after mocks
18
- const { spawnSync } = require('child_process');
19
- const { buildCommand } = require('../../../build-command');
20
-
21
- describe('CLI Command: build', () => {
22
- let consoleLogSpy;
23
- let consoleErrorSpy;
24
- let processExitSpy;
25
- let originalCwd;
26
-
27
- beforeEach(() => {
28
- jest.clearAllMocks();
29
-
30
- // Mock console methods
31
- consoleLogSpy = jest.spyOn(console, 'log').mockImplementation();
32
- consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
33
-
34
- // Mock process.exit to prevent actual exit
35
- processExitSpy = jest.spyOn(process, 'exit').mockImplementation();
36
-
37
- // Mock successful serverless execution by default
38
- spawnSync.mockReturnValue({ status: 0 });
39
-
40
- // Store original cwd for restoration
41
- originalCwd = process.cwd();
42
- });
43
-
44
- afterEach(() => {
45
- consoleLogSpy.mockRestore();
46
- consoleErrorSpy.mockRestore();
47
- processExitSpy.mockRestore();
48
- });
49
-
50
- describe('Success Cases', () => {
51
- it('should spawn serverless with default stage', async () => {
52
- await buildCommand({ stage: 'dev' });
53
-
54
- expect(spawnSync).toHaveBeenCalledWith(
55
- 'serverless',
56
- ['package', '--config', 'infrastructure.js', '--stage', 'dev'],
57
- expect.objectContaining({
58
- cwd: expect.any(String),
59
- stdio: 'inherit',
60
- shell: true
61
- })
62
- );
63
- });
64
-
65
- it('should spawn serverless with production stage', async () => {
66
- await buildCommand({ stage: 'production' });
67
-
68
- expect(spawnSync).toHaveBeenCalledWith(
69
- 'serverless',
70
- expect.arrayContaining(['--stage', 'production']),
71
- expect.any(Object)
72
- );
73
- });
74
-
75
- it('should spawn serverless with staging stage', async () => {
76
- await buildCommand({ stage: 'staging' });
77
-
78
- expect(spawnSync).toHaveBeenCalledWith(
79
- 'serverless',
80
- expect.arrayContaining(['--stage', 'staging']),
81
- expect.any(Object)
82
- );
83
- });
84
-
85
- it('should append verbose flag when verbose option is true', async () => {
86
- await buildCommand({ stage: 'dev', verbose: true });
87
-
88
- expect(spawnSync).toHaveBeenCalledWith(
89
- 'serverless',
90
- expect.arrayContaining(['--verbose']),
91
- expect.any(Object)
92
- );
93
- });
94
-
95
- it('should NOT append verbose flag when verbose option is false', async () => {
96
- await buildCommand({ stage: 'dev', verbose: false });
97
-
98
- const call = spawnSync.mock.calls[0];
99
- const args = call[1];
100
-
101
- expect(args).not.toContain('--verbose');
102
- });
103
-
104
- it('should use process.cwd() as working directory', async () => {
105
- await buildCommand({ stage: 'dev' });
106
-
107
- const call = spawnSync.mock.calls[0];
108
- const options = call[2];
109
-
110
- // Verify ACTUAL cwd value, not generic check
111
- expect(options.cwd).toBe(process.cwd());
112
- });
113
-
114
- it('should use stdio inherit for output streaming', async () => {
115
- await buildCommand({ stage: 'dev' });
116
-
117
- const call = spawnSync.mock.calls[0];
118
- const options = call[2];
119
-
120
- expect(options.stdio).toBe('inherit');
121
- });
122
-
123
- it('should use shell mode for execution', async () => {
124
- await buildCommand({ stage: 'dev' });
125
-
126
- const call = spawnSync.mock.calls[0];
127
- const options = call[2];
128
-
129
- expect(options.shell).toBe(true);
130
- });
131
-
132
- it('should set NODE_PATH environment variable with actual resolved path', async () => {
133
- await buildCommand({ stage: 'dev' });
134
-
135
- const call = spawnSync.mock.calls[0];
136
- const options = call[2];
137
-
138
- // Verify ACTUAL resolved path, not just "contains node_modules"
139
- const path = require('path');
140
- const expectedNodePath = path.resolve(process.cwd(), 'node_modules');
141
-
142
- expect(options.env.NODE_PATH).toBe(expectedNodePath);
143
- });
144
-
145
- it('should pass through all process.env variables', async () => {
146
- // Set a test env var
147
- process.env.TEST_VAR = 'test-value';
148
-
149
- await buildCommand({ stage: 'dev' });
150
-
151
- const call = spawnSync.mock.calls[0];
152
- const options = call[2];
153
-
154
- // Verify parent env vars are passed through
155
- expect(options.env.TEST_VAR).toBe('test-value');
156
-
157
- delete process.env.TEST_VAR;
158
- });
159
-
160
- it('should use infrastructure.js as config file', async () => {
161
- await buildCommand({ stage: 'dev' });
162
-
163
- expect(spawnSync).toHaveBeenCalledWith(
164
- 'serverless',
165
- expect.arrayContaining(['--config', 'infrastructure.js']),
166
- expect.any(Object)
167
- );
168
- });
169
-
170
- it('should NOT call process.exit when build succeeds', async () => {
171
- spawnSync.mockReturnValue({ status: 0 });
172
-
173
- await buildCommand({ stage: 'dev' });
174
-
175
- expect(processExitSpy).not.toHaveBeenCalled();
176
- });
177
-
178
- it('should log build start messages', async () => {
179
- await buildCommand({ stage: 'dev' });
180
-
181
- expect(consoleLogSpy).toHaveBeenCalledWith('Building the serverless application...');
182
- expect(consoleLogSpy).toHaveBeenCalledWith('📦 Packaging serverless application...');
183
- });
184
-
185
- it('should construct complete valid serverless command', async () => {
186
- await buildCommand({ stage: 'production', verbose: true });
187
-
188
- const [cmd, args, opts] = spawnSync.mock.calls[0];
189
-
190
- // Verify complete command structure
191
- expect(cmd).toBe('serverless');
192
- expect(args).toEqual([
193
- 'package',
194
- '--config',
195
- 'infrastructure.js',
196
- '--stage',
197
- 'production',
198
- '--verbose'
199
- ]);
200
-
201
- // Verify all required options present
202
- expect(opts.cwd).toBeDefined();
203
- expect(opts.stdio).toBe('inherit');
204
- expect(opts.shell).toBe(true);
205
- expect(opts.env).toBeDefined();
206
- expect(opts.env.NODE_PATH).toBeDefined();
207
- });
208
-
209
- it('should build command without verbose when verbose=false', async () => {
210
- await buildCommand({ stage: 'dev', verbose: false });
211
-
212
- const [, args] = spawnSync.mock.calls[0];
213
-
214
- // Verify exact args without verbose
215
- expect(args).toEqual([
216
- 'package',
217
- '--config',
218
- 'infrastructure.js',
219
- '--stage',
220
- 'dev'
221
- ]);
222
- });
223
- });
224
-
225
- describe('Error Handling', () => {
226
- it('should exit with code 1 when serverless fails', async () => {
227
- spawnSync.mockReturnValue({ status: 1 });
228
-
229
- await buildCommand({ stage: 'dev' });
230
-
231
- expect(processExitSpy).toHaveBeenCalledWith(1);
232
- });
233
-
234
- it('should log error message when build fails', async () => {
235
- spawnSync.mockReturnValue({ status: 2 });
236
-
237
- await buildCommand({ stage: 'dev' });
238
-
239
- expect(consoleErrorSpy).toHaveBeenCalledWith('Serverless build failed with code 2');
240
- });
241
-
242
- it('should exit with code 1 for any non-zero status', async () => {
243
- spawnSync.mockReturnValue({ status: 127 });
244
-
245
- await buildCommand({ stage: 'dev' });
246
-
247
- expect(processExitSpy).toHaveBeenCalledWith(1);
248
- expect(consoleErrorSpy).toHaveBeenCalledWith('Serverless build failed with code 127');
249
- });
250
- });
251
- });