@regle/rules 1.14.7 → 1.15.0

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.
@@ -1246,4 +1246,41 @@ declare function type<T>(): RegleRuleDefinition<unknown, [], false, boolean, May
1246
1246
  * @see {@link https://reglejs.dev/core-concepts/rules/built-in-rules#url Documentation}
1247
1247
  */
1248
1248
  declare const url: RegleRuleDefinition<string, [], false, boolean, MaybeInput<string>>;
1249
- export { EnumLike, alpha, alphaNum, and, applyIf, assignIf, between, boolean, checked, contains, date, dateAfter, dateBefore, dateBetween, decimal, email, endsWith, exactLength, exactValue, getSize, hexadecimal, integer, ipv4Address, isDate, isEmpty, isFilled, isNumber, literal, macAddress, matchRegex, maxLength, maxValue, minLength, minValue, nativeEnum, not, number, numeric, oneOf, or, regex, required, requiredIf, requiredUnless, sameAs, startsWith, string, toDate, toNumber, type, url, withAsync, withMessage, withParams, withTooltip };
1249
+ /**
1250
+ * Requires a value to be a native `File` constructor.
1251
+ *
1252
+ * Mainly used for typing with `InferInput`.
1253
+ *
1254
+ * @example
1255
+ * ```ts
1256
+ * import { type InferInput } from '@regle/core';
1257
+ * import { file } from '@regle/rules';
1258
+ *
1259
+ * const rules = {
1260
+ * file: { file },
1261
+ * }
1262
+ *
1263
+ * const state = ref<InferInput<typeof rules>>({});
1264
+ * ```
1265
+ *
1266
+ * @see {@link https://reglejs.dev/core-concepts/rules/built-in-rules#file Documentation}
1267
+ */
1268
+ declare const file: RegleRuleDefinition<unknown, [], false, boolean, MaybeInput<File>, unknown>;
1269
+ /**
1270
+ * Requires a value to be a file with a specific type.
1271
+ *
1272
+ * @example
1273
+ * ```ts
1274
+ * import { type InferInput } from '@regle/core';
1275
+ * import { fileType } from '@regle/rules';
1276
+ *
1277
+ * const {r$} = useRegle({ file: null as File | null }, {
1278
+ * file: { fileType: fileType(['image/png', 'image/jpeg']) },
1279
+ * })
1280
+ *
1281
+ * ```
1282
+ *
1283
+ * @see {@link https://reglejs.dev/core-concepts/rules/built-in-rules#file Documentation}
1284
+ */
1285
+ declare const fileType: RegleRuleWithParamsDefinition<unknown, [accept: string[]], false, boolean, MaybeInput<File>, unknown>;
1286
+ export { EnumLike, alpha, alphaNum, and, applyIf, assignIf, between, boolean, checked, contains, date, dateAfter, dateBefore, dateBetween, decimal, email, endsWith, exactLength, exactValue, file, fileType, getSize, hexadecimal, integer, ipv4Address, isDate, isEmpty, isFilled, isNumber, literal, macAddress, matchRegex, maxLength, maxValue, minLength, minValue, nativeEnum, not, number, numeric, oneOf, or, regex, required, requiredIf, requiredUnless, sameAs, startsWith, string, toDate, toNumber, type, url, withAsync, withMessage, withParams, withTooltip };
@@ -170,7 +170,7 @@ function applyIf(_condition, rule) {
170
170
  * Server side friendly way of checking for a File
171
171
  */
172
172
  function isFile(value) {
173
- return value?.constructor?.name == "File" || value?.constructor?.name == "FileList";
173
+ return value?.constructor?.name == "File";
174
174
  }
175
175
 
176
176
  /**
@@ -938,7 +938,7 @@ const date = createRule({
938
938
  if (isFilled(value)) return value instanceof Date;
939
939
  return true;
940
940
  },
941
- message: "The value must be a native Date constructor"
941
+ message: "The value must be a native Date"
942
942
  });
943
943
 
944
944
  function getUserLocale() {
@@ -1915,4 +1915,62 @@ const url = createRule({
1915
1915
  message: "The value is not a valid URL address"
1916
1916
  });
1917
1917
 
1918
- export { alpha, alphaNum, and, applyIf, assignIf, between, boolean, checked, contains, date, dateAfter, dateBefore, dateBetween, decimal, email, endsWith, exactLength, exactValue, getSize, hexadecimal, integer, ipv4Address, isDate, isEmpty, isFilled, isNumber, literal, macAddress, matchRegex, maxLength, maxValue, minLength, minValue, nativeEnum, not, number, numeric, oneOf, or, regex, required, requiredIf, requiredUnless, sameAs, startsWith, string, toDate, toNumber, type, url, withAsync, withMessage, withParams, withTooltip };
1918
+ /**
1919
+ * Requires a value to be a native `File` constructor.
1920
+ *
1921
+ * Mainly used for typing with `InferInput`.
1922
+ *
1923
+ * @example
1924
+ * ```ts
1925
+ * import { type InferInput } from '@regle/core';
1926
+ * import { file } from '@regle/rules';
1927
+ *
1928
+ * const rules = {
1929
+ * file: { file },
1930
+ * }
1931
+ *
1932
+ * const state = ref<InferInput<typeof rules>>({});
1933
+ * ```
1934
+ *
1935
+ * @see {@link https://reglejs.dev/core-concepts/rules/built-in-rules#file Documentation}
1936
+ */
1937
+ const file = createRule({
1938
+ type: "file",
1939
+ validator: (value) => {
1940
+ if (isFilled(value)) return isFile(value);
1941
+ return true;
1942
+ },
1943
+ message: "The value must be a native File"
1944
+ });
1945
+
1946
+ /**
1947
+ * Requires a value to be a file with a specific type.
1948
+ *
1949
+ * @example
1950
+ * ```ts
1951
+ * import { type InferInput } from '@regle/core';
1952
+ * import { fileType } from '@regle/rules';
1953
+ *
1954
+ * const {r$} = useRegle({ file: null as File | null }, {
1955
+ * file: { fileType: fileType(['image/png', 'image/jpeg']) },
1956
+ * })
1957
+ *
1958
+ * ```
1959
+ *
1960
+ * @see {@link https://reglejs.dev/core-concepts/rules/built-in-rules#file Documentation}
1961
+ */
1962
+ const fileType = createRule({
1963
+ type: "fileType",
1964
+ validator: (value, accept) => {
1965
+ if (isFilled(value)) {
1966
+ if (isFile(value)) return accept.includes(value.type);
1967
+ return false;
1968
+ }
1969
+ return true;
1970
+ },
1971
+ message({ $params: [accept] }) {
1972
+ return `File type is not allowed. Allowed types are: ${accept.map((type$1) => type$1.split("/")[1]).join(", ")}.`;
1973
+ }
1974
+ });
1975
+
1976
+ export { alpha, alphaNum, and, applyIf, assignIf, between, boolean, checked, contains, date, dateAfter, dateBefore, dateBetween, decimal, email, endsWith, exactLength, exactValue, file, fileType, getSize, hexadecimal, integer, ipv4Address, isDate, isEmpty, isFilled, isNumber, literal, macAddress, matchRegex, maxLength, maxValue, minLength, minValue, nativeEnum, not, number, numeric, oneOf, or, regex, required, requiredIf, requiredUnless, sameAs, startsWith, string, toDate, toNumber, type, url, withAsync, withMessage, withParams, withTooltip };
@@ -1 +1 @@
1
- import{InternalRuleType as e,createRule as t,unwrapRuleParameters as n}from"@regle/core";import{computed as r,toValue as i,unref as a}from"vue";function o(n,r){let i,a,o,s,c=!1;typeof n==`function`&&!(`_validator`in n)?(i=e.Inline,a=n):{_type:i,validator:a,_active:o,_params:s,_async:c}=n;let l=t({type:i,validator:a,active:o,message:r,async:c}),u=[...s??[]];if(l._params=u,l._message_patched=!0,typeof l==`function`){if(s!=null){let e=l(...u);return e._message_patched=!0,e}return l}else return l}function s(n,r){let i,a,o,s,c,l=!1;typeof n==`function`&&!(`_validator`in n)?(i=e.Inline,a=n):{_type:i,validator:a,_active:o,_params:s,_message:c,_async:l}=n;let u=t({type:i,validator:a,active:o,message:c,tooltip:r,async:l}),d=[...s??[]];if(u._params=d,u._tooltip_patched=!0,typeof u==`function`){let e=u(...d);return u._tooltip_patched=!0,e}else return u}function c(n,r){let i,a,o=[],s=``;typeof n==`function`?(a=async(e,...t)=>n(e,...t),o=[r]):({_type:i,_message:s}=n,o=o=n._params?.concat(r),a=async(...e)=>n.validator(e));let c=t({type:i??e.Async,validator:a,message:s,async:!0});return c._params=c._params?.concat(o),c(...r??[])}function l(n,r){let i,a,o=[],s=``;typeof n==`function`?(e.Inline,a=(e,...t)=>n(e,...t),o=[r]):({_type:i,validator:a,_message:s}=n,o=o=n._params?.concat(r));let c=t({type:e.Inline,validator:a,message:s});return c._params=c._params?.concat(o),c(...r)}function u(r,i){let a,o,s=[],c=``;typeof i==`function`?(a=e.Inline,o=i,s=[r]):({_type:a,validator:o,_message:c}=i,s=i._params?.concat([r]));function l(e,...t){let[i]=n([r]);return i?o(e,...t):!0}function u(){let[e]=n([r]);return e}let d=t({type:a,validator:l,active:u,message:c}),f=[...s??[]];return d._params=f,typeof d==`function`?d(...f):d}function d(e){return e?.constructor?.name==`File`||e?.constructor?.name==`FileList`}function f(e,t=!0){return e==null?!0:e instanceof Date?isNaN(e.getTime()):d(e)?e.size<=0:Array.isArray(e)?t?e.length===0:!1:typeof e==`object`&&e?Object.keys(e).length===0:!String(e).length}function p(e){return e&&(e instanceof Date||e.constructor.name==`File`||e.constructor.name==`FileList`)?!1:typeof e==`object`&&!!e&&!Array.isArray(e)}function m(e){if(f(e))return!1;try{let t=null;if(e instanceof Date)t=e;else if(typeof e==`string`){let n=new Date(e);if(n.toString()===`Invalid Date`)return!1;t=n}return!!t}catch{return!1}}function h(e){let t=Object.prototype.toString.call(e);return e==null?new Date(NaN):e instanceof Date||typeof e==`object`&&t===`[object Date]`?new Date(e.getTime()):typeof e==`number`||t===`[object Number]`||typeof e==`string`||t===`[object String]`?new Date(e):new Date(NaN)}function g(e,t=!0){return!f(typeof e==`string`?e.trim():e,t)}function _(e){return e==null?!1:typeof e==`number`?!isNaN(e):!1}function v(e,...t){if(f(e))return!0;let n=typeof e==`number`?e.toString():e;return t.every(e=>(e.lastIndex=0,e.test(n)))}function y(e){let t=a(e);return Array.isArray(t)?t.length:typeof t==`object`?Object.keys(t).length:typeof t==`number`?isNaN(t)?0:t:String(t).length}function b(e){return typeof e==`number`?e:e==null?NaN:typeof e==`string`&&e.trim()===e?+e:NaN}function x(...e){let n=e.some(e=>typeof e==`function`?e.constructor.name===`AsyncFunction`:e._async),r=e.map(e=>{if(typeof e==`function`)return null;{let t=e._params;return t?.length?t:[]}}).flat().filter(e=>!!e);function i(e,t,...n){let r=[],i=0;for(let a of e)if(typeof a==`function`)r.push(a(t)),i++;else{let e=a._params?.length??0;r.push(a.validator(t,...n.slice(i,e))),e&&(i+=e)}return r}function a(e){return e?.some(e=>typeof e!=`boolean`)?{$valid:e.every(e=>typeof e==`boolean`?!!e:e.$valid),...e.reduce((e,t)=>{if(typeof t==`boolean`)return e;let{$valid:n,...r}=t;return{...e,...r}},{})}:e.every(e=>!!e)}let o;o=e.length?n?async(t,...n)=>a(await Promise.all(i(e,t,...n))):(t,...n)=>a(i(e,t,...n)):e=>!1;let s=t({type:`and`,validator:o,message:`The value does not match all of the provided validators`}),c=[...r??[]];return s._params=c,typeof s==`function`?s(...c):s}function ee(...e){let n=e.some(e=>typeof e==`function`?e.constructor.name===`AsyncFunction`:e._async),r=e.map(e=>typeof e==`function`?null:e._params).flat().filter(e=>!!e);function i(e,t,...n){let r=[],i=0;for(let a of e)if(typeof a==`function`)r.push(a(t)),i++;else{let e=a._params?.length??0;r.push(a.validator(t,...n.slice(i,e))),e&&(i+=e)}return r}function a(e){return e.some(e=>typeof e!=`boolean`)?{$valid:e.some(e=>typeof e==`boolean`?!!e:e.$valid),...e.reduce((e,t)=>{if(typeof t==`boolean`)return e;let{$valid:n,...r}=t;return{...e,...r}},{})}:e.some(e=>!!e)}let o=t({type:`or`,validator:n?async(t,...n)=>a(await Promise.all(i(e,t,...n))):(t,...n)=>a(i(e,t,...n)),message:`The value does not match any of the provided validators`}),s=[...r??[]];return o._params=s,typeof o==`function`?o(...s):o}function S(e,n){let r,i,a,o,s;typeof e==`function`?(i=e,s=e.constructor.name===`AsyncFunction`):({_type:r,validator:i,_params:o}=e,s=e._async),a=s?async(e,...t)=>g(e)?!await i(e,...t):!0:(e,...t)=>g(e)?!i(e,...t):!0;let c=t({type:`not`,validator:a,message:n??`Error`}),l=[...o??[]];return c._params=l,typeof c==`function`?c(...l):c}function C(e,t,n){return Object.entries(i(t)).map(([t,r])=>typeof r==`function`||p(r)&&`_validator`in r?[t,u(n?e:()=>!i(e),r)]:[t,r])}function w(e,t,n){return r(()=>{let r=C(e,t,!0),i=n?C(e,n,!1):[];return Object.fromEntries([...r,...i])})}const T=/^[a-zA-Z]*$/,E=/^[\w.]+$/,D=t({type:`alpha`,validator(e,t){return f(e)?!0:t?.allowSymbols?v(e,E):v(e,T)},message:`The value is not alphabetical`}),O=/^[a-zA-Z0-9]*$/,k=/^[a-zA-Z0-9_]*$/,A=t({type:`alphaNum`,validator(e,t){return f(e)?!0:t?.allowSymbols?v(e,k):v(e,O)},message:`The value must be alpha-numeric`}),j=t({type:`between`,validator:(e,t,n,r)=>{let{allowEqual:i=!0}=r??{};if(g(e)&&g(t)&&g(n)){let r=b(e),a=b(t),o=b(n);return _(r)&&_(a)&&_(o)?i?r>=a&&r<=o:r>a&&r<o:(console.warn(`[between] Value or parameters aren't numbers, got value: ${e}, min: ${t}, max: ${n}`),!1)}return!0},message:({$params:[e,t]})=>`The value must be between ${e} and ${t}`}),M=t({type:`boolean`,validator:e=>g(e)?typeof e==`boolean`:!0,message:`The value must be a native boolean`}),N=t({type:`checked`,validator:e=>g(e)?e===!0:!0,message:`The field must be checked`}),P=t({type:`contains`,validator(e,t){return g(e)&&g(t)?e.includes(t):!0},message({$params:[e]}){return`The value must contain ${e}`}}),F=t({type:`date`,validator:e=>g(e)?e instanceof Date:!0,message:`The value must be a native Date constructor`});function I(){return navigator.languages==null?navigator.language:navigator.languages[0]}function L(e){return e?new Intl.DateTimeFormat(I(),{dateStyle:`short`}).format(new Date(e)):`?`}const R=t({type:`dateAfter`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?m(e)&&m(t)?(r?h(e).getTime()>=h(t).getTime():h(e).getTime()>h(t).getTime())?!0:{$valid:!1,error:`date-not-after`}:{$valid:!1,error:`value-or-parameter-not-a-date`}:!0},message:({$params:[e],error:t})=>t===`value-or-parameter-not-a-date`?`The values must be dates`:`The date must be after ${L(e)}`}),z=t({type:`dateBefore`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?m(e)&&m(t)?(r?h(e).getTime()<=h(t).getTime():h(e).getTime()<h(t).getTime())?!0:{$valid:!1,error:`date-not-before`}:{$valid:!1,error:`value-or-parameter-not-a-date`}:!0},message:({$params:[e],error:t})=>t===`value-or-parameter-not-a-date`?`The values must be dates`:`The date must be before ${L(e)}`}),B=t({type:`dateBetween`,validator:(e,t,n,r)=>{let{allowEqual:i=!0}=r??{};return m(e)&&m(t)&&m(n)?i?h(e).getTime()>=h(t).getTime()&&h(e).getTime()<=h(n).getTime():h(e).getTime()>h(t).getTime()&&h(e).getTime()<h(n).getTime():!0},message:({$params:[e,t]})=>`The date must be between ${L(e)} and ${L(t)}`}),V=/^[-]?\d*(\.\d+)?$/,H=t({type:`decimal`,validator(e){return f(e)?!0:v(e,V)},message:`The value must be decimal`}),U=/^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i,W=t({type:`email`,validator(e){return f(e)?!0:v(e,U)},message:`The value must be an valid email address`}),G=t({type:`endsWith`,validator(e,t){return g(e)&&g(t)?e.endsWith(t):!0},message({$params:[e]}){return`The value must end with ${e}`}}),te=t({type:`exactLength`,validator:(e,t)=>g(e,!1)&&g(t)?_(t)?y(e)===t:(console.warn(`[minLength] Parameter isn't a number, got parameter: ${t}`),!1):!0,message:({$params:[e]})=>`The value should be exactly ${e} characters long`}),K=t({type:`exactValue`,validator:(e,t)=>g(e)&&g(t)?_(t)&&!isNaN(b(e))?b(e)===t:(console.warn(`[exactValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!0):!0,message:({$params:[e]})=>`The value must be equal to ${e}`}),q=/^[a-fA-F0-9]*$/,J=t({type:`hexadecimal`,validator(e){return f(e)?!0:v(e,q)},message:`The value must be hexadecimal`}),Y=/(^[0-9]*$)|(^-[0-9]+$)/,X=t({type:`integer`,validator(e){return f(e)?!0:v(e,Y)},message:`The value must be an integer`});function Z(e){if(e.length>3||e.length===0||e[0]===`0`&&e!==`0`||!e.match(/^\d+$/))return!1;let t=e|0;return t>=0&&t<=255}const Q=t({type:`ipv4Address`,validator(e){if(f(e))return!0;if(typeof e!=`string`)return!1;let t=e.split(`.`);return t.length===4&&t.every(Z)},message:`The value is not a valid IPv4 address`});function ne(e){return o(l((e,t)=>g(e)&&g(t)?t===e:!0,[r(()=>i(e))]),({$params:[e]})=>`Value should be ${e}.`)}const re=t({type:`macAddress`,validator(e,t=`:`){if(f(e))return!0;if(typeof e!=`string`)return!1;let n=typeof t==`string`&&t!==``?e.split(t):e.length===12||e.length===16?e.match(/.{2}/g):null;return n!==null&&(n.length===6||n.length===8)&&n.every(ie)},message:`The value is not a valid MAC Address`}),ie=e=>e.toLowerCase().match(/^[0-9a-f]{2}$/),ae=t({type:`maxLength`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e,!1)&&g(t)?_(t)?r?y(e)<=t:y(e)<t:(console.warn(`[maxLength] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0},message:({$value:e,$params:[t]})=>Array.isArray(e)?`This list should have maximum ${t} items`:`The value length should not exceed ${t}`}),oe=t({type:`maxValue`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?!isNaN(b(e))&&!isNaN(b(t))?r?b(e)<=b(t):b(e)<b(t):(console.warn(`[maxValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0},message:({$params:[e,t]})=>{let{allowEqual:n=!0}=t??{};return n?`The value must be less than or equal to ${e}`:`The value must be less than ${e}`}}),se=t({type:`minLength`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e,!1)&&g(t)?_(t)?r?y(e)>=t:y(e)>t:(console.warn(`[minLength] Parameter isn't a number, got parameter: ${t}`),!1):!0},message:({$value:e,$params:[t]})=>Array.isArray(e)?`The list should have at least ${t} items`:`The value length should be at least ${t}`}),ce=t({type:`minValue`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?!isNaN(b(e))&&!isNaN(b(t))?r?b(e)>=b(t):b(e)>b(t):(console.warn(`[minValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0},message:({$params:[e,t]})=>{let{allowEqual:n=!0}=t??{};return n?`The value must be greater than or equal to ${e}`:`The value must be greater than ${e}`}});function le(e){let t=Object.keys(e).filter(t=>typeof e[e[t]]!=`number`),n={};for(let r of t)n[r]=e[r];return Object.values(n)}function ue(e){return o(l((e,t)=>g(e)&&!f(t)?le(t).includes(e):!0,[r(()=>i(e))]),({$params:[e]})=>`The value should be one of those options: ${Object.values(e).join(`, `)}.`)}const de=t({type:`number`,validator:e=>g(e)?_(e):!0,message:`The value must be a native number`}),fe=/^\d*(\.\d+)?$/,pe=t({type:`numeric`,validator(e){return f(e)?!0:v(e,fe)},message:`The value must be numeric`}),$=t({type:`oneOf`,validator(e,t){return g(e)&&g(t,!1)?t.includes(e):!0},message:({$params:[e]})=>`The value should be one of those options: ${e.join(`, `)}.`}),me=t({type:`regex`,validator(e,t){return g(e)?v(e,...Array.isArray(t)?t:[t]):!0},message:`The value does not match the required pattern`}),he=t({type:`required`,validator:e=>g(e),message:`This field is required`}),ge=t({type:`required`,validator(e,t){return t?g(e):!0},message:`This field is required`,active({$params:[e]}){return e}}),_e=t({type:`required`,validator(e,t){return t?!0:g(e)},message:`This field is required`,active({$params:[e]}){return!e}}),ve=t({type:`sameAs`,validator(e,t,n){return f(e)?!0:e===t},message({$params:[e,t=`other`]}){return`The value must be equal to the ${t} value`}}),ye=t({type:`startsWith`,validator(e,t){return g(e)&&g(t)?e.startsWith(t):!0},message({$params:[e]}){return`The value must start with ${e}`}}),be=t({type:`string`,validator:e=>g(e)?typeof e==`string`:!0,message:`The value must be a string`});function xe(){return(()=>!0)}const Se=/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i,Ce=t({type:`url`,validator(e){return f(e)?!0:v(e,Se)},message:`The value is not a valid URL address`});export{D as alpha,A as alphaNum,x as and,u as applyIf,w as assignIf,j as between,M as boolean,N as checked,P as contains,F as date,R as dateAfter,z as dateBefore,B as dateBetween,H as decimal,W as email,G as endsWith,te as exactLength,K as exactValue,y as getSize,J as hexadecimal,X as integer,Q as ipv4Address,m as isDate,f as isEmpty,g as isFilled,_ as isNumber,ne as literal,re as macAddress,v as matchRegex,ae as maxLength,oe as maxValue,se as minLength,ce as minValue,ue as nativeEnum,S as not,de as number,pe as numeric,$ as oneOf,ee as or,me as regex,he as required,ge as requiredIf,_e as requiredUnless,ve as sameAs,ye as startsWith,be as string,h as toDate,b as toNumber,xe as type,Ce as url,c as withAsync,o as withMessage,l as withParams,s as withTooltip};
1
+ import{InternalRuleType as e,createRule as t,unwrapRuleParameters as n}from"@regle/core";import{computed as r,toValue as i,unref as a}from"vue";function o(n,r){let i,a,o,s,c=!1;typeof n==`function`&&!(`_validator`in n)?(i=e.Inline,a=n):{_type:i,validator:a,_active:o,_params:s,_async:c}=n;let l=t({type:i,validator:a,active:o,message:r,async:c}),u=[...s??[]];if(l._params=u,l._message_patched=!0,typeof l==`function`){if(s!=null){let e=l(...u);return e._message_patched=!0,e}return l}else return l}function s(n,r){let i,a,o,s,c,l=!1;typeof n==`function`&&!(`_validator`in n)?(i=e.Inline,a=n):{_type:i,validator:a,_active:o,_params:s,_message:c,_async:l}=n;let u=t({type:i,validator:a,active:o,message:c,tooltip:r,async:l}),d=[...s??[]];if(u._params=d,u._tooltip_patched=!0,typeof u==`function`){let e=u(...d);return u._tooltip_patched=!0,e}else return u}function c(n,r){let i,a,o=[],s=``;typeof n==`function`?(a=async(e,...t)=>n(e,...t),o=[r]):({_type:i,_message:s}=n,o=o=n._params?.concat(r),a=async(...e)=>n.validator(e));let c=t({type:i??e.Async,validator:a,message:s,async:!0});return c._params=c._params?.concat(o),c(...r??[])}function l(n,r){let i,a,o=[],s=``;typeof n==`function`?(e.Inline,a=(e,...t)=>n(e,...t),o=[r]):({_type:i,validator:a,_message:s}=n,o=o=n._params?.concat(r));let c=t({type:e.Inline,validator:a,message:s});return c._params=c._params?.concat(o),c(...r)}function u(r,i){let a,o,s=[],c=``;typeof i==`function`?(a=e.Inline,o=i,s=[r]):({_type:a,validator:o,_message:c}=i,s=i._params?.concat([r]));function l(e,...t){let[i]=n([r]);return i?o(e,...t):!0}function u(){let[e]=n([r]);return e}let d=t({type:a,validator:l,active:u,message:c}),f=[...s??[]];return d._params=f,typeof d==`function`?d(...f):d}function d(e){return e?.constructor?.name==`File`}function f(e,t=!0){return e==null?!0:e instanceof Date?isNaN(e.getTime()):d(e)?e.size<=0:Array.isArray(e)?t?e.length===0:!1:typeof e==`object`&&e?Object.keys(e).length===0:!String(e).length}function p(e){return e&&(e instanceof Date||e.constructor.name==`File`||e.constructor.name==`FileList`)?!1:typeof e==`object`&&!!e&&!Array.isArray(e)}function m(e){if(f(e))return!1;try{let t=null;if(e instanceof Date)t=e;else if(typeof e==`string`){let n=new Date(e);if(n.toString()===`Invalid Date`)return!1;t=n}return!!t}catch{return!1}}function h(e){let t=Object.prototype.toString.call(e);return e==null?new Date(NaN):e instanceof Date||typeof e==`object`&&t===`[object Date]`?new Date(e.getTime()):typeof e==`number`||t===`[object Number]`||typeof e==`string`||t===`[object String]`?new Date(e):new Date(NaN)}function g(e,t=!0){return!f(typeof e==`string`?e.trim():e,t)}function _(e){return e==null?!1:typeof e==`number`?!isNaN(e):!1}function v(e,...t){if(f(e))return!0;let n=typeof e==`number`?e.toString():e;return t.every(e=>(e.lastIndex=0,e.test(n)))}function y(e){let t=a(e);return Array.isArray(t)?t.length:typeof t==`object`?Object.keys(t).length:typeof t==`number`?isNaN(t)?0:t:String(t).length}function b(e){return typeof e==`number`?e:e==null?NaN:typeof e==`string`&&e.trim()===e?+e:NaN}function x(...e){let n=e.some(e=>typeof e==`function`?e.constructor.name===`AsyncFunction`:e._async),r=e.map(e=>{if(typeof e==`function`)return null;{let t=e._params;return t?.length?t:[]}}).flat().filter(e=>!!e);function i(e,t,...n){let r=[],i=0;for(let a of e)if(typeof a==`function`)r.push(a(t)),i++;else{let e=a._params?.length??0;r.push(a.validator(t,...n.slice(i,e))),e&&(i+=e)}return r}function a(e){return e?.some(e=>typeof e!=`boolean`)?{$valid:e.every(e=>typeof e==`boolean`?!!e:e.$valid),...e.reduce((e,t)=>{if(typeof t==`boolean`)return e;let{$valid:n,...r}=t;return{...e,...r}},{})}:e.every(e=>!!e)}let o;o=e.length?n?async(t,...n)=>a(await Promise.all(i(e,t,...n))):(t,...n)=>a(i(e,t,...n)):e=>!1;let s=t({type:`and`,validator:o,message:`The value does not match all of the provided validators`}),c=[...r??[]];return s._params=c,typeof s==`function`?s(...c):s}function ee(...e){let n=e.some(e=>typeof e==`function`?e.constructor.name===`AsyncFunction`:e._async),r=e.map(e=>typeof e==`function`?null:e._params).flat().filter(e=>!!e);function i(e,t,...n){let r=[],i=0;for(let a of e)if(typeof a==`function`)r.push(a(t)),i++;else{let e=a._params?.length??0;r.push(a.validator(t,...n.slice(i,e))),e&&(i+=e)}return r}function a(e){return e.some(e=>typeof e!=`boolean`)?{$valid:e.some(e=>typeof e==`boolean`?!!e:e.$valid),...e.reduce((e,t)=>{if(typeof t==`boolean`)return e;let{$valid:n,...r}=t;return{...e,...r}},{})}:e.some(e=>!!e)}let o=t({type:`or`,validator:n?async(t,...n)=>a(await Promise.all(i(e,t,...n))):(t,...n)=>a(i(e,t,...n)),message:`The value does not match any of the provided validators`}),s=[...r??[]];return o._params=s,typeof o==`function`?o(...s):o}function S(e,n){let r,i,a,o,s;typeof e==`function`?(i=e,s=e.constructor.name===`AsyncFunction`):({_type:r,validator:i,_params:o}=e,s=e._async),a=s?async(e,...t)=>g(e)?!await i(e,...t):!0:(e,...t)=>g(e)?!i(e,...t):!0;let c=t({type:`not`,validator:a,message:n??`Error`}),l=[...o??[]];return c._params=l,typeof c==`function`?c(...l):c}function C(e,t,n){return Object.entries(i(t)).map(([t,r])=>typeof r==`function`||p(r)&&`_validator`in r?[t,u(n?e:()=>!i(e),r)]:[t,r])}function w(e,t,n){return r(()=>{let r=C(e,t,!0),i=n?C(e,n,!1):[];return Object.fromEntries([...r,...i])})}const T=/^[a-zA-Z]*$/,E=/^[\w.]+$/,D=t({type:`alpha`,validator(e,t){return f(e)?!0:t?.allowSymbols?v(e,E):v(e,T)},message:`The value is not alphabetical`}),O=/^[a-zA-Z0-9]*$/,k=/^[a-zA-Z0-9_]*$/,A=t({type:`alphaNum`,validator(e,t){return f(e)?!0:t?.allowSymbols?v(e,k):v(e,O)},message:`The value must be alpha-numeric`}),j=t({type:`between`,validator:(e,t,n,r)=>{let{allowEqual:i=!0}=r??{};if(g(e)&&g(t)&&g(n)){let r=b(e),a=b(t),o=b(n);return _(r)&&_(a)&&_(o)?i?r>=a&&r<=o:r>a&&r<o:(console.warn(`[between] Value or parameters aren't numbers, got value: ${e}, min: ${t}, max: ${n}`),!1)}return!0},message:({$params:[e,t]})=>`The value must be between ${e} and ${t}`}),M=t({type:`boolean`,validator:e=>g(e)?typeof e==`boolean`:!0,message:`The value must be a native boolean`}),N=t({type:`checked`,validator:e=>g(e)?e===!0:!0,message:`The field must be checked`}),P=t({type:`contains`,validator(e,t){return g(e)&&g(t)?e.includes(t):!0},message({$params:[e]}){return`The value must contain ${e}`}}),F=t({type:`date`,validator:e=>g(e)?e instanceof Date:!0,message:`The value must be a native Date`});function I(){return navigator.languages==null?navigator.language:navigator.languages[0]}function L(e){return e?new Intl.DateTimeFormat(I(),{dateStyle:`short`}).format(new Date(e)):`?`}const R=t({type:`dateAfter`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?m(e)&&m(t)?(r?h(e).getTime()>=h(t).getTime():h(e).getTime()>h(t).getTime())?!0:{$valid:!1,error:`date-not-after`}:{$valid:!1,error:`value-or-parameter-not-a-date`}:!0},message:({$params:[e],error:t})=>t===`value-or-parameter-not-a-date`?`The values must be dates`:`The date must be after ${L(e)}`}),z=t({type:`dateBefore`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?m(e)&&m(t)?(r?h(e).getTime()<=h(t).getTime():h(e).getTime()<h(t).getTime())?!0:{$valid:!1,error:`date-not-before`}:{$valid:!1,error:`value-or-parameter-not-a-date`}:!0},message:({$params:[e],error:t})=>t===`value-or-parameter-not-a-date`?`The values must be dates`:`The date must be before ${L(e)}`}),B=t({type:`dateBetween`,validator:(e,t,n,r)=>{let{allowEqual:i=!0}=r??{};return m(e)&&m(t)&&m(n)?i?h(e).getTime()>=h(t).getTime()&&h(e).getTime()<=h(n).getTime():h(e).getTime()>h(t).getTime()&&h(e).getTime()<h(n).getTime():!0},message:({$params:[e,t]})=>`The date must be between ${L(e)} and ${L(t)}`}),V=/^[-]?\d*(\.\d+)?$/,H=t({type:`decimal`,validator(e){return f(e)?!0:v(e,V)},message:`The value must be decimal`}),U=/^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i,W=t({type:`email`,validator(e){return f(e)?!0:v(e,U)},message:`The value must be an valid email address`}),G=t({type:`endsWith`,validator(e,t){return g(e)&&g(t)?e.endsWith(t):!0},message({$params:[e]}){return`The value must end with ${e}`}}),K=t({type:`exactLength`,validator:(e,t)=>g(e,!1)&&g(t)?_(t)?y(e)===t:(console.warn(`[minLength] Parameter isn't a number, got parameter: ${t}`),!1):!0,message:({$params:[e]})=>`The value should be exactly ${e} characters long`}),q=t({type:`exactValue`,validator:(e,t)=>g(e)&&g(t)?_(t)&&!isNaN(b(e))?b(e)===t:(console.warn(`[exactValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!0):!0,message:({$params:[e]})=>`The value must be equal to ${e}`}),J=/^[a-fA-F0-9]*$/,Y=t({type:`hexadecimal`,validator(e){return f(e)?!0:v(e,J)},message:`The value must be hexadecimal`}),te=/(^[0-9]*$)|(^-[0-9]+$)/,X=t({type:`integer`,validator(e){return f(e)?!0:v(e,te)},message:`The value must be an integer`});function Z(e){if(e.length>3||e.length===0||e[0]===`0`&&e!==`0`||!e.match(/^\d+$/))return!1;let t=e|0;return t>=0&&t<=255}const Q=t({type:`ipv4Address`,validator(e){if(f(e))return!0;if(typeof e!=`string`)return!1;let t=e.split(`.`);return t.length===4&&t.every(Z)},message:`The value is not a valid IPv4 address`});function ne(e){return o(l((e,t)=>g(e)&&g(t)?t===e:!0,[r(()=>i(e))]),({$params:[e]})=>`Value should be ${e}.`)}const re=t({type:`macAddress`,validator(e,t=`:`){if(f(e))return!0;if(typeof e!=`string`)return!1;let n=typeof t==`string`&&t!==``?e.split(t):e.length===12||e.length===16?e.match(/.{2}/g):null;return n!==null&&(n.length===6||n.length===8)&&n.every(ie)},message:`The value is not a valid MAC Address`}),ie=e=>e.toLowerCase().match(/^[0-9a-f]{2}$/),ae=t({type:`maxLength`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e,!1)&&g(t)?_(t)?r?y(e)<=t:y(e)<t:(console.warn(`[maxLength] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0},message:({$value:e,$params:[t]})=>Array.isArray(e)?`This list should have maximum ${t} items`:`The value length should not exceed ${t}`}),oe=t({type:`maxValue`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?!isNaN(b(e))&&!isNaN(b(t))?r?b(e)<=b(t):b(e)<b(t):(console.warn(`[maxValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0},message:({$params:[e,t]})=>{let{allowEqual:n=!0}=t??{};return n?`The value must be less than or equal to ${e}`:`The value must be less than ${e}`}}),se=t({type:`minLength`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e,!1)&&g(t)?_(t)?r?y(e)>=t:y(e)>t:(console.warn(`[minLength] Parameter isn't a number, got parameter: ${t}`),!1):!0},message:({$value:e,$params:[t]})=>Array.isArray(e)?`The list should have at least ${t} items`:`The value length should be at least ${t}`}),ce=t({type:`minValue`,validator:(e,t,n)=>{let{allowEqual:r=!0}=n??{};return g(e)&&g(t)?!isNaN(b(e))&&!isNaN(b(t))?r?b(e)>=b(t):b(e)>b(t):(console.warn(`[minValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0},message:({$params:[e,t]})=>{let{allowEqual:n=!0}=t??{};return n?`The value must be greater than or equal to ${e}`:`The value must be greater than ${e}`}});function le(e){let t=Object.keys(e).filter(t=>typeof e[e[t]]!=`number`),n={};for(let r of t)n[r]=e[r];return Object.values(n)}function ue(e){return o(l((e,t)=>g(e)&&!f(t)?le(t).includes(e):!0,[r(()=>i(e))]),({$params:[e]})=>`The value should be one of those options: ${Object.values(e).join(`, `)}.`)}const de=t({type:`number`,validator:e=>g(e)?_(e):!0,message:`The value must be a native number`}),fe=/^\d*(\.\d+)?$/,pe=t({type:`numeric`,validator(e){return f(e)?!0:v(e,fe)},message:`The value must be numeric`}),me=t({type:`oneOf`,validator(e,t){return g(e)&&g(t,!1)?t.includes(e):!0},message:({$params:[e]})=>`The value should be one of those options: ${e.join(`, `)}.`}),he=t({type:`regex`,validator(e,t){return g(e)?v(e,...Array.isArray(t)?t:[t]):!0},message:`The value does not match the required pattern`}),ge=t({type:`required`,validator:e=>g(e),message:`This field is required`}),_e=t({type:`required`,validator(e,t){return t?g(e):!0},message:`This field is required`,active({$params:[e]}){return e}}),ve=t({type:`required`,validator(e,t){return t?!0:g(e)},message:`This field is required`,active({$params:[e]}){return!e}}),ye=t({type:`sameAs`,validator(e,t,n){return f(e)?!0:e===t},message({$params:[e,t=`other`]}){return`The value must be equal to the ${t} value`}}),be=t({type:`startsWith`,validator(e,t){return g(e)&&g(t)?e.startsWith(t):!0},message({$params:[e]}){return`The value must start with ${e}`}}),$=t({type:`string`,validator:e=>g(e)?typeof e==`string`:!0,message:`The value must be a string`});function xe(){return(()=>!0)}const Se=/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i,Ce=t({type:`url`,validator(e){return f(e)?!0:v(e,Se)},message:`The value is not a valid URL address`}),we=t({type:`file`,validator:e=>g(e)?d(e):!0,message:`The value must be a native File`}),Te=t({type:`fileType`,validator:(e,t)=>g(e)?d(e)?t.includes(e.type):!1:!0,message({$params:[e]}){return`File type is not allowed. Allowed types are: ${e.map(e=>e.split(`/`)[1]).join(`, `)}.`}});export{D as alpha,A as alphaNum,x as and,u as applyIf,w as assignIf,j as between,M as boolean,N as checked,P as contains,F as date,R as dateAfter,z as dateBefore,B as dateBetween,H as decimal,W as email,G as endsWith,K as exactLength,q as exactValue,we as file,Te as fileType,y as getSize,Y as hexadecimal,X as integer,Q as ipv4Address,m as isDate,f as isEmpty,g as isFilled,_ as isNumber,ne as literal,re as macAddress,v as matchRegex,ae as maxLength,oe as maxValue,se as minLength,ce as minValue,ue as nativeEnum,S as not,de as number,pe as numeric,me as oneOf,ee as or,he as regex,ge as required,_e as requiredIf,ve as requiredUnless,ye as sameAs,be as startsWith,$ as string,h as toDate,b as toNumber,xe as type,Ce as url,c as withAsync,o as withMessage,l as withParams,s as withTooltip};
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@regle/rules",
3
- "version": "1.14.7",
3
+ "version": "1.15.0",
4
4
  "description": "Collection of rules and helpers for Regle",
5
5
  "dependencies": {
6
6
  "type-fest": "5.2.0",
7
- "@regle/core": "1.14.7"
7
+ "@regle/core": "1.15.0"
8
8
  },
9
9
  "devDependencies": {
10
10
  "@types/node": "22.19.1",