@stacksjs/ts-cloud-core 0.1.3 → 0.1.6
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/README.md +98 -13
- package/package.json +12 -3
- package/src/advanced-features.test.ts +0 -465
- package/src/aws/cloudformation.ts +0 -421
- package/src/aws/cloudfront.ts +0 -158
- package/src/aws/credentials.test.ts +0 -132
- package/src/aws/credentials.ts +0 -545
- package/src/aws/index.ts +0 -87
- package/src/aws/s3.test.ts +0 -188
- package/src/aws/s3.ts +0 -1088
- package/src/aws/signature.test.ts +0 -670
- package/src/aws/signature.ts +0 -1155
- package/src/backup/disaster-recovery.test.ts +0 -726
- package/src/backup/disaster-recovery.ts +0 -500
- package/src/backup/index.ts +0 -34
- package/src/backup/manager.test.ts +0 -498
- package/src/backup/manager.ts +0 -432
- package/src/cicd/circleci.ts +0 -430
- package/src/cicd/github-actions.ts +0 -424
- package/src/cicd/gitlab-ci.ts +0 -255
- package/src/cicd/index.ts +0 -8
- package/src/cli/history.ts +0 -396
- package/src/cli/index.ts +0 -10
- package/src/cli/progress.ts +0 -458
- package/src/cli/repl.ts +0 -454
- package/src/cli/suggestions.ts +0 -327
- package/src/cli/table.test.ts +0 -319
- package/src/cli/table.ts +0 -332
- package/src/cloudformation/builder.test.ts +0 -327
- package/src/cloudformation/builder.ts +0 -378
- package/src/cloudformation/builders/api-gateway.ts +0 -449
- package/src/cloudformation/builders/cache.ts +0 -334
- package/src/cloudformation/builders/cdn.ts +0 -278
- package/src/cloudformation/builders/compute.ts +0 -485
- package/src/cloudformation/builders/database.ts +0 -392
- package/src/cloudformation/builders/functions.ts +0 -343
- package/src/cloudformation/builders/messaging.ts +0 -140
- package/src/cloudformation/builders/monitoring.ts +0 -300
- package/src/cloudformation/builders/network.ts +0 -264
- package/src/cloudformation/builders/queue.ts +0 -147
- package/src/cloudformation/builders/security.ts +0 -399
- package/src/cloudformation/builders/storage.ts +0 -285
- package/src/cloudformation/index.ts +0 -30
- package/src/cloudformation/types.ts +0 -173
- package/src/compliance/aws-config.ts +0 -543
- package/src/compliance/cloudtrail.ts +0 -376
- package/src/compliance/compliance.test.ts +0 -423
- package/src/compliance/guardduty.ts +0 -446
- package/src/compliance/index.ts +0 -66
- package/src/compliance/security-hub.ts +0 -456
- package/src/containers/build-optimization.ts +0 -416
- package/src/containers/containers.test.ts +0 -508
- package/src/containers/image-scanning.ts +0 -360
- package/src/containers/index.ts +0 -9
- package/src/containers/registry.ts +0 -293
- package/src/containers/service-mesh.ts +0 -520
- package/src/database/database.test.ts +0 -762
- package/src/database/index.ts +0 -9
- package/src/database/migrations.ts +0 -444
- package/src/database/performance.ts +0 -528
- package/src/database/replicas.ts +0 -534
- package/src/database/users.ts +0 -494
- package/src/dependency-graph.ts +0 -143
- package/src/deployment/ab-testing.ts +0 -582
- package/src/deployment/blue-green.ts +0 -452
- package/src/deployment/canary.ts +0 -500
- package/src/deployment/deployment.test.ts +0 -526
- package/src/deployment/index.ts +0 -61
- package/src/deployment/progressive.ts +0 -62
- package/src/dns/dns.test.ts +0 -641
- package/src/dns/dnssec.ts +0 -315
- package/src/dns/index.ts +0 -8
- package/src/dns/resolver.ts +0 -496
- package/src/dns/routing.ts +0 -593
- package/src/email/advanced/analytics.ts +0 -445
- package/src/email/advanced/index.ts +0 -11
- package/src/email/advanced/rules.ts +0 -465
- package/src/email/advanced/scheduling.ts +0 -352
- package/src/email/advanced/search.ts +0 -412
- package/src/email/advanced/shared-mailboxes.ts +0 -404
- package/src/email/advanced/templates.ts +0 -455
- package/src/email/advanced/threading.ts +0 -281
- package/src/email/analytics.ts +0 -467
- package/src/email/bounce-handling.ts +0 -425
- package/src/email/email.test.ts +0 -431
- package/src/email/handlers/__tests__/inbound.test.ts +0 -38
- package/src/email/handlers/__tests__/outbound.test.ts +0 -37
- package/src/email/handlers/converter.ts +0 -227
- package/src/email/handlers/feedback.ts +0 -228
- package/src/email/handlers/inbound.ts +0 -169
- package/src/email/handlers/outbound.ts +0 -178
- package/src/email/index.ts +0 -15
- package/src/email/reputation.ts +0 -303
- package/src/email/templates.ts +0 -352
- package/src/errors/index.test.ts +0 -434
- package/src/errors/index.ts +0 -416
- package/src/health-checks/index.ts +0 -40
- package/src/index.ts +0 -360
- package/src/intrinsic-functions.ts +0 -118
- package/src/lambda/concurrency.ts +0 -330
- package/src/lambda/destinations.ts +0 -345
- package/src/lambda/dlq.ts +0 -425
- package/src/lambda/index.ts +0 -11
- package/src/lambda/lambda.test.ts +0 -840
- package/src/lambda/layers.ts +0 -263
- package/src/lambda/versions.ts +0 -376
- package/src/lambda/vpc.ts +0 -399
- package/src/local/config.ts +0 -114
- package/src/local/index.ts +0 -6
- package/src/local/mock-aws.ts +0 -351
- package/src/modules/ai.ts +0 -340
- package/src/modules/api.ts +0 -478
- package/src/modules/auth.ts +0 -805
- package/src/modules/cache.ts +0 -417
- package/src/modules/cdn.ts +0 -1062
- package/src/modules/communication.ts +0 -1094
- package/src/modules/compute.ts +0 -3348
- package/src/modules/database.ts +0 -554
- package/src/modules/deployment.ts +0 -1079
- package/src/modules/dns.ts +0 -337
- package/src/modules/email.ts +0 -1538
- package/src/modules/filesystem.ts +0 -515
- package/src/modules/index.ts +0 -32
- package/src/modules/messaging.ts +0 -486
- package/src/modules/monitoring.ts +0 -2086
- package/src/modules/network.ts +0 -664
- package/src/modules/parameter-store.ts +0 -325
- package/src/modules/permissions.ts +0 -1081
- package/src/modules/phone.ts +0 -494
- package/src/modules/queue.ts +0 -1260
- package/src/modules/redirects.ts +0 -464
- package/src/modules/registry.ts +0 -699
- package/src/modules/search.ts +0 -401
- package/src/modules/secrets.ts +0 -416
- package/src/modules/security.ts +0 -731
- package/src/modules/sms.ts +0 -389
- package/src/modules/storage.ts +0 -1120
- package/src/modules/workflow.ts +0 -680
- package/src/multi-account/config.ts +0 -521
- package/src/multi-account/index.ts +0 -7
- package/src/multi-account/manager.ts +0 -427
- package/src/multi-region/cross-region.ts +0 -410
- package/src/multi-region/index.ts +0 -8
- package/src/multi-region/manager.ts +0 -483
- package/src/multi-region/regions.ts +0 -435
- package/src/network-security/index.ts +0 -48
- package/src/observability/index.ts +0 -9
- package/src/observability/logs.ts +0 -522
- package/src/observability/metrics.ts +0 -460
- package/src/observability/observability.test.ts +0 -782
- package/src/observability/synthetics.ts +0 -568
- package/src/observability/xray.ts +0 -358
- package/src/phone/advanced/analytics.ts +0 -349
- package/src/phone/advanced/callbacks.ts +0 -428
- package/src/phone/advanced/index.ts +0 -8
- package/src/phone/advanced/ivr-builder.ts +0 -504
- package/src/phone/advanced/recording.ts +0 -310
- package/src/phone/handlers/__tests__/incoming-call.test.ts +0 -40
- package/src/phone/handlers/incoming-call.ts +0 -117
- package/src/phone/handlers/missed-call.ts +0 -116
- package/src/phone/handlers/voicemail.ts +0 -179
- package/src/phone/index.ts +0 -9
- package/src/presets/api-backend.ts +0 -134
- package/src/presets/data-pipeline.ts +0 -204
- package/src/presets/extend.test.ts +0 -295
- package/src/presets/extend.ts +0 -297
- package/src/presets/fullstack-app.ts +0 -144
- package/src/presets/index.ts +0 -27
- package/src/presets/jamstack.ts +0 -135
- package/src/presets/microservices.ts +0 -167
- package/src/presets/ml-api.ts +0 -208
- package/src/presets/nodejs-server.ts +0 -104
- package/src/presets/nodejs-serverless.ts +0 -114
- package/src/presets/realtime-app.ts +0 -184
- package/src/presets/static-site.ts +0 -64
- package/src/presets/traditional-web-app.ts +0 -339
- package/src/presets/wordpress.ts +0 -138
- package/src/preview/github.test.ts +0 -249
- package/src/preview/github.ts +0 -297
- package/src/preview/index.ts +0 -37
- package/src/preview/manager.test.ts +0 -440
- package/src/preview/manager.ts +0 -326
- package/src/preview/notifications.test.ts +0 -582
- package/src/preview/notifications.ts +0 -341
- package/src/queue/batch-processing.ts +0 -402
- package/src/queue/dlq-monitoring.ts +0 -402
- package/src/queue/fifo.ts +0 -342
- package/src/queue/index.ts +0 -9
- package/src/queue/management.ts +0 -428
- package/src/queue/queue.test.ts +0 -429
- package/src/resource-mgmt/index.ts +0 -39
- package/src/resource-naming.ts +0 -62
- package/src/s3/index.ts +0 -523
- package/src/schema/cloud-config.schema.json +0 -554
- package/src/schema/index.ts +0 -68
- package/src/security/certificate-manager.ts +0 -492
- package/src/security/index.ts +0 -9
- package/src/security/scanning.ts +0 -545
- package/src/security/secrets-manager.ts +0 -476
- package/src/security/secrets-rotation.ts +0 -456
- package/src/security/security.test.ts +0 -738
- package/src/sms/advanced/ab-testing.ts +0 -389
- package/src/sms/advanced/analytics.ts +0 -336
- package/src/sms/advanced/campaigns.ts +0 -523
- package/src/sms/advanced/chatbot.ts +0 -224
- package/src/sms/advanced/index.ts +0 -10
- package/src/sms/advanced/link-tracking.ts +0 -248
- package/src/sms/advanced/mms.ts +0 -308
- package/src/sms/handlers/__tests__/send.test.ts +0 -40
- package/src/sms/handlers/delivery-status.ts +0 -133
- package/src/sms/handlers/receive.ts +0 -162
- package/src/sms/handlers/send.ts +0 -174
- package/src/sms/index.ts +0 -9
- package/src/stack-diff.ts +0 -389
- package/src/static-site/index.ts +0 -85
- package/src/template-builder.ts +0 -110
- package/src/template-validator.ts +0 -574
- package/src/utils/cache.ts +0 -291
- package/src/utils/diff.ts +0 -269
- package/src/utils/hash.ts +0 -227
- package/src/utils/index.ts +0 -8
- package/src/utils/parallel.ts +0 -294
- package/src/validators/credentials.test.ts +0 -274
- package/src/validators/credentials.ts +0 -233
- package/src/validators/quotas.test.ts +0 -434
- package/src/validators/quotas.ts +0 -217
- package/test/ai.test.ts +0 -327
- package/test/api.test.ts +0 -511
- package/test/auth.test.ts +0 -632
- package/test/cache.test.ts +0 -406
- package/test/cdn.test.ts +0 -247
- package/test/compute.test.ts +0 -861
- package/test/database.test.ts +0 -523
- package/test/deployment.test.ts +0 -499
- package/test/dns.test.ts +0 -270
- package/test/email.test.ts +0 -439
- package/test/filesystem.test.ts +0 -382
- package/test/integration.test.ts +0 -350
- package/test/messaging.test.ts +0 -514
- package/test/monitoring.test.ts +0 -634
- package/test/network.test.ts +0 -425
- package/test/permissions.test.ts +0 -488
- package/test/queue.test.ts +0 -484
- package/test/registry.test.ts +0 -306
- package/test/security.test.ts +0 -462
- package/test/storage.test.ts +0 -463
- package/test/template-validator.test.ts +0 -559
- package/test/workflow.test.ts +0 -592
- package/tsconfig.json +0 -16
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,416 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Container Build Optimization
|
|
3
|
-
* Multi-stage builds, layer caching, and build performance
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export interface BuildConfig {
|
|
7
|
-
id: string
|
|
8
|
-
name: string
|
|
9
|
-
dockerfile: string
|
|
10
|
-
context: string
|
|
11
|
-
target?: string // Multi-stage build target
|
|
12
|
-
buildArgs?: Record<string, string>
|
|
13
|
-
labels?: Record<string, string>
|
|
14
|
-
cacheStrategy: CacheStrategy
|
|
15
|
-
platform?: string
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface CacheStrategy {
|
|
19
|
-
type: 'inline' | 'registry' | 'local' | 's3'
|
|
20
|
-
cacheFrom?: string[]
|
|
21
|
-
cacheTo?: string
|
|
22
|
-
maxCacheAge?: number // days
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface MultiStageConfig {
|
|
26
|
-
id: string
|
|
27
|
-
name: string
|
|
28
|
-
stages: BuildStage[]
|
|
29
|
-
targetStage?: string
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface BuildStage {
|
|
33
|
-
name: string
|
|
34
|
-
baseImage: string
|
|
35
|
-
commands: string[]
|
|
36
|
-
copyFrom?: string[] // Copy artifacts from other stages
|
|
37
|
-
workdir?: string
|
|
38
|
-
env?: Record<string, string>
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface BuildOptimization {
|
|
42
|
-
id: string
|
|
43
|
-
name: string
|
|
44
|
-
recommendations: OptimizationRecommendation[]
|
|
45
|
-
estimatedSavings: BuildSavings
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface OptimizationRecommendation {
|
|
49
|
-
type: 'layer_reduction' | 'cache_optimization' | 'base_image' | 'dependencies'
|
|
50
|
-
priority: 'high' | 'medium' | 'low'
|
|
51
|
-
title: string
|
|
52
|
-
description: string
|
|
53
|
-
example?: string
|
|
54
|
-
impact: string
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export interface BuildSavings {
|
|
58
|
-
sizeBefore: number // MB
|
|
59
|
-
sizeAfter: number // MB
|
|
60
|
-
timeBefore: number // seconds
|
|
61
|
-
timeAfter: number // seconds
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface LayerAnalysis {
|
|
65
|
-
id: string
|
|
66
|
-
imageId: string
|
|
67
|
-
layers: ImageLayer[]
|
|
68
|
-
totalSize: number
|
|
69
|
-
unnecessaryLayers: number
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface ImageLayer {
|
|
73
|
-
index: number
|
|
74
|
-
command: string
|
|
75
|
-
size: number // MB
|
|
76
|
-
created: Date
|
|
77
|
-
cacheable: boolean
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Build optimization manager
|
|
82
|
-
*/
|
|
83
|
-
export class BuildOptimizationManager {
|
|
84
|
-
private configs: Map<string, BuildConfig> = new Map()
|
|
85
|
-
private multiStageConfigs: Map<string, MultiStageConfig> = new Map()
|
|
86
|
-
private optimizations: Map<string, BuildOptimization> = new Map()
|
|
87
|
-
private analyses: Map<string, LayerAnalysis> = new Map()
|
|
88
|
-
private configCounter = 0
|
|
89
|
-
private multiStageCounter = 0
|
|
90
|
-
private optimizationCounter = 0
|
|
91
|
-
private analysisCounter = 0
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Create build config
|
|
95
|
-
*/
|
|
96
|
-
createBuildConfig(config: Omit<BuildConfig, 'id'>): BuildConfig {
|
|
97
|
-
const id = `build-config-${Date.now()}-${this.configCounter++}`
|
|
98
|
-
|
|
99
|
-
const buildConfig: BuildConfig = {
|
|
100
|
-
id,
|
|
101
|
-
...config,
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
this.configs.set(id, buildConfig)
|
|
105
|
-
|
|
106
|
-
return buildConfig
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Create optimized build config
|
|
111
|
-
*/
|
|
112
|
-
createOptimizedBuildConfig(options: {
|
|
113
|
-
name: string
|
|
114
|
-
dockerfile: string
|
|
115
|
-
enableCache?: boolean
|
|
116
|
-
registry?: string
|
|
117
|
-
}): BuildConfig {
|
|
118
|
-
const cacheStrategy: CacheStrategy = {
|
|
119
|
-
type: options.enableCache ? 'registry' : 'inline',
|
|
120
|
-
cacheFrom: options.registry ? [`${options.registry}/cache`] : undefined,
|
|
121
|
-
cacheTo: options.registry ? `${options.registry}/cache` : undefined,
|
|
122
|
-
maxCacheAge: 7,
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return this.createBuildConfig({
|
|
126
|
-
name: options.name,
|
|
127
|
-
dockerfile: options.dockerfile,
|
|
128
|
-
context: '.',
|
|
129
|
-
cacheStrategy,
|
|
130
|
-
buildArgs: {
|
|
131
|
-
BUILDKIT_INLINE_CACHE: '1',
|
|
132
|
-
},
|
|
133
|
-
})
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Create multi-stage config
|
|
138
|
-
*/
|
|
139
|
-
createMultiStageConfig(config: Omit<MultiStageConfig, 'id'>): MultiStageConfig {
|
|
140
|
-
const id = `multi-stage-${Date.now()}-${this.multiStageCounter++}`
|
|
141
|
-
|
|
142
|
-
const multiStageConfig: MultiStageConfig = {
|
|
143
|
-
id,
|
|
144
|
-
...config,
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
this.multiStageConfigs.set(id, multiStageConfig)
|
|
148
|
-
|
|
149
|
-
return multiStageConfig
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Create Node.js multi-stage build
|
|
154
|
-
*/
|
|
155
|
-
createNodeMultiStageBuild(options: {
|
|
156
|
-
name: string
|
|
157
|
-
nodeVersion?: string
|
|
158
|
-
targetStage?: 'production' | 'development'
|
|
159
|
-
}): MultiStageConfig {
|
|
160
|
-
const nodeVersion = options.nodeVersion || '18-alpine'
|
|
161
|
-
|
|
162
|
-
return this.createMultiStageConfig({
|
|
163
|
-
name: options.name,
|
|
164
|
-
targetStage: options.targetStage || 'production',
|
|
165
|
-
stages: [
|
|
166
|
-
{
|
|
167
|
-
name: 'dependencies',
|
|
168
|
-
baseImage: `node:${nodeVersion}`,
|
|
169
|
-
workdir: '/app',
|
|
170
|
-
commands: [
|
|
171
|
-
'COPY package*.json ./',
|
|
172
|
-
'RUN npm ci --only=production',
|
|
173
|
-
],
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
name: 'build',
|
|
177
|
-
baseImage: `node:${nodeVersion}`,
|
|
178
|
-
workdir: '/app',
|
|
179
|
-
commands: [
|
|
180
|
-
'COPY package*.json ./',
|
|
181
|
-
'RUN npm ci',
|
|
182
|
-
'COPY . .',
|
|
183
|
-
'RUN npm run build',
|
|
184
|
-
],
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
name: 'production',
|
|
188
|
-
baseImage: `node:${nodeVersion}`,
|
|
189
|
-
workdir: '/app',
|
|
190
|
-
copyFrom: ['dependencies:/app/node_modules', 'build:/app/dist'],
|
|
191
|
-
commands: [
|
|
192
|
-
'COPY package*.json ./',
|
|
193
|
-
'ENV NODE_ENV=production',
|
|
194
|
-
'CMD ["node", "dist/index.js"]',
|
|
195
|
-
],
|
|
196
|
-
},
|
|
197
|
-
],
|
|
198
|
-
})
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Generate Dockerfile from multi-stage config
|
|
203
|
-
*/
|
|
204
|
-
generateDockerfile(configId: string): string {
|
|
205
|
-
const config = this.multiStageConfigs.get(configId)
|
|
206
|
-
|
|
207
|
-
if (!config) {
|
|
208
|
-
throw new Error(`Multi-stage config not found: ${configId}`)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const lines: string[] = []
|
|
212
|
-
|
|
213
|
-
for (const stage of config.stages) {
|
|
214
|
-
lines.push(`# Stage: ${stage.name}`)
|
|
215
|
-
lines.push(`FROM ${stage.baseImage} AS ${stage.name}`)
|
|
216
|
-
|
|
217
|
-
if (stage.workdir) {
|
|
218
|
-
lines.push(`WORKDIR ${stage.workdir}`)
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if (stage.env) {
|
|
222
|
-
for (const [key, value] of Object.entries(stage.env)) {
|
|
223
|
-
lines.push(`ENV ${key}=${value}`)
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
for (const command of stage.commands) {
|
|
228
|
-
lines.push(command)
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
lines.push('')
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
return lines.join('\n')
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Analyze image layers
|
|
239
|
-
*/
|
|
240
|
-
analyzeImage(imageId: string, layers: Omit<ImageLayer, 'cacheable'>[]): LayerAnalysis {
|
|
241
|
-
const id = `analysis-${Date.now()}-${this.analysisCounter++}`
|
|
242
|
-
|
|
243
|
-
const analyzedLayers: ImageLayer[] = layers.map(layer => ({
|
|
244
|
-
...layer,
|
|
245
|
-
cacheable: this.isLayerCacheable(layer.command),
|
|
246
|
-
}))
|
|
247
|
-
|
|
248
|
-
const totalSize = analyzedLayers.reduce((sum, layer) => sum + layer.size, 0)
|
|
249
|
-
const unnecessaryLayers = analyzedLayers.filter(
|
|
250
|
-
layer => !layer.cacheable && layer.size > 100
|
|
251
|
-
).length
|
|
252
|
-
|
|
253
|
-
const analysis: LayerAnalysis = {
|
|
254
|
-
id,
|
|
255
|
-
imageId,
|
|
256
|
-
layers: analyzedLayers,
|
|
257
|
-
totalSize,
|
|
258
|
-
unnecessaryLayers,
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
this.analyses.set(id, analysis)
|
|
262
|
-
|
|
263
|
-
return analysis
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Check if layer is cacheable
|
|
268
|
-
*/
|
|
269
|
-
private isLayerCacheable(command: string): boolean {
|
|
270
|
-
const cacheableCommands = ['FROM', 'RUN', 'COPY', 'ADD', 'WORKDIR', 'ENV']
|
|
271
|
-
const nonCacheableCommands = ['CMD', 'ENTRYPOINT', 'LABEL']
|
|
272
|
-
|
|
273
|
-
for (const cmd of cacheableCommands) {
|
|
274
|
-
if (command.startsWith(cmd)) return true
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
for (const cmd of nonCacheableCommands) {
|
|
278
|
-
if (command.startsWith(cmd)) return false
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
return false
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Generate optimization recommendations
|
|
286
|
-
*/
|
|
287
|
-
generateOptimizations(analysisId: string): BuildOptimization {
|
|
288
|
-
const analysis = this.analyses.get(analysisId)
|
|
289
|
-
|
|
290
|
-
if (!analysis) {
|
|
291
|
-
throw new Error(`Analysis not found: ${analysisId}`)
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
const id = `optimization-${Date.now()}-${this.optimizationCounter++}`
|
|
295
|
-
|
|
296
|
-
const recommendations: OptimizationRecommendation[] = []
|
|
297
|
-
|
|
298
|
-
// Check for layer reduction opportunities
|
|
299
|
-
const runLayers = analysis.layers.filter(l => l.command.startsWith('RUN'))
|
|
300
|
-
if (runLayers.length > 5) {
|
|
301
|
-
recommendations.push({
|
|
302
|
-
type: 'layer_reduction',
|
|
303
|
-
priority: 'high',
|
|
304
|
-
title: 'Combine RUN commands',
|
|
305
|
-
description: `${runLayers.length} RUN commands found. Combine them to reduce layers.`,
|
|
306
|
-
example: 'RUN apt-get update && apt-get install -y package1 package2',
|
|
307
|
-
impact: 'Reduce image size by 20-30% and improve build time',
|
|
308
|
-
})
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Check for base image optimization
|
|
312
|
-
const baseLayer = analysis.layers[0]
|
|
313
|
-
if (baseLayer.command.includes('ubuntu') || baseLayer.command.includes('debian')) {
|
|
314
|
-
recommendations.push({
|
|
315
|
-
type: 'base_image',
|
|
316
|
-
priority: 'medium',
|
|
317
|
-
title: 'Use Alpine base image',
|
|
318
|
-
description: 'Switch to Alpine Linux for smaller image size',
|
|
319
|
-
example: 'FROM node:18-alpine',
|
|
320
|
-
impact: 'Reduce image size by 50-70%',
|
|
321
|
-
})
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Check for cache optimization
|
|
325
|
-
const copyLayers = analysis.layers.filter(l => l.command.startsWith('COPY'))
|
|
326
|
-
if (copyLayers.length > 0 && copyLayers[0].index > 3) {
|
|
327
|
-
recommendations.push({
|
|
328
|
-
type: 'cache_optimization',
|
|
329
|
-
priority: 'high',
|
|
330
|
-
title: 'Copy dependencies first',
|
|
331
|
-
description: 'Copy package files before source code to leverage layer caching',
|
|
332
|
-
example: 'COPY package*.json ./\nRUN npm install\nCOPY . .',
|
|
333
|
-
impact: 'Improve build time by 60-80% on subsequent builds',
|
|
334
|
-
})
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
const estimatedSavings: BuildSavings = {
|
|
338
|
-
sizeBefore: analysis.totalSize,
|
|
339
|
-
sizeAfter: analysis.totalSize * 0.6, // Estimated 40% reduction
|
|
340
|
-
timeBefore: 300, // 5 minutes
|
|
341
|
-
timeAfter: 120, // 2 minutes
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const optimization: BuildOptimization = {
|
|
345
|
-
id,
|
|
346
|
-
name: `Optimization for ${analysis.imageId}`,
|
|
347
|
-
recommendations,
|
|
348
|
-
estimatedSavings,
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
this.optimizations.set(id, optimization)
|
|
352
|
-
|
|
353
|
-
return optimization
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
/**
|
|
357
|
-
* Get build config
|
|
358
|
-
*/
|
|
359
|
-
getBuildConfig(id: string): BuildConfig | undefined {
|
|
360
|
-
return this.configs.get(id)
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* List build configs
|
|
365
|
-
*/
|
|
366
|
-
listBuildConfigs(): BuildConfig[] {
|
|
367
|
-
return Array.from(this.configs.values())
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
/**
|
|
371
|
-
* Get multi-stage config
|
|
372
|
-
*/
|
|
373
|
-
getMultiStageConfig(id: string): MultiStageConfig | undefined {
|
|
374
|
-
return this.multiStageConfigs.get(id)
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* List multi-stage configs
|
|
379
|
-
*/
|
|
380
|
-
listMultiStageConfigs(): MultiStageConfig[] {
|
|
381
|
-
return Array.from(this.multiStageConfigs.values())
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
/**
|
|
385
|
-
* Get optimization
|
|
386
|
-
*/
|
|
387
|
-
getOptimization(id: string): BuildOptimization | undefined {
|
|
388
|
-
return this.optimizations.get(id)
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
/**
|
|
392
|
-
* List optimizations
|
|
393
|
-
*/
|
|
394
|
-
listOptimizations(): BuildOptimization[] {
|
|
395
|
-
return Array.from(this.optimizations.values())
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Clear all data
|
|
400
|
-
*/
|
|
401
|
-
clear(): void {
|
|
402
|
-
this.configs.clear()
|
|
403
|
-
this.multiStageConfigs.clear()
|
|
404
|
-
this.optimizations.clear()
|
|
405
|
-
this.analyses.clear()
|
|
406
|
-
this.configCounter = 0
|
|
407
|
-
this.multiStageCounter = 0
|
|
408
|
-
this.optimizationCounter = 0
|
|
409
|
-
this.analysisCounter = 0
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
/**
|
|
414
|
-
* Global build optimization manager instance
|
|
415
|
-
*/
|
|
416
|
-
export const buildOptimizationManager: BuildOptimizationManager = new BuildOptimizationManager()
|