@venturekit/core 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.
- package/LICENSE +191 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +45 -0
- package/dist/presets.d.ts +67 -0
- package/dist/presets.js +345 -0
- package/dist/resolve.d.ts +28 -0
- package/dist/resolve.js +188 -0
- package/dist/types/api.d.ts +54 -0
- package/dist/types/api.js +9 -0
- package/dist/types/base.d.ts +21 -0
- package/dist/types/base.js +9 -0
- package/dist/types/env.d.ts +74 -0
- package/dist/types/env.js +14 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.js +8 -0
- package/dist/types/intents.d.ts +192 -0
- package/dist/types/intents.js +14 -0
- package/dist/types/lambda.d.ts +68 -0
- package/dist/types/lambda.js +9 -0
- package/dist/types/observability.d.ts +82 -0
- package/dist/types/observability.js +9 -0
- package/dist/types/resolved.d.ts +47 -0
- package/dist/types/resolved.js +9 -0
- package/dist/types/security.d.ts +54 -0
- package/dist/types/security.js +9 -0
- package/dist/types/vpc.d.ts +65 -0
- package/dist/types/vpc.js +9 -0
- package/dist/types/websocket.d.ts +24 -0
- package/dist/types/websocket.js +8 -0
- package/dist/validate.d.ts +41 -0
- package/dist/validate.js +162 -0
- package/package.json +33 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VentureKit Security Configuration Types
|
|
3
|
+
*
|
|
4
|
+
* OAuth scopes, app clients, and authentication settings.
|
|
5
|
+
* Separated from base.ts to keep config files manageable.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* OAuth scope definition
|
|
9
|
+
*/
|
|
10
|
+
export interface OAuthScope {
|
|
11
|
+
/** Scope name (e.g., 'projects.read', 'users.write') */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Scope description */
|
|
14
|
+
description: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* App client configuration
|
|
18
|
+
*/
|
|
19
|
+
export interface AppClient {
|
|
20
|
+
/** Client name (e.g., 'web-app', 'mobile-app', 'admin-dashboard') */
|
|
21
|
+
name: string;
|
|
22
|
+
/** Allowed OAuth scopes for this client */
|
|
23
|
+
allowedScopes: string[];
|
|
24
|
+
/** Whether this client supports refresh tokens */
|
|
25
|
+
supportsRefreshTokens: boolean;
|
|
26
|
+
/** Generate client secret (true for server-side, false for SPA/mobile) */
|
|
27
|
+
generateSecret?: boolean;
|
|
28
|
+
/** Access token validity in hours (default: 1) */
|
|
29
|
+
accessTokenValidityHours?: number;
|
|
30
|
+
/** Refresh token validity in days (default: 30) */
|
|
31
|
+
refreshTokenValidityDays?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Security configuration - authentication and authorization settings
|
|
35
|
+
*
|
|
36
|
+
* Defined ONCE and shared across all environments.
|
|
37
|
+
* Keep separate from base.ts to avoid config file bloat.
|
|
38
|
+
*/
|
|
39
|
+
export interface SecurityConfig {
|
|
40
|
+
/** All available OAuth scopes for this project */
|
|
41
|
+
scopes: OAuthScope[];
|
|
42
|
+
/** App clients and their allowed scopes */
|
|
43
|
+
appClients: AppClient[];
|
|
44
|
+
/** MFA setting (default: 'optional') */
|
|
45
|
+
mfa?: 'off' | 'optional' | 'required';
|
|
46
|
+
/** Password policy */
|
|
47
|
+
passwordPolicy?: {
|
|
48
|
+
minLength?: number;
|
|
49
|
+
requireUppercase?: boolean;
|
|
50
|
+
requireLowercase?: boolean;
|
|
51
|
+
requireNumbers?: boolean;
|
|
52
|
+
requireSymbols?: boolean;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* VentureKit Security Configuration Types
|
|
4
|
+
*
|
|
5
|
+
* OAuth scopes, app clients, and authentication settings.
|
|
6
|
+
* Separated from base.ts to keep config files manageable.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvc2VjdXJpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWZW50dXJlS2l0IFNlY3VyaXR5IENvbmZpZ3VyYXRpb24gVHlwZXNcbiAqIFxuICogT0F1dGggc2NvcGVzLCBhcHAgY2xpZW50cywgYW5kIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzLlxuICogU2VwYXJhdGVkIGZyb20gYmFzZS50cyB0byBrZWVwIGNvbmZpZyBmaWxlcyBtYW5hZ2VhYmxlLlxuICovXG5cbi8qKlxuICogT0F1dGggc2NvcGUgZGVmaW5pdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoU2NvcGUge1xuICAvKiogU2NvcGUgbmFtZSAoZS5nLiwgJ3Byb2plY3RzLnJlYWQnLCAndXNlcnMud3JpdGUnKSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBTY29wZSBkZXNjcmlwdGlvbiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFwcCBjbGllbnQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcENsaWVudCB7XG4gIC8qKiBDbGllbnQgbmFtZSAoZS5nLiwgJ3dlYi1hcHAnLCAnbW9iaWxlLWFwcCcsICdhZG1pbi1kYXNoYm9hcmQnKSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBBbGxvd2VkIE9BdXRoIHNjb3BlcyBmb3IgdGhpcyBjbGllbnQgKi9cbiAgYWxsb3dlZFNjb3Blczogc3RyaW5nW107XG4gIC8qKiBXaGV0aGVyIHRoaXMgY2xpZW50IHN1cHBvcnRzIHJlZnJlc2ggdG9rZW5zICovXG4gIHN1cHBvcnRzUmVmcmVzaFRva2VuczogYm9vbGVhbjtcbiAgLyoqIEdlbmVyYXRlIGNsaWVudCBzZWNyZXQgKHRydWUgZm9yIHNlcnZlci1zaWRlLCBmYWxzZSBmb3IgU1BBL21vYmlsZSkgKi9cbiAgZ2VuZXJhdGVTZWNyZXQ/OiBib29sZWFuO1xuICAvKiogQWNjZXNzIHRva2VuIHZhbGlkaXR5IGluIGhvdXJzIChkZWZhdWx0OiAxKSAqL1xuICBhY2Nlc3NUb2tlblZhbGlkaXR5SG91cnM/OiBudW1iZXI7XG4gIC8qKiBSZWZyZXNoIHRva2VuIHZhbGlkaXR5IGluIGRheXMgKGRlZmF1bHQ6IDMwKSAqL1xuICByZWZyZXNoVG9rZW5WYWxpZGl0eURheXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogU2VjdXJpdHkgY29uZmlndXJhdGlvbiAtIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIHNldHRpbmdzXG4gKiBcbiAqIERlZmluZWQgT05DRSBhbmQgc2hhcmVkIGFjcm9zcyBhbGwgZW52aXJvbm1lbnRzLlxuICogS2VlcCBzZXBhcmF0ZSBmcm9tIGJhc2UudHMgdG8gYXZvaWQgY29uZmlnIGZpbGUgYmxvYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlDb25maWcge1xuICAvKiogQWxsIGF2YWlsYWJsZSBPQXV0aCBzY29wZXMgZm9yIHRoaXMgcHJvamVjdCAqL1xuICBzY29wZXM6IE9BdXRoU2NvcGVbXTtcbiAgXG4gIC8qKiBBcHAgY2xpZW50cyBhbmQgdGhlaXIgYWxsb3dlZCBzY29wZXMgKi9cbiAgYXBwQ2xpZW50czogQXBwQ2xpZW50W107XG4gIFxuICAvKiogTUZBIHNldHRpbmcgKGRlZmF1bHQ6ICdvcHRpb25hbCcpICovXG4gIG1mYT86ICdvZmYnIHwgJ29wdGlvbmFsJyB8ICdyZXF1aXJlZCc7XG4gIFxuICAvKiogUGFzc3dvcmQgcG9saWN5ICovXG4gIHBhc3N3b3JkUG9saWN5Pzoge1xuICAgIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgICByZXF1aXJlVXBwZXJjYXNlPzogYm9vbGVhbjtcbiAgICByZXF1aXJlTG93ZXJjYXNlPzogYm9vbGVhbjtcbiAgICByZXF1aXJlTnVtYmVycz86IGJvb2xlYW47XG4gICAgcmVxdWlyZVN5bWJvbHM/OiBib29sZWFuO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VPC Environment Configuration
|
|
3
|
+
*
|
|
4
|
+
* Controls networking per environment.
|
|
5
|
+
* All fields are REQUIRED - no implicit defaults at the type level.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Subnet configuration
|
|
9
|
+
*/
|
|
10
|
+
export interface SubnetConfig {
|
|
11
|
+
/** CIDR mask for subnets (e.g., 24 for /24) */
|
|
12
|
+
cidrMask: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Security group rule
|
|
16
|
+
*/
|
|
17
|
+
export interface SecurityGroupRule {
|
|
18
|
+
/** Protocol (tcp, udp, icmp, -1 for all) */
|
|
19
|
+
protocol: string;
|
|
20
|
+
/** Port range start */
|
|
21
|
+
fromPort: number;
|
|
22
|
+
/** Port range end */
|
|
23
|
+
toPort: number;
|
|
24
|
+
/** CIDR blocks to allow */
|
|
25
|
+
cidrBlocks?: string[];
|
|
26
|
+
/** Description */
|
|
27
|
+
description?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* VPC configuration
|
|
31
|
+
*
|
|
32
|
+
* All fields required - use presets or explicit values.
|
|
33
|
+
*/
|
|
34
|
+
export interface VpcEnvConfig {
|
|
35
|
+
/** Number of availability zones (1-3) */
|
|
36
|
+
maxAzs: number;
|
|
37
|
+
/** Number of NAT gateways (0 = no private subnet internet access) */
|
|
38
|
+
natGateways: number;
|
|
39
|
+
/** CIDR block for the VPC */
|
|
40
|
+
cidr: string;
|
|
41
|
+
/** Enable VPC flow logs for network monitoring */
|
|
42
|
+
flowLogsEnabled: boolean;
|
|
43
|
+
/** Flow logs retention in days */
|
|
44
|
+
flowLogsRetentionDays: number;
|
|
45
|
+
/** Public subnet configuration */
|
|
46
|
+
publicSubnets: SubnetConfig;
|
|
47
|
+
/** Private subnet configuration (for Lambda, RDS) */
|
|
48
|
+
privateSubnets: SubnetConfig;
|
|
49
|
+
/** Isolated subnet configuration (no internet, for RDS) */
|
|
50
|
+
isolatedSubnets: SubnetConfig | undefined;
|
|
51
|
+
/** Enable VPC endpoints for AWS services (S3, DynamoDB, etc.) */
|
|
52
|
+
enableVpcEndpoints: boolean;
|
|
53
|
+
/** Additional ingress rules for Lambda security group */
|
|
54
|
+
lambdaSecurityGroupIngress: SecurityGroupRule[];
|
|
55
|
+
/** Additional egress rules for Lambda security group */
|
|
56
|
+
lambdaSecurityGroupEgress: SecurityGroupRule[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* VPC configuration input (for user overrides)
|
|
60
|
+
*/
|
|
61
|
+
export type VpcEnvConfigInput = Partial<Omit<VpcEnvConfig, 'publicSubnets' | 'privateSubnets' | 'isolatedSubnets'>> & {
|
|
62
|
+
publicSubnets?: Partial<SubnetConfig>;
|
|
63
|
+
privateSubnets?: Partial<SubnetConfig>;
|
|
64
|
+
isolatedSubnets?: Partial<SubnetConfig>;
|
|
65
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* VPC Environment Configuration
|
|
4
|
+
*
|
|
5
|
+
* Controls networking per environment.
|
|
6
|
+
* All fields are REQUIRED - no implicit defaults at the type level.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3ZwYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0ciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZQQyBFbnZpcm9ubWVudCBDb25maWd1cmF0aW9uXG4gKiBcbiAqIENvbnRyb2xzIG5ldHdvcmtpbmcgcGVyIGVudmlyb25tZW50LlxuICogQWxsIGZpZWxkcyBhcmUgUkVRVUlSRUQgLSBubyBpbXBsaWNpdCBkZWZhdWx0cyBhdCB0aGUgdHlwZSBsZXZlbC5cbiAqL1xuXG4vKipcbiAqIFN1Ym5ldCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VibmV0Q29uZmlnIHtcbiAgLyoqIENJRFIgbWFzayBmb3Igc3VibmV0cyAoZS5nLiwgMjQgZm9yIC8yNCkgKi9cbiAgY2lkck1hc2s6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTZWN1cml0eSBncm91cCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJpdHlHcm91cFJ1bGUge1xuICAvKiogUHJvdG9jb2wgKHRjcCwgdWRwLCBpY21wLCAtMSBmb3IgYWxsKSAqL1xuICBwcm90b2NvbDogc3RyaW5nO1xuICAvKiogUG9ydCByYW5nZSBzdGFydCAqL1xuICBmcm9tUG9ydDogbnVtYmVyO1xuICAvKiogUG9ydCByYW5nZSBlbmQgKi9cbiAgdG9Qb3J0OiBudW1iZXI7XG4gIC8qKiBDSURSIGJsb2NrcyB0byBhbGxvdyAqL1xuICBjaWRyQmxvY2tzPzogc3RyaW5nW107XG4gIC8qKiBEZXNjcmlwdGlvbiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBWUEMgY29uZmlndXJhdGlvblxuICogXG4gKiBBbGwgZmllbGRzIHJlcXVpcmVkIC0gdXNlIHByZXNldHMgb3IgZXhwbGljaXQgdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwY0VudkNvbmZpZyB7XG4gIC8qKiBOdW1iZXIgb2YgYXZhaWxhYmlsaXR5IHpvbmVzICgxLTMpICovXG4gIG1heEF6czogbnVtYmVyO1xuICBcbiAgLyoqIE51bWJlciBvZiBOQVQgZ2F0ZXdheXMgKDAgPSBubyBwcml2YXRlIHN1Ym5ldCBpbnRlcm5ldCBhY2Nlc3MpICovXG4gIG5hdEdhdGV3YXlzOiBudW1iZXI7XG4gIFxuICAvKiogQ0lEUiBibG9jayBmb3IgdGhlIFZQQyAqL1xuICBjaWRyOiBzdHJpbmc7XG4gIFxuICAvKiogRW5hYmxlIFZQQyBmbG93IGxvZ3MgZm9yIG5ldHdvcmsgbW9uaXRvcmluZyAqL1xuICBmbG93TG9nc0VuYWJsZWQ6IGJvb2xlYW47XG4gIFxuICAvKiogRmxvdyBsb2dzIHJldGVudGlvbiBpbiBkYXlzICovXG4gIGZsb3dMb2dzUmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBcbiAgLyoqIFB1YmxpYyBzdWJuZXQgY29uZmlndXJhdGlvbiAqL1xuICBwdWJsaWNTdWJuZXRzOiBTdWJuZXRDb25maWc7XG4gIFxuICAvKiogUHJpdmF0ZSBzdWJuZXQgY29uZmlndXJhdGlvbiAoZm9yIExhbWJkYSwgUkRTKSAqL1xuICBwcml2YXRlU3VibmV0czogU3VibmV0Q29uZmlnO1xuICBcbiAgLyoqIElzb2xhdGVkIHN1Ym5ldCBjb25maWd1cmF0aW9uIChubyBpbnRlcm5ldCwgZm9yIFJEUykgKi9cbiAgaXNvbGF0ZWRTdWJuZXRzOiBTdWJuZXRDb25maWcgfCB1bmRlZmluZWQ7XG4gIFxuICAvKiogRW5hYmxlIFZQQyBlbmRwb2ludHMgZm9yIEFXUyBzZXJ2aWNlcyAoUzMsIER5bmFtb0RCLCBldGMuKSAqL1xuICBlbmFibGVWcGNFbmRwb2ludHM6IGJvb2xlYW47XG4gIFxuICAvKiogQWRkaXRpb25hbCBpbmdyZXNzIHJ1bGVzIGZvciBMYW1iZGEgc2VjdXJpdHkgZ3JvdXAgKi9cbiAgbGFtYmRhU2VjdXJpdHlHcm91cEluZ3Jlc3M6IFNlY3VyaXR5R3JvdXBSdWxlW107XG4gIFxuICAvKiogQWRkaXRpb25hbCBlZ3Jlc3MgcnVsZXMgZm9yIExhbWJkYSBzZWN1cml0eSBncm91cCAqL1xuICBsYW1iZGFTZWN1cml0eUdyb3VwRWdyZXNzOiBTZWN1cml0eUdyb3VwUnVsZVtdO1xufVxuXG4vKipcbiAqIFZQQyBjb25maWd1cmF0aW9uIGlucHV0IChmb3IgdXNlciBvdmVycmlkZXMpXG4gKi9cbmV4cG9ydCB0eXBlIFZwY0VudkNvbmZpZ0lucHV0ID0gUGFydGlhbDxPbWl0PFZwY0VudkNvbmZpZywgJ3B1YmxpY1N1Ym5ldHMnIHwgJ3ByaXZhdGVTdWJuZXRzJyB8ICdpc29sYXRlZFN1Ym5ldHMnPj4gJiB7XG4gIHB1YmxpY1N1Ym5ldHM/OiBQYXJ0aWFsPFN1Ym5ldENvbmZpZz47XG4gIHByaXZhdGVTdWJuZXRzPzogUGFydGlhbDxTdWJuZXRDb25maWc+O1xuICBpc29sYXRlZFN1Ym5ldHM/OiBQYXJ0aWFsPFN1Ym5ldENvbmZpZz47XG59O1xuIl19
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VentureKit WebSocket Configuration Types
|
|
3
|
+
*
|
|
4
|
+
* WebSocket API Gateway configuration for real-time features.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* WebSocket configuration
|
|
8
|
+
*/
|
|
9
|
+
export interface WebSocketEnvConfig {
|
|
10
|
+
/** Enable WebSocket API (default: false) */
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
/** Route selection expression (default: '$request.body.action') */
|
|
13
|
+
routeSelectionExpression: string;
|
|
14
|
+
/** Idle connection timeout in seconds (default: 600, max: 7200) */
|
|
15
|
+
idleTimeoutSec: number;
|
|
16
|
+
/** Throttle rate limit (messages per second) */
|
|
17
|
+
throttleRateLimit: number;
|
|
18
|
+
/** Throttle burst limit */
|
|
19
|
+
throttleBurstLimit: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* WebSocket configuration input (for user overrides)
|
|
23
|
+
*/
|
|
24
|
+
export type WebSocketEnvConfigInput = Partial<WebSocketEnvConfig>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* VentureKit WebSocket Configuration Types
|
|
4
|
+
*
|
|
5
|
+
* WebSocket API Gateway configuration for real-time features.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3dlYnNvY2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmVudHVyZUtpdCBXZWJTb2NrZXQgQ29uZmlndXJhdGlvbiBUeXBlc1xuICogXG4gKiBXZWJTb2NrZXQgQVBJIEdhdGV3YXkgY29uZmlndXJhdGlvbiBmb3IgcmVhbC10aW1lIGZlYXR1cmVzLlxuICovXG5cbi8qKlxuICogV2ViU29ja2V0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRFbnZDb25maWcge1xuICAvKiogRW5hYmxlIFdlYlNvY2tldCBBUEkgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBlbmFibGVkOiBib29sZWFuO1xuICBcbiAgLyoqIFJvdXRlIHNlbGVjdGlvbiBleHByZXNzaW9uIChkZWZhdWx0OiAnJHJlcXVlc3QuYm9keS5hY3Rpb24nKSAqL1xuICByb3V0ZVNlbGVjdGlvbkV4cHJlc3Npb246IHN0cmluZztcbiAgXG4gIC8qKiBJZGxlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiA2MDAsIG1heDogNzIwMCkgKi9cbiAgaWRsZVRpbWVvdXRTZWM6IG51bWJlcjtcbiAgXG4gIC8qKiBUaHJvdHRsZSByYXRlIGxpbWl0IChtZXNzYWdlcyBwZXIgc2Vjb25kKSAqL1xuICB0aHJvdHRsZVJhdGVMaW1pdDogbnVtYmVyO1xuICBcbiAgLyoqIFRocm90dGxlIGJ1cnN0IGxpbWl0ICovXG4gIHRocm90dGxlQnVyc3RMaW1pdDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdlYlNvY2tldCBjb25maWd1cmF0aW9uIGlucHV0IChmb3IgdXNlciBvdmVycmlkZXMpXG4gKi9cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEVudkNvbmZpZ0lucHV0ID0gUGFydGlhbDxXZWJTb2NrZXRFbnZDb25maWc+O1xuIl19
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VentureKit Configuration Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates configuration before it reaches infrastructure.
|
|
5
|
+
* Catches errors early with clear, actionable messages.
|
|
6
|
+
*/
|
|
7
|
+
import type { BaseConfig } from './types/base';
|
|
8
|
+
import type { SecurityConfig } from './types/security';
|
|
9
|
+
import type { EnvConfigInput, Environment } from './types/env';
|
|
10
|
+
/**
|
|
11
|
+
* Validation error
|
|
12
|
+
*/
|
|
13
|
+
export declare class ValidationError extends Error {
|
|
14
|
+
readonly field: string;
|
|
15
|
+
readonly message: string;
|
|
16
|
+
readonly value?: unknown | undefined;
|
|
17
|
+
constructor(field: string, message: string, value?: unknown | undefined);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Validation result
|
|
21
|
+
*/
|
|
22
|
+
export interface ValidationResult {
|
|
23
|
+
valid: boolean;
|
|
24
|
+
errors: ValidationError[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Validate base configuration
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateBaseConfig(config: BaseConfig): ValidationResult;
|
|
30
|
+
/**
|
|
31
|
+
* Validate security configuration
|
|
32
|
+
*/
|
|
33
|
+
export declare function validateSecurityConfig(config: SecurityConfig): ValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Validate environment configuration input
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateEnvConfigInput(env: Environment, config: EnvConfigInput): ValidationResult;
|
|
38
|
+
/**
|
|
39
|
+
* Assert validation passes, throw if not
|
|
40
|
+
*/
|
|
41
|
+
export declare function assertValid(result: ValidationResult): void;
|
package/dist/validate.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* VentureKit Configuration Validation
|
|
4
|
+
*
|
|
5
|
+
* Validates configuration before it reaches infrastructure.
|
|
6
|
+
* Catches errors early with clear, actionable messages.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ValidationError = void 0;
|
|
10
|
+
exports.validateBaseConfig = validateBaseConfig;
|
|
11
|
+
exports.validateSecurityConfig = validateSecurityConfig;
|
|
12
|
+
exports.validateEnvConfigInput = validateEnvConfigInput;
|
|
13
|
+
exports.assertValid = assertValid;
|
|
14
|
+
/**
|
|
15
|
+
* Validation error
|
|
16
|
+
*/
|
|
17
|
+
class ValidationError extends Error {
|
|
18
|
+
field;
|
|
19
|
+
message;
|
|
20
|
+
value;
|
|
21
|
+
constructor(field, message, value) {
|
|
22
|
+
super(`${field}: ${message}`);
|
|
23
|
+
this.field = field;
|
|
24
|
+
this.message = message;
|
|
25
|
+
this.value = value;
|
|
26
|
+
this.name = 'ValidationError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ValidationError = ValidationError;
|
|
30
|
+
/**
|
|
31
|
+
* Create a successful validation result
|
|
32
|
+
*/
|
|
33
|
+
function ok() {
|
|
34
|
+
return { valid: true, errors: [] };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a failed validation result
|
|
38
|
+
*/
|
|
39
|
+
function fail(errors) {
|
|
40
|
+
return { valid: false, errors };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Merge validation results
|
|
44
|
+
*/
|
|
45
|
+
function merge(...results) {
|
|
46
|
+
const errors = results.flatMap(r => r.errors);
|
|
47
|
+
return { valid: errors.length === 0, errors };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate base configuration
|
|
51
|
+
*/
|
|
52
|
+
function validateBaseConfig(config) {
|
|
53
|
+
const errors = [];
|
|
54
|
+
// Name validation
|
|
55
|
+
if (!config.name) {
|
|
56
|
+
errors.push(new ValidationError('name', 'Project name is required'));
|
|
57
|
+
}
|
|
58
|
+
else if (!/^[a-z][a-z0-9-]*$/.test(config.name)) {
|
|
59
|
+
errors.push(new ValidationError('name', 'Project name must start with lowercase letter and contain only lowercase letters, numbers, and hyphens', config.name));
|
|
60
|
+
}
|
|
61
|
+
else if (config.name.length > 32) {
|
|
62
|
+
errors.push(new ValidationError('name', 'Project name must be 32 characters or less', config.name));
|
|
63
|
+
}
|
|
64
|
+
// Display name
|
|
65
|
+
if (!config.displayName) {
|
|
66
|
+
errors.push(new ValidationError('displayName', 'Display name is required'));
|
|
67
|
+
}
|
|
68
|
+
// Region validation
|
|
69
|
+
if (!config.region) {
|
|
70
|
+
errors.push(new ValidationError('region', 'AWS region is required'));
|
|
71
|
+
}
|
|
72
|
+
else if (!/^[a-z]{2}-[a-z]+-\d$/.test(config.region)) {
|
|
73
|
+
errors.push(new ValidationError('region', 'Invalid AWS region format (e.g., eu-west-1)', config.region));
|
|
74
|
+
}
|
|
75
|
+
return errors.length > 0 ? fail(errors) : ok();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Validate security configuration
|
|
79
|
+
*/
|
|
80
|
+
function validateSecurityConfig(config) {
|
|
81
|
+
const errors = [];
|
|
82
|
+
// Scopes validation
|
|
83
|
+
if (!config.scopes || config.scopes.length === 0) {
|
|
84
|
+
errors.push(new ValidationError('scopes', 'At least one OAuth scope is required'));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
config.scopes.forEach((scope, i) => {
|
|
88
|
+
if (!scope.name) {
|
|
89
|
+
errors.push(new ValidationError(`scopes[${i}].name`, 'Scope name is required'));
|
|
90
|
+
}
|
|
91
|
+
else if (!/^[a-z][a-z0-9.]*$/.test(scope.name)) {
|
|
92
|
+
errors.push(new ValidationError(`scopes[${i}].name`, 'Scope name must be lowercase with dots (e.g., projects.read)', scope.name));
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// App clients validation
|
|
97
|
+
if (!config.appClients || config.appClients.length === 0) {
|
|
98
|
+
errors.push(new ValidationError('appClients', 'At least one app client is required'));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const scopeNames = new Set(config.scopes?.map(s => s.name) || []);
|
|
102
|
+
config.appClients.forEach((client, i) => {
|
|
103
|
+
if (!client.name) {
|
|
104
|
+
errors.push(new ValidationError(`appClients[${i}].name`, 'Client name is required'));
|
|
105
|
+
}
|
|
106
|
+
client.allowedScopes.forEach((scope, j) => {
|
|
107
|
+
if (!scopeNames.has(scope)) {
|
|
108
|
+
errors.push(new ValidationError(`appClients[${i}].allowedScopes[${j}]`, `Scope "${scope}" is not defined in scopes`, scope));
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return errors.length > 0 ? fail(errors) : ok();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Validate environment configuration input
|
|
117
|
+
*/
|
|
118
|
+
function validateEnvConfigInput(env, config) {
|
|
119
|
+
const errors = [];
|
|
120
|
+
// Lambda validation
|
|
121
|
+
if (config.lambda) {
|
|
122
|
+
if (config.lambda.memoryMb !== undefined) {
|
|
123
|
+
if (config.lambda.memoryMb < 128 || config.lambda.memoryMb > 10240) {
|
|
124
|
+
errors.push(new ValidationError(`${env}.lambda.memoryMb`, 'Lambda memory must be between 128 and 10240 MB', config.lambda.memoryMb));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (config.lambda.timeoutSec !== undefined) {
|
|
128
|
+
if (config.lambda.timeoutSec < 1 || config.lambda.timeoutSec > 900) {
|
|
129
|
+
errors.push(new ValidationError(`${env}.lambda.timeoutSec`, 'Lambda timeout must be between 1 and 900 seconds', config.lambda.timeoutSec));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// API validation
|
|
134
|
+
if (config.api) {
|
|
135
|
+
if (config.api.throttleRateLimit !== undefined && config.api.throttleRateLimit < 1) {
|
|
136
|
+
errors.push(new ValidationError(`${env}.api.throttleRateLimit`, 'API rate limit must be at least 1', config.api.throttleRateLimit));
|
|
137
|
+
}
|
|
138
|
+
if (config.api.throttleBurstLimit !== undefined && config.api.throttleBurstLimit < 1) {
|
|
139
|
+
errors.push(new ValidationError(`${env}.api.throttleBurstLimit`, 'API burst limit must be at least 1', config.api.throttleBurstLimit));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// VPC validation
|
|
143
|
+
if (config.vpc) {
|
|
144
|
+
if (config.vpc.maxAzs !== undefined && (config.vpc.maxAzs < 1 || config.vpc.maxAzs > 3)) {
|
|
145
|
+
errors.push(new ValidationError(`${env}.vpc.maxAzs`, 'VPC must have 1-3 availability zones', config.vpc.maxAzs));
|
|
146
|
+
}
|
|
147
|
+
if (config.vpc.natGateways !== undefined && config.vpc.natGateways < 0) {
|
|
148
|
+
errors.push(new ValidationError(`${env}.vpc.natGateways`, 'NAT gateways cannot be negative', config.vpc.natGateways));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return errors.length > 0 ? fail(errors) : ok();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Assert validation passes, throw if not
|
|
155
|
+
*/
|
|
156
|
+
function assertValid(result) {
|
|
157
|
+
if (!result.valid) {
|
|
158
|
+
const messages = result.errors.map(e => ` - ${e.field}: ${e.message}`).join('\n');
|
|
159
|
+
throw new Error(`Configuration validation failed:\n${messages}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFxREgsZ0RBcUNDO0FBS0Qsd0RBNENDO0FBS0Qsd0RBaUVDO0FBS0Qsa0NBS0M7QUFyTkQ7O0dBRUc7QUFDSCxNQUFhLGVBQWdCLFNBQVEsS0FBSztJQUV0QjtJQUNBO0lBQ0E7SUFIbEIsWUFDa0IsS0FBYSxFQUNiLE9BQWUsRUFDZixLQUFlO1FBRS9CLEtBQUssQ0FBQyxHQUFHLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBSmQsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixVQUFLLEdBQUwsS0FBSyxDQUFVO1FBRy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBVEQsMENBU0M7QUFVRDs7R0FFRztBQUNILFNBQVMsRUFBRTtJQUNULE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLElBQUksQ0FBQyxNQUF5QjtJQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLEtBQUssQ0FBQyxHQUFHLE9BQTJCO0lBQzNDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFrQjtJ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Q0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxNQUF3QjtJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWZW50dXJlS2l0IENvbmZpZ3VyYXRpb24gVmFsaWRhdGlvblxuICogXG4gKiBWYWxpZGF0ZXMgY29uZmlndXJhdGlvbiBiZWZvcmUgaXQgcmVhY2hlcyBpbmZyYXN0cnVjdHVyZS5cbiAqIENhdGNoZXMgZXJyb3JzIGVhcmx5IHdpdGggY2xlYXIsIGFjdGlvbmFibGUgbWVzc2FnZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29uZmlnIH0gZnJvbSAnLi90eXBlcy9iYXNlJztcbmltcG9ydCB0eXBlIHsgU2VjdXJpdHlDb25maWcsIE9BdXRoU2NvcGUsIEFwcENsaWVudCB9IGZyb20gJy4vdHlwZXMvc2VjdXJpdHknO1xuaW1wb3J0IHR5cGUgeyBFbnZDb25maWdJbnB1dCwgRW52aXJvbm1lbnQgfSBmcm9tICcuL3R5cGVzL2Vudic7XG5cbi8qKlxuICogVmFsaWRhdGlvbiBlcnJvclxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSB2YWx1ZT86IHVua25vd25cbiAgKSB7XG4gICAgc3VwZXIoYCR7ZmllbGR9OiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXN1bHQge1xuICB2YWxpZDogYm9vbGVhbjtcbiAgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzdWNjZXNzZnVsIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIG9rKCk6IFZhbGlkYXRpb25SZXN1bHQge1xuICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZhaWxlZCB2YWxpZGF0aW9uIHJlc3VsdFxuICovXG5mdW5jdGlvbiBmYWlsKGVycm9yczogVmFsaWRhdGlvbkVycm9yW10pOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBlcnJvcnMgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSB2YWxpZGF0aW9uIHJlc3VsdHNcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoLi4ucmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gIGNvbnN0IGVycm9ycyA9IHJlc3VsdHMuZmxhdE1hcChyID0+IHIuZXJyb3JzKTtcbiAgcmV0dXJuIHsgdmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsIGVycm9ycyB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGJhc2UgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVCYXNlQ29uZmlnKGNvbmZpZzogQmFzZUNvbmZpZyk6IFZhbGlkYXRpb25SZXN1bHQge1xuICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG5cbiAgLy8gTmFtZSB2YWxpZGF0aW9uXG4gIGlmICghY29uZmlnLm5hbWUpIHtcbiAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKCduYW1lJywgJ1Byb2plY3QgbmFtZSBpcyByZXF1aXJlZCcpKTtcbiAgfSBlbHNlIGlmICghL15bYS16XVthLXowLTktXSokLy50ZXN0KGNvbmZpZy5uYW1lKSkge1xuICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAnbmFtZScsXG4gICAgICAnUHJvamVjdCBuYW1lIG11c3Qgc3RhcnQgd2l0aCBsb3dlcmNhc2UgbGV0dGVyIGFuZCBjb250YWluIG9ubHkgbG93ZXJjYXNlIGxldHRlcnMsIG51bWJlcnMsIGFuZCBoeXBoZW5zJyxcbiAgICAgIGNvbmZpZy5uYW1lXG4gICAgKSk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLm5hbWUubGVuZ3RoID4gMzIpIHtcbiAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgJ25hbWUnLFxuICAgICAgJ1Byb2plY3QgbmFtZSBtdXN0IGJlIDMyIGNoYXJhY3RlcnMgb3IgbGVzcycsXG4gICAgICBjb25maWcubmFtZVxuICAgICkpO1xuICB9XG5cbiAgLy8gRGlzcGxheSBuYW1lXG4gIGlmICghY29uZmlnLmRpc3BsYXlOYW1lKSB7XG4gICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcignZGlzcGxheU5hbWUnLCAnRGlzcGxheSBuYW1lIGlzIHJlcXVpcmVkJykpO1xuICB9XG5cbiAgLy8gUmVnaW9uIHZhbGlkYXRpb25cbiAgaWYgKCFjb25maWcucmVnaW9uKSB7XG4gICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcigncmVnaW9uJywgJ0FXUyByZWdpb24gaXMgcmVxdWlyZWQnKSk7XG4gIH0gZWxzZSBpZiAoIS9eW2Etel17Mn0tW2Etel0rLVxcZCQvLnRlc3QoY29uZmlnLnJlZ2lvbikpIHtcbiAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgJ3JlZ2lvbicsXG4gICAgICAnSW52YWxpZCBBV1MgcmVnaW9uIGZvcm1hdCAoZS5nLiwgZXUtd2VzdC0xKScsXG4gICAgICBjb25maWcucmVnaW9uXG4gICAgKSk7XG4gIH1cblxuICByZXR1cm4gZXJyb3JzLmxlbmd0aCA+IDAgPyBmYWlsKGVycm9ycykgOiBvaygpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNlY3VyaXR5IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2VjdXJpdHlDb25maWcoY29uZmlnOiBTZWN1cml0eUNvbmZpZyk6IFZhbGlkYXRpb25SZXN1bHQge1xuICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG5cbiAgLy8gU2NvcGVzIHZhbGlkYXRpb25cbiAgaWYgKCFjb25maWcuc2NvcGVzIHx8IGNvbmZpZy5zY29wZXMubGVuZ3RoID09PSAwKSB7XG4gICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcignc2NvcGVzJywgJ0F0IGxlYXN0IG9uZSBPQXV0aCBzY29wZSBpcyByZXF1aXJlZCcpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcuc2NvcGVzLmZvckVhY2goKHNjb3BlLCBpKSA9PiB7XG4gICAgICBpZiAoIXNjb3BlLm5hbWUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgc2NvcGVzWyR7aX1dLm5hbWVgLCAnU2NvcGUgbmFtZSBpcyByZXF1aXJlZCcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIS9eW2Etel1bYS16MC05Ll0qJC8udGVzdChzY29wZS5uYW1lKSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGBzY29wZXNbJHtpfV0ubmFtZWAsXG4gICAgICAgICAgJ1Njb3BlIG5hbWUgbXVzdCBiZSBsb3dlcmNhc2Ugd2l0aCBkb3RzIChlLmcuLCBwcm9qZWN0cy5yZWFkKScsXG4gICAgICAgICAgc2NvcGUubmFtZVxuICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFwcCBjbGllbnRzIHZhbGlkYXRpb25cbiAgaWYgKCFjb25maWcuYXBwQ2xpZW50cyB8fCBjb25maWcuYXBwQ2xpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKCdhcHBDbGllbnRzJywgJ0F0IGxlYXN0IG9uZSBhcHAgY2xpZW50IGlzIHJlcXVpcmVkJykpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNjb3BlTmFtZXMgPSBuZXcgU2V0KGNvbmZpZy5zY29wZXM/Lm1hcChzID0+IHMubmFtZSkgfHwgW10pO1xuICAgIFxuICAgIGNvbmZpZy5hcHBDbGllbnRzLmZvckVhY2goKGNsaWVudCwgaSkgPT4ge1xuICAgICAgaWYgKCFjbGllbnQubmFtZSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGBhcHBDbGllbnRzWyR7aX1dLm5hbWVgLCAnQ2xpZW50IG5hbWUgaXMgcmVxdWlyZWQnKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNsaWVudC5hbGxvd2VkU2NvcGVzLmZvckVhY2goKHNjb3BlLCBqKSA9PiB7XG4gICAgICAgIGlmICghc2NvcGVOYW1lcy5oYXMoc2NvcGUpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGBhcHBDbGllbnRzWyR7aX1dLmFsbG93ZWRTY29wZXNbJHtqfV1gLFxuICAgICAgICAgICAgYFNjb3BlIFwiJHtzY29wZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBzY29wZXNgLFxuICAgICAgICAgICAgc2NvcGVcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZXJyb3JzLmxlbmd0aCA+IDAgPyBmYWlsKGVycm9ycykgOiBvaygpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gaW5wdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRW52Q29uZmlnSW5wdXQoZW52OiBFbnZpcm9ubWVudCwgY29uZmlnOiBFbnZDb25maWdJbnB1dCk6IFZhbGlkYXRpb25SZXN1bHQge1xuICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG5cbiAgLy8gTGFtYmRhIHZhbGlkYXRpb25cbiAgaWYgKGNvbmZpZy5sYW1iZGEpIHtcbiAgICBpZiAoY29uZmlnLmxhbWJkYS5tZW1vcnlNYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29uZmlnLmxhbWJkYS5tZW1vcnlNYiA8IDEyOCB8fCBjb25maWcubGFtYmRhLm1lbW9yeU1iID4gMTAyNDApIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBgJHtlbnZ9LmxhbWJkYS5tZW1vcnlNYmAsXG4gICAgICAgICAgJ0xhbWJkYSBtZW1vcnkgbXVzdCBiZSBiZXR3ZWVuIDEyOCBhbmQgMTAyNDAgTUInLFxuICAgICAgICAgIGNvbmZpZy5sYW1iZGEubWVtb3J5TWJcbiAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChjb25maWcubGFtYmRhLnRpbWVvdXRTZWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvbmZpZy5sYW1iZGEudGltZW91dFNlYyA8IDEgfHwgY29uZmlnLmxhbWJkYS50aW1lb3V0U2VjID4gOTAwKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYCR7ZW52fS5sYW1iZGEudGltZW91dFNlY2AsXG4gICAgICAgICAgJ0xhbWJkYSB0aW1lb3V0IG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5MDAgc2Vjb25kcycsXG4gICAgICAgICAgY29uZmlnLmxhbWJkYS50aW1lb3V0U2VjXG4gICAgICAgICkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFQSSB2YWxpZGF0aW9uXG4gIGlmIChjb25maWcuYXBpKSB7XG4gICAgaWYgKGNvbmZpZy5hcGkudGhyb3R0bGVSYXRlTGltaXQgIT09IHVuZGVmaW5lZCAmJiBjb25maWcuYXBpLnRocm90dGxlUmF0ZUxpbWl0IDwgMSkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYCR7ZW52fS5hcGkudGhyb3R0bGVSYXRlTGltaXRgLFxuICAgICAgICAnQVBJIHJhdGUgbGltaXQgbXVzdCBiZSBhdCBsZWFzdCAxJyxcbiAgICAgICAgY29uZmlnLmFwaS50aHJvdHRsZVJhdGVMaW1pdFxuICAgICAgKSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChjb25maWcuYXBpLnRocm90dGxlQnVyc3RMaW1pdCAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy5hcGkudGhyb3R0bGVCdXJzdExpbWl0IDwgMSkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYCR7ZW52fS5hcGkudGhyb3R0bGVCdXJzdExpbWl0YCxcbiAgICAgICAgJ0FQSSBidXJzdCBsaW1pdCBtdXN0IGJlIGF0IGxlYXN0IDEnLFxuICAgICAgICBjb25maWcuYXBpLnRocm90dGxlQnVyc3RMaW1pdFxuICAgICAgKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVlBDIHZhbGlkYXRpb25cbiAgaWYgKGNvbmZpZy52cGMpIHtcbiAgICBpZiAoY29uZmlnLnZwYy5tYXhBenMgIT09IHVuZGVmaW5lZCAmJiAoY29uZmlnLnZwYy5tYXhBenMgPCAxIHx8IGNvbmZpZy52cGMubWF4QXpzID4gMykpIHtcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGAke2Vudn0udnBjLm1heEF6c2AsXG4gICAgICAgICdWUEMgbXVzdCBoYXZlIDEtMyBhdmFpbGFiaWxpdHkgem9uZXMnLFxuICAgICAgICBjb25maWcudnBjLm1heEF6c1xuICAgICAgKSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChjb25maWcudnBjLm5hdEdhdGV3YXlzICE9PSB1bmRlZmluZWQgJiYgY29uZmlnLnZwYy5uYXRHYXRld2F5cyA8IDApIHtcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGAke2Vudn0udnBjLm5hdEdhdGV3YXlzYCxcbiAgICAgICAgJ05BVCBnYXRld2F5cyBjYW5ub3QgYmUgbmVnYXRpdmUnLFxuICAgICAgICBjb25maWcudnBjLm5hdEdhdGV3YXlzXG4gICAgICApKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyb3JzLmxlbmd0aCA+IDAgPyBmYWlsKGVycm9ycykgOiBvaygpO1xufVxuXG4vKipcbiAqIEFzc2VydCB2YWxpZGF0aW9uIHBhc3NlcywgdGhyb3cgaWYgbm90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRWYWxpZChyZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHQpOiB2b2lkIHtcbiAgaWYgKCFyZXN1bHQudmFsaWQpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHJlc3VsdC5lcnJvcnMubWFwKGUgPT4gYCAgLSAke2UuZmllbGR9OiAke2UubWVzc2FnZX1gKS5qb2luKCdcXG4nKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQ6XFxuJHttZXNzYWdlc31gKTtcbiAgfVxufVxuIl19
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@venturekit/core",
|
|
3
|
+
"version": "0.0.0-dev.20260307234057",
|
|
4
|
+
"description": "VentureKit core types, presets, and configuration resolution.",
|
|
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/core"
|
|
14
|
+
},
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"registry": "https://registry.npmjs.org",
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"venturekit",
|
|
21
|
+
"saas",
|
|
22
|
+
"config"
|
|
23
|
+
],
|
|
24
|
+
"license": "Apache-2.0",
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.3.0"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"dev": "tsc --watch",
|
|
31
|
+
"clean": "rm -rf dist"
|
|
32
|
+
}
|
|
33
|
+
}
|