honertia 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +610 -0
  3. package/dist/auth.d.ts +10 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +11 -0
  6. package/dist/effect/action.d.ts +107 -0
  7. package/dist/effect/action.d.ts.map +1 -0
  8. package/dist/effect/action.js +150 -0
  9. package/dist/effect/auth.d.ts +94 -0
  10. package/dist/effect/auth.d.ts.map +1 -0
  11. package/dist/effect/auth.js +204 -0
  12. package/dist/effect/bridge.d.ts +40 -0
  13. package/dist/effect/bridge.d.ts.map +1 -0
  14. package/dist/effect/bridge.js +103 -0
  15. package/dist/effect/errors.d.ts +78 -0
  16. package/dist/effect/errors.d.ts.map +1 -0
  17. package/dist/effect/errors.js +37 -0
  18. package/dist/effect/handler.d.ts +25 -0
  19. package/dist/effect/handler.d.ts.map +1 -0
  20. package/dist/effect/handler.js +120 -0
  21. package/dist/effect/index.d.ts +16 -0
  22. package/dist/effect/index.d.ts.map +1 -0
  23. package/dist/effect/index.js +25 -0
  24. package/dist/effect/responses.d.ts +73 -0
  25. package/dist/effect/responses.d.ts.map +1 -0
  26. package/dist/effect/responses.js +104 -0
  27. package/dist/effect/routing.d.ts +90 -0
  28. package/dist/effect/routing.d.ts.map +1 -0
  29. package/dist/effect/routing.js +124 -0
  30. package/dist/effect/schema.d.ts +263 -0
  31. package/dist/effect/schema.d.ts.map +1 -0
  32. package/dist/effect/schema.js +586 -0
  33. package/dist/effect/services.d.ts +85 -0
  34. package/dist/effect/services.d.ts.map +1 -0
  35. package/dist/effect/services.js +24 -0
  36. package/dist/effect/validation.d.ts +38 -0
  37. package/dist/effect/validation.d.ts.map +1 -0
  38. package/dist/effect/validation.js +69 -0
  39. package/dist/helpers.d.ts +65 -0
  40. package/dist/helpers.d.ts.map +1 -0
  41. package/dist/helpers.js +116 -0
  42. package/dist/index.d.ts +14 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +26 -0
  45. package/dist/middleware.d.ts +14 -0
  46. package/dist/middleware.d.ts.map +1 -0
  47. package/dist/middleware.js +113 -0
  48. package/dist/react.d.ts +17 -0
  49. package/dist/react.d.ts.map +1 -0
  50. package/dist/react.js +4 -0
  51. package/dist/schema.d.ts +9 -0
  52. package/dist/schema.d.ts.map +1 -0
  53. package/dist/schema.js +34 -0
  54. package/dist/setup.d.ts +113 -0
  55. package/dist/setup.d.ts.map +1 -0
  56. package/dist/setup.js +96 -0
  57. package/dist/test-utils.d.ts +105 -0
  58. package/dist/test-utils.d.ts.map +1 -0
  59. package/dist/test-utils.js +210 -0
  60. package/dist/types.d.ts +37 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/dist/types.js +11 -0
  63. package/package.json +71 -0
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Effect Route Builder
3
+ *
4
+ * Laravel-style routing with Effect handlers.
5
+ */
6
+ import { Effect, Layer } from 'effect';
7
+ import type { Hono, Env } from 'hono';
8
+ import { type EffectBridgeConfig } from './bridge.js';
9
+ import type { AppError } from './errors.js';
10
+ import { Redirect } from './errors.js';
11
+ import { DatabaseService, AuthService, HonertiaService, RequestService, ResponseFactoryService } from './services.js';
12
+ /**
13
+ * Type for Effect-based route handlers.
14
+ * Error type includes Error for compatibility with Effect.tryPromise.
15
+ */
16
+ export type EffectHandler<R = never, E extends AppError | Error = AppError | Error> = Effect.Effect<Response | Redirect, E, R>;
17
+ /**
18
+ * Base services available in every route.
19
+ */
20
+ export type BaseServices = RequestService | ResponseFactoryService | HonertiaService | DatabaseService | AuthService;
21
+ /**
22
+ * Effect Route Builder with layer composition.
23
+ */
24
+ export declare class EffectRouteBuilder<E extends Env, ProvidedServices = never> {
25
+ private readonly app;
26
+ private readonly layers;
27
+ private readonly pathPrefix;
28
+ private readonly bridgeConfig?;
29
+ constructor(app: Hono<E>, layers?: Layer.Layer<any, never, never>[], pathPrefix?: string, bridgeConfig?: EffectBridgeConfig<E> | undefined);
30
+ /**
31
+ * Add a layer to provide services to all routes in this builder.
32
+ * The layer's error type must be handled by the effect bridge (AppError or subtype).
33
+ */
34
+ provide<S, LayerErr extends AppError>(layer: Layer.Layer<S, LayerErr, never>): EffectRouteBuilder<E, ProvidedServices | S>;
35
+ /**
36
+ * Set path prefix for all routes in this builder.
37
+ */
38
+ prefix(path: string): EffectRouteBuilder<E, ProvidedServices>;
39
+ /**
40
+ * Create a nested group with the same configuration.
41
+ */
42
+ group(callback: (route: EffectRouteBuilder<E, ProvidedServices>) => void): void;
43
+ /**
44
+ * Resolve the full path.
45
+ */
46
+ private resolvePath;
47
+ /**
48
+ * Create a Hono handler from an Effect.
49
+ */
50
+ private createHandler;
51
+ /**
52
+ * Register a GET route.
53
+ */
54
+ get<R extends BaseServices | ProvidedServices>(path: string, effect: EffectHandler<R, AppError | Error>): void;
55
+ /**
56
+ * Register a POST route.
57
+ */
58
+ post<R extends BaseServices | ProvidedServices>(path: string, effect: EffectHandler<R, AppError | Error>): void;
59
+ /**
60
+ * Register a PUT route.
61
+ */
62
+ put<R extends BaseServices | ProvidedServices>(path: string, effect: EffectHandler<R, AppError | Error>): void;
63
+ /**
64
+ * Register a PATCH route.
65
+ */
66
+ patch<R extends BaseServices | ProvidedServices>(path: string, effect: EffectHandler<R, AppError | Error>): void;
67
+ /**
68
+ * Register a DELETE route.
69
+ */
70
+ delete<R extends BaseServices | ProvidedServices>(path: string, effect: EffectHandler<R, AppError | Error>): void;
71
+ /**
72
+ * Register a route for all HTTP methods.
73
+ */
74
+ all<R extends BaseServices | ProvidedServices>(path: string, effect: EffectHandler<R, AppError | Error>): void;
75
+ }
76
+ /**
77
+ * Create an Effect route builder for an app.
78
+ *
79
+ * @example
80
+ * effectRoutes(app)
81
+ * .provide(RequireAuthLayer)
82
+ * .prefix('/dashboard')
83
+ * .group((route) => {
84
+ * route.get('/', showDashboard)
85
+ * route.get('/projects', listProjects)
86
+ * route.post('/projects', createProject)
87
+ * })
88
+ */
89
+ export declare function effectRoutes<E extends Env>(app: Hono<E>, config?: EffectBridgeConfig<E>): EffectRouteBuilder<E, never>;
90
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/effect/routing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,KAAK,EAAE,IAAI,EAAqB,GAAG,EAAE,MAAM,MAAM,CAAA;AAExD,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EACL,eAAe,EACf,WAAW,EAEX,eAAe,EACf,cAAc,EACd,sBAAsB,EACvB,MAAM,eAAe,CAAA;AAEtB;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,SAAS,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,CACjG,QAAQ,GAAG,QAAQ,EACnB,CAAC,EACD,CAAC,CACF,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,cAAc,GACd,sBAAsB,GACtB,eAAe,GACf,eAAe,GACf,WAAW,CAAA;AAEf;;GAEG;AACH,qBAAa,kBAAkB,CAC7B,CAAC,SAAS,GAAG,EACb,gBAAgB,GAAG,KAAK;IAGtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAHb,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EACZ,MAAM,GAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,EAAO,EAC7C,UAAU,GAAE,MAAW,EACvB,YAAY,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAA;IAGvD;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,QAAQ,SAAS,QAAQ,EAClC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,GACrC,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,GAAG,CAAC,CAAC;IAS9C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAU7D;;OAEG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,CAAC,KAAK,IAAI,GAAG,IAAI;IAI/E;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,gBAAgB,EAAM,IAAI,EAAE,MAAM,EAC7D,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACzC,IAAI;IAIP;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,YAAY,GAAG,gBAAgB,EAC5C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACzC,IAAI;IAIP;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,gBAAgB,EAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACzC,IAAI;IAIP;;OAEG;IACH,KAAK,CAAC,CAAC,SAAS,YAAY,GAAG,gBAAgB,EAC7C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACzC,IAAI;IAIP;;OAEG;IACH,MAAM,CAAC,CAAC,SAAS,YAAY,GAAG,gBAAgB,EAC9C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACzC,IAAI;IAIP;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,gBAAgB,EAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC,GACzC,IAAI;CAGR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,GAAG,EACxC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EACZ,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,kBAAkB,CAAC,CAAC,EAAE,KAAK,CAAC,CAE9B"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Effect Route Builder
3
+ *
4
+ * Laravel-style routing with Effect handlers.
5
+ */
6
+ import { Effect, Layer } from 'effect';
7
+ import { effectHandler } from './handler.js';
8
+ import { buildContextLayer } from './bridge.js';
9
+ /**
10
+ * Effect Route Builder with layer composition.
11
+ */
12
+ export class EffectRouteBuilder {
13
+ app;
14
+ layers;
15
+ pathPrefix;
16
+ bridgeConfig;
17
+ constructor(app, layers = [], pathPrefix = '', bridgeConfig) {
18
+ this.app = app;
19
+ this.layers = layers;
20
+ this.pathPrefix = pathPrefix;
21
+ this.bridgeConfig = bridgeConfig;
22
+ }
23
+ /**
24
+ * Add a layer to provide services to all routes in this builder.
25
+ * The layer's error type must be handled by the effect bridge (AppError or subtype).
26
+ */
27
+ provide(layer) {
28
+ return new EffectRouteBuilder(this.app, [...this.layers, layer], this.pathPrefix, this.bridgeConfig);
29
+ }
30
+ /**
31
+ * Set path prefix for all routes in this builder.
32
+ */
33
+ prefix(path) {
34
+ const normalizedPath = path.replace(/\/$/, '');
35
+ return new EffectRouteBuilder(this.app, this.layers, this.pathPrefix + normalizedPath, this.bridgeConfig);
36
+ }
37
+ /**
38
+ * Create a nested group with the same configuration.
39
+ */
40
+ group(callback) {
41
+ callback(this);
42
+ }
43
+ /**
44
+ * Resolve the full path.
45
+ */
46
+ resolvePath(path) {
47
+ if (this.pathPrefix) {
48
+ return path === '/' ? this.pathPrefix : `${this.pathPrefix}${path}`;
49
+ }
50
+ return path;
51
+ }
52
+ /**
53
+ * Create a Hono handler from an Effect.
54
+ */
55
+ createHandler(effect) {
56
+ const layers = this.layers;
57
+ const bridgeConfig = this.bridgeConfig;
58
+ return async (c) => {
59
+ // Build context layer from Hono context
60
+ const contextLayer = buildContextLayer(c, bridgeConfig);
61
+ // Combine with provided layers
62
+ let fullLayer = contextLayer;
63
+ for (const layer of layers) {
64
+ fullLayer = Layer.merge(fullLayer, layer);
65
+ }
66
+ // Run the effect with the combined layer
67
+ const program = effect.pipe(Effect.provide(fullLayer));
68
+ // Use the handler
69
+ return effectHandler(program)(c, async () => { });
70
+ };
71
+ }
72
+ /**
73
+ * Register a GET route.
74
+ */
75
+ get(path, effect) {
76
+ this.app.get(this.resolvePath(path), this.createHandler(effect));
77
+ }
78
+ /**
79
+ * Register a POST route.
80
+ */
81
+ post(path, effect) {
82
+ this.app.post(this.resolvePath(path), this.createHandler(effect));
83
+ }
84
+ /**
85
+ * Register a PUT route.
86
+ */
87
+ put(path, effect) {
88
+ this.app.put(this.resolvePath(path), this.createHandler(effect));
89
+ }
90
+ /**
91
+ * Register a PATCH route.
92
+ */
93
+ patch(path, effect) {
94
+ this.app.patch(this.resolvePath(path), this.createHandler(effect));
95
+ }
96
+ /**
97
+ * Register a DELETE route.
98
+ */
99
+ delete(path, effect) {
100
+ this.app.delete(this.resolvePath(path), this.createHandler(effect));
101
+ }
102
+ /**
103
+ * Register a route for all HTTP methods.
104
+ */
105
+ all(path, effect) {
106
+ this.app.all(this.resolvePath(path), this.createHandler(effect));
107
+ }
108
+ }
109
+ /**
110
+ * Create an Effect route builder for an app.
111
+ *
112
+ * @example
113
+ * effectRoutes(app)
114
+ * .provide(RequireAuthLayer)
115
+ * .prefix('/dashboard')
116
+ * .group((route) => {
117
+ * route.get('/', showDashboard)
118
+ * route.get('/projects', listProjects)
119
+ * route.post('/projects', createProject)
120
+ * })
121
+ */
122
+ export function effectRoutes(app, config) {
123
+ return new EffectRouteBuilder(app, [], '', config);
124
+ }
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Honertia Effect Schema Validators
3
+ *
4
+ * Laravel-inspired Effect Schema helpers for common validation patterns.
5
+ */
6
+ import { Schema as S } from 'effect';
7
+ /**
8
+ * Trims whitespace from a string.
9
+ */
10
+ export declare const trimmed: S.transform<typeof S.String, typeof S.String>;
11
+ /**
12
+ * A nullable string that converts empty/whitespace-only strings to null.
13
+ * Useful for optional text fields where empty input should be stored as null.
14
+ */
15
+ export declare const nullableString: S.transform<typeof S.Unknown, S.NullOr<typeof S.String>>;
16
+ /**
17
+ * Alias for nullableString.
18
+ */
19
+ export declare const optionalString: S.transform<typeof S.Unknown, S.NullOr<typeof S.String>>;
20
+ /**
21
+ * A required string that is trimmed. Empty strings fail validation.
22
+ */
23
+ export declare const requiredString: S.filter<S.transform<typeof S.String, typeof S.String>>;
24
+ /**
25
+ * Create a required string with a custom message.
26
+ */
27
+ export declare const required: (message?: string) => S.filter<S.transform<typeof S.String, typeof S.String>>;
28
+ /**
29
+ * Coerces a value to a number.
30
+ */
31
+ export declare const coercedNumber: S.transform<typeof S.Unknown, typeof S.Number>;
32
+ /**
33
+ * Coerces a value to a positive integer.
34
+ */
35
+ export declare const positiveInt: S.filter<S.filter<S.transform<typeof S.Unknown, typeof S.Number>>>;
36
+ /**
37
+ * Coerces a value to a non-negative integer (0 or greater).
38
+ */
39
+ export declare const nonNegativeInt: S.filter<S.filter<S.transform<typeof S.Unknown, typeof S.Number>>>;
40
+ /**
41
+ * Parses a string to a positive integer, returning null on failure.
42
+ */
43
+ export declare function parsePositiveInt(value: string | undefined): number | null;
44
+ /**
45
+ * Coerces various truthy/falsy values to boolean.
46
+ */
47
+ export declare const coercedBoolean: S.transform<typeof S.Unknown, typeof S.Boolean>;
48
+ /**
49
+ * A checkbox value that defaults to false if not present.
50
+ */
51
+ export declare const checkbox: S.transform<typeof S.Unknown, typeof S.Boolean>;
52
+ /**
53
+ * Coerces a string or number to a Date object.
54
+ */
55
+ export declare const coercedDate: S.transform<typeof S.Unknown, typeof S.DateFromSelf>;
56
+ /**
57
+ * A nullable date that accepts empty strings as null.
58
+ */
59
+ export declare const nullableDate: S.transform<typeof S.Unknown, S.NullOr<typeof S.DateFromSelf>>;
60
+ /**
61
+ * Ensures a value is always an array.
62
+ */
63
+ export declare const ensureArray: <A, I, R>(schema: S.Schema<A, I, R>) => S.transform<typeof S.Unknown, S.Array$<S.Schema<A, I, R>>>;
64
+ /**
65
+ * An email address with trimming and lowercase normalization.
66
+ */
67
+ export declare const email: S.filter<S.transform<typeof S.String, typeof S.String>>;
68
+ /**
69
+ * A nullable email address.
70
+ */
71
+ export declare const nullableEmail: S.transform<typeof S.Unknown, S.NullOr<typeof S.String>>;
72
+ /**
73
+ * A URL with trimming.
74
+ */
75
+ export declare const url: S.filter<S.transform<typeof S.String, typeof S.String>>;
76
+ /**
77
+ * A nullable URL.
78
+ */
79
+ export declare const nullableUrl: S.transform<typeof S.Unknown, S.NullOr<typeof S.String>>;
80
+ /**
81
+ * Validates that a string contains only alphabetic characters.
82
+ */
83
+ export declare const alpha: S.filter<S.transform<typeof S.String, typeof S.String>>;
84
+ /**
85
+ * Validates that a string contains only alphanumeric characters, dashes, and underscores.
86
+ */
87
+ export declare const alphaDash: S.filter<S.transform<typeof S.String, typeof S.String>>;
88
+ /**
89
+ * Validates that a string contains only alphanumeric characters.
90
+ */
91
+ export declare const alphaNum: S.filter<S.transform<typeof S.String, typeof S.String>>;
92
+ /**
93
+ * Validates a string starts with one of the given values.
94
+ */
95
+ export declare const startsWith: (prefixes: string[], message?: string) => S.filter<typeof S.String>;
96
+ /**
97
+ * Validates a string ends with one of the given values.
98
+ */
99
+ export declare const endsWith: (suffixes: string[], message?: string) => S.filter<typeof S.String>;
100
+ /**
101
+ * Validates that a string is all lowercase.
102
+ */
103
+ export declare const lowercase: S.filter<typeof S.String>;
104
+ /**
105
+ * Validates that a string is all uppercase.
106
+ */
107
+ export declare const uppercase: S.filter<typeof S.String>;
108
+ /**
109
+ * Validates a number is between min and max (inclusive).
110
+ */
111
+ export declare const between: (min: number, max: number, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.Number>>;
112
+ /**
113
+ * Validates that a value has exactly the specified number of digits.
114
+ */
115
+ export declare const digits: (length: number, message?: string) => S.filter<typeof S.String>;
116
+ /**
117
+ * Validates that a value has between min and max digits.
118
+ */
119
+ export declare const digitsBetween: (min: number, max: number, message?: string) => S.filter<typeof S.String>;
120
+ /**
121
+ * Validates a number is greater than the given value.
122
+ */
123
+ export declare const gt: (value: number, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.Number>>;
124
+ /**
125
+ * Validates a number is greater than or equal to the given value.
126
+ */
127
+ export declare const gte: (value: number, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.Number>>;
128
+ /**
129
+ * Validates a number is less than the given value.
130
+ */
131
+ export declare const lt: (value: number, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.Number>>;
132
+ /**
133
+ * Validates a number is less than or equal to the given value.
134
+ */
135
+ export declare const lte: (value: number, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.Number>>;
136
+ /**
137
+ * Validates a number is a multiple of another number.
138
+ */
139
+ export declare const multipleOf: (value: number, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.Number>>;
140
+ /**
141
+ * Validates that a value is one of the allowed values.
142
+ */
143
+ export declare const inArray: <T extends readonly string[]>(values: T, message?: string) => S.Schema<T[number], string, never>;
144
+ /**
145
+ * Validates that a value is NOT one of the disallowed values.
146
+ */
147
+ export declare const notIn: <T>(values: T[], message?: string) => S.filter<typeof S.Unknown>;
148
+ /**
149
+ * Validates a UUID.
150
+ */
151
+ export declare const uuid: typeof S.UUID;
152
+ /**
153
+ * Validates a nullable UUID.
154
+ */
155
+ export declare const nullableUuid: S.transform<typeof S.Unknown, S.NullOr<typeof S.UUID>>;
156
+ /**
157
+ * Validates an IPv4 address.
158
+ */
159
+ export declare const ipv4: S.filter<typeof S.String>;
160
+ /**
161
+ * Validates an IPv6 address.
162
+ */
163
+ export declare const ipv6: S.filter<typeof S.String>;
164
+ /**
165
+ * Validates an IP address (v4 or v6).
166
+ */
167
+ export declare const ip: S.filter<typeof S.String>;
168
+ /**
169
+ * Validates a MAC address.
170
+ */
171
+ export declare const macAddress: S.filter<typeof S.String>;
172
+ /**
173
+ * Validates valid JSON string.
174
+ */
175
+ export declare const jsonString: S.filter<typeof S.String>;
176
+ /**
177
+ * Helper for password confirmation validation.
178
+ * Use with S.Struct and filter for cross-field validation.
179
+ */
180
+ export declare function confirmed(fieldName: string, confirmationFieldName?: string, message?: string): {
181
+ fieldName: string;
182
+ confirmationFieldName: string;
183
+ refine: <T extends Record<string, unknown>>(data: T) => boolean;
184
+ message: string;
185
+ path: string[];
186
+ };
187
+ /**
188
+ * Validates that a value is "accepted" (true, "yes", "on", "1", 1).
189
+ */
190
+ export declare const accepted: S.refine<true, S.Schema<true, unknown, never>>;
191
+ /**
192
+ * Validates that a value is "declined" (false, "no", "off", "0", 0).
193
+ */
194
+ export declare const declined: S.refine<false, S.Schema<false, unknown, never>>;
195
+ /**
196
+ * Validates exact string length.
197
+ */
198
+ export declare const size: (length: number, message?: string) => S.filter<typeof S.String>;
199
+ /**
200
+ * Validates minimum string length.
201
+ */
202
+ export declare const min: (length: number, message?: string) => S.filter<typeof S.String>;
203
+ /**
204
+ * Validates maximum string length.
205
+ */
206
+ export declare const max: (length: number, message?: string) => S.filter<typeof S.String>;
207
+ /**
208
+ * Validates a date is after the given date.
209
+ */
210
+ export declare const after: (date: Date | string, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.DateFromSelf>>;
211
+ /**
212
+ * Validates a date is after or equal to the given date.
213
+ */
214
+ export declare const afterOrEqual: (date: Date | string, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.DateFromSelf>>;
215
+ /**
216
+ * Validates a date is before the given date.
217
+ */
218
+ export declare const before: (date: Date | string, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.DateFromSelf>>;
219
+ /**
220
+ * Validates a date is before or equal to the given date.
221
+ */
222
+ export declare const beforeOrEqual: (date: Date | string, message?: string) => S.filter<S.transform<typeof S.Unknown, typeof S.DateFromSelf>>;
223
+ /**
224
+ * Validates array has distinct/unique values.
225
+ */
226
+ export declare const distinct: <A, I, R>(schema: S.Schema<A, I, R>, message?: string) => S.filter<S.Array$<S.Schema<A, I, R>>>;
227
+ /**
228
+ * Validates array has minimum number of items.
229
+ */
230
+ export declare const minItems: <A, I, R>(schema: S.Schema<A, I, R>, minCount: number, message?: string) => S.filter<S.Array$<S.Schema<A, I, R>>>;
231
+ /**
232
+ * Validates array has maximum number of items.
233
+ */
234
+ export declare const maxItems: <A, I, R>(schema: S.Schema<A, I, R>, maxCount: number, message?: string) => S.filter<S.Array$<S.Schema<A, I, R>>>;
235
+ /**
236
+ * Creates a password schema with configurable rules.
237
+ */
238
+ export declare function password(options?: {
239
+ min?: number;
240
+ max?: number;
241
+ letters?: boolean;
242
+ mixedCase?: boolean;
243
+ numbers?: boolean;
244
+ symbols?: boolean;
245
+ }): S.filter<typeof S.String>;
246
+ /**
247
+ * Excludes a field (sets to undefined) when a condition is met.
248
+ */
249
+ export declare const excludeIf: <A, I, R>(schema: S.Schema<A, I, R>, condition: (value: unknown) => boolean) => S.transform<typeof S.Unknown, S.Union<[S.Schema<A, I, R>, typeof S.Undefined]>>;
250
+ /**
251
+ * Creates a nullable version of any schema.
252
+ * Converts empty strings to null.
253
+ */
254
+ export declare const nullable: <A, I, R>(schema: S.Schema<A, I, R>) => S.transform<typeof S.Unknown, S.NullOr<S.Schema<A, I, R>>>;
255
+ /**
256
+ * Creates a schema that fills in a default value when empty/null/undefined.
257
+ */
258
+ export declare const filled: <A, I, R>(schema: S.Schema<A, I, R>, defaultValue: A) => S.transform<typeof S.Unknown, S.Schema<A, I, R>>;
259
+ /**
260
+ * Re-export Schema namespace for convenience.
261
+ */
262
+ export { Schema as S } from 'effect';
263
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/effect/schema.ts"],"names":[],"mappings":"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"}