@venturekit/infra 0.0.0-dev.20260307234057

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.
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * Storage Intent Translator
4
+ *
5
+ * Translates StorageIntent to SST S3/CDN resources.
6
+ * This file isolates all SST/S3-specific logic.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.translateStorage = translateStorage;
10
+ /**
11
+ * Translate StorageIntent to SST Bucket
12
+ */
13
+ async function translateStorage(intent, sst, projectName) {
14
+ const resourceName = `${projectName}-${intent.id}`;
15
+ // Build bucket configuration based on intent
16
+ const bucketConfig = {};
17
+ // Versioning based on purpose or explicit setting
18
+ if (intent.versioned ?? intent.purpose === 'backups') {
19
+ bucketConfig.versioning = true;
20
+ }
21
+ // CORS configuration
22
+ if (intent.corsOrigins && intent.corsOrigins.length > 0) {
23
+ bucketConfig.cors = {
24
+ allowOrigins: intent.corsOrigins,
25
+ allowMethods: ['GET', 'PUT', 'POST', 'DELETE'],
26
+ allowHeaders: ['*'],
27
+ };
28
+ }
29
+ // Create bucket
30
+ const bucket = new sst.Bucket(resourceName, bucketConfig);
31
+ const output = {
32
+ bucketName: bucket.name,
33
+ bucketArn: bucket.arn,
34
+ };
35
+ // Create CDN if requested
36
+ if (intent.cdn) {
37
+ const cdnConfig = {
38
+ origins: [{ bucket }],
39
+ };
40
+ if (intent.cdnDomain) {
41
+ cdnConfig.domain = intent.cdnDomain;
42
+ }
43
+ const cdn = new sst.Cdn(`${resourceName}-cdn`, cdnConfig);
44
+ output.cdnUrl = cdn.url;
45
+ }
46
+ return output;
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFuc2xhdG9ycy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7QUFnQkgsNENBK0NDO0FBbEREOztHQUVHO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxNQUFxQixFQUNyQixHQUFRLEVBQ1IsV0FBbUI7SUFFbkIsTUFBTSxZQUFZLEdBQUcsR0FBRyxXQUFXLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRW5ELDZDQUE2QztJQUM3QyxNQUFNLFlBQVksR0FBNEIsRUFBRSxDQUFDO0lBRWpELGtEQUFrRDtJQUNsRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyRCxZQUFZLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4RCxZQUFZLENBQUMsSUFBSSxHQUFHO1lBQ2xCLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVztZQUNoQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7WUFDOUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFMUQsTUFBTSxNQUFNLEdBQWtCO1FBQzVCLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSTtRQUN2QixTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUc7S0FDdEIsQ0FBQztJQUVGLDBCQUEwQjtJQUMxQixJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNmLE1BQU0sU0FBUyxHQUE0QjtZQUN6QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQ3RCLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmFnZSBJbnRlbnQgVHJhbnNsYXRvclxuICogXG4gKiBUcmFuc2xhdGVzIFN0b3JhZ2VJbnRlbnQgdG8gU1NUIFMzL0NETiByZXNvdXJjZXMuXG4gKiBUaGlzIGZpbGUgaXNvbGF0ZXMgYWxsIFNTVC9TMy1zcGVjaWZpYyBsb2dpYy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VJbnRlbnQgfSBmcm9tICdAdmVudHVyZWtpdC9jb3JlJztcblxuLyoqXG4gKiBTdG9yYWdlIG91dHB1dCBhZnRlciBjcmVhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VPdXRwdXQge1xuICBidWNrZXROYW1lOiBzdHJpbmc7XG4gIGJ1Y2tldEFybjogc3RyaW5nO1xuICBjZG5Vcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlIFN0b3JhZ2VJbnRlbnQgdG8gU1NUIEJ1Y2tldFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhbnNsYXRlU3RvcmFnZShcbiAgaW50ZW50OiBTdG9yYWdlSW50ZW50LFxuICBzc3Q6IGFueSxcbiAgcHJvamVjdE5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxTdG9yYWdlT3V0cHV0PiB7XG4gIGNvbnN0IHJlc291cmNlTmFtZSA9IGAke3Byb2plY3ROYW1lfS0ke2ludGVudC5pZH1gO1xuICBcbiAgLy8gQnVpbGQgYnVja2V0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gaW50ZW50XG4gIGNvbnN0IGJ1Y2tldENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgXG4gIC8vIFZlcnNpb25pbmcgYmFzZWQgb24gcHVycG9zZSBvciBleHBsaWNpdCBzZXR0aW5nXG4gIGlmIChpbnRlbnQudmVyc2lvbmVkID8/IGludGVudC5wdXJwb3NlID09PSAnYmFja3VwcycpIHtcbiAgICBidWNrZXRDb25maWcudmVyc2lvbmluZyA9IHRydWU7XG4gIH1cbiAgXG4gIC8vIENPUlMgY29uZmlndXJhdGlvblxuICBpZiAoaW50ZW50LmNvcnNPcmlnaW5zICYmIGludGVudC5jb3JzT3JpZ2lucy5sZW5ndGggPiAwKSB7XG4gICAgYnVja2V0Q29uZmlnLmNvcnMgPSB7XG4gICAgICBhbGxvd09yaWdpbnM6IGludGVudC5jb3JzT3JpZ2lucyxcbiAgICAgIGFsbG93TWV0aG9kczogWydHRVQnLCAnUFVUJywgJ1BPU1QnLCAnREVMRVRFJ10sXG4gICAgICBhbGxvd0hlYWRlcnM6IFsnKiddLFxuICAgIH07XG4gIH1cbiAgXG4gIC8vIENyZWF0ZSBidWNrZXRcbiAgY29uc3QgYnVja2V0ID0gbmV3IHNzdC5CdWNrZXQocmVzb3VyY2VOYW1lLCBidWNrZXRDb25maWcpO1xuICBcbiAgY29uc3Qgb3V0cHV0OiBTdG9yYWdlT3V0cHV0ID0ge1xuICAgIGJ1Y2tldE5hbWU6IGJ1Y2tldC5uYW1lLFxuICAgIGJ1Y2tldEFybjogYnVja2V0LmFybixcbiAgfTtcbiAgXG4gIC8vIENyZWF0ZSBDRE4gaWYgcmVxdWVzdGVkXG4gIGlmIChpbnRlbnQuY2RuKSB7XG4gICAgY29uc3QgY2RuQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIG9yaWdpbnM6IFt7IGJ1Y2tldCB9XSxcbiAgICB9O1xuICAgIFxuICAgIGlmIChpbnRlbnQuY2RuRG9tYWluKSB7XG4gICAgICBjZG5Db25maWcuZG9tYWluID0gaW50ZW50LmNkbkRvbWFpbjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY2RuID0gbmV3IHNzdC5DZG4oYCR7cmVzb3VyY2VOYW1lfS1jZG5gLCBjZG5Db25maWcpO1xuICAgIG91dHB1dC5jZG5VcmwgPSBjZG4udXJsO1xuICB9XG4gIFxuICByZXR1cm4gb3V0cHV0O1xufVxuIl19
@@ -0,0 +1,89 @@
1
+ /**
2
+ * VentureKit Main Entry Point
3
+ *
4
+ * defineVenture() is the primary API for creating VentureKit applications.
5
+ * Consumers never see the underlying infrastructure tooling.
6
+ */
7
+ import { BaseConfig, SecurityConfig, EnvConfigInput, ResolvedConfig, VentureIntent } from '@venturekit/core';
8
+ /**
9
+ * VentureKit application definition
10
+ */
11
+ export interface VentureDefinition {
12
+ /** Base configuration (project identity) */
13
+ base: BaseConfig;
14
+ /** Security configuration (scopes, clients) */
15
+ security: SecurityConfig;
16
+ /** Environment-specific configurations */
17
+ envs: {
18
+ dev?: EnvConfigInput;
19
+ stage?: EnvConfigInput;
20
+ prod?: EnvConfigInput;
21
+ };
22
+ /** Path to routes directory (relative to project root) - REQUIRED */
23
+ routesDir: string;
24
+ /**
25
+ * Infrastructure intents
26
+ *
27
+ * Declare WHAT infrastructure you need, not HOW to build it.
28
+ * VentureKit translates intents to provider-specific resources.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * infrastructure: {
33
+ * databases: [{ id: 'main', type: 'postgres', size: 'small', name: 'mydb' }],
34
+ * storage: [{ id: 'uploads', purpose: 'uploads', cdn: true }],
35
+ * }
36
+ * ```
37
+ */
38
+ infrastructure?: VentureIntent;
39
+ }
40
+ /**
41
+ * VentureKit app configuration
42
+ */
43
+ export interface VentureAppConfig {
44
+ name: string;
45
+ home: 'aws';
46
+ providers: {
47
+ aws: {
48
+ region: string;
49
+ };
50
+ };
51
+ }
52
+ /**
53
+ * Define a VentureKit application
54
+ *
55
+ * This is the main entry point for VentureKit projects.
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * // venturekit.config.ts
60
+ * import { defineVenture } from '@venturekit/infra';
61
+ * import { base } from './config/base';
62
+ * import { security } from './config/security';
63
+ * import { dev } from './config/dev';
64
+ * import { prod } from './config/prod';
65
+ *
66
+ * export default defineVenture({
67
+ * base,
68
+ * security,
69
+ * envs: { dev, prod },
70
+ * routesDir: 'src/routes',
71
+ * });
72
+ * ```
73
+ */
74
+ export declare function defineVenture(definition: VentureDefinition): {
75
+ name: string;
76
+ home: "aws";
77
+ providers: {
78
+ aws: {
79
+ region: string;
80
+ };
81
+ };
82
+ run(): Promise<Record<string, unknown>>;
83
+ };
84
+ /**
85
+ * Get resolved configuration for current environment
86
+ *
87
+ * Useful for accessing config values in handlers or other code.
88
+ */
89
+ export declare function getResolvedConfig(base: BaseConfig, security: SecurityConfig, envInput: EnvConfigInput): ResolvedConfig;
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ /**
3
+ * VentureKit Main Entry Point
4
+ *
5
+ * defineVenture() is the primary API for creating VentureKit applications.
6
+ * Consumers never see the underlying infrastructure tooling.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.defineVenture = defineVenture;
43
+ exports.getResolvedConfig = getResolvedConfig;
44
+ const core_1 = require("@venturekit/core");
45
+ const translators_1 = require("./translators");
46
+ const lambda_1 = require("./constructs/lambda");
47
+ const api_1 = require("./constructs/api");
48
+ const vpc_1 = require("./constructs/vpc");
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ /**
52
+ * Discover routes from file system
53
+ *
54
+ * Convention:
55
+ * - src/routes/health/get.ts -> GET /health
56
+ * - src/routes/projects/post.ts -> POST /projects
57
+ * - src/routes/projects/[id]/get.ts -> GET /projects/{id}
58
+ * - src/routes/projects/[id]/delete.ts -> DELETE /projects/{id}
59
+ */
60
+ function discoverRoutes(routesDir) {
61
+ const routes = [];
62
+ function scanDir(dir, routePath = '') {
63
+ if (!fs.existsSync(dir))
64
+ return;
65
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
66
+ for (const entry of entries) {
67
+ const fullPath = path.join(dir, entry.name);
68
+ if (entry.isDirectory()) {
69
+ // Convert [param] to {param} for API Gateway
70
+ const segment = entry.name.startsWith('[') && entry.name.endsWith(']')
71
+ ? `{${entry.name.slice(1, -1)}}`
72
+ : entry.name;
73
+ scanDir(fullPath, `${routePath}/${segment}`);
74
+ }
75
+ else if (entry.isFile() && (entry.name.endsWith('.ts') || entry.name.endsWith('.js'))) {
76
+ const method = (0, api_1.fileNameToMethod)(entry.name);
77
+ if (method) {
78
+ const apiPath = routePath || '/';
79
+ const handlerPath = fullPath.replace(/\.(ts|js)$/, '.handler');
80
+ routes.push({ method, path: apiPath, handler: handlerPath });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ scanDir(routesDir);
86
+ return routes;
87
+ }
88
+ /**
89
+ * Define a VentureKit application
90
+ *
91
+ * This is the main entry point for VentureKit projects.
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * // venturekit.config.ts
96
+ * import { defineVenture } from '@venturekit/infra';
97
+ * import { base } from './config/base';
98
+ * import { security } from './config/security';
99
+ * import { dev } from './config/dev';
100
+ * import { prod } from './config/prod';
101
+ *
102
+ * export default defineVenture({
103
+ * base,
104
+ * security,
105
+ * envs: { dev, prod },
106
+ * routesDir: 'src/routes',
107
+ * });
108
+ * ```
109
+ */
110
+ function defineVenture(definition) {
111
+ // Validate configs
112
+ const baseValidation = (0, core_1.validateBaseConfig)(definition.base);
113
+ (0, core_1.assertValid)(baseValidation);
114
+ const securityValidation = (0, core_1.validateSecurityConfig)(definition.security);
115
+ (0, core_1.assertValid)(securityValidation);
116
+ return {
117
+ name: definition.base.name,
118
+ home: 'aws',
119
+ providers: {
120
+ aws: {
121
+ region: definition.base.region,
122
+ },
123
+ },
124
+ async run() {
125
+ // Determine current environment from VENTURE_STAGE (not SST)
126
+ const stage = process.env.VENTURE_STAGE || 'dev';
127
+ const env = (stage === 'prod' ? 'prod' : stage === 'stage' ? 'stage' : 'dev');
128
+ // Get env config (default to empty if not specified)
129
+ const envInput = definition.envs[env] || {};
130
+ // Validate env config
131
+ const envValidation = (0, core_1.validateEnvConfigInput)(env, envInput);
132
+ (0, core_1.assertValid)(envValidation);
133
+ // Resolve full configuration
134
+ const config = (0, core_1.resolveConfig)(definition.base, definition.security, env, envInput);
135
+ // Discover routes from file system
136
+ const routes = discoverRoutes(definition.routesDir);
137
+ // Translate infrastructure intents if provided
138
+ let intentOutputs;
139
+ if (definition.infrastructure) {
140
+ intentOutputs = await (0, translators_1.translateAllIntents)(definition.infrastructure, config.name);
141
+ }
142
+ // Create infrastructure (passes intent outputs to Lambda env)
143
+ const resources = await createInfrastructure(config, routes, intentOutputs);
144
+ if (intentOutputs) {
145
+ resources.infrastructure = intentOutputs;
146
+ }
147
+ return resources;
148
+ },
149
+ };
150
+ }
151
+ /**
152
+ * Create infrastructure resources
153
+ */
154
+ async function createInfrastructure(config, routes, intentOutputs) {
155
+ // Dynamic import of infrastructure tooling (hidden from consumers)
156
+ const infra = await Promise.resolve().then(() => __importStar(require('sst')));
157
+ const outputs = {};
158
+ // Create VPC if needed
159
+ let vpc = undefined;
160
+ if ((0, vpc_1.isVpcRequired)(config.lambda.vpcEnabled)) {
161
+ vpc = new infra.Vpc(`${config.name}-vpc`, (0, vpc_1.createVpcConfig)(config.name, config.vpc));
162
+ outputs.vpcId = vpc.id;
163
+ }
164
+ // Build route configuration
165
+ const routeConfig = {};
166
+ for (const route of routes) {
167
+ const key = `${route.method} ${route.path}`;
168
+ const routeEntry = {
169
+ handler: route.handler,
170
+ ...(0, lambda_1.createLambdaConfig)(config.lambda),
171
+ environment: (0, lambda_1.createLambdaEnvironment)({
172
+ VENTURE_ENV: config.env,
173
+ VENTURE_NAME: config.name,
174
+ ...(intentOutputs ? { VENTURE_INTENT_OUTPUTS: JSON.stringify(intentOutputs) } : {}),
175
+ }),
176
+ };
177
+ if (vpc && config.lambda.vpcEnabled) {
178
+ routeEntry.vpc = vpc;
179
+ }
180
+ routeConfig[key] = routeEntry;
181
+ }
182
+ // Create API Gateway
183
+ const corsConfig = (0, api_1.createCorsConfig)(config.api.cors);
184
+ const apiConfig = {
185
+ routes: routeConfig,
186
+ };
187
+ if (corsConfig) {
188
+ apiConfig.cors = corsConfig;
189
+ }
190
+ // Add custom domain if configured
191
+ if (config.api.customDomain) {
192
+ apiConfig.domain = {
193
+ name: config.api.customDomain.domainName,
194
+ cert: config.api.customDomain.certificateArn,
195
+ };
196
+ }
197
+ const api = new infra.ApiGatewayV2(`${config.name}-api`, apiConfig);
198
+ outputs.apiUrl = api.url;
199
+ // Create WebSocket API if enabled
200
+ if (config.websocket.enabled) {
201
+ const wsApi = new infra.ApiGatewayWebSocket(`${config.name}-ws`, {
202
+ routes: {
203
+ $connect: `${config.name}/ws/connect.handler`,
204
+ $disconnect: `${config.name}/ws/disconnect.handler`,
205
+ $default: `${config.name}/ws/default.handler`,
206
+ },
207
+ });
208
+ outputs.wsUrl = wsApi.url;
209
+ }
210
+ // Output resolved config for debugging
211
+ outputs.config = {
212
+ name: config.name,
213
+ env: config.env,
214
+ dataSafety: config.dataSafety,
215
+ routeCount: routes.length,
216
+ };
217
+ return outputs;
218
+ }
219
+ /**
220
+ * Get resolved configuration for current environment
221
+ *
222
+ * Useful for accessing config values in handlers or other code.
223
+ */
224
+ function getResolvedConfig(base, security, envInput) {
225
+ const stage = process.env.VENTURE_STAGE || 'dev';
226
+ const env = (stage === 'prod' ? 'prod' : stage === 'stage' ? 'stage' : 'dev');
227
+ return (0, core_1.resolveConfig)(base, security, env, envInput);
228
+ }
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVudHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZW50dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1Skgsc0NBcURDO0FBNkZELDhDQVFDO0FBL1NELDJDQWEwQjtBQUUxQiwrQ0FBb0Q7QUFFcEQsZ0RBRzZCO0FBRTdCLDBDQUkwQjtBQUUxQiwwQ0FHMEI7QUFFMUIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQW9EN0I7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxTQUFpQjtJQUN2QyxNQUFNLE1BQU0sR0FBNkQsRUFBRSxDQUFDO0lBRTVFLFNBQVMsT0FBTyxDQUFDLEdBQVcsRUFBRSxZQUFvQixFQUFFO1FBQ2xELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU87UUFFaEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3RCxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU1QyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN4Qiw2Q0FBNkM7Z0JBQzdDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztvQkFDcEUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUc7b0JBQ2hDLENB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Q0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFnQixDQUFDO0lBQzdGLE9BQU8sSUFBQSxvQkFBYSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZlbnR1cmVLaXQgTWFpbiBFbnRyeSBQb2ludFxuICogXG4gKiBkZWZpbmVWZW50dXJlKCkgaXMgdGhlIHByaW1hcnkgQVBJIGZvciBjcmVhdGluZyBWZW50dXJlS2l0IGFwcGxpY2F0aW9ucy5cbiAqIENvbnN1bWVycyBuZXZlciBzZWUgdGhlIHVuZGVybHlpbmcgaW5mcmFzdHJ1Y3R1cmUgdG9vbGluZy5cbiAqL1xuXG5pbXBvcnQge1xuICBCYXNlQ29uZmlnLFxuICBTZWN1cml0eUNvbmZpZyxcbiAgRW52Q29uZmlnSW5wdXQsXG4gIEVudmlyb25tZW50LFxuICBSZXNvbHZlZENvbmZpZyxcbiAgVmVudHVyZUludGVudCxcbiAgSW50ZW50T3V0cHV0cyxcbiAgcmVzb2x2ZUNvbmZpZyxcbiAgdmFsaWRhdGVCYXNlQ29uZmlnLFxuICB2YWxpZGF0ZVNlY3VyaXR5Q29uZmlnLFxuICB2YWxpZGF0ZUVudkNvbmZpZ0lucHV0LFxuICBhc3NlcnRWYWxpZCxcbn0gZnJvbSAnQHZlbnR1cmVraXQvY29yZSc7XG5cbmltcG9ydCB7IHRyYW5zbGF0ZUFsbEludGVudHMgfSBmcm9tICcuL3RyYW5zbGF0b3JzJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlTGFtYmRhQ29uZmlnLFxuICBjcmVhdGVMYW1iZGFFbnZpcm9ubWVudCxcbn0gZnJvbSAnLi9jb25zdHJ1Y3RzL2xhbWJkYSc7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZUNvcnNDb25maWcsXG4gIGRpclBhdGhUb1JvdXRlUGF0aCxcbiAgZmlsZU5hbWVUb01ldGhvZCxcbn0gZnJvbSAnLi9jb25zdHJ1Y3RzL2FwaSc7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZVZwY0NvbmZpZyxcbiAgaXNWcGNSZXF1aXJlZCxcbn0gZnJvbSAnLi9jb25zdHJ1Y3RzL3ZwYyc7XG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbi8qKlxuICogVmVudHVyZUtpdCBhcHBsaWNhdGlvbiBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVudHVyZURlZmluaXRpb24ge1xuICAvKiogQmFzZSBjb25maWd1cmF0aW9uIChwcm9qZWN0IGlkZW50aXR5KSAqL1xuICBiYXNlOiBCYXNlQ29uZmlnO1xuICBcbiAgLyoqIFNlY3VyaXR5IGNvbmZpZ3VyYXRpb24gKHNjb3BlcywgY2xpZW50cykgKi9cbiAgc2VjdXJpdHk6IFNlY3VyaXR5Q29uZmlnO1xuICBcbiAgLyoqIEVudmlyb25tZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25zICovXG4gIGVudnM6IHtcbiAgICBkZXY/OiBFbnZDb25maWdJbnB1dDtcbiAgICBzdGFnZT86IEVudkNvbmZpZ0lucHV0O1xuICAgIHByb2Q/OiBFbnZDb25maWdJbnB1dDtcbiAgfTtcbiAgXG4gIC8qKiBQYXRoIHRvIHJvdXRlcyBkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIHByb2plY3Qgcm9vdCkgLSBSRVFVSVJFRCAqL1xuICByb3V0ZXNEaXI6IHN0cmluZztcbiAgXG4gIC8qKlxuICAgKiBJbmZyYXN0cnVjdHVyZSBpbnRlbnRzXG4gICAqIFxuICAgKiBEZWNsYXJlIFdIQVQgaW5mcmFzdHJ1Y3R1cmUgeW91IG5lZWQsIG5vdCBIT1cgdG8gYnVpbGQgaXQuXG4gICAqIFZlbnR1cmVLaXQgdHJhbnNsYXRlcyBpbnRlbnRzIHRvIHByb3ZpZGVyLXNwZWNpZmljIHJlc291cmNlcy5cbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW5mcmFzdHJ1Y3R1cmU6IHtcbiAgICogICBkYXRhYmFzZXM6IFt7IGlkOiAnbWFpbicsIHR5cGU6ICdwb3N0Z3JlcycsIHNpemU6ICdzbWFsbCcsIG5hbWU6ICdteWRiJyB9XSxcbiAgICogICBzdG9yYWdlOiBbeyBpZDogJ3VwbG9hZHMnLCBwdXJwb3NlOiAndXBsb2FkcycsIGNkbjogdHJ1ZSB9XSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGluZnJhc3RydWN0dXJlPzogVmVudHVyZUludGVudDtcbn1cblxuLyoqXG4gKiBWZW50dXJlS2l0IGFwcCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVudHVyZUFwcENvbmZpZyB7XG4gIG5hbWU6IHN0cmluZztcbiAgaG9tZTogJ2F3cyc7XG4gIHByb3ZpZGVyczoge1xuICAgIGF3czoge1xuICAgICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXNjb3ZlciByb3V0ZXMgZnJvbSBmaWxlIHN5c3RlbVxuICogXG4gKiBDb252ZW50aW9uOlxuICogLSBzcmMvcm91dGVzL2hlYWx0aC9nZXQudHMgLT4gR0VUIC9oZWFsdGhcbiAqIC0gc3JjL3JvdXRlcy9wcm9qZWN0cy9wb3N0LnRzIC0+IFBPU1QgL3Byb2plY3RzXG4gKiAtIHNyYy9yb3V0ZXMvcHJvamVjdHMvW2lkXS9nZXQudHMgLT4gR0VUIC9wcm9qZWN0cy97aWR9XG4gKiAtIHNyYy9yb3V0ZXMvcHJvamVjdHMvW2lkXS9kZWxldGUudHMgLT4gREVMRVRFIC9wcm9qZWN0cy97aWR9XG4gKi9cbmZ1bmN0aW9uIGRpc2NvdmVyUm91dGVzKHJvdXRlc0Rpcjogc3RyaW5nKTogQXJyYXk8eyBtZXRob2Q6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBoYW5kbGVyOiBzdHJpbmcgfT4ge1xuICBjb25zdCByb3V0ZXM6IEFycmF5PHsgbWV0aG9kOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgaGFuZGxlcjogc3RyaW5nIH0+ID0gW107XG4gIFxuICBmdW5jdGlvbiBzY2FuRGlyKGRpcjogc3RyaW5nLCByb3V0ZVBhdGg6IHN0cmluZyA9ICcnKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcikpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8ge3BhcmFtfSBmb3IgQVBJIEdhdGV3YXlcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnWycpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJ10nKVxuICAgICAgICAgID8gYHske2VudHJ5Lm5hbWUuc2xpY2UoMSwgLTEpfX1gXG4gICAgICAgICAgOiBlbnRyeS5uYW1lO1xuICAgICAgICBzY2FuRGlyKGZ1bGxQYXRoLCBgJHtyb3V0ZVBhdGh9LyR7c2VnbWVudH1gKTtcbiAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkgJiYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy50cycpIHx8IGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5qcycpKSkge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBmaWxlTmFtZVRvTWV0aG9kKGVudHJ5Lm5hbWUpO1xuICAgICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgICAgY29uc3QgYXBpUGF0aCA9IHJvdXRlUGF0aCB8fCAnLyc7XG4gICAgICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBmdWxsUGF0aC5yZXBsYWNlKC9cXC4odHN8anMpJC8sICcuaGFuZGxlcicpO1xuICAgICAgICAgIHJvdXRlcy5wdXNoKHsgbWV0aG9kLCBwYXRoOiBhcGlQYXRoLCBoYW5kbGVyOiBoYW5kbGVyUGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgc2NhbkRpcihyb3V0ZXNEaXIpO1xuICByZXR1cm4gcm91dGVzO1xufVxuXG4vKipcbiAqIERlZmluZSBhIFZlbnR1cmVLaXQgYXBwbGljYXRpb25cbiAqIFxuICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgVmVudHVyZUtpdCBwcm9qZWN0cy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZlbnR1cmVraXQuY29uZmlnLnRzXG4gKiBpbXBvcnQgeyBkZWZpbmVWZW50dXJlIH0gZnJvbSAnQHZlbnR1cmVraXQvaW5mcmEnO1xuICogaW1wb3J0IHsgYmFzZSB9IGZyb20gJy4vY29uZmlnL2Jhc2UnO1xuICogaW1wb3J0IHsgc2VjdXJpdHkgfSBmcm9tICcuL2NvbmZpZy9zZWN1cml0eSc7XG4gKiBpbXBvcnQgeyBkZXYgfSBmcm9tICcuL2NvbmZpZy9kZXYnO1xuICogaW1wb3J0IHsgcHJvZCB9IGZyb20gJy4vY29uZmlnL3Byb2QnO1xuICogXG4gKiBleHBvcnQgZGVmYXVsdCBkZWZpbmVWZW50dXJlKHtcbiAqICAgYmFzZSxcbiAqICAgc2VjdXJpdHksXG4gKiAgIGVudnM6IHsgZGV2LCBwcm9kIH0sXG4gKiAgIHJvdXRlc0RpcjogJ3NyYy9yb3V0ZXMnLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVZlbnR1cmUoZGVmaW5pdGlvbjogVmVudHVyZURlZmluaXRpb24pIHtcbiAgLy8gVmFsaWRhdGUgY29uZmlnc1xuICBjb25zdCBiYXNlVmFsaWRhdGlvbiA9IHZhbGlkYXRlQmFzZUNvbmZpZyhkZWZpbml0aW9uLmJhc2UpO1xuICBhc3NlcnRWYWxpZChiYXNlVmFsaWRhdGlvbik7XG4gIFxuICBjb25zdCBzZWN1cml0eVZhbGlkYXRpb24gPSB2YWxpZGF0ZVNlY3VyaXR5Q29uZmlnKGRlZmluaXRpb24uc2VjdXJpdHkpO1xuICBhc3NlcnRWYWxpZChzZWN1cml0eVZhbGlkYXRpb24pO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogZGVmaW5pdGlvbi5iYXNlLm5hbWUsXG4gICAgaG9tZTogJ2F3cycgYXMgY29uc3QsXG4gICAgcHJvdmlkZXJzOiB7XG4gICAgICBhd3M6IHtcbiAgICAgICAgcmVnaW9uOiBkZWZpbml0aW9uLmJhc2UucmVnaW9uLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgIC8vIERldGVybWluZSBjdXJyZW50IGVudmlyb25tZW50IGZyb20gVkVOVFVSRV9TVEFHRSAobm90IFNTVClcbiAgICAgIGNvbnN0IHN0YWdlID0gcHJvY2Vzcy5lbnYuVkVOVFVSRV9TVEFHRSB8fCAnZGV2JztcbiAgICAgIGNvbnN0IGVudiA9IChzdGFnZSA9PT0gJ3Byb2QnID8gJ3Byb2QnIDogc3RhZ2UgPT09ICdzdGFnZScgPyAnc3RhZ2UnIDogJ2RldicpIGFzIEVudmlyb25tZW50O1xuICAgICAgXG4gICAgICAvLyBHZXQgZW52IGNvbmZpZyAoZGVmYXVsdCB0byBlbXB0eSBpZiBub3Qgc3BlY2lmaWVkKVxuICAgICAgY29uc3QgZW52SW5wdXQgPSBkZWZpbml0aW9uLmVudnNbZW52XSB8fCB7fTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZW52IGNvbmZpZ1xuICAgICAgY29uc3QgZW52VmFsaWRhdGlvbiA9IHZhbGlkYXRlRW52Q29uZmlnSW5wdXQoZW52LCBlbnZJbnB1dCk7XG4gICAgICBhc3NlcnRWYWxpZChlbnZWYWxpZGF0aW9uKTtcbiAgICAgIFxuICAgICAgLy8gUmVzb2x2ZSBmdWxsIGNvbmZpZ3VyYXRpb25cbiAgICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVDb25maWcoZGVmaW5pdGlvbi5iYXNlLCBkZWZpbml0aW9uLnNlY3VyaXR5LCBlbnYsIGVudklucHV0KTtcbiAgICAgIFxuICAgICAgLy8gRGlzY292ZXIgcm91dGVzIGZyb20gZmlsZSBzeXN0ZW1cbiAgICAgIGNvbnN0IHJvdXRlcyA9IGRpc2NvdmVyUm91dGVzKGRlZmluaXRpb24ucm91dGVzRGlyKTtcbiAgICAgIFxuICAgICAgLy8gVHJhbnNsYXRlIGluZnJhc3RydWN0dXJlIGludGVudHMgaWYgcHJvdmlkZWRcbiAgICAgIGxldCBpbnRlbnRPdXRwdXRzOiBJbnRlbnRPdXRwdXRzIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlZmluaXRpb24uaW5mcmFzdHJ1Y3R1cmUpIHtcbiAgICAgICAgaW50ZW50T3V0cHV0cyA9IGF3YWl0IHRyYW5zbGF0ZUFsbEludGVudHMoXG4gICAgICAgICAgZGVmaW5pdGlvbi5pbmZyYXN0cnVjdHVyZSxcbiAgICAgICAgICBjb25maWcubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgaW5mcmFzdHJ1Y3R1cmUgKHBhc3NlcyBpbnRlbnQgb3V0cHV0cyB0byBMYW1iZGEgZW52KVxuICAgICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgY3JlYXRlSW5mcmFzdHJ1Y3R1cmUoY29uZmlnLCByb3V0ZXMsIGludGVudE91dHB1dHMpO1xuXG4gICAgICBpZiAoaW50ZW50T3V0cHV0cykge1xuICAgICAgICByZXNvdXJjZXMuaW5mcmFzdHJ1Y3R1cmUgPSBpbnRlbnRPdXRwdXRzO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gcmVzb3VyY2VzO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGluZnJhc3RydWN0dXJlIHJlc291cmNlc1xuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVJbmZyYXN0cnVjdHVyZShcbiAgY29uZmlnOiBSZXNvbHZlZENvbmZpZyxcbiAgcm91dGVzOiBBcnJheTx7IG1ldGhvZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGhhbmRsZXI6IHN0cmluZyB9PixcbiAgaW50ZW50T3V0cHV0cz86IEludGVudE91dHB1dHMsXG4pIHtcbiAgLy8gRHluYW1pYyBpbXBvcnQgb2YgaW5mcmFzdHJ1Y3R1cmUgdG9vbGluZyAoaGlkZGVuIGZyb20gY29uc3VtZXJzKVxuICBjb25zdCBpbmZyYSA9IGF3YWl0IGltcG9ydCgnc3N0JykgYXMgYW55O1xuICBcbiAgY29uc3Qgb3V0cHV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgXG4gIC8vIENyZWF0ZSBWUEMgaWYgbmVlZGVkXG4gIGxldCB2cGM6IHVua25vd24gPSB1bmRlZmluZWQ7XG4gIGlmIChpc1ZwY1JlcXVpcmVkKGNvbmZpZy5sYW1iZGEudnBjRW5hYmxlZCkpIHtcbiAgICB2cGMgPSBuZXcgaW5mcmEuVnBjKGAke2NvbmZpZy5uYW1lfS12cGNgLCBjcmVhdGVWcGNDb25maWcoY29uZmlnLm5hbWUsIGNvbmZpZy52cGMpKTtcbiAgICBvdXRwdXRzLnZwY0lkID0gKHZwYyBhcyB7IGlkOiBzdHJpbmcgfSkuaWQ7XG4gIH1cbiAgXG4gIC8vIEJ1aWxkIHJvdXRlIGNvbmZpZ3VyYXRpb25cbiAgY29uc3Qgcm91dGVDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIFxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgIGNvbnN0IGtleSA9IGAke3JvdXRlLm1ldGhvZH0gJHtyb3V0ZS5wYXRofWA7XG4gICAgY29uc3Qgcm91dGVFbnRyeTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBoYW5kbGVyOiByb3V0ZS5oYW5kbGVyLFxuICAgICAgLi4uY3JlYXRlTGFtYmRhQ29uZmlnKGNvbmZpZy5sYW1iZGEpLFxuICAgICAgZW52aXJvbm1lbnQ6IGNyZWF0ZUxhbWJkYUVudmlyb25tZW50KHtcbiAgICAgICAgVkVOVFVSRV9FTlY6IGNvbmZpZy5lbnYsXG4gICAgICAgIFZFTlRVUkVfTkFNRTogY29uZmlnLm5hbWUsXG4gICAgICAgIC4uLihpbnRlbnRPdXRwdXRzID8geyBWRU5UVVJFX0lOVEVOVF9PVVRQVVRTOiBKU09OLnN0cmluZ2lmeShpbnRlbnRPdXRwdXRzKSB9IDoge30pLFxuICAgICAgfSksXG4gICAgfTtcbiAgICBpZiAodnBjICYmIGNvbmZpZy5sYW1iZGEudnBjRW5hYmxlZCkge1xuICAgICAgcm91dGVFbnRyeS52cGMgPSB2cGM7XG4gICAgfVxuICAgIHJvdXRlQ29uZmlnW2tleV0gPSByb3V0ZUVudHJ5O1xuICB9XG4gIFxuICAvLyBDcmVhdGUgQVBJIEdhdGV3YXlcbiAgY29uc3QgY29yc0NvbmZpZyA9IGNyZWF0ZUNvcnNDb25maWcoY29uZmlnLmFwaS5jb3JzKTtcbiAgXG4gIGNvbnN0IGFwaUNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcm91dGVzOiByb3V0ZUNvbmZpZyxcbiAgfTtcbiAgXG4gIGlmIChjb3JzQ29uZmlnKSB7XG4gICAgYXBpQ29uZmlnLmNvcnMgPSBjb3JzQ29uZmlnO1xuICB9XG4gIFxuICAvLyBBZGQgY3VzdG9tIGRvbWFpbiBpZiBjb25maWd1cmVkXG4gIGlmIChjb25maWcuYXBpLmN1c3RvbURvbWFpbikge1xuICAgIGFwaUNvbmZpZy5kb21haW4gPSB7XG4gICAgICBuYW1lOiBjb25maWcuYXBpLmN1c3RvbURvbWFpbi5kb21haW5OYW1lLFxuICAgICAgY2VydDogY29uZmlnLmFwaS5jdXN0b21Eb21haW4uY2VydGlmaWNhdGVBcm4sXG4gICAgfTtcbiAgfVxuICBcbiAgY29uc3QgYXBpID0gbmV3IGluZnJhLkFwaUdhdGV3YXlWMihgJHtjb25maWcubmFtZX0tYXBpYCwgYXBpQ29uZmlnKTtcbiAgXG4gIG91dHB1dHMuYXBpVXJsID0gKGFwaSBhcyB7IHVybDogc3RyaW5nIH0pLnVybDtcbiAgXG4gIC8vIENyZWF0ZSBXZWJTb2NrZXQgQVBJIGlmIGVuYWJsZWRcbiAgaWYgKGNvbmZpZy53ZWJzb2NrZXQuZW5hYmxlZCkge1xuICAgIGNvbnN0IHdzQXBpID0gbmV3IGluZnJhLkFwaUdhdGV3YXlXZWJTb2NrZXQoYCR7Y29uZmlnLm5hbWV9LXdzYCwge1xuICAgICAgcm91dGVzOiB7XG4gICAgICAgICRjb25uZWN0OiBgJHtjb25maWcubmFtZX0vd3MvY29ubmVjdC5oYW5kbGVyYCxcbiAgICAgICAgJGRpc2Nvbm5lY3Q6IGAke2NvbmZpZy5uYW1lfS93cy9kaXNjb25uZWN0LmhhbmRsZXJgLFxuICAgICAgICAkZGVmYXVsdDogYCR7Y29uZmlnLm5hbWV9L3dzL2RlZmF1bHQuaGFuZGxlcmAsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIG91dHB1dHMud3NVcmwgPSAod3NBcGkgYXMgeyB1cmw6IHN0cmluZyB9KS51cmw7XG4gIH1cbiAgXG4gIC8vIE91dHB1dCByZXNvbHZlZCBjb25maWcgZm9yIGRlYnVnZ2luZ1xuICBvdXRwdXRzLmNvbmZpZyA9IHtcbiAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICBlbnY6IGNvbmZpZy5lbnYsXG4gICAgZGF0YVNhZmV0eTogY29uZmlnLmRhdGFTYWZldHksXG4gICAgcm91dGVDb3VudDogcm91dGVzLmxlbmd0aCxcbiAgfTtcbiAgXG4gIHJldHVybiBvdXRwdXRzO1xufVxuXG4vKipcbiAqIEdldCByZXNvbHZlZCBjb25maWd1cmF0aW9uIGZvciBjdXJyZW50IGVudmlyb25tZW50XG4gKiBcbiAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIGNvbmZpZyB2YWx1ZXMgaW4gaGFuZGxlcnMgb3Igb3RoZXIgY29kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc29sdmVkQ29uZmlnKFxuICBiYXNlOiBCYXNlQ29uZmlnLFxuICBzZWN1cml0eTogU2VjdXJpdHlDb25maWcsXG4gIGVudklucHV0OiBFbnZDb25maWdJbnB1dFxuKTogUmVzb2x2ZWRDb25maWcge1xuICBjb25zdCBzdGFnZSA9IHByb2Nlc3MuZW52LlZFTlRVUkVfU1RBR0UgfHwgJ2Rldic7XG4gIGNvbnN0IGVudiA9IChzdGFnZSA9PT0gJ3Byb2QnID8gJ3Byb2QnIDogc3RhZ2UgPT09ICdzdGFnZScgPyAnc3RhZ2UnIDogJ2RldicpIGFzIEVudmlyb25tZW50O1xuICByZXR1cm4gcmVzb2x2ZUNvbmZpZyhiYXNlLCBzZWN1cml0eSwgZW52LCBlbnZJbnB1dCk7XG59XG4iXX0=
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@venturekit/infra",
3
+ "version": "0.0.0-dev.20260307234057",
4
+ "description": "VentureKit infrastructure - SST constructs for AWS",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/venturekit-dev/venturekit.private.git",
13
+ "directory": "packages/infra"
14
+ },
15
+ "publishConfig": {
16
+ "registry": "https://registry.npmjs.org",
17
+ "access": "public"
18
+ },
19
+ "keywords": [
20
+ "venturekit",
21
+ "saas",
22
+ "sst",
23
+ "aws",
24
+ "infrastructure"
25
+ ],
26
+ "license": "Apache-2.0",
27
+ "dependencies": {
28
+ "@venturekit/core": "0.0.0-dev.20260307234057",
29
+ "sst": "^3.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^20.10.0",
33
+ "typescript": "^5.3.0"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc",
37
+ "dev": "tsc --watch",
38
+ "clean": "rm -rf dist"
39
+ }
40
+ }