@kadi.build/deploy-ability 0.0.1
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 +523 -0
- package/dist/constants.d.ts +82 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +82 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors/certificate-error.d.ts +95 -0
- package/dist/errors/certificate-error.d.ts.map +1 -0
- package/dist/errors/certificate-error.js +111 -0
- package/dist/errors/certificate-error.js.map +1 -0
- package/dist/errors/deployment-error.d.ts +122 -0
- package/dist/errors/deployment-error.d.ts.map +1 -0
- package/dist/errors/deployment-error.js +185 -0
- package/dist/errors/deployment-error.js.map +1 -0
- package/dist/errors/index.d.ts +13 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/profile-error.d.ts +106 -0
- package/dist/errors/profile-error.d.ts.map +1 -0
- package/dist/errors/profile-error.js +127 -0
- package/dist/errors/profile-error.js.map +1 -0
- package/dist/errors/provider-error.d.ts +104 -0
- package/dist/errors/provider-error.d.ts.map +1 -0
- package/dist/errors/provider-error.js +120 -0
- package/dist/errors/provider-error.js.map +1 -0
- package/dist/errors/wallet-error.d.ts +131 -0
- package/dist/errors/wallet-error.d.ts.map +1 -0
- package/dist/errors/wallet-error.js +154 -0
- package/dist/errors/wallet-error.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/targets/akash/bid-selectors.d.ts +251 -0
- package/dist/targets/akash/bid-selectors.d.ts.map +1 -0
- package/dist/targets/akash/bid-selectors.js +322 -0
- package/dist/targets/akash/bid-selectors.js.map +1 -0
- package/dist/targets/akash/bid-types.d.ts +297 -0
- package/dist/targets/akash/bid-types.d.ts.map +1 -0
- package/dist/targets/akash/bid-types.js +89 -0
- package/dist/targets/akash/bid-types.js.map +1 -0
- package/dist/targets/akash/blockchain-client.d.ts +577 -0
- package/dist/targets/akash/blockchain-client.d.ts.map +1 -0
- package/dist/targets/akash/blockchain-client.js +803 -0
- package/dist/targets/akash/blockchain-client.js.map +1 -0
- package/dist/targets/akash/certificate-manager.d.ts +228 -0
- package/dist/targets/akash/certificate-manager.d.ts.map +1 -0
- package/dist/targets/akash/certificate-manager.js +395 -0
- package/dist/targets/akash/certificate-manager.js.map +1 -0
- package/dist/targets/akash/constants.d.ts +231 -0
- package/dist/targets/akash/constants.d.ts.map +1 -0
- package/dist/targets/akash/constants.js +225 -0
- package/dist/targets/akash/constants.js.map +1 -0
- package/dist/targets/akash/deployer.d.ts +136 -0
- package/dist/targets/akash/deployer.d.ts.map +1 -0
- package/dist/targets/akash/deployer.js +599 -0
- package/dist/targets/akash/deployer.js.map +1 -0
- package/dist/targets/akash/environment.d.ts +241 -0
- package/dist/targets/akash/environment.d.ts.map +1 -0
- package/dist/targets/akash/environment.js +245 -0
- package/dist/targets/akash/environment.js.map +1 -0
- package/dist/targets/akash/index.d.ts +1113 -0
- package/dist/targets/akash/index.d.ts.map +1 -0
- package/dist/targets/akash/index.js +909 -0
- package/dist/targets/akash/index.js.map +1 -0
- package/dist/targets/akash/lease-monitor.d.ts +51 -0
- package/dist/targets/akash/lease-monitor.d.ts.map +1 -0
- package/dist/targets/akash/lease-monitor.js +110 -0
- package/dist/targets/akash/lease-monitor.js.map +1 -0
- package/dist/targets/akash/logs.d.ts +71 -0
- package/dist/targets/akash/logs.d.ts.map +1 -0
- package/dist/targets/akash/logs.js +311 -0
- package/dist/targets/akash/logs.js.map +1 -0
- package/dist/targets/akash/logs.types.d.ts +102 -0
- package/dist/targets/akash/logs.types.d.ts.map +1 -0
- package/dist/targets/akash/logs.types.js +9 -0
- package/dist/targets/akash/logs.types.js.map +1 -0
- package/dist/targets/akash/pricing.d.ts +247 -0
- package/dist/targets/akash/pricing.d.ts.map +1 -0
- package/dist/targets/akash/pricing.js +246 -0
- package/dist/targets/akash/pricing.js.map +1 -0
- package/dist/targets/akash/provider-client.d.ts +114 -0
- package/dist/targets/akash/provider-client.d.ts.map +1 -0
- package/dist/targets/akash/provider-client.js +318 -0
- package/dist/targets/akash/provider-client.js.map +1 -0
- package/dist/targets/akash/provider-metadata.d.ts +228 -0
- package/dist/targets/akash/provider-metadata.d.ts.map +1 -0
- package/dist/targets/akash/provider-metadata.js +14 -0
- package/dist/targets/akash/provider-metadata.js.map +1 -0
- package/dist/targets/akash/provider-service.d.ts +133 -0
- package/dist/targets/akash/provider-service.d.ts.map +1 -0
- package/dist/targets/akash/provider-service.js +391 -0
- package/dist/targets/akash/provider-service.js.map +1 -0
- package/dist/targets/akash/query-client.d.ts +125 -0
- package/dist/targets/akash/query-client.d.ts.map +1 -0
- package/dist/targets/akash/query-client.js +332 -0
- package/dist/targets/akash/query-client.js.map +1 -0
- package/dist/targets/akash/sdl-generator.d.ts +31 -0
- package/dist/targets/akash/sdl-generator.d.ts.map +1 -0
- package/dist/targets/akash/sdl-generator.js +279 -0
- package/dist/targets/akash/sdl-generator.js.map +1 -0
- package/dist/targets/akash/types.d.ts +285 -0
- package/dist/targets/akash/types.d.ts.map +1 -0
- package/dist/targets/akash/types.js +54 -0
- package/dist/targets/akash/types.js.map +1 -0
- package/dist/targets/akash/wallet-manager.d.ts +526 -0
- package/dist/targets/akash/wallet-manager.d.ts.map +1 -0
- package/dist/targets/akash/wallet-manager.js +953 -0
- package/dist/targets/akash/wallet-manager.js.map +1 -0
- package/dist/targets/local/compose-generator.d.ts +244 -0
- package/dist/targets/local/compose-generator.d.ts.map +1 -0
- package/dist/targets/local/compose-generator.js +324 -0
- package/dist/targets/local/compose-generator.js.map +1 -0
- package/dist/targets/local/deployer.d.ts +82 -0
- package/dist/targets/local/deployer.d.ts.map +1 -0
- package/dist/targets/local/deployer.js +367 -0
- package/dist/targets/local/deployer.js.map +1 -0
- package/dist/targets/local/engine-manager.d.ts +155 -0
- package/dist/targets/local/engine-manager.d.ts.map +1 -0
- package/dist/targets/local/engine-manager.js +250 -0
- package/dist/targets/local/engine-manager.js.map +1 -0
- package/dist/targets/local/index.d.ts +40 -0
- package/dist/targets/local/index.d.ts.map +1 -0
- package/dist/targets/local/index.js +43 -0
- package/dist/targets/local/index.js.map +1 -0
- package/dist/targets/local/network-manager.d.ts +160 -0
- package/dist/targets/local/network-manager.d.ts.map +1 -0
- package/dist/targets/local/network-manager.js +337 -0
- package/dist/targets/local/network-manager.js.map +1 -0
- package/dist/targets/local/types.d.ts +327 -0
- package/dist/targets/local/types.d.ts.map +1 -0
- package/dist/targets/local/types.js +9 -0
- package/dist/targets/local/types.js.map +1 -0
- package/dist/types/common.d.ts +585 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +13 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/options.d.ts +329 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +10 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/profiles.d.ts +329 -0
- package/dist/types/profiles.d.ts.map +1 -0
- package/dist/types/profiles.js +27 -0
- package/dist/types/profiles.js.map +1 -0
- package/dist/types/results.d.ts +443 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +64 -0
- package/dist/types/results.js.map +1 -0
- package/dist/types/validators.d.ts +118 -0
- package/dist/types/validators.d.ts.map +1 -0
- package/dist/types/validators.js +198 -0
- package/dist/types/validators.js.map +1 -0
- package/dist/utils/command-runner.d.ts +128 -0
- package/dist/utils/command-runner.d.ts.map +1 -0
- package/dist/utils/command-runner.js +210 -0
- package/dist/utils/command-runner.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +93 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/profile-loader.d.ts +76 -0
- package/dist/utils/profile-loader.d.ts.map +1 -0
- package/dist/utils/profile-loader.js +194 -0
- package/dist/utils/profile-loader.js.map +1 -0
- package/dist/utils/registry/index.d.ts +27 -0
- package/dist/utils/registry/index.d.ts.map +1 -0
- package/dist/utils/registry/index.js +29 -0
- package/dist/utils/registry/index.js.map +1 -0
- package/dist/utils/registry/manager.d.ts +319 -0
- package/dist/utils/registry/manager.d.ts.map +1 -0
- package/dist/utils/registry/manager.js +671 -0
- package/dist/utils/registry/manager.js.map +1 -0
- package/dist/utils/registry/setup.d.ts +135 -0
- package/dist/utils/registry/setup.d.ts.map +1 -0
- package/dist/utils/registry/setup.js +207 -0
- package/dist/utils/registry/setup.js.map +1 -0
- package/dist/utils/registry/transformer.d.ts +92 -0
- package/dist/utils/registry/transformer.d.ts.map +1 -0
- package/dist/utils/registry/transformer.js +131 -0
- package/dist/utils/registry/transformer.js.map +1 -0
- package/dist/utils/registry/types.d.ts +241 -0
- package/dist/utils/registry/types.d.ts.map +1 -0
- package/dist/utils/registry/types.js +10 -0
- package/dist/utils/registry/types.js.map +1 -0
- package/docs/EXAMPLES.md +293 -0
- package/docs/PLACEMENT.md +433 -0
- package/docs/STORAGE.md +318 -0
- package/docs/building-provider-reliability-tracker.md +2581 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/utils/registry/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Setup
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for setting up temporary registry infrastructure for local images.
|
|
5
|
+
* Automatically detects local images and makes them accessible to Akash providers.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/registry/setup
|
|
8
|
+
*/
|
|
9
|
+
import type { DeploymentLogger } from '../../types/common.js';
|
|
10
|
+
import type { AkashDeploymentProfile } from '../../types/profiles.js';
|
|
11
|
+
import type { RegistryContext, RegistryOptions } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Setup temporary registry infrastructure if profile uses local images
|
|
14
|
+
*
|
|
15
|
+
* **Automatic Detection:**
|
|
16
|
+
* This function automatically detects if your profile references local container images
|
|
17
|
+
* (images that exist on your machine but not in a public registry). If local images
|
|
18
|
+
* are found, it starts a temporary registry, pushes the images, and exposes them
|
|
19
|
+
* publicly so Akash providers can pull them during deployment.
|
|
20
|
+
*
|
|
21
|
+
* **Three Possible Outcomes:**
|
|
22
|
+
* 1. **No local images** → Returns profile unchanged, no registry started
|
|
23
|
+
* 2. **User opted out** → Returns profile unchanged (useRemoteRegistry: true)
|
|
24
|
+
* 3. **Local images found** → Starts registry, transforms profile, returns cleanup function
|
|
25
|
+
*
|
|
26
|
+
* **How It Works:**
|
|
27
|
+
* 1. Checks if user opted out via `useRemoteRegistry: true`
|
|
28
|
+
* 2. Scans each service image with `docker images -q <image>`
|
|
29
|
+
* 3. If local images exist:
|
|
30
|
+
* - Starts registry container on localhost
|
|
31
|
+
* - Pushes local images to registry
|
|
32
|
+
* - Exposes registry via tunnel (ngrok/serveo/bore)
|
|
33
|
+
* - Rewrites profile to use public registry URLs
|
|
34
|
+
* 4. Returns `RegistryContext` with transformed profile and cleanup function
|
|
35
|
+
*
|
|
36
|
+
* **Cleanup:**
|
|
37
|
+
* Always call the returned `cleanup()` function after deployment completes.
|
|
38
|
+
* This shuts down the registry and frees resources. Use a finally block to
|
|
39
|
+
* ensure cleanup happens even if deployment fails.
|
|
40
|
+
*
|
|
41
|
+
* @param profile - Deployment profile from agent.json
|
|
42
|
+
* @param logger - Logger for progress messages
|
|
43
|
+
* @param options - Registry configuration options
|
|
44
|
+
* @returns Registry context with transformed profile and cleanup function
|
|
45
|
+
*
|
|
46
|
+
* @example No local images (no registry needed)
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const profile = {
|
|
49
|
+
* target: 'akash',
|
|
50
|
+
* network: 'mainnet',
|
|
51
|
+
* services: {
|
|
52
|
+
* app: { image: 'nginx:latest' } // Remote image
|
|
53
|
+
* }
|
|
54
|
+
* };
|
|
55
|
+
*
|
|
56
|
+
* const ctx = await setupRegistryIfNeeded(profile, logger);
|
|
57
|
+
* // ctx.deployableProfile === profile (unchanged)
|
|
58
|
+
* // ctx.cleanup() is a no-op
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* @example Local images detected (registry started)
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const profile = {
|
|
64
|
+
* target: 'akash',
|
|
65
|
+
* network: 'mainnet',
|
|
66
|
+
* services: {
|
|
67
|
+
* app: { image: 'my-app:latest' } // Local image
|
|
68
|
+
* }
|
|
69
|
+
* };
|
|
70
|
+
*
|
|
71
|
+
* const ctx = await setupRegistryIfNeeded(profile, logger);
|
|
72
|
+
* // Registry started, image pushed, profile transformed
|
|
73
|
+
* // ctx.deployableProfile.services.app.image === 'xyz.serveo.net/my-app:latest'
|
|
74
|
+
*
|
|
75
|
+
* try {
|
|
76
|
+
* await deployToAkash({
|
|
77
|
+
* loadedProfile: { profile: ctx.deployableProfile }
|
|
78
|
+
* });
|
|
79
|
+
* } finally {
|
|
80
|
+
* await ctx.cleanup(); // Always cleanup
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* @example User opted out (manual registry management)
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const ctx = await setupRegistryIfNeeded(profile, logger, {
|
|
87
|
+
* useRemoteRegistry: true
|
|
88
|
+
* });
|
|
89
|
+
* // No registry started - user manually pushed images
|
|
90
|
+
* // ctx.deployableProfile === profile (unchanged)
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare function setupRegistryIfNeeded(profile: AkashDeploymentProfile, logger: DeploymentLogger, options?: RegistryOptions): Promise<RegistryContext>;
|
|
94
|
+
/**
|
|
95
|
+
* Check if profile contains any local container images
|
|
96
|
+
*
|
|
97
|
+
* **Reality-Based Detection:**
|
|
98
|
+
* Instead of guessing based on image name patterns, we check if images
|
|
99
|
+
* actually exist locally using `docker images -q <image>` or `podman images -q <image>`.
|
|
100
|
+
*
|
|
101
|
+
* **Why This is Better:**
|
|
102
|
+
* - **Accurate**: Checks reality, not heuristics
|
|
103
|
+
* - **Simple**: One check instead of multiple name pattern conditions
|
|
104
|
+
* - **Handles edge cases**: "nginx" looks local but is on Docker Hub
|
|
105
|
+
*
|
|
106
|
+
* **Why This Matters:**
|
|
107
|
+
* If this returns true, we start the temporary registry infrastructure
|
|
108
|
+
* (tunnel, registry container). We should only do this when there are ACTUAL local
|
|
109
|
+
* images that need to be made publicly accessible.
|
|
110
|
+
*
|
|
111
|
+
* **Performance:**
|
|
112
|
+
* Runs a shell command for each service image. This is fast (< 100ms per image)
|
|
113
|
+
* and necessary to get accurate results. The alternative (name-based guessing)
|
|
114
|
+
* would lead to false positives and unnecessary infrastructure startup.
|
|
115
|
+
*
|
|
116
|
+
* @param profile - Deployment profile to check
|
|
117
|
+
* @param engine - Container engine to use for checking
|
|
118
|
+
* @returns True if profile has any images that exist locally
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* const profile = {
|
|
123
|
+
* services: {
|
|
124
|
+
* app: { image: 'my-app:latest' }, // If exists locally: true
|
|
125
|
+
* db: { image: 'postgres:14' } // If not local: false
|
|
126
|
+
* }
|
|
127
|
+
* };
|
|
128
|
+
*
|
|
129
|
+
* const hasLocal = hasLocalImages(profile, 'docker');
|
|
130
|
+
* // true if my-app:latest exists in local Docker images
|
|
131
|
+
* // false if only remote images present
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare function hasLocalImages(profile: AkashDeploymentProfile, engine?: 'docker' | 'podman'): boolean;
|
|
135
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/utils/registry/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAInE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CA2D1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,sBAAsB,EAC/B,MAAM,GAAE,QAAQ,GAAG,QAAmB,GACrC,OAAO,CAoBT"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Setup
|
|
3
|
+
*
|
|
4
|
+
* Main entry point for setting up temporary registry infrastructure for local images.
|
|
5
|
+
* Automatically detects local images and makes them accessible to Akash providers.
|
|
6
|
+
*
|
|
7
|
+
* @module utils/registry/setup
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
import { TemporaryContainerRegistryManager } from './manager.js';
|
|
11
|
+
import { transformProfileWithRegistry } from './transformer.js';
|
|
12
|
+
/**
|
|
13
|
+
* Setup temporary registry infrastructure if profile uses local images
|
|
14
|
+
*
|
|
15
|
+
* **Automatic Detection:**
|
|
16
|
+
* This function automatically detects if your profile references local container images
|
|
17
|
+
* (images that exist on your machine but not in a public registry). If local images
|
|
18
|
+
* are found, it starts a temporary registry, pushes the images, and exposes them
|
|
19
|
+
* publicly so Akash providers can pull them during deployment.
|
|
20
|
+
*
|
|
21
|
+
* **Three Possible Outcomes:**
|
|
22
|
+
* 1. **No local images** → Returns profile unchanged, no registry started
|
|
23
|
+
* 2. **User opted out** → Returns profile unchanged (useRemoteRegistry: true)
|
|
24
|
+
* 3. **Local images found** → Starts registry, transforms profile, returns cleanup function
|
|
25
|
+
*
|
|
26
|
+
* **How It Works:**
|
|
27
|
+
* 1. Checks if user opted out via `useRemoteRegistry: true`
|
|
28
|
+
* 2. Scans each service image with `docker images -q <image>`
|
|
29
|
+
* 3. If local images exist:
|
|
30
|
+
* - Starts registry container on localhost
|
|
31
|
+
* - Pushes local images to registry
|
|
32
|
+
* - Exposes registry via tunnel (ngrok/serveo/bore)
|
|
33
|
+
* - Rewrites profile to use public registry URLs
|
|
34
|
+
* 4. Returns `RegistryContext` with transformed profile and cleanup function
|
|
35
|
+
*
|
|
36
|
+
* **Cleanup:**
|
|
37
|
+
* Always call the returned `cleanup()` function after deployment completes.
|
|
38
|
+
* This shuts down the registry and frees resources. Use a finally block to
|
|
39
|
+
* ensure cleanup happens even if deployment fails.
|
|
40
|
+
*
|
|
41
|
+
* @param profile - Deployment profile from agent.json
|
|
42
|
+
* @param logger - Logger for progress messages
|
|
43
|
+
* @param options - Registry configuration options
|
|
44
|
+
* @returns Registry context with transformed profile and cleanup function
|
|
45
|
+
*
|
|
46
|
+
* @example No local images (no registry needed)
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const profile = {
|
|
49
|
+
* target: 'akash',
|
|
50
|
+
* network: 'mainnet',
|
|
51
|
+
* services: {
|
|
52
|
+
* app: { image: 'nginx:latest' } // Remote image
|
|
53
|
+
* }
|
|
54
|
+
* };
|
|
55
|
+
*
|
|
56
|
+
* const ctx = await setupRegistryIfNeeded(profile, logger);
|
|
57
|
+
* // ctx.deployableProfile === profile (unchanged)
|
|
58
|
+
* // ctx.cleanup() is a no-op
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* @example Local images detected (registry started)
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const profile = {
|
|
64
|
+
* target: 'akash',
|
|
65
|
+
* network: 'mainnet',
|
|
66
|
+
* services: {
|
|
67
|
+
* app: { image: 'my-app:latest' } // Local image
|
|
68
|
+
* }
|
|
69
|
+
* };
|
|
70
|
+
*
|
|
71
|
+
* const ctx = await setupRegistryIfNeeded(profile, logger);
|
|
72
|
+
* // Registry started, image pushed, profile transformed
|
|
73
|
+
* // ctx.deployableProfile.services.app.image === 'xyz.serveo.net/my-app:latest'
|
|
74
|
+
*
|
|
75
|
+
* try {
|
|
76
|
+
* await deployToAkash({
|
|
77
|
+
* loadedProfile: { profile: ctx.deployableProfile }
|
|
78
|
+
* });
|
|
79
|
+
* } finally {
|
|
80
|
+
* await ctx.cleanup(); // Always cleanup
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* @example User opted out (manual registry management)
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const ctx = await setupRegistryIfNeeded(profile, logger, {
|
|
87
|
+
* useRemoteRegistry: true
|
|
88
|
+
* });
|
|
89
|
+
* // No registry started - user manually pushed images
|
|
90
|
+
* // ctx.deployableProfile === profile (unchanged)
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export async function setupRegistryIfNeeded(profile, logger, options = {}) {
|
|
94
|
+
// User explicitly wants to use remote registry
|
|
95
|
+
// Skip all registry infrastructure and assume images are already pushed
|
|
96
|
+
if (options.useRemoteRegistry) {
|
|
97
|
+
logger.log('📡 Using remote registry (local registry disabled)');
|
|
98
|
+
logger.log('⚠️ Ensure all images are pushed to a remote registry!');
|
|
99
|
+
return {
|
|
100
|
+
deployableProfile: profile,
|
|
101
|
+
cleanup: async () => { } // No cleanup needed
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Check if any services use local images
|
|
105
|
+
// Uses reality-based detection (docker images -q) to check actual existence
|
|
106
|
+
const engine = options.containerEngine || 'docker';
|
|
107
|
+
if (!hasLocalImages(profile, engine)) {
|
|
108
|
+
// All images are remote (docker.io/nginx, ghcr.io/owner/repo, etc.)
|
|
109
|
+
// No registry needed - providers can pull directly
|
|
110
|
+
return {
|
|
111
|
+
deployableProfile: profile,
|
|
112
|
+
cleanup: async () => { } // No cleanup needed
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Profile has local images - start registry infrastructure
|
|
116
|
+
logger.log('🔧 Local images detected - setting up temporary registry...');
|
|
117
|
+
const manager = new TemporaryContainerRegistryManager(logger);
|
|
118
|
+
await manager.startTemporaryRegistry({
|
|
119
|
+
port: options.port || 3000,
|
|
120
|
+
tunnelService: options.tunnelService || 'serveo',
|
|
121
|
+
containerEngine: engine,
|
|
122
|
+
registryDuration: options.registryDuration || 600000, // 10 minutes default
|
|
123
|
+
autoShutdown: options.autoShutdown ?? false, // Manual cleanup by default
|
|
124
|
+
tunnelAuthToken: options.tunnelAuthToken,
|
|
125
|
+
tunnelRegion: options.tunnelRegion,
|
|
126
|
+
tunnelProtocol: options.tunnelProtocol,
|
|
127
|
+
tunnelSubdomain: options.tunnelSubdomain
|
|
128
|
+
});
|
|
129
|
+
// Push local images to registry
|
|
130
|
+
await manager.addLocalImagesToTemporaryRegistry(profile, engine);
|
|
131
|
+
// Transform profile: "my-app" → "abc123.serveo.net/my-app:latest"
|
|
132
|
+
const deployableProfile = transformProfileWithRegistry(profile, manager);
|
|
133
|
+
// Return context with cleanup function
|
|
134
|
+
return {
|
|
135
|
+
deployableProfile,
|
|
136
|
+
cleanup: async () => {
|
|
137
|
+
if (manager.isRunning()) {
|
|
138
|
+
logger.log('🛑 Shutting down temporary registry...');
|
|
139
|
+
await manager.stopTemporaryRegistry();
|
|
140
|
+
logger.log('✅ Temporary registry shut down');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check if profile contains any local container images
|
|
147
|
+
*
|
|
148
|
+
* **Reality-Based Detection:**
|
|
149
|
+
* Instead of guessing based on image name patterns, we check if images
|
|
150
|
+
* actually exist locally using `docker images -q <image>` or `podman images -q <image>`.
|
|
151
|
+
*
|
|
152
|
+
* **Why This is Better:**
|
|
153
|
+
* - **Accurate**: Checks reality, not heuristics
|
|
154
|
+
* - **Simple**: One check instead of multiple name pattern conditions
|
|
155
|
+
* - **Handles edge cases**: "nginx" looks local but is on Docker Hub
|
|
156
|
+
*
|
|
157
|
+
* **Why This Matters:**
|
|
158
|
+
* If this returns true, we start the temporary registry infrastructure
|
|
159
|
+
* (tunnel, registry container). We should only do this when there are ACTUAL local
|
|
160
|
+
* images that need to be made publicly accessible.
|
|
161
|
+
*
|
|
162
|
+
* **Performance:**
|
|
163
|
+
* Runs a shell command for each service image. This is fast (< 100ms per image)
|
|
164
|
+
* and necessary to get accurate results. The alternative (name-based guessing)
|
|
165
|
+
* would lead to false positives and unnecessary infrastructure startup.
|
|
166
|
+
*
|
|
167
|
+
* @param profile - Deployment profile to check
|
|
168
|
+
* @param engine - Container engine to use for checking
|
|
169
|
+
* @returns True if profile has any images that exist locally
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```typescript
|
|
173
|
+
* const profile = {
|
|
174
|
+
* services: {
|
|
175
|
+
* app: { image: 'my-app:latest' }, // If exists locally: true
|
|
176
|
+
* db: { image: 'postgres:14' } // If not local: false
|
|
177
|
+
* }
|
|
178
|
+
* };
|
|
179
|
+
*
|
|
180
|
+
* const hasLocal = hasLocalImages(profile, 'docker');
|
|
181
|
+
* // true if my-app:latest exists in local Docker images
|
|
182
|
+
* // false if only remote images present
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export function hasLocalImages(profile, engine = 'docker') {
|
|
186
|
+
if (!profile.services)
|
|
187
|
+
return false;
|
|
188
|
+
return Object.values(profile.services).some((service) => {
|
|
189
|
+
const image = service.image;
|
|
190
|
+
if (!image)
|
|
191
|
+
return false;
|
|
192
|
+
try {
|
|
193
|
+
// Check if image exists locally using container engine
|
|
194
|
+
// Returns image hash if exists, empty string if not
|
|
195
|
+
const result = execSync(`${engine} images -q ${image}`, {
|
|
196
|
+
encoding: 'utf8',
|
|
197
|
+
stdio: ['pipe', 'pipe', 'pipe'] // Suppress stderr to avoid noise
|
|
198
|
+
});
|
|
199
|
+
return result.trim().length > 0;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
// Image doesn't exist locally or engine unavailable
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/utils/registry/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile Transformer
|
|
3
|
+
*
|
|
4
|
+
* Transforms deployment profiles to use temporary registry URLs for local images.
|
|
5
|
+
* Replaces local image references with public registry URLs and adds authentication
|
|
6
|
+
* credentials.
|
|
7
|
+
*
|
|
8
|
+
* @module utils/registry/transformer
|
|
9
|
+
*/
|
|
10
|
+
import type { AkashDeploymentProfile } from '../../types/profiles.js';
|
|
11
|
+
import type { TemporaryContainerRegistryManager } from './manager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Transform profile to use registry URLs for local images
|
|
14
|
+
*
|
|
15
|
+
* Creates a new profile object where:
|
|
16
|
+
* - Local image references are replaced with public registry URLs
|
|
17
|
+
* - Registry credentials are added to each service with local images
|
|
18
|
+
* - Remote images remain unchanged
|
|
19
|
+
*
|
|
20
|
+
* **Deep Clone:**
|
|
21
|
+
* Creates a deep copy of the profile to avoid mutating the original. This is
|
|
22
|
+
* important because the original profile might be used for other purposes or
|
|
23
|
+
* stored for future reference.
|
|
24
|
+
*
|
|
25
|
+
* **Transformation Logic:**
|
|
26
|
+
* For each service in the profile:
|
|
27
|
+
* 1. Check if manager has a registry URL for this image (indicates it's local)
|
|
28
|
+
* 2. If yes: Replace image with registry URL and add credentials
|
|
29
|
+
* 3. If no: Leave image unchanged (it's remote or wasn't processed)
|
|
30
|
+
*
|
|
31
|
+
* @param profile - Original deployment profile
|
|
32
|
+
* @param manager - Registry manager with image mappings and credentials
|
|
33
|
+
* @returns Transformed profile ready for deployment
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const original = {
|
|
38
|
+
* target: 'akash',
|
|
39
|
+
* services: {
|
|
40
|
+
* app: { image: 'my-app:latest' }, // Local image
|
|
41
|
+
* db: { image: 'postgres:14' } // Remote image
|
|
42
|
+
* }
|
|
43
|
+
* };
|
|
44
|
+
*
|
|
45
|
+
* const transformed = transformProfileWithRegistry(original, manager);
|
|
46
|
+
* // Result:
|
|
47
|
+
* // {
|
|
48
|
+
* // target: 'akash',
|
|
49
|
+
* // services: {
|
|
50
|
+
* // app: {
|
|
51
|
+
* // image: 'abc123.serveo.net/my-app:latest',
|
|
52
|
+
* // credentials: { host: '...', username: '...', password: '...' }
|
|
53
|
+
* // },
|
|
54
|
+
* // db: { image: 'postgres:14' } // Unchanged - remote image
|
|
55
|
+
* // }
|
|
56
|
+
* // }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function transformProfileWithRegistry(profile: AkashDeploymentProfile, manager: TemporaryContainerRegistryManager): AkashDeploymentProfile;
|
|
60
|
+
/**
|
|
61
|
+
* Check if an image appears to be local based on name patterns
|
|
62
|
+
*
|
|
63
|
+
* **Heuristic-Based Detection:**
|
|
64
|
+
* Checks image name patterns to guess if an image is local:
|
|
65
|
+
* - No "/" → Likely local (e.g., "my-app")
|
|
66
|
+
* - Starts with "localhost/" → Definitely local
|
|
67
|
+
* - Starts with "127.0.0.1/" → Definitely local
|
|
68
|
+
* - Contains "/" → Likely remote (e.g., "docker.io/nginx", "ghcr.io/owner/repo")
|
|
69
|
+
*
|
|
70
|
+
* **Note:** This is a heuristic and can be wrong!
|
|
71
|
+
* - "nginx" looks local but is actually on Docker Hub
|
|
72
|
+
* - "myregistry.com/app" looks remote but might not exist
|
|
73
|
+
*
|
|
74
|
+
* **Reality-Based Detection is Better:**
|
|
75
|
+
* The manager uses `docker images -q` to check actual existence, which is more
|
|
76
|
+
* accurate. This function is provided as a fallback for quick checks without
|
|
77
|
+
* shelling out to the container engine.
|
|
78
|
+
*
|
|
79
|
+
* @param image - Image name to check
|
|
80
|
+
* @returns True if image appears to be local based on naming patterns
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* isLocalImagePattern('my-app'); // true - no slash
|
|
85
|
+
* isLocalImagePattern('localhost/my-app'); // true - localhost prefix
|
|
86
|
+
* isLocalImagePattern('nginx:latest'); // true - no slash (but wrong!)
|
|
87
|
+
* isLocalImagePattern('docker.io/nginx'); // false - has registry domain
|
|
88
|
+
* isLocalImagePattern('ghcr.io/owner/repo'); // false - has registry domain
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function isLocalImagePattern(image: string): boolean;
|
|
92
|
+
//# sourceMappingURL=transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../src/utils/registry/transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,sBAAsB,EAC/B,OAAO,EAAE,iCAAiC,GACzC,sBAAsB,CA0CxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAS1D"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profile Transformer
|
|
3
|
+
*
|
|
4
|
+
* Transforms deployment profiles to use temporary registry URLs for local images.
|
|
5
|
+
* Replaces local image references with public registry URLs and adds authentication
|
|
6
|
+
* credentials.
|
|
7
|
+
*
|
|
8
|
+
* @module utils/registry/transformer
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Transform profile to use registry URLs for local images
|
|
12
|
+
*
|
|
13
|
+
* Creates a new profile object where:
|
|
14
|
+
* - Local image references are replaced with public registry URLs
|
|
15
|
+
* - Registry credentials are added to each service with local images
|
|
16
|
+
* - Remote images remain unchanged
|
|
17
|
+
*
|
|
18
|
+
* **Deep Clone:**
|
|
19
|
+
* Creates a deep copy of the profile to avoid mutating the original. This is
|
|
20
|
+
* important because the original profile might be used for other purposes or
|
|
21
|
+
* stored for future reference.
|
|
22
|
+
*
|
|
23
|
+
* **Transformation Logic:**
|
|
24
|
+
* For each service in the profile:
|
|
25
|
+
* 1. Check if manager has a registry URL for this image (indicates it's local)
|
|
26
|
+
* 2. If yes: Replace image with registry URL and add credentials
|
|
27
|
+
* 3. If no: Leave image unchanged (it's remote or wasn't processed)
|
|
28
|
+
*
|
|
29
|
+
* @param profile - Original deployment profile
|
|
30
|
+
* @param manager - Registry manager with image mappings and credentials
|
|
31
|
+
* @returns Transformed profile ready for deployment
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const original = {
|
|
36
|
+
* target: 'akash',
|
|
37
|
+
* services: {
|
|
38
|
+
* app: { image: 'my-app:latest' }, // Local image
|
|
39
|
+
* db: { image: 'postgres:14' } // Remote image
|
|
40
|
+
* }
|
|
41
|
+
* };
|
|
42
|
+
*
|
|
43
|
+
* const transformed = transformProfileWithRegistry(original, manager);
|
|
44
|
+
* // Result:
|
|
45
|
+
* // {
|
|
46
|
+
* // target: 'akash',
|
|
47
|
+
* // services: {
|
|
48
|
+
* // app: {
|
|
49
|
+
* // image: 'abc123.serveo.net/my-app:latest',
|
|
50
|
+
* // credentials: { host: '...', username: '...', password: '...' }
|
|
51
|
+
* // },
|
|
52
|
+
* // db: { image: 'postgres:14' } // Unchanged - remote image
|
|
53
|
+
* // }
|
|
54
|
+
* // }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export function transformProfileWithRegistry(profile, manager) {
|
|
58
|
+
// Deep clone to avoid mutating original profile
|
|
59
|
+
// Using JSON.parse/JSON.stringify is simple and safe here because:
|
|
60
|
+
// 1. Profile is a plain data object (no functions, symbols, etc.)
|
|
61
|
+
// 2. We want a complete deep copy
|
|
62
|
+
// 3. Any special objects have already been validated by Zod schemas
|
|
63
|
+
const transformed = JSON.parse(JSON.stringify(profile));
|
|
64
|
+
// Get registry credentials (same for all services)
|
|
65
|
+
const credentials = manager.getRegistryCredentials();
|
|
66
|
+
// Transform each service
|
|
67
|
+
for (const [serviceName, service] of Object.entries(transformed.services)) {
|
|
68
|
+
const originalImage = service.image;
|
|
69
|
+
// Check if this image was added to the registry (indicates it's local)
|
|
70
|
+
const registryUrl = manager.getPublicImageUrl(serviceName, originalImage);
|
|
71
|
+
if (registryUrl) {
|
|
72
|
+
// Local image - replace with registry URL
|
|
73
|
+
// TODO: Fix deploy-ability types to provide mutable service configs
|
|
74
|
+
// Currently BaseServiceConfig uses readonly properties which prevents
|
|
75
|
+
// legitimate mutations on cloned objects. We work with plain objects
|
|
76
|
+
// after JSON.parse, so this is safe at runtime.
|
|
77
|
+
const mutableService = service;
|
|
78
|
+
mutableService.image = registryUrl;
|
|
79
|
+
// Add registry credentials if available
|
|
80
|
+
if (credentials) {
|
|
81
|
+
mutableService.credentials = {
|
|
82
|
+
host: credentials.host,
|
|
83
|
+
username: credentials.username,
|
|
84
|
+
password: credentials.password
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// else: Remote image - leave unchanged
|
|
89
|
+
}
|
|
90
|
+
return transformed;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if an image appears to be local based on name patterns
|
|
94
|
+
*
|
|
95
|
+
* **Heuristic-Based Detection:**
|
|
96
|
+
* Checks image name patterns to guess if an image is local:
|
|
97
|
+
* - No "/" → Likely local (e.g., "my-app")
|
|
98
|
+
* - Starts with "localhost/" → Definitely local
|
|
99
|
+
* - Starts with "127.0.0.1/" → Definitely local
|
|
100
|
+
* - Contains "/" → Likely remote (e.g., "docker.io/nginx", "ghcr.io/owner/repo")
|
|
101
|
+
*
|
|
102
|
+
* **Note:** This is a heuristic and can be wrong!
|
|
103
|
+
* - "nginx" looks local but is actually on Docker Hub
|
|
104
|
+
* - "myregistry.com/app" looks remote but might not exist
|
|
105
|
+
*
|
|
106
|
+
* **Reality-Based Detection is Better:**
|
|
107
|
+
* The manager uses `docker images -q` to check actual existence, which is more
|
|
108
|
+
* accurate. This function is provided as a fallback for quick checks without
|
|
109
|
+
* shelling out to the container engine.
|
|
110
|
+
*
|
|
111
|
+
* @param image - Image name to check
|
|
112
|
+
* @returns True if image appears to be local based on naming patterns
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* isLocalImagePattern('my-app'); // true - no slash
|
|
117
|
+
* isLocalImagePattern('localhost/my-app'); // true - localhost prefix
|
|
118
|
+
* isLocalImagePattern('nginx:latest'); // true - no slash (but wrong!)
|
|
119
|
+
* isLocalImagePattern('docker.io/nginx'); // false - has registry domain
|
|
120
|
+
* isLocalImagePattern('ghcr.io/owner/repo'); // false - has registry domain
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export function isLocalImagePattern(image) {
|
|
124
|
+
if (!image)
|
|
125
|
+
return false;
|
|
126
|
+
// Local images typically don't contain registry domains or start with localhost
|
|
127
|
+
return (!image.includes('/') ||
|
|
128
|
+
image.startsWith('localhost/') ||
|
|
129
|
+
image.startsWith('127.0.0.1/'));
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../../src/utils/registry/transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAA+B,EAC/B,OAA0C;IAE1C,gDAAgD;IAChD,mEAAmE;IACnE,kEAAkE;IAClE,kCAAkC;IAClC,oEAAoE;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACE,CAAC;IAE5B,mDAAmD;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAErD,yBAAyB;IACzB,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;QAEpC,uEAAuE;QACvE,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAE1E,IAAI,WAAW,EAAE,CAAC;YAChB,0CAA0C;YAC1C,oEAAoE;YACpE,sEAAsE;YACtE,qEAAqE;YACrE,gDAAgD;YAChD,MAAM,cAAc,GAAG,OAAc,CAAC;YACtC,cAAc,CAAC,KAAK,GAAG,WAAW,CAAC;YAEnC,wCAAwC;YACxC,IAAI,WAAW,EAAE,CAAC;gBAChB,cAAc,CAAC,WAAW,GAAG;oBAC3B,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,QAAQ,EAAE,WAAW,CAAC,QAAQ;oBAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;iBAC/B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,uCAAuC;IACzC,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,gFAAgF;IAChF,OAAO,CACL,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;QAC9B,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAC/B,CAAC;AACJ,CAAC"}
|