@pyreon/validation 0.6.0 → 0.7.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.
@@ -1,90 +1,49 @@
1
- //#region src/utils.ts
2
- /**
3
- * Convert an array of validation issues into a flat field → error record.
4
- * For nested paths like ["address", "city"], produces "address.city".
5
- * When multiple issues exist for the same path, the first message wins.
6
- */
7
- function issuesToRecord(issues) {
8
- const errors = {};
9
- for (const issue of issues) {
10
- const key = issue.path;
11
- if (errors[key] === void 0) errors[key] = issue.message;
12
- }
13
- return errors;
14
- }
1
+ import { SchemaValidateFn, ValidateFn } from "@pyreon/form";
15
2
 
16
- //#endregion
17
- //#region src/arktype.ts
18
- function isArkErrors(result) {
19
- return Array.isArray(result) && "summary" in result;
20
- }
21
- function arkIssuesToGeneric(errors) {
22
- return errors.map(err => ({
23
- path: err.path.map(String).join("."),
24
- message: err.message
25
- }));
26
- }
3
+ //#region src/arktype.d.ts
27
4
  /**
28
- * Create a form-level schema validator from an ArkType schema.
29
- *
30
- * Accepts any callable ArkType `Type` instance. The schema is duck-typed —
31
- * no ArkType import required.
32
- *
33
- * @example
34
- * import { type } from 'arktype'
35
- * import { arktypeSchema } from '@pyreon/validation/arktype'
36
- *
37
- * const schema = type({
38
- * email: 'string.email',
39
- * password: 'string >= 8',
40
- * })
41
- *
42
- * const form = useForm({
43
- * initialValues: { email: '', password: '' },
44
- * schema: arktypeSchema(schema),
45
- * onSubmit: (values) => { ... },
46
- * })
47
- */
48
- function arktypeSchema(schema) {
49
- return values => {
50
- try {
51
- const result = schema(values);
52
- if (!isArkErrors(result)) return {};
53
- return issuesToRecord(arkIssuesToGeneric(result));
54
- } catch (err) {
55
- return {
56
- "": err instanceof Error ? err.message : String(err)
57
- };
58
- }
59
- };
60
- }
5
+ * Internal callable interface matching ArkType's Type.
6
+ * Not exposed publicly — consumers pass their ArkType schema directly.
7
+ */
8
+ type ArkTypeCallable = (data: unknown) => unknown;
61
9
  /**
62
- * Create a single-field validator from an ArkType schema.
63
- *
64
- * @example
65
- * import { type } from 'arktype'
66
- * import { arktypeField } from '@pyreon/validation/arktype'
67
- *
68
- * const form = useForm({
69
- * initialValues: { email: '' },
70
- * validators: {
71
- * email: arktypeField(type('string.email')),
72
- * },
73
- * onSubmit: (values) => { ... },
74
- * })
75
- */
76
- function arktypeField(schema) {
77
- return value => {
78
- try {
79
- const result = schema(value);
80
- if (!isArkErrors(result)) return void 0;
81
- return result[0]?.message;
82
- } catch (err) {
83
- return err instanceof Error ? err.message : String(err);
84
- }
85
- };
86
- }
87
-
10
+ * Create a form-level schema validator from an ArkType schema.
11
+ *
12
+ * Accepts any callable ArkType `Type` instance. The schema is duck-typed —
13
+ * no ArkType import required.
14
+ *
15
+ * @example
16
+ * import { type } from 'arktype'
17
+ * import { arktypeSchema } from '@pyreon/validation/arktype'
18
+ *
19
+ * const schema = type({
20
+ * email: 'string.email',
21
+ * password: 'string >= 8',
22
+ * })
23
+ *
24
+ * const form = useForm({
25
+ * initialValues: { email: '', password: '' },
26
+ * schema: arktypeSchema(schema),
27
+ * onSubmit: (values) => { ... },
28
+ * })
29
+ */
30
+ declare function arktypeSchema<TValues extends Record<string, unknown>>(schema: ArkTypeCallable): SchemaValidateFn<TValues>;
31
+ /**
32
+ * Create a single-field validator from an ArkType schema.
33
+ *
34
+ * @example
35
+ * import { type } from 'arktype'
36
+ * import { arktypeField } from '@pyreon/validation/arktype'
37
+ *
38
+ * const form = useForm({
39
+ * initialValues: { email: '' },
40
+ * validators: {
41
+ * email: arktypeField(type('string.email')),
42
+ * },
43
+ * onSubmit: (values) => { ... },
44
+ * })
45
+ */
46
+ declare function arktypeField<T>(schema: ArkTypeCallable): ValidateFn<T>;
88
47
  //#endregion
89
48
  export { arktypeField, arktypeSchema };
90
- //# sourceMappingURL=arktype.d.ts.map
49
+ //# sourceMappingURL=arktype2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"arktype.d.ts","names":[],"sources":["../../src/utils.ts","../../src/arktype.ts"],"mappings":";;;;;;AAQA,SAAgB,cAAA,CACd,MAAA,EACiD;EACjD,MAAM,MAAA,GAAS,CAAA,CAAE;EACjB,KAAK,MAAM,KAAA,IAAS,MAAA,EAAQ;IAC1B,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA;IAElB,IAAI,MAAA,CAAO,GAAA,CAAA,KAAS,KAAA,CAAA,EAClB,MAAA,CAAO,GAAA,CAAA,GAAO,KAAA,CAAM,OAAA;;EAGxB,OAAO,MAAA;;;;;ACOT,SAAS,WAAA,CAAY,MAAA,EAAsC;EACzD,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,SAAA,IAAc,MAAA;;AAGhD,SAAS,kBAAA,CAAmB,MAAA,EAAsC;EAChE,OAAO,MAAA,CAAO,GAAA,CAAK,GAAA,KAAS;IAC1B,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,IAAA,CAAK,GAAA,CAAI;IACpC,OAAA,EAAS,GAAA,CAAI;GACd,CAAA,CAAE;;;;;;;;;;;;;;;;;;;;;;;AAwBL,SAAgB,aAAA,CACd,MAAA,EAC2B;EAC3B,OAAQ,MAAA,IAAoB;IAC1B,IAAI;MACF,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO;MAC7B,IAAI,CAAC,WAAA,CAAY,MAAA,CAAO,EACtB,OAAO,CAAA,CAAE;MACX,OAAO,cAAA,CAAwB,kBAAA,CAAmB,MAAA,CAAO,CAAC;aACnD,GAAA,EAAK;MACZ,OAAO;QACL,EAAA,EAAI,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAA;MAAI,CACrD;;;;;;;;;;;;;;;;;;;AAoBP,SAAgB,YAAA,CAAgB,MAAA,EAAwC;EACtE,OAAQ,KAAA,IAAa;IACnB,IAAI;MACF,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM;MAC5B,IAAI,CAAC,WAAA,CAAY,MAAA,CAAO,EAAE,OAAO,KAAA,CAAA;MACjC,OAAO,MAAA,CAAO,CAAA,CAAA,EAAI,OAAA;aACX,GAAA,EAAK;MACZ,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI"}
1
+ {"version":3,"file":"arktype2.d.ts","names":[],"sources":["../../../src/arktype.ts"],"mappings":";;;;;AAIqB;;KAoBhB,eAAA,IAAmB,IAAA;;;AAkCxB;;;;;;;;;;;;;;;;;AAgCA;;iBAhCgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,EAAQ,eAAA,GACP,gBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;iBA8BJ,YAAA,GAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,UAAA,CAAW,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/arktype.ts","../../src/types.ts","../../src/utils.ts","../../src/valibot.ts","../../src/zod.ts"],"mappings":";;;;;AAIqB;;KAoBhB,eAAA,IAAmB,IAAA;;;AAkCxB;;;;;;;;;;;;;;;;;AAgCA;;iBAhCgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,EAAQ,eAAA,GACP,kBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;iBA8BJ,YAAA,GAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,YAAA,CAAW,CAAA;;;AAtFhD;;;;AAAA,UCSJ,eAAA;ED6CD;EC3Cd,IAAA;ED2C2B;ECzC3B,OAAA;AAAA;;;;;KAOU,aAAA,6BAA0C,MAAA,mBACpD,MAAA,EAAQ,OAAA,KACL,gBAAA,CAAiB,OAAA;;;;;KAMV,YAAA,gBAA4B,MAAA,EAAQ,OAAA,KAAY,UAAA,CAAW,CAAA;;;;AD5BlD;;;;iBEIL,cAAA,iBAA+B,MAAA,kBAAA,CAC7C,MAAA,EAAQ,eAAA,KACP,OAAA,CAAQ,MAAA,OAAa,OAAA,EAAS,iBAAA;;;;;AFNZ;;;;KG6BhB,kBAAA,GAAqB,QAAA;AHyB1B;;;;;;;;;;;;;;;;;AAgCA;;;;AAhCA,iBGUgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,kBAAA,CAAiB,OAAA;;;;;;;;;;;;;;AF1DpB;;iBE2FgB,YAAA,GAAA,CACd,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,YAAA,CAAW,CAAA;;;;;AHvGO;;UIQX,QAAA;EACR,IAAA,EAAM,WAAA;EACN,OAAA;AAAA;;;;;UAOQ,SAAA;EACR,SAAA,CAAU,IAAA;IACR,OAAA;IACA,IAAA,GAAO,CAAA;IACP,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;EAEpB,cAAA,CACE,IAAA,YACC,OAAA;IAAU,OAAA;IAAkB,IAAA,GAAO,CAAA;IAAG,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;AAAA;;;;;;;;;;;;;;;AHhB7D;;;;;iBG6CgB,SAAA,iBAA0B,MAAA,kBAAA,CACxC,MAAA,EAAQ,SAAA,CAAU,OAAA,IACjB,kBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;;iBA+BJ,QAAA,GAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,CAAA,IAAK,YAAA,CAAW,CAAA"}
1
+ {"version":3,"file":"index2.d.ts","names":[],"sources":["../../../src/arktype.ts","../../../src/types.ts","../../../src/utils.ts","../../../src/valibot.ts","../../../src/zod.ts"],"mappings":";;;;;AAIqB;;KAoBhB,eAAA,IAAmB,IAAA;;;AAkCxB;;;;;;;;;;;;;;;;;AAgCA;;iBAhCgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,EAAQ,eAAA,GACP,kBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;iBA8BJ,YAAA,GAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,YAAA,CAAW,CAAA;;;AAtFhD;;;;AAAA,UCSJ,eAAA;ED6CD;EC3Cd,IAAA;ED2C2B;ECzC3B,OAAA;AAAA;;;;;KAOU,aAAA,6BAA0C,MAAA,mBACpD,MAAA,EAAQ,OAAA,KACL,gBAAA,CAAiB,OAAA;;;;;KAMV,YAAA,gBAA4B,MAAA,EAAQ,OAAA,KAAY,UAAA,CAAW,CAAA;;;;AD5BlD;;;;iBEIL,cAAA,iBAA+B,MAAA,kBAAA,CAC7C,MAAA,EAAQ,eAAA,KACP,OAAA,CAAQ,MAAA,OAAa,OAAA,EAAS,iBAAA;;;;;AFNZ;;;;KG6BhB,kBAAA,GAAqB,QAAA;AHyB1B;;;;;;;;;;;;;;;;;AAgCA;;;;AAhCA,iBGUgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,kBAAA,CAAiB,OAAA;;;;;;;;;;;;;;AF1DpB;;iBE2FgB,YAAA,GAAA,CACd,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,YAAA,CAAW,CAAA;;;;;AHvGO;;UIQX,QAAA;EACR,IAAA,EAAM,WAAA;EACN,OAAA;AAAA;;;;;UAOQ,SAAA;EACR,SAAA,CAAU,IAAA;IACR,OAAA;IACA,IAAA,GAAO,CAAA;IACP,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;EAEpB,cAAA,CACE,IAAA,YACC,OAAA;IAAU,OAAA;IAAkB,IAAA,GAAO,CAAA;IAAG,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;AAAA;;;;;;;;;;;;;;;AHhB7D;;;;;iBG6CgB,SAAA,iBAA0B,MAAA,kBAAA,CACxC,MAAA,EAAQ,SAAA,CAAU,OAAA,IACjB,kBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;;iBA+BJ,QAAA,GAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,CAAA,IAAK,YAAA,CAAW,CAAA"}
@@ -1,89 +1,51 @@
1
- //#region src/utils.ts
2
- /**
3
- * Convert an array of validation issues into a flat field → error record.
4
- * For nested paths like ["address", "city"], produces "address.city".
5
- * When multiple issues exist for the same path, the first message wins.
6
- */
7
- function issuesToRecord(issues) {
8
- const errors = {};
9
- for (const issue of issues) {
10
- const key = issue.path;
11
- if (errors[key] === void 0) errors[key] = issue.message;
12
- }
13
- return errors;
14
- }
1
+ import { SchemaValidateFn, ValidateFn } from "@pyreon/form";
15
2
 
16
- //#endregion
17
- //#region src/valibot.ts
18
- function valibotIssuesToGeneric(issues) {
19
- return issues.map(issue => ({
20
- path: issue.path?.map(p => String(p.key)).join(".") ?? "",
21
- message: issue.message
22
- }));
23
- }
3
+ //#region src/valibot.d.ts
24
4
  /**
25
- * Create a form-level schema validator from a Valibot schema.
26
- *
27
- * Valibot uses standalone functions rather than methods, so you must pass
28
- * the `safeParseAsync` (or `safeParse`) function from valibot.
29
- *
30
- * @example
31
- * import * as v from 'valibot'
32
- * import { valibotSchema } from '@pyreon/validation/valibot'
33
- *
34
- * const schema = v.object({
35
- * email: v.pipe(v.string(), v.email()),
36
- * password: v.pipe(v.string(), v.minLength(8)),
37
- * })
38
- *
39
- * const form = useForm({
40
- * initialValues: { email: '', password: '' },
41
- * schema: valibotSchema(schema, v.safeParseAsync),
42
- * onSubmit: (values) => { ... },
43
- * })
44
- */
45
- function valibotSchema(schema, safeParseFn) {
46
- const parse = safeParseFn;
47
- return async values => {
48
- try {
49
- const result = await parse(schema, values);
50
- if (result.success) return {};
51
- return issuesToRecord(valibotIssuesToGeneric(result.issues ?? []));
52
- } catch (err) {
53
- return {
54
- "": err instanceof Error ? err.message : String(err)
55
- };
56
- }
57
- };
58
- }
5
+ * Any function that takes (schema, input, ...rest) and returns a parse result.
6
+ * Valibot's safeParse/safeParseAsync have generic constraints on the schema
7
+ * parameter that can't be expressed without importing Valibot types. We accept
8
+ * any callable and cast internally.
9
+ */
10
+ type GenericSafeParseFn = Function;
59
11
  /**
60
- * Create a single-field validator from a Valibot schema.
61
- *
62
- * @example
63
- * import * as v from 'valibot'
64
- * import { valibotField } from '@pyreon/validation/valibot'
65
- *
66
- * const form = useForm({
67
- * initialValues: { email: '' },
68
- * validators: {
69
- * email: valibotField(v.pipe(v.string(), v.email('Invalid email')), v.safeParseAsync),
70
- * },
71
- * onSubmit: (values) => { ... },
72
- * })
73
- */
74
- function valibotField(schema, safeParseFn) {
75
- const parse = safeParseFn;
76
- return async value => {
77
- try {
78
- const result = await parse(schema, value);
79
- if (result.success) return void 0;
80
- return result.issues?.[0]?.message;
81
- } catch (err) {
82
- return err instanceof Error ? err.message : String(err);
83
- }
84
- };
85
- }
86
-
12
+ * Create a form-level schema validator from a Valibot schema.
13
+ *
14
+ * Valibot uses standalone functions rather than methods, so you must pass
15
+ * the `safeParseAsync` (or `safeParse`) function from valibot.
16
+ *
17
+ * @example
18
+ * import * as v from 'valibot'
19
+ * import { valibotSchema } from '@pyreon/validation/valibot'
20
+ *
21
+ * const schema = v.object({
22
+ * email: v.pipe(v.string(), v.email()),
23
+ * password: v.pipe(v.string(), v.minLength(8)),
24
+ * })
25
+ *
26
+ * const form = useForm({
27
+ * initialValues: { email: '', password: '' },
28
+ * schema: valibotSchema(schema, v.safeParseAsync),
29
+ * onSubmit: (values) => { ... },
30
+ * })
31
+ */
32
+ declare function valibotSchema<TValues extends Record<string, unknown>>(schema: unknown, safeParseFn: GenericSafeParseFn): SchemaValidateFn<TValues>;
33
+ /**
34
+ * Create a single-field validator from a Valibot schema.
35
+ *
36
+ * @example
37
+ * import * as v from 'valibot'
38
+ * import { valibotField } from '@pyreon/validation/valibot'
39
+ *
40
+ * const form = useForm({
41
+ * initialValues: { email: '' },
42
+ * validators: {
43
+ * email: valibotField(v.pipe(v.string(), v.email('Invalid email')), v.safeParseAsync),
44
+ * },
45
+ * onSubmit: (values) => { ... },
46
+ * })
47
+ */
48
+ declare function valibotField<T>(schema: unknown, safeParseFn: GenericSafeParseFn): ValidateFn<T>;
87
49
  //#endregion
88
50
  export { valibotField, valibotSchema };
89
- //# sourceMappingURL=valibot.d.ts.map
51
+ //# sourceMappingURL=valibot2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"valibot.d.ts","names":[],"sources":["../../src/utils.ts","../../src/valibot.ts"],"mappings":";;;;;;AAQA,SAAgB,cAAA,CACd,MAAA,EACiD;EACjD,MAAM,MAAA,GAAS,CAAA,CAAE;EACjB,KAAK,MAAM,KAAA,IAAS,MAAA,EAAQ;IAC1B,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA;IAElB,IAAI,MAAA,CAAO,GAAA,CAAA,KAAS,KAAA,CAAA,EAClB,MAAA,CAAO,GAAA,CAAA,GAAO,KAAA,CAAM,OAAA;;EAGxB,OAAO,MAAA;;;;;ACgBT,SAAS,sBAAA,CAAuB,MAAA,EAA2C;EACzE,OAAO,MAAA,CAAO,GAAA,CAAK,KAAA,KAAW;IAC5B,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,GAAA,CAAK,CAAA,IAAM,MAAA,CAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA;IACzD,OAAA,EAAS,KAAA,CAAM;GAChB,CAAA,CAAE;;;;;;;;;;;;;;;;;;;;;;;AA6BL,SAAgB,aAAA,CACd,MAAA,EACA,WAAA,EAC2B;EAC3B,MAAM,KAAA,GAAQ,WAAA;EACd,OAAO,MAAO,MAAA,IAAoB;IAChC,IAAI;MACF,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,EAAQ,MAAA,CAAO;MAC1C,IAAI,MAAA,CAAO,OAAA,EACT,OAAO,CAAA,CAAE;MACX,OAAO,cAAA,CACL,sBAAA,CAAuB,MAAA,CAAO,MAAA,IAAU,EAAE,CAAC,CAC5C;aACM,GAAA,EAAK;MACZ,OAAO;QACL,EAAA,EAAI,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAA;MAAI,CACrD;;;;;;;;;;;;;;;;;;;AAoBP,SAAgB,YAAA,CACd,MAAA,EACA,WAAA,EACe;EACf,MAAM,KAAA,GAAQ,WAAA;EACd,OAAO,MAAO,KAAA,IAAa;IACzB,IAAI;MACF,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM;MACzC,IAAI,MAAA,CAAO,OAAA,EAAS,OAAO,KAAA,CAAA;MAC3B,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA,EAAI,OAAA;aACpB,GAAA,EAAK;MACZ,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI"}
1
+ {"version":3,"file":"valibot2.d.ts","names":[],"sources":["../../../src/valibot.ts"],"mappings":";;;;;AAIqB;;;;KA6BhB,kBAAA,GAAqB,QAAA;AAmC1B;;;;;;;;;;;;;;;;;;AAoCA;;;AApCA,iBAAgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,gBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;iBAiCJ,YAAA,GAAA,CACd,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,UAAA,CAAW,CAAA"}
@@ -1,86 +1,71 @@
1
- //#region src/utils.ts
2
- /**
3
- * Convert an array of validation issues into a flat field → error record.
4
- * For nested paths like ["address", "city"], produces "address.city".
5
- * When multiple issues exist for the same path, the first message wins.
6
- */
7
- function issuesToRecord(issues) {
8
- const errors = {};
9
- for (const issue of issues) {
10
- const key = issue.path;
11
- if (errors[key] === void 0) errors[key] = issue.message;
12
- }
13
- return errors;
14
- }
1
+ import { SchemaValidateFn, ValidateFn } from "@pyreon/form";
15
2
 
16
- //#endregion
17
- //#region src/zod.ts
18
- function zodIssuesToGeneric(issues) {
19
- return issues.map(issue => ({
20
- path: issue.path.map(String).join("."),
21
- message: issue.message
22
- }));
23
- }
3
+ //#region src/zod.d.ts
24
4
  /**
25
- * Create a form-level schema validator from a Zod schema.
26
- * Supports both sync and async Zod schemas (uses `safeParseAsync`).
27
- *
28
- * @example
29
- * import { z } from 'zod'
30
- * import { zodSchema } from '@pyreon/validation/zod'
31
- *
32
- * const schema = z.object({
33
- * email: z.string().email(),
34
- * password: z.string().min(8),
35
- * })
36
- *
37
- * const form = useForm({
38
- * initialValues: { email: '', password: '' },
39
- * schema: zodSchema(schema),
40
- * onSubmit: (values) => { ... },
41
- * })
42
- */
43
- function zodSchema(schema) {
44
- return async values => {
45
- try {
46
- const result = await schema.safeParseAsync(values);
47
- if (result.success) return {};
48
- return issuesToRecord(zodIssuesToGeneric(result.error.issues));
49
- } catch (err) {
50
- return {
51
- "": err instanceof Error ? err.message : String(err)
52
- };
53
- }
54
- };
5
+ * Minimal Zod-compatible interfaces so we don't require zod as a hard dep.
6
+ * These match Zod v3's public API surface.
7
+ */
8
+ interface ZodIssue {
9
+ path: PropertyKey[];
10
+ message: string;
55
11
  }
56
12
  /**
57
- * Create a single-field validator from a Zod schema.
58
- * Supports both sync and async Zod refinements.
59
- *
60
- * @example
61
- * import { z } from 'zod'
62
- * import { zodField } from '@pyreon/validation/zod'
63
- *
64
- * const form = useForm({
65
- * initialValues: { email: '' },
66
- * validators: {
67
- * email: zodField(z.string().email('Invalid email')),
68
- * },
69
- * onSubmit: (values) => { ... },
70
- * })
71
- */
72
- function zodField(schema) {
73
- return async value => {
74
- try {
75
- const result = await schema.safeParseAsync(value);
76
- if (result.success) return void 0;
77
- return result.error.issues[0]?.message;
78
- } catch (err) {
79
- return err instanceof Error ? err.message : String(err);
80
- }
13
+ * Duck-typed Zod schema interface works with both Zod v3 and v4.
14
+ * Inlines the result shape to avoid version-specific type mismatches.
15
+ */
16
+ interface ZodSchema<T = unknown> {
17
+ safeParse(data: unknown): {
18
+ success: boolean;
19
+ data?: T;
20
+ error?: {
21
+ issues: ZodIssue[];
22
+ };
81
23
  };
24
+ safeParseAsync(data: unknown): Promise<{
25
+ success: boolean;
26
+ data?: T;
27
+ error?: {
28
+ issues: ZodIssue[];
29
+ };
30
+ }>;
82
31
  }
83
-
32
+ /**
33
+ * Create a form-level schema validator from a Zod schema.
34
+ * Supports both sync and async Zod schemas (uses `safeParseAsync`).
35
+ *
36
+ * @example
37
+ * import { z } from 'zod'
38
+ * import { zodSchema } from '@pyreon/validation/zod'
39
+ *
40
+ * const schema = z.object({
41
+ * email: z.string().email(),
42
+ * password: z.string().min(8),
43
+ * })
44
+ *
45
+ * const form = useForm({
46
+ * initialValues: { email: '', password: '' },
47
+ * schema: zodSchema(schema),
48
+ * onSubmit: (values) => { ... },
49
+ * })
50
+ */
51
+ declare function zodSchema<TValues extends Record<string, unknown>>(schema: ZodSchema<TValues>): SchemaValidateFn<TValues>;
52
+ /**
53
+ * Create a single-field validator from a Zod schema.
54
+ * Supports both sync and async Zod refinements.
55
+ *
56
+ * @example
57
+ * import { z } from 'zod'
58
+ * import { zodField } from '@pyreon/validation/zod'
59
+ *
60
+ * const form = useForm({
61
+ * initialValues: { email: '' },
62
+ * validators: {
63
+ * email: zodField(z.string().email('Invalid email')),
64
+ * },
65
+ * onSubmit: (values) => { ... },
66
+ * })
67
+ */
68
+ declare function zodField<T>(schema: ZodSchema<T>): ValidateFn<T>;
84
69
  //#endregion
85
70
  export { zodField, zodSchema };
86
- //# sourceMappingURL=zod.d.ts.map
71
+ //# sourceMappingURL=zod2.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zod.d.ts","names":[],"sources":["../../src/utils.ts","../../src/zod.ts"],"mappings":";;;;;;AAQA,SAAgB,cAAA,CACd,MAAA,EACiD;EACjD,MAAM,MAAA,GAAS,CAAA,CAAE;EACjB,KAAK,MAAM,KAAA,IAAS,MAAA,EAAQ;IAC1B,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA;IAElB,IAAI,MAAA,CAAO,GAAA,CAAA,KAAS,KAAA,CAAA,EAClB,MAAA,CAAO,GAAA,CAAA,GAAO,KAAA,CAAM,OAAA;;EAGxB,OAAO,MAAA;;;;;ACaT,SAAS,kBAAA,CAAmB,MAAA,EAAuC;EACjE,OAAO,MAAA,CAAO,GAAA,CAAK,KAAA,KAAW;IAC5B,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,IAAA,CAAK,GAAA,CAAI;IACtC,OAAA,EAAS,KAAA,CAAM;GAChB,CAAA,CAAE;;;;;;;;;;;;;;;;;;;;;AAsBL,SAAgB,SAAA,CACd,MAAA,EAC2B;EAC3B,OAAO,MAAO,MAAA,IAAoB;IAChC,IAAI;MACF,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO;MAClD,IAAI,MAAA,CAAO,OAAA,EACT,OAAO,CAAA,CAAE;MACX,OAAO,cAAA,CAAwB,kBAAA,CAAmB,MAAA,CAAO,KAAA,CAAO,MAAA,CAAO,CAAC;aACjE,GAAA,EAAK;MACZ,OAAO;QACL,EAAA,EAAI,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAA;MAAI,CACrD;;;;;;;;;;;;;;;;;;;;AAqBP,SAAgB,QAAA,CAAY,MAAA,EAAqC;EAC/D,OAAO,MAAO,KAAA,IAAa;IACzB,IAAI;MACF,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,cAAA,CAAe,KAAA,CAAM;MACjD,IAAI,MAAA,CAAO,OAAA,EAAS,OAAO,KAAA,CAAA;MAC3B,OAAO,MAAA,CAAO,KAAA,CAAO,MAAA,CAAO,CAAA,CAAA,EAAI,OAAA;aACzB,GAAA,EAAK;MACZ,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI"}
1
+ {"version":3,"file":"zod2.d.ts","names":[],"sources":["../../../src/zod.ts"],"mappings":";;;;;AAIqB;;UAQX,QAAA;EACR,IAAA,EAAM,WAAA;EACN,OAAA;AAAA;;;;AAAO;UAOC,SAAA;EACR,SAAA,CAAU,IAAA;IACR,OAAA;IACA,IAAA,GAAO,CAAA;IACP,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;EAEpB,cAAA,CACE,IAAA,YACC,OAAA;IAAU,OAAA;IAAkB,IAAA,GAAO,CAAA;IAAG,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;AAAA;;;;;;;;;;;;;;AA6B7D;;;;;;iBAAgB,SAAA,iBAA0B,MAAA,kBAAA,CACxC,MAAA,EAAQ,SAAA,CAAU,OAAA,IACjB,gBAAA,CAAiB,OAAA;;;;;;;;;;;;;AA+BpB;;;;iBAAgB,QAAA,GAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,CAAA,IAAK,UAAA,CAAW,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pyreon/validation",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Schema validation adapters for Pyreon forms (Zod, Valibot, ArkType)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -55,7 +55,7 @@
55
55
  "typecheck": "tsc --noEmit"
56
56
  },
57
57
  "peerDependencies": {
58
- "@pyreon/form": "^0.6.0"
58
+ "@pyreon/form": "^0.7.0"
59
59
  },
60
60
  "peerDependenciesMeta": {
61
61
  "zod": {
@@ -1,49 +0,0 @@
1
- import { SchemaValidateFn, ValidateFn } from "@pyreon/form";
2
-
3
- //#region src/arktype.d.ts
4
- /**
5
- * Internal callable interface matching ArkType's Type.
6
- * Not exposed publicly — consumers pass their ArkType schema directly.
7
- */
8
- type ArkTypeCallable = (data: unknown) => unknown;
9
- /**
10
- * Create a form-level schema validator from an ArkType schema.
11
- *
12
- * Accepts any callable ArkType `Type` instance. The schema is duck-typed —
13
- * no ArkType import required.
14
- *
15
- * @example
16
- * import { type } from 'arktype'
17
- * import { arktypeSchema } from '@pyreon/validation/arktype'
18
- *
19
- * const schema = type({
20
- * email: 'string.email',
21
- * password: 'string >= 8',
22
- * })
23
- *
24
- * const form = useForm({
25
- * initialValues: { email: '', password: '' },
26
- * schema: arktypeSchema(schema),
27
- * onSubmit: (values) => { ... },
28
- * })
29
- */
30
- declare function arktypeSchema<TValues extends Record<string, unknown>>(schema: ArkTypeCallable): SchemaValidateFn<TValues>;
31
- /**
32
- * Create a single-field validator from an ArkType schema.
33
- *
34
- * @example
35
- * import { type } from 'arktype'
36
- * import { arktypeField } from '@pyreon/validation/arktype'
37
- *
38
- * const form = useForm({
39
- * initialValues: { email: '' },
40
- * validators: {
41
- * email: arktypeField(type('string.email')),
42
- * },
43
- * onSubmit: (values) => { ... },
44
- * })
45
- */
46
- declare function arktypeField<T>(schema: ArkTypeCallable): ValidateFn<T>;
47
- //#endregion
48
- export { arktypeField, arktypeSchema };
49
- //# sourceMappingURL=arktype2.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"arktype2.d.ts","names":[],"sources":["../../src/arktype.ts"],"mappings":";;;;;AAIqB;;KAoBhB,eAAA,IAAmB,IAAA;;;AAkCxB;;;;;;;;;;;;;;;;;AAgCA;;iBAhCgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,EAAQ,eAAA,GACP,gBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;iBA8BJ,YAAA,GAAA,CAAgB,MAAA,EAAQ,eAAA,GAAkB,UAAA,CAAW,CAAA"}
@@ -1,51 +0,0 @@
1
- import { SchemaValidateFn, ValidateFn } from "@pyreon/form";
2
-
3
- //#region src/valibot.d.ts
4
- /**
5
- * Any function that takes (schema, input, ...rest) and returns a parse result.
6
- * Valibot's safeParse/safeParseAsync have generic constraints on the schema
7
- * parameter that can't be expressed without importing Valibot types. We accept
8
- * any callable and cast internally.
9
- */
10
- type GenericSafeParseFn = Function;
11
- /**
12
- * Create a form-level schema validator from a Valibot schema.
13
- *
14
- * Valibot uses standalone functions rather than methods, so you must pass
15
- * the `safeParseAsync` (or `safeParse`) function from valibot.
16
- *
17
- * @example
18
- * import * as v from 'valibot'
19
- * import { valibotSchema } from '@pyreon/validation/valibot'
20
- *
21
- * const schema = v.object({
22
- * email: v.pipe(v.string(), v.email()),
23
- * password: v.pipe(v.string(), v.minLength(8)),
24
- * })
25
- *
26
- * const form = useForm({
27
- * initialValues: { email: '', password: '' },
28
- * schema: valibotSchema(schema, v.safeParseAsync),
29
- * onSubmit: (values) => { ... },
30
- * })
31
- */
32
- declare function valibotSchema<TValues extends Record<string, unknown>>(schema: unknown, safeParseFn: GenericSafeParseFn): SchemaValidateFn<TValues>;
33
- /**
34
- * Create a single-field validator from a Valibot schema.
35
- *
36
- * @example
37
- * import * as v from 'valibot'
38
- * import { valibotField } from '@pyreon/validation/valibot'
39
- *
40
- * const form = useForm({
41
- * initialValues: { email: '' },
42
- * validators: {
43
- * email: valibotField(v.pipe(v.string(), v.email('Invalid email')), v.safeParseAsync),
44
- * },
45
- * onSubmit: (values) => { ... },
46
- * })
47
- */
48
- declare function valibotField<T>(schema: unknown, safeParseFn: GenericSafeParseFn): ValidateFn<T>;
49
- //#endregion
50
- export { valibotField, valibotSchema };
51
- //# sourceMappingURL=valibot2.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"valibot2.d.ts","names":[],"sources":["../../src/valibot.ts"],"mappings":";;;;;AAIqB;;;;KA6BhB,kBAAA,GAAqB,QAAA;AAmC1B;;;;;;;;;;;;;;;;;;AAoCA;;;AApCA,iBAAgB,aAAA,iBAA8B,MAAA,kBAAA,CAC5C,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,gBAAA,CAAiB,OAAA;;;;;;;;;;;;;;;;iBAiCJ,YAAA,GAAA,CACd,MAAA,WACA,WAAA,EAAa,kBAAA,GACZ,UAAA,CAAW,CAAA"}
@@ -1,71 +0,0 @@
1
- import { SchemaValidateFn, ValidateFn } from "@pyreon/form";
2
-
3
- //#region src/zod.d.ts
4
- /**
5
- * Minimal Zod-compatible interfaces so we don't require zod as a hard dep.
6
- * These match Zod v3's public API surface.
7
- */
8
- interface ZodIssue {
9
- path: PropertyKey[];
10
- message: string;
11
- }
12
- /**
13
- * Duck-typed Zod schema interface — works with both Zod v3 and v4.
14
- * Inlines the result shape to avoid version-specific type mismatches.
15
- */
16
- interface ZodSchema<T = unknown> {
17
- safeParse(data: unknown): {
18
- success: boolean;
19
- data?: T;
20
- error?: {
21
- issues: ZodIssue[];
22
- };
23
- };
24
- safeParseAsync(data: unknown): Promise<{
25
- success: boolean;
26
- data?: T;
27
- error?: {
28
- issues: ZodIssue[];
29
- };
30
- }>;
31
- }
32
- /**
33
- * Create a form-level schema validator from a Zod schema.
34
- * Supports both sync and async Zod schemas (uses `safeParseAsync`).
35
- *
36
- * @example
37
- * import { z } from 'zod'
38
- * import { zodSchema } from '@pyreon/validation/zod'
39
- *
40
- * const schema = z.object({
41
- * email: z.string().email(),
42
- * password: z.string().min(8),
43
- * })
44
- *
45
- * const form = useForm({
46
- * initialValues: { email: '', password: '' },
47
- * schema: zodSchema(schema),
48
- * onSubmit: (values) => { ... },
49
- * })
50
- */
51
- declare function zodSchema<TValues extends Record<string, unknown>>(schema: ZodSchema<TValues>): SchemaValidateFn<TValues>;
52
- /**
53
- * Create a single-field validator from a Zod schema.
54
- * Supports both sync and async Zod refinements.
55
- *
56
- * @example
57
- * import { z } from 'zod'
58
- * import { zodField } from '@pyreon/validation/zod'
59
- *
60
- * const form = useForm({
61
- * initialValues: { email: '' },
62
- * validators: {
63
- * email: zodField(z.string().email('Invalid email')),
64
- * },
65
- * onSubmit: (values) => { ... },
66
- * })
67
- */
68
- declare function zodField<T>(schema: ZodSchema<T>): ValidateFn<T>;
69
- //#endregion
70
- export { zodField, zodSchema };
71
- //# sourceMappingURL=zod2.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zod2.d.ts","names":[],"sources":["../../src/zod.ts"],"mappings":";;;;;AAIqB;;UAQX,QAAA;EACR,IAAA,EAAM,WAAA;EACN,OAAA;AAAA;;;;AAAO;UAOC,SAAA;EACR,SAAA,CAAU,IAAA;IACR,OAAA;IACA,IAAA,GAAO,CAAA;IACP,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;EAEpB,cAAA,CACE,IAAA,YACC,OAAA;IAAU,OAAA;IAAkB,IAAA,GAAO,CAAA;IAAG,KAAA;MAAU,MAAA,EAAQ,QAAA;IAAA;EAAA;AAAA;;;;;;;;;;;;;;AA6B7D;;;;;;iBAAgB,SAAA,iBAA0B,MAAA,kBAAA,CACxC,MAAA,EAAQ,SAAA,CAAU,OAAA,IACjB,gBAAA,CAAiB,OAAA;;;;;;;;;;;;;AA+BpB;;;;iBAAgB,QAAA,GAAA,CAAY,MAAA,EAAQ,SAAA,CAAU,CAAA,IAAK,UAAA,CAAW,CAAA"}