@scallywag/validation 1.0.0 → 1.0.4

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/dist/env.d.ts ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Environment Variable Validation & Security
3
+ *
4
+ * Comprehensive environment validation with security scanning
5
+ *
6
+ * ESLint override is applied to this file because:
7
+ * 1. This IS the security layer for environment variable validation
8
+ * 2. Dynamic environment access is required to scan for security issues
9
+ * 3. This module centralizes and secures environment validation for the entire application
10
+ * 4. Alternative approaches would eliminate the security scanning benefits
11
+ */
12
+ /**
13
+ * Scan environment variables for security issues
14
+ */
15
+ export declare function scanEnvironmentSecurity(): {
16
+ warnings: string[];
17
+ errors: string[];
18
+ recommendations: string[];
19
+ };
20
+ /**
21
+ * Process validation results with security scan
22
+ * Extracted for better testability
23
+ */
24
+ export declare function processValidationResult(validatedEnv: unknown, securityScan: ReturnType<typeof scanEnvironmentSecurity>): {
25
+ success: boolean;
26
+ data?: unknown;
27
+ errors?: string[];
28
+ securityScan: ReturnType<typeof scanEnvironmentSecurity>;
29
+ };
30
+ /**
31
+ * Process validation error and return formatted result
32
+ * Extracted for better testability
33
+ */
34
+ export declare function processValidationError(error: unknown, securityScan: ReturnType<typeof scanEnvironmentSecurity>): {
35
+ success: boolean;
36
+ errors: string[];
37
+ securityScan: ReturnType<typeof scanEnvironmentSecurity>;
38
+ };
39
+ /**
40
+ * Validate environment variables based on current NODE_ENV
41
+ */
42
+ export declare function validateEnvironment(): {
43
+ success: boolean;
44
+ data?: unknown;
45
+ errors?: string[];
46
+ securityScan: ReturnType<typeof scanEnvironmentSecurity>;
47
+ };
48
+ /**
49
+ * Log environment validation results
50
+ */
51
+ export declare function logEnvironmentValidation(result: ReturnType<typeof validateEnvironment>): void;
52
+ /**
53
+ * Initialize and validate environment on startup
54
+ */
55
+ export declare function initializeEnvironment(): boolean;
56
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoKH;;GAEG;AACH,wBAAgB,uBAAuB,IAAI;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAkCA;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,GACvD;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CAC1D,CAeA;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,GACvD;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CAC1D,CAQA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;CAC1D,CA2BA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,GAC7C,IAAI,CAsBN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAa/C"}
package/dist/env.js ADDED
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Environment Variable Validation & Security
3
+ *
4
+ * Comprehensive environment validation with security scanning
5
+ *
6
+ * ESLint override is applied to this file because:
7
+ * 1. This IS the security layer for environment variable validation
8
+ * 2. Dynamic environment access is required to scan for security issues
9
+ * 3. This module centralizes and secures environment validation for the entire application
10
+ * 4. Alternative approaches would eliminate the security scanning benefits
11
+ */
12
+ /* eslint-disable security/detect-object-injection */
13
+ import { z } from 'zod';
14
+ import { logger } from '../security/logger';
15
+ import { validateEnv } from './validators';
16
+ // Security-focused environment schema
17
+ const baseEnvSchema = z.object({
18
+ NODE_ENV: z
19
+ .enum(['development', 'test', 'production'])
20
+ .default('development'),
21
+ // Next.js specific
22
+ NEXT_PUBLIC_APP_VERSION: z.string().default('0.1.0'),
23
+ NEXT_PUBLIC_NODE_ENV: z.string().optional(),
24
+ // Database (production required)
25
+ DATABASE_URL: z.string().url().optional(),
26
+ // Security keys (production required)
27
+ JWT_SECRET: z.string().min(32).optional(),
28
+ ENCRYPTION_KEY: z.string().min(32).optional(),
29
+ // External services
30
+ REDIS_URL: z.string().url().optional(),
31
+ API_KEY: z.string().optional(),
32
+ // Development only
33
+ DEBUG: z.boolean().optional().default(false),
34
+ // CI/CD
35
+ CI: z.boolean().optional().default(false),
36
+ GITHUB_ACTIONS: z.boolean().optional().default(false),
37
+ });
38
+ // Production-specific stricter schema
39
+ const productionEnvSchema = baseEnvSchema.extend({
40
+ DATABASE_URL: z.string().url('Database URL is required in production'),
41
+ JWT_SECRET: z
42
+ .string()
43
+ .min(32, 'JWT secret must be at least 32 characters in production'),
44
+ DEBUG: z.literal(false).default(false),
45
+ });
46
+ // Development-specific schema
47
+ const developmentEnvSchema = baseEnvSchema.extend({
48
+ DEBUG: z.boolean().optional().default(true),
49
+ });
50
+ /**
51
+ * Pre-compiled security patterns for performance and security
52
+ */
53
+ const COMPILED_SECURITY_PATTERNS = {
54
+ potentialSecrets: [
55
+ /secret/i,
56
+ /password/i,
57
+ /pass/i,
58
+ /pwd/i,
59
+ /key/i,
60
+ /token/i,
61
+ /auth/i,
62
+ /api/i,
63
+ /private/i,
64
+ /credential/i,
65
+ ],
66
+ suspiciousValues: [
67
+ /test/i,
68
+ /dev/i,
69
+ /development/i,
70
+ /default/i,
71
+ /example/i,
72
+ /sample/i,
73
+ /demo/i,
74
+ /temp/i,
75
+ /placeholder/i,
76
+ ],
77
+ urlWithSecrets: [
78
+ /\/\/[^@]*:[^@]*@/,
79
+ /[?&]password=/i,
80
+ /[?&]secret=/i,
81
+ /[?&]token=/i,
82
+ /[?&]key=/i,
83
+ ],
84
+ };
85
+ /**
86
+ * Safe environment variable access
87
+ */
88
+ function getEnvVariable(key) {
89
+ // Use Object.prototype.hasOwnProperty for safer property access
90
+ if (!Object.prototype.hasOwnProperty.call(process.env, key)) {
91
+ return undefined;
92
+ }
93
+ return process.env[key];
94
+ }
95
+ /**
96
+ * Check if variable name matches security patterns
97
+ */
98
+ function isSecuritySensitiveVariable(key) {
99
+ return COMPILED_SECURITY_PATTERNS.potentialSecrets.some((pattern) => pattern.test(key));
100
+ }
101
+ /**
102
+ * Validate weak secret values
103
+ */
104
+ function validateSecretStrength(key, value, warnings) {
105
+ if (typeof value !== 'string')
106
+ return;
107
+ const normalizedValue = value.toLowerCase();
108
+ const weakSecrets = [
109
+ 'secret',
110
+ 'password',
111
+ 'dev',
112
+ 'development',
113
+ 'test',
114
+ 'default',
115
+ '123456',
116
+ 'admin',
117
+ 'root',
118
+ ];
119
+ if (weakSecrets.some((weak) => normalizedValue.includes(weak))) {
120
+ warnings.push(`Potentially weak secret detected in ${key}: appears to be a default/weak value`);
121
+ }
122
+ if (value.length < 16) {
123
+ warnings.push(`Short secret detected in ${key}: ${value.length} characters (recommend 32+)`);
124
+ }
125
+ }
126
+ /**
127
+ * Check production environment requirements
128
+ */
129
+ function validateProductionRequirements(isProduction, _warnings, errors) {
130
+ if (!isProduction)
131
+ return;
132
+ const requiredProdVars = ['DATABASE_URL', 'JWT_SECRET'];
133
+ for (const varName of requiredProdVars) {
134
+ const value = getEnvVariable(varName);
135
+ if (!value) {
136
+ errors.push(`Missing required production environment variable: ${varName}`);
137
+ }
138
+ }
139
+ }
140
+ /**
141
+ * Scan environment variables for security issues
142
+ */
143
+ export function scanEnvironmentSecurity() {
144
+ const warnings = [];
145
+ const errors = [];
146
+ const recommendations = [];
147
+ const env = process.env;
148
+ const isProduction = env['NODE_ENV'] === 'production';
149
+ // Check production requirements
150
+ validateProductionRequirements(isProduction, warnings, errors);
151
+ // Check for potential secrets with weak values
152
+ for (const [key, value] of Object.entries(env)) {
153
+ if (!value)
154
+ continue;
155
+ if (isSecuritySensitiveVariable(key)) {
156
+ validateSecretStrength(key, value, warnings);
157
+ }
158
+ }
159
+ // Add general recommendations
160
+ if (!isProduction) {
161
+ recommendations.push('Consider using .env.local for development secrets to avoid committing them');
162
+ }
163
+ recommendations.push('Regularly rotate secrets and API keys', 'Use strong, unique values for all secret environment variables', 'Consider using a dedicated secret management service for production');
164
+ return { warnings, errors, recommendations };
165
+ }
166
+ /**
167
+ * Process validation results with security scan
168
+ * Extracted for better testability
169
+ */
170
+ export function processValidationResult(validatedEnv, securityScan) {
171
+ // Fail if there are security errors
172
+ if (securityScan.errors.length > 0) {
173
+ return {
174
+ success: false,
175
+ errors: securityScan.errors,
176
+ securityScan,
177
+ };
178
+ }
179
+ return {
180
+ success: true,
181
+ data: validatedEnv,
182
+ securityScan,
183
+ };
184
+ }
185
+ /**
186
+ * Process validation error and return formatted result
187
+ * Extracted for better testability
188
+ */
189
+ export function processValidationError(error, securityScan) {
190
+ return {
191
+ success: false,
192
+ errors: [
193
+ error instanceof Error ? error.message : 'Environment validation failed',
194
+ ],
195
+ securityScan,
196
+ };
197
+ }
198
+ /**
199
+ * Validate environment variables based on current NODE_ENV
200
+ */
201
+ export function validateEnvironment() {
202
+ const nodeEnv = process.env['NODE_ENV'] || 'development';
203
+ const securityScan = scanEnvironmentSecurity();
204
+ let schema;
205
+ switch (nodeEnv) {
206
+ case 'production':
207
+ schema = productionEnvSchema;
208
+ break;
209
+ case 'development':
210
+ schema = developmentEnvSchema;
211
+ break;
212
+ case 'test':
213
+ schema = baseEnvSchema;
214
+ break;
215
+ default:
216
+ schema = baseEnvSchema;
217
+ }
218
+ try {
219
+ const validatedEnv = validateEnv(schema);
220
+ return processValidationResult(validatedEnv, securityScan);
221
+ }
222
+ catch (error) {
223
+ return processValidationError(error, securityScan);
224
+ }
225
+ }
226
+ /**
227
+ * Log environment validation results
228
+ */
229
+ export function logEnvironmentValidation(result) {
230
+ const { success, errors, securityScan } = result;
231
+ const { warnings, errors: secErrors, recommendations } = securityScan;
232
+ if (success) {
233
+ logger.info('Environment validation passed');
234
+ }
235
+ else {
236
+ logger.error('Environment validation failed', { errors });
237
+ }
238
+ // Log security scan results
239
+ if (secErrors.length > 0) {
240
+ logger.error('Security Errors found', { errors: secErrors });
241
+ }
242
+ if (warnings.length > 0) {
243
+ logger.warn('Security Warnings found', { warnings });
244
+ }
245
+ if (recommendations.length > 0) {
246
+ logger.info('Security Recommendations', { recommendations });
247
+ }
248
+ }
249
+ /**
250
+ * Initialize and validate environment on startup
251
+ */
252
+ export function initializeEnvironment() {
253
+ const result = validateEnvironment();
254
+ logEnvironmentValidation(result);
255
+ // Exit process if validation fails
256
+ if (!result.success) {
257
+ logger.error('Application startup failed due to environment validation errors');
258
+ process.exit(1);
259
+ }
260
+ return true;
261
+ }
262
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Validation Framework - Core Exports
3
+ *
4
+ * This module provides a comprehensive validation framework using Zod
5
+ * for the Fractal Gateway Architecture
6
+ */
7
+ export * from './middleware';
8
+ export * from './schemas';
9
+ export * from './types';
10
+ export * from './validators';
11
+ export * from './wrappers';
12
+ export * from './zod-schema-converter';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Validation Framework - Core Exports
3
+ *
4
+ * This module provides a comprehensive validation framework using Zod
5
+ * for the Fractal Gateway Architecture
6
+ */
7
+ export * from './middleware';
8
+ export * from './schemas';
9
+ export * from './types';
10
+ export * from './validators';
11
+ export * from './wrappers';
12
+ export * from './zod-schema-converter';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Validation Middleware
3
+ *
4
+ * Next.js API route validation middleware using Zod
5
+ */
6
+ import { NextRequest, NextResponse } from 'next/server';
7
+ import { EndpointValidation, FractalValidationContext, SecurityLevel } from './types';
8
+ /**
9
+ * Helper function to safely extract validated data from result
10
+ * Extracted for better testability
11
+ */
12
+ export declare function safeExtractValidatedData(result: unknown): Record<string, unknown>;
13
+ /**
14
+ * Create validation middleware for API routes
15
+ *
16
+ * Supports two validation modes:
17
+ * 1. Unified input validation (config.input): Merges body, query, and params
18
+ * into a single validated object. Preferred for new endpoints.
19
+ * 2. Legacy validation (config.body/query/headers): Validates each part
20
+ * separately. Maintained for backwards compatibility.
21
+ */
22
+ export declare function createValidationMiddleware(config: EndpointValidation): (request: NextRequest, _context?: FractalValidationContext, params?: Record<string, string>) => Promise<NextResponse<{
23
+ success: boolean;
24
+ error: string;
25
+ details: Record<string, string[]>;
26
+ timestamp: string;
27
+ }> | NextResponse<{
28
+ success: boolean;
29
+ error: string;
30
+ details: {
31
+ server: string[];
32
+ };
33
+ timestamp: string;
34
+ }> | {
35
+ validatedData: Record<string, unknown>;
36
+ }>;
37
+ /**
38
+ * Validation decorator for API route handlers
39
+ *
40
+ * Supports unified input validation when config.input is provided.
41
+ * Extracts route params from the context argument automatically.
42
+ */
43
+ export declare function validateRoute(config: EndpointValidation): (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) => PropertyDescriptor;
44
+ /**
45
+ * Higher-order function to wrap API route with validation
46
+ *
47
+ * Supports unified input validation when config.input is provided.
48
+ * Extracts route params from Next.js context automatically.
49
+ */
50
+ export declare function withValidation(config: EndpointValidation, handler: (request: NextRequest, validatedData: Record<string, unknown>, context?: unknown) => Promise<NextResponse>): (request: NextRequest, context?: unknown) => Promise<NextResponse<unknown>>;
51
+ /**
52
+ * Security-focused validation middleware
53
+ */
54
+ export declare function createSecurityMiddleware(securityLevel?: SecurityLevel): (request: NextRequest) => NextResponse<{
55
+ success: boolean;
56
+ error: string;
57
+ timestamp: string;
58
+ }> | null;
59
+ /**
60
+ * Rate limiting middleware
61
+ *
62
+ * Uses standardized gateway MemoryRateLimitStore for consistent rate limiting across the application.
63
+ * This maintains backward compatibility with the existing Next.js API route middleware pattern
64
+ * while using the standardized gateway rate limiting infrastructure.
65
+ */
66
+ export declare function createRateLimitMiddleware(requests?: number, windowMs?: number): (request: NextRequest) => NextResponse | null;
67
+ /**
68
+ * Combine multiple middleware functions
69
+ */
70
+ export declare function combineMiddleware(...middlewares: Array<(request: NextRequest) => NextResponse | null>): (request: NextRequest) => NextResponse<unknown> | null;
71
+ /**
72
+ * Create comprehensive API middleware
73
+ *
74
+ * Supports unified input validation when options.validation.input is provided.
75
+ * Accepts optional context for extracting route params.
76
+ */
77
+ export declare function createApiMiddleware(options: {
78
+ validation?: EndpointValidation;
79
+ security?: SecurityLevel;
80
+ rateLimit?: {
81
+ requests: number;
82
+ windowMs: number;
83
+ };
84
+ }): (request: NextRequest, handler: (request: NextRequest, validatedData?: Record<string, unknown>) => Promise<NextResponse>, context?: unknown) => Promise<NextResponse<unknown>>;
85
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,aAAa,EAEd,MAAM,SAAS,CAAC;AAYjB;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,OAAO,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AA0HD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,IAEjE,SAAS,WAAW,EACpB,WAAW,wBAAwB,EACnC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;;;;;;;;;;;GAsElC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,IAEpD,SAAS,OAAO,EAChB,cAAc,MAAM,EACpB,YAAY,kBAAkB,wBA2BjC;AAsCD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,CACP,OAAO,EAAE,WAAW,EACpB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO,CAAC,EAAE,OAAO,KACd,OAAO,CAAC,YAAY,CAAC,IAEH,SAAS,WAAW,EAAE,UAAU,OAAO,oCAc/D;AAkDD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,GAAE,aAAoC,IAElC,SAAS,WAAW;;;;UAyBtC;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,GAAE,MAAY,EACtB,QAAQ,GAAE,MAAc,IAgBP,SAAS,WAAW,KAAG,YAAY,GAAG,IAAI,CAoC5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,WAAW,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,WAAW,KAAK,YAAY,GAAG,IAAI,CAAC,IAEnD,SAAS,WAAW,kCAStC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,IAqBG,SAAS,WAAW,EACpB,SAAS,CACP,OAAO,EAAE,WAAW,EACpB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACpC,OAAO,CAAC,YAAY,CAAC,EAC1B,UAAU,OAAO,oCA8BpB"}