release: WRNexusJS 0.5.10
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@wrnexus/validation",
|
||||
"version": "0.5.1",
|
||||
"version": "0.5.10",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"main": "src/index.ts",
|
||||
|
||||
@@ -194,6 +194,14 @@ export const VALIDATE_RUNTIME = String.raw`
|
||||
.then(function () { btns.forEach(function (b) { b.disabled = false; }); });
|
||||
}
|
||||
|
||||
function runSubmitGuards(form, event) {
|
||||
var guards = form.__wireSubmitGuards || [];
|
||||
for (var index = 0; index < guards.length; index += 1) {
|
||||
if (guards[index](event) === false) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function bind(form) {
|
||||
if (form.__wireValidateBound) return;
|
||||
var name = form.getAttribute("data-schema");
|
||||
@@ -219,6 +227,7 @@ export const VALIDATE_RUNTIME = String.raw`
|
||||
clearErrors(form, schema);
|
||||
hideSuccess(form);
|
||||
if (validateForm(form, schema) > 0) return; // client-invalid: stay put, errors shown
|
||||
if (!runSubmitGuards(form, e)) return;
|
||||
submitForm(form, schema);
|
||||
});
|
||||
function validateTarget(e) {
|
||||
|
||||
@@ -305,3 +305,46 @@ test("schema-backed forms validate on input, change, and blur and synchronize fi
|
||||
delete (globalThis as Record<string, unknown>).document;
|
||||
}
|
||||
});
|
||||
|
||||
test("submit guards run only after schema fields are valid", () => {
|
||||
const win = new Window() as unknown as Window & Record<string, unknown>;
|
||||
win.document.body.innerHTML = `
|
||||
<form data-schema="guarded">
|
||||
<input name="email">
|
||||
<span data-error="email"></span>
|
||||
</form>`;
|
||||
win.__wireSchemas = {
|
||||
guarded: v.object({ email: v.string().required("Enter an email") }).describe(),
|
||||
};
|
||||
(globalThis as Record<string, unknown>).window = win;
|
||||
(globalThis as Record<string, unknown>).document = win.document;
|
||||
|
||||
try {
|
||||
(0, eval)(VALIDATE_RUNTIME);
|
||||
const form = win.document.querySelector("form")! as unknown as HTMLFormElement & {
|
||||
__wireSubmitGuards?: Array<() => boolean>;
|
||||
};
|
||||
let guardCalls = 0;
|
||||
form.__wireSubmitGuards = [
|
||||
() => {
|
||||
guardCalls += 1;
|
||||
return false;
|
||||
},
|
||||
];
|
||||
|
||||
form.dispatchEvent(
|
||||
new win.Event("submit", { bubbles: true, cancelable: true }) as unknown as Event,
|
||||
);
|
||||
expect(guardCalls).toBe(0);
|
||||
expect(win.document.querySelector("[data-error=email]")!.textContent).toBe("Enter an email");
|
||||
|
||||
(form.elements.namedItem("email") as HTMLInputElement).value = "person@example.com";
|
||||
form.dispatchEvent(
|
||||
new win.Event("submit", { bubbles: true, cancelable: true }) as unknown as Event,
|
||||
);
|
||||
expect(guardCalls).toBe(1);
|
||||
} finally {
|
||||
delete (globalThis as Record<string, unknown>).window;
|
||||
delete (globalThis as Record<string, unknown>).document;
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user