next-action-plus 1.0.1 → 1.0.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.
package/dist/index.js CHANGED
@@ -134,8 +134,10 @@ var ActionPlus = class _ActionPlus {
134
134
  normalizeIssues(error) {
135
135
  if (typeof error !== "object" || error === null) return [];
136
136
  const maybe = error;
137
- const rawIssues = maybe.errors ?? maybe.issues ?? [];
138
- return rawIssues.map((issue) => ({
137
+ const errorsCandidate = maybe.errors;
138
+ const issuesCandidate = maybe.issues;
139
+ const rawIssues = Array.isArray(errorsCandidate) ? errorsCandidate : Array.isArray(issuesCandidate) ? issuesCandidate : [];
140
+ return rawIssues.filter((issue) => typeof issue === "object" && issue !== null).map((issue) => ({
139
141
  path: this.normalizeIssuePath(issue.path),
140
142
  message: typeof issue.message === "string" ? issue.message : String(issue.message ?? ""),
141
143
  raw: issue
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/errors.ts","../src/types/schema/index.ts","../src/index.ts"],"sourcesContent":["export type TActionPlusIssuePathSegment = string | number;\r\n\r\nexport type TActionPlusIssue = {\r\n\tpath: TActionPlusIssuePathSegment[];\r\n\tmessage: string;\r\n\traw?: unknown;\r\n};\r\n\r\nexport type TActionPlusErrorCode = 'VALIDATION_ERROR' | 'MIDDLEWARE_ERROR' | 'HANDLER_ERROR' | 'ACTION_ERROR';\r\n\r\nexport type TActionPlusErrorPhase = 'validation' | 'middleware' | 'handler';\r\n\r\nexport type TActionPlusUnknownErrorContext = {\r\n\tphase: TActionPlusErrorPhase;\r\n\terror: unknown;\r\n\tinput?: unknown;\r\n\tparsedInput?: unknown;\r\n\tctx?: Record<string, unknown>;\r\n};\r\n\r\nexport type TActionPlusValidationErrorContext = TActionPlusUnknownErrorContext & {\r\n\tmessage: string;\r\n\tissues: TActionPlusIssue[];\r\n};\r\n\r\nexport type TActionPlusErrorContext = TActionPlusUnknownErrorContext | TActionPlusValidationErrorContext;\r\n\r\nexport type TActionPlusOptions = {\r\n\t/**\r\n\t * Control logging when an action throws.\r\n\t * - `false` disables logging.\r\n\t * - Defaults to `console`.\r\n\t */\r\n\tlogger?: false | { error: (...args: unknown[]) => void };\r\n\r\n\t/**\r\n\t * Hook called whenever an action throws (validation, middleware, or handler).\r\n\t */\r\n\tonError?: (ctx: TActionPlusErrorContext) => void;\r\n\r\n\t/**\r\n\t * Customize the thrown error when validation fails.\r\n\t * The returned Error will be thrown.\r\n\t */\r\n\tformatValidationError?: (ctx: TActionPlusValidationErrorContext) => Error;\r\n\r\n\t/**\r\n\t * Customize the thrown error for non-validation failures.\r\n\t * If omitted, the original error is re-thrown.\r\n\t */\r\n\tformatError?: (ctx: TActionPlusUnknownErrorContext) => Error;\r\n\r\n\t/**\r\n\t * When enabled, include `input`, `parsedInput`, and `ctx` in error details.\r\n\t * Off by default because it can accidentally expose sensitive data.\r\n\t */\r\n\tincludeInputInErrorDetails?: boolean;\r\n};\r\n\r\nexport class ActionPlusError extends Error {\r\n\tcode: TActionPlusErrorCode;\r\n\tphase?: TActionPlusErrorPhase;\r\n\tdata?: unknown;\r\n\tdeclare cause?: unknown;\r\n\r\n\tconstructor(\r\n\t\tmessage: string,\r\n\t\topts: {\r\n\t\t\tcode: TActionPlusErrorCode;\r\n\t\t\tphase?: TActionPlusErrorPhase;\r\n\t\t\tcause?: unknown;\r\n\t\t\tdata?: unknown;\r\n\t\t} = { code: 'ACTION_ERROR' },\r\n\t) {\r\n\t\tsuper(message, { cause: opts.cause });\r\n\t\tthis.name = 'ActionPlusError';\r\n\t\tthis.code = opts.code;\r\n\t\tthis.phase = opts.phase;\r\n\t\tthis.data = opts.data;\r\n\t\tthis.cause = opts.cause;\r\n\t}\r\n}\r\n\r\nexport class ActionPlusValidationError extends ActionPlusError {\r\n\tissues: TActionPlusIssue[];\r\n\r\n\tconstructor(\r\n\t\tmessage: string,\r\n\t\topts: {\r\n\t\t\tissues: TActionPlusIssue[];\r\n\t\t\tphase?: TActionPlusErrorPhase;\r\n\t\t\tcause?: unknown;\r\n\t\t\tdata?: unknown;\r\n\t\t},\r\n\t) {\r\n\t\tsuper(message, { code: 'VALIDATION_ERROR', phase: opts.phase, cause: opts.cause, data: opts.data });\r\n\t\tthis.name = 'ActionPlusValidationError';\r\n\t\tthis.issues = opts.issues;\r\n\t}\r\n}\r\n\r\nexport const isActionPlusError = (error: unknown): error is ActionPlusError => {\r\n\tif (typeof error !== 'object' || error === null) return false;\r\n\tif (!('code' in error)) return false;\r\n\tconst name = (error as { name?: unknown }).name;\r\n\treturn name === 'ActionPlusError' || name === 'ActionPlusValidationError';\r\n};\r\n\r\nexport const isActionPlusValidationError = (error: unknown): error is ActionPlusValidationError => {\r\n\treturn typeof error === 'object' && error !== null && 'issues' in error && (error as { name?: unknown }).name === 'ActionPlusValidationError';\r\n};\r\n","import type { z } from 'zod';\r\n\r\nimport type { TIfInstalled, TPrettify, TUnionToIntersection } from '../utils';\r\nimport type { TGenericSchema, TGenericSchemaAsync } from './generic';\r\nimport type { TStandardSchemaV1, TStandardSchemaV1InferInput, TStandardSchemaV1InferOutput } from './standard';\r\nimport type { TZodAcceptsFormData, TZodFormDataInput } from './zod';\r\n\r\nexport const schemaAvailable = ['zod', 'generic', 'genericAsync', 'standard'] as const;\r\nexport type TSchemaAvailable = (typeof schemaAvailable)[number];\r\n\r\nexport type TSchema = TIfInstalled<z.ZodTypeAny> | TIfInstalled<TGenericSchema> | TIfInstalled<TGenericSchemaAsync> | TStandardSchemaV1<any, any>;\r\n\r\nexport type TInfer<S extends TSchema> = S extends TIfInstalled<z.ZodTypeAny> ? z.infer<S> : S extends TIfInstalled<TGenericSchema> ? ReturnType<S['parse']> : S extends TIfInstalled<TGenericSchemaAsync> ? Awaited<ReturnType<S['parseAsync']>> : S extends TStandardSchemaV1<any, any> ? TStandardSchemaV1InferOutput<S> : never;\r\n\r\nexport type TInferIn<S extends TSchema> = S extends TIfInstalled<z.ZodTypeAny> ? z.input<S> : S extends TIfInstalled<TGenericSchema> ? Parameters<S['parse']>[0] : S extends TIfInstalled<TGenericSchemaAsync> ? Parameters<S['parseAsync']>[0] : S extends TStandardSchemaV1<any, any> ? TStandardSchemaV1InferInput<S> : never;\r\n\r\nexport type TInferArray<S extends readonly TSchema[]> = S extends readonly [infer First extends TSchema, ...infer Rest extends TSchema[]] ? [TInfer<First>, ...TInferArray<Rest>] : [];\r\n\r\nexport type TInferInArray<S extends readonly TSchema[]> = S extends readonly [infer First extends TSchema, ...infer Rest extends TSchema[]] ? [TInferIn<First>, ...TInferInArray<Rest>] : [];\r\n\r\nexport type TIsFormData<S extends TSchema> = S extends z.ZodTypeAny ? TZodAcceptsFormData<S> : S extends TStandardSchemaV1<infer Input, any> ? (FormData extends Input ? true : false) : false;\r\n\r\nexport type TFormDataInput<S extends TSchema> = S extends z.ZodTypeAny ? TZodFormDataInput<S> : S extends TStandardSchemaV1<infer Input, any> ? (FormData extends Input ? FormData | TInferIn<S> : TInferIn<S>) : TInferIn<S>;\r\n\r\nexport type TFormDataCompatibleInput<S extends readonly TSchema[]> = S extends readonly [infer First extends TSchema, ...infer Rest extends TSchema[]] ? (TIsFormData<First> extends true ? FormData : never) | TPrettify<TUnionToIntersection<TInferIn<First>>> | (Rest['length'] extends 0 ? never : TFormDataCompatibleInput<Rest>) : Record<string, never>;\r\n","import type { TActionPlusOptions, TActionPlusErrorPhase, TActionPlusIssue, TFormDataCompatibleInput, TFormDataInput, TInfer, TPrettify, TSchema, TMiddlewareFn, TUnionToIntersection } from './types';\r\nimport { ActionPlusValidationError } from './types';\r\n\r\nexport { schemaAvailable } from './types';\r\nexport { ActionPlusError, ActionPlusValidationError, isActionPlusError, isActionPlusValidationError } from './types';\r\nexport type * from './types';\r\n\r\n/**\r\n * Class that handles server actions with validation\r\n */\r\nexport class ActionPlus<Schemas extends TSchema[] = [], Ctx extends Record<string, unknown> = Record<string, never>, Middlewares extends readonly TMiddlewareFn<any, any>[] = []> {\r\n\tprivate schemas: Schemas;\r\n\tprivate middlewares: Middlewares;\r\n\tprivate ctx: Ctx;\r\n\tprivate options: TActionPlusOptions;\r\n\r\n\tconstructor(\r\n\t\toptions: {\r\n\t\t\tschemas?: Schemas;\r\n\t\t\tmiddlewares?: Middlewares;\r\n\t\t\tctx?: Ctx;\r\n\t\t\toptions?: TActionPlusOptions;\r\n\t\t} = {},\r\n\t) {\r\n\t\tthis.schemas = (options.schemas || []) as unknown as Schemas;\r\n\t\tthis.middlewares = (options.middlewares || []) as unknown as Middlewares;\r\n\t\tthis.ctx = (options.ctx || {}) as Ctx;\r\n\t\tthis.options = options.options ?? {};\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a validation schema\r\n\t * @param schema Validation schema\r\n\t */\r\n\tschema<S extends TSchema>(schema: S): ActionPlus<[...Schemas, S], Ctx, Middlewares> {\r\n\t\treturn new ActionPlus({\r\n\t\t\tschemas: [...this.schemas, schema] as unknown as [...Schemas, S],\r\n\t\t\tmiddlewares: this.middlewares,\r\n\t\t\tctx: this.ctx,\r\n\t\t\toptions: this.options,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a middleware function\r\n\t * @param middleware Middleware function\r\n\t */\r\n\tuse<NextCtx extends Record<string, unknown>>(middleware: TMiddlewareFn<Ctx, NextCtx>): ActionPlus<Schemas, Ctx & NextCtx, [...Middlewares, TMiddlewareFn<Ctx, NextCtx>]> {\r\n\t\treturn new ActionPlus({\r\n\t\t\tschemas: this.schemas,\r\n\t\t\tmiddlewares: [...this.middlewares, middleware] as unknown as [...Middlewares, TMiddlewareFn<Ctx, NextCtx>],\r\n\t\t\tctx: this.ctx as unknown as Ctx & NextCtx,\r\n\t\t\toptions: this.options,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an action with validation and middleware\r\n\t * @param handler Action handler function\r\n\t */\r\n\taction<Output>(handler: (props: { parsedInput: Schemas extends (infer S extends TSchema)[] ? TPrettify<TUnionToIntersection<TInfer<S>>> : Record<string, never>; ctx: TPrettify<Ctx> }) => Promise<Output>): (input?: Schemas extends [infer S extends TSchema] ? TFormDataInput<S> : Schemas extends (infer _S extends TSchema)[] ? TFormDataCompatibleInput<Schemas> : unknown) => Promise<Output> {\r\n\t\treturn async (input?: unknown): Promise<Output> => {\r\n\t\t\tlet phase: TActionPlusErrorPhase = 'validation';\r\n\t\t\tlet parsedInputForErrors: unknown = undefined;\r\n\t\t\tlet ctxForErrors: unknown = undefined;\r\n\r\n\t\t\ttry {\r\n\t\t\t\t// Validate input against all schemas\r\n\t\t\t\ttype ParsedInput = Schemas extends (infer S extends TSchema)[] ? TPrettify<TUnionToIntersection<TInfer<S>>> : Record<string, never>;\r\n\t\t\t\tphase = 'validation';\r\n\t\t\t\tconst parsedInput = (await this.validateInput(input)) as ParsedInput;\r\n\t\t\t\tparsedInputForErrors = parsedInput;\r\n\r\n\t\t\t\t// Run middleware chain\r\n\t\t\t\tphase = 'middleware';\r\n\t\t\t\tconst ctx = await this.runMiddlewareChain(parsedInput);\r\n\t\t\t\tctxForErrors = ctx;\r\n\r\n\t\t\t\t// Execute handler\r\n\t\t\t\tphase = 'handler';\r\n\t\t\t\treturn await handler({ parsedInput, ctx });\r\n\t\t\t} catch (error: unknown) {\r\n\t\t\t\tconst logger = this.options.logger === undefined ? console : this.options.logger;\r\n\t\t\t\tif (logger !== false) {\r\n\t\t\t\t\tlogger.error('Action error:', error);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst includeInput = this.options.includeInputInErrorDetails === true;\r\n\t\t\t\tconst baseContext = {\r\n\t\t\t\t\tphase,\r\n\t\t\t\t\terror,\r\n\t\t\t\t\tinput: includeInput ? input : undefined,\r\n\t\t\t\t\tparsedInput: includeInput ? parsedInputForErrors : undefined,\r\n\t\t\t\t\tctx: includeInput ? (ctxForErrors as Record<string, unknown> | undefined) : undefined,\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Handle validation errors\r\n\t\t\t\tif (this.isValidationError(error)) {\r\n\t\t\t\t\tconst { message, issues } = this.formatValidationErrorParts(error);\r\n\t\t\t\t\tconst validationContext = { ...baseContext, message, issues };\r\n\t\t\t\t\tthis.options.onError?.(validationContext);\r\n\r\n\t\t\t\t\tconst formatted =\r\n\t\t\t\t\t\tthis.options.formatValidationError?.(validationContext) ??\r\n\t\t\t\t\t\tnew ActionPlusValidationError(message, {\r\n\t\t\t\t\t\t\tissues,\r\n\t\t\t\t\t\t\tphase,\r\n\t\t\t\t\t\t\tcause: error,\r\n\t\t\t\t\t\t\tdata: includeInput ? { input, parsedInput: parsedInputForErrors, ctx: ctxForErrors } : undefined,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\tthrow formatted;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.options.onError?.(baseContext);\r\n\t\t\t\tconst maybeFormatted = this.options.formatError?.(baseContext);\r\n\t\t\t\tif (maybeFormatted) throw maybeFormatted;\r\n\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tprivate normalizeIssuePath(path: unknown): Array<string | number> {\r\n\t\tif (!Array.isArray(path)) return [];\r\n\t\treturn path.map(seg => {\r\n\t\t\tif (typeof seg === 'string' || typeof seg === 'number') return seg;\r\n\t\t\tif (typeof seg === 'object' && seg !== null && 'key' in (seg as Record<string, unknown>)) {\r\n\t\t\t\tconst key = (seg as { key: unknown }).key;\r\n\t\t\t\tif (typeof key === 'string' || typeof key === 'number') return key;\r\n\t\t\t\treturn String(key);\r\n\t\t\t}\r\n\t\t\treturn String(seg);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate normalizeIssues(error: unknown): TActionPlusIssue[] {\r\n\t\tif (typeof error !== 'object' || error === null) return [];\r\n\r\n\t\tconst maybe = error as {\r\n\t\t\terrors?: Array<{ path?: unknown; message?: unknown }>;\r\n\t\t\tissues?: Array<{ path?: unknown; message?: unknown }>;\r\n\t\t};\r\n\r\n\t\tconst rawIssues = (maybe.errors ?? maybe.issues ?? []) as Array<{ path?: unknown; message?: unknown }>;\r\n\t\treturn rawIssues.map(issue => ({\r\n\t\t\tpath: this.normalizeIssuePath(issue.path),\r\n\t\t\tmessage: typeof issue.message === 'string' ? issue.message : String(issue.message ?? ''),\r\n\t\t\traw: issue,\r\n\t\t}));\r\n\t}\r\n\r\n\tprivate formatValidationErrorParts(error: unknown): { message: string; issues: TActionPlusIssue[] } {\r\n\t\tconst issues = this.normalizeIssues(error);\r\n\t\tconst first = issues[0];\r\n\t\tif (!first) {\r\n\t\t\treturn { message: `Validation error: ${String(error)}`, issues: [] };\r\n\t\t}\r\n\r\n\t\tconst fieldPath = first.path.length ? first.path.join('.') : 'unknown';\r\n\t\tconst message = first.message || String(error);\r\n\t\treturn { message: `Input (${fieldPath}) is error: ${message}`, issues };\r\n\t}\r\n\r\n\tprivate async validateInput(input: unknown): Promise<unknown> {\r\n\t\tif (!this.schemas.length) return input;\r\n\r\n\t\t// zod-form-data uses `z.preprocess` and accepts FormData/URLSearchParams at runtime.\r\n\t\t// If the incoming input is FormData, try to find a single schema that can parse it into a\r\n\t\t// regular object first (regardless of ordering). Then validate *all* remaining schemas\r\n\t\t// against the same base input so schemas can validate different slices reliably.\r\n\t\tconst schemasToRun = [...this.schemas];\r\n\t\tlet baseInput: unknown = input;\r\n\r\n\t\tif (input instanceof FormData) {\r\n\t\t\tfor (let i = 0; i < schemasToRun.length; i++) {\r\n\t\t\t\tconst candidate = schemasToRun[i];\r\n\t\t\t\tconst parsed = await this.tryParseSchema(candidate, input);\r\n\t\t\t\tif (!parsed.ok) continue;\r\n\r\n\t\t\t\tschemasToRun.splice(i, 1);\r\n\t\t\t\tbaseInput = parsed.value;\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If a FormData schema consumed the input and there are no schemas left,\r\n\t\t// the parsed base input is the validated result.\r\n\t\tif (schemasToRun.length === 0) {\r\n\t\t\treturn baseInput;\r\n\t\t}\r\n\r\n\t\t// Single schema: return parsed value directly.\r\n\t\tif (schemasToRun.length === 1) {\r\n\t\t\treturn await this.parseSchema(schemasToRun[0] as TSchema, baseInput);\r\n\t\t}\r\n\r\n\t\tlet mergedObject: Record<string, unknown> | undefined;\r\n\t\tlet lastNonObject: unknown = undefined;\r\n\r\n\t\tfor (const schema of schemasToRun) {\r\n\t\t\tconst parsed = await this.parseSchema(schema, baseInput);\r\n\t\t\tif (this.isPlainObject(parsed)) {\r\n\t\t\t\tmergedObject = { ...(mergedObject ?? {}), ...(parsed as Record<string, unknown>) };\r\n\t\t\t} else {\r\n\t\t\t\tlastNonObject = parsed;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn mergedObject ?? lastNonObject;\r\n\t}\r\n\r\n\tprivate isPlainObject(value: unknown): value is Record<string, unknown> {\r\n\t\treturn typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);\r\n\t}\r\n\r\n\tprivate async parseSchema(schema: TSchema, input: unknown): Promise<unknown> {\r\n\t\tif (schema && typeof schema === 'object') {\r\n\t\t\tconst maybeAsync = (schema as { parseAsync?: unknown }).parseAsync;\r\n\t\t\tif (typeof maybeAsync === 'function') {\r\n\t\t\t\treturn await (schema as { parseAsync: (i: unknown) => Promise<unknown> }).parseAsync(input);\r\n\t\t\t}\r\n\t\t\tconst maybeSync = (schema as { parse?: unknown }).parse;\r\n\t\t\tif (typeof maybeSync === 'function') {\r\n\t\t\t\treturn (schema as { parse: (i: unknown) => unknown }).parse(input);\r\n\t\t\t}\r\n\r\n\t\t\t// Standard Schema v1 support.\r\n\t\t\t// Note: Zod v3+ exposes a `~standard` adapter too, but we prefer Zod's native parse/parseAsync\r\n\t\t\t// when available so validation failures produce a real `ZodError`.\r\n\t\t\tconst maybeStandard = (schema as { '~standard'?: unknown })['~standard'];\r\n\t\t\tif (maybeStandard && typeof maybeStandard === 'object') {\r\n\t\t\t\tconst validate = (maybeStandard as { validate?: unknown }).validate;\r\n\t\t\t\tif (typeof validate === 'function') {\r\n\t\t\t\t\tconst result = await (validate as (v: unknown) => unknown)(input);\r\n\t\t\t\t\tif (result && typeof result === 'object' && 'issues' in result) {\r\n\t\t\t\t\t\tconst err = new Error('Validation error');\r\n\t\t\t\t\t\t(err as unknown as { issues: unknown }).issues = (result as { issues: unknown }).issues;\r\n\t\t\t\t\t\tthrow err;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (result && typeof result === 'object' && 'value' in result) {\r\n\t\t\t\t\t\treturn (result as { value: unknown }).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthrow new Error('Unsupported schema type');\r\n\t}\r\n\r\n\tprivate async tryParseSchema(schema: TSchema, input: unknown): Promise<{ ok: true; value: unknown } | { ok: false }> {\r\n\t\ttry {\r\n\t\t\tif (schema && typeof schema === 'object') {\r\n\t\t\t\tconst safeAsync = (schema as { safeParseAsync?: unknown }).safeParseAsync;\r\n\t\t\t\tif (typeof safeAsync === 'function') {\r\n\t\t\t\t\tconst res = await (\r\n\t\t\t\t\t\tschema as {\r\n\t\t\t\t\t\t\tsafeParseAsync: (i: unknown) => Promise<{ success: boolean; data?: unknown }>;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t).safeParseAsync(input);\r\n\t\t\t\t\treturn res.success ? { ok: true, value: res.data } : { ok: false };\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst safeSync = (schema as { safeParse?: unknown }).safeParse;\r\n\t\t\t\tif (typeof safeSync === 'function') {\r\n\t\t\t\t\tconst res = (schema as { safeParse: (i: unknown) => { success: boolean; data?: unknown } }).safeParse(input);\r\n\t\t\t\t\treturn res.success ? { ok: true, value: res.data } : { ok: false };\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Standard Schema v1 support.\r\n\t\t\t\tconst maybeStandard = (schema as { '~standard'?: unknown })['~standard'];\r\n\t\t\t\tif (maybeStandard && typeof maybeStandard === 'object') {\r\n\t\t\t\t\tconst validate = (maybeStandard as { validate?: unknown }).validate;\r\n\t\t\t\t\tif (typeof validate === 'function') {\r\n\t\t\t\t\t\tconst result = await (validate as (v: unknown) => unknown)(input);\r\n\t\t\t\t\t\tif (result && typeof result === 'object' && 'issues' in result) return { ok: false };\r\n\t\t\t\t\t\tif (result && typeof result === 'object' && 'value' in result) return { ok: true, value: (result as { value: unknown }).value };\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Fallback to throwing parse.\r\n\t\t\treturn { ok: true, value: await this.parseSchema(schema, input) };\r\n\t\t} catch {\r\n\t\t\treturn { ok: false };\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async runMiddlewareChain(input: unknown): Promise<Ctx> {\r\n\t\tlet ctx = { ...(this.ctx as Record<string, unknown>) } as Ctx;\r\n\t\tlet currentIndex = 0;\r\n\t\tconst middlewares = this.middlewares as unknown as readonly TMiddlewareFn<any, any>[];\r\n\r\n\t\tconst runNext = async <NC extends Record<string, unknown> = Record<string, never>>(options?: { ctx?: NC }): Promise<Ctx & NC> => {\r\n\t\t\tif (options?.ctx) {\r\n\t\t\t\tctx = { ...ctx, ...options.ctx } as Ctx;\r\n\t\t\t}\r\n\r\n\t\t\tif (currentIndex < middlewares.length) {\r\n\t\t\t\tconst middleware = middlewares[currentIndex] as TMiddlewareFn<any, any>;\r\n\t\t\t\tcurrentIndex++;\r\n\r\n\t\t\t\treturn (await middleware({\r\n\t\t\t\t\tinput,\r\n\t\t\t\t\tctx: Object.freeze({ ...ctx }),\r\n\t\t\t\t\tnext: runNext,\r\n\t\t\t\t})) as Ctx & NC;\r\n\t\t\t}\r\n\r\n\t\t\treturn ctx as Ctx & NC;\r\n\t\t};\r\n\r\n\t\treturn await runNext();\r\n\t}\r\n\r\n\tprivate isValidationError(error: unknown): boolean {\r\n\t\tif (typeof error !== 'object' || error === null) return false;\r\n\r\n\t\tif ('name' in error) {\r\n\t\t\tconst errName = (error as { name: string }).name;\r\n\t\t\tif (errName === 'ZodError' || errName.includes('ValidationError')) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn 'errors' in error || 'issues' in error;\r\n\t}\r\n}\r\n\r\n/**\r\n * Creates an ActionPlus client that handles validation and execution of server actions\r\n */\r\nexport const createActionPlus = (options?: TActionPlusOptions) => {\r\n\treturn new ActionPlus({ options });\r\n};\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/types/errors.ts","../src/types/schema/index.ts","../src/index.ts"],"sourcesContent":["export type TActionPlusIssuePathSegment = string | number;\r\n\r\nexport type TActionPlusIssue = {\r\n\tpath: TActionPlusIssuePathSegment[];\r\n\tmessage: string;\r\n\traw?: unknown;\r\n};\r\n\r\nexport type TActionPlusErrorCode = 'VALIDATION_ERROR' | 'MIDDLEWARE_ERROR' | 'HANDLER_ERROR' | 'ACTION_ERROR';\r\n\r\nexport type TActionPlusErrorPhase = 'validation' | 'middleware' | 'handler';\r\n\r\nexport type TActionPlusUnknownErrorContext = {\r\n\tphase: TActionPlusErrorPhase;\r\n\terror: unknown;\r\n\tinput?: unknown;\r\n\tparsedInput?: unknown;\r\n\tctx?: Record<string, unknown>;\r\n};\r\n\r\nexport type TActionPlusValidationErrorContext = TActionPlusUnknownErrorContext & {\r\n\tmessage: string;\r\n\tissues: TActionPlusIssue[];\r\n};\r\n\r\nexport type TActionPlusErrorContext = TActionPlusUnknownErrorContext | TActionPlusValidationErrorContext;\r\n\r\nexport type TActionPlusOptions = {\r\n\t/**\r\n\t * Control logging when an action throws.\r\n\t * - `false` disables logging.\r\n\t * - Defaults to `console`.\r\n\t */\r\n\tlogger?: false | { error: (...args: unknown[]) => void };\r\n\r\n\t/**\r\n\t * Hook called whenever an action throws (validation, middleware, or handler).\r\n\t */\r\n\tonError?: (ctx: TActionPlusErrorContext) => void;\r\n\r\n\t/**\r\n\t * Customize the thrown error when validation fails.\r\n\t * The returned Error will be thrown.\r\n\t */\r\n\tformatValidationError?: (ctx: TActionPlusValidationErrorContext) => Error;\r\n\r\n\t/**\r\n\t * Customize the thrown error for non-validation failures.\r\n\t * If omitted, the original error is re-thrown.\r\n\t */\r\n\tformatError?: (ctx: TActionPlusUnknownErrorContext) => Error;\r\n\r\n\t/**\r\n\t * When enabled, include `input`, `parsedInput`, and `ctx` in error details.\r\n\t * Off by default because it can accidentally expose sensitive data.\r\n\t */\r\n\tincludeInputInErrorDetails?: boolean;\r\n};\r\n\r\nexport class ActionPlusError extends Error {\r\n\tcode: TActionPlusErrorCode;\r\n\tphase?: TActionPlusErrorPhase;\r\n\tdata?: unknown;\r\n\tdeclare cause?: unknown;\r\n\r\n\tconstructor(\r\n\t\tmessage: string,\r\n\t\topts: {\r\n\t\t\tcode: TActionPlusErrorCode;\r\n\t\t\tphase?: TActionPlusErrorPhase;\r\n\t\t\tcause?: unknown;\r\n\t\t\tdata?: unknown;\r\n\t\t} = { code: 'ACTION_ERROR' },\r\n\t) {\r\n\t\tsuper(message, { cause: opts.cause });\r\n\t\tthis.name = 'ActionPlusError';\r\n\t\tthis.code = opts.code;\r\n\t\tthis.phase = opts.phase;\r\n\t\tthis.data = opts.data;\r\n\t\tthis.cause = opts.cause;\r\n\t}\r\n}\r\n\r\nexport class ActionPlusValidationError extends ActionPlusError {\r\n\tissues: TActionPlusIssue[];\r\n\r\n\tconstructor(\r\n\t\tmessage: string,\r\n\t\topts: {\r\n\t\t\tissues: TActionPlusIssue[];\r\n\t\t\tphase?: TActionPlusErrorPhase;\r\n\t\t\tcause?: unknown;\r\n\t\t\tdata?: unknown;\r\n\t\t},\r\n\t) {\r\n\t\tsuper(message, { code: 'VALIDATION_ERROR', phase: opts.phase, cause: opts.cause, data: opts.data });\r\n\t\tthis.name = 'ActionPlusValidationError';\r\n\t\tthis.issues = opts.issues;\r\n\t}\r\n}\r\n\r\nexport const isActionPlusError = (error: unknown): error is ActionPlusError => {\r\n\tif (typeof error !== 'object' || error === null) return false;\r\n\tif (!('code' in error)) return false;\r\n\tconst name = (error as { name?: unknown }).name;\r\n\treturn name === 'ActionPlusError' || name === 'ActionPlusValidationError';\r\n};\r\n\r\nexport const isActionPlusValidationError = (error: unknown): error is ActionPlusValidationError => {\r\n\treturn typeof error === 'object' && error !== null && 'issues' in error && (error as { name?: unknown }).name === 'ActionPlusValidationError';\r\n};\r\n","import type { z } from 'zod';\r\n\r\nimport type { TIfInstalled, TPrettify, TUnionToIntersection } from '../utils';\r\nimport type { TGenericSchema, TGenericSchemaAsync } from './generic';\r\nimport type { TStandardSchemaV1, TStandardSchemaV1InferInput, TStandardSchemaV1InferOutput } from './standard';\r\nimport type { TZodAcceptsFormData, TZodFormDataInput } from './zod';\r\n\r\nexport const schemaAvailable = ['zod', 'generic', 'genericAsync', 'standard'] as const;\r\nexport type TSchemaAvailable = (typeof schemaAvailable)[number];\r\n\r\nexport type TSchema = TIfInstalled<z.ZodTypeAny> | TIfInstalled<TGenericSchema> | TIfInstalled<TGenericSchemaAsync> | TStandardSchemaV1<any, any>;\r\n\r\nexport type TInfer<S extends TSchema> = S extends TIfInstalled<z.ZodTypeAny> ? z.infer<S> : S extends TIfInstalled<TGenericSchema> ? ReturnType<S['parse']> : S extends TIfInstalled<TGenericSchemaAsync> ? Awaited<ReturnType<S['parseAsync']>> : S extends TStandardSchemaV1<any, any> ? TStandardSchemaV1InferOutput<S> : never;\r\n\r\nexport type TInferIn<S extends TSchema> = S extends TIfInstalled<z.ZodTypeAny> ? z.input<S> : S extends TIfInstalled<TGenericSchema> ? Parameters<S['parse']>[0] : S extends TIfInstalled<TGenericSchemaAsync> ? Parameters<S['parseAsync']>[0] : S extends TStandardSchemaV1<any, any> ? TStandardSchemaV1InferInput<S> : never;\r\n\r\nexport type TInferArray<S extends readonly TSchema[]> = S extends readonly [infer First extends TSchema, ...infer Rest extends TSchema[]] ? [TInfer<First>, ...TInferArray<Rest>] : [];\r\n\r\nexport type TInferInArray<S extends readonly TSchema[]> = S extends readonly [infer First extends TSchema, ...infer Rest extends TSchema[]] ? [TInferIn<First>, ...TInferInArray<Rest>] : [];\r\n\r\nexport type TIsFormData<S extends TSchema> = S extends z.ZodTypeAny ? TZodAcceptsFormData<S> : S extends TStandardSchemaV1<infer Input, any> ? (FormData extends Input ? true : false) : false;\r\n\r\nexport type TFormDataInput<S extends TSchema> = S extends z.ZodTypeAny ? TZodFormDataInput<S> : S extends TStandardSchemaV1<infer Input, any> ? (FormData extends Input ? FormData | TInferIn<S> : TInferIn<S>) : TInferIn<S>;\r\n\r\nexport type TFormDataCompatibleInput<S extends readonly TSchema[]> = S extends readonly [infer First extends TSchema, ...infer Rest extends TSchema[]] ? (TIsFormData<First> extends true ? FormData : never) | TPrettify<TUnionToIntersection<TInferIn<First>>> | (Rest['length'] extends 0 ? never : TFormDataCompatibleInput<Rest>) : Record<string, never>;\r\n","import type { TActionPlusOptions, TActionPlusErrorPhase, TActionPlusIssue, TFormDataCompatibleInput, TFormDataInput, TInfer, TPrettify, TSchema, TMiddlewareFn, TUnionToIntersection } from './types';\r\nimport { ActionPlusValidationError } from './types';\r\n\r\nexport { schemaAvailable } from './types';\r\nexport { ActionPlusError, ActionPlusValidationError, isActionPlusError, isActionPlusValidationError } from './types';\r\nexport type * from './types';\r\n\r\n/**\r\n * Class that handles server actions with validation\r\n */\r\nexport class ActionPlus<Schemas extends TSchema[] = [], Ctx extends Record<string, unknown> = Record<string, never>, Middlewares extends readonly TMiddlewareFn<any, any>[] = []> {\r\n\tprivate schemas: Schemas;\r\n\tprivate middlewares: Middlewares;\r\n\tprivate ctx: Ctx;\r\n\tprivate options: TActionPlusOptions;\r\n\r\n\tconstructor(\r\n\t\toptions: {\r\n\t\t\tschemas?: Schemas;\r\n\t\t\tmiddlewares?: Middlewares;\r\n\t\t\tctx?: Ctx;\r\n\t\t\toptions?: TActionPlusOptions;\r\n\t\t} = {},\r\n\t) {\r\n\t\tthis.schemas = (options.schemas || []) as unknown as Schemas;\r\n\t\tthis.middlewares = (options.middlewares || []) as unknown as Middlewares;\r\n\t\tthis.ctx = (options.ctx || {}) as Ctx;\r\n\t\tthis.options = options.options ?? {};\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a validation schema\r\n\t * @param schema Validation schema\r\n\t */\r\n\tschema<S extends TSchema>(schema: S): ActionPlus<[...Schemas, S], Ctx, Middlewares> {\r\n\t\treturn new ActionPlus({\r\n\t\t\tschemas: [...this.schemas, schema] as unknown as [...Schemas, S],\r\n\t\t\tmiddlewares: this.middlewares,\r\n\t\t\tctx: this.ctx,\r\n\t\t\toptions: this.options,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Adds a middleware function\r\n\t * @param middleware Middleware function\r\n\t */\r\n\tuse<NextCtx extends Record<string, unknown>>(middleware: TMiddlewareFn<Ctx, NextCtx>): ActionPlus<Schemas, Ctx & NextCtx, [...Middlewares, TMiddlewareFn<Ctx, NextCtx>]> {\r\n\t\treturn new ActionPlus({\r\n\t\t\tschemas: this.schemas,\r\n\t\t\tmiddlewares: [...this.middlewares, middleware] as unknown as [...Middlewares, TMiddlewareFn<Ctx, NextCtx>],\r\n\t\t\tctx: this.ctx as unknown as Ctx & NextCtx,\r\n\t\t\toptions: this.options,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an action with validation and middleware\r\n\t * @param handler Action handler function\r\n\t */\r\n\taction<Output>(handler: (props: { parsedInput: Schemas extends (infer S extends TSchema)[] ? TPrettify<TUnionToIntersection<TInfer<S>>> : Record<string, never>; ctx: TPrettify<Ctx> }) => Promise<Output>): (input?: Schemas extends [infer S extends TSchema] ? TFormDataInput<S> : Schemas extends (infer _S extends TSchema)[] ? TFormDataCompatibleInput<Schemas> : unknown) => Promise<Output> {\r\n\t\treturn async (input?: unknown): Promise<Output> => {\r\n\t\t\tlet phase: TActionPlusErrorPhase = 'validation';\r\n\t\t\tlet parsedInputForErrors: unknown = undefined;\r\n\t\t\tlet ctxForErrors: unknown = undefined;\r\n\r\n\t\t\ttry {\r\n\t\t\t\t// Validate input against all schemas\r\n\t\t\t\ttype ParsedInput = Schemas extends (infer S extends TSchema)[] ? TPrettify<TUnionToIntersection<TInfer<S>>> : Record<string, never>;\r\n\t\t\t\tphase = 'validation';\r\n\t\t\t\tconst parsedInput = (await this.validateInput(input)) as ParsedInput;\r\n\t\t\t\tparsedInputForErrors = parsedInput;\r\n\r\n\t\t\t\t// Run middleware chain\r\n\t\t\t\tphase = 'middleware';\r\n\t\t\t\tconst ctx = await this.runMiddlewareChain(parsedInput);\r\n\t\t\t\tctxForErrors = ctx;\r\n\r\n\t\t\t\t// Execute handler\r\n\t\t\t\tphase = 'handler';\r\n\t\t\t\treturn await handler({ parsedInput, ctx });\r\n\t\t\t} catch (error: unknown) {\r\n\t\t\t\tconst logger = this.options.logger === undefined ? console : this.options.logger;\r\n\t\t\t\tif (logger !== false) {\r\n\t\t\t\t\tlogger.error('Action error:', error);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst includeInput = this.options.includeInputInErrorDetails === true;\r\n\t\t\t\tconst baseContext = {\r\n\t\t\t\t\tphase,\r\n\t\t\t\t\terror,\r\n\t\t\t\t\tinput: includeInput ? input : undefined,\r\n\t\t\t\t\tparsedInput: includeInput ? parsedInputForErrors : undefined,\r\n\t\t\t\t\tctx: includeInput ? (ctxForErrors as Record<string, unknown> | undefined) : undefined,\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Handle validation errors\r\n\t\t\t\tif (this.isValidationError(error)) {\r\n\t\t\t\t\tconst { message, issues } = this.formatValidationErrorParts(error);\r\n\t\t\t\t\tconst validationContext = { ...baseContext, message, issues };\r\n\t\t\t\t\tthis.options.onError?.(validationContext);\r\n\r\n\t\t\t\t\tconst formatted =\r\n\t\t\t\t\t\tthis.options.formatValidationError?.(validationContext) ??\r\n\t\t\t\t\t\tnew ActionPlusValidationError(message, {\r\n\t\t\t\t\t\t\tissues,\r\n\t\t\t\t\t\t\tphase,\r\n\t\t\t\t\t\t\tcause: error,\r\n\t\t\t\t\t\t\tdata: includeInput ? { input, parsedInput: parsedInputForErrors, ctx: ctxForErrors } : undefined,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\tthrow formatted;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.options.onError?.(baseContext);\r\n\t\t\t\tconst maybeFormatted = this.options.formatError?.(baseContext);\r\n\t\t\t\tif (maybeFormatted) throw maybeFormatted;\r\n\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tprivate normalizeIssuePath(path: unknown): Array<string | number> {\r\n\t\tif (!Array.isArray(path)) return [];\r\n\t\treturn path.map(seg => {\r\n\t\t\tif (typeof seg === 'string' || typeof seg === 'number') return seg;\r\n\t\t\tif (typeof seg === 'object' && seg !== null && 'key' in (seg as Record<string, unknown>)) {\r\n\t\t\t\tconst key = (seg as { key: unknown }).key;\r\n\t\t\t\tif (typeof key === 'string' || typeof key === 'number') return key;\r\n\t\t\t\treturn String(key);\r\n\t\t\t}\r\n\t\t\treturn String(seg);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate normalizeIssues(error: unknown): TActionPlusIssue[] {\r\n\t\tif (typeof error !== 'object' || error === null) return [];\r\n\r\n\t\tconst maybe = error as {\r\n\t\t\terrors?: unknown;\r\n\t\t\tissues?: unknown;\r\n\t\t};\r\n\r\n\t\tconst errorsCandidate = maybe.errors;\r\n\t\tconst issuesCandidate = maybe.issues;\r\n\t\tconst rawIssues = (Array.isArray(errorsCandidate) ? errorsCandidate : Array.isArray(issuesCandidate) ? issuesCandidate : []) as unknown[];\r\n\t\treturn rawIssues\r\n\t\t\t.filter((issue): issue is Record<string, unknown> => typeof issue === 'object' && issue !== null)\r\n\t\t\t.map(issue => ({\r\n\t\t\t\tpath: this.normalizeIssuePath(issue.path),\r\n\t\t\t\tmessage: typeof issue.message === 'string' ? issue.message : String(issue.message ?? ''),\r\n\t\t\t\traw: issue,\r\n\t\t\t}));\r\n\t}\r\n\r\n\tprivate formatValidationErrorParts(error: unknown): { message: string; issues: TActionPlusIssue[] } {\r\n\t\tconst issues = this.normalizeIssues(error);\r\n\t\tconst first = issues[0];\r\n\t\tif (!first) {\r\n\t\t\treturn { message: `Validation error: ${String(error)}`, issues: [] };\r\n\t\t}\r\n\r\n\t\tconst fieldPath = first.path.length ? first.path.join('.') : 'unknown';\r\n\t\tconst message = first.message || String(error);\r\n\t\treturn { message: `Input (${fieldPath}) is error: ${message}`, issues };\r\n\t}\r\n\r\n\tprivate async validateInput(input: unknown): Promise<unknown> {\r\n\t\tif (!this.schemas.length) return input;\r\n\r\n\t\t// zod-form-data uses `z.preprocess` and accepts FormData/URLSearchParams at runtime.\r\n\t\t// If the incoming input is FormData, try to find a single schema that can parse it into a\r\n\t\t// regular object first (regardless of ordering). Then validate *all* remaining schemas\r\n\t\t// against the same base input so schemas can validate different slices reliably.\r\n\t\tconst schemasToRun = [...this.schemas];\r\n\t\tlet baseInput: unknown = input;\r\n\r\n\t\tif (input instanceof FormData) {\r\n\t\t\tfor (let i = 0; i < schemasToRun.length; i++) {\r\n\t\t\t\tconst candidate = schemasToRun[i];\r\n\t\t\t\tconst parsed = await this.tryParseSchema(candidate, input);\r\n\t\t\t\tif (!parsed.ok) continue;\r\n\r\n\t\t\t\tschemasToRun.splice(i, 1);\r\n\t\t\t\tbaseInput = parsed.value;\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If a FormData schema consumed the input and there are no schemas left,\r\n\t\t// the parsed base input is the validated result.\r\n\t\tif (schemasToRun.length === 0) {\r\n\t\t\treturn baseInput;\r\n\t\t}\r\n\r\n\t\t// Single schema: return parsed value directly.\r\n\t\tif (schemasToRun.length === 1) {\r\n\t\t\treturn await this.parseSchema(schemasToRun[0] as TSchema, baseInput);\r\n\t\t}\r\n\r\n\t\tlet mergedObject: Record<string, unknown> | undefined;\r\n\t\tlet lastNonObject: unknown = undefined;\r\n\r\n\t\tfor (const schema of schemasToRun) {\r\n\t\t\tconst parsed = await this.parseSchema(schema, baseInput);\r\n\t\t\tif (this.isPlainObject(parsed)) {\r\n\t\t\t\tmergedObject = { ...(mergedObject ?? {}), ...(parsed as Record<string, unknown>) };\r\n\t\t\t} else {\r\n\t\t\t\tlastNonObject = parsed;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn mergedObject ?? lastNonObject;\r\n\t}\r\n\r\n\tprivate isPlainObject(value: unknown): value is Record<string, unknown> {\r\n\t\treturn typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);\r\n\t}\r\n\r\n\tprivate async parseSchema(schema: TSchema, input: unknown): Promise<unknown> {\r\n\t\tif (schema && typeof schema === 'object') {\r\n\t\t\tconst maybeAsync = (schema as { parseAsync?: unknown }).parseAsync;\r\n\t\t\tif (typeof maybeAsync === 'function') {\r\n\t\t\t\treturn await (schema as { parseAsync: (i: unknown) => Promise<unknown> }).parseAsync(input);\r\n\t\t\t}\r\n\t\t\tconst maybeSync = (schema as { parse?: unknown }).parse;\r\n\t\t\tif (typeof maybeSync === 'function') {\r\n\t\t\t\treturn (schema as { parse: (i: unknown) => unknown }).parse(input);\r\n\t\t\t}\r\n\r\n\t\t\t// Standard Schema v1 support.\r\n\t\t\t// Note: Zod v3+ exposes a `~standard` adapter too, but we prefer Zod's native parse/parseAsync\r\n\t\t\t// when available so validation failures produce a real `ZodError`.\r\n\t\t\tconst maybeStandard = (schema as { '~standard'?: unknown })['~standard'];\r\n\t\t\tif (maybeStandard && typeof maybeStandard === 'object') {\r\n\t\t\t\tconst validate = (maybeStandard as { validate?: unknown }).validate;\r\n\t\t\t\tif (typeof validate === 'function') {\r\n\t\t\t\t\tconst result = await (validate as (v: unknown) => unknown)(input);\r\n\t\t\t\t\tif (result && typeof result === 'object' && 'issues' in result) {\r\n\t\t\t\t\t\tconst err = new Error('Validation error');\r\n\t\t\t\t\t\t(err as unknown as { issues: unknown }).issues = (result as { issues: unknown }).issues;\r\n\t\t\t\t\t\tthrow err;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (result && typeof result === 'object' && 'value' in result) {\r\n\t\t\t\t\t\treturn (result as { value: unknown }).value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthrow new Error('Unsupported schema type');\r\n\t}\r\n\r\n\tprivate async tryParseSchema(schema: TSchema, input: unknown): Promise<{ ok: true; value: unknown } | { ok: false }> {\r\n\t\ttry {\r\n\t\t\tif (schema && typeof schema === 'object') {\r\n\t\t\t\tconst safeAsync = (schema as { safeParseAsync?: unknown }).safeParseAsync;\r\n\t\t\t\tif (typeof safeAsync === 'function') {\r\n\t\t\t\t\tconst res = await (\r\n\t\t\t\t\t\tschema as {\r\n\t\t\t\t\t\t\tsafeParseAsync: (i: unknown) => Promise<{ success: boolean; data?: unknown }>;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t).safeParseAsync(input);\r\n\t\t\t\t\treturn res.success ? { ok: true, value: res.data } : { ok: false };\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst safeSync = (schema as { safeParse?: unknown }).safeParse;\r\n\t\t\t\tif (typeof safeSync === 'function') {\r\n\t\t\t\t\tconst res = (schema as { safeParse: (i: unknown) => { success: boolean; data?: unknown } }).safeParse(input);\r\n\t\t\t\t\treturn res.success ? { ok: true, value: res.data } : { ok: false };\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Standard Schema v1 support.\r\n\t\t\t\tconst maybeStandard = (schema as { '~standard'?: unknown })['~standard'];\r\n\t\t\t\tif (maybeStandard && typeof maybeStandard === 'object') {\r\n\t\t\t\t\tconst validate = (maybeStandard as { validate?: unknown }).validate;\r\n\t\t\t\t\tif (typeof validate === 'function') {\r\n\t\t\t\t\t\tconst result = await (validate as (v: unknown) => unknown)(input);\r\n\t\t\t\t\t\tif (result && typeof result === 'object' && 'issues' in result) return { ok: false };\r\n\t\t\t\t\t\tif (result && typeof result === 'object' && 'value' in result) return { ok: true, value: (result as { value: unknown }).value };\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Fallback to throwing parse.\r\n\t\t\treturn { ok: true, value: await this.parseSchema(schema, input) };\r\n\t\t} catch {\r\n\t\t\treturn { ok: false };\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async runMiddlewareChain(input: unknown): Promise<Ctx> {\r\n\t\tlet ctx = { ...(this.ctx as Record<string, unknown>) } as Ctx;\r\n\t\tlet currentIndex = 0;\r\n\t\tconst middlewares = this.middlewares as unknown as readonly TMiddlewareFn<any, any>[];\r\n\r\n\t\tconst runNext = async <NC extends Record<string, unknown> = Record<string, never>>(options?: { ctx?: NC }): Promise<Ctx & NC> => {\r\n\t\t\tif (options?.ctx) {\r\n\t\t\t\tctx = { ...ctx, ...options.ctx } as Ctx;\r\n\t\t\t}\r\n\r\n\t\t\tif (currentIndex < middlewares.length) {\r\n\t\t\t\tconst middleware = middlewares[currentIndex] as TMiddlewareFn<any, any>;\r\n\t\t\t\tcurrentIndex++;\r\n\r\n\t\t\t\treturn (await middleware({\r\n\t\t\t\t\tinput,\r\n\t\t\t\t\tctx: Object.freeze({ ...ctx }),\r\n\t\t\t\t\tnext: runNext,\r\n\t\t\t\t})) as Ctx & NC;\r\n\t\t\t}\r\n\r\n\t\t\treturn ctx as Ctx & NC;\r\n\t\t};\r\n\r\n\t\treturn await runNext();\r\n\t}\r\n\r\n\tprivate isValidationError(error: unknown): boolean {\r\n\t\tif (typeof error !== 'object' || error === null) return false;\r\n\r\n\t\tif ('name' in error) {\r\n\t\t\tconst errName = (error as { name: string }).name;\r\n\t\t\tif (errName === 'ZodError' || errName.includes('ValidationError')) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn 'errors' in error || 'issues' in error;\r\n\t}\r\n}\r\n\r\n/**\r\n * Creates an ActionPlus client that handles validation and execution of server actions\r\n */\r\nexport const createActionPlus = (options?: TActionPlusOptions) => {\r\n\treturn new ActionPlus({ options });\r\n};\r\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-action-plus",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Plug-and-play, type-safe server actions with schema validation (schema-agnostic, Zod compatible).",
5
5
  "license": "MIT",
6
6
  "repository": {