@ereo/data 0.1.6

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.
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @ereo/data - Unified Data Loading
3
+ *
4
+ * A single, simple pattern for server-side data fetching.
5
+ * No confusion about which loading method to use.
6
+ */
7
+ import type { LoaderArgs, LoaderFunction, RouteParams, CacheOptions } from '@ereo/core';
8
+ /**
9
+ * Options for creating a loader.
10
+ */
11
+ export interface LoaderOptions<T, P extends RouteParams = RouteParams> {
12
+ /** The data fetching function */
13
+ load: (args: LoaderArgs<P>) => T | Promise<T>;
14
+ /** Default cache options */
15
+ cache?: CacheOptions;
16
+ /** Transform the loaded data before returning */
17
+ transform?: (data: Awaited<T>, args: LoaderArgs<P>) => Awaited<T> | Promise<Awaited<T>>;
18
+ /** Handle errors */
19
+ onError?: (error: Error, args: LoaderArgs<P>) => T | Response | Promise<T | Response>;
20
+ }
21
+ /**
22
+ * Create a type-safe loader function.
23
+ *
24
+ * @example
25
+ * export const loader = createLoader({
26
+ * load: async ({ params }) => {
27
+ * return db.post.findUnique({ where: { slug: params.slug } });
28
+ * },
29
+ * cache: { maxAge: 60, tags: ['posts'] },
30
+ * });
31
+ */
32
+ export declare function createLoader<T, P extends RouteParams = RouteParams>(options: LoaderOptions<T, P>): LoaderFunction<T, P>;
33
+ /**
34
+ * Defer data loading until render time.
35
+ * Useful for non-critical data that shouldn't block the page.
36
+ */
37
+ export interface DeferredData<T> {
38
+ promise: Promise<T>;
39
+ status: 'pending' | 'resolved' | 'rejected';
40
+ value?: T;
41
+ error?: Error;
42
+ }
43
+ /**
44
+ * Create deferred data that resolves during streaming.
45
+ */
46
+ export declare function defer<T>(promise: Promise<T>): DeferredData<T>;
47
+ /**
48
+ * Check if a value is deferred data.
49
+ */
50
+ export declare function isDeferred<T>(value: unknown): value is DeferredData<T>;
51
+ /**
52
+ * Wait for deferred data to resolve.
53
+ */
54
+ export declare function resolveDeferred<T>(deferred: DeferredData<T>): Promise<T>;
55
+ /**
56
+ * Helper to extract data from a fetch response.
57
+ */
58
+ export declare function fetchData<T>(input: RequestInfo | URL, init?: RequestInit): Promise<T>;
59
+ /**
60
+ * Error thrown when fetch fails.
61
+ */
62
+ export declare class FetchError extends Error {
63
+ response: Response;
64
+ constructor(message: string, response: Response);
65
+ get status(): number;
66
+ get statusText(): string;
67
+ }
68
+ /**
69
+ * Helper to safely serialize loader data.
70
+ * Prevents XSS by escaping dangerous characters.
71
+ */
72
+ export declare function serializeLoaderData(data: unknown): string;
73
+ /**
74
+ * Parse serialized loader data.
75
+ */
76
+ export declare function parseLoaderData<T>(serialized: string): T;
77
+ /**
78
+ * Combine multiple loaders into one.
79
+ * Runs all loaders in parallel.
80
+ */
81
+ export declare function combineLoaders<T extends Record<string, LoaderFunction<unknown>>>(loaders: T): LoaderFunction<{
82
+ [K in keyof T]: Awaited<ReturnType<T[K]>>;
83
+ }>;
84
+ /**
85
+ * Create a loader that runs on the client side.
86
+ * This is useful for client-only data like user preferences.
87
+ */
88
+ export declare function clientLoader<T, P extends RouteParams = RouteParams>(load: (params: P) => T | Promise<T>): LoaderFunction<T, P>;
89
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * @ereo/data - Data Pipeline
3
+ *
4
+ * Unified data loading with automatic parallelization and dependency management.
5
+ * Prevents waterfalls by analyzing dependencies and running independent loaders in parallel.
6
+ */
7
+ import type { LoaderArgs, RouteParams } from '@ereo/core';
8
+ /**
9
+ * Single data source definition.
10
+ */
11
+ export interface DataSource<T = unknown, P = RouteParams> {
12
+ /** Loader function */
13
+ load: (args: LoaderArgs<P>) => T | Promise<T>;
14
+ /** Cache tags for this data source */
15
+ tags?: string[] | ((params: P) => string[]);
16
+ /** Cache TTL in seconds */
17
+ ttl?: number;
18
+ /** Whether this data is required (throws on failure) */
19
+ required?: boolean;
20
+ /** Fallback value if load fails */
21
+ fallback?: T;
22
+ }
23
+ /**
24
+ * Pipeline configuration.
25
+ */
26
+ export interface PipelineConfig<TLoaders extends Record<string, DataSource>, P = RouteParams> {
27
+ /** Data source loaders */
28
+ loaders: TLoaders;
29
+ /** Dependencies between loaders (key depends on values) */
30
+ dependencies?: Partial<Record<keyof TLoaders, (keyof TLoaders)[]>>;
31
+ /** Global error handler */
32
+ onError?: (error: Error, key: string) => void;
33
+ /** Enable timing metrics */
34
+ metrics?: boolean;
35
+ }
36
+ /**
37
+ * Pipeline execution result.
38
+ */
39
+ export interface PipelineResult<TLoaders extends Record<string, DataSource>> {
40
+ /** Loaded data for each source */
41
+ data: {
42
+ [K in keyof TLoaders]: Awaited<ReturnType<TLoaders[K]['load']>>;
43
+ };
44
+ /** Timing metrics for each loader */
45
+ metrics: PipelineMetrics;
46
+ /** Any errors that occurred */
47
+ errors: Map<keyof TLoaders, Error>;
48
+ }
49
+ /**
50
+ * Timing metrics for pipeline execution.
51
+ */
52
+ export interface PipelineMetrics {
53
+ /** Total execution time */
54
+ total: number;
55
+ /** Per-loader timing */
56
+ loaders: Map<string, LoaderMetrics>;
57
+ /** Execution order (for visualization) */
58
+ executionOrder: ExecutionStep[];
59
+ /** Parallel efficiency (0-1, higher is better) */
60
+ parallelEfficiency: number;
61
+ /** Detected waterfalls */
62
+ waterfalls: WaterfallInfo[];
63
+ }
64
+ /**
65
+ * Per-loader metrics.
66
+ */
67
+ export interface LoaderMetrics {
68
+ /** Loader key */
69
+ key: string;
70
+ /** Start time (relative to pipeline start) */
71
+ startTime: number;
72
+ /** End time (relative to pipeline start) */
73
+ endTime: number;
74
+ /** Duration in ms */
75
+ duration: number;
76
+ /** Whether this was a cache hit */
77
+ cacheHit: boolean;
78
+ /** Data source (db, api, cache, etc.) */
79
+ source?: string;
80
+ /** Which loaders this was waiting for */
81
+ waitingFor: string[];
82
+ }
83
+ /**
84
+ * Execution step for visualization.
85
+ */
86
+ export interface ExecutionStep {
87
+ /** Timestamp relative to start */
88
+ time: number;
89
+ /** Event type */
90
+ type: 'start' | 'end';
91
+ /** Loader key */
92
+ loader: string;
93
+ }
94
+ /**
95
+ * Detected waterfall info.
96
+ */
97
+ export interface WaterfallInfo {
98
+ /** The loader that waited */
99
+ loader: string;
100
+ /** The loaders it waited for */
101
+ waitedFor: string[];
102
+ /** Whether the wait was necessary */
103
+ necessary: boolean;
104
+ /** Suggestion for optimization */
105
+ suggestion?: string;
106
+ }
107
+ /**
108
+ * Create a data pipeline with automatic parallelization.
109
+ *
110
+ * @example
111
+ * const pipeline = createPipeline({
112
+ * loaders: {
113
+ * user: { load: async () => getUser() },
114
+ * posts: { load: async () => getPosts() },
115
+ * comments: { load: async ({ data }) => getComments(data.posts) },
116
+ * },
117
+ * dependencies: {
118
+ * comments: ['posts'], // comments depends on posts
119
+ * },
120
+ * });
121
+ *
122
+ * export const loader = pipeline.toLoader();
123
+ */
124
+ export declare function createPipeline<TLoaders extends Record<string, DataSource>, P extends RouteParams = RouteParams>(config: PipelineConfig<TLoaders, P>): {
125
+ /**
126
+ * Execute the pipeline.
127
+ */
128
+ execute(args: LoaderArgs<P>): Promise<PipelineResult<TLoaders>>;
129
+ /**
130
+ * Convert pipeline to a standard loader function.
131
+ */
132
+ toLoader(): (args: LoaderArgs<P>) => Promise<{ [K in keyof TLoaders]: Awaited<ReturnType<TLoaders[K]["load"]>>; }>;
133
+ /**
134
+ * Get the dependency graph for visualization.
135
+ */
136
+ getDependencyGraph(): Map<string, string[]>;
137
+ };
138
+ /**
139
+ * Create a simple data source.
140
+ *
141
+ * @example
142
+ * const userSource = dataSource(async ({ params }) => getUser(params.id));
143
+ */
144
+ export declare function dataSource<T, P = RouteParams>(load: (args: LoaderArgs<P>) => T | Promise<T>, options?: Omit<DataSource<T, P>, 'load'>): DataSource<T, P>;
145
+ /**
146
+ * Create a cached data source.
147
+ *
148
+ * @example
149
+ * const cachedPosts = cachedSource(
150
+ * async () => db.posts.findMany(),
151
+ * { tags: ['posts'], ttl: 300 }
152
+ * );
153
+ */
154
+ export declare function cachedSource<T, P = RouteParams>(load: (args: LoaderArgs<P>) => T | Promise<T>, options: {
155
+ tags?: string[] | ((params: P) => string[]);
156
+ ttl?: number;
157
+ }): DataSource<T, P>;
158
+ /**
159
+ * Create a data source with a fallback.
160
+ *
161
+ * @example
162
+ * const userPrefs = optionalSource(
163
+ * async ({ params }) => getUserPreferences(params.id),
164
+ * { defaultTheme: 'light' }
165
+ * );
166
+ */
167
+ export declare function optionalSource<T, P = RouteParams>(load: (args: LoaderArgs<P>) => T | Promise<T>, fallback: T): DataSource<T, P>;
168
+ /**
169
+ * Combine multiple pipelines into one.
170
+ *
171
+ * @example
172
+ * const combinedPipeline = combinePipelines(
173
+ * { user: userPipeline },
174
+ * { posts: postsPipeline }
175
+ * );
176
+ */
177
+ export declare function combinePipelines<T extends Record<string, ReturnType<typeof createPipeline>>>(pipelines: T): {
178
+ execute: (args: LoaderArgs) => Promise<{
179
+ [K in keyof T]: Awaited<ReturnType<T[K]['execute']>>['data'];
180
+ }>;
181
+ };
182
+ /**
183
+ * Format metrics for console output.
184
+ */
185
+ export declare function formatMetrics(metrics: PipelineMetrics): string;
186
+ /**
187
+ * Generate metrics data for DevTools visualization.
188
+ */
189
+ export declare function generateMetricsVisualization(metrics: PipelineMetrics): {
190
+ timeline: Array<{
191
+ key: string;
192
+ start: number;
193
+ end: number;
194
+ duration: number;
195
+ cacheHit: boolean;
196
+ waitingFor: string[];
197
+ }>;
198
+ total: number;
199
+ efficiency: number;
200
+ waterfalls: WaterfallInfo[];
201
+ };
202
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @ereo/data - Cache Revalidation
3
+ *
4
+ * Explicit cache invalidation by tags.
5
+ * No hidden magic - you control exactly when caches are cleared.
6
+ */
7
+ /**
8
+ * Revalidation options.
9
+ */
10
+ export interface RevalidateOptions {
11
+ /** Tags to revalidate */
12
+ tags?: string[];
13
+ /** Specific paths to revalidate */
14
+ paths?: string[];
15
+ /** Revalidate everything */
16
+ all?: boolean;
17
+ }
18
+ /**
19
+ * Revalidation result.
20
+ */
21
+ export interface RevalidateResult {
22
+ success: boolean;
23
+ revalidated: {
24
+ tags: string[];
25
+ paths: string[];
26
+ };
27
+ timestamp: number;
28
+ }
29
+ /**
30
+ * Revalidate cache entries by tags.
31
+ */
32
+ export declare function revalidateTag(...tags: string[]): Promise<RevalidateResult>;
33
+ /**
34
+ * Revalidate cache entries by path.
35
+ */
36
+ export declare function revalidatePath(...paths: string[]): Promise<RevalidateResult>;
37
+ /**
38
+ * Revalidate with options.
39
+ */
40
+ export declare function revalidate(options: RevalidateOptions): Promise<RevalidateResult>;
41
+ /**
42
+ * Unstable cache function - wrap async function with caching.
43
+ * Similar to Next.js unstable_cache but with explicit tags.
44
+ */
45
+ export declare function unstable_cache<T extends (...args: any[]) => Promise<any>>(fn: T, keyParts: string[], options?: {
46
+ tags?: string[];
47
+ revalidate?: number;
48
+ }): T;
49
+ /**
50
+ * Create a revalidation handler for API routes.
51
+ * Returns a handler that can be used to trigger revalidation.
52
+ */
53
+ export declare function createRevalidationHandler(secret?: string): (request: Request) => Promise<Response>;
54
+ /**
55
+ * Helper to create tag names.
56
+ */
57
+ export declare const tags: {
58
+ /** Create a resource tag (e.g., 'post:123') */
59
+ resource: (type: string, id: string | number) => string;
60
+ /** Create a collection tag (e.g., 'posts') */
61
+ collection: (type: string) => string;
62
+ /** Create a user-scoped tag (e.g., 'user:123:posts') */
63
+ userScoped: (userId: string | number, type: string) => string;
64
+ };
65
+ /**
66
+ * On-demand ISR-style revalidation.
67
+ * Use this in actions after mutations.
68
+ */
69
+ export declare function onDemandRevalidate(...tagsOrPaths: string[]): Promise<RevalidateResult>;
70
+ //# sourceMappingURL=revalidate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revalidate.d.ts","sourceRoot":"","sources":["../src/revalidate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yBAAyB;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiBhF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwBlF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuBtF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EACvE,EAAE,EAAE,CAAC,EACL,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,CAAC,CAWH;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,IACzC,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CAgCnD;AAED;;GAEG;AACH,eAAO,MAAM,IAAI;IACf,+CAA+C;qBAC9B,MAAM,MAAM,MAAM,GAAG,MAAM;IAC5C,8CAA8C;uBAC3B,MAAM;IACzB,wDAAwD;yBACnC,MAAM,GAAG,MAAM,QAAQ,MAAM;CACnD,CAAC;AAEF;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,WAAW,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAa3B"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * @ereo/data - Schema Adapters for Type Safety
3
+ *
4
+ * Wrappers that align Zod's runtime coercion with TypeScript types.
5
+ * Solves the TanStack Start limitation where z.coerce types mismatch.
6
+ *
7
+ * Problem:
8
+ * ```typescript
9
+ * // In TanStack Start, this causes a type mismatch:
10
+ * const schema = z.object({
11
+ * count: z.coerce.number() // Runtime: number, but TS sees string input
12
+ * });
13
+ * ```
14
+ *
15
+ * Solution:
16
+ * ```typescript
17
+ * // Ereo's adapter aligns the types:
18
+ * const schema = ereoSchema(z.object({
19
+ * count: z.coerce.number() // Both runtime AND TypeScript see number
20
+ * }));
21
+ * ```
22
+ */
23
+ /**
24
+ * Generic validation schema interface.
25
+ * Compatible with Zod, Yup, Valibot, and other validation libraries.
26
+ */
27
+ export interface ValidationSchema<TInput, TOutput = TInput> {
28
+ /** Parse and validate input, throw on error */
29
+ parse: (data: TInput) => TOutput;
30
+ /** Parse and validate input, return result object */
31
+ safeParse?: (data: TInput) => {
32
+ success: true;
33
+ data: TOutput;
34
+ } | {
35
+ success: false;
36
+ error: ValidationError;
37
+ };
38
+ }
39
+ /**
40
+ * Validation error shape.
41
+ */
42
+ export interface ValidationError {
43
+ errors: Array<{
44
+ path: (string | number)[];
45
+ message: string;
46
+ code?: string;
47
+ }>;
48
+ }
49
+ /**
50
+ * Zod-compatible schema interface.
51
+ */
52
+ export interface ZodLikeSchema<TOutput> {
53
+ parse: (data: unknown) => TOutput;
54
+ safeParse: (data: unknown) => {
55
+ success: true;
56
+ data: TOutput;
57
+ } | {
58
+ success: false;
59
+ error: {
60
+ errors: Array<{
61
+ path: (string | number)[];
62
+ message: string;
63
+ }>;
64
+ };
65
+ };
66
+ _input?: unknown;
67
+ _output?: TOutput;
68
+ }
69
+ /**
70
+ * Wrapped schema that aligns input/output types.
71
+ */
72
+ export interface EreoSchema<TOutput> {
73
+ /** Parse and validate, throw on error */
74
+ parse: (data: unknown) => TOutput;
75
+ /** Parse and validate, return result */
76
+ safeParse: (data: unknown) => {
77
+ success: true;
78
+ data: TOutput;
79
+ } | {
80
+ success: false;
81
+ error: ValidationError;
82
+ };
83
+ /** Original schema for introspection */
84
+ _original: unknown;
85
+ /** Type brand for identification */
86
+ _ereoSchema: true;
87
+ /** Inferred output type (for type extraction) */
88
+ _output: TOutput;
89
+ }
90
+ /**
91
+ * Wrap a Zod or compatible schema for proper type alignment.
92
+ *
93
+ * This wrapper ensures that:
94
+ * 1. Coerced types (z.coerce.number()) are properly typed as their output type
95
+ * 2. Transform types are properly typed as their transformed type
96
+ * 3. Default values are reflected in the output type
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * import { z } from 'zod';
101
+ * import { ereoSchema } from '@ereo/data';
102
+ *
103
+ * // Without ereoSchema - type mismatch with coerce
104
+ * const rawSchema = z.object({
105
+ * count: z.coerce.number(),
106
+ * active: z.coerce.boolean(),
107
+ * });
108
+ * // TypeScript thinks input has string values
109
+ *
110
+ * // With ereoSchema - types align correctly
111
+ * const schema = ereoSchema(z.object({
112
+ * count: z.coerce.number(),
113
+ * active: z.coerce.boolean(),
114
+ * }));
115
+ * // TypeScript correctly sees { count: number; active: boolean }
116
+ *
117
+ * // Use in loader/action
118
+ * export const route = defineRoute('/api/items')
119
+ * .searchParams(schema)
120
+ * .loader(async ({ searchParams }) => {
121
+ * // searchParams.count is number, not string!
122
+ * return { items: await db.items.findMany({ take: searchParams.count }) };
123
+ * })
124
+ * .build();
125
+ * ```
126
+ */
127
+ export declare function ereoSchema<TOutput>(schema: ZodLikeSchema<TOutput>): EreoSchema<TOutput>;
128
+ /**
129
+ * Check if a value is an EreoSchema.
130
+ */
131
+ export declare function isEreoSchema<T>(value: unknown): value is EreoSchema<T>;
132
+ /**
133
+ * Extract the output type from a schema.
134
+ */
135
+ export type InferSchemaOutput<T> = T extends EreoSchema<infer O> ? O : T extends ZodLikeSchema<infer O> ? O : T extends ValidationSchema<unknown, infer O> ? O : never;
136
+ /**
137
+ * Extract the input type from a schema (before coercion/transform).
138
+ */
139
+ export type InferSchemaInput<T> = T extends ZodLikeSchema<unknown> ? T extends {
140
+ _input: infer I;
141
+ } ? I : unknown : unknown;
142
+ /**
143
+ * Schema for pagination search params.
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const schema = paginationSchema();
148
+ * // { page?: number; limit?: number; offset?: number }
149
+ *
150
+ * const schema = paginationSchema({ defaultLimit: 20, maxLimit: 100 });
151
+ * ```
152
+ */
153
+ export interface PaginationParams {
154
+ page?: number;
155
+ limit?: number;
156
+ offset?: number;
157
+ }
158
+ export interface PaginationSchemaOptions {
159
+ defaultPage?: number;
160
+ defaultLimit?: number;
161
+ maxLimit?: number;
162
+ }
163
+ /**
164
+ * Create a pagination schema with sensible defaults.
165
+ * Works with any Zod-compatible library.
166
+ */
167
+ export declare function createPaginationParser(options?: PaginationSchemaOptions): ValidationSchema<unknown, PaginationParams>;
168
+ /**
169
+ * Schema for sort search params.
170
+ *
171
+ * @example
172
+ * ```typescript
173
+ * const schema = sortSchema(['name', 'createdAt', 'updatedAt']);
174
+ * // { sortBy?: 'name' | 'createdAt' | 'updatedAt'; sortOrder?: 'asc' | 'desc' }
175
+ * ```
176
+ */
177
+ export interface SortParams<T extends string = string> {
178
+ sortBy?: T;
179
+ sortOrder?: 'asc' | 'desc';
180
+ }
181
+ export declare function createSortParser<T extends string>(allowedFields: T[], defaultField?: T, defaultOrder?: 'asc' | 'desc'): ValidationSchema<unknown, SortParams<T>>;
182
+ /**
183
+ * Schema for filter search params.
184
+ *
185
+ * @example
186
+ * ```typescript
187
+ * const schema = filterSchema({
188
+ * status: ['active', 'inactive', 'pending'],
189
+ * category: ['tech', 'business', 'lifestyle'],
190
+ * });
191
+ * ```
192
+ */
193
+ export interface FilterParams {
194
+ [key: string]: string | string[] | undefined;
195
+ }
196
+ export declare function createFilterParser<T extends Record<string, string[]>>(allowedFilters: T): ValidationSchema<unknown, {
197
+ [K in keyof T]?: T[K][number] | T[K][number][];
198
+ }>;
199
+ /**
200
+ * Parse a value as a boolean with fallback.
201
+ */
202
+ export declare function parseBoolean(value: unknown, fallback?: boolean): boolean;
203
+ /**
204
+ * Parse a value as a string array.
205
+ */
206
+ export declare function parseStringArray(value: unknown): string[];
207
+ /**
208
+ * Parse a value as a date.
209
+ */
210
+ export declare function parseDate(value: unknown, fallback?: Date): Date | undefined;
211
+ /**
212
+ * Parse a value as an enum member.
213
+ */
214
+ export declare function parseEnum<T extends string>(value: unknown, allowedValues: readonly T[], fallback?: T): T | undefined;
215
+ /**
216
+ * Simple schema builder for common use cases without Zod dependency.
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * const searchSchema = schemaBuilder()
221
+ * .string('q')
222
+ * .number('page', { default: 1 })
223
+ * .boolean('includeInactive')
224
+ * .enum('status', ['active', 'inactive', 'pending'])
225
+ * .build();
226
+ * ```
227
+ */
228
+ export declare function schemaBuilder(): SchemaBuilder<{}>;
229
+ interface SchemaBuilder<T> {
230
+ string<K extends string>(key: K, options?: {
231
+ default?: string;
232
+ optional?: boolean;
233
+ }): SchemaBuilder<T & {
234
+ [P in K]: string;
235
+ }>;
236
+ number<K extends string>(key: K, options?: {
237
+ default?: number;
238
+ min?: number;
239
+ max?: number;
240
+ }): SchemaBuilder<T & {
241
+ [P in K]: number;
242
+ }>;
243
+ boolean<K extends string>(key: K, options?: {
244
+ default?: boolean;
245
+ }): SchemaBuilder<T & {
246
+ [P in K]: boolean;
247
+ }>;
248
+ enum<K extends string, E extends string>(key: K, values: readonly E[], options?: {
249
+ default?: E;
250
+ }): SchemaBuilder<T & {
251
+ [P in K]: E;
252
+ }>;
253
+ array<K extends string>(key: K, options?: {
254
+ of?: 'string' | 'number';
255
+ }): SchemaBuilder<T & {
256
+ [P in K]: string[] | number[];
257
+ }>;
258
+ build(): ValidationSchema<unknown, T>;
259
+ }
260
+ export {};
261
+ //# sourceMappingURL=schema-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-adapters.d.ts","sourceRoot":"","sources":["../src/schema-adapters.ts"],"names":[],"mappings":"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"}