From a5966c115bdfe65cfbd14fc6c95c1b47415dec6c Mon Sep 17 00:00:00 2001
From: Hunter Johnston <64506580+huntabyte@users.noreply.github.com>
Date: Wed, 27 Mar 2024 11:20:58 -0600
Subject: [PATCH] fix: `dataType: 'json'` nested field errors (#159)
Co-authored-by: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com>
---
.changeset/nervous-mayflies-sort.md | 5 ++
packages/formsnap/.eslintignore | 1 +
packages/formsnap/.eslintrc.cjs | 6 +++
.../formsnap/src/lib/components/field.svelte | 21 +++++----
packages/formsnap/src/lib/context.ts | 2 +-
.../formsnap/src/lib/internal/utils/errors.ts | 1 -
.../formsnap/src/lib/internal/utils/path.ts | 5 +-
.../routes/docs/examples/json/+page.svelte | 46 +++++++++++++++++++
8 files changed, 72 insertions(+), 15 deletions(-)
create mode 100644 .changeset/nervous-mayflies-sort.md
create mode 100644 sites/docs/src/routes/docs/examples/json/+page.svelte
diff --git a/.changeset/nervous-mayflies-sort.md b/.changeset/nervous-mayflies-sort.md
new file mode 100644
index 0000000..6c14756
--- /dev/null
+++ b/.changeset/nervous-mayflies-sort.md
@@ -0,0 +1,5 @@
+---
+"formsnap": patch
+---
+
+Fixed a bug where `FieldErrors` wouldn't render errors for nested fields with `dataType: 'json'`
diff --git a/packages/formsnap/.eslintignore b/packages/formsnap/.eslintignore
index bdc9d4c..8d45271 100644
--- a/packages/formsnap/.eslintignore
+++ b/packages/formsnap/.eslintignore
@@ -3,6 +3,7 @@ node_modules
/build
/.svelte-kit
/package
+/dist
.env
.env.*
!.env.example
diff --git a/packages/formsnap/.eslintrc.cjs b/packages/formsnap/.eslintrc.cjs
index 600cd08..6d9d727 100644
--- a/packages/formsnap/.eslintrc.cjs
+++ b/packages/formsnap/.eslintrc.cjs
@@ -35,6 +35,12 @@ module.exports = {
}
]
}
+ },
+ {
+ files: ['*.ts', '*.js', '*.svelte'],
+ rules: {
+ 'no-console': 'error'
+ }
}
]
};
diff --git a/packages/formsnap/src/lib/components/field.svelte b/packages/formsnap/src/lib/components/field.svelte
index 60c75da..8046777 100644
--- a/packages/formsnap/src/lib/components/field.svelte
+++ b/packages/formsnap/src/lib/components/field.svelte
@@ -6,6 +6,8 @@
diff --git a/packages/formsnap/src/lib/context.ts b/packages/formsnap/src/lib/context.ts
index b6f30f2..6a071f3 100644
--- a/packages/formsnap/src/lib/context.ts
+++ b/packages/formsnap/src/lib/context.ts
@@ -111,7 +111,7 @@ export function getFormControl(): FormControlContext {
}
function ctxError(ctx: string) {
- console.error(
+ throw new Error(
`Unable to find \`${ctx}\` context. Did you forget to wrap the component in a \`${ctx}\`?`
);
}
diff --git a/packages/formsnap/src/lib/internal/utils/errors.ts b/packages/formsnap/src/lib/internal/utils/errors.ts
index 5b9f377..9790229 100644
--- a/packages/formsnap/src/lib/internal/utils/errors.ts
+++ b/packages/formsnap/src/lib/internal/utils/errors.ts
@@ -7,7 +7,6 @@ export function extractErrorArray>(
errors: ValidationErrors | undefined
): string[] {
if (Array.isArray(errors)) return errors;
-
if (typeof errors === 'object' && '_errors' in errors) {
if (errors._errors !== undefined) return errors._errors;
}
diff --git a/packages/formsnap/src/lib/internal/utils/path.ts b/packages/formsnap/src/lib/internal/utils/path.ts
index 56d5b45..38e14fa 100644
--- a/packages/formsnap/src/lib/internal/utils/path.ts
+++ b/packages/formsnap/src/lib/internal/utils/path.ts
@@ -4,11 +4,10 @@ export function getValueAtPath(path: string, obj: Record) {
let value = obj as any;
for (const key of keys) {
- if (typeof value !== 'object') {
+ if (typeof value !== 'object' || value === null) {
return undefined; // Handle cases where the path doesn't exist in the object
}
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- value = value[key] as any;
+ value = value[key];
}
return value;
diff --git a/sites/docs/src/routes/docs/examples/json/+page.svelte b/sites/docs/src/routes/docs/examples/json/+page.svelte
new file mode 100644
index 0000000..85af629
--- /dev/null
+++ b/sites/docs/src/routes/docs/examples/json/+page.svelte
@@ -0,0 +1,46 @@
+
+
+
+
+
+