@scallywag/validation 1.0.0 → 1.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.bak +1372 -0
- package/dist/env.d.ts +56 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +262 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +85 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +403 -0
- package/dist/middleware.js.map +1 -0
- package/dist/sanitization.d.ts +41 -0
- package/dist/sanitization.d.ts.map +1 -0
- package/dist/sanitization.js +111 -0
- package/dist/sanitization.js.map +1 -0
- package/dist/schemas.d.ts +231 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +245 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/validators.d.ts +111 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +324 -0
- package/dist/validators.js.map +1 -0
- package/dist/wrappers.d.ts +117 -0
- package/dist/wrappers.d.ts.map +1 -0
- package/dist/wrappers.js +184 -0
- package/dist/wrappers.js.map +1 -0
- package/dist/zod-schema-converter.d.ts +80 -0
- package/dist/zod-schema-converter.d.ts.map +1 -0
- package/dist/zod-schema-converter.js +97 -0
- package/dist/zod-schema-converter.js.map +1 -0
- package/package.json +36 -1
- package/index.js +0 -1
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
|
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../env.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
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.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"}
|