release: WRNexusJS 0.5.10

This commit is contained in:
2026-07-30 13:36:29 +05:30
parent 8fc6f15402
commit d1b0c55b53
159 changed files with 7509 additions and 604 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/validation",
"version": "0.5.1",
"version": "0.5.10",
"private": true,
"type": "module",
"main": "src/index.ts",
+9
View File
@@ -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;
}
});