exisjs 0.9.1 → 0.9.2

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 (58) hide show
  1. package/dist/config/config.d.ts.map +1 -1
  2. package/dist/config/config.js +2 -1
  3. package/dist/config/config.js.map +1 -1
  4. package/dist/config/types.d.ts +5 -0
  5. package/dist/config/types.d.ts.map +1 -1
  6. package/dist/docs/content/config.mdx +3 -1
  7. package/dist/docs/content/validation.mdx +33 -11
  8. package/dist/docs/reference/config.mdx +1 -0
  9. package/dist/docs/reference/sanitize.mdx +129 -134
  10. package/dist/docs/reference/validator.mdx +8 -3
  11. package/dist/router/route-scanner.d.ts +12 -4
  12. package/dist/router/route-scanner.d.ts.map +1 -1
  13. package/dist/router/route-scanner.js +46 -31
  14. package/dist/router/route-scanner.js.map +1 -1
  15. package/dist/sanitize/index.d.ts +29 -3
  16. package/dist/sanitize/index.d.ts.map +1 -1
  17. package/dist/sanitize/index.js +91 -32
  18. package/dist/sanitize/index.js.map +1 -1
  19. package/dist/server/adapters/bun-adapter.d.ts +1 -1
  20. package/dist/server/adapters/bun-adapter.d.ts.map +1 -1
  21. package/dist/server/adapters/bun-adapter.js.map +1 -1
  22. package/dist/server/bootstrapper.d.ts.map +1 -1
  23. package/dist/server/bootstrapper.js +1 -1
  24. package/dist/server/bootstrapper.js.map +1 -1
  25. package/dist/validator/builder.d.ts +12 -1
  26. package/dist/validator/builder.d.ts.map +1 -1
  27. package/dist/validator/builder.js +63 -24
  28. package/dist/validator/builder.js.map +1 -1
  29. package/dist/validator/compile.d.ts +7 -2
  30. package/dist/validator/compile.d.ts.map +1 -1
  31. package/dist/validator/compile.js +85 -54
  32. package/dist/validator/compile.js.map +1 -1
  33. package/dist/validator/engine.d.ts +58 -7
  34. package/dist/validator/engine.d.ts.map +1 -1
  35. package/dist/validator/engine.js +432 -525
  36. package/dist/validator/engine.js.map +1 -1
  37. package/dist/validator/error.d.ts.map +1 -1
  38. package/dist/validator/error.js +7 -0
  39. package/dist/validator/error.js.map +1 -1
  40. package/dist/validator/rules.d.ts +66 -7
  41. package/dist/validator/rules.d.ts.map +1 -1
  42. package/dist/validator/rules.js +435 -109
  43. package/dist/validator/rules.js.map +1 -1
  44. package/dist/validator/tex-types.d.ts +15 -0
  45. package/dist/validator/tex-types.d.ts.map +1 -1
  46. package/dist/validator/tex-types.js +127 -64
  47. package/dist/validator/tex-types.js.map +1 -1
  48. package/dist/validator/text.d.ts +2 -0
  49. package/dist/validator/text.d.ts.map +1 -1
  50. package/dist/validator/text.js +31 -13
  51. package/dist/validator/text.js.map +1 -1
  52. package/dist/validator/types.d.ts +15 -0
  53. package/dist/validator/types.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/sanitize/sanitize.d.ts +0 -33
  56. package/dist/sanitize/sanitize.d.ts.map +0 -1
  57. package/dist/sanitize/sanitize.js +0 -104
  58. package/dist/sanitize/sanitize.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAO1C,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAID,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,QAAQ,CAAC,UAAU,CAAC,EAClB,KAAK,GACL,OAAO,GACP,OAAO,GACP,KAAK,GACL,mBAAmB,GACnB,aAAa,GACb,uBAAuB,GACvB,eAAe,GACf,QAAQ,CACX,GAAG;IACF,GAAG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,GAAG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACvB,iBAAiB,CAAC,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAA;IACnD,WAAW,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,qBAAqB,CAAC,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAA;IAC3D,aAAa,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,CAAA;IAC3C,MAAM,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,cAkD3B,CAAA;AAID,wBAAgB,WAAW,CACzB,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,UAAU,GACnB,cAAc,CAyChB;AAWD,wBAAsB,UAAU,CAC9B,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,cAAc,CAAC,CA0FzB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAO1C,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAID,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,QAAQ,CAAC,UAAU,CAAC,EAClB,KAAK,GACL,OAAO,GACP,OAAO,GACP,KAAK,GACL,mBAAmB,GACnB,aAAa,GACb,uBAAuB,GACvB,eAAe,GACf,QAAQ,CACX,GAAG;IACF,GAAG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,GAAG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IACvB,iBAAiB,CAAC,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAA;IACnD,WAAW,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACvC,qBAAqB,CAAC,EAAE,UAAU,CAAC,uBAAuB,CAAC,CAAA;IAC3D,aAAa,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,CAAA;IAC3C,MAAM,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;CAC9B,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,cAmD3B,CAAA;AAID,wBAAgB,WAAW,CACzB,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,UAAU,GACnB,cAAc,CAyChB;AAWD,wBAAsB,UAAU,CAC9B,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,cAAc,CAAC,CA0FzB"}
@@ -50,7 +50,8 @@ exports.defaultConfig = {
50
50
  helmet: { enabled: true },
51
51
  trustProxy: false,
52
52
  bodyLimit: 10 * 1024 * 1024,
53
- env: process.env.NODE_ENV ?? 'development',
53
+ // Only an explicit NODE_ENV=development exposes error details; `exisjs dev` sets it
54
+ env: process.env.NODE_ENV ?? 'production',
54
55
  compression: false,
55
56
  keepAlive: false,
56
57
  server: 'auto', // Auto-detect backend
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":";;;;;;AAOA,oCAEC;AAkFD,kCA4CC;AAWD,gCA4FC;AA7OD,0DAA4B;AAC5B,sDAAwB;AACxB,sCAAkC;AAElC,iFAAiF;AAEjF,SAAgB,YAAY,CAAC,MAAkB;IAC7C,OAAO,MAAM,CAAA;AACf,CAAC;AA2BY,QAAA,aAAa,GAAmB;IAC3C,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,SAAS;IAEf,KAAK,EAAE,IAAI;IACX,YAAY,EAAE,KAAK;IACnB,IAAI,EAAE,KAAK;IACX,SAAS,EAAE;QACT,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,SAAS;KACpB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,UAAU;KACjB;IACD,WAAW,EAAE;QACX,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,EAAE;KACX;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,0BAA0B;QACjC,OAAO,EAAE,OAAO;QAChB,WAAW,EACT,gEAAgE;KACnE;IACD,OAAO,EAAE,SAAgB;IACzB,IAAI,EAAE;QACJ,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;KAC9D;IACD,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;IACzB,UAAU,EAAE,KAAK;IACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;IAC3B,oFAAoF;IACpF,GAAG,EAAG,OAAO,CAAC,GAAG,CAAC,QAA8B,IAAI,YAAY;IAChE,WAAW,EAAE,KAAK;IAClB,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,MAAyC,EAAE,sBAAsB;IAEzE,IAAI,EAAE,SAAgB;IACtB,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;IACvB,YAAY,EAAE,KAAK;IACnB,YAAY,EAAE,KAAK;IACnB,iBAAiB,EAAE,KAAK;CACzB,CAAA;AAED,iFAAiF;AAEjF,SAAgB,WAAW,CACzB,IAAoB,EACpB,QAAoB;IAEpB,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAA;IAE1B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAyB,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QACzB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,eAAM,CAAC,IAAI,CACT,wBAAwB,GAAG,0CAA0C,CACtE,CACA;YAAC,MAAkC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACnD,CAAC;aAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YACzB,wCAAwC;YACxC,CAAC;YAAC,MAAkC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACnD,CAAC;aAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC1E,MAAM,OAAO,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAA;YACtD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACpD,CAAC;gBAAC,MAAkC,CAAC,GAAG,CAAC,GAAG;oBAC1C,GAAI,OAAkB;oBACtB,GAAI,GAAc;iBACnB,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,CAAC;gBAAC,MAAkC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;YACjD,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,oEAAoE;YACpE,sEAAsE;YACtE,YAAY;YACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;YAChE,MAAM,CAAC,OAAO,GAAG;gBACf,GAAG,QAAQ;gBACX,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;aAC5C,CAAA;QACH,CAAC;aAAM,CAAC;YACN,CAAC;YAAC,MAAkC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;QACjD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI;QACT,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAE7E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,8EAA8E;AAC9E,8EAA8E;AAC9E,uCAAwC;AACxC,mDAI4B;AAErB,KAAK,UAAU,UAAU,CAC9B,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;IACpD,MAAM,UAAU,GAAG,MAAM;QACvB,CAAC,CAAC;YACE,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC;YACnD,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,CAAC;YACxC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC;YAChC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC;SACjC;QACH,CAAC,CAAC;YACE,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC;YAChC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC;YAChC,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC;YACnD,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,CAAC;SACzC,CAAA;IAEL,KAAK,UAAU,UAAU,CAAC,CAAS;QACjC,IAAI,CAAC;YACH,MAAM,iBAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,sFAAsF;gBACtF,MAAM,aAAa,GAAG,IAAI,QAAQ,CAChC,WAAW,EACX,0BAA0B,CAC3B,CAAA;gBACD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,IAAA,wBAAa,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAA;gBAC9D,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAA;gBACxC,IAAI,UAAsB,CAAA;gBAE1B,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;oBACxC,MAAM,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;wBAC7B,CAAC,CAAC,sBAAU;wBACZ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;4BACrC,CAAC,CAAC,mCAAuB;4BACzB,CAAC,CAAC,oCAAwB,CAAA;oBAChC,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,EAAE,aAAa,EAAb,qBAAa,EAAE,CAAC,CAAA;gBAC5D,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,aAAa,CAAA;gBAC5B,CAAC;gBAED,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBAC1D,eAAM,CAAC,IAAI,CACT,2DAA2D,CAC5D,CAAA;oBACD,OAAO,qBAAa,CAAA;gBACtB,CAAC;gBAED,OAAO,WAAW,CAAC,qBAAa,EAAE,UAAU,CAAC,CAAA;YAC/C,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,EAAE,IAAI,KAAK,6CAA6C,EAAE,CAAC;oBAChE,IAAI,CAAC;wBACH,iEAAiE;wBACjE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;wBAC9B,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAA;wBACxC,IAAI,UAAsB,CAAA;wBAE1B,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;4BACxC,MAAM,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;gCAC7B,CAAC,CAAC,sBAAU;gCACZ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;oCACrC,CAAC,CAAC,mCAAuB;oCACzB,CAAC,CAAC,oCAAwB,CAAA;4BAChC,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,EAAE,aAAa,EAAb,qBAAa,EAAE,CAAC,CAAA;wBAC5D,CAAC;6BAAM,CAAC;4BACN,UAAU,GAAG,aAAa,CAAA;wBAC5B,CAAC;wBACD,OAAO,WAAW,CAAC,qBAAa,EAAE,UAAU,CAAC,CAAA;oBAC/C,CAAC;oBAAC,MAAM,CAAC;wBACP,sDAAsD;oBACxD,CAAC;gBACH,CAAC;gBACD,eAAM,CAAC,IAAI,CACT,EAAE,GAAG,EAAE,SAAS,EAAE,EAClB,8BAA8B,SAAS,EAAE,CAC1C,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,qBAAa,CAAA;AACtB,CAAC"}
@@ -97,6 +97,11 @@ export interface DevConfig {
97
97
  extensions?: string[];
98
98
  /** Debounce interval in milliseconds before reloading the server */
99
99
  debounceMs?: number;
100
+ /**
101
+ * Load each route file on its first request (default `true`). Set to `false`
102
+ * to load every route at startup, as `exisjs start` does.
103
+ */
104
+ lazyRoutes?: boolean;
100
105
  }
101
106
  export interface ExisConfig {
102
107
  port?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -152,6 +152,7 @@ export default defineConfig({
152
152
  | `errors` | `{ legacyFields?: boolean }` | `{}` | `legacyFields: true` adds the pre-0.9 duplicate fields to error bodies. Deprecated. |
153
153
  | `compression` | `boolean` | `false` | Gzip/Brotli HTTP response compression. |
154
154
  | `bodyLimit` | `number` | `10485760` (10MB) | Maximum request payload body size in bytes. |
155
+ | `env` | `'development' \| 'production' \| 'test'` | `NODE_ENV`, else `'production'` | Only `development` sends error messages and stack traces to clients and loads routes lazily. `exisjs dev` sets it; a server started with plain `node` or `tsx` and no `NODE_ENV` runs as production. |
155
156
  | `blockSuspiciousProbes` | `boolean \| BlockProbesOptions` | `false` | Blocks known vulnerability scanners and malicious probes (`.php`, `wp-admin`). |
156
157
  | `etag` | `boolean` | `false` | Weak ETags on successful GET/HEAD responses, with `304 Not Modified` for a matching `If-None-Match`. See [Caching & Conditional Requests](/docs/responses#caching--conditional-requests-etag-304-412). |
157
158
  | `transformResponse` | `boolean \| Function` | `false` | Standardizes handler response payload envelopes. |
@@ -200,7 +201,8 @@ export default defineConfig({
200
201
 
201
202
  dev: {
202
203
  usePolling: false, // Set to true for network mounts or WSL
203
- interval: 100
204
+ interval: 100,
205
+ lazyRoutes: true // false loads every route at startup, as in production
204
206
  }
205
207
  })
206
208
  ```
@@ -45,15 +45,16 @@ ExisJS provides type-safe primitives that accept modifier options and configurat
45
45
 
46
46
  | Primitive | Signature | Description |
47
47
  | :--- | :--- | :--- |
48
- | `tex.string()` | `tex.string(options?)` | Validates strings. Supports `{ min, max, trim, toLowerCase, toUpperCase, collapseWhitespace, escapeHtml, stripHtml, slugify, mask, preventSql, preventTraversal, coerce, default }`. |
49
- | `tex.number()` | `tex.number(options?)` | Validates numbers. Supports `{ min, max, coerce, default }`. |
50
- | `tex.boolean()` | `tex.boolean(options?)` | Validates booleans. Supports `{ coerce, default }`. Coerces `"true"`, `"false"`, `"1"`, `"0"`. |
48
+ | `tex.string()` | `tex.string(options?)` | Validates strings. Supports `{ min, max, length, pattern, trim, toLowerCase, toUpperCase, collapseWhitespace, escapeHtml, stripHtml, slugify, mask, preventSql, preventTraversal, coerce, default }`. `pattern` is a `RegExp` checked after trimming and case changes. |
49
+ | `tex.number()` | `tex.number(options?)` | Validates finite numbers. Supports `{ int, min, max, coerce, default }`; `int: true` accepts whole numbers only. |
50
+ | `tex.boolean()` | `tex.boolean(options?)` | Validates booleans. Supports `{ coerce, default }`. Coerces `"true"`, `"false"`, `"1"`, `"0"` (any case, surrounding spaces ignored) and `1` / `0`. |
51
51
  | `tex.email()` | `tex.email(options?)` | Validates RFC-compliant email formatting. Supports `{ trim, toLowerCase, mask, default }`. |
52
+ | `tex.url()` | `tex.url(options?)` | Validates absolute URLs. Only `http` and `https` unless `{ protocols: ['https'] }` says otherwise, so `javascript:` links are rejected. Supports `{ trim, min, max, pattern, default }`. |
52
53
  | `tex.uuid()` | `tex.uuid(options?)` | Validates UUID strings. Supports `{ version: 1 \| 4, default }`. |
53
54
  | `tex.cuid()` | `tex.cuid(options?)` | Validates CUID identifiers. Supports `{ default }`. |
54
55
  | `tex.password()` | `tex.password(options?)` | Validates password complexity. Supports `{ min, max, requireNumbers, requireSymbols, requireUppercase, requireLowercase }`. |
55
56
  | `tex.creditCard()` | `tex.creditCard(options?)` | Validates credit card numbers using the Luhn algorithm. Supports `{ mask: true }`. |
56
- | `tex.date()` | `tex.date(options?)` | Validates JavaScript `Date` instances or ISO strings with `{ coerce: true, minDate, maxDate, default }`. |
57
+ | `tex.date()` | `tex.date(options?)` | Validates a `Date`, a date string or a timestamp, with `{ coerce, minDate, maxDate, default }`. An unparsable value is rejected, and the parsed value is always a `Date` (`coerce` is accepted but no longer needed). |
57
58
  | `tex.array()` | `tex.array(schema, options?)` | Validates arrays of items. Accepts primitive schemas, `tex.object(...)`, or shorthand `{ ... }`. Supports `{ min, max, dedupe, coerce, default }`. |
58
59
  | `tex.enum()` | `tex.enum(values, options?)` | Validates against an allowed list of string literals. Supports `{ default }`. |
59
60
  | `tex.literal()` | `tex.literal(value, options?)` | Validates against an exact primitive value (`string \| number \| boolean`). |
@@ -78,7 +79,7 @@ All primitive builders accept modifier options directly in their configuration a
78
79
  | **Optional** | `{ optional: true }` | `.optional()` | Allows `undefined`. |
79
80
  | **Nullable** | `{ nullable: true }` | `.nullable()` | Allows `null`. |
80
81
  | **Nullish** | `{ nullish: true }` | `.nullish()` | Allows both `null` and `undefined`. |
81
- | **Default** | `{ default: value \| () => value }` | N/A | Used when the field is missing. A client may omit the field, and after parsing it always has a value. |
82
+ | **Default** | `{ default: value \| () => value }` | `.default(value)` | Used when the field is missing (or blank, for a form field). A client may omit the field, and after parsing it always has a value. Object and array defaults are copied, so parses never share them. |
82
83
 
83
84
  ```typescript filename="example.ts"
84
85
  import { tex } from 'exisjs/validator'
@@ -92,6 +93,8 @@ const Schema = tex.object({
92
93
  })
93
94
  ```
94
95
 
96
+ Every method returns a new schema, so a field schema can be shared between objects: `Name.optional()` in one object does not make `Name` optional anywhere else. `parse()` never modifies the object it is given; it returns a new one.
97
+
95
98
  Nested object schemas take the same modifiers as methods: `.optional()`, `.nullable()` and `.nullish()`. A plain object literal is also a nested object:
96
99
 
97
100
  ```typescript filename="src/http/leads/schema.ts"
@@ -314,20 +317,27 @@ export function sanitizeTitle(input: string): string {
314
317
  | Category | Function | Description |
315
318
  | :--- | :--- | :--- |
316
319
  | **Security** | `sanitize.escapeHtml(val)` | Escapes HTML entities (`&`, `<`, `>`, `"`, `'`). |
317
- | **Security** | `sanitize.stripHtml(val)` | Removes HTML tags and element markup. |
318
- | **Security** | `sanitize.preventSql(val)` | Neutralizes common SQL injection sequences. |
319
- | **Security** | `sanitize.preventTraversal(val)` | Strips directory traversal sequences (`../`, `..\\`). |
320
- | **Masking** | `sanitize.maskEmail(val)` | Masks email local-parts (e.g. `u***r@example.com`). |
320
+ | **Security** | `sanitize.stripHtml(val)` | Removes tags, comments, and `<script>` / `<style>` elements with their content. |
321
+ | **Security** | `sanitize.stripControlChars(val)` | Removes invisible control characters and bidirectional overrides. |
322
+ | **Security** | `sanitize.preventSql(val)` | Rejects common SQL injection probes (the field fails validation). |
323
+ | **Security** | `sanitize.preventTraversal(val)` | Rejects `..` path segments, also percent-encoded, and NUL bytes. |
324
+ | **Masking** | `sanitize.maskEmail(val)` | Masks email local-parts (e.g. `us***@example.com`). |
321
325
  | **Masking** | `sanitize.maskString(val)` | Masks characters leaving only boundary characters visible. |
322
326
  | **Formatting** | `sanitize.trim(val)` | Trims leading and trailing whitespace. |
323
327
  | **Formatting** | `sanitize.toLowerCase(val)` | Converts string to lowercase. |
324
328
  | **Formatting** | `sanitize.toUpperCase(val)` | Converts string to uppercase. |
325
329
  | **Formatting** | `sanitize.collapseWhitespace(val)` | Replaces consecutive whitespace with a single space. |
326
330
  | **Formatting** | `sanitize.slugify(val)` | Converts string into URL-friendly slug format. |
327
- | **Formatting** | `sanitize.truncate(length)(val)` | Truncates string to specified maximum length. |
331
+ | **Formatting** | `sanitize.normalizeEmail(val)` | Trims and lowercases an email address. |
332
+ | **Formatting** | `sanitize.truncate(length)(val)` | Truncates to `length` characters without splitting an emoji. |
333
+ | **Numbers** | `sanitize.round(decimals)(val)`, `sanitize.clamp(min, max)(val)` | Rounds; limits to a range. |
328
334
  | **Arrays & Objects** | `sanitize.dedupe(array)` | Removes duplicate elements using a `Set`. |
329
335
  | **Arrays & Objects** | `sanitize.compact(array)` | Removes `null`, `undefined`, and empty string values. |
330
- | **Arrays & Objects** | `sanitize.omit(keys)(obj)` | Omits specified keys from an object. |
336
+ | **Arrays & Objects** | `sanitize.trimElements(array)`, `sanitize.limitLength(n)(array)` | Trims string items; keeps the first `n` items. |
337
+ | **Arrays & Objects** | `sanitize.pick(keys)(obj)`, `sanitize.omit(keys)(obj)` | Keeps or removes keys (`pick` ignores inherited keys). |
338
+ | **Arrays & Objects** | `sanitize.deepTrim(value)` | Trims every string in a nested object or array. |
339
+
340
+ Sanitizers run before the field's type check. One that throws, such as `preventSql`, fails that field with a `400` (code `SANITIZATION_FAILED`) instead of crashing the request.
331
341
 
332
342
  ---
333
343
 
@@ -353,6 +363,16 @@ export const RegisterSchema = tex.object({
353
363
  })
354
364
  ```
355
365
 
366
+ A field's `.refine()` and `.sanitize()` run wherever the field is: in nested objects, array items and record values too. An object's `.refine(fn, { message, path })` runs once all its fields are valid and reports the error on `path`. `parseAsync()` (used for route validation) also runs `.refineAsync()` rules at every depth.
367
+
368
+ To handle failures without `try` / `catch`, use `safeParse()`:
369
+
370
+ ```typescript
371
+ const result = RegisterSchema.safeParse(input)
372
+ if (!result.success) return { errors: result.errors } // [{ path, message, code, ... }]
373
+ const user = result.data
374
+ ```
375
+
356
376
  ---
357
377
 
358
378
  ## Discriminated Unions (`tex.discriminatedUnion`)
@@ -646,6 +666,8 @@ When incoming requests fail validation, ExisJS returns an HTTP `400 Bad Request`
646
666
  }
647
667
  ```
648
668
 
669
+ Every failing value is listed: each bad item of an array, each bad field of a nested object, up to 100 entries. Common `code` values: `MISSING_REQUIRED_FIELD`, `INVALID_TYPE`, `VALUE_TOO_SMALL`, `VALUE_TOO_LARGE`, `INVALID_LENGTH`, `INVALID_FORMAT` (pattern), `INVALID_EMAIL`, `INVALID_URL`, `INVALID_ENUM_VALUE`, `INVALID_DATE`, `DATE_TOO_EARLY`, `DATE_TOO_LATE`, `ARRAY_TOO_SHORT`, `ARRAY_TOO_LONG`, `UNRECOGNIZED_KEYS` (strict mode), `CUSTOM_VALIDATION` (`refine`), `SANITIZATION_FAILED`.
670
+
649
671
  In development mode (`NODE_ENV=development`), ExisJS also outputs a tabular summary of the failed validation constraints to the terminal.
650
672
 
651
673
  ---
@@ -299,6 +299,7 @@ export interface DevConfig {
299
299
  binaryInterval?: number
300
300
  extensions?: string[]
301
301
  debounceMs?: number
302
+ lazyRoutes?: boolean // default true: load each route file on its first request
302
303
  }
303
304
  ```
304
305
 
@@ -1,134 +1,129 @@
1
- ---
2
- title: "exisjs/sanitize"
3
- description: "API Reference for ExisJS data sanitization engine: string cleaners, safeSanitize, and object transformers."
4
- nextUrl: "/docs/reference/swagger"
5
- nextTitle: "Swagger Reference"
6
- ---
7
-
8
- # `exisjs/sanitize`
9
-
10
- The `exisjs/sanitize` module provides pure data sanitization functions for cleaning and normalizing input strings, numbers, dates, arrays, and complex objects before business logic execution. It includes security transforms for XSS escaping, HTML stripping, and basic SQL injection and path traversal probe detection.
11
-
12
- ---
13
-
14
- ## Module Exports
15
-
16
- ```typescript
17
- import { sanitize } from 'exisjs/sanitize'
18
- ```
19
-
20
- ---
21
-
22
- ## 1. Security Sanitizers
23
-
24
- The SQL and path traversal checks reject common probe strings; they complement, and never replace, parameterized queries and resolved-path checks.
25
-
26
- | Function | Signature | Description |
27
- | :--- | :--- | :--- |
28
- | `sanitize.escapeHtml` | `(val: string) => string` | Escapes `&`, `<`, `>`, `"`, and `'` into HTML entity equivalents. |
29
- | `sanitize.stripHtml` | `(val: string) => string` | Strips all HTML tags and markup characters from the string. |
30
- | `sanitize.preventSql` | `(val: string) => string` | Neutralizes common SQL injection sequences and comment tokens. |
31
- | `sanitize.preventTraversal` | `(val: string) => string` | Strips directory traversal sequences (`../`, `..\\`, null bytes). |
32
- | `sanitize.maskEmail` | `(val: string) => string` | Obfuscates email addresses (e.g., `al***@example.com`). |
33
- | `sanitize.maskString` | `(val: string) => string` | Masks sensitive string segments for logging or auditing. |
34
-
35
- ---
36
-
37
- ## 2. Text & String Sanitizers
38
-
39
- | Function | Signature | Description |
40
- | :--- | :--- | :--- |
41
- | `sanitize.trim` | `(val: string) => string` | Strips leading and trailing whitespace. |
42
- | `sanitize.toLowerCase` | `(val: string) => string` | Converts all characters to lowercase. |
43
- | `sanitize.toUpperCase` | `(val: string) => string` | Converts all characters to uppercase. |
44
- | `sanitize.collapseWhitespace`| `(val: string) => string` | Collapses consecutive whitespace, tabs, and newlines into a single space. |
45
- | `sanitize.normalizeUnicode` | `(val: string) => string` | Normalizes Unicode characters to Canonical Decomposition followed by Canonical Composition (NFC). |
46
- | `sanitize.slugify` | `(val: string) => string` | Converts strings into clean URL-friendly slugs (`"Hello World!"` $\to$ `"hello-world"`). |
47
- | `sanitize.truncate(length)` | `(length: number) => (val: string) => string` | Truncates strings exceeding the specified maximum length. |
48
- | `sanitize.removeNonAlphanumeric` | `(val: string) => string` | Strips all characters except standard ASCII letters and numbers. |
49
- | `sanitize.normalizeLineEndings` | `(val: string) => string` | Converts Windows CRLF (`\r\n`) to POSIX LF (`\n`). |
50
-
51
- ---
52
-
53
- ## 3. Numbers & Dates
54
-
55
- ### Number Transforms
56
-
57
- | Function | Signature | Description |
58
- | :--- | :--- | :--- |
59
- | `sanitize.round` | `(val: number) => number` | Rounds a float to the nearest integer. |
60
- | `sanitize.clamp(min, max)` | `(min: number, max: number) => (val: number) => number` | Constrains numeric input to fall within `[min, max]`. |
61
- | `sanitize.defaultIfNaN(fallback)` | `(fallback: number) => (val: number) => number` | Returns the fallback number if input evaluates to `NaN`. |
62
-
63
- ### Date Transforms
64
-
65
- | Function | Signature | Description |
66
- | :--- | :--- | :--- |
67
- | `sanitize.normalizeToIsoString` | `(val: Date) => string` | Formats a Date object into an ISO 8601 string representation. |
68
- | `sanitize.stripTime` | `(val: Date) => Date` | Resets hours, minutes, seconds, and milliseconds to `00:00:00.000`. |
69
-
70
- ---
71
-
72
- ## 4. Arrays & Complex Objects
73
-
74
- ### Array Transforms
75
-
76
- | Function | Signature | Description |
77
- | :--- | :--- | :--- |
78
- | `sanitize.dedupe` | `<T>(val: T[]) => T[]` | Removes duplicate values preserving first-seen ordering. |
79
- | `sanitize.compact` | `<T>(val: T[]) => T[]` | Removes `null`, `undefined`, and empty strings (`""`). |
80
- | `sanitize.trimElements` | `(val: string[]) => string[]` | Trims whitespace from all string elements in an array. |
81
- | `sanitize.limitLength(n)` | `<T>(length: number) => (val: T[]) => T[]` | Slices an array to at most `length` elements. |
82
-
83
- ### Object Transforms
84
-
85
- | Function | Signature | Description |
86
- | :--- | :--- | :--- |
87
- | `sanitize.stripUnknownKeys(keys)` | `<T>(allowedKeys: (keyof T)[]) => (val: T) => T` | Strips unlisted properties from an object. |
88
- | `sanitize.deepTrimStringValues` | `<T>(val: T) => T` | Recursively walks an object graph and trims all nested string properties. |
89
- | `sanitize.omit(keys)` | `<T, K extends keyof T>(keys: K[]) => (val: T) => Omit<T, K>` | Removes specified keys from an object. |
90
- | `sanitize.pick(keys)` | `<T, K extends keyof T>(keys: K[]) => (val: T) => Pick<T, K>` | Returns an object containing only the specified keys. |
91
-
92
- ---
93
-
94
- ## 5. Integration with TexEngine Validation
95
-
96
- Sanitizers integrate with `tex` validator chains using the `.sanitize()` modifier. Sanitization occurs **before** rule validation checks:
97
-
98
- ```typescript filename="src/http/articles/schema.ts"
99
- import { tex } from 'exisjs/validator'
100
- import { sanitize } from 'exisjs/sanitize'
101
-
102
- export const CreateArticleSchema = tex.object({
103
- title: tex
104
- .string({ min: 5, max: 120 })
105
- .sanitize(sanitize.trim, sanitize.collapseWhitespace),
106
-
107
- slug: tex
108
- .string()
109
- .sanitize(sanitize.slugify),
110
-
111
- content: tex
112
- .string()
113
- .sanitize(sanitize.stripHtml),
114
-
115
- tags: tex
116
- .array(tex.string())
117
- .sanitize(sanitize.dedupe, sanitize.compact),
118
- })
119
- ```
120
-
121
- ---
122
-
123
- ## 6. Standalone Usage Example
124
-
125
- ```typescript filename="src/services/import.service.ts"
126
- import { sanitize } from 'exisjs/sanitize'
127
-
128
- export function processUserInput(rawContent: string): string {
129
- const step1 = sanitize.stripHtml(rawContent)
130
- const step2 = sanitize.collapseWhitespace(step1)
131
- const clean = sanitize.trim(step2)
132
- return clean
133
- }
134
- ```
1
+ ---
2
+ title: "exisjs/sanitize"
3
+ description: "API Reference for ExisJS data sanitization engine: string cleaners, safeSanitize, and object transformers."
4
+ nextUrl: "/docs/reference/swagger"
5
+ nextTitle: "Swagger Reference"
6
+ ---
7
+
8
+ # `exisjs/sanitize`
9
+
10
+ The `exisjs/sanitize` module provides pure data sanitization functions for cleaning and normalizing input strings, numbers, dates, arrays, and complex objects before business logic execution. It includes security transforms for XSS escaping, HTML stripping, and basic SQL injection and path traversal probe detection.
11
+
12
+ ---
13
+
14
+ ## Module Exports
15
+
16
+ ```typescript
17
+ import { sanitize } from 'exisjs/sanitize'
18
+ ```
19
+
20
+ ---
21
+
22
+ ## 1. Security Sanitizers
23
+
24
+ The SQL and path traversal checks reject common probe strings; they complement, and never replace, parameterized queries and resolved-path checks. A sanitizer that throws inside `.sanitize()` becomes a `400` validation error for that field (code `SANITIZATION_FAILED`).
25
+
26
+ | Function | Signature | Description |
27
+ | :--- | :--- | :--- |
28
+ | `sanitize.escapeHtml` | `(val: string) => string` | Escapes `&`, `<`, `>`, `"`, and `'` into HTML entities. Use it for text shown in HTML. |
29
+ | `sanitize.stripHtml` | `(val: string) => string` | Removes tags, comments, and `<script>` / `<style>` elements with their content. A `<` that does not start a tag (`a < b`) is kept. |
30
+ | `sanitize.stripControlChars` | `(val: string) => string` | Removes invisible control characters (keeps tab and line breaks) and the bidirectional overrides used to disguise text. |
31
+ | `sanitize.preventSql` | `(val: string) => string` | Throws on common SQL injection probes (`' or 1=1`, `union select`, ...). |
32
+ | `sanitize.preventTraversal` | `(val: string) => string` | Throws on a `..` path segment (also `\` separators and percent-encoded forms such as `%2e%2e%2f`) and on NUL bytes. `report..final.pdf` is allowed. |
33
+ | `sanitize.maskEmail` | `(val: string) => string` | Obfuscates email addresses (e.g., `al***@example.com`). |
34
+ | `sanitize.maskString` | `(val: string) => string` | Keeps the first and last two characters (`ab****yz`). |
35
+
36
+ ---
37
+
38
+ ## 2. Text & String Sanitizers
39
+
40
+ | Function | Signature | Description |
41
+ | :--- | :--- | :--- |
42
+ | `sanitize.trim` | `(val: string) => string` | Strips leading and trailing whitespace. |
43
+ | `sanitize.toLowerCase` | `(val: string) => string` | Converts all characters to lowercase. |
44
+ | `sanitize.toUpperCase` | `(val: string) => string` | Converts all characters to uppercase. |
45
+ | `sanitize.collapseWhitespace`| `(val: string) => string` | Collapses consecutive whitespace, tabs, and newlines into a single space. |
46
+ | `sanitize.normalizeUnicode` | `(val: string) => string` | Normalizes to Unicode NFC, so visually equal strings compare equal. |
47
+ | `sanitize.normalizeEmail` | `(val: string) => string` | Trims and lowercases an email address. |
48
+ | `sanitize.slugify` | `(val: string) => string` | URL-friendly slug; accented letters keep their base letter (`"Café Crème"` $ o$ `"cafe-creme"`). |
49
+ | `sanitize.truncate(length)` | `(length: number) => (val: string) => string` | Shortens to `length` characters without splitting an emoji in two. |
50
+ | `sanitize.removeNonAlphanumeric` | `(val: string) => string` | Strips all characters except ASCII letters and digits. |
51
+ | `sanitize.normalizeLineEndings` | `(val: string) => string` | Converts `
52
+ ` and lone `
53
+ `. |
54
+
55
+ ---
56
+
57
+ ## 3. Numbers
58
+
59
+ | Function | Signature | Description |
60
+ | :--- | :--- | :--- |
61
+ | `sanitize.round(decimals?)` | `(decimals = 0) => (val: number) => number` | Rounds to `decimals` places. |
62
+ | `sanitize.clamp(min, max)` | `(min: number, max: number) => (val: number) => number` | Constrains a number to `[min, max]`. |
63
+
64
+ ---
65
+
66
+ ## 4. Arrays & Objects
67
+
68
+ ### Array Transforms
69
+
70
+ | Function | Signature | Description |
71
+ | :--- | :--- | :--- |
72
+ | `sanitize.dedupe` | `<T>(val: T[]) => T[]` | Removes duplicate values preserving first-seen ordering. |
73
+ | `sanitize.compact` | `<T>(val: T[]) => T[]` | Removes `null`, `undefined`, and empty strings (`""`). |
74
+ | `sanitize.trimElements` | `(val: string[]) => string[]` | Trims every string item. |
75
+ | `sanitize.limitLength(n)` | `(length: number) => <T>(val: T[]) => T[]` | Keeps the first `length` items. |
76
+
77
+ ### Object Transforms
78
+
79
+ | Function | Signature | Description |
80
+ | :--- | :--- | :--- |
81
+ | `sanitize.pick(keys)` | `<T, K extends keyof T>(keys: K[]) => (val: T) => Pick<T, K>` | Keeps only the listed keys the object itself has (never inherited ones such as `constructor`). |
82
+ | `sanitize.omit(keys)` | `<T, K extends keyof T>(keys: K[]) => (val: T) => Omit<T, K>` | Removes the listed keys. |
83
+ | `sanitize.deepTrim` | `<T>(val: T) => T` | Trims every string in a nested object or array. |
84
+
85
+ Every sanitizer passes values of another type through unchanged (a string sanitizer returns a number as is, an array sanitizer returns a non-array as is), so they are safe on optional and nullable fields.
86
+
87
+ ---
88
+
89
+ ## 5. Integration with TexEngine Validation
90
+
91
+ Sanitizers integrate with `tex` validator chains using the `.sanitize()` modifier. Sanitization occurs **before** rule validation checks:
92
+
93
+ ```typescript filename="src/http/articles/schema.ts"
94
+ import { tex } from 'exisjs/validator'
95
+ import { sanitize } from 'exisjs/sanitize'
96
+
97
+ export const CreateArticleSchema = tex.object({
98
+ title: tex
99
+ .string({ min: 5, max: 120 })
100
+ .sanitize(sanitize.trim, sanitize.collapseWhitespace),
101
+
102
+ slug: tex
103
+ .string()
104
+ .sanitize(sanitize.slugify),
105
+
106
+ content: tex
107
+ .string()
108
+ .sanitize(sanitize.stripHtml),
109
+
110
+ tags: tex
111
+ .array(tex.string())
112
+ .sanitize(sanitize.dedupe, sanitize.compact),
113
+ })
114
+ ```
115
+
116
+ ---
117
+
118
+ ## 6. Standalone Usage Example
119
+
120
+ ```typescript filename="src/services/import.service.ts"
121
+ import { sanitize } from 'exisjs/sanitize'
122
+
123
+ export function processUserInput(rawContent: string): string {
124
+ const step1 = sanitize.stripHtml(rawContent)
125
+ const step2 = sanitize.collapseWhitespace(step1)
126
+ const clean = sanitize.trim(step2)
127
+ return clean
128
+ }
129
+ ```
@@ -55,8 +55,9 @@ The `tex` instance exposes factory functions for all standard primitives, comple
55
55
 
56
56
  | Method | Return Type | Options Interface | Description |
57
57
  | :--- | :--- | :--- | :--- |
58
- | `tex.string(options?)` | `TexType<string>` | `TexStringOptions` | String validation with trimming, HTML escaping, min/max bounds, masking, coercion, and injection checks. |
59
- | `tex.number(options?)` | `TexType<number>` | `TexNumberOptions` | Number validation with optional string coercion (`coerce: true`) and min/max limits. |
58
+ | `tex.string(options?)` | `TexType<string>` | `TexStringOptions` | String validation with trimming, HTML escaping, min/max/exact `length`, `pattern` (RegExp), masking, coercion, and injection checks. |
59
+ | `tex.number(options?)` | `TexType<number>` | `TexNumberOptions` | Number validation with optional string coercion (`coerce: true`), whole numbers (`int: true`) and min/max limits. |
60
+ | `tex.url(options?)` | `TexType<string>` | `TexUrlOptions` | Absolute URL; `http` / `https` only unless `protocols` lists others. |
60
61
  | `tex.boolean(options?)` | `TexType<boolean>` | `TexBooleanOptions` | Boolean validation with string/numeric coercion (`"true"`, `"1"` -> `true`). |
61
62
  | `tex.email(options?)` | `TexType<string>` | `TexStringOptions` | Standard RFC 5322 email format validation. |
62
63
  | `tex.uuid(options?)` | `TexType<string>` | `{ version?: 1 \| 4 }` | Validates UUID strings (v1 or v4). |
@@ -160,6 +161,8 @@ All `TexType` instances provide fluent modifier and documentation methods:
160
161
  | `.transform(fn)` | `<Out>(fn: (val: T) => Out) => TexTransformed<Out>` | Applies a synchronous transformation to validated field data. |
161
162
  | `.toOpenApi()` | `() => Record<string, any>` | Converts the type definition into an OpenAPI 3.1 schema object. |
162
163
 
164
+ Every method returns a new schema and leaves the original unchanged, so one field schema can be reused in several objects.
165
+
163
166
  ---
164
167
 
165
168
  ## `TexEngine` Schema Object Methods
@@ -176,10 +179,12 @@ All `TexType` instances provide fluent modifier and documentation methods:
176
179
  | `omit(keys)` | `<K extends keyof T>(keys: K[]) => TexEngine<Omit<T, K>>` | Creates a new schema omitting the specified keys. |
177
180
  | `extend(shape)` | `<E>(extension: E) => TexEngine<T & ResolveSchema<E>>` | Merges additional or overridden fields into the existing schema. |
178
181
  | `merge(other)` | `<U>(other: TexEngine<U>) => TexEngine<T & U>` | Deeply merges two `TexEngine` schemas into a combined validator. |
182
+ | `refine(fn, opts?)` | `(fn: (data: T) => boolean, opts?: string \| { message?, path? }) => TexEngine<T>` | A check across fields, run once every field is valid; the error is reported on `path`. |
179
183
  | `transform(fn)` | `<Out>(fn: (data: T) => Out) => TexTransformedEngine<T, Out>` | Applies post-validation data reshaping to the entire schema output. |
180
184
  | `parse(data)` | `(data: unknown) => T` | Synchronously parses and validates data, throwing `ValidatorError` on failure. |
181
185
  | `parseAsync(data)` | `(data: unknown) => Promise<T>` | Asynchronously parses and validates data, evaluating async refinements. |
182
- | `safeParse(data)` | `(data: unknown) => { success: true, data: T } \| { success: false, error: ValidatorError }` | Validates data without throwing exceptions. |
186
+ | `safeParse(data)` | `(data: unknown) => { success: true, data: T } \| { success: false, errors, error: ValidatorError }` | Validates data without throwing; `errors` is the list of `{ path, message, code, ... }`. |
187
+ | `safeParseAsync(data)` | `(data: unknown) => Promise<SafeParseResult<T>>` | `safeParse` that also runs async refinements. |
183
188
  | `toOpenApi()` | `() => Record<string, any>` | Translates the schema into an OpenAPI 3.1 JSON schema representation. |
184
189
 
185
190
  ---
@@ -3,12 +3,17 @@ import { Router } from '../router/router';
3
3
  /** Which controller style a route module exports, if any. */
4
4
  export declare function routeParadigm(mod: any): 'oop' | 'functional' | null;
5
5
  export declare function mixedParadigmMessage(oopFiles: string[], functionalFiles: string[]): string;
6
+ interface LazyRoute {
7
+ filePath: string;
8
+ loaded: boolean;
9
+ /** Shared by every request that arrives while the file is being mounted */
10
+ loading?: Promise<void>;
11
+ /** Module already imported by the startup paradigm check, used for the first mount */
12
+ preloaded?: any;
13
+ }
6
14
  export declare class RouteScanner {
7
15
  app: App;
8
- lazyRoutes: Map<string, {
9
- filePath: string;
10
- loaded: boolean;
11
- }>;
16
+ lazyRoutes: Map<string, LazyRoute>;
12
17
  routeMap: Map<string, string>;
13
18
  apiDir: string | null;
14
19
  _allApiDirs?: string[];
@@ -16,6 +21,8 @@ export declare class RouteScanner {
16
21
  globalParadigm: 'oop' | 'functional' | null;
17
22
  constructor(app: App);
18
23
  loadAllRoutes(): Promise<void>;
24
+ /** Mounts a lazily registered route file once; concurrent callers share the same load. */
25
+ private loadLazyRoute;
19
26
  autoMountRoutes(root: string): Promise<void>;
20
27
  private mountDocs;
21
28
  mountRouteFile(filePath: string, routePath: string, preloaded?: any): Promise<void>;
@@ -30,4 +37,5 @@ export declare class RouteScanner {
30
37
  module: any;
31
38
  }[]): void;
32
39
  }
40
+ export {};
33
41
  //# sourceMappingURL=route-scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-scanner.d.ts","sourceRoot":"","sources":["../../src/router/route-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAkBzC,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,GAAG,YAAY,GAAG,IAAI,CAgBnE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAAE,EAClB,eAAe,EAAE,MAAM,EAAE,GACxB,MAAM,CAYR;AAED,qBAAa,YAAY;IAQJ,GAAG,EAAE,GAAG;IAPpB,UAAU;kBAA+B,MAAM;gBAAU,OAAO;OAAK;IACrE,QAAQ,sBAA4B;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAO;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa,UAAQ;IACrB,cAAc,EAAE,KAAK,GAAG,YAAY,GAAG,IAAI,CAAO;gBAEtC,GAAG,EAAE,GAAG;IAErB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBvB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAwP3C,SAAS;IAkBjB,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,GAAG,GACd,OAAO,CAAC,IAAI,CAAC;IAuOT,2BAA2B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;IAIhD,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,iBAAiB,GAAE,GAAG,EAAO,GAC5B,IAAI;IAsBA,2BAA2B,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,SAAa,GAAG,IAAI;YAI5D,iBAAiB;YAIjB,aAAa;IAOd,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,wBAAwB,CAC7B,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,EAAE,GAC3C,IAAI;CAGR"}
1
+ {"version":3,"file":"route-scanner.d.ts","sourceRoot":"","sources":["../../src/router/route-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAkBzC,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,GAAG,YAAY,GAAG,IAAI,CAgBnE;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAAE,EAClB,eAAe,EAAE,MAAM,EAAE,GACxB,MAAM,CAYR;AAED,UAAU,SAAS;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;IACf,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACvB,sFAAsF;IACtF,SAAS,CAAC,EAAE,GAAG,CAAA;CAChB;AAED,qBAAa,YAAY;IAQJ,GAAG,EAAE,GAAG;IAPpB,UAAU,yBAA+B;IACzC,QAAQ,sBAA4B;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAO;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa,UAAQ;IACrB,cAAc,EAAE,KAAK,GAAG,YAAY,GAAG,IAAI,CAAO;gBAEtC,GAAG,EAAE,GAAG;IAErB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAepC,0FAA0F;IAC1F,OAAO,CAAC,aAAa;IAuBR,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAuP3C,SAAS;IAkBjB,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,GAAG,GACd,OAAO,CAAC,IAAI,CAAC;IAuOT,2BAA2B,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM;IAIhD,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,iBAAiB,GAAE,GAAG,EAAO,GAC5B,IAAI;IAsBA,2BAA2B,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,SAAa,GAAG,IAAI;YAI5D,iBAAiB;YAIjB,aAAa;IAOd,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,wBAAwB,CAC7B,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,GAAG,CAAA;KAAE,EAAE,GAC3C,IAAI;CAGR"}