@leaflink/stash 53.4.2 → 53.4.4

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/README.md CHANGED
@@ -383,8 +383,11 @@ package itself.
383
383
  - `tailwindcss`: Our utility-first CSS framework used for building our responsive and customizable components. Required
384
384
  compatibility with this package on version **^4.x.x**.
385
385
 
386
- - `vue-router`: The official router for Vue.js applications. Required compatibility with this package on version
387
- **^4.x** or higher.
386
+ - `vue`: **^3.5.28** or higher. Older Vue versions (e.g. 3.5.13) can cause type errors when used with this package and
387
+ other dependencies; consumers should use 3.5.28+ so the whole dependency tree uses a single compatible Vue.
388
+
389
+ - `vue-router`: The official router for Vue.js applications. Required **^4.6.4** or higher. Older versions (4.0–4.5)
390
+ ship Vue types that conflict with Vue 3.5.28+ and cause TypeScript errors.
388
391
 
389
392
  These peer dependencies need to be installed separately by the consumer of the package, ensuring that the correct
390
393
  versions are used to maintain compatibility and avoid conflicts with other dependencies in the project.
@@ -107,8 +107,8 @@ onApply: undefined;
107
107
  activeGroup: undefined;
108
108
  }>>> & Readonly<{
109
109
  onDismiss?: (() => any) | undefined;
110
- "onOpen-drawer"?: (() => any) | undefined;
111
110
  onPrevious?: (() => any) | undefined;
111
+ "onOpen-drawer"?: (() => any) | undefined;
112
112
  "onReset-group"?: (() => any) | undefined;
113
113
  "onReset-all"?: (() => any) | undefined;
114
114
  }>, {
@@ -3503,8 +3503,8 @@ default: () => never[];
3503
3503
  };
3504
3504
  }>> & Readonly<{}>, {
3505
3505
  loading: boolean;
3506
- emptyStateText: string;
3507
3506
  results: unknown[];
3507
+ emptyStateText: string;
3508
3508
  }, {}, {
3509
3509
  EmptyState: {
3510
3510
  new (...args: any[]): CreateComponentPublicInstanceWithMixins<Readonly<ExtractPropTypes< {
@@ -5301,8 +5301,8 @@ default: () => never[];
5301
5301
  };
5302
5302
  }>> & Readonly<{}>, {
5303
5303
  loading: boolean;
5304
- emptyStateText: string;
5305
5304
  results: unknown[];
5305
+ emptyStateText: string;
5306
5306
  }, {}, {
5307
5307
  EmptyState: {
5308
5308
  new (...args: any[]): CreateComponentPublicInstanceWithMixins<Readonly<ExtractPropTypes< {
@@ -58,7 +58,7 @@ options: RadioGroupOption[];
58
58
  modelValue: string;
59
59
  variant: "button" | "radio" | "tile" | "chip";
60
60
  fullWidth: boolean;
61
- orientation: "vertical" | "horizontal";
61
+ orientation: "horizontal" | "vertical";
62
62
  }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>, {
63
63
  default?(_: {}): any;
64
64
  }>;
@@ -52,8 +52,8 @@ loading: boolean;
52
52
  error: boolean;
53
53
  disabled: boolean;
54
54
  loading: boolean;
55
- active: boolean;
56
55
  step: string;
56
+ active: boolean;
57
57
  nested: boolean;
58
58
  completed: boolean;
59
59
  }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>, {
@@ -62,7 +62,7 @@ useResponsiveNav: boolean;
62
62
  }>, {
63
63
  step: number;
64
64
  theme: StepperTheme;
65
- orientation: "vertical" | "horizontal";
65
+ orientation: "horizontal" | "vertical";
66
66
  substep: number;
67
67
  linear: boolean;
68
68
  useResponsiveNav: boolean;
@@ -57,6 +57,18 @@ export declare function email(config?: Config): ValidationRule;
57
57
  */
58
58
  export declare function isDefined(value: unknown): boolean;
59
59
 
60
+ /**
61
+ * Minimal shape for a JSON:API error object when setting validation errors from an HTTP response.
62
+ * @see https://jsonapi.org/format/#error-objects
63
+ */
64
+ export declare interface JsonApiValidationError {
65
+ detail?: string;
66
+ source?: {
67
+ pointer?: string;
68
+ };
69
+ title?: string;
70
+ }
71
+
60
72
  export declare function maxLength(config: Config_2): ValidationRule;
61
73
 
62
74
  export declare function maxValue(config: Config_3): ValidationRule;
@@ -181,6 +193,16 @@ export declare interface ValidationGroup<Values extends object> {
181
193
  * Indicates if one or more fields have had their value changed at least one time
182
194
  */
183
195
  someTouched: boolean;
196
+ /**
197
+ * Sets field error messages from a JSON:API error response.
198
+ * Parses each error's `source.pointer` (e.g. `/data/attributes/email`) to a field name and uses `detail` as the message.
199
+ * Only applies errors for field names that exist in the validation rules; unknown fields are ignored.
200
+ */
201
+ setApiErrors: (errors: JsonApiValidationError[]) => void;
202
+ /**
203
+ * Clears API-set error messages. If `fieldName` is provided, clears only that field; otherwise clears all.
204
+ */
205
+ clearApiErrors: (fieldName?: string) => void;
184
206
  }
185
207
 
186
208
  /**
@@ -1,249 +1,290 @@
1
- import O from "lodash-es/debounce";
2
- import V from "lodash-es/get";
3
- import { toValue as u, computed as c, ref as N, watch as L, reactive as I, nextTick as w, readonly as E } from "vue";
4
- import { DECIMAL_PRECISION as A, DEBOUNCE as q } from "./constants.js";
5
- import { t as f } from "./locale.js";
6
- import { i as l } from "./isDefined-DzVx0B6k.js";
7
- import D from "lodash-es/round";
8
- function j(e) {
9
- return e && e.constructor && typeof e.constructor.isBuffer == "function" && e.constructor.isBuffer(e);
10
- }
11
- function C(e) {
12
- return e;
1
+ import F from "lodash-es/debounce";
2
+ import A from "lodash-es/get";
3
+ import { toValue as c, computed as v, ref as T, watch as R, reactive as L, nextTick as I, readonly as w } from "vue";
4
+ import { DECIMAL_PRECISION as j, DEBOUNCE as q } from "./constants.js";
5
+ import { t as h } from "./locale.js";
6
+ import { i as f } from "./isDefined-DzVx0B6k.js";
7
+ import B from "lodash-es/round";
8
+ function D(t) {
9
+ return t && t.constructor && typeof t.constructor.isBuffer == "function" && t.constructor.isBuffer(t);
10
+ }
11
+ function M(t) {
12
+ return t;
13
13
  }
14
- function F(e, t) {
15
- t = t || {};
16
- const i = t.delimiter || ".", o = t.maxDepth, s = t.transformKey || C, m = {};
17
- function v(h, y, g) {
18
- g = g || 1, Object.keys(h).forEach(function(p) {
19
- const r = h[p], x = t.safe && Array.isArray(r), n = Object.prototype.toString.call(r), a = j(r), b = n === "[object Object]" || n === "[object Array]", d = y ? y + i + s(p) : s(p);
20
- if (!x && !a && b && Object.keys(r).length && (!t.maxDepth || g < o))
21
- return v(r, d, g + 1);
22
- m[d] = r;
14
+ function C(t, e) {
15
+ e = e || {};
16
+ const r = e.delimiter || ".", i = e.maxDepth, a = e.transformKey || M, u = {};
17
+ function m(E, S, d) {
18
+ d = d || 1, Object.keys(E).forEach(function(x) {
19
+ const l = E[x], o = e.safe && Array.isArray(l), g = Object.prototype.toString.call(l), N = D(l), p = g === "[object Object]" || g === "[object Array]", n = S ? S + r + a(x) : a(x);
20
+ if (!o && !N && p && Object.keys(l).length && (!e.maxDepth || d < i))
21
+ return m(l, n, d + 1);
22
+ u[n] = l;
23
23
  });
24
24
  }
25
- return v(e), m;
25
+ return m(t), u;
26
+ }
27
+ function k(t) {
28
+ const e = t.replace(/^\//, ""), r = "data/attributes/";
29
+ if (e.startsWith(r))
30
+ return e.slice(r.length).split("/").filter(Boolean).join(".");
31
+ const i = e.split("/").filter(Boolean);
32
+ return i[i.length - 1] || t;
26
33
  }
27
- function Y(e = {}) {
34
+ function U(t) {
35
+ var r;
36
+ const e = {};
37
+ for (const i of t) {
38
+ const a = (r = i.source) == null ? void 0 : r.pointer;
39
+ if (!a)
40
+ continue;
41
+ const u = i.detail || i.title || "";
42
+ if (!u)
43
+ continue;
44
+ const m = k(a);
45
+ e[m] = u;
46
+ }
47
+ return e;
48
+ }
49
+ function H(t = {}) {
28
50
  return {
29
51
  name: "email",
30
- validator(t) {
31
- return !l(t) || typeof t == "string" && /^\S+@\S+\.\S+$/.test(t);
52
+ validator(e) {
53
+ return !f(e) || typeof e == "string" && /^\S+@\S+\.\S+$/.test(e);
32
54
  },
33
- message: e.message || f("ll.validation.email")
55
+ message: t.message || h("ll.validation.email")
34
56
  };
35
57
  }
36
- function _(e) {
58
+ function Q(t) {
37
59
  return {
38
60
  name: "maxLength",
39
- validator(t) {
40
- const i = u(e.max), o = u(t);
41
- if (!l(o))
61
+ validator(e) {
62
+ const r = c(t.max), i = c(e);
63
+ if (!f(i))
42
64
  return !0;
43
- let s = String(o);
44
- return e.trim && (s = s.trim()), s.length <= i;
65
+ let a = String(i);
66
+ return t.trim && (a = a.trim()), a.length <= r;
45
67
  },
46
- message: e.message || (() => f("ll.validation.maxLength", { max: String(u(e.max)) }))
68
+ message: t.message || (() => h("ll.validation.maxLength", { max: String(c(t.max)) }))
47
69
  };
48
70
  }
49
- function z(e) {
71
+ function X(t) {
50
72
  return {
51
73
  name: "maxValue",
52
- validator(t) {
53
- const i = u(e.max);
54
- return !l(t) || Number(t) <= i;
74
+ validator(e) {
75
+ const r = c(t.max);
76
+ return !f(e) || Number(e) <= r;
55
77
  },
56
- message: e.message || (() => f("ll.validation.maxValue", { max: String(u(e.max)) }))
78
+ message: t.message || (() => h("ll.validation.maxValue", { max: String(c(t.max)) }))
57
79
  };
58
80
  }
59
- function G(e) {
81
+ function Z(t) {
60
82
  return {
61
83
  name: "minLength",
62
- validator(t) {
63
- const i = u(e.min), o = u(t);
64
- if (!l(o))
84
+ validator(e) {
85
+ const r = c(t.min), i = c(e);
86
+ if (!f(i))
65
87
  return !0;
66
- let s = String(o);
67
- return e.trim && (s = s.trim()), s.length >= i;
88
+ let a = String(i);
89
+ return t.trim && (a = a.trim()), a.length >= r;
68
90
  },
69
- message: e.message || (() => f("ll.validation.minLength", { min: String(u(e.min)) }))
91
+ message: t.message || (() => h("ll.validation.minLength", { min: String(c(t.min)) }))
70
92
  };
71
93
  }
72
- function H(e) {
94
+ function ee(t) {
73
95
  return {
74
96
  name: "minValue",
75
- validator(t) {
76
- const i = u(e.min);
77
- return !l(t) || Number(t) >= i;
97
+ validator(e) {
98
+ const r = c(t.min);
99
+ return !f(e) || Number(e) >= r;
78
100
  },
79
- message: e.message || (() => f("ll.validation.minValue", { min: String(u(e.min)) }))
101
+ message: t.message || (() => h("ll.validation.minValue", { min: String(c(t.min)) }))
80
102
  };
81
103
  }
82
- function J(e) {
104
+ function te(t) {
83
105
  return {
84
106
  name: "pattern",
85
- validator(t) {
86
- const i = u(t);
87
- return !l(i) || e.regex.test(String(i));
107
+ validator(e) {
108
+ const r = c(e);
109
+ return !f(r) || t.regex.test(String(r));
88
110
  },
89
111
  message: () => {
90
- if (typeof e.message != "string" || !e.message.trim())
112
+ if (typeof t.message != "string" || !t.message.trim())
91
113
  throw new Error(
92
114
  'The "pattern" ruleFactory requires a custom message informing the user of the required pattern.'
93
115
  );
94
- return e.message;
116
+ return t.message;
95
117
  }
96
118
  };
97
119
  }
98
- function Q(e = {}) {
120
+ function re(t = {}) {
99
121
  return {
100
122
  name: "positiveNumber",
101
- validator(t) {
102
- return !l(t) || Number(t) > 0;
123
+ validator(e) {
124
+ return !f(e) || Number(e) > 0;
103
125
  },
104
- message: e.message || f("ll.validation.positiveNumber")
126
+ message: t.message || h("ll.validation.positiveNumber")
105
127
  };
106
128
  }
107
- function X(e = {}) {
129
+ function ne(t = {}) {
108
130
  return {
109
131
  name: "price",
110
- validator(t) {
111
- const i = Number(t);
112
- return !l(t) || i !== 1 / 0 && i >= 0 && i === D(i, A.CURRENCY);
132
+ validator(e) {
133
+ const r = Number(e);
134
+ return !f(e) || r !== 1 / 0 && r >= 0 && r === B(r, j.CURRENCY);
113
135
  },
114
- message: e.message || f("ll.validation.price")
136
+ message: t.message || h("ll.validation.price")
115
137
  };
116
138
  }
117
- function Z(e = {}) {
139
+ function se(t = {}) {
118
140
  return {
119
141
  name: "required",
120
- validator(t) {
121
- return l(typeof t == "string" ? t.trim() : t);
142
+ validator(e) {
143
+ return f(typeof e == "string" ? e.trim() : e);
122
144
  },
123
- message: e.message || f("ll.validation.required")
145
+ message: t.message || h("ll.validation.required")
124
146
  };
125
147
  }
126
- function W(e = {}) {
148
+ function ae(t = {}) {
127
149
  return {
128
150
  name: "wholeNumber",
129
- validator(t) {
130
- return !l(t) || Number.isInteger(Number(t)) && Number(t) >= 0;
151
+ validator(e) {
152
+ return !f(e) || Number.isInteger(Number(e)) && Number(e) >= 0;
131
153
  },
132
- message: e.message || f("ll.validation.wholeNumber")
154
+ message: t.message || h("ll.validation.wholeNumber")
133
155
  };
134
156
  }
135
- function ee({
136
- rules: e,
137
- values: t
157
+ const _ = "api";
158
+ function ie({
159
+ rules: t,
160
+ values: e
138
161
  }) {
139
- const o = c(() => Object.keys(F(e, { safe: !0 }))).value.reduce(
140
- (n, a) => {
141
- const b = N(V(u(t), a)), d = (T) => {
142
- b.value = V(u(t), T);
143
- }, S = O(() => {
144
- d(a);
162
+ const r = v(() => Object.keys(C(t, { safe: !0 }))), i = T({}), a = r.value.reduce(
163
+ (n, s) => {
164
+ const V = T(A(c(e), s)), y = (O) => {
165
+ V.value = A(c(e), O);
166
+ }, b = F(() => {
167
+ y(s);
145
168
  }, q.FAST);
146
- return L(
147
- () => V(u(t), a),
169
+ return R(
170
+ () => A(c(e), s),
148
171
  () => {
149
- S();
172
+ b();
150
173
  }
151
- ), n[a] = B({
152
- fieldName: a,
153
- fieldValue: b,
174
+ ), n[s] = K({
175
+ fieldName: s,
176
+ fieldValue: V,
154
177
  flush: () => {
155
- S.cancel(), d(a);
178
+ b.cancel(), y(s);
156
179
  },
157
- rules: V(e, a)
180
+ getApiError: () => i.value[s] || "",
181
+ rules: A(t, s)
158
182
  }), n;
159
183
  },
160
184
  {}
161
- ), s = c(() => Object.values(o)), m = c(() => s.value.some((n) => n.errors.length > 0)), v = c(() => s.value.some((n) => n.isTouched)), h = c(() => s.value.filter((n) => n.isDirty));
162
- return I({
163
- validate: async function({ preventScroll: n } = {}) {
164
- if (s.value.forEach((a) => {
165
- a.setTouched(!1), a.setTouched(!0);
166
- }), await w(), m.value && !n) {
167
- const a = Object.entries(o).find(([, S]) => S.errorMessage), b = (a == null ? void 0 : a[0]) || "", d = document == null ? void 0 : document.querySelector(`[name=${b}]`);
168
- d && d.scrollIntoView({ behavior: "smooth" });
169
- }
170
- return !m.value;
171
- },
172
- getError: function(n) {
173
- var a;
174
- return ((a = o[n]) == null ? void 0 : a.errorMessage) || "";
175
- },
176
- touch: function(n) {
177
- if (!o[n])
178
- throw new Error(`In touch: fieldName "${n}" does not exist in the validation fields.`);
179
- o[n].setTouched();
180
- },
181
- setAllUntouched: async function() {
182
- await w(), s.value.forEach((n) => {
183
- n.setTouched(!1);
184
- });
185
- },
186
- setInitialValues: function(n) {
187
- s.value.forEach((a) => {
188
- a.setInitialValue(n[a.name]);
189
- });
190
- },
191
- fields: o,
192
- dirtyFields: h,
185
+ ), u = v(() => Object.values(a)), m = v(() => u.value.some((n) => n.errors.length > 0)), E = v(() => u.value.some((n) => n.isTouched)), S = v(() => u.value.filter((n) => n.isDirty)), d = async function({ preventScroll: n } = {}) {
186
+ if (u.value.forEach((s) => {
187
+ s.setTouched(!1), s.setTouched(!0);
188
+ }), await I(), m.value && !n) {
189
+ const s = Object.entries(a).find(([, b]) => b.errorMessage), V = (s == null ? void 0 : s[0]) || "", y = document == null ? void 0 : document.querySelector(`[name=${V}]`);
190
+ y && y.scrollIntoView({ behavior: "smooth" });
191
+ }
192
+ return !m.value;
193
+ }, x = function(n) {
194
+ var s;
195
+ return ((s = a[n]) == null ? void 0 : s.errorMessage) || "";
196
+ }, l = function(n) {
197
+ if (!a[n])
198
+ throw new Error(`In touch: fieldName "${n}" does not exist in the validation fields.`);
199
+ a[n].setTouched();
200
+ }, o = async function() {
201
+ await I(), u.value.forEach((n) => {
202
+ n.setTouched(!1);
203
+ });
204
+ }, g = function(n) {
205
+ u.value.forEach((s) => {
206
+ s.setInitialValue(n[s.name]);
207
+ });
208
+ };
209
+ function N(n) {
210
+ const s = U(n), V = r.value, y = {};
211
+ for (const b of V)
212
+ s[b] && (y[b] = s[b]);
213
+ i.value = y;
214
+ }
215
+ function p(n) {
216
+ if (n) {
217
+ const s = { ...i.value };
218
+ delete s[n], i.value = s;
219
+ } else
220
+ i.value = {};
221
+ }
222
+ return L({
223
+ validate: d,
224
+ getError: x,
225
+ touch: l,
226
+ setAllUntouched: o,
227
+ setInitialValues: g,
228
+ setApiErrors: N,
229
+ clearApiErrors: p,
230
+ fields: a,
231
+ dirtyFields: S,
193
232
  hasErrors: m,
194
- someTouched: v
233
+ someTouched: E
195
234
  });
196
235
  }
197
- function B({
198
- fieldName: e,
199
- fieldValue: t,
200
- rules: i,
201
- flush: o
236
+ function K({
237
+ fieldName: t,
238
+ fieldValue: e,
239
+ rules: r,
240
+ flush: i,
241
+ getApiError: a
202
242
  }) {
203
- const s = N(t.value), m = N(!1), v = c(() => (t.value ?? "") !== (s.value ?? "")), h = c(() => m.value ? i.map((r) => ({
204
- fieldName: e,
205
- ruleName: r.name,
206
- isValid: r.validator(t.value),
207
- message: typeof r.message == "function" ? r.message(t.value) : r.message
208
- })) : []), y = c(
209
- () => h.value.filter((r) => !r.isValid).map((r) => ({
210
- ruleName: r.ruleName,
211
- message: r.message
212
- }))
213
- );
214
- function g(r = !0) {
215
- o(), m.value = r;
243
+ const u = T(e.value), m = T(!1), E = v(() => (e.value ?? "") !== (u.value ?? "")), S = v(() => m.value ? r.map((o) => ({
244
+ fieldName: t,
245
+ ruleName: o.name,
246
+ isValid: o.validator(e.value),
247
+ message: typeof o.message == "function" ? o.message(e.value) : o.message
248
+ })) : []), d = v(() => {
249
+ const o = a(), g = o !== "" ? [{ ruleName: _, message: o }] : [], N = S.value.filter((p) => !p.isValid).map((p) => ({
250
+ ruleName: p.ruleName,
251
+ message: p.message
252
+ }));
253
+ return [...g, ...N];
254
+ });
255
+ function x(o = !0) {
256
+ i(), m.value = o;
216
257
  }
217
- function p(r) {
218
- s.value = r;
258
+ function l(o) {
259
+ u.value = o;
219
260
  }
220
- return I({
221
- name: e,
222
- currentValue: E(t),
223
- initialValue: E(s),
224
- isTouched: E(m),
225
- isDirty: E(v),
226
- errorMessage: c(() => {
227
- var r, x;
228
- return ((x = (r = y.value) == null ? void 0 : r[0]) == null ? void 0 : x.message) || "";
261
+ return L({
262
+ name: t,
263
+ currentValue: w(e),
264
+ initialValue: w(u),
265
+ isTouched: w(m),
266
+ isDirty: w(E),
267
+ errorMessage: v(() => {
268
+ var o, g;
269
+ return ((g = (o = d.value) == null ? void 0 : o[0]) == null ? void 0 : g.message) || "";
229
270
  }),
230
- errors: y,
231
- setInitialValue: p,
232
- setTouched: g
271
+ errors: d,
272
+ setInitialValue: l,
273
+ setTouched: x
233
274
  });
234
275
  }
235
276
  export {
236
- ee as default,
237
- Y as email,
238
- l as isDefined,
239
- _ as maxLength,
240
- z as maxValue,
241
- G as minLength,
242
- H as minValue,
243
- J as pattern,
244
- Q as positiveNumber,
245
- X as price,
246
- Z as required,
247
- W as wholeNumber
277
+ ie as default,
278
+ H as email,
279
+ f as isDefined,
280
+ Q as maxLength,
281
+ X as maxValue,
282
+ Z as minLength,
283
+ ee as minValue,
284
+ te as pattern,
285
+ re as positiveNumber,
286
+ ne as price,
287
+ se as required,
288
+ ae as wholeNumber
248
289
  };
249
290
  //# sourceMappingURL=useValidation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useValidation.js","sources":["../../../node_modules/.pnpm/flat@6.0.1/node_modules/flat/index.js","../src/composables/useValidation/ruleFactories/email.ts","../src/composables/useValidation/ruleFactories/maxLength.ts","../src/composables/useValidation/ruleFactories/maxValue.ts","../src/composables/useValidation/ruleFactories/minLength.ts","../src/composables/useValidation/ruleFactories/minValue.ts","../src/composables/useValidation/ruleFactories/pattern.ts","../src/composables/useValidation/ruleFactories/positiveNumber.ts","../src/composables/useValidation/ruleFactories/price.ts","../src/composables/useValidation/ruleFactories/required.ts","../src/composables/useValidation/ruleFactories/wholeNumber.ts","../src/composables/useValidation/useValidation.ts"],"sourcesContent":["function isBuffer (obj) {\n return obj &&\n obj.constructor &&\n (typeof obj.constructor.isBuffer === 'function') &&\n obj.constructor.isBuffer(obj)\n}\n\nfunction keyIdentity (key) {\n return key\n}\n\nexport function flatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const maxDepth = opts.maxDepth\n const transformKey = opts.transformKey || keyIdentity\n const output = {}\n\n function step (object, prev, currentDepth) {\n currentDepth = currentDepth || 1\n Object.keys(object).forEach(function (key) {\n const value = object[key]\n const isarray = opts.safe && Array.isArray(value)\n const type = Object.prototype.toString.call(value)\n const isbuffer = isBuffer(value)\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n const newKey = prev\n ? prev + delimiter + transformKey(key)\n : transformKey(key)\n\n if (!isarray && !isbuffer && isobject && Object.keys(value).length &&\n (!opts.maxDepth || currentDepth < maxDepth)) {\n return step(value, newKey, currentDepth + 1)\n }\n\n output[newKey] = value\n })\n }\n\n step(target)\n\n return output\n}\n\nexport function unflatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const overwrite = opts.overwrite || false\n const transformKey = opts.transformKey || keyIdentity\n const result = {}\n\n const isbuffer = isBuffer(target)\n if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {\n return target\n }\n\n // safely ensure that the key is\n // an integer.\n function getkey (key) {\n const parsedKey = Number(key)\n\n return (\n isNaN(parsedKey) ||\n key.indexOf('.') !== -1 ||\n opts.object\n )\n ? key\n : parsedKey\n }\n\n function addKeys (keyPrefix, recipient, target) {\n return Object.keys(target).reduce(function (result, key) {\n result[keyPrefix + delimiter + key] = target[key]\n\n return result\n }, recipient)\n }\n\n function isEmpty (val) {\n const type = Object.prototype.toString.call(val)\n const isArray = type === '[object Array]'\n const isObject = type === '[object Object]'\n\n if (!val) {\n return true\n } else if (isArray) {\n return !val.length\n } else if (isObject) {\n return !Object.keys(val).length\n }\n }\n\n target = Object.keys(target).reduce(function (result, key) {\n const type = Object.prototype.toString.call(target[key])\n const isObject = (type === '[object Object]' || type === '[object Array]')\n if (!isObject || isEmpty(target[key])) {\n result[key] = target[key]\n return result\n } else {\n return addKeys(\n key,\n result,\n flatten(target[key], opts)\n )\n }\n }, {})\n\n Object.keys(target).forEach(function (key) {\n const split = key.split(delimiter).map(transformKey)\n let key1 = getkey(split.shift())\n let key2 = getkey(split[0])\n let recipient = result\n\n while (key2 !== undefined) {\n if (key1 === '__proto__') {\n return\n }\n\n const type = Object.prototype.toString.call(recipient[key1])\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n // do not write over falsey, non-undefined values if overwrite is false\n if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') {\n return\n }\n\n if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) {\n recipient[key1] = (\n typeof key2 === 'number' &&\n !opts.object\n ? []\n : {}\n )\n }\n\n recipient = recipient[key1]\n if (split.length > 0) {\n key1 = getkey(split.shift())\n key2 = getkey(split[0])\n }\n }\n\n // unflatten again for 'messy objects'\n recipient[key1] = unflatten(target[key], opts)\n })\n\n return result\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function email(config: Config = {}): ValidationRule {\n return {\n name: 'email',\n validator(value) {\n return !isDefined(value) || (typeof value === 'string' && /^\\S+@\\S+\\.\\S+$/.test(value));\n },\n message: config.message || t('ll.validation.email'),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n max: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n trim?: boolean;\n}\n\nexport default function maxLength(config: Config): ValidationRule {\n return {\n name: 'maxLength',\n validator(_value) {\n const max = toValue(config.max);\n const value = toValue(_value);\n\n if (!isDefined(value)) {\n return true;\n }\n\n let valueString = String(value);\n\n if (config.trim) {\n valueString = valueString.trim();\n }\n\n return valueString.length <= max;\n },\n message: config.message || (() => t('ll.validation.maxLength', { max: String(toValue(config.max)) })),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n max: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n}\n\nexport default function maxValue(config: Config): ValidationRule {\n return {\n name: 'maxValue',\n validator(value) {\n const max = toValue(config.max);\n\n return !isDefined(value) || Number(value) <= max;\n },\n message: config.message || (() => t('ll.validation.maxValue', { max: String(toValue(config.max)) })),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n min: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n trim?: boolean;\n}\n\nexport default function minLength(config: Config): ValidationRule {\n return {\n name: 'minLength',\n validator(_value) {\n const min = toValue(config.min);\n const value = toValue(_value);\n\n if (!isDefined(value)) {\n return true;\n }\n\n let valueString = String(value);\n\n if (config.trim) {\n valueString = valueString.trim();\n }\n\n return valueString.length >= min;\n },\n message: config.message || (() => t('ll.validation.minLength', { min: String(toValue(config.min)) })),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n min: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n}\n\nexport default function minValue(config: Config): ValidationRule {\n return {\n name: 'minValue',\n validator(value) {\n const min = toValue(config.min);\n\n return !isDefined(value) || Number(value) >= min;\n },\n message: config.message || (() => t('ll.validation.minValue', { min: String(toValue(config.min)) })),\n };\n}\n","import { toValue } from 'vue';\n\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n regex: RegExp;\n /** A custom message is required in order to inform the user of the required pattern. */\n message: ValidationMessage;\n}\n\nexport default function pattern(config: Config): ValidationRule {\n return {\n name: 'pattern',\n validator(_value) {\n const value = toValue(_value);\n\n return !isDefined(value) || config.regex.test(String(value));\n },\n message: () => {\n if (typeof config.message !== 'string' || !config.message.trim()) {\n throw new Error(\n 'The \"pattern\" ruleFactory requires a custom message informing the user of the required pattern.',\n );\n }\n\n return config.message;\n },\n };\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function positiveNumber(config: Config = {}): ValidationRule {\n return {\n name: 'positiveNumber',\n validator(value) {\n return !isDefined(value) || Number(value) > 0;\n },\n message: config.message || t('ll.validation.positiveNumber'),\n };\n}\n","import round from 'lodash-es/round';\n\nimport { DECIMAL_PRECISION } from '../../../constants';\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function price(config: Config = {}): ValidationRule {\n return {\n name: 'price',\n validator(value) {\n const price = Number(value);\n\n return (\n !isDefined(value) || (price !== Infinity && price >= 0 && price === round(price, DECIMAL_PRECISION.CURRENCY))\n );\n },\n message: config.message || t('ll.validation.price'),\n };\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function required(config: Config = {}): ValidationRule {\n return {\n name: 'required',\n validator(value) {\n return isDefined(typeof value === 'string' ? value.trim() : value);\n },\n message: config.message || t('ll.validation.required'),\n };\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function wholeNumber(config: Config = {}): ValidationRule {\n return {\n name: 'wholeNumber',\n validator(value) {\n return !isDefined(value) || (Number.isInteger(Number(value)) && Number(value) >= 0);\n },\n message: config.message || t('ll.validation.wholeNumber'),\n };\n}\n","import { flatten } from 'flat';\nimport debounce from 'lodash-es/debounce';\nimport get from 'lodash-es/get';\nimport { computed, nextTick, reactive, readonly, Ref, ref, toValue, UnwrapRef, watch } from 'vue';\n\nimport { DEBOUNCE } from '../../constants';\nimport {\n UseValidationArgs,\n ValidationError,\n ValidationField,\n ValidationGroup,\n ValidationRule,\n} from './useValidation.types';\n\nexport default function useValidation<Values extends object>({\n rules,\n values,\n}: UseValidationArgs<Values>): ValidationGroup<Values> {\n const fieldNames = computed(() => Object.keys(flatten(rules, { safe: true })));\n\n const fields = fieldNames.value.reduce(\n (map, fieldName) => {\n const fieldValue = ref(get(toValue(values), fieldName));\n\n // Having this function here allows us to update the fieldValue when the value of the field changes.\n // Also, passing `fieldValue` outside the `.reduce()` loop will cause a racing condition on `fieldValue` updates\n const updateFieldValue = (fieldName: string) => {\n fieldValue.value = get(toValue(values), fieldName);\n };\n\n const debouncedSetFieldValue = debounce(() => {\n updateFieldValue(fieldName);\n }, DEBOUNCE.FAST);\n\n watch(\n () => get(toValue(values), fieldName),\n () => {\n debouncedSetFieldValue();\n },\n );\n\n map[fieldName] = buildField<UnwrapRef<typeof fieldValue>>({\n fieldName,\n fieldValue,\n flush: () => {\n debouncedSetFieldValue.cancel();\n updateFieldValue(fieldName);\n },\n rules: get(rules, fieldName),\n });\n\n return map;\n },\n {} as Record<string, ValidationField>,\n );\n\n const fieldList = computed(() => Object.values(fields));\n\n const hasErrors = computed(() => fieldList.value.some((field) => field.errors.length > 0));\n\n const someTouched = computed(() => fieldList.value.some((field) => field.isTouched));\n\n const dirtyFields = computed(() => fieldList.value.filter((field) => field.isDirty));\n\n const validate: ValidationGroup<Values>['validate'] = async function ({ preventScroll } = {}) {\n fieldList.value.forEach((field) => {\n // Doing setTouched(true) on a field that already has isTouched as `true` will not trigger reactivity for that field. Therefore, setting isTouched to `false` for all fields ensures that setTouched(true) will trigger reactivity for every field, which will cause all validations to run and display any error messages.\n field.setTouched(false);\n field.setTouched(true);\n });\n await nextTick();\n\n if (hasErrors.value && !preventScroll) {\n const firstFieldWithError = Object.entries(fields).find(([, field]) => field.errorMessage);\n const fieldName = firstFieldWithError?.[0] || '';\n const firstErrorElement = document?.querySelector(`[name=${fieldName}]`);\n\n if (firstErrorElement) {\n firstErrorElement.scrollIntoView({ behavior: 'smooth' });\n }\n }\n\n return !hasErrors.value;\n };\n\n const getError: ValidationGroup<Values>['getError'] = function (fieldName: string) {\n return fields[fieldName]?.errorMessage || '';\n };\n\n const touch: ValidationGroup<Values>['touch'] = function (fieldName: string) {\n if (!fields[fieldName]) {\n throw new Error(`In touch: fieldName \"${fieldName}\" does not exist in the validation fields.`);\n }\n\n fields[fieldName].setTouched();\n };\n\n const setAllUntouched: ValidationGroup<Values>['setAllUntouched'] = async function () {\n await nextTick(); // wait for field values to be reset\n fieldList.value.forEach((field) => {\n field.setTouched(false);\n });\n };\n\n const setInitialValues: ValidationGroup<Values>['setInitialValues'] = function (intialValues: Values) {\n fieldList.value.forEach((field) => {\n field.setInitialValue(intialValues[field.name]);\n });\n };\n\n return reactive({\n validate,\n getError,\n touch,\n setAllUntouched,\n setInitialValues,\n fields,\n dirtyFields,\n hasErrors,\n someTouched,\n });\n}\n\ninterface BuildFieldArgs<Value = unknown> {\n fieldName: string;\n fieldValue: Ref<Value> | Ref<Value>;\n rules: ValidationRule[];\n flush: () => void;\n}\n\nfunction buildField<Value = unknown>({\n fieldName,\n fieldValue,\n rules,\n flush,\n}: BuildFieldArgs<Value>): ValidationField<Value> {\n /**\n * In order for `initialValue` to work properly, the `buildField` function must not be reactive; `buildField` should be called only once for each field when `useValidation` is called.\n */\n const initialValue = ref(fieldValue.value) as Ref<Value>;\n const isTouched = ref(false);\n const isDirty = computed(() => (fieldValue.value ?? '') !== (initialValue.value ?? ''));\n\n const results = computed(() => {\n // Adding a check for `isTouched` to avoid running the validation rules on the initial load, when the field is not touched.\n // if receives a fieldValue with some value as default or not, rule validation should also be triggered only via `touch()` or `validate()` methods.\n if (!isTouched.value) {\n return [];\n }\n\n return rules.map((rule) => ({\n fieldName,\n ruleName: rule.name,\n isValid: rule.validator(fieldValue.value),\n message: typeof rule.message === 'function' ? rule.message(fieldValue.value) : rule.message,\n }));\n });\n\n const errors = computed<ValidationError[]>(() =>\n results.value\n .filter((result) => !result.isValid)\n .map((result) => {\n return {\n ruleName: result.ruleName,\n message: result.message,\n };\n }),\n );\n\n function setTouched(value = true) {\n // Flushing the debounced value to be updated right away.\n // So that, we can have reactivity for `rules` validation, `isTouched`, `isDirty`, among other values\n flush();\n\n isTouched.value = value;\n }\n\n function setInitialValue(value: Value) {\n initialValue.value = value;\n }\n\n return reactive({\n name: fieldName,\n currentValue: readonly(fieldValue),\n initialValue: readonly(initialValue),\n isTouched: readonly(isTouched),\n isDirty: readonly(isDirty),\n errorMessage: computed(() => errors.value?.[0]?.message || ''),\n errors,\n setInitialValue,\n setTouched,\n });\n}\n\n// The ruleFactories are excluded from the main entrypoint in vite.config.ts, so they are exported here instead. This allows one import statement to be used for useValidation, its types, and all of the ruleFactories.\nexport { default as email } from './ruleFactories/email';\nexport { default as maxLength } from './ruleFactories/maxLength';\nexport { default as maxValue } from './ruleFactories/maxValue';\nexport { default as minLength } from './ruleFactories/minLength';\nexport { default as minValue } from './ruleFactories/minValue';\nexport { default as pattern } from './ruleFactories/pattern';\nexport { default as positiveNumber } from './ruleFactories/positiveNumber';\nexport { default as price } from './ruleFactories/price';\nexport { default as required } from './ruleFactories/required';\nexport { default as wholeNumber } from './ruleFactories/wholeNumber';\nexport * from './useValidation.types';\nexport { default as isDefined } from './utils/isDefined';\n"],"names":["isBuffer","obj","keyIdentity","key","flatten","target","opts","delimiter","maxDepth","transformKey","output","step","object","prev","currentDepth","value","isarray","type","isbuffer","isobject","newKey","email","config","isDefined","t","maxLength","_value","max","toValue","valueString","maxValue","minLength","min","minValue","pattern","positiveNumber","price","round","DECIMAL_PRECISION","required","wholeNumber","useValidation","rules","values","fields","computed","map","fieldName","fieldValue","ref","get","updateFieldValue","debouncedSetFieldValue","debounce","DEBOUNCE","watch","buildField","fieldList","hasErrors","field","someTouched","dirtyFields","reactive","preventScroll","nextTick","firstFieldWithError","firstErrorElement","_a","intialValues","flush","initialValue","isTouched","isDirty","results","rule","errors","result","setTouched","setInitialValue","readonly","_b"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"useValidation.js","sources":["../../../node_modules/.pnpm/flat@6.0.1/node_modules/flat/index.js","../src/composables/useValidation/parseJsonApiFieldErrors.ts","../src/composables/useValidation/ruleFactories/email.ts","../src/composables/useValidation/ruleFactories/maxLength.ts","../src/composables/useValidation/ruleFactories/maxValue.ts","../src/composables/useValidation/ruleFactories/minLength.ts","../src/composables/useValidation/ruleFactories/minValue.ts","../src/composables/useValidation/ruleFactories/pattern.ts","../src/composables/useValidation/ruleFactories/positiveNumber.ts","../src/composables/useValidation/ruleFactories/price.ts","../src/composables/useValidation/ruleFactories/required.ts","../src/composables/useValidation/ruleFactories/wholeNumber.ts","../src/composables/useValidation/useValidation.ts"],"sourcesContent":["function isBuffer (obj) {\n return obj &&\n obj.constructor &&\n (typeof obj.constructor.isBuffer === 'function') &&\n obj.constructor.isBuffer(obj)\n}\n\nfunction keyIdentity (key) {\n return key\n}\n\nexport function flatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const maxDepth = opts.maxDepth\n const transformKey = opts.transformKey || keyIdentity\n const output = {}\n\n function step (object, prev, currentDepth) {\n currentDepth = currentDepth || 1\n Object.keys(object).forEach(function (key) {\n const value = object[key]\n const isarray = opts.safe && Array.isArray(value)\n const type = Object.prototype.toString.call(value)\n const isbuffer = isBuffer(value)\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n const newKey = prev\n ? prev + delimiter + transformKey(key)\n : transformKey(key)\n\n if (!isarray && !isbuffer && isobject && Object.keys(value).length &&\n (!opts.maxDepth || currentDepth < maxDepth)) {\n return step(value, newKey, currentDepth + 1)\n }\n\n output[newKey] = value\n })\n }\n\n step(target)\n\n return output\n}\n\nexport function unflatten (target, opts) {\n opts = opts || {}\n\n const delimiter = opts.delimiter || '.'\n const overwrite = opts.overwrite || false\n const transformKey = opts.transformKey || keyIdentity\n const result = {}\n\n const isbuffer = isBuffer(target)\n if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') {\n return target\n }\n\n // safely ensure that the key is\n // an integer.\n function getkey (key) {\n const parsedKey = Number(key)\n\n return (\n isNaN(parsedKey) ||\n key.indexOf('.') !== -1 ||\n opts.object\n )\n ? key\n : parsedKey\n }\n\n function addKeys (keyPrefix, recipient, target) {\n return Object.keys(target).reduce(function (result, key) {\n result[keyPrefix + delimiter + key] = target[key]\n\n return result\n }, recipient)\n }\n\n function isEmpty (val) {\n const type = Object.prototype.toString.call(val)\n const isArray = type === '[object Array]'\n const isObject = type === '[object Object]'\n\n if (!val) {\n return true\n } else if (isArray) {\n return !val.length\n } else if (isObject) {\n return !Object.keys(val).length\n }\n }\n\n target = Object.keys(target).reduce(function (result, key) {\n const type = Object.prototype.toString.call(target[key])\n const isObject = (type === '[object Object]' || type === '[object Array]')\n if (!isObject || isEmpty(target[key])) {\n result[key] = target[key]\n return result\n } else {\n return addKeys(\n key,\n result,\n flatten(target[key], opts)\n )\n }\n }, {})\n\n Object.keys(target).forEach(function (key) {\n const split = key.split(delimiter).map(transformKey)\n let key1 = getkey(split.shift())\n let key2 = getkey(split[0])\n let recipient = result\n\n while (key2 !== undefined) {\n if (key1 === '__proto__') {\n return\n }\n\n const type = Object.prototype.toString.call(recipient[key1])\n const isobject = (\n type === '[object Object]' ||\n type === '[object Array]'\n )\n\n // do not write over falsey, non-undefined values if overwrite is false\n if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') {\n return\n }\n\n if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) {\n recipient[key1] = (\n typeof key2 === 'number' &&\n !opts.object\n ? []\n : {}\n )\n }\n\n recipient = recipient[key1]\n if (split.length > 0) {\n key1 = getkey(split.shift())\n key2 = getkey(split[0])\n }\n }\n\n // unflatten again for 'messy objects'\n recipient[key1] = unflatten(target[key], opts)\n })\n\n return result\n}\n","import type { JsonApiValidationError } from './useValidation.types';\n\n/**\n * Converts a JSON:API pointer (e.g. `/data/attributes/email` or `/data/attributes/product_name`) to a flat field name\n * for useValidation. Segment names are left unchanged (e.g. snake_case from the backend stays snake_case). Nested\n * paths (e.g. `/data/attributes/price/min_value`) become dotted names (e.g. `price.min_value`).\n */\nfunction pointerToFieldName(pointer: string): string {\n const normalized = pointer.replace(/^\\//, '');\n const prefix = 'data/attributes/';\n\n if (normalized.startsWith(prefix)) {\n const pathWithinAttributes = normalized.slice(prefix.length);\n const segments = pathWithinAttributes.split('/').filter(Boolean);\n return segments.join('.');\n }\n\n const segments = normalized.split('/').filter(Boolean);\n return segments[segments.length - 1] || pointer;\n}\n\n/**\n * Parses an array of JSON:API error objects into a map of field names to error messages.\n * Uses `source.pointer` to determine the field (e.g. `/data/attributes/email` → `email`) and `detail` (or `title`) as the message.\n * If multiple errors reference the same field, the last one wins.\n */\nexport function parseJsonApiFieldErrors(errors: JsonApiValidationError[]): Record<string, string> {\n const map: Record<string, string> = {};\n for (const err of errors) {\n const pointer = err.source?.pointer;\n if (!pointer) {\n continue;\n }\n const message = err.detail || err.title || '';\n if (!message) {\n continue;\n }\n const fieldName = pointerToFieldName(pointer);\n map[fieldName] = message;\n }\n return map;\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function email(config: Config = {}): ValidationRule {\n return {\n name: 'email',\n validator(value) {\n return !isDefined(value) || (typeof value === 'string' && /^\\S+@\\S+\\.\\S+$/.test(value));\n },\n message: config.message || t('ll.validation.email'),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n max: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n trim?: boolean;\n}\n\nexport default function maxLength(config: Config): ValidationRule {\n return {\n name: 'maxLength',\n validator(_value) {\n const max = toValue(config.max);\n const value = toValue(_value);\n\n if (!isDefined(value)) {\n return true;\n }\n\n let valueString = String(value);\n\n if (config.trim) {\n valueString = valueString.trim();\n }\n\n return valueString.length <= max;\n },\n message: config.message || (() => t('ll.validation.maxLength', { max: String(toValue(config.max)) })),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n max: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n}\n\nexport default function maxValue(config: Config): ValidationRule {\n return {\n name: 'maxValue',\n validator(value) {\n const max = toValue(config.max);\n\n return !isDefined(value) || Number(value) <= max;\n },\n message: config.message || (() => t('ll.validation.maxValue', { max: String(toValue(config.max)) })),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n min: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n trim?: boolean;\n}\n\nexport default function minLength(config: Config): ValidationRule {\n return {\n name: 'minLength',\n validator(_value) {\n const min = toValue(config.min);\n const value = toValue(_value);\n\n if (!isDefined(value)) {\n return true;\n }\n\n let valueString = String(value);\n\n if (config.trim) {\n valueString = valueString.trim();\n }\n\n return valueString.length >= min;\n },\n message: config.message || (() => t('ll.validation.minLength', { min: String(toValue(config.min)) })),\n };\n}\n","import { MaybeRefOrGetter, toValue } from 'vue';\n\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n min: MaybeRefOrGetter<number>;\n message?: ValidationMessage;\n}\n\nexport default function minValue(config: Config): ValidationRule {\n return {\n name: 'minValue',\n validator(value) {\n const min = toValue(config.min);\n\n return !isDefined(value) || Number(value) >= min;\n },\n message: config.message || (() => t('ll.validation.minValue', { min: String(toValue(config.min)) })),\n };\n}\n","import { toValue } from 'vue';\n\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n regex: RegExp;\n /** A custom message is required in order to inform the user of the required pattern. */\n message: ValidationMessage;\n}\n\nexport default function pattern(config: Config): ValidationRule {\n return {\n name: 'pattern',\n validator(_value) {\n const value = toValue(_value);\n\n return !isDefined(value) || config.regex.test(String(value));\n },\n message: () => {\n if (typeof config.message !== 'string' || !config.message.trim()) {\n throw new Error(\n 'The \"pattern\" ruleFactory requires a custom message informing the user of the required pattern.',\n );\n }\n\n return config.message;\n },\n };\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function positiveNumber(config: Config = {}): ValidationRule {\n return {\n name: 'positiveNumber',\n validator(value) {\n return !isDefined(value) || Number(value) > 0;\n },\n message: config.message || t('ll.validation.positiveNumber'),\n };\n}\n","import round from 'lodash-es/round';\n\nimport { DECIMAL_PRECISION } from '../../../constants';\nimport { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function price(config: Config = {}): ValidationRule {\n return {\n name: 'price',\n validator(value) {\n const price = Number(value);\n\n return (\n !isDefined(value) || (price !== Infinity && price >= 0 && price === round(price, DECIMAL_PRECISION.CURRENCY))\n );\n },\n message: config.message || t('ll.validation.price'),\n };\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function required(config: Config = {}): ValidationRule {\n return {\n name: 'required',\n validator(value) {\n return isDefined(typeof value === 'string' ? value.trim() : value);\n },\n message: config.message || t('ll.validation.required'),\n };\n}\n","import { t } from '../../../locale';\nimport { ValidationMessage, ValidationRule } from '../useValidation.types';\nimport isDefined from '../utils/isDefined';\n\ninterface Config {\n message?: ValidationMessage;\n}\n\nexport default function wholeNumber(config: Config = {}): ValidationRule {\n return {\n name: 'wholeNumber',\n validator(value) {\n return !isDefined(value) || (Number.isInteger(Number(value)) && Number(value) >= 0);\n },\n message: config.message || t('ll.validation.wholeNumber'),\n };\n}\n","import { flatten } from 'flat';\nimport debounce from 'lodash-es/debounce';\nimport get from 'lodash-es/get';\nimport { computed, nextTick, reactive, readonly, Ref, ref, toValue, UnwrapRef, watch } from 'vue';\n\nimport { DEBOUNCE } from '../../constants';\nimport { parseJsonApiFieldErrors } from './parseJsonApiFieldErrors';\nimport {\n type JsonApiValidationError,\n UseValidationArgs,\n ValidationError,\n ValidationField,\n ValidationGroup,\n ValidationRule,\n} from './useValidation.types';\n\nconst API_ERROR_RULE_NAME = 'api';\n\nexport default function useValidation<Values extends object>({\n rules,\n values,\n}: UseValidationArgs<Values>): ValidationGroup<Values> {\n const fieldNames = computed(() => Object.keys(flatten(rules, { safe: true })));\n const apiErrors = ref<Record<string, string>>({});\n\n const fields = fieldNames.value.reduce(\n (map, fieldName) => {\n const fieldValue = ref(get(toValue(values), fieldName));\n\n // Having this function here allows us to update the fieldValue when the value of the field changes.\n // Also, passing `fieldValue` outside the `.reduce()` loop will cause a racing condition on `fieldValue` updates\n const updateFieldValue = (fieldName: string) => {\n fieldValue.value = get(toValue(values), fieldName);\n };\n\n const debouncedSetFieldValue = debounce(() => {\n updateFieldValue(fieldName);\n }, DEBOUNCE.FAST);\n\n watch(\n () => get(toValue(values), fieldName),\n () => {\n debouncedSetFieldValue();\n },\n );\n\n map[fieldName] = buildField<UnwrapRef<typeof fieldValue>>({\n fieldName,\n fieldValue,\n flush: () => {\n debouncedSetFieldValue.cancel();\n updateFieldValue(fieldName);\n },\n getApiError: () => apiErrors.value[fieldName] || '',\n rules: get(rules, fieldName),\n });\n\n return map;\n },\n {} as Record<string, ValidationField>,\n );\n\n const fieldList = computed(() => Object.values(fields));\n\n const hasErrors = computed(() => fieldList.value.some((field) => field.errors.length > 0));\n\n const someTouched = computed(() => fieldList.value.some((field) => field.isTouched));\n\n const dirtyFields = computed(() => fieldList.value.filter((field) => field.isDirty));\n\n const validate: ValidationGroup<Values>['validate'] = async function ({ preventScroll } = {}) {\n fieldList.value.forEach((field) => {\n // Doing setTouched(true) on a field that already has isTouched as `true` will not trigger reactivity for that field. Therefore, setting isTouched to `false` for all fields ensures that setTouched(true) will trigger reactivity for every field, which will cause all validations to run and display any error messages.\n field.setTouched(false);\n field.setTouched(true);\n });\n await nextTick();\n\n if (hasErrors.value && !preventScroll) {\n const firstFieldWithError = Object.entries(fields).find(([, field]) => field.errorMessage);\n const fieldName = firstFieldWithError?.[0] || '';\n const firstErrorElement = document?.querySelector(`[name=${fieldName}]`);\n\n if (firstErrorElement) {\n firstErrorElement.scrollIntoView({ behavior: 'smooth' });\n }\n }\n\n return !hasErrors.value;\n };\n\n const getError: ValidationGroup<Values>['getError'] = function (fieldName: string) {\n return fields[fieldName]?.errorMessage || '';\n };\n\n const touch: ValidationGroup<Values>['touch'] = function (fieldName: string) {\n if (!fields[fieldName]) {\n throw new Error(`In touch: fieldName \"${fieldName}\" does not exist in the validation fields.`);\n }\n\n fields[fieldName].setTouched();\n };\n\n const setAllUntouched: ValidationGroup<Values>['setAllUntouched'] = async function () {\n await nextTick(); // wait for field values to be reset\n fieldList.value.forEach((field) => {\n field.setTouched(false);\n });\n };\n\n const setInitialValues: ValidationGroup<Values>['setInitialValues'] = function (intialValues: Values) {\n fieldList.value.forEach((field) => {\n field.setInitialValue(intialValues[field.name]);\n });\n };\n\n function setApiErrors(errors: JsonApiValidationError[]) {\n const parsed = parseJsonApiFieldErrors(errors);\n const known = fieldNames.value;\n const next: Record<string, string> = {};\n for (const name of known) {\n if (parsed[name]) {\n next[name] = parsed[name];\n }\n }\n apiErrors.value = next;\n }\n\n function clearApiErrors(fieldName?: string) {\n if (fieldName) {\n const next = { ...apiErrors.value };\n delete next[fieldName];\n apiErrors.value = next;\n } else {\n apiErrors.value = {};\n }\n }\n\n return reactive({\n validate,\n getError,\n touch,\n setAllUntouched,\n setInitialValues,\n setApiErrors,\n clearApiErrors,\n fields,\n dirtyFields,\n hasErrors,\n someTouched,\n });\n}\n\ninterface BuildFieldArgs<Value = unknown> {\n fieldName: string;\n fieldValue: Ref<Value> | Ref<Value>;\n rules: ValidationRule[];\n flush: () => void;\n getApiError: () => string;\n}\n\nfunction buildField<Value = unknown>({\n fieldName,\n fieldValue,\n rules,\n flush,\n getApiError,\n}: BuildFieldArgs<Value>): ValidationField<Value> {\n /**\n * In order for `initialValue` to work properly, the `buildField` function must not be reactive; `buildField` should be called only once for each field when `useValidation` is called.\n */\n const initialValue = ref(fieldValue.value) as Ref<Value>;\n const isTouched = ref(false);\n const isDirty = computed(() => (fieldValue.value ?? '') !== (initialValue.value ?? ''));\n\n const results = computed(() => {\n // Adding a check for `isTouched` to avoid running the validation rules on the initial load, when the field is not touched.\n // if receives a fieldValue with some value as default or not, rule validation should also be triggered only via `touch()` or `validate()` methods.\n if (!isTouched.value) {\n return [];\n }\n\n return rules.map((rule) => ({\n fieldName,\n ruleName: rule.name,\n isValid: rule.validator(fieldValue.value),\n message: typeof rule.message === 'function' ? rule.message(fieldValue.value) : rule.message,\n }));\n });\n\n const errors = computed<ValidationError[]>(() => {\n const apiMessage = getApiError();\n const apiErrorList: ValidationError[] =\n apiMessage !== '' ? [{ ruleName: API_ERROR_RULE_NAME, message: apiMessage }] : [];\n const ruleErrors = results.value\n .filter((result) => !result.isValid)\n .map((result) => ({\n ruleName: result.ruleName,\n message: result.message,\n }));\n return [...apiErrorList, ...ruleErrors];\n });\n\n function setTouched(value = true) {\n // Flushing the debounced value to be updated right away.\n // So that, we can have reactivity for `rules` validation, `isTouched`, `isDirty`, among other values\n flush();\n\n isTouched.value = value;\n }\n\n function setInitialValue(value: Value) {\n initialValue.value = value;\n }\n\n return reactive({\n name: fieldName,\n currentValue: readonly(fieldValue),\n initialValue: readonly(initialValue),\n isTouched: readonly(isTouched),\n isDirty: readonly(isDirty),\n errorMessage: computed(() => errors.value?.[0]?.message || ''),\n errors,\n setInitialValue,\n setTouched,\n });\n}\n\n// The ruleFactories are excluded from the main entrypoint in vite.config.ts, so they are exported here instead. This allows one import statement to be used for useValidation, its types, and all of the ruleFactories.\nexport { default as email } from './ruleFactories/email';\nexport { default as maxLength } from './ruleFactories/maxLength';\nexport { default as maxValue } from './ruleFactories/maxValue';\nexport { default as minLength } from './ruleFactories/minLength';\nexport { default as minValue } from './ruleFactories/minValue';\nexport { default as pattern } from './ruleFactories/pattern';\nexport { default as positiveNumber } from './ruleFactories/positiveNumber';\nexport { default as price } from './ruleFactories/price';\nexport { default as required } from './ruleFactories/required';\nexport { default as wholeNumber } from './ruleFactories/wholeNumber';\nexport * from './useValidation.types';\nexport { default as isDefined } from './utils/isDefined';\n"],"names":["isBuffer","obj","keyIdentity","key","flatten","target","opts","delimiter","maxDepth","transformKey","output","step","object","prev","currentDepth","value","isarray","type","isbuffer","isobject","newKey","pointerToFieldName","pointer","normalized","prefix","segments","parseJsonApiFieldErrors","errors","map","err","_a","message","fieldName","email","config","isDefined","t","maxLength","_value","max","toValue","valueString","maxValue","minLength","min","minValue","pattern","positiveNumber","price","round","DECIMAL_PRECISION","required","wholeNumber","API_ERROR_RULE_NAME","useValidation","rules","values","fieldNames","computed","apiErrors","ref","fields","fieldValue","get","updateFieldValue","debouncedSetFieldValue","debounce","DEBOUNCE","watch","buildField","fieldList","hasErrors","field","someTouched","dirtyFields","validate","preventScroll","nextTick","firstFieldWithError","firstErrorElement","getError","touch","setAllUntouched","setInitialValues","intialValues","setApiErrors","parsed","known","next","name","clearApiErrors","reactive","flush","getApiError","initialValue","isTouched","isDirty","results","rule","apiMessage","apiErrorList","ruleErrors","result","setTouched","setInitialValue","readonly","_b"],"mappings":";;;;;;;AAAA,SAASA,EAAUC,GAAK;AACtB,SAAOA,KACLA,EAAI,eACH,OAAOA,EAAI,YAAY,YAAa,cACrCA,EAAI,YAAY,SAASA,CAAG;AAChC;AAEA,SAASC,EAAaC,GAAK;AACzB,SAAOA;AACT;AAEO,SAASC,EAASC,GAAQC,GAAM;AACrC,EAAAA,IAAOA,KAAQ,CAAA;AAEf,QAAMC,IAAYD,EAAK,aAAa,KAC9BE,IAAWF,EAAK,UAChBG,IAAeH,EAAK,gBAAgBJ,GACpCQ,IAAS,CAAA;AAEf,WAASC,EAAMC,GAAQC,GAAMC,GAAc;AACzC,IAAAA,IAAeA,KAAgB,GAC/B,OAAO,KAAKF,CAAM,EAAE,QAAQ,SAAUT,GAAK;AACzC,YAAMY,IAAQH,EAAOT,CAAG,GAClBa,IAAUV,EAAK,QAAQ,MAAM,QAAQS,CAAK,GAC1CE,IAAO,OAAO,UAAU,SAAS,KAAKF,CAAK,GAC3CG,IAAWlB,EAASe,CAAK,GACzBI,IACJF,MAAS,qBACTA,MAAS,kBAGLG,IAASP,IACXA,IAAON,IAAYE,EAAaN,CAAG,IACnCM,EAAaN,CAAG;AAEpB,UAAI,CAACa,KAAW,CAACE,KAAYC,KAAY,OAAO,KAAKJ,CAAK,EAAE,WACzD,CAACT,EAAK,YAAYQ,IAAeN;AAClC,eAAOG,EAAKI,GAAOK,GAAQN,IAAe,CAAC;AAG7C,MAAAJ,EAAOU,CAAM,IAAIL;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,SAAAJ,EAAKN,CAAM,GAEJK;AACT;ACxCA,SAASW,EAAmBC,GAAyB;AACnD,QAAMC,IAAaD,EAAQ,QAAQ,OAAO,EAAE,GACtCE,IAAS;AAEf,MAAID,EAAW,WAAWC,CAAM;AAG9B,WAF6BD,EAAW,MAAMC,EAAO,MAAM,EACrB,MAAM,GAAG,EAAE,OAAO,OAAO,EAC/C,KAAK,GAAG;AAG1B,QAAMC,IAAWF,EAAW,MAAM,GAAG,EAAE,OAAO,OAAO;AACrD,SAAOE,EAASA,EAAS,SAAS,CAAC,KAAKH;AAC1C;AAOO,SAASI,EAAwBC,GAA0D;;AAChG,QAAMC,IAA8B,CAAA;AACpC,aAAWC,KAAOF,GAAQ;AACxB,UAAML,KAAUQ,IAAAD,EAAI,WAAJ,gBAAAC,EAAY;AAC5B,QAAI,CAACR;AACH;AAEF,UAAMS,IAAUF,EAAI,UAAUA,EAAI,SAAS;AAC3C,QAAI,CAACE;AACH;AAEF,UAAMC,IAAYX,EAAmBC,CAAO;AAC5C,IAAAM,EAAII,CAAS,IAAID;AAAA,EACnB;AACA,SAAOH;AACT;ACjCA,SAAwBK,EAAMC,IAAiB,IAAoB;AACjE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUnB,GAAO;AACf,aAAO,CAACoB,EAAUpB,CAAK,KAAM,OAAOA,KAAU,YAAY,iBAAiB,KAAKA,CAAK;AAAA,IACvF;AAAA,IACA,SAASmB,EAAO,WAAWE,EAAE,qBAAqB;AAAA,EAAA;AAEtD;ACJA,SAAwBC,EAAUH,GAAgC;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUI,GAAQ;AAChB,YAAMC,IAAMC,EAAQN,EAAO,GAAG,GACxBnB,IAAQyB,EAAQF,CAAM;AAE5B,UAAI,CAACH,EAAUpB,CAAK;AAClB,eAAO;AAGT,UAAI0B,IAAc,OAAO1B,CAAK;AAE9B,aAAImB,EAAO,SACTO,IAAcA,EAAY,KAAA,IAGrBA,EAAY,UAAUF;AAAA,IAC/B;AAAA,IACA,SAASL,EAAO,YAAY,MAAME,EAAE,2BAA2B,EAAE,KAAK,OAAOI,EAAQN,EAAO,GAAG,CAAC,GAAG;AAAA,EAAA;AAEvG;ACtBA,SAAwBQ,EAASR,GAAgC;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUnB,GAAO;AACf,YAAMwB,IAAMC,EAAQN,EAAO,GAAG;AAE9B,aAAO,CAACC,EAAUpB,CAAK,KAAK,OAAOA,CAAK,KAAKwB;AAAA,IAC/C;AAAA,IACA,SAASL,EAAO,YAAY,MAAME,EAAE,0BAA0B,EAAE,KAAK,OAAOI,EAAQN,EAAO,GAAG,CAAC,GAAG;AAAA,EAAA;AAEtG;ACTA,SAAwBS,EAAUT,GAAgC;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUI,GAAQ;AAChB,YAAMM,IAAMJ,EAAQN,EAAO,GAAG,GACxBnB,IAAQyB,EAAQF,CAAM;AAE5B,UAAI,CAACH,EAAUpB,CAAK;AAClB,eAAO;AAGT,UAAI0B,IAAc,OAAO1B,CAAK;AAE9B,aAAImB,EAAO,SACTO,IAAcA,EAAY,KAAA,IAGrBA,EAAY,UAAUG;AAAA,IAC/B;AAAA,IACA,SAASV,EAAO,YAAY,MAAME,EAAE,2BAA2B,EAAE,KAAK,OAAOI,EAAQN,EAAO,GAAG,CAAC,GAAG;AAAA,EAAA;AAEvG;ACtBA,SAAwBW,GAASX,GAAgC;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUnB,GAAO;AACf,YAAM6B,IAAMJ,EAAQN,EAAO,GAAG;AAE9B,aAAO,CAACC,EAAUpB,CAAK,KAAK,OAAOA,CAAK,KAAK6B;AAAA,IAC/C;AAAA,IACA,SAASV,EAAO,YAAY,MAAME,EAAE,0BAA0B,EAAE,KAAK,OAAOI,EAAQN,EAAO,GAAG,CAAC,GAAG;AAAA,EAAA;AAEtG;ACVA,SAAwBY,GAAQZ,GAAgC;AAC9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUI,GAAQ;AAChB,YAAMvB,IAAQyB,EAAQF,CAAM;AAE5B,aAAO,CAACH,EAAUpB,CAAK,KAAKmB,EAAO,MAAM,KAAK,OAAOnB,CAAK,CAAC;AAAA,IAC7D;AAAA,IACA,SAAS,MAAM;AACb,UAAI,OAAOmB,EAAO,WAAY,YAAY,CAACA,EAAO,QAAQ;AACxD,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAIJ,aAAOA,EAAO;AAAA,IAChB;AAAA,EAAA;AAEJ;ACrBA,SAAwBa,GAAeb,IAAiB,IAAoB;AAC1E,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUnB,GAAO;AACf,aAAO,CAACoB,EAAUpB,CAAK,KAAK,OAAOA,CAAK,IAAI;AAAA,IAC9C;AAAA,IACA,SAASmB,EAAO,WAAWE,EAAE,8BAA8B;AAAA,EAAA;AAE/D;ACLA,SAAwBY,GAAMd,IAAiB,IAAoB;AACjE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUnB,GAAO;AACf,YAAMiC,IAAQ,OAAOjC,CAAK;AAE1B,aACE,CAACoB,EAAUpB,CAAK,KAAMiC,MAAU,SAAYA,KAAS,KAAKA,MAAUC,EAAMD,GAAOE,EAAkB,QAAQ;AAAA,IAE/G;AAAA,IACA,SAAShB,EAAO,WAAWE,EAAE,qBAAqB;AAAA,EAAA;AAEtD;ACfA,SAAwBe,GAASjB,IAAiB,IAAoB;AACpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUnB,GAAO;AACf,aAAOoB,EAAU,OAAOpB,KAAU,WAAWA,EAAM,KAAA,IAASA,CAAK;AAAA,IACnE;AAAA,IACA,SAASmB,EAAO,WAAWE,EAAE,wBAAwB;AAAA,EAAA;AAEzD;ACRA,SAAwBgB,GAAYlB,IAAiB,IAAoB;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAUnB,GAAO;AACf,aAAO,CAACoB,EAAUpB,CAAK,KAAM,OAAO,UAAU,OAAOA,CAAK,CAAC,KAAK,OAAOA,CAAK,KAAK;AAAA,IACnF;AAAA,IACA,SAASmB,EAAO,WAAWE,EAAE,2BAA2B;AAAA,EAAA;AAE5D;ACAA,MAAMiB,IAAsB;AAE5B,SAAwBC,GAAqC;AAAA,EAC3D,OAAAC;AAAA,EACA,QAAAC;AACF,GAAuD;AACrD,QAAMC,IAAaC,EAAS,MAAM,OAAO,KAAKtD,EAAQmD,GAAO,EAAE,MAAM,GAAA,CAAM,CAAC,CAAC,GACvEI,IAAYC,EAA4B,EAAE,GAE1CC,IAASJ,EAAW,MAAM;AAAA,IAC9B,CAAC7B,GAAKI,MAAc;AAClB,YAAM8B,IAAaF,EAAIG,EAAIvB,EAAQgB,CAAM,GAAGxB,CAAS,CAAC,GAIhDgC,IAAmB,CAAChC,MAAsB;AAC9C,QAAA8B,EAAW,QAAQC,EAAIvB,EAAQgB,CAAM,GAAGxB,CAAS;AAAA,MACnD,GAEMiC,IAAyBC,EAAS,MAAM;AAC5C,QAAAF,EAAiBhC,CAAS;AAAA,MAC5B,GAAGmC,EAAS,IAAI;AAEhB,aAAAC;AAAA,QACE,MAAML,EAAIvB,EAAQgB,CAAM,GAAGxB,CAAS;AAAA,QACpC,MAAM;AACJ,UAAAiC,EAAA;AAAA,QACF;AAAA,MAAA,GAGFrC,EAAII,CAAS,IAAIqC,EAAyC;AAAA,QACxD,WAAArC;AAAA,QACA,YAAA8B;AAAA,QACA,OAAO,MAAM;AACX,UAAAG,EAAuB,OAAA,GACvBD,EAAiBhC,CAAS;AAAA,QAC5B;AAAA,QACA,aAAa,MAAM2B,EAAU,MAAM3B,CAAS,KAAK;AAAA,QACjD,OAAO+B,EAAIR,GAAOvB,CAAS;AAAA,MAAA,CAC5B,GAEMJ;AAAA,IACT;AAAA,IACA,CAAA;AAAA,EAAC,GAGG0C,IAAYZ,EAAS,MAAM,OAAO,OAAOG,CAAM,CAAC,GAEhDU,IAAYb,EAAS,MAAMY,EAAU,MAAM,KAAK,CAACE,MAAUA,EAAM,OAAO,SAAS,CAAC,CAAC,GAEnFC,IAAcf,EAAS,MAAMY,EAAU,MAAM,KAAK,CAACE,MAAUA,EAAM,SAAS,CAAC,GAE7EE,IAAchB,EAAS,MAAMY,EAAU,MAAM,OAAO,CAACE,MAAUA,EAAM,OAAO,CAAC,GAE7EG,IAAgD,eAAgB,EAAE,eAAAC,EAAA,IAAkB,CAAA,GAAI;AAQ5F,QAPAN,EAAU,MAAM,QAAQ,CAACE,MAAU;AAEjC,MAAAA,EAAM,WAAW,EAAK,GACtBA,EAAM,WAAW,EAAI;AAAA,IACvB,CAAC,GACD,MAAMK,EAAA,GAEFN,EAAU,SAAS,CAACK,GAAe;AACrC,YAAME,IAAsB,OAAO,QAAQjB,CAAM,EAAE,KAAK,CAAC,GAAGW,CAAK,MAAMA,EAAM,YAAY,GACnFxC,KAAY8C,KAAA,gBAAAA,EAAsB,OAAM,IACxCC,IAAoB,qCAAU,cAAc,SAAS/C,CAAS;AAEpE,MAAI+C,KACFA,EAAkB,eAAe,EAAE,UAAU,SAAA,CAAU;AAAA,IAE3D;AAEA,WAAO,CAACR,EAAU;AAAA,EACpB,GAEMS,IAAgD,SAAUhD,GAAmB;;AACjF,aAAOF,IAAA+B,EAAO7B,CAAS,MAAhB,gBAAAF,EAAmB,iBAAgB;AAAA,EAC5C,GAEMmD,IAA0C,SAAUjD,GAAmB;AAC3E,QAAI,CAAC6B,EAAO7B,CAAS;AACnB,YAAM,IAAI,MAAM,wBAAwBA,CAAS,4CAA4C;AAG/F,IAAA6B,EAAO7B,CAAS,EAAE,WAAA;AAAA,EACpB,GAEMkD,IAA8D,iBAAkB;AACpF,UAAML,EAAA,GACNP,EAAU,MAAM,QAAQ,CAACE,MAAU;AACjC,MAAAA,EAAM,WAAW,EAAK;AAAA,IACxB,CAAC;AAAA,EACH,GAEMW,IAAgE,SAAUC,GAAsB;AACpG,IAAAd,EAAU,MAAM,QAAQ,CAACE,MAAU;AACjC,MAAAA,EAAM,gBAAgBY,EAAaZ,EAAM,IAAI,CAAC;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,WAASa,EAAa1D,GAAkC;AACtD,UAAM2D,IAAS5D,EAAwBC,CAAM,GACvC4D,IAAQ9B,EAAW,OACnB+B,IAA+B,CAAA;AACrC,eAAWC,KAAQF;AACjB,MAAID,EAAOG,CAAI,MACbD,EAAKC,CAAI,IAAIH,EAAOG,CAAI;AAG5B,IAAA9B,EAAU,QAAQ6B;AAAA,EACpB;AAEA,WAASE,EAAe1D,GAAoB;AAC1C,QAAIA,GAAW;AACb,YAAMwD,IAAO,EAAE,GAAG7B,EAAU,MAAA;AAC5B,aAAO6B,EAAKxD,CAAS,GACrB2B,EAAU,QAAQ6B;AAAA,IACpB;AACE,MAAA7B,EAAU,QAAQ,CAAA;AAAA,EAEtB;AAEA,SAAOgC,EAAS;AAAA,IACd,UAAAhB;AAAA,IACA,UAAAK;AAAA,IACA,OAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,cAAAE;AAAA,IACA,gBAAAK;AAAA,IACA,QAAA7B;AAAA,IACA,aAAAa;AAAA,IACA,WAAAH;AAAA,IACA,aAAAE;AAAA,EAAA,CACD;AACH;AAUA,SAASJ,EAA4B;AAAA,EACnC,WAAArC;AAAA,EACA,YAAA8B;AAAA,EACA,OAAAP;AAAA,EACA,OAAAqC;AAAA,EACA,aAAAC;AACF,GAAkD;AAIhD,QAAMC,IAAelC,EAAIE,EAAW,KAAK,GACnCiC,IAAYnC,EAAI,EAAK,GACrBoC,IAAUtC,EAAS,OAAOI,EAAW,SAAS,SAASgC,EAAa,SAAS,GAAG,GAEhFG,IAAUvC,EAAS,MAGlBqC,EAAU,QAIRxC,EAAM,IAAI,CAAC2C,OAAU;AAAA,IAC1B,WAAAlE;AAAA,IACA,UAAUkE,EAAK;AAAA,IACf,SAASA,EAAK,UAAUpC,EAAW,KAAK;AAAA,IACxC,SAAS,OAAOoC,EAAK,WAAY,aAAaA,EAAK,QAAQpC,EAAW,KAAK,IAAIoC,EAAK;AAAA,EAAA,EACpF,IARO,CAAA,CASV,GAEKvE,IAAS+B,EAA4B,MAAM;AAC/C,UAAMyC,IAAaN,EAAA,GACbO,IACJD,MAAe,KAAK,CAAC,EAAE,UAAU9C,GAAqB,SAAS8C,EAAA,CAAY,IAAI,CAAA,GAC3EE,IAAaJ,EAAQ,MACxB,OAAO,CAACK,MAAW,CAACA,EAAO,OAAO,EAClC,IAAI,CAACA,OAAY;AAAA,MAChB,UAAUA,EAAO;AAAA,MACjB,SAASA,EAAO;AAAA,IAAA,EAChB;AACJ,WAAO,CAAC,GAAGF,GAAc,GAAGC,CAAU;AAAA,EACxC,CAAC;AAED,WAASE,EAAWxF,IAAQ,IAAM;AAGhC,IAAA6E,EAAA,GAEAG,EAAU,QAAQhF;AAAA,EACpB;AAEA,WAASyF,EAAgBzF,GAAc;AACrC,IAAA+E,EAAa,QAAQ/E;AAAA,EACvB;AAEA,SAAO4E,EAAS;AAAA,IACd,MAAM3D;AAAA,IACN,cAAcyE,EAAS3C,CAAU;AAAA,IACjC,cAAc2C,EAASX,CAAY;AAAA,IACnC,WAAWW,EAASV,CAAS;AAAA,IAC7B,SAASU,EAAST,CAAO;AAAA,IACzB,cAActC,EAAS;;AAAM,eAAAgD,KAAA5E,IAAAH,EAAO,UAAP,gBAAAG,EAAe,OAAf,gBAAA4E,EAAmB,YAAW;AAAA,KAAE;AAAA,IAC7D,QAAA/E;AAAA,IACA,iBAAA6E;AAAA,IACA,YAAAD;AAAA,EAAA,CACD;AACH;","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leaflink/stash",
3
- "version": "53.4.2",
3
+ "version": "53.4.4",
4
4
  "description": "LeafLink's design system.",
5
5
  "homepage": "https://stash.leaflink.com",
6
6
  "main": "./dist/index.ts",
@@ -84,7 +84,6 @@
84
84
  "fuzzysort": "3.0.2",
85
85
  "sanitize-html": "2.13.0",
86
86
  "v-calendar": "3.1.2",
87
- "vue": "3.5.28",
88
87
  "vue-currency-input": "3.1.0",
89
88
  "vue-inline-svg": "3.1.4",
90
89
  "vue3-carousel": "0.3.4",
@@ -125,7 +124,8 @@
125
124
  "peerDependencies": {
126
125
  "lodash-es": "^4.x.x",
127
126
  "tailwindcss": "^4.x.x",
128
- "vue-router": "^4.x.x"
127
+ "vue": "^3.5.28",
128
+ "vue-router": "^4.6.4"
129
129
  },
130
130
  "peerDependenciesMeta": {
131
131
  "@leaflink/snitch": {