@arcis/node 1.1.0 → 1.3.0

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.
Files changed (50) hide show
  1. package/README.md +156 -211
  2. package/dist/core/index.d.mts +4 -4
  3. package/dist/core/index.d.ts +4 -4
  4. package/dist/core/index.js +13 -2
  5. package/dist/core/index.js.map +1 -1
  6. package/dist/core/index.mjs +13 -2
  7. package/dist/core/index.mjs.map +1 -1
  8. package/dist/{headers-DBQedhrb.d.mts → encode-CrQCGlBq.d.mts} +202 -2
  9. package/dist/{headers-BJq2OA0i.d.ts → encode-jl9sOwmA.d.ts} +202 -2
  10. package/dist/{index-BvcFpoR3.d.ts → index-BAhgn9V2.d.ts} +96 -2
  11. package/dist/{index-iCOw8Fcg.d.ts → index-BGNKspqH.d.ts} +1 -1
  12. package/dist/{index-CslcoZUN.d.mts → index-Cd02z-0j.d.mts} +1 -1
  13. package/dist/{index-CCcPuTBo.d.mts → index-DgJtWMSj.d.mts} +96 -2
  14. package/dist/index.d.mts +4 -4
  15. package/dist/index.d.ts +4 -4
  16. package/dist/index.js +647 -7
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +629 -9
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/logging/index.d.mts +1 -1
  21. package/dist/logging/index.d.ts +1 -1
  22. package/dist/logging/index.js +12 -1
  23. package/dist/logging/index.js.map +1 -1
  24. package/dist/logging/index.mjs +12 -1
  25. package/dist/logging/index.mjs.map +1 -1
  26. package/dist/middleware/index.d.mts +2 -2
  27. package/dist/middleware/index.d.ts +2 -2
  28. package/dist/middleware/index.js +168 -6
  29. package/dist/middleware/index.js.map +1 -1
  30. package/dist/middleware/index.mjs +165 -7
  31. package/dist/middleware/index.mjs.map +1 -1
  32. package/dist/sanitizers/index.d.mts +2 -2
  33. package/dist/sanitizers/index.d.ts +2 -2
  34. package/dist/sanitizers/index.js +403 -3
  35. package/dist/sanitizers/index.js.map +1 -1
  36. package/dist/sanitizers/index.mjs +388 -4
  37. package/dist/sanitizers/index.mjs.map +1 -1
  38. package/dist/stores/index.d.mts +1 -1
  39. package/dist/stores/index.d.ts +1 -1
  40. package/dist/stores/index.js.map +1 -1
  41. package/dist/stores/index.mjs.map +1 -1
  42. package/dist/{types-BOdL3ZWo.d.mts → types-BOkx5YJc.d.mts} +17 -2
  43. package/dist/{types-BOdL3ZWo.d.ts → types-BOkx5YJc.d.ts} +17 -2
  44. package/dist/validation/index.d.mts +2 -2
  45. package/dist/validation/index.d.ts +2 -2
  46. package/dist/validation/index.js +105 -3
  47. package/dist/validation/index.js.map +1 -1
  48. package/dist/validation/index.mjs +105 -3
  49. package/dist/validation/index.mjs.map +1 -1
  50. package/package.json +114 -114
@@ -1,5 +1,5 @@
1
1
  import { RequestHandler } from 'express';
2
- import { n as ValidationSchema } from './types-BOdL3ZWo.mjs';
2
+ import { n as ValidationSchema } from './types-BOkx5YJc.mjs';
3
3
 
4
4
  /**
5
5
  * @module @arcis/node/validation/schema
@@ -1,4 +1,4 @@
1
- import { b as ArcisOptions, o as ArcisMiddlewareStack, A as ArcisFunction, e as RateLimitOptions, h as RateLimiterMiddleware, H as HeaderOptions, E as ErrorHandlerOptions } from './types-BOdL3ZWo.mjs';
1
+ import { b as ArcisOptions, o as ArcisMiddlewareStack, A as ArcisFunction, e as RateLimitOptions, h as RateLimiterMiddleware, H as HeaderOptions, E as ErrorHandlerOptions } from './types-BOkx5YJc.mjs';
2
2
  import { RequestHandler, Request, Response, NextFunction } from 'express';
3
3
 
4
4
  /**
@@ -435,4 +435,98 @@ declare function detectBot(req: Request): BotDetectionResult;
435
435
  */
436
436
  declare function botProtection(options?: BotProtectionOptions): RequestHandler;
437
437
 
438
- export { type BotCategory as B, type CorsOptions as C, type SecureCookieOptions as S, type TokenBucketMiddleware as T, type BotDetectionResult as a, type BotProtectionOptions as b, type SlidingWindowMiddleware as c, type SlidingWindowOptions as d, type TokenBucketOptions as e, arcis as f, arcisWithMethods as g, botProtection as h, createCors as i, createErrorHandler as j, createHeaders as k, createRateLimiter as l, createSecureCookies as m, createSlidingWindowLimiter as n, createTokenBucketLimiter as o, detectBot as p, enforceSecureCookie as q, errorHandler as r, rateLimit as s, safeCors as t, secureCookieDefaults as u, securityHeaders as v };
438
+ /**
439
+ * @module @arcis/node/middleware/csrf
440
+ * CSRF (Cross-Site Request Forgery) protection middleware
441
+ *
442
+ * Implements the double-submit cookie pattern:
443
+ * 1. Server sets a CSRF token in a cookie
444
+ * 2. Client must send the same token in a header or form field
445
+ * 3. Middleware rejects requests where cookie token !== header/field token
446
+ *
447
+ * This works because an attacker's cross-origin form submission will include
448
+ * the cookie automatically, but cannot read it (same-origin policy) to set
449
+ * the matching header.
450
+ */
451
+
452
+ /** CSRF protection configuration */
453
+ interface CsrfOptions {
454
+ /** Cookie name for the CSRF token. Default: '_csrf' */
455
+ cookieName?: string;
456
+ /** Header name to check for the token. Default: 'x-csrf-token' */
457
+ headerName?: string;
458
+ /** Form field name to check for the token. Default: '_csrf' */
459
+ fieldName?: string;
460
+ /** Token byte length (hex-encoded = 2x chars). Default: 32 */
461
+ tokenLength?: number;
462
+ /** HTTP methods to protect. Default: ['POST', 'PUT', 'PATCH', 'DELETE'] */
463
+ protectedMethods?: string[];
464
+ /** Paths to exclude from CSRF checks (e.g., webhook endpoints) */
465
+ excludePaths?: string[];
466
+ /** Cookie options */
467
+ cookie?: {
468
+ /** Cookie path. Default: '/' */
469
+ path?: string;
470
+ /** HttpOnly — set false so client JS can read it for headers. Default: false */
471
+ httpOnly?: boolean;
472
+ /** Secure flag (HTTPS only). Default: true in production */
473
+ secure?: boolean;
474
+ /** SameSite attribute. Default: 'Lax' */
475
+ sameSite?: 'Strict' | 'Lax' | 'None';
476
+ /** Cookie domain */
477
+ domain?: string;
478
+ };
479
+ /** Custom error handler when CSRF validation fails */
480
+ onError?: (req: Request, res: Response, next: NextFunction) => void;
481
+ }
482
+ /**
483
+ * Generate a cryptographically random CSRF token.
484
+ *
485
+ * @param length - Byte length (output is hex, so 2x chars). Default: 32
486
+ * @returns Hex-encoded random token
487
+ *
488
+ * @example
489
+ * const token = generateCsrfToken(); // 64 hex chars
490
+ */
491
+ declare function generateCsrfToken(length?: number): string;
492
+ /**
493
+ * Validate that two CSRF tokens match using constant-time comparison.
494
+ *
495
+ * @param cookieToken - Token from the cookie
496
+ * @param requestToken - Token from the header or form field
497
+ * @returns true if tokens match
498
+ */
499
+ declare function validateCsrfToken(cookieToken: string, requestToken: string): boolean;
500
+ /**
501
+ * Create CSRF protection middleware using double-submit cookie pattern.
502
+ *
503
+ * For safe methods (GET, HEAD, OPTIONS), sets a CSRF token cookie if not present.
504
+ * For unsafe methods (POST, PUT, PATCH, DELETE), validates the token.
505
+ *
506
+ * @param options - CSRF configuration
507
+ * @returns Express middleware
508
+ *
509
+ * @example
510
+ * // Basic usage
511
+ * app.use(csrfProtection());
512
+ *
513
+ * @example
514
+ * // Exclude webhook paths
515
+ * app.use(csrfProtection({
516
+ * excludePaths: ['/api/webhooks/stripe', '/api/webhooks/github']
517
+ * }));
518
+ *
519
+ * @example
520
+ * // Client-side: read cookie + set header
521
+ * const token = document.cookie.match(/_csrf=([^;]+)/)?.[1];
522
+ * fetch('/api/data', {
523
+ * method: 'POST',
524
+ * headers: { 'X-CSRF-Token': token },
525
+ * credentials: 'same-origin'
526
+ * });
527
+ */
528
+ declare function csrfProtection(options?: CsrfOptions): RequestHandler;
529
+ /** Alias for csrfProtection */
530
+ declare const createCsrf: typeof csrfProtection;
531
+
532
+ export { validateCsrfToken as A, type BotCategory as B, type CorsOptions as C, type SecureCookieOptions as S, type TokenBucketMiddleware as T, type BotDetectionResult as a, type BotProtectionOptions as b, type CsrfOptions as c, type SlidingWindowMiddleware as d, type SlidingWindowOptions as e, type TokenBucketOptions as f, arcis as g, arcisWithMethods as h, botProtection as i, createCors as j, createCsrf as k, createErrorHandler as l, createHeaders as m, createRateLimiter as n, createSecureCookies as o, createSlidingWindowLimiter as p, createTokenBucketLimiter as q, csrfProtection as r, detectBot as s, enforceSecureCookie as t, errorHandler as u, generateCsrfToken as v, rateLimit as w, safeCors as x, secureCookieDefaults as y, securityHeaders as z };
package/dist/index.d.mts CHANGED
@@ -1,10 +1,10 @@
1
- export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, S as SecureCookieOptions, c as SlidingWindowMiddleware, d as SlidingWindowOptions, T as TokenBucketMiddleware, e as TokenBucketOptions, f as arcis, g as arcisFunction, h as botProtection, i as createCors, j as createErrorHandler, k as createHeaders, l as createRateLimiter, m as createSecureCookies, n as createSlidingWindowLimiter, o as createTokenBucketLimiter, g as default, p as detectBot, q as enforceSecureCookie, r as errorHandler, s as rateLimit, t as safeCors, u as secureCookieDefaults, v as securityHeaders } from './index-CCcPuTBo.mjs';
2
- export { c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as detectNoSqlInjection, e as detectPathTraversal, f as detectPrototypePollution, g as detectSql, h as detectXss, k as isDangerousNoSqlKey, l as isDangerousProtoKey, s as sanitizeCommand, m as sanitizeHeaderValue, n as sanitizeHeaders, o as sanitizeObject, p as sanitizePath, q as sanitizeSql, r as sanitizeString, t as sanitizeXss } from './headers-DBQedhrb.mjs';
3
- export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-CslcoZUN.mjs';
1
+ export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, c as CsrfOptions, S as SecureCookieOptions, d as SlidingWindowMiddleware, e as SlidingWindowOptions, T as TokenBucketMiddleware, f as TokenBucketOptions, g as arcis, h as arcisFunction, i as botProtection, j as createCors, k as createCsrf, l as createErrorHandler, m as createHeaders, n as createRateLimiter, o as createSecureCookies, p as createSlidingWindowLimiter, q as createTokenBucketLimiter, r as csrfProtection, h as default, s as detectBot, t as enforceSecureCookie, u as errorHandler, v as generateCsrfToken, w as rateLimit, x as safeCors, y as secureCookieDefaults, z as securityHeaders, A as validateCsrfToken } from './index-DgJtWMSj.mjs';
2
+ export { P as PiiMatch, K as PiiRedactOptions, L as PiiScanOptions, M as PiiType, c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as detectJsonpInjection, e as detectNoSqlInjection, f as detectPathTraversal, g as detectPii, h as detectPrototypePollution, i as detectSql, j as detectSsti, k as detectXss, l as detectXxe, m as encodeForAttribute, n as encodeForCss, o as encodeForHtml, p as encodeForJs, q as encodeForUrl, t as isDangerousNoSqlKey, u as isDangerousProtoKey, v as redactObjectPii, w as redactPii, x as sanitizeCommand, y as sanitizeHeaderValue, z as sanitizeHeaders, A as sanitizeJsonpCallback, B as sanitizeObject, C as sanitizePath, D as sanitizeSql, E as sanitizeSsti, F as sanitizeString, G as sanitizeXss, H as sanitizeXxe, I as scanObjectPii, J as scanPii } from './encode-CrQCGlBq.mjs';
3
+ export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-Cd02z-0j.mjs';
4
4
  import { IncomingMessage } from 'http';
5
5
  export { createRedactor, createSafeLogger, safeLog } from './logging/index.mjs';
6
6
  export { MemoryStore, RedisClientLike, RedisStore, RedisStoreOptions, createRedisStore } from './stores/index.mjs';
7
- export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-BOdL3ZWo.mjs';
7
+ export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-BOkx5YJc.mjs';
8
8
  export { ArcisError, ArcisValidationError, BLOCKED, ERRORS, HEADERS, INPUT, InputTooLargeError, RATE_LIMIT, REDACTION, RateLimitError, SanitizationError, SecurityThreatError, VALIDATION } from './core/index.mjs';
9
9
  import 'express';
10
10
 
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, S as SecureCookieOptions, c as SlidingWindowMiddleware, d as SlidingWindowOptions, T as TokenBucketMiddleware, e as TokenBucketOptions, f as arcis, g as arcisFunction, h as botProtection, i as createCors, j as createErrorHandler, k as createHeaders, l as createRateLimiter, m as createSecureCookies, n as createSlidingWindowLimiter, o as createTokenBucketLimiter, g as default, p as detectBot, q as enforceSecureCookie, r as errorHandler, s as rateLimit, t as safeCors, u as secureCookieDefaults, v as securityHeaders } from './index-BvcFpoR3.js';
2
- export { c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as detectNoSqlInjection, e as detectPathTraversal, f as detectPrototypePollution, g as detectSql, h as detectXss, k as isDangerousNoSqlKey, l as isDangerousProtoKey, s as sanitizeCommand, m as sanitizeHeaderValue, n as sanitizeHeaders, o as sanitizeObject, p as sanitizePath, q as sanitizeSql, r as sanitizeString, t as sanitizeXss } from './headers-BJq2OA0i.js';
3
- export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-iCOw8Fcg.js';
1
+ export { B as BotCategory, a as BotDetectionResult, b as BotProtectionOptions, C as CorsOptions, c as CsrfOptions, S as SecureCookieOptions, d as SlidingWindowMiddleware, e as SlidingWindowOptions, T as TokenBucketMiddleware, f as TokenBucketOptions, g as arcis, h as arcisFunction, i as botProtection, j as createCors, k as createCsrf, l as createErrorHandler, m as createHeaders, n as createRateLimiter, o as createSecureCookies, p as createSlidingWindowLimiter, q as createTokenBucketLimiter, r as csrfProtection, h as default, s as detectBot, t as enforceSecureCookie, u as errorHandler, v as generateCsrfToken, w as rateLimit, x as safeCors, y as secureCookieDefaults, z as securityHeaders, A as validateCsrfToken } from './index-BAhgn9V2.js';
2
+ export { P as PiiMatch, K as PiiRedactOptions, L as PiiScanOptions, M as PiiType, c as createSanitizer, d as detectCommandInjection, a as detectHeaderInjection, b as detectJsonpInjection, e as detectNoSqlInjection, f as detectPathTraversal, g as detectPii, h as detectPrototypePollution, i as detectSql, j as detectSsti, k as detectXss, l as detectXxe, m as encodeForAttribute, n as encodeForCss, o as encodeForHtml, p as encodeForJs, q as encodeForUrl, t as isDangerousNoSqlKey, u as isDangerousProtoKey, v as redactObjectPii, w as redactPii, x as sanitizeCommand, y as sanitizeHeaderValue, z as sanitizeHeaders, A as sanitizeJsonpCallback, B as sanitizeObject, C as sanitizePath, D as sanitizeSql, E as sanitizeSsti, F as sanitizeString, G as sanitizeXss, H as sanitizeXxe, I as scanObjectPii, J as scanPii } from './encode-jl9sOwmA.js';
3
+ export { E as EmailValidationOptions, a as EmailValidationResult, F as FileInput, V as ValidateFileOptions, b as ValidateFileResult, c as ValidateRedirectOptions, d as ValidateRedirectResult, e as ValidateUrlOptions, f as ValidateUrlResult, g as createValidator, i as isDangerousExtension, h as isRedirectSafe, j as isUrlSafe, k as isValidEmailSyntax, s as sanitizeFilename, v as validate, l as validateEmail, m as validateFile, n as validateRedirect, o as validateUrl, p as verifyEmailMx } from './index-BGNKspqH.js';
4
4
  import { IncomingMessage } from 'http';
5
5
  export { createRedactor, createSafeLogger, safeLog } from './logging/index.js';
6
6
  export { MemoryStore, RedisClientLike, RedisStore, RedisStoreOptions, createRedisStore } from './stores/index.js';
7
- export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-BOdL3ZWo.js';
7
+ export { A as ArcisFunction, a as ArcisMiddleware, b as ArcisOptions, E as ErrorHandlerOptions, F as FieldValidator, H as HeaderOptions, c as HstsOptions, d as HttpError, L as LogOptions, R as RateLimitEntry, e as RateLimitOptions, f as RateLimitResult, g as RateLimitStore, h as RateLimiterMiddleware, S as SafeLogger, i as SanitizeOptions, j as SanitizeResult, T as ThreatInfo, k as ThreatType, V as ValidationConfig, l as ValidationError, m as ValidationResult, n as ValidationSchema } from './types-BOkx5YJc.js';
8
8
  export { ArcisError, ArcisValidationError, BLOCKED, ERRORS, HEADERS, INPUT, InputTooLargeError, RATE_LIMIT, REDACTION, RateLimitError, SanitizationError, SecurityThreatError, VALIDATION } from './core/index.js';
9
9
  import 'express';
10
10