@friggframework/devtools 2.0.0-next.45 → 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.
- package/infrastructure/ARCHITECTURE.md +487 -0
- package/infrastructure/HEALTH.md +468 -0
- package/infrastructure/README.md +51 -0
- package/infrastructure/__tests__/postgres-config.test.js +914 -0
- package/infrastructure/__tests__/template-generation.test.js +687 -0
- package/infrastructure/create-frigg-infrastructure.js +1 -1
- package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
- package/infrastructure/{DEPLOYMENT-INSTRUCTIONS.md → docs/deployment-instructions.md} +3 -3
- package/infrastructure/{IAM-POLICY-TEMPLATES.md → docs/iam-policy-templates.md} +9 -10
- package/infrastructure/domains/database/aurora-builder.js +809 -0
- package/infrastructure/domains/database/aurora-builder.test.js +950 -0
- package/infrastructure/domains/database/aurora-discovery.js +87 -0
- package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
- package/infrastructure/domains/database/aurora-resolver.js +210 -0
- package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
- package/infrastructure/domains/database/migration-builder.js +633 -0
- package/infrastructure/domains/database/migration-builder.test.js +294 -0
- package/infrastructure/domains/database/migration-resolver.js +163 -0
- package/infrastructure/domains/database/migration-resolver.test.js +337 -0
- package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
- package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
- package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
- package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
- package/infrastructure/domains/health/application/ports/index.js +26 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
- package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
- package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
- package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
- package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
- package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
- package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
- package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
- package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
- package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
- package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
- package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
- package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
- package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
- package/infrastructure/domains/health/domain/entities/issue.js +299 -0
- package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
- package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
- package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
- package/infrastructure/domains/health/domain/entities/resource.js +159 -0
- package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
- package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
- package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
- package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
- package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
- package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
- package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
- package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
- package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
- package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
- package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
- package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
- package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
- package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
- package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
- package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
- package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
- package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
- package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
- package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
- package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
- package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
- package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
- package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
- package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
- package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
- package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
- package/infrastructure/domains/integration/integration-builder.js +397 -0
- package/infrastructure/domains/integration/integration-builder.test.js +593 -0
- package/infrastructure/domains/integration/integration-resolver.js +170 -0
- package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
- package/infrastructure/domains/integration/websocket-builder.js +69 -0
- package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
- package/infrastructure/domains/networking/vpc-builder.js +1829 -0
- package/infrastructure/domains/networking/vpc-builder.test.js +1262 -0
- package/infrastructure/domains/networking/vpc-discovery.js +177 -0
- package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
- package/infrastructure/domains/networking/vpc-resolver.js +324 -0
- package/infrastructure/domains/networking/vpc-resolver.test.js +501 -0
- package/infrastructure/domains/parameters/ssm-builder.js +79 -0
- package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
- package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
- package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
- package/infrastructure/{iam-generator.js → domains/security/iam-generator.js} +2 -2
- package/infrastructure/domains/security/kms-builder.js +366 -0
- package/infrastructure/domains/security/kms-builder.test.js +374 -0
- package/infrastructure/domains/security/kms-discovery.js +80 -0
- package/infrastructure/domains/security/kms-discovery.test.js +177 -0
- package/infrastructure/domains/security/kms-resolver.js +96 -0
- package/infrastructure/domains/security/kms-resolver.test.js +216 -0
- package/infrastructure/domains/shared/base-builder.js +112 -0
- package/infrastructure/domains/shared/base-resolver.js +186 -0
- package/infrastructure/domains/shared/base-resolver.test.js +305 -0
- package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
- package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
- package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
- package/infrastructure/domains/shared/cloudformation-discovery.js +375 -0
- package/infrastructure/domains/shared/cloudformation-discovery.test.js +590 -0
- package/infrastructure/domains/shared/environment-builder.js +119 -0
- package/infrastructure/domains/shared/environment-builder.test.js +247 -0
- package/infrastructure/domains/shared/providers/aws-provider-adapter.js +544 -0
- package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +377 -0
- package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
- package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
- package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
- package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
- package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
- package/infrastructure/domains/shared/resource-discovery.js +192 -0
- package/infrastructure/domains/shared/resource-discovery.test.js +552 -0
- package/infrastructure/domains/shared/types/app-definition.js +205 -0
- package/infrastructure/domains/shared/types/discovery-result.js +106 -0
- package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
- package/infrastructure/domains/shared/types/index.js +46 -0
- package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
- package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.js +380 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +248 -0
- package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
- package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
- package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +55 -0
- package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +138 -0
- package/infrastructure/{env-validator.js → domains/shared/validation/env-validator.js} +2 -1
- package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
- package/infrastructure/esbuild.config.js +53 -0
- package/infrastructure/infrastructure-composer.js +87 -0
- package/infrastructure/{serverless-template.test.js → infrastructure-composer.test.js} +115 -24
- package/infrastructure/scripts/build-prisma-layer.js +553 -0
- package/infrastructure/scripts/build-prisma-layer.test.js +102 -0
- package/infrastructure/{build-time-discovery.js → scripts/build-time-discovery.js} +80 -48
- package/infrastructure/{build-time-discovery.test.js → scripts/build-time-discovery.test.js} +5 -4
- package/layers/prisma/nodejs/package.json +8 -0
- package/management-ui/server/utils/cliIntegration.js +1 -1
- package/management-ui/server/utils/environment/awsParameterStore.js +29 -18
- package/package.json +11 -11
- package/frigg-cli/.eslintrc.js +0 -141
- package/frigg-cli/__tests__/unit/commands/build.test.js +0 -251
- package/frigg-cli/__tests__/unit/commands/db-setup.test.js +0 -548
- package/frigg-cli/__tests__/unit/commands/install.test.js +0 -400
- package/frigg-cli/__tests__/unit/commands/ui.test.js +0 -346
- package/frigg-cli/__tests__/unit/utils/database-validator.test.js +0 -366
- package/frigg-cli/__tests__/unit/utils/error-messages.test.js +0 -304
- package/frigg-cli/__tests__/unit/utils/prisma-runner.test.js +0 -486
- package/frigg-cli/__tests__/utils/mock-factory.js +0 -270
- package/frigg-cli/__tests__/utils/prisma-mock.js +0 -194
- package/frigg-cli/__tests__/utils/test-fixtures.js +0 -463
- package/frigg-cli/__tests__/utils/test-setup.js +0 -287
- package/frigg-cli/build-command/index.js +0 -65
- package/frigg-cli/db-setup-command/index.js +0 -193
- package/frigg-cli/deploy-command/index.js +0 -175
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +0 -301
- package/frigg-cli/generate-command/azure-generator.js +0 -43
- package/frigg-cli/generate-command/gcp-generator.js +0 -47
- package/frigg-cli/generate-command/index.js +0 -332
- package/frigg-cli/generate-command/terraform-generator.js +0 -555
- package/frigg-cli/generate-iam-command.js +0 -118
- package/frigg-cli/index.js +0 -75
- package/frigg-cli/index.test.js +0 -158
- package/frigg-cli/init-command/backend-first-handler.js +0 -756
- package/frigg-cli/init-command/index.js +0 -93
- package/frigg-cli/init-command/template-handler.js +0 -143
- package/frigg-cli/install-command/backend-js.js +0 -33
- package/frigg-cli/install-command/commit-changes.js +0 -16
- package/frigg-cli/install-command/environment-variables.js +0 -127
- package/frigg-cli/install-command/environment-variables.test.js +0 -136
- package/frigg-cli/install-command/index.js +0 -54
- package/frigg-cli/install-command/install-package.js +0 -13
- package/frigg-cli/install-command/integration-file.js +0 -30
- package/frigg-cli/install-command/logger.js +0 -12
- package/frigg-cli/install-command/template.js +0 -90
- package/frigg-cli/install-command/validate-package.js +0 -75
- package/frigg-cli/jest.config.js +0 -124
- package/frigg-cli/package.json +0 -54
- package/frigg-cli/start-command/index.js +0 -149
- package/frigg-cli/start-command/start-command.test.js +0 -297
- package/frigg-cli/test/init-command.test.js +0 -180
- package/frigg-cli/test/npm-registry.test.js +0 -319
- package/frigg-cli/ui-command/index.js +0 -154
- package/frigg-cli/utils/app-resolver.js +0 -319
- package/frigg-cli/utils/backend-path.js +0 -25
- package/frigg-cli/utils/database-validator.js +0 -161
- package/frigg-cli/utils/error-messages.js +0 -257
- package/frigg-cli/utils/npm-registry.js +0 -167
- package/frigg-cli/utils/prisma-runner.js +0 -280
- package/frigg-cli/utils/process-manager.js +0 -199
- package/frigg-cli/utils/repo-detection.js +0 -405
- package/infrastructure/aws-discovery.js +0 -1176
- package/infrastructure/aws-discovery.test.js +0 -1220
- package/infrastructure/serverless-template.js +0 -2094
- /package/infrastructure/{WEBSOCKET-CONFIGURATION.md → docs/WEBSOCKET-CONFIGURATION.md} +0 -0
- /package/infrastructure/{GENERATE-IAM-DOCS.md → docs/generate-iam-command.md} +0 -0
- /package/infrastructure/{iam-generator.test.js → domains/security/iam-generator.test.js} +0 -0
- /package/infrastructure/{frigg-deployment-iam-stack.yaml → domains/security/templates/frigg-deployment-iam-stack.yaml} +0 -0
- /package/infrastructure/{iam-policy-basic.json → domains/security/templates/iam-policy-basic.json} +0 -0
- /package/infrastructure/{iam-policy-full.json → domains/security/templates/iam-policy-full.json} +0 -0
- /package/infrastructure/{run-discovery.js → scripts/run-discovery.js} +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IResourceImporter Port Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines operations for importing existing cloud resources into CloudFormation stacks.
|
|
5
|
+
* This is used by the "frigg repair --import" command to fix orphaned resources.
|
|
6
|
+
*
|
|
7
|
+
* This is a port in the hexagonal architecture that will be implemented
|
|
8
|
+
* by provider-specific adapters (e.g., AWSResourceImporter).
|
|
9
|
+
*
|
|
10
|
+
* Purpose: Abstract CloudFormation resource import operations from the domain layer
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
class IResourceImporter {
|
|
14
|
+
/**
|
|
15
|
+
* Check if a resource type supports import
|
|
16
|
+
*
|
|
17
|
+
* @param {string} resourceType - CloudFormation resource type (e.g., AWS::EC2::VPC)
|
|
18
|
+
* @returns {Promise<boolean>} True if resource type can be imported
|
|
19
|
+
*/
|
|
20
|
+
async supportsImport(resourceType) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
'IResourceImporter.supportsImport() must be implemented by adapter'
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Get the identifier property for a resource type
|
|
28
|
+
* (e.g., "VpcId" for AWS::EC2::VPC, "BucketName" for AWS::S3::Bucket)
|
|
29
|
+
*
|
|
30
|
+
* @param {string} resourceType - CloudFormation resource type
|
|
31
|
+
* @returns {Promise<string>} Property name used as identifier for import
|
|
32
|
+
* @throws {Error} If resource type doesn't support import
|
|
33
|
+
*/
|
|
34
|
+
async getIdentifierProperty(resourceType) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
'IResourceImporter.getIdentifierProperty() must be implemented by adapter'
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Validate that a resource can be imported
|
|
42
|
+
*
|
|
43
|
+
* @param {Object} params
|
|
44
|
+
* @param {string} params.resourceType - CloudFormation resource type
|
|
45
|
+
* @param {string} params.physicalId - Physical resource ID
|
|
46
|
+
* @param {string} params.region - AWS region
|
|
47
|
+
* @returns {Promise<Object>} Validation result
|
|
48
|
+
* @returns {Promise<Object>} Result with properties:
|
|
49
|
+
* - canImport: boolean
|
|
50
|
+
* - reason: string (explanation if cannot import)
|
|
51
|
+
* - warnings: Array<string> (potential issues with import)
|
|
52
|
+
*/
|
|
53
|
+
async validateImport({ resourceType, physicalId, region }) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
'IResourceImporter.validateImport() must be implemented by adapter'
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Import a single resource into a stack
|
|
61
|
+
*
|
|
62
|
+
* @param {Object} params
|
|
63
|
+
* @param {StackIdentifier} params.stackIdentifier - Target stack
|
|
64
|
+
* @param {string} params.logicalId - Desired logical ID for the resource
|
|
65
|
+
* @param {string} params.resourceType - CloudFormation resource type
|
|
66
|
+
* @param {string} params.physicalId - Physical resource ID to import
|
|
67
|
+
* @param {Object} params.properties - Resource properties for template
|
|
68
|
+
* @returns {Promise<Object>} Import operation result
|
|
69
|
+
* @returns {Promise<Object>} Result with properties:
|
|
70
|
+
* - operationId: string (CloudFormation change set ID)
|
|
71
|
+
* - status: string (IN_PROGRESS, COMPLETE, FAILED)
|
|
72
|
+
* - message: string (status message)
|
|
73
|
+
* @throws {Error} If import fails validation or execution
|
|
74
|
+
*/
|
|
75
|
+
async importResource({ stackIdentifier, logicalId, resourceType, physicalId, properties }) {
|
|
76
|
+
throw new Error(
|
|
77
|
+
'IResourceImporter.importResource() must be implemented by adapter'
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Import multiple resources into a stack in a single operation
|
|
83
|
+
*
|
|
84
|
+
* @param {Object} params
|
|
85
|
+
* @param {StackIdentifier} params.stackIdentifier - Target stack
|
|
86
|
+
* @param {Array<Object>} params.resources - Resources to import
|
|
87
|
+
* @param {string} params.resources[].logicalId - Desired logical ID
|
|
88
|
+
* @param {string} params.resources[].resourceType - CloudFormation resource type
|
|
89
|
+
* @param {string} params.resources[].physicalId - Physical resource ID
|
|
90
|
+
* @param {Object} params.resources[].properties - Resource properties
|
|
91
|
+
* @returns {Promise<Object>} Import operation result
|
|
92
|
+
* @returns {Promise<Object>} Result with properties:
|
|
93
|
+
* - operationId: string (CloudFormation change set ID)
|
|
94
|
+
* - status: string (IN_PROGRESS, COMPLETE, FAILED)
|
|
95
|
+
* - importedCount: number
|
|
96
|
+
* - failedCount: number
|
|
97
|
+
* - message: string
|
|
98
|
+
* - details: Array<Object> (per-resource status)
|
|
99
|
+
* @throws {Error} If import fails validation or execution
|
|
100
|
+
*/
|
|
101
|
+
async importMultipleResources({ stackIdentifier, resources }) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
'IResourceImporter.importMultipleResources() must be implemented by adapter'
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get status of an import operation
|
|
109
|
+
*
|
|
110
|
+
* @param {string} operationId - CloudFormation change set ID
|
|
111
|
+
* @returns {Promise<Object>} Operation status
|
|
112
|
+
* @returns {Promise<Object>} Status with properties:
|
|
113
|
+
* - operationId: string
|
|
114
|
+
* - status: string (IN_PROGRESS, COMPLETE, FAILED)
|
|
115
|
+
* - progress: number (0-100)
|
|
116
|
+
* - message: string
|
|
117
|
+
* - completedTime: Date (if complete)
|
|
118
|
+
*/
|
|
119
|
+
async getImportStatus(operationId) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
'IResourceImporter.getImportStatus() must be implemented by adapter'
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Generate CloudFormation template snippet for an imported resource
|
|
127
|
+
*
|
|
128
|
+
* @param {Object} params
|
|
129
|
+
* @param {string} params.logicalId - Logical ID for the resource
|
|
130
|
+
* @param {string} params.resourceType - CloudFormation resource type
|
|
131
|
+
* @param {Object} params.properties - Current resource properties from cloud
|
|
132
|
+
* @returns {Promise<Object>} Template snippet for the resource
|
|
133
|
+
* @returns {Promise<Object>} Template snippet with CloudFormation resource definition
|
|
134
|
+
*/
|
|
135
|
+
async generateTemplateSnippet({ logicalId, resourceType, properties }) {
|
|
136
|
+
throw new Error(
|
|
137
|
+
'IResourceImporter.generateTemplateSnippet() must be implemented by adapter'
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
module.exports = IResourceImporter;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IStackRepository Port Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines operations for accessing CloudFormation stack information.
|
|
5
|
+
* This is a port in the hexagonal architecture that will be implemented
|
|
6
|
+
* by provider-specific adapters (e.g., AWSStackRepository).
|
|
7
|
+
*
|
|
8
|
+
* Purpose: Abstract CloudFormation API interactions from the domain layer
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
class IStackRepository {
|
|
12
|
+
/**
|
|
13
|
+
* Get stack information by identifier
|
|
14
|
+
*
|
|
15
|
+
* @param {StackIdentifier} identifier - Stack identifier
|
|
16
|
+
* @returns {Promise<Object>} Stack information
|
|
17
|
+
* @returns {Promise<Object>} Stack information with properties:
|
|
18
|
+
* - stackName: string
|
|
19
|
+
* - region: string
|
|
20
|
+
* - accountId: string
|
|
21
|
+
* - stackId: string (ARN)
|
|
22
|
+
* - status: string (CREATE_COMPLETE, UPDATE_COMPLETE, etc.)
|
|
23
|
+
* - creationTime: Date
|
|
24
|
+
* - lastUpdatedTime: Date
|
|
25
|
+
* - parameters: Object (key-value pairs)
|
|
26
|
+
* - outputs: Object (key-value pairs)
|
|
27
|
+
* - tags: Object (key-value pairs)
|
|
28
|
+
* @throws {Error} If stack does not exist
|
|
29
|
+
*/
|
|
30
|
+
async getStack(identifier) {
|
|
31
|
+
throw new Error('IStackRepository.getStack() must be implemented by adapter');
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* List all resources in a stack
|
|
36
|
+
*
|
|
37
|
+
* @param {StackIdentifier} identifier - Stack identifier
|
|
38
|
+
* @returns {Promise<Array>} Array of stack resources
|
|
39
|
+
* @returns {Promise<Array<Object>>} Array of resources with properties:
|
|
40
|
+
* - logicalId: string (CloudFormation logical ID)
|
|
41
|
+
* - physicalId: string (actual cloud resource ID)
|
|
42
|
+
* - resourceType: string (e.g., AWS::EC2::VPC)
|
|
43
|
+
* - status: string (CREATE_COMPLETE, UPDATE_COMPLETE, etc.)
|
|
44
|
+
* - lastUpdatedTime: Date
|
|
45
|
+
* - driftStatus: string (IN_SYNC, MODIFIED, DELETED, NOT_CHECKED)
|
|
46
|
+
* @throws {Error} If stack does not exist
|
|
47
|
+
*/
|
|
48
|
+
async listResources(identifier) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
'IStackRepository.listResources() must be implemented by adapter'
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get resource details from stack
|
|
56
|
+
*
|
|
57
|
+
* @param {StackIdentifier} identifier - Stack identifier
|
|
58
|
+
* @param {string} logicalId - Logical resource ID
|
|
59
|
+
* @returns {Promise<Object>} Resource details
|
|
60
|
+
* @returns {Promise<Object>} Resource with properties:
|
|
61
|
+
* - logicalId: string
|
|
62
|
+
* - physicalId: string
|
|
63
|
+
* - resourceType: string
|
|
64
|
+
* - status: string
|
|
65
|
+
* - properties: Object (current resource properties)
|
|
66
|
+
* - metadata: Object (resource metadata from template)
|
|
67
|
+
* @throws {Error} If stack or resource does not exist
|
|
68
|
+
*/
|
|
69
|
+
async getResource(identifier, logicalId) {
|
|
70
|
+
throw new Error('IStackRepository.getResource() must be implemented by adapter');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Get the CloudFormation template for a stack
|
|
75
|
+
*
|
|
76
|
+
* @param {StackIdentifier} identifier - Stack identifier
|
|
77
|
+
* @returns {Promise<Object>} CloudFormation template as object
|
|
78
|
+
* @throws {Error} If stack does not exist
|
|
79
|
+
*/
|
|
80
|
+
async getTemplate(identifier) {
|
|
81
|
+
throw new Error('IStackRepository.getTemplate() must be implemented by adapter');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Check if a stack exists
|
|
86
|
+
*
|
|
87
|
+
* @param {StackIdentifier} identifier - Stack identifier
|
|
88
|
+
* @returns {Promise<boolean>} True if stack exists
|
|
89
|
+
*/
|
|
90
|
+
async exists(identifier) {
|
|
91
|
+
throw new Error('IStackRepository.exists() must be implemented by adapter');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Detect drift for the entire stack
|
|
96
|
+
*
|
|
97
|
+
* @param {StackIdentifier} identifier - Stack identifier
|
|
98
|
+
* @returns {Promise<Object>} Drift detection result
|
|
99
|
+
* @returns {Promise<Object>} Result with properties:
|
|
100
|
+
* - stackDriftStatus: string (DRIFTED, IN_SYNC, UNKNOWN, NOT_CHECKED)
|
|
101
|
+
* - driftedResourceCount: number
|
|
102
|
+
* - detectionTime: Date
|
|
103
|
+
* @throws {Error} If stack does not exist
|
|
104
|
+
*/
|
|
105
|
+
async detectStackDrift(identifier) {
|
|
106
|
+
throw new Error(
|
|
107
|
+
'IStackRepository.detectStackDrift() must be implemented by adapter'
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Get drift details for a specific resource
|
|
113
|
+
*
|
|
114
|
+
* @param {StackIdentifier} identifier - Stack identifier
|
|
115
|
+
* @param {string} logicalId - Logical resource ID
|
|
116
|
+
* @returns {Promise<Object>} Resource drift details
|
|
117
|
+
* @returns {Promise<Object>} Drift with properties:
|
|
118
|
+
* - driftStatus: string (IN_SYNC, MODIFIED, DELETED, NOT_CHECKED)
|
|
119
|
+
* - expectedProperties: Object (from template)
|
|
120
|
+
* - actualProperties: Object (from cloud)
|
|
121
|
+
* - propertyDifferences: Array<Object> (list of drifted properties)
|
|
122
|
+
* @throws {Error} If stack or resource does not exist
|
|
123
|
+
*/
|
|
124
|
+
async getResourceDrift(identifier, logicalId) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
'IStackRepository.getResourceDrift() must be implemented by adapter'
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
module.exports = IStackRepository;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Domain - Application Layer Ports
|
|
3
|
+
*
|
|
4
|
+
* Port interfaces define how the application layer communicates with
|
|
5
|
+
* infrastructure adapters. These are part of the hexagonal architecture
|
|
6
|
+
* pattern, allowing provider-specific implementations (AWS, GCP, Azure, etc.)
|
|
7
|
+
* without changing the domain or application logic.
|
|
8
|
+
*
|
|
9
|
+
* Ports:
|
|
10
|
+
* - IStackRepository: CloudFormation stack operations
|
|
11
|
+
* - IResourceDetector: Cloud resource discovery (orphan detection)
|
|
12
|
+
* - IResourceImporter: Import resources into CloudFormation
|
|
13
|
+
* - IPropertyReconciler: Fix property drift (mutable properties)
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const IStackRepository = require('./IStackRepository');
|
|
17
|
+
const IResourceDetector = require('./IResourceDetector');
|
|
18
|
+
const IResourceImporter = require('./IResourceImporter');
|
|
19
|
+
const IPropertyReconciler = require('./IPropertyReconciler');
|
|
20
|
+
|
|
21
|
+
module.exports = {
|
|
22
|
+
IStackRepository,
|
|
23
|
+
IResourceDetector,
|
|
24
|
+
IResourceImporter,
|
|
25
|
+
IPropertyReconciler,
|
|
26
|
+
};
|