vaniy 0.1.5 → 0.1.6
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/vaniy.es.js +70 -4
- package/dist/vaniy.es.js.map +1 -1
- package/dist/vaniy.js +70 -4
- package/dist/vaniy.js.map +1 -1
- package/dist/vaniy.min.js +70 -4
- package/dist/vaniy.min.js.map +1 -1
- package/dist/vaniy.umd.js +70 -4
- package/dist/vaniy.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/vaniy.es.js
CHANGED
|
@@ -407,7 +407,19 @@ const Q = (input) => {
|
|
|
407
407
|
}
|
|
408
408
|
return html(selectedElement);
|
|
409
409
|
},
|
|
410
|
-
val: safe(() => {
|
|
410
|
+
val: safe((newVal) => {
|
|
411
|
+
if (newVal != null) {
|
|
412
|
+
if (selectedElement.opt && selectedElement.multiple) {
|
|
413
|
+
const wanted = new Set(Array.isArray(newVal) ? newVal : [newVal]);
|
|
414
|
+
Array.from(selectedElement.options).forEach((opt) => {
|
|
415
|
+
opt.selected = wanted.has(opt.value);
|
|
416
|
+
});
|
|
417
|
+
} else {
|
|
418
|
+
selectedElement.value = newVal;
|
|
419
|
+
}
|
|
420
|
+
wrapper.value = selectedElement.value;
|
|
421
|
+
return wrapper;
|
|
422
|
+
}
|
|
411
423
|
if (selectedElement.options && selectedElement.multiple) {
|
|
412
424
|
return Array.from(selectedElement.options).filter((opt) => opt.selected).map((opt) => opt.value);
|
|
413
425
|
}
|
|
@@ -839,18 +851,48 @@ const put = (url, body, opts = {}) => request("PUT", url, { ...opts, body });
|
|
|
839
851
|
const del = (url, opts = {}) => request("DELETE", url, opts);
|
|
840
852
|
const raw = (url, opts) => fetch(_base + url, opts);
|
|
841
853
|
const HTTP = {
|
|
854
|
+
/**
|
|
855
|
+
* Set base URL prefix for all requests.
|
|
856
|
+
* @param {string} url
|
|
857
|
+
* @returns {typeof HTTP}
|
|
858
|
+
*/
|
|
842
859
|
base(url) {
|
|
843
860
|
_base = url;
|
|
844
861
|
return HTTP;
|
|
845
862
|
},
|
|
863
|
+
/**
|
|
864
|
+
* Set default timeout for requests (ms).
|
|
865
|
+
* - fetch requests abort via AbortController
|
|
866
|
+
* - XHR uploads use xhr.timeout
|
|
867
|
+
* @param {number} ms
|
|
868
|
+
* @returns {typeof HTTP}
|
|
869
|
+
*/
|
|
846
870
|
timeout(ms) {
|
|
847
871
|
_timeout = ms;
|
|
848
872
|
return HTTP;
|
|
849
873
|
},
|
|
874
|
+
/**
|
|
875
|
+
* Request interceptor hook.
|
|
876
|
+
* Useful for auth headers, correlation IDs, etc.
|
|
877
|
+
* @param {RequestInterceptor} fn
|
|
878
|
+
* @returns {typeof HTTP}
|
|
879
|
+
*
|
|
880
|
+
* @example
|
|
881
|
+
* HTTP.interceptRequest((cfg) => {
|
|
882
|
+
* cfg.headers = { ...cfg.headers, Authorization: `Bearer ${token}` };
|
|
883
|
+
* return cfg;
|
|
884
|
+
* });
|
|
885
|
+
*/
|
|
850
886
|
interceptRequest(fn) {
|
|
851
887
|
_requestInterceptor = fn;
|
|
852
888
|
return HTTP;
|
|
853
889
|
},
|
|
890
|
+
/**
|
|
891
|
+
* Response interceptor hook.
|
|
892
|
+
* Useful for logging, auto-logout on 401, etc.
|
|
893
|
+
* @param {ResponseInterceptor} fn
|
|
894
|
+
* @returns {typeof HTTP}
|
|
895
|
+
*/
|
|
854
896
|
interceptResponse(fn) {
|
|
855
897
|
_responseInterceptor = fn;
|
|
856
898
|
return HTTP;
|
|
@@ -874,6 +916,12 @@ const FormEvents = {
|
|
|
874
916
|
VALIDATED: "form:validated"
|
|
875
917
|
};
|
|
876
918
|
class FormHandler {
|
|
919
|
+
/**
|
|
920
|
+
* @param {string} formId form element id string
|
|
921
|
+
* @param {Object} schema Validation schema for validator.js
|
|
922
|
+
* @param {(data:Object)=>void} onSubmit Callback when valid
|
|
923
|
+
* @param {FormHandlerOptions} [options]
|
|
924
|
+
*/
|
|
877
925
|
constructor(formId, schema, onSubmit, options = {}) {
|
|
878
926
|
this.formId = formId;
|
|
879
927
|
this.schema = schema;
|
|
@@ -887,6 +935,7 @@ class FormHandler {
|
|
|
887
935
|
this._boundHandleInput = this.#handleInput.bind(this);
|
|
888
936
|
this.#init();
|
|
889
937
|
}
|
|
938
|
+
// Initialize listeners and capture initial state.
|
|
890
939
|
#init() {
|
|
891
940
|
this.form = document.getElementById(this.formId);
|
|
892
941
|
if (!this.form) {
|
|
@@ -898,6 +947,7 @@ class FormHandler {
|
|
|
898
947
|
this.form.addEventListener("input", this._boundHandleInput);
|
|
899
948
|
this.#publishState();
|
|
900
949
|
}
|
|
950
|
+
// Setup initial values of the form.
|
|
901
951
|
#captureInitialValues() {
|
|
902
952
|
const formElements = this.form.elements;
|
|
903
953
|
for (const element of Array.from(formElements)) {
|
|
@@ -907,6 +957,7 @@ class FormHandler {
|
|
|
907
957
|
}
|
|
908
958
|
}
|
|
909
959
|
}
|
|
960
|
+
// Handle every input as they happen in here
|
|
910
961
|
#handleInput(event) {
|
|
911
962
|
const { name, value } = event.target;
|
|
912
963
|
if (!name) return;
|
|
@@ -917,6 +968,7 @@ class FormHandler {
|
|
|
917
968
|
this.#publishErrors();
|
|
918
969
|
}
|
|
919
970
|
}
|
|
971
|
+
// Handle the form submission.
|
|
920
972
|
async #handleSubmit(event) {
|
|
921
973
|
event.preventDefault();
|
|
922
974
|
const data = new FormData(this.form);
|
|
@@ -973,12 +1025,15 @@ class FormHandler {
|
|
|
973
1025
|
errors: { ...this.errors }
|
|
974
1026
|
});
|
|
975
1027
|
}
|
|
1028
|
+
/** @returns {Object} Copy of form state */
|
|
976
1029
|
getFormState() {
|
|
977
1030
|
return { ...this.formState };
|
|
978
1031
|
}
|
|
1032
|
+
/** @returns {Object} Copy of current errors */
|
|
979
1033
|
getErrors() {
|
|
980
1034
|
return { ...this.errors };
|
|
981
1035
|
}
|
|
1036
|
+
// Reset form to initial values.
|
|
982
1037
|
reset() {
|
|
983
1038
|
this.formState = { ...this.initialValues };
|
|
984
1039
|
this.errors = {};
|
|
@@ -989,6 +1044,7 @@ class FormHandler {
|
|
|
989
1044
|
this.#publishErrors();
|
|
990
1045
|
EVT.pub(FormEvents.RESET, { formId: this.formId });
|
|
991
1046
|
}
|
|
1047
|
+
// Manually trigger validation
|
|
992
1048
|
validateNow() {
|
|
993
1049
|
const data = new FormData(this.form);
|
|
994
1050
|
const formObject = {};
|
|
@@ -1006,6 +1062,7 @@ class FormHandler {
|
|
|
1006
1062
|
});
|
|
1007
1063
|
return result;
|
|
1008
1064
|
}
|
|
1065
|
+
// Destroy listeners
|
|
1009
1066
|
destroy() {
|
|
1010
1067
|
if (this.form) {
|
|
1011
1068
|
this.form.removeEventListener("submit", this._boundHandleSubmit);
|
|
@@ -1014,6 +1071,10 @@ class FormHandler {
|
|
|
1014
1071
|
}
|
|
1015
1072
|
}
|
|
1016
1073
|
class FormErrorRenderer {
|
|
1074
|
+
/**
|
|
1075
|
+
* @param {string} formId form element id string
|
|
1076
|
+
* @param {FormHandlerOptions} [options]
|
|
1077
|
+
*/
|
|
1017
1078
|
constructor(formId, options = {}) {
|
|
1018
1079
|
this.formId = formId;
|
|
1019
1080
|
this.options = {
|
|
@@ -1031,6 +1092,11 @@ class FormErrorRenderer {
|
|
|
1031
1092
|
this.clearAll();
|
|
1032
1093
|
this.renderAll(errors);
|
|
1033
1094
|
}
|
|
1095
|
+
/**
|
|
1096
|
+
* Set custom error container
|
|
1097
|
+
* @param {string} fieldName name of the field within the formo
|
|
1098
|
+
* @param {HTMLElement|string} container value to set the custom container with
|
|
1099
|
+
*/
|
|
1034
1100
|
setContainer(fieldName, container) {
|
|
1035
1101
|
this.customContainers[fieldName] = typeof container === "string" ? document.querySelector(container) : container;
|
|
1036
1102
|
}
|
|
@@ -1082,9 +1148,9 @@ class FormErrorRenderer {
|
|
|
1082
1148
|
this.clearAll();
|
|
1083
1149
|
}
|
|
1084
1150
|
}
|
|
1085
|
-
function useFormHandler(formId, schema, onSubmit) {
|
|
1086
|
-
const h = new FormHandler(formId, schema, onSubmit);
|
|
1087
|
-
const r = new FormErrorRenderer(formId);
|
|
1151
|
+
function useFormHandler(formId, schema, onSubmit, options) {
|
|
1152
|
+
const h = new FormHandler(formId, schema, onSubmit, options);
|
|
1153
|
+
const r = new FormErrorRenderer(formId, options);
|
|
1088
1154
|
return {
|
|
1089
1155
|
reset: () => h.reset(),
|
|
1090
1156
|
validate: () => h.validateNow(),
|
package/dist/vaniy.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vaniy.es.js","sources":["../src/evt.js","../src/utils.js","../src/date.js","../src/validator.js","../src/dom.js","../src/http.js","../src/form.js","../src/cache.js"],"sourcesContent":["\"use strict\";\n\nconst EVT = {\n listeners: new Map(),\n sub: function (name, callback) {\n let handlers = this.listeners.get(name);\n if (!handlers) {\n handlers = new Set();\n this.listeners.set(name, handlers);\n }\n handlers.add(callback);\n },\n once: function (name, callback) {\n const onceCallback = (...args) => {\n callback(...args);\n this.unsub(name, onceCallback);\n };\n this.sub(name, onceCallback);\n },\n unsub: function (name, cb) {\n let handlers = this.listeners.get(name);\n if (!handlers) return;\n handlers.delete(cb);\n },\n pub: function (name, ...data) {\n let handlers = this.listeners.get(name);\n if (!handlers) return;\n handlers.forEach((cb) => {\n try {\n cb(...data);\n } catch (e) {\n console.error(`Error in event \"${name}\" listener: `, e);\n }\n });\n },\n has: function (name) {\n return this.listeners.has(name) && this.listeners.get(name).size > 0;\n },\n clear: function (name) {\n if (name) {\n this.listeners.delete(name);\n } else {\n this.listeners.clear();\n }\n },\n ping: () => console.log(\"PONG!\"),\n description: \"EVT is for Event publishing and emitting\",\n};\n\nexport default EVT;\n","\"use strict\";\n\nexport const redirect = (url) => (window.location.href = url);\n\nexport const isArray = (arr) => Array.isArray(arr);\nexport const isArrayEmpty = (arr) => !(Array.isArray(arr) && arr.length > 0);\n\nexport const isFocus = (element) => element == document.activeElement;\n\nconst currencyMap = {\n US: { locale: \"en-US\", currency: \"USD\" },\n CA: { locale: \"en-CA\", currency: \"CAD\" },\n FR: { locale: \"fr-FR\", currency: \"EUR\" },\n HT: { locale: \"ht-HT\", currency: \"HTG\" },\n GB: { locale: \"en-GB\", currency: \"GBP\" },\n AU: { locale: \"en-AU\", currency: \"AUD\" },\n};\n\nexport const toCurrency = (\n value,\n { locale = \"en-US\", currency = \"USD\" } = {},\n) =>\n Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: currency,\n }).format(value);\n\nexport const formatByCountry = (value, countryCode) => {\n const config = currencyMap[countryCode] ?? currencyMap[\"US\"];\n return toCurrency(value, config);\n};\n\nexport const isValidRoutingNumber = (routingNumber) => {\n if (!/^\\d{9}$/.test(routingNumber)) {\n return false;\n }\n\n // Split the routing number into individual digits\n const digits = routingNumber.split(\"\").map(Number);\n\n // Calculate the weighted sum\n const sum =\n 7 * (digits[0] + digits[3] + digits[6]) +\n 3 * (digits[1] + digits[4] + digits[7]) +\n 1 * (digits[2] + digits[5] + digits[8]);\n\n // Check if the sum is a multiple of 10\n return sum % 10 === 0;\n};\n\nfunction isNumericLike(value) {\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"string\") return false;\n\n const s = v.trim();\n if (!s) return false;\n return /^-?\\d+(\\.\\d+)?$/.test(s);\n}\n\nexport function autoSize(value) {\n if (Array.isArray(value)) return value.length;\n if (isNumericLike(value)) return Number(String(value).trim());\n return String(value ?? \"\").length;\n}\n\nexport function parseMinMax(param) {\n const [minRaw, maxRaw] = String(param ?? \"\")\n .split(\",\")\n .map((s) => s.trim());\n\n const min = Number(minRaw);\n const max = Number(maxRaw);\n\n if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n return { min, max };\n}\n\nexport function isBlank(v) {\n return v == null || String(v ?? \"\").trim() === \"\";\n}\n\n\n\n","import { isBlank } from \"./utils.js\";\n\nfunction parseByFormat(value, fmt) {\n const v = String(value ?? \"\").trim();\n\n if (!v) return null;\n\n if (fmt === \"YYYY-MM-DD\") {\n const m = v.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n const year = Number(m[1]);\n const month = Number(m[2]);\n const day = Number(m[3]);\n\n if (!year || month < 1 || month > 12 || day < 1 || day > 31) return null;\n return { year, month, day };\n }\n\n return null;\n}\n\nfunction getZoneParts(date, timeZone, locale = \"en-US\") {\n const dtf = new Intl.DateTimeFormat(locale, {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n\n const parts = dtf.formatToParts(date);\n\n const map = Object.fromEntries(parts.map((p) => [p.type, p.value]));\n\n return {\n year: Number(map.year),\n month: Number(map.month),\n day: Number(map.day),\n hour: Number(map.hour),\n minute: Number(map.minute),\n second: Number(map.second),\n };\n}\n\nfunction zonedMidnightToUtcMs({ year, month, day }, timeZone) {\n // Convert \"YYYY-MM-DD midnight in timeZone\" to UTC epoch ms\n // Approach: start with a UTC guess, then correct using formatted parts in tz (1-2 iterations).\n let guess = Date.UTC(year, month - 1, day, 0, 0, 0);\n\n for (let i = 0; i < 2; i++) {\n const got = getZoneParts(new Date(guess), timeZone);\n\n // We want got = {year,month,day,00:00:00}\n // Compute how far off we are, in minutes.\n const gotAsUtc = Date.UTC(\n got.year,\n got.month - 1,\n got.day,\n got.hour,\n got.minute,\n got.second,\n );\n const wantAsUtc = Date.UTC(year, month - 1, day, 0, 0, 0);\n\n const diffMs = gotAsUtc - wantAsUtc;\n if (diffMs === 0) break;\n\n guess -= diffMs;\n }\n\n return guess;\n}\n\nfunction addDaysYMD({ year, month, day }, deltaDays) {\n // Use UTC to avoid local DST weirdness while adding days.\n const d = new Date(Date.UTC(year, month - 1, day));\n d.setUTCDate(d.getUTCDate() + deltaDays);\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n };\n}\n\nfunction parseTargetWithOffset(target) {\n // supports: \"today+7\", \"today-30\", \"end_date+7\"\n const m = String(target)\n .trim()\n .match(/^(.+?)([+-]\\d+)?$/);\n if (!m) return { base: String(target).trim(), offsetDays: 0 };\n return { base: m[1].trim(), offsetDays: m[2] ? Number(m[2]) : 0 };\n}\n\nfunction resolveYMDFromKeyword(keyword, timeZone) {\n const now = new Date();\n const { year, month, day } = getZoneParts(now, timeZone);\n if (keyword === \"today\") return { year, month, day };\n if (keyword === \"tomorrow\") return addDaysYMD({ year, month, day }, 1);\n if (keyword === \"yesterday\") return addDaysYMD({ year, month, day }, -1);\n return null;\n}\n\nfunction resolveYMD(target, formData, opts) {\n const { base, offsetDays } = parseTargetWithOffset(target);\n\n // 1) keyword\n let ymd = resolveYMDFromKeyword(base, opts.timezone);\n\n // 2) field reference\n if (!ymd) {\n const fieldVal = formData?.[base];\n ymd = parseStrictToYMD(fieldVal, opts);\n }\n\n // 3) literal date string (e.g. \"2026-01-01\") as a target\n if (!ymd) {\n ymd = parseByFormat(base, opts.dateFormat);\n }\n\n if (!ymd) return null;\n\n if (offsetDays) ymd = addDaysYMD(ymd, offsetDays);\n return ymd;\n}\n\nfunction isIsoLikeDateTimeString(s) {\n // Examples:\n // 2026-01-20T15:30:00Z\n // 2026-01-20T15:30:00.123Z\n // 2026-01-20T15:30:00-05:00\n // 2026-01-20 15:30:00Z (space tolerated if you want)\n return /^\\d{4}-\\d{2}-\\d{2}[T\\s]\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})?$/.test(\n s,\n );\n}\n\nfunction parseStrictToYMD(input, opts) {\n if (isBlank(input)) return null;\n\n const raw = String(input).trim();\n\n // 1) exact dateFormat\n let ymd = parseByFormat(raw, opts.dateFormat);\n if (ymd) return ymd;\n\n // 2) strict fallback: ISO-like datetime only\n if (!isIsoLikeDateTimeString(raw)) return null;\n\n const d = new Date(raw);\n if (isNaN(d.getTime())) return null;\n\n const parts = getZoneParts(d, opts.timezone);\n return { year: parts.year, month: parts.month, day: parts.day };\n}\n\nexport function resolveDateEpochDay(valueOrTarget, formData, opts, mode) {\n // mode:\n // - \"value\": parse actual field value\n // - \"target\": resolve keyword/field/literal + offset\n let ymd = null;\n\n if (mode === \"value\") {\n ymd = parseStrictToYMD(valueOrTarget, opts);\n } else {\n ymd = resolveYMD(valueOrTarget, formData, opts);\n }\n\n if (!ymd) return null;\n return zonedMidnightToUtcMs(ymd, opts.timezone);\n}\n","\"use strict\";\n\nimport { resolveDateEpochDay } from \"./date.js\";\nimport { parseMinMax, autoSize } from \"./utils.js\";\n\nfunction makeDateCompareRule(compare, messageBuilder) {\n return {\n method: (target) => (value, formData, opts) => {\n const left = resolveDateEpochDay(value, formData, opts, \"value\");\n const right = resolveDateEpochDay(target, formData, opts, \"target\");\n if (left == null || right == null) return false;\n return compare(left, right);\n },\n message: messageBuilder,\n };\n}\n\nconst methods = {\n required: {\n method: (value) => String(value ?? \"\").trim() !== \"\",\n message: \"This field is required\",\n },\n requiredIf: {\n method: (expression) => (value, formData) => {\n const [field, expected] = String(expression).split(\"=\");\n const otherValue = formData?.[field];\n\n const condition =\n expected != null\n ? String(otherValue ?? \"\") === expected\n : String(otherValue ?? \"\").trim() !== \"\";\n\n // if condition is true, this field must be non-empty\n if (condition) {\n return String(value ?? \"\").trim() !== \"\";\n }\n\n // otherwise it's optional\n return true;\n },\n message: (expression) => {\n const [field, expected] = String(expression).split(\"=\");\n\n return expected != null\n ? `This field is requied when ${field} is ${expected}`\n : `This field is required when ${field} has a value`;\n },\n },\n email: {\n method: (value) => /\\S+@\\S+\\.\\S+/.test(value),\n message: \"Email is invalid\",\n },\n min: {\n method: (length) => (value) => String(value ?? \"\").length >= Number(length),\n message: (length) => `Must be at least ${length} characters`,\n },\n max: {\n method: (length) => (value) => String(value ?? \"\").length <= Number(length),\n message: (length) => `Must be at most ${length} characters`,\n },\n date: {\n method: (value) => {\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value)) return false;\n const [year, month, day] = value.split(\"-\").map(Number);\n const date = new Date(year, month - 1, day);\n return (\n date.getFullYear() === year &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n );\n },\n message: \"Date is invalid. Use the format YYYY-MM-DD.\",\n },\n currency: {\n method: (value) => /^\\$?\\d{1,3}((,\\d{3})*|\\d*)(\\.\\d{2})?$/.test(value),\n message: \"Currency is invalid. Use the format $123,456.78 or 123456.78.\",\n },\n same: {\n method: (otherField) => (value, formData) =>\n String(value ?? \"\") === String(formData?.[otherField] ?? \"\"),\n message: (otherField) => `Must match ${otherField}`,\n },\n in: {\n method: (list) => (value) => {\n const allowed = Array.isArray(list)\n ? list\n : String(list ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n return allowed.includes(String(value ?? \"\").trim());\n },\n message: (list) => {\n const allowed = Array.isArray(list)\n ? list\n : String(list ?? \"\")\n .split(\",\")\n .map((s) => s.trim());\n return `Must be one of the following: ${allowed.filter(Boolean).join(\",\")}`;\n },\n },\n before: makeDateCompareRule(\n (left, right) => left < right,\n (target) => `Must be before ${target}`,\n ),\n beforeOrEqual: makeDateCompareRule(\n (left, right) => left <= right,\n (target) => `Must be before or equal to ${target}`,\n ),\n after: makeDateCompareRule(\n (left, right) => left > right,\n (target) => `Must be after ${target}`,\n ),\n afterOrEqual: makeDateCompareRule(\n (left, right) => left >= right,\n (target) => `Must be after or equal to ${target}`,\n ),\n between: {\n method: (param) => (value) => {\n const range = parseMinMax(param);\n if (!range) return false;\n\n const size = autoSize(value);\n return range.min <= size && size <= range.max;\n },\n message: (param) => {\n const range = parseMinMax(param);\n if (!range) return \"Between rule is invalid. Use between:min,max\";\n return `Must be between ${range.min} and ${range.max}`;\n },\n },\n};\n\nfunction parseRule(rule) {\n const index = rule.indexOf(\":\");\n if (index === -1) return { name: rule, param: undefined };\n return { name: rule.slice(0, index), param: rule.slice(index + 1) };\n}\n\nfunction run(schema, formData) {\n let isValid = true;\n const errors = {};\n\n for (const field in schema) {\n const rules = schema[field] || [];\n\n for (const ruleString of rules) {\n const { name, param } = parseRule(ruleString);\n const validationMethod = methods[name];\n\n if (!validationMethod) {\n //unknown rule - skip\n continue;\n }\n\n const value = formData?.[field];\n\n const isFieldValid =\n param !== undefined\n ? validationMethod.method(param)(value, formData)\n : validationMethod.method(value, formData);\n\n if (!isFieldValid) {\n isValid = false;\n if (!errors[field]) {\n errors[field] = [];\n }\n\n const errorMessage =\n typeof validationMethod.message === \"function\"\n ? validationMethod.message(param)\n : validationMethod.message;\n\n errors[field].push(errorMessage);\n }\n }\n }\n return { isValid, errors };\n}\n\nconst V = {\n run,\n ping: () => console.log(\"PONG\"),\n description: \"V is for validating forms\",\n};\n\nexport default V;\n","\"use strict\";\n\nconst hook = (element) => ({\n on: (event, callback) => element?.addEventListener(event, callback),\n off: (event, callback) => element?.removeEventListener(event, callback),\n});\n\nconst text = (element, value) => {\n if (!element) return undefined;\n const prop = \"innerText\" in element ? \"innerText\" : \"textContent\";\n if (value != null) element[prop] = value; // allows empty string\n return element[prop];\n};\n\nconst html = (element, value) => {\n if (!element) return undefined;\n if (value != null) element.innerHTML = value;\n return element.innerHTML;\n};\n\nexport const make = (name) => document.createElement(name);\n\nexport const makeId = (length) => {\n let result = \"\";\n const alphaNum =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n const alphaNumLength = alphaNum.length;\n\n for (let i = 0; i < length; i++) {\n result += alphaNum.charAt(Math.floor(Math.random() * alphaNumLength));\n }\n return result;\n};\n\nexport const parseHtml = (source) => {\n const tmp = document.implementation.createHTMLDocument(\"\");\n tmp.body.innerHTML = source;\n return [...tmp.body.childNodes];\n};\n\nexport const onPageLoad = (callback) => {\n if (document.readyState !== \"loading\") callback();\n else document.addEventListener(\"DOMContentLoaded\", callback);\n};\n\nexport const onWindowLoad = (callback) => {\n window.onload = callback;\n};\n\nexport const Q = (input) => {\n const selectedElement =\n typeof input === \"string\" ? document.querySelector(input) : input;\n\n const safe =\n (fn) =>\n (...args) => {\n if (!selectedElement) return undefined;\n return fn(...args);\n };\n\n const wrapper = {\n elt: selectedElement,\n value: selectedElement?.value,\n text: (val) => {\n if (val != null) {\n text(selectedElement, val);\n return wrapper;\n }\n return text(selectedElement);\n },\n html: (val) => {\n if (val != null) {\n html(selectedElement, val);\n return wrapper;\n }\n return html(selectedElement);\n },\n val: safe(() => {\n if (selectedElement.options && selectedElement.multiple) {\n return Array.from(selectedElement.options)\n .filter((opt) => opt.selected)\n .map((opt) => opt.value);\n }\n return selectedElement.value;\n }),\n addClass: safe((className) => {\n selectedElement.classList.add(className);\n return wrapper;\n }),\n removeClass: safe((className) => {\n selectedElement.classList.remove(className);\n return wrapper;\n }),\n hasClass: safe((className) => {\n return selectedElement.classList.contains(className);\n }),\n hide: safe(() => {\n selectedElement.style.display = \"none\";\n return wrapper;\n }),\n show: safe(() => {\n selectedElement.style.display = \"\";\n return wrapper;\n }),\n prop: safe((propertyName) => selectedElement[propertyName]),\n attr: safe((attributeName) => selectedElement.getAttribute(attributeName)),\n removeAttr: (attributeName) => {\n selectedElement.removeAttribute(attributeName);\n },\n toggle: safe(() => {\n if (selectedElement.style.display == \"none\") wrapper.show();\n else wrapper.hide();\n return wrapper;\n }),\n css: safe((styleObject) => {\n Object.entries(styleObject).forEach(([key, value]) => {\n selectedElement.style[key] = value;\n });\n return wrapper;\n }),\n on: hook(selectedElement).on,\n off: hook(selectedElement).off,\n };\n return wrapper;\n};\n\nexport const all = (selector) => {\n const selectedElements = document.querySelectorAll(selector);\n return selectedElements;\n};\n\nexport const scan = (rootSelector, options = {}) => {\n const refAttr = options.refAttr || \"v-ref\";\n\n const root =\n typeof rootSelector === \"string\"\n ? document.querySelector(rootSelector)\n : rootSelector || document;\n\n if (!root) throw new Error(`Dom.scan: root \"${rootSelector}\" not found`);\n\n const cache = Object.create(null);\n\n //collect elements\n root.querySelectorAll(`[${refAttr}]`).forEach((el) => {\n const key = el.getAttribute(refAttr);\n if (!key) return;\n\n const wrapped = Q(el);\n\n // support multple refs with the same name -> array\n if (cache[key]) {\n if (Array.isArray(cache[key])) cache[key].push(wrapped);\n else cache[key] = [cache[key], wrapped];\n } else {\n cache[key] = wrapped;\n }\n });\n // proxy\n return new Proxy(\n {},\n {\n get(_, prop) {\n if (prop === \"_\") return cache;\n if (prop === \"get\") return (k) => cache[k];\n if (prop === \"all\")\n return (k) =>\n cache[k] ? (Array.isArray(cache[k]) ? cache[k] : [cache[k]]) : [];\n\n if (typeof prop !== \"string\") return undefined;\n\n const val = cache[prop];\n\n if (!val) {\n console.warn(`DOM.scan: ref \"${prop}\" not found`);\n return Q(null);\n }\n return val;\n },\n },\n );\n};\n\nconst DOM = {\n Q,\n $: Q,\n all,\n $$: all,\n scan,\n make,\n makeId,\n parseHtml,\n onPageLoad,\n onWindowLoad,\n ping: () => console.log(\"PONG!\"),\n description: \"DOM is for dom manipulation\",\n};\n\nexport default DOM;\n","\"use strict\";\n\nlet _base = \"\";\nlet _timeout = 8000;\nlet _requestInterceptor = null;\nlet _responseInterceptor = null;\n\nconst memoryStore = new Map();\nconst now = () => Date.now();\n\nfunction makeStorageAdapter(kind) {\n const store = typeof window !== \"undefined\" ? window[kind] : null;\n if (!store) return null;\n return {\n get(key) {\n const raw = store.getItem(key);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed.exp && parsed.exp < now()) {\n store.removeItem(key);\n return null;\n }\n return parsed.val;\n } catch {\n return null;\n }\n },\n set(key, val, ttl) {\n const exp = ttl ? now() + ttl : null;\n store.setItem(key, JSON.stringify({ val, exp }));\n },\n del(key) {\n if (store) store.removeItem(key);\n },\n clear() {\n if (store) store.clear();\n },\n };\n}\n\nconst storages = {\n memory: {\n get(key) {\n const hit = memoryStore.get(key);\n if (!hit) return null;\n if (hit.exp && hit.exp < now()) {\n memoryStore.delete(key);\n return null;\n }\n return hit.val;\n },\n set(key, val, ttl) {\n const exp = ttl ? now() + ttl : null;\n memoryStore.set(key, { val, exp });\n },\n del(key) {\n memoryStore.delete(key);\n },\n clear() {\n memoryStore.clear();\n },\n },\n local: makeStorageAdapter(\"localStorage\"),\n session: makeStorageAdapter(\"sessionStorage\"),\n};\n\nfunction stableStringify(obj) {\n if (obj === null || typeof obj !== \"object\") return String(obj);\n if (Array.isArray(obj)) return `[${obj.map(stableStringify).join(\",\")}]`;\n return `{${Object.keys(obj)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`)\n .join(\",\")}}`;\n}\n\nfunction getStorage(storageKind = \"memory\") {\n return storages[storageKind] || storages.memory;\n}\n\nfunction buildCacheKey(method, url, params, body) {\n const p = params ? `?${new URLSearchParams(params).toString()}` : \"\";\n const b = body && method !== \"GET\" ? `#${stableStringify(body)}` : \"\";\n return `H|${method}|${url}${p}${b}`;\n}\n\nfunction buildFormData({ files, fieldName = \"file\", fields = {} }) {\n const fd = new FormData();\n\n const list = Array.isArray(files) ? files : [files];\n list.forEach((f, i) => {\n const name = list.length > 1 ? `${fieldName}[${i}]` : fieldName;\n fd.append(name, f);\n });\n\n Object.entries(fields).forEach(([k, v]) => {\n fd.append(\n k,\n v instanceof Blob || v instanceof File\n ? v\n : typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v),\n );\n });\n\n return fd;\n}\n\nconst applyTimeout = (ms, controller) =>\n setTimeout(() => controller.abort(), ms);\n\nexport async function request(method, url, opts = {}) {\n const { params, body, headers = {}, cache } = opts;\n\n let finalUrl = _base + url;\n if (params) {\n const qs = new URLSearchParams(params).toString();\n finalUrl += (finalUrl.includes(\"?\") ? \"&\" : \"?\") + qs;\n }\n\n const controller = new AbortController();\n const timeoutId = applyTimeout(_timeout, controller);\n const useCache = !!cache;\n const strategy = cache?.strategy; // 'cache-first' | 'network-first'\n const ttl = cache?.ttl ?? 0;\n const storage = getStorage(cache?.storage);\n const cacheKey = cache?.key || buildCacheKey(method, finalUrl, params, body);\n\n if (useCache && !cache?.forceRefresh && strategy === \"cache-first\") {\n const hit = storage.get(cacheKey);\n if (hit !== null) return hit;\n }\n\n // Build URL with base + query params\n\n let config = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n if (body instanceof FormData) {\n config.body = body;\n } else {\n config.headers[\"Content-Type\"] = \"application/json\";\n config.body = JSON.stringify(body);\n }\n }\n\n if (_requestInterceptor) {\n config = _requestInterceptor(config) || config;\n }\n\n try {\n let res = await fetch(finalUrl, config);\n clearTimeout(timeoutId);\n\n if (_responseInterceptor) {\n res = _responseInterceptor(res) || res;\n }\n\n // Try to parse JSON but fallback to text\n let data;\n try {\n data = await res.json();\n } catch {\n data = await res.text();\n }\n\n if (!res.ok) {\n const err = {\n status: res.status,\n data,\n url: finalUrl,\n method,\n };\n //for network-first with cache fallback on error, try cached value\n if (useCache && strategy === \"network-first\") {\n const cached = storage.get(cacheKey);\n if (cached !== null) return cached;\n }\n throw err;\n }\n\n if (useCache) {\n storage.set(cacheKey, data, ttl);\n }\n return data;\n } catch (err) {\n clearTimeout(timeoutId);\n if (useCache && strategy === \"network-first\") {\n const cached = storage.get(cacheKey);\n if (cached !== null) return cached;\n }\n throw err;\n }\n}\n\nexport async function download(\n url,\n { filename, params, headers = {}, method = \"GET\", body, onProgress } = {},\n) {\n // Build URL w/ base + params\n let finalUrl = _base + url;\n if (params) {\n const qs = new URLSearchParams(params).toString();\n finalUrl += (finalUrl.includes(\"?\") ? \"&\" : \"?\") + qs;\n }\n\n const controller = new AbortController();\n const timeoutId = applyTimeout(_timeout, controller);\n\n // Prepare request\n const init = {\n method,\n headers: { ...headers },\n signal: controller.signal,\n };\n if (body !== undefined) {\n if (body instanceof FormData) {\n init.body = body;\n } else {\n init.headers[\"Content-Type\"] =\n init.headers[\"Content-Type\"] || \"application/json\";\n init.body = typeof body === \"string\" ? body : JSON.stringify(body);\n }\n }\n\n const res = await fetch(finalUrl, init);\n clearTimeout(timeoutId);\n if (!res.ok) {\n let errText = \"\";\n try {\n errText = await res.text();\n } catch {}\n throw new Error(\n `Download failed ${res.status}: ${errText || res.statusText}`,\n );\n }\n\n // Try to infer filename from Content-Disposition\n if (!filename) {\n const cd = res.headers.get(\"Content-Disposition\") || \"\";\n const match = /filename\\*=UTF-8''([^;]+)|filename=\"?([^\"]+)\"?/i.exec(cd);\n filename = decodeURIComponent(match?.[1] || match?.[2] || \"download\");\n }\n\n // Stream with progress if possible\n let blob;\n if (res.body && \"getReader\" in res.body) {\n const reader = res.body.getReader();\n const contentLength = Number(res.headers.get(\"Content-Length\")) || null;\n const chunks = [];\n let received = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n received += value.length;\n if (typeof onProgress === \"function\") {\n const percent = contentLength\n ? Math.round((received / contentLength) * 100)\n : null;\n onProgress(received, contentLength, percent);\n }\n }\n blob = new Blob(chunks);\n } else {\n blob = await res.blob();\n if (typeof onProgress === \"function\") onProgress(1, 1, 100);\n }\n\n // Trigger browser download\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = filename;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(href);\n\n return { filename, size: blob.size, type: blob.type };\n}\n\nexport function upload(\n url,\n {\n files, // File | Blob | File[] | Blob[]\n fieldName = \"file\", // form field name(s)\n fields = {}, // additional form fields (e.g., { name: \"Pascal\" })\n headers = {}, // extra headers (don't set Content-Type yourself)\n method = \"POST\",\n onProgress, // (sentBytes, totalBytes, percent) => void\n signal, // AbortSignal\n } = {},\n) {\n return new Promise((resolve, reject) => {\n const fd = buildFormData({ files, fieldName, fields });\n\n // Build URL with base\n const finalUrl = `${_base}${url}`;\n\n // Use XHR for upload progress\n const xhr = new XMLHttpRequest();\n xhr.open(method, finalUrl, true);\n\n // apply interceptors (request)\n let cfg = { method, headers: { ...headers } };\n if (_requestInterceptor) {\n cfg = _requestInterceptor(cfg) || cfg;\n }\n\n // set headers AFTER interceptor (never set Content-Type for FormData manually)\n Object.entries(cfg.headers).forEach(([k, v]) => xhr.setRequestHeader(k, v));\n\n // timeout (ms)\n xhr.timeout = _timeout;\n\n // abort support\n if (signal) {\n const onAbort = () => {\n try {\n xhr.abort();\n } catch {}\n };\n if (signal.aborted) onAbort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n // progress\n if (xhr.upload && typeof onProgress === \"function\") {\n xhr.upload.onprogress = (e) => {\n if (!e.lengthComputable) {\n onProgress(e.loaded, null, null);\n return;\n }\n const percent = Math.round((e.loaded / e.total) * 100);\n onProgress(e.loaded, e.total, percent);\n };\n }\n\n xhr.onreadystatechange = async () => {\n if (xhr.readyState !== 4) return;\n\n // apply interceptor (response-like)\n if (_responseInterceptor) {\n // minimal fake Response compatible object\n const fakeRes = {\n status: xhr.status,\n ok: xhr.status >= 200 && xhr.status < 300,\n headers: new Headers(), // not fully accurate; fine for logging/hook\n text: async () => xhr.responseText,\n json: async () => JSON.parse(xhr.responseText || \"null\"),\n };\n _responseInterceptor(fakeRes);\n }\n\n // parse JSON or text\n const contentType = xhr.getResponseHeader(\"Content-Type\") || \"\";\n const isJson = contentType.includes(\"application/json\");\n const payload = isJson ? safeJson(xhr.responseText) : xhr.responseText;\n\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(payload);\n } else {\n reject({\n status: xhr.status,\n data: payload,\n url: finalUrl,\n method,\n });\n }\n };\n\n xhr.onerror = () =>\n reject({\n status: 0,\n data: \"Network error\",\n url: `${_base}${url}`,\n method,\n });\n xhr.ontimeout = () =>\n reject({\n status: 0,\n data: \"Timeout\",\n url: `${_base}${url}`,\n method,\n });\n\n xhr.send(fd);\n });\n\n function safeJson(t) {\n try {\n return JSON.parse(t || \"null\");\n } catch {\n return t;\n }\n }\n}\n\nexport const get = (url, opts) => request(\"GET\", url, opts);\nexport const post = (url, body, opts = {}) =>\n request(\"POST\", url, { ...opts, body });\nexport const put = (url, body, opts = {}) =>\n request(\"PUT\", url, { ...opts, body });\nexport const del = (url, opts = {}) => request(\"DELETE\", url, opts);\nexport const raw = (url, opts) => fetch(_base + url, opts);\n\nconst HTTP = {\n base(url) {\n _base = url;\n return HTTP;\n },\n timeout(ms) {\n _timeout = ms;\n return HTTP;\n },\n interceptRequest(fn) {\n _requestInterceptor = fn;\n return HTTP;\n },\n interceptResponse(fn) {\n _responseInterceptor = fn;\n return HTTP;\n },\n\n get,\n post,\n put,\n delete: del,\n raw,\n download,\n upload,\n ping: () => console.log(\"PONG\"),\n description: \"H is for Http\",\n};\n\nexport default HTTP;\n","\"use strict\";\n\nimport EVT from \"./evt.js\";\nimport V from \"./validator.js\";\n\nconst FormEvents = {\n STATE_CHANGE: \"form:state:change\",\n ERRORS_CHANGE: \"form:errors:change\",\n SUBMIT_SUCCESS: \"form:submit:success\",\n SUBMIT_ERROR: \"form:submit:error\",\n RESET: \"form:reset\",\n VALIDATED: \"form:validated\",\n};\n\nclass FormHandler {\n constructor(formId, schema, onSubmit, options = {}) {\n this.formId = formId;\n this.schema = schema;\n this.onSubmit = onSubmit;\n this.preSubmit = options.preSubmit || null;\n this.form = null;\n this.formState = {};\n this.errors = {};\n this.initialValues = {};\n\n this._boundHandleSubmit = this.#handleSubmit.bind(this);\n this._boundHandleInput = this.#handleInput.bind(this);\n\n this.#init();\n }\n\n #init() {\n this.form = document.getElementById(this.formId);\n\n if (!this.form) {\n console.error(`Form with id ${this.formId} not found`);\n return;\n }\n\n this.#captureInitialValues();\n this.form.addEventListener(\"submit\", this._boundHandleSubmit);\n this.form.addEventListener(\"input\", this._boundHandleInput);\n\n this.#publishState();\n }\n\n #captureInitialValues() {\n const formElements = this.form.elements;\n\n for (const element of Array.from(formElements)) {\n if (element.name) {\n this.initialValues[element.name] = element.value;\n this.formState[element.name] = element.value;\n }\n }\n }\n\n #handleInput(event) {\n const { name, value } = event.target;\n if (!name) return;\n\n this.formState[name] = value;\n this.#publishState();\n\n if (this.errors[name]) {\n delete this.errors[name];\n this.#publishErrors();\n }\n }\n\n async #handleSubmit(event) {\n event.preventDefault();\n\n const data = new FormData(this.form);\n let formObject = {};\n\n data.forEach((value, key) => {\n formObject[key] = value;\n });\n\n this.formState = formObject;\n this.#publishState();\n\n const { isValid, errors: validateErrors } = V.run(this.schema, formObject);\n\n EVT.pub(FormEvents.VALIDATED, {\n formId: this.formId,\n isValid,\n errors: validateErrors,\n data: formObject,\n });\n\n if (!isValid) {\n this.errors = validateErrors;\n this.#publishErrors();\n\n EVT.pub(FormEvents.SUBMIT_ERROR, {\n formId: this.formId,\n errors: validateErrors,\n });\n return;\n }\n\n this.errors = {};\n this.#publishErrors();\n\n if (this.preSubmit) {\n try {\n formObject = await this.preSubmit(formObject);\n } catch (error) {\n EVT.pub(FormEvents.SUBMIT_ERROR, {\n formId: this.formId,\n errors: { _preSubmit: [error.message] },\n });\n return;\n }\n }\n\n EVT.pub(FormEvents.SUBMIT_SUCCESS, {\n formId: this.formId,\n data: formObject,\n });\n\n this.onSubmit(formObject);\n }\n\n #publishState() {\n EVT.pub(FormEvents.STATE_CHANGE, {\n formId: this.formId,\n state: { ...this.formState },\n });\n }\n\n #publishErrors() {\n EVT.pub(FormEvents.ERRORS_CHANGE, {\n formId: this.formId,\n errors: { ...this.errors },\n });\n }\n\n getFormState() {\n return { ...this.formState };\n }\n\n getErrors() {\n return { ...this.errors };\n }\n reset() {\n this.formState = { ...this.initialValues };\n this.errors = {};\n\n if (this.form) {\n this.form.reset();\n }\n\n this.#publishState();\n this.#publishErrors();\n\n EVT.pub(FormEvents.RESET, { formId: this.formId });\n }\n\n validateNow() {\n const data = new FormData(this.form);\n const formObject = {};\n\n data.forEach((value, key) => {\n formObject[key] = value;\n });\n\n const result = V.run(this.schema, formObject);\n this.errors = result.errors;\n this.#publishErrors();\n\n EVT.pub(FormEvents.VALIDATED, {\n formId: this.formId,\n isValid: result.isValid,\n errors: result.errors,\n data: formObject,\n });\n\n return result;\n }\n\n destroy() {\n if (this.form) {\n this.form.removeEventListener(\"submit\", this._boundHandleSubmit);\n this.form.removeEventListener(\"input\", this._boundHandleInput);\n }\n }\n}\n\nclass FormErrorRenderer {\n constructor(formId, options = {}) {\n this.formId = formId;\n this.options = {\n containerClass: \"form-error-container\",\n errorClass: \"text-danger\",\n insertAfterField: true,\n ...options,\n };\n\n this.customContainers = {};\n\n this._boundHandleErrors = this.#handleErrors.bind(this);\n EVT.sub(FormEvents.ERRORS_CHANGE, this._boundHandleErrors);\n }\n\n #handleErrors({ formId, errors }) {\n if (formId !== this.formId) return;\n\n this.clearAll();\n this.renderAll(errors);\n }\n\n setContainer(fieldName, container) {\n this.customContainers[fieldName] =\n typeof container === \"string\"\n ? document.querySelector(container)\n : container;\n }\n\n renderAll(errors) {\n for (const field in errors) {\n this.render(field, errors[field]);\n }\n }\n\n render(fieldName, errorList) {\n if (!errorList || errorList.length === 0) return null;\n\n const errorSpan = document.createElement(\"span\");\n errorSpan.className = `${this.options.containerClass} ${this.options.errorClass}`;\n errorSpan.dataset.field = fieldName;\n\n const ul = document.createElement(\"ul\");\n errorList.forEach((item) => {\n const li = document.createElement(\"li\");\n const i = document.createElement(\"i\");\n i.textContent = item;\n li.appendChild(i);\n ul.appendChild(li);\n });\n errorSpan.appendChild(ul);\n\n const targetContainer = this.customContainers[fieldName];\n\n if (targetContainer) {\n targetContainer.innerHTML = \"\";\n targetContainer.appendChild(errorSpan);\n } else if (this.options.insertAfterField) {\n const form = document.getElementById(this.formId);\n const field = form?.querySelector(`[name=\"${fieldName}\"]`);\n if (field) {\n field.insertAdjacentElement(\"afterend\", errorSpan);\n }\n }\n return errorSpan;\n }\n\n clearAll() {\n const form = document.getElementById(this.formId);\n if (!form) return;\n\n const errors = form.querySelectorAll(`.${this.options.containerClass}`);\n errors.forEach((el) => el.remove());\n\n for (const key in this.customContainers) {\n if (this.customContainers[key]) {\n this.customContainers[key].innerHTML = \"\";\n }\n }\n }\n\n destroy() {\n EVT.unsub(FormEvents.ERRORS_CHANGE, this._boundHandleErrors);\n this.clearAll();\n }\n}\n\nexport { FormEvents, FormHandler, FormErrorRenderer };\n\nexport function useFormHandler(formId, schema, onSubmit) {\n const h = new FormHandler(formId, schema, onSubmit);\n const r = new FormErrorRenderer(formId);\n return {\n reset: () => h.reset(),\n validate: () => h.validateNow(),\n destroy: () => {\n r.destroy();\n h.destroy();\n },\n setContainer: (fieldName, container) =>\n r.setContainer(fieldName, container),\n };\n}\n","export function cache(input) {\n if (input == null) {\n return {\n cache: { strategy: \"cache-first\", storage: \"local\", ttl: 60_000 },\n };\n }\n\n if (typeof input === \"object\") return { cache: input }; // Already an object? Use it.\n\n const str = input.toLowerCase();\n\n // Map shorthand to strategy + storage\n const map = {\n cfl: { strategy: \"cache-first\", storage: \"local\" },\n cfs: { strategy: \"cache-first\", storage: \"session\" },\n cfm: { strategy: \"cache-first\", storage: \"memory\" },\n\n nfl: { strategy: \"network-first\", storage: \"local\" },\n nfs: { strategy: \"network-first\", storage: \"session\" },\n nfm: { strategy: \"network-first\", storage: \"memory\" },\n };\n\n // Extract rule (CFL, NFS, etc.)\n const code = str.match(/cfl|cfs|cfm|nfl|nfs|nfm/);\n const rule = code ? map[code[0]] : map[\"cfl\"]; // default CFL if not specified\n\n // Extract TTL\n const ttlMatch = str.match(\n /(\\d+)\\s*(s|sec|secs|second|seconds|min|m|mins|minute|minutes|h|hr|hours)?/,\n );\n const ttl = ttlMatch ? parseTTL(ttlMatch[0]) : 60_000;\n\n return {\n cache: {\n strategy: rule.strategy,\n storage: rule.storage,\n ttl,\n },\n };\n}\n\nfunction parseTTL(str) {\n const unit = str.replace(/[0-9]/g, \"\").trim().toLowerCase();\n const num = parseInt(str, 10);\n\n const map = {\n s: 1_000,\n sec: 1_000,\n secs: 1_000,\n second: 1_000,\n seconds: 1_000,\n m: 60_000,\n min: 60_000,\n mins: 60_000,\n minute: 60_000,\n minutes: 60_000,\n h: 3_600_000,\n hr: 3_600_000,\n hrs: 3_600_000,\n hours: 3_600_000,\n };\n\n return num * (map[unit] || 1);\n}\n"],"names":["v","now","raw","cache"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vaniy.es.js","sources":["../src/evt.js","../src/utils.js","../src/date.js","../src/validator.js","../src/dom.js","../src/http.js","../src/form.js","../src/cache.js"],"sourcesContent":["\"use strict\";\n\nconst EVT = {\n listeners: new Map(),\n sub: function (name, callback) {\n let handlers = this.listeners.get(name);\n if (!handlers) {\n handlers = new Set();\n this.listeners.set(name, handlers);\n }\n handlers.add(callback);\n },\n once: function (name, callback) {\n const onceCallback = (...args) => {\n callback(...args);\n this.unsub(name, onceCallback);\n };\n this.sub(name, onceCallback);\n },\n unsub: function (name, cb) {\n let handlers = this.listeners.get(name);\n if (!handlers) return;\n handlers.delete(cb);\n },\n pub: function (name, ...data) {\n let handlers = this.listeners.get(name);\n if (!handlers) return;\n handlers.forEach((cb) => {\n try {\n cb(...data);\n } catch (e) {\n console.error(`Error in event \"${name}\" listener: `, e);\n }\n });\n },\n has: function (name) {\n return this.listeners.has(name) && this.listeners.get(name).size > 0;\n },\n clear: function (name) {\n if (name) {\n this.listeners.delete(name);\n } else {\n this.listeners.clear();\n }\n },\n ping: () => console.log(\"PONG!\"),\n description: \"EVT is for Event publishing and emitting\",\n};\n\nexport default EVT;\n","\"use strict\";\n\nexport const redirect = (url) => (window.location.href = url);\nexport const isArray = (arr) => Array.isArray(arr);\nexport const isArrayEmpty = (arr) => !(Array.isArray(arr) && arr.length > 0);\nexport const isFocus = (element) => element == document.activeElement;\n\nconst currencyMap = {\n US: { locale: \"en-US\", currency: \"USD\" },\n CA: { locale: \"en-CA\", currency: \"CAD\" },\n FR: { locale: \"fr-FR\", currency: \"EUR\" },\n HT: { locale: \"ht-HT\", currency: \"HTG\" },\n GB: { locale: \"en-GB\", currency: \"GBP\" },\n AU: { locale: \"en-AU\", currency: \"AUD\" },\n};\n\nexport const toCurrency = (\n value,\n { locale = \"en-US\", currency = \"USD\" } = {},\n) =>\n Intl.NumberFormat(locale, {\n style: \"currency\",\n currency: currency,\n }).format(value);\n\nexport const formatByCountry = (value, countryCode) => {\n const config = currencyMap[countryCode] ?? currencyMap[\"US\"];\n return toCurrency(value, config);\n};\n\nexport const isValidRoutingNumber = (routingNumber) => {\n if (!/^\\d{9}$/.test(routingNumber)) {\n return false;\n }\n\n // Split the routing number into individual digits\n const digits = routingNumber.split(\"\").map(Number);\n\n // Calculate the weighted sum\n const sum =\n 7 * (digits[0] + digits[3] + digits[6]) +\n 3 * (digits[1] + digits[4] + digits[7]) +\n 1 * (digits[2] + digits[5] + digits[8]);\n\n // Check if the sum is a multiple of 10\n return sum % 10 === 0;\n};\n\nfunction isNumericLike(value) {\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"string\") return false;\n\n const s = v.trim();\n if (!s) return false;\n return /^-?\\d+(\\.\\d+)?$/.test(s);\n}\n\nexport function autoSize(value) {\n if (Array.isArray(value)) return value.length;\n if (isNumericLike(value)) return Number(String(value).trim());\n return String(value ?? \"\").length;\n}\n\nexport function parseMinMax(param) {\n const [minRaw, maxRaw] = String(param ?? \"\")\n .split(\",\")\n .map((s) => s.trim());\n\n const min = Number(minRaw);\n const max = Number(maxRaw);\n\n if (!Number.isFinite(min) || !Number.isFinite(max)) return null;\n return { min, max };\n}\n\n// is v null or undefined OR is v string empty\nexport function isBlank(v) {\n return v == null || String(v ?? \"\").trim() === \"\";\n}\n\nexport function fromCamelToKebabCase(camel) {\n return camel.replace(/[A-Z]/g, (char) => \"-\" + char.toLowerCase());\n}\n\nexport function observe(obj, onChange) {\n return new Proxy(obj, {\n set(target, key, value) {\n Reflect.set(target, key, value);\n onChange({ key, value });\n },\n });\n}\n\nexport const deepClone = (target) => structuredClone(target);\n\nexport const curry = (fn) => {\n return function curried(...args) {\n if (args.length >= fn.length) {\n return fn.apply(this, args);\n }\n return (...next) => curried(...args, ...next);\n };\n};\n\nexport const chainAsync = (acc, val) => acc.then(val);\n\nexport const sequenceAsync =\n (...fns) =>\n (fn) =>\n fns.reduce(chainAsync, Promise.resolve(fn));\n\nexport const tryCatch = (promise) =>\n promise.then((data) => [null, data]).catch((err) => [err, null]);\n\nexport async function flow(initial, ...fns) {\n let val = initial;\n\n for (const fn of fns) {\n const [err, res] = await tryCatch(typeof fn === \"function\" ? fn(val) : fn);\n if (err) return [err, null];\n val = res;\n }\n\n return [null, val];\n}\n\nexport const sleep = (ms) => new Promise((r) => setTimeout(r, ms));\n","import { isBlank } from \"./utils.js\";\n\nfunction parseByFormat(value, fmt) {\n const v = String(value ?? \"\").trim();\n\n if (!v) return null;\n\n if (fmt === \"YYYY-MM-DD\") {\n const m = v.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n const year = Number(m[1]);\n const month = Number(m[2]);\n const day = Number(m[3]);\n\n if (!year || month < 1 || month > 12 || day < 1 || day > 31) return null;\n return { year, month, day };\n }\n\n return null;\n}\n\nfunction getZoneParts(date, timeZone, locale = \"en-US\") {\n const dtf = new Intl.DateTimeFormat(locale, {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n\n const parts = dtf.formatToParts(date);\n\n const map = Object.fromEntries(parts.map((p) => [p.type, p.value]));\n\n return {\n year: Number(map.year),\n month: Number(map.month),\n day: Number(map.day),\n hour: Number(map.hour),\n minute: Number(map.minute),\n second: Number(map.second),\n };\n}\n\nfunction zonedMidnightToUtcMs({ year, month, day }, timeZone) {\n // Convert \"YYYY-MM-DD midnight in timeZone\" to UTC epoch ms\n // Approach: start with a UTC guess, then correct using formatted parts in tz (1-2 iterations).\n let guess = Date.UTC(year, month - 1, day, 0, 0, 0);\n\n for (let i = 0; i < 2; i++) {\n const got = getZoneParts(new Date(guess), timeZone);\n\n // We want got = {year,month,day,00:00:00}\n // Compute how far off we are, in minutes.\n const gotAsUtc = Date.UTC(\n got.year,\n got.month - 1,\n got.day,\n got.hour,\n got.minute,\n got.second,\n );\n const wantAsUtc = Date.UTC(year, month - 1, day, 0, 0, 0);\n\n const diffMs = gotAsUtc - wantAsUtc;\n if (diffMs === 0) break;\n\n guess -= diffMs;\n }\n\n return guess;\n}\n\nfunction addDaysYMD({ year, month, day }, deltaDays) {\n // Use UTC to avoid local DST weirdness while adding days.\n const d = new Date(Date.UTC(year, month - 1, day));\n d.setUTCDate(d.getUTCDate() + deltaDays);\n return {\n year: d.getUTCFullYear(),\n month: d.getUTCMonth() + 1,\n day: d.getUTCDate(),\n };\n}\n\nfunction parseTargetWithOffset(target) {\n // supports: \"today+7\", \"today-30\", \"end_date+7\"\n const m = String(target)\n .trim()\n .match(/^(.+?)([+-]\\d+)?$/);\n if (!m) return { base: String(target).trim(), offsetDays: 0 };\n return { base: m[1].trim(), offsetDays: m[2] ? Number(m[2]) : 0 };\n}\n\nfunction resolveYMDFromKeyword(keyword, timeZone) {\n const now = new Date();\n const { year, month, day } = getZoneParts(now, timeZone);\n if (keyword === \"today\") return { year, month, day };\n if (keyword === \"tomorrow\") return addDaysYMD({ year, month, day }, 1);\n if (keyword === \"yesterday\") return addDaysYMD({ year, month, day }, -1);\n return null;\n}\n\nfunction resolveYMD(target, formData, opts) {\n const { base, offsetDays } = parseTargetWithOffset(target);\n\n // 1) keyword\n let ymd = resolveYMDFromKeyword(base, opts.timezone);\n\n // 2) field reference\n if (!ymd) {\n const fieldVal = formData?.[base];\n ymd = parseStrictToYMD(fieldVal, opts);\n }\n\n // 3) literal date string (e.g. \"2026-01-01\") as a target\n if (!ymd) {\n ymd = parseByFormat(base, opts.dateFormat);\n }\n\n if (!ymd) return null;\n\n if (offsetDays) ymd = addDaysYMD(ymd, offsetDays);\n return ymd;\n}\n\nfunction isIsoLikeDateTimeString(s) {\n // Examples:\n // 2026-01-20T15:30:00Z\n // 2026-01-20T15:30:00.123Z\n // 2026-01-20T15:30:00-05:00\n // 2026-01-20 15:30:00Z (space tolerated if you want)\n return /^\\d{4}-\\d{2}-\\d{2}[T\\s]\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})?$/.test(\n s,\n );\n}\n\nfunction parseStrictToYMD(input, opts) {\n if (isBlank(input)) return null;\n\n const raw = String(input).trim();\n\n // 1) exact dateFormat\n let ymd = parseByFormat(raw, opts.dateFormat);\n if (ymd) return ymd;\n\n // 2) strict fallback: ISO-like datetime only\n if (!isIsoLikeDateTimeString(raw)) return null;\n\n const d = new Date(raw);\n if (isNaN(d.getTime())) return null;\n\n const parts = getZoneParts(d, opts.timezone);\n return { year: parts.year, month: parts.month, day: parts.day };\n}\n\nexport function resolveDateEpochDay(valueOrTarget, formData, opts, mode) {\n // mode:\n // - \"value\": parse actual field value\n // - \"target\": resolve keyword/field/literal + offset\n let ymd = null;\n\n if (mode === \"value\") {\n ymd = parseStrictToYMD(valueOrTarget, opts);\n } else {\n ymd = resolveYMD(valueOrTarget, formData, opts);\n }\n\n if (!ymd) return null;\n return zonedMidnightToUtcMs(ymd, opts.timezone);\n}\n","\"use strict\";\n\nimport { resolveDateEpochDay } from \"./date.js\";\nimport { parseMinMax, autoSize } from \"./utils.js\";\n\nfunction makeDateCompareRule(compare, messageBuilder) {\n return {\n method: (target) => (value, formData, opts) => {\n const left = resolveDateEpochDay(value, formData, opts, \"value\");\n const right = resolveDateEpochDay(target, formData, opts, \"target\");\n if (left == null || right == null) return false;\n return compare(left, right);\n },\n message: messageBuilder,\n };\n}\n\nconst methods = {\n required: {\n method: (value) => String(value ?? \"\").trim() !== \"\",\n message: \"This field is required\",\n },\n requiredIf: {\n method: (expression) => (value, formData) => {\n const [field, expected] = String(expression).split(\"=\");\n const otherValue = formData?.[field];\n\n const condition =\n expected != null\n ? String(otherValue ?? \"\") === expected\n : String(otherValue ?? \"\").trim() !== \"\";\n\n // if condition is true, this field must be non-empty\n if (condition) {\n return String(value ?? \"\").trim() !== \"\";\n }\n\n // otherwise it's optional\n return true;\n },\n message: (expression) => {\n const [field, expected] = String(expression).split(\"=\");\n\n return expected != null\n ? `This field is requied when ${field} is ${expected}`\n : `This field is required when ${field} has a value`;\n },\n },\n email: {\n method: (value) => /\\S+@\\S+\\.\\S+/.test(value),\n message: \"Email is invalid\",\n },\n min: {\n method: (length) => (value) => String(value ?? \"\").length >= Number(length),\n message: (length) => `Must be at least ${length} characters`,\n },\n max: {\n method: (length) => (value) => String(value ?? \"\").length <= Number(length),\n message: (length) => `Must be at most ${length} characters`,\n },\n date: {\n method: (value) => {\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value)) return false;\n const [year, month, day] = value.split(\"-\").map(Number);\n const date = new Date(year, month - 1, day);\n return (\n date.getFullYear() === year &&\n date.getMonth() === month - 1 &&\n date.getDate() === day\n );\n },\n message: \"Date is invalid. Use the format YYYY-MM-DD.\",\n },\n currency: {\n method: (value) => /^\\$?\\d{1,3}((,\\d{3})*|\\d*)(\\.\\d{2})?$/.test(value),\n message: \"Currency is invalid. Use the format $123,456.78 or 123456.78.\",\n },\n same: {\n method: (otherField) => (value, formData) =>\n String(value ?? \"\") === String(formData?.[otherField] ?? \"\"),\n message: (otherField) => `Must match ${otherField}`,\n },\n in: {\n method: (list) => (value) => {\n const allowed = Array.isArray(list)\n ? list\n : String(list ?? \"\")\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n return allowed.includes(String(value ?? \"\").trim());\n },\n message: (list) => {\n const allowed = Array.isArray(list)\n ? list\n : String(list ?? \"\")\n .split(\",\")\n .map((s) => s.trim());\n return `Must be one of the following: ${allowed.filter(Boolean).join(\",\")}`;\n },\n },\n before: makeDateCompareRule(\n (left, right) => left < right,\n (target) => `Must be before ${target}`,\n ),\n beforeOrEqual: makeDateCompareRule(\n (left, right) => left <= right,\n (target) => `Must be before or equal to ${target}`,\n ),\n after: makeDateCompareRule(\n (left, right) => left > right,\n (target) => `Must be after ${target}`,\n ),\n afterOrEqual: makeDateCompareRule(\n (left, right) => left >= right,\n (target) => `Must be after or equal to ${target}`,\n ),\n between: {\n method: (param) => (value) => {\n const range = parseMinMax(param);\n if (!range) return false;\n\n const size = autoSize(value);\n return range.min <= size && size <= range.max;\n },\n message: (param) => {\n const range = parseMinMax(param);\n if (!range) return \"Between rule is invalid. Use between:min,max\";\n return `Must be between ${range.min} and ${range.max}`;\n },\n },\n};\n\nfunction parseRule(rule) {\n const index = rule.indexOf(\":\");\n if (index === -1) return { name: rule, param: undefined };\n return { name: rule.slice(0, index), param: rule.slice(index + 1) };\n}\n\nfunction run(schema, formData) {\n let isValid = true;\n const errors = {};\n\n for (const field in schema) {\n const rules = schema[field] || [];\n\n for (const ruleString of rules) {\n const { name, param } = parseRule(ruleString);\n const validationMethod = methods[name];\n\n if (!validationMethod) {\n //unknown rule - skip\n continue;\n }\n\n const value = formData?.[field];\n\n const isFieldValid =\n param !== undefined\n ? validationMethod.method(param)(value, formData)\n : validationMethod.method(value, formData);\n\n if (!isFieldValid) {\n isValid = false;\n if (!errors[field]) {\n errors[field] = [];\n }\n\n const errorMessage =\n typeof validationMethod.message === \"function\"\n ? validationMethod.message(param)\n : validationMethod.message;\n\n errors[field].push(errorMessage);\n }\n }\n }\n return { isValid, errors };\n}\n\nconst V = {\n run,\n ping: () => console.log(\"PONG\"),\n description: \"V is for validating forms\",\n};\n\nexport default V;\n","\"use strict\";\n\nconst hook = (element) => ({\n on: (event, callback) => element?.addEventListener(event, callback),\n off: (event, callback) => element?.removeEventListener(event, callback),\n});\n\nconst text = (element, value) => {\n if (!element) return undefined;\n const prop = \"innerText\" in element ? \"innerText\" : \"textContent\";\n if (value != null) element[prop] = value; // allows empty string\n return element[prop];\n};\n\nconst html = (element, value) => {\n if (!element) return undefined;\n if (value != null) element.innerHTML = value;\n return element.innerHTML;\n};\n\nexport const make = (name) => document.createElement(name);\n\nexport const makeId = (length) => {\n let result = \"\";\n const alphaNum =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n const alphaNumLength = alphaNum.length;\n\n for (let i = 0; i < length; i++) {\n result += alphaNum.charAt(Math.floor(Math.random() * alphaNumLength));\n }\n return result;\n};\n\nexport const parseHtml = (source) => {\n const tmp = document.implementation.createHTMLDocument(\"\");\n tmp.body.innerHTML = source;\n return [...tmp.body.childNodes];\n};\n\nexport const onPageLoad = (callback) => {\n if (document.readyState !== \"loading\") callback();\n else document.addEventListener(\"DOMContentLoaded\", callback);\n};\n\nexport const onWindowLoad = (callback) => {\n window.onload = callback;\n};\n\nexport const Q = (input) => {\n const selectedElement =\n typeof input === \"string\" ? document.querySelector(input) : input;\n\n const safe =\n (fn) =>\n (...args) => {\n if (!selectedElement) return undefined;\n return fn(...args);\n };\n\n const wrapper = {\n elt: selectedElement,\n value: selectedElement?.value,\n text: (val) => {\n if (val != null) {\n text(selectedElement, val);\n return wrapper;\n }\n return text(selectedElement);\n },\n html: (val) => {\n if (val != null) {\n html(selectedElement, val);\n return wrapper;\n }\n return html(selectedElement);\n },\n val: safe((newVal) => {\n if (newVal != null) {\n if (selectedElement.opt && selectedElement.multiple) {\n const wanted = new Set(Array.isArray(newVal) ? newVal : [newVal]);\n Array.from(selectedElement.options).forEach((opt) => {\n opt.selected = wanted.has(opt.value);\n });\n } else {\n selectedElement.value = newVal;\n }\n wrapper.value = selectedElement.value;\n return wrapper;\n }\n\n if (selectedElement.options && selectedElement.multiple) {\n return Array.from(selectedElement.options)\n .filter((opt) => opt.selected)\n .map((opt) => opt.value);\n }\n return selectedElement.value;\n }),\n addClass: safe((className) => {\n selectedElement.classList.add(className);\n return wrapper;\n }),\n removeClass: safe((className) => {\n selectedElement.classList.remove(className);\n return wrapper;\n }),\n hasClass: safe((className) => {\n return selectedElement.classList.contains(className);\n }),\n hide: safe(() => {\n selectedElement.style.display = \"none\";\n return wrapper;\n }),\n show: safe(() => {\n selectedElement.style.display = \"\";\n return wrapper;\n }),\n prop: safe((propertyName) => selectedElement[propertyName]),\n attr: safe((attributeName) => selectedElement.getAttribute(attributeName)),\n removeAttr: (attributeName) => {\n selectedElement.removeAttribute(attributeName);\n },\n toggle: safe(() => {\n if (selectedElement.style.display == \"none\") wrapper.show();\n else wrapper.hide();\n return wrapper;\n }),\n css: safe((styleObject) => {\n Object.entries(styleObject).forEach(([key, value]) => {\n selectedElement.style[key] = value;\n });\n return wrapper;\n }),\n on: hook(selectedElement).on,\n off: hook(selectedElement).off,\n };\n return wrapper;\n};\n\nexport const all = (selector) => {\n const selectedElements = document.querySelectorAll(selector);\n return selectedElements;\n};\n\nexport const scan = (rootSelector, options = {}) => {\n const refAttr = options.refAttr || \"v-ref\";\n\n const root =\n typeof rootSelector === \"string\"\n ? document.querySelector(rootSelector)\n : rootSelector || document;\n\n if (!root) throw new Error(`Dom.scan: root \"${rootSelector}\" not found`);\n\n const cache = Object.create(null);\n\n //collect elements\n root.querySelectorAll(`[${refAttr}]`).forEach((el) => {\n const key = el.getAttribute(refAttr);\n if (!key) return;\n\n const wrapped = Q(el);\n\n // support multple refs with the same name -> array\n if (cache[key]) {\n if (Array.isArray(cache[key])) cache[key].push(wrapped);\n else cache[key] = [cache[key], wrapped];\n } else {\n cache[key] = wrapped;\n }\n });\n // proxy\n return new Proxy(\n {},\n {\n get(_, prop) {\n if (prop === \"_\") return cache;\n if (prop === \"get\") return (k) => cache[k];\n if (prop === \"all\")\n return (k) =>\n cache[k] ? (Array.isArray(cache[k]) ? cache[k] : [cache[k]]) : [];\n\n if (typeof prop !== \"string\") return undefined;\n\n const val = cache[prop];\n\n if (!val) {\n console.warn(`DOM.scan: ref \"${prop}\" not found`);\n return Q(null);\n }\n return val;\n },\n },\n );\n};\n\nconst DOM = {\n Q,\n $: Q,\n all,\n $$: all,\n scan,\n make,\n makeId,\n parseHtml,\n onPageLoad,\n onWindowLoad,\n ping: () => console.log(\"PONG!\"),\n description: \"DOM is for dom manipulation\",\n};\n\nexport default DOM;\n","\"use strict\";\n\n/**\n * Lightweight HTTP utility with:\n * - base URL support\n * - request + response interceptors\n * - timeouts (AbortController for fetch, XHR timeout for uploads)\n * - caching (memory/localStorage/sessionStorage) with TTL\n * - download helper (stream + progress)\n * - upload helper (XHR + progress)\n *\n * Default export: HTTP (chainable config object)\n *\n * Example:\n * import HTTP from \"./http.js\";\n *\n * HTTP\n * .base(\"https://api.example.com\")\n * .timeout(10000)\n * .interceptRequest((cfg) => {\n * cfg.headers = { ...cfg.headers, Authorization: \"Bearer token\" };\n * return cfg;\n * });\n *\n * const user = await HTTP.get(\"/me\");\n */\n\nlet _base = \"\";\nlet _timeout = 8000;\nlet _requestInterceptor = null;\nlet _responseInterceptor = null;\n\nconst memoryStore = new Map();\nconst now = () => Date.now();\n\nfunction makeStorageAdapter(kind) {\n const store = typeof window !== \"undefined\" ? window[kind] : null;\n if (!store) return null;\n return {\n get(key) {\n const raw = store.getItem(key);\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed.exp && parsed.exp < now()) {\n store.removeItem(key);\n return null;\n }\n return parsed.val;\n } catch {\n return null;\n }\n },\n set(key, val, ttl) {\n const exp = ttl ? now() + ttl : null;\n store.setItem(key, JSON.stringify({ val, exp }));\n },\n del(key) {\n if (store) store.removeItem(key);\n },\n clear() {\n if (store) store.clear();\n },\n };\n}\n\nconst storages = {\n memory: {\n get(key) {\n const hit = memoryStore.get(key);\n if (!hit) return null;\n if (hit.exp && hit.exp < now()) {\n memoryStore.delete(key);\n return null;\n }\n return hit.val;\n },\n set(key, val, ttl) {\n const exp = ttl ? now() + ttl : null;\n memoryStore.set(key, { val, exp });\n },\n del(key) {\n memoryStore.delete(key);\n },\n clear() {\n memoryStore.clear();\n },\n },\n local: makeStorageAdapter(\"localStorage\"),\n session: makeStorageAdapter(\"sessionStorage\"),\n};\n\nfunction stableStringify(obj) {\n if (obj === null || typeof obj !== \"object\") return String(obj);\n if (Array.isArray(obj)) return `[${obj.map(stableStringify).join(\",\")}]`;\n return `{${Object.keys(obj)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`)\n .join(\",\")}}`;\n}\n\nfunction getStorage(storageKind = \"memory\") {\n return storages[storageKind] || storages.memory;\n}\n\nfunction buildCacheKey(method, url, params, body) {\n const p = params ? `?${new URLSearchParams(params).toString()}` : \"\";\n const b = body && method !== \"GET\" ? `#${stableStringify(body)}` : \"\";\n return `H|${method}|${url}${p}${b}`;\n}\n\nfunction buildFormData({ files, fieldName = \"file\", fields = {} }) {\n const fd = new FormData();\n\n const list = Array.isArray(files) ? files : [files];\n list.forEach((f, i) => {\n const name = list.length > 1 ? `${fieldName}[${i}]` : fieldName;\n fd.append(name, f);\n });\n\n Object.entries(fields).forEach(([k, v]) => {\n fd.append(\n k,\n v instanceof Blob || v instanceof File\n ? v\n : typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v),\n );\n });\n\n return fd;\n}\n\nconst applyTimeout = (ms, controller) =>\n setTimeout(() => controller.abort(), ms);\n\n/**\n * Core request function used by get/post/put/delete.\n *\n * - Uses fetch() with AbortController timeout\n * - Auto JSON parses if possible; otherwise returns text\n * - Supports caching (memory/local/session) with TTL and strategies\n *\n * @template T\n * @param {\"GET\"|\"POST\"|\"PUT\"|\"DELETE\"|string} method\n * @param {string} url Relative URL (prefixed by base())\n * @param {RequestOptions} [opts]\n * @returns {Promise<T>}\n * @throws {HttpError} if response is not ok\n *\n * @example\n * const data = await request(\"GET\", \"/users\", {\n * params: { page: 1 },\n * cache: { strategy: \"cache-first\", ttl: 60_000, storage: \"memory\" }\n * });\n *\n * @example\n * // network-first with cache fallback\n * const data = await request(\"GET\", \"/settings\", {\n * cache: { strategy: \"network-first\", ttl: 5 * 60_000, storage: \"local\" }\n * });\n */\nexport async function request(method, url, opts = {}) {\n const { params, body, headers = {}, cache } = opts;\n\n let finalUrl = _base + url;\n if (params) {\n const qs = new URLSearchParams(params).toString();\n finalUrl += (finalUrl.includes(\"?\") ? \"&\" : \"?\") + qs;\n }\n\n const controller = new AbortController();\n const timeoutId = applyTimeout(_timeout, controller);\n const useCache = !!cache;\n const strategy = cache?.strategy; // 'cache-first' | 'network-first'\n const ttl = cache?.ttl ?? 0;\n const storage = getStorage(cache?.storage);\n const cacheKey = cache?.key || buildCacheKey(method, finalUrl, params, body);\n\n if (useCache && !cache?.forceRefresh && strategy === \"cache-first\") {\n const hit = storage.get(cacheKey);\n if (hit !== null) return hit;\n }\n\n // Build URL with base + query params\n\n let config = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined) {\n if (body instanceof FormData) {\n config.body = body;\n } else {\n config.headers[\"Content-Type\"] = \"application/json\";\n config.body = JSON.stringify(body);\n }\n }\n\n if (_requestInterceptor) {\n config = _requestInterceptor(config) || config;\n }\n\n try {\n let res = await fetch(finalUrl, config);\n clearTimeout(timeoutId);\n\n if (_responseInterceptor) {\n res = _responseInterceptor(res) || res;\n }\n\n // Try to parse JSON but fallback to text\n let data;\n try {\n data = await res.json();\n } catch {\n data = await res.text();\n }\n\n if (!res.ok) {\n const err = {\n status: res.status,\n data,\n url: finalUrl,\n method,\n };\n //for network-first with cache fallback on error, try cached value\n if (useCache && strategy === \"network-first\") {\n const cached = storage.get(cacheKey);\n if (cached !== null) return cached;\n }\n throw err;\n }\n\n if (useCache) {\n storage.set(cacheKey, data, ttl);\n }\n return data;\n } catch (err) {\n clearTimeout(timeoutId);\n if (useCache && strategy === \"network-first\") {\n const cached = storage.get(cacheKey);\n if (cached !== null) return cached;\n }\n throw err;\n }\n}\n\n/**\n * Download a file and trigger a browser download prompt.\n * Uses fetch() and can stream progress when ReadableStream is available.\n *\n * @param {string} url\n * @param {Object} [options]\n * @param {string} [options.filename]\n * Optional filename override. If omitted, inferred from Content-Disposition.\n * @param {Object<string,string|number|boolean>} [options.params]\n * @param {Object<string,string>} [options.headers]\n * @param {\"GET\"|\"POST\"|\"PUT\"|\"DELETE\"|string} [options.method=\"GET\"]\n * @param {any} [options.body]\n * @param {(receivedBytes:number, totalBytes:number|null, percent:number|null)=>void} [options.onProgress]\n *\n * @returns {Promise<{filename:string, size:number, type:string}>}\n *\n * @example\n * await download(\"/reports/monthly\", {\n * params: { month: \"2026-01\" },\n * onProgress: (received, total, percent) => {\n * console.log(\"download\", { received, total, percent });\n * }\n * });\n */\nexport async function download(\n url,\n { filename, params, headers = {}, method = \"GET\", body, onProgress } = {},\n) {\n // Build URL w/ base + params\n let finalUrl = _base + url;\n if (params) {\n const qs = new URLSearchParams(params).toString();\n finalUrl += (finalUrl.includes(\"?\") ? \"&\" : \"?\") + qs;\n }\n\n const controller = new AbortController();\n const timeoutId = applyTimeout(_timeout, controller);\n\n // Prepare request\n const init = {\n method,\n headers: { ...headers },\n signal: controller.signal,\n };\n if (body !== undefined) {\n if (body instanceof FormData) {\n init.body = body;\n } else {\n init.headers[\"Content-Type\"] =\n init.headers[\"Content-Type\"] || \"application/json\";\n init.body = typeof body === \"string\" ? body : JSON.stringify(body);\n }\n }\n\n const res = await fetch(finalUrl, init);\n clearTimeout(timeoutId);\n if (!res.ok) {\n let errText = \"\";\n try {\n errText = await res.text();\n } catch {}\n throw new Error(\n `Download failed ${res.status}: ${errText || res.statusText}`,\n );\n }\n\n // Try to infer filename from Content-Disposition\n if (!filename) {\n const cd = res.headers.get(\"Content-Disposition\") || \"\";\n const match = /filename\\*=UTF-8''([^;]+)|filename=\"?([^\"]+)\"?/i.exec(cd);\n filename = decodeURIComponent(match?.[1] || match?.[2] || \"download\");\n }\n\n // Stream with progress if possible\n let blob;\n if (res.body && \"getReader\" in res.body) {\n const reader = res.body.getReader();\n const contentLength = Number(res.headers.get(\"Content-Length\")) || null;\n const chunks = [];\n let received = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n received += value.length;\n if (typeof onProgress === \"function\") {\n const percent = contentLength\n ? Math.round((received / contentLength) * 100)\n : null;\n onProgress(received, contentLength, percent);\n }\n }\n blob = new Blob(chunks);\n } else {\n blob = await res.blob();\n if (typeof onProgress === \"function\") onProgress(1, 1, 100);\n }\n\n // Trigger browser download\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = filename;\n a.style.display = \"none\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(href);\n\n return { filename, size: blob.size, type: blob.type };\n}\n\n/**\n * Upload one or more files with progress using XMLHttpRequest.\n * (XHR is used because fetch upload progress is not consistently available.)\n *\n * @param {string} url\n * @param {Object} [options]\n * @param {File|Blob|Array<File|Blob>} options.files\n * @param {string} [options.fieldName=\"file\"]\n * @param {Object<string, any>} [options.fields={}]\n * @param {Object<string,string>} [options.headers={}]\n * Extra headers (do NOT set Content-Type for FormData yourself)\n * @param {\"POST\"|\"PUT\"|string} [options.method=\"POST\"]\n * @param {(sentBytes:number, totalBytes:number|null, percent:number|null)=>void} [options.onProgress]\n * @param {AbortSignal} [options.signal]\n *\n * @returns {Promise<any>}\n *\n * @example\n * const ac = new AbortController();\n * const result = await upload(\"/upload\", {\n * files: fileInput.files[0],\n * fields: { userId: 123 },\n * onProgress: (sent, total, percent) => console.log({ sent, total, percent }),\n * signal: ac.signal\n * });\n */\nexport function upload(\n url,\n {\n files, // File | Blob | File[] | Blob[]\n fieldName = \"file\", // form field name(s)\n fields = {}, // additional form fields (e.g., { name: \"Pascal\" })\n headers = {}, // extra headers (don't set Content-Type yourself)\n method = \"POST\",\n onProgress, // (sentBytes, totalBytes, percent) => void\n signal, // AbortSignal\n } = {},\n) {\n return new Promise((resolve, reject) => {\n const fd = buildFormData({ files, fieldName, fields });\n\n // Build URL with base\n const finalUrl = `${_base}${url}`;\n\n // Use XHR for upload progress\n const xhr = new XMLHttpRequest();\n xhr.open(method, finalUrl, true);\n\n // apply interceptors (request)\n let cfg = { method, headers: { ...headers } };\n if (_requestInterceptor) {\n cfg = _requestInterceptor(cfg) || cfg;\n }\n\n // set headers AFTER interceptor (never set Content-Type for FormData manually)\n Object.entries(cfg.headers).forEach(([k, v]) => xhr.setRequestHeader(k, v));\n\n // timeout (ms)\n xhr.timeout = _timeout;\n\n // abort support\n if (signal) {\n const onAbort = () => {\n try {\n xhr.abort();\n } catch {}\n };\n if (signal.aborted) onAbort();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n // progress\n if (xhr.upload && typeof onProgress === \"function\") {\n xhr.upload.onprogress = (e) => {\n if (!e.lengthComputable) {\n onProgress(e.loaded, null, null);\n return;\n }\n const percent = Math.round((e.loaded / e.total) * 100);\n onProgress(e.loaded, e.total, percent);\n };\n }\n\n xhr.onreadystatechange = async () => {\n if (xhr.readyState !== 4) return;\n\n // apply interceptor (response-like)\n if (_responseInterceptor) {\n // minimal fake Response compatible object\n const fakeRes = {\n status: xhr.status,\n ok: xhr.status >= 200 && xhr.status < 300,\n headers: new Headers(), // not fully accurate; fine for logging/hook\n text: async () => xhr.responseText,\n json: async () => JSON.parse(xhr.responseText || \"null\"),\n };\n _responseInterceptor(fakeRes);\n }\n\n // parse JSON or text\n const contentType = xhr.getResponseHeader(\"Content-Type\") || \"\";\n const isJson = contentType.includes(\"application/json\");\n const payload = isJson ? safeJson(xhr.responseText) : xhr.responseText;\n\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(payload);\n } else {\n reject({\n status: xhr.status,\n data: payload,\n url: finalUrl,\n method,\n });\n }\n };\n\n xhr.onerror = () =>\n reject({\n status: 0,\n data: \"Network error\",\n url: `${_base}${url}`,\n method,\n });\n xhr.ontimeout = () =>\n reject({\n status: 0,\n data: \"Timeout\",\n url: `${_base}${url}`,\n method,\n });\n\n xhr.send(fd);\n });\n\n function safeJson(t) {\n try {\n return JSON.parse(t || \"null\");\n } catch {\n return t;\n }\n }\n}\n\n/**\n * Convenience methods:\n * - get(url, opts)\n * - post(url, body, opts)\n * - put(url, body, opts)\n * - delete(url, opts)\n */\nexport const get = (url, opts) => request(\"GET\", url, opts);\nexport const post = (url, body, opts = {}) =>\n request(\"POST\", url, { ...opts, body });\nexport const put = (url, body, opts = {}) =>\n request(\"PUT\", url, { ...opts, body });\nexport const del = (url, opts = {}) => request(\"DELETE\", url, opts);\nexport const raw = (url, opts) => fetch(_base + url, opts);\n\nconst HTTP = {\n /**\n * Set base URL prefix for all requests.\n * @param {string} url\n * @returns {typeof HTTP}\n */\n base(url) {\n _base = url;\n return HTTP;\n },\n /**\n * Set default timeout for requests (ms).\n * - fetch requests abort via AbortController\n * - XHR uploads use xhr.timeout\n * @param {number} ms\n * @returns {typeof HTTP}\n */\n timeout(ms) {\n _timeout = ms;\n return HTTP;\n },\n /**\n * Request interceptor hook.\n * Useful for auth headers, correlation IDs, etc.\n * @param {RequestInterceptor} fn\n * @returns {typeof HTTP}\n *\n * @example\n * HTTP.interceptRequest((cfg) => {\n * cfg.headers = { ...cfg.headers, Authorization: `Bearer ${token}` };\n * return cfg;\n * });\n */\n interceptRequest(fn) {\n _requestInterceptor = fn;\n return HTTP;\n },\n /**\n * Response interceptor hook.\n * Useful for logging, auto-logout on 401, etc.\n * @param {ResponseInterceptor} fn\n * @returns {typeof HTTP}\n */\n\n interceptResponse(fn) {\n _responseInterceptor = fn;\n return HTTP;\n },\n\n get,\n post,\n put,\n delete: del,\n raw,\n download,\n upload,\n ping: () => console.log(\"PONG\"),\n description: \"H is for Http\",\n};\n\nexport default HTTP;\n","\"use strict\";\n\nimport EVT from \"./evt.js\";\nimport V from \"./validator.js\";\n\n/**\n * Form lifecycle events publish through our EVET pub/sub\n * Consumers can subscribe using EVT.sub(event, callback)\n */\nconst FormEvents = {\n STATE_CHANGE: \"form:state:change\",\n ERRORS_CHANGE: \"form:errors:change\",\n SUBMIT_SUCCESS: \"form:submit:success\",\n SUBMIT_ERROR: \"form:submit:error\",\n RESET: \"form:reset\",\n VALIDATED: \"form:validated\",\n};\n\n/**\n * @typedef {Object} FormHandlerOptions\n * @property {(data:Object)=>Promise<Object>|Object} [preSubmit]\n * Optional hook to mutate/transform data before final submit.\n *\n * @property {string} [containerClass]\n * CSS class for error containers.\n *\n * @property {string} [errorClass]\n * CSS class applied to error text.\n *\n * @property {boolean} [insertAfterField]\n * If true, errors appear after input fields.\n */\n\n/**\n * Handles:\n * - form state tracking\n * - validation\n * - submission\n * - event publishing\n */\nclass FormHandler {\n /**\n * @param {string} formId form element id string\n * @param {Object} schema Validation schema for validator.js\n * @param {(data:Object)=>void} onSubmit Callback when valid\n * @param {FormHandlerOptions} [options]\n */\n constructor(formId, schema, onSubmit, options = {}) {\n this.formId = formId;\n this.schema = schema;\n this.onSubmit = onSubmit;\n this.preSubmit = options.preSubmit || null;\n this.form = null;\n this.formState = {};\n this.errors = {};\n this.initialValues = {};\n\n this._boundHandleSubmit = this.#handleSubmit.bind(this);\n this._boundHandleInput = this.#handleInput.bind(this);\n\n this.#init();\n }\n\n // Initialize listeners and capture initial state.\n #init() {\n this.form = document.getElementById(this.formId);\n\n if (!this.form) {\n console.error(`Form with id ${this.formId} not found`);\n return;\n }\n\n this.#captureInitialValues();\n this.form.addEventListener(\"submit\", this._boundHandleSubmit);\n this.form.addEventListener(\"input\", this._boundHandleInput);\n\n this.#publishState();\n }\n\n // Setup initial values of the form.\n #captureInitialValues() {\n const formElements = this.form.elements;\n\n for (const element of Array.from(formElements)) {\n if (element.name) {\n this.initialValues[element.name] = element.value;\n this.formState[element.name] = element.value;\n }\n }\n }\n\n // Handle every input as they happen in here\n #handleInput(event) {\n const { name, value } = event.target;\n if (!name) return;\n\n this.formState[name] = value;\n this.#publishState();\n\n if (this.errors[name]) {\n delete this.errors[name];\n this.#publishErrors();\n }\n }\n\n // Handle the form submission.\n async #handleSubmit(event) {\n event.preventDefault();\n\n const data = new FormData(this.form);\n let formObject = {};\n\n data.forEach((value, key) => {\n formObject[key] = value;\n });\n\n this.formState = formObject;\n this.#publishState();\n\n const { isValid, errors: validateErrors } = V.run(this.schema, formObject);\n\n EVT.pub(FormEvents.VALIDATED, {\n formId: this.formId,\n isValid,\n errors: validateErrors,\n data: formObject,\n });\n\n if (!isValid) {\n this.errors = validateErrors;\n this.#publishErrors();\n\n EVT.pub(FormEvents.SUBMIT_ERROR, {\n formId: this.formId,\n errors: validateErrors,\n });\n return;\n }\n\n this.errors = {};\n this.#publishErrors();\n\n if (this.preSubmit) {\n try {\n formObject = await this.preSubmit(formObject);\n } catch (error) {\n EVT.pub(FormEvents.SUBMIT_ERROR, {\n formId: this.formId,\n errors: { _preSubmit: [error.message] },\n });\n return;\n }\n }\n\n EVT.pub(FormEvents.SUBMIT_SUCCESS, {\n formId: this.formId,\n data: formObject,\n });\n\n this.onSubmit(formObject);\n }\n\n #publishState() {\n EVT.pub(FormEvents.STATE_CHANGE, {\n formId: this.formId,\n state: { ...this.formState },\n });\n }\n\n #publishErrors() {\n EVT.pub(FormEvents.ERRORS_CHANGE, {\n formId: this.formId,\n errors: { ...this.errors },\n });\n }\n\n /** @returns {Object} Copy of form state */\n getFormState() {\n return { ...this.formState };\n }\n\n /** @returns {Object} Copy of current errors */\n getErrors() {\n return { ...this.errors };\n }\n\n // Reset form to initial values.\n reset() {\n this.formState = { ...this.initialValues };\n this.errors = {};\n\n if (this.form) {\n this.form.reset();\n }\n\n this.#publishState();\n this.#publishErrors();\n\n EVT.pub(FormEvents.RESET, { formId: this.formId });\n }\n\n // Manually trigger validation\n validateNow() {\n const data = new FormData(this.form);\n const formObject = {};\n\n data.forEach((value, key) => {\n formObject[key] = value;\n });\n\n const result = V.run(this.schema, formObject);\n this.errors = result.errors;\n this.#publishErrors();\n\n EVT.pub(FormEvents.VALIDATED, {\n formId: this.formId,\n isValid: result.isValid,\n errors: result.errors,\n data: formObject,\n });\n\n return result;\n }\n\n // Destroy listeners\n destroy() {\n if (this.form) {\n this.form.removeEventListener(\"submit\", this._boundHandleSubmit);\n this.form.removeEventListener(\"input\", this._boundHandleInput);\n }\n }\n}\n\n/**\n * Automatically renders validation errors in the DOM.\n */\nclass FormErrorRenderer {\n /**\n * @param {string} formId form element id string\n * @param {FormHandlerOptions} [options]\n */\n constructor(formId, options = {}) {\n this.formId = formId;\n this.options = {\n containerClass: \"form-error-container\",\n errorClass: \"text-danger\",\n insertAfterField: true,\n ...options,\n };\n\n this.customContainers = {};\n\n this._boundHandleErrors = this.#handleErrors.bind(this);\n EVT.sub(FormEvents.ERRORS_CHANGE, this._boundHandleErrors);\n }\n\n #handleErrors({ formId, errors }) {\n if (formId !== this.formId) return;\n\n this.clearAll();\n this.renderAll(errors);\n }\n\n /**\n * Set custom error container\n * @param {string} fieldName name of the field within the formo\n * @param {HTMLElement|string} container value to set the custom container with\n */\n setContainer(fieldName, container) {\n this.customContainers[fieldName] =\n typeof container === \"string\"\n ? document.querySelector(container)\n : container;\n }\n\n renderAll(errors) {\n for (const field in errors) {\n this.render(field, errors[field]);\n }\n }\n\n render(fieldName, errorList) {\n if (!errorList || errorList.length === 0) return null;\n\n const errorSpan = document.createElement(\"span\");\n errorSpan.className = `${this.options.containerClass} ${this.options.errorClass}`;\n errorSpan.dataset.field = fieldName;\n\n const ul = document.createElement(\"ul\");\n errorList.forEach((item) => {\n const li = document.createElement(\"li\");\n const i = document.createElement(\"i\");\n i.textContent = item;\n li.appendChild(i);\n ul.appendChild(li);\n });\n errorSpan.appendChild(ul);\n\n const targetContainer = this.customContainers[fieldName];\n\n if (targetContainer) {\n targetContainer.innerHTML = \"\";\n targetContainer.appendChild(errorSpan);\n } else if (this.options.insertAfterField) {\n const form = document.getElementById(this.formId);\n const field = form?.querySelector(`[name=\"${fieldName}\"]`);\n if (field) {\n field.insertAdjacentElement(\"afterend\", errorSpan);\n }\n }\n return errorSpan;\n }\n\n clearAll() {\n const form = document.getElementById(this.formId);\n if (!form) return;\n\n const errors = form.querySelectorAll(`.${this.options.containerClass}`);\n errors.forEach((el) => el.remove());\n\n for (const key in this.customContainers) {\n if (this.customContainers[key]) {\n this.customContainers[key].innerHTML = \"\";\n }\n }\n }\n\n destroy() {\n EVT.unsub(FormEvents.ERRORS_CHANGE, this._boundHandleErrors);\n this.clearAll();\n }\n}\n\nexport { FormEvents, FormHandler, FormErrorRenderer };\n\n/**\n * High-level helper to attach validation + error rendering.\n *\n * @param {string} formId form element id string\n * @param {Object} schema schema rule for\n * @param {(data:Object)=>void} onSubmit function to execute when submit button is clicked\n * @param {FormHandlerOptions} [options] extra options including a presubmit\n * if you have any external api call to make before submitting that's where it would happen\n *\n * @example\n * const form = useFormHandler(\"loginForm\", schema, data => {\n * console.log(\"submit\", data);\n * }, {\n * preSubmit: async (d) => ({ ...d, token: \"123\" })\n * });\n */\nexport function useFormHandler(formId, schema, onSubmit, options) {\n const h = new FormHandler(formId, schema, onSubmit, options);\n const r = new FormErrorRenderer(formId, options);\n return {\n reset: () => h.reset(),\n validate: () => h.validateNow(),\n destroy: () => {\n r.destroy();\n h.destroy();\n },\n setContainer: (fieldName, container) =>\n r.setContainer(fieldName, container),\n };\n}\n","export function cache(input) {\n if (input == null) {\n return {\n cache: { strategy: \"cache-first\", storage: \"local\", ttl: 60_000 },\n };\n }\n\n if (typeof input === \"object\") return { cache: input }; // Already an object? Use it.\n\n const str = input.toLowerCase();\n\n // Map shorthand to strategy + storage\n const map = {\n cfl: { strategy: \"cache-first\", storage: \"local\" },\n cfs: { strategy: \"cache-first\", storage: \"session\" },\n cfm: { strategy: \"cache-first\", storage: \"memory\" },\n\n nfl: { strategy: \"network-first\", storage: \"local\" },\n nfs: { strategy: \"network-first\", storage: \"session\" },\n nfm: { strategy: \"network-first\", storage: \"memory\" },\n };\n\n // Extract rule (CFL, NFS, etc.)\n const code = str.match(/cfl|cfs|cfm|nfl|nfs|nfm/);\n const rule = code ? map[code[0]] : map[\"cfl\"]; // default CFL if not specified\n\n // Extract TTL\n const ttlMatch = str.match(\n /(\\d+)\\s*(s|sec|secs|second|seconds|min|m|mins|minute|minutes|h|hr|hours)?/,\n );\n const ttl = ttlMatch ? parseTTL(ttlMatch[0]) : 60_000;\n\n return {\n cache: {\n strategy: rule.strategy,\n storage: rule.storage,\n ttl,\n },\n };\n}\n\nfunction parseTTL(str) {\n const unit = str.replace(/[0-9]/g, \"\").trim().toLowerCase();\n const num = parseInt(str, 10);\n\n const map = {\n s: 1_000,\n sec: 1_000,\n secs: 1_000,\n second: 1_000,\n seconds: 1_000,\n m: 60_000,\n min: 60_000,\n mins: 60_000,\n minute: 60_000,\n minutes: 60_000,\n h: 3_600_000,\n hr: 3_600_000,\n hrs: 3_600_000,\n hours: 3_600_000,\n };\n\n return num * (map[unit] || 1);\n}\n"],"names":["v","now","raw","cache"],"mappings":"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"}
|