@regle/schemas 1.12.2 → 1.13.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.
package/dist/regle-schemas.d.ts
CHANGED
|
@@ -30,8 +30,8 @@ type RegleSingleFieldSchema<TState extends Maybe<PrimitiveTypes>, TSchema extend
|
|
|
30
30
|
type RegleSchemaResult<TSchema extends unknown> = {
|
|
31
31
|
valid: false;
|
|
32
32
|
data: PartialDeep<TSchema>;
|
|
33
|
-
issues: RegleIssuesTree<TSchema>;
|
|
34
|
-
errors: RegleErrorTree<TSchema>;
|
|
33
|
+
issues: RegleIssuesTree<TSchema, true>;
|
|
34
|
+
errors: RegleErrorTree<TSchema, false, true>;
|
|
35
35
|
} | {
|
|
36
36
|
valid: true;
|
|
37
37
|
data: TSchema;
|
|
@@ -48,13 +48,13 @@ type RegleSchemaStatus<TState extends Record<string, any> | undefined = Record<s
|
|
|
48
48
|
/** Collection of all issues, collected for all children properties and nested forms.
|
|
49
49
|
*
|
|
50
50
|
* Only contains errors from properties where $dirty equals true. */
|
|
51
|
-
readonly $issues: RegleIssuesTree<TState>;
|
|
51
|
+
readonly $issues: RegleIssuesTree<TState, true>;
|
|
52
52
|
/** Collection of all the error messages, collected for all children properties and nested forms.
|
|
53
53
|
*
|
|
54
54
|
* Only contains errors from properties where $dirty equals true. */
|
|
55
|
-
readonly $errors: RegleErrorTree<TState>;
|
|
55
|
+
readonly $errors: RegleErrorTree<TState, false, true>;
|
|
56
56
|
/** Collection of all the error messages, collected for all children properties. */
|
|
57
|
-
readonly $silentErrors: RegleErrorTree<TState>;
|
|
57
|
+
readonly $silentErrors: RegleErrorTree<TState, false, true>;
|
|
58
58
|
/** Will return a copy of your state with only the fields that are dirty. By default it will filter out nullish values or objects, but you can override it with the first parameter $extractDirtyFields(false). */
|
|
59
59
|
$extractDirtyFields: (filterNullishValues?: boolean) => PartialDeep<TState>;
|
|
60
60
|
} & ProcessNestedFields<TState, TShortcuts> & (IsRoot extends true ? {
|
|
@@ -64,7 +64,7 @@ type RegleSchemaStatus<TState extends Record<string, any> | undefined = Record<s
|
|
|
64
64
|
/**
|
|
65
65
|
* @public
|
|
66
66
|
*/
|
|
67
|
-
type InferRegleSchemaStatusType<TState extends unknown, TShortcuts extends RegleShortcutDefinition = {}> = NonNullable<TState> extends Array<
|
|
67
|
+
type InferRegleSchemaStatusType<TState extends unknown, TShortcuts extends RegleShortcutDefinition = {}> = NonNullable<TState> extends Array<any> ? RegleSchemaCollectionStatus<NonNullable<TState>, TShortcuts> : NonNullable<TState> extends Date | File ? RegleSchemaFieldStatus<TState, TShortcuts> : unknown extends TState ? RegleSchemaFieldStatus<TState extends EmptyObject ? unknown : TState, TShortcuts> : NonNullable<TState> extends Record<string, any> ? NonNullable<NonNullable<TState>> extends RegleStaticImpl<infer U> ? RegleSchemaFieldStatus<Raw<U>, TShortcuts> : MaybeSchemaVariantStatus<NonNullable<TState> extends Record<string, any> ? NonNullable<TState> : {}, StandardSchemaV1, TShortcuts> : RegleSchemaFieldStatus<TState, TShortcuts>;
|
|
68
68
|
/**
|
|
69
69
|
* @public
|
|
70
70
|
*/
|
package/dist/regle-schemas.js
CHANGED
|
@@ -82,7 +82,10 @@ function setObjectError(obj, propsArg, value, isArray) {
|
|
|
82
82
|
}
|
|
83
83
|
if (isArray) if (!obj[lastProp]) obj[lastProp] = { $self: value };
|
|
84
84
|
else obj[lastProp].$self = (obj[lastProp].$self ??= []).concat(value);
|
|
85
|
-
else if (
|
|
85
|
+
else if (!isNaN(parseInt(lastProp))) {
|
|
86
|
+
if (obj.$each == void 0) obj.$each = [];
|
|
87
|
+
obj.$each[lastProp] = (obj.$each[lastProp] ??= []).concat(value);
|
|
88
|
+
} else if (Array.isArray(obj[lastProp])) obj[lastProp] = obj[lastProp].concat(value);
|
|
86
89
|
else obj[lastProp] = value;
|
|
87
90
|
return true;
|
|
88
91
|
}
|
|
@@ -145,27 +148,70 @@ function createUseRegleSchemaComposable(options, shortcuts) {
|
|
|
145
148
|
const customErrors = ref({});
|
|
146
149
|
const previousIssues = ref([]);
|
|
147
150
|
let onValidate = void 0;
|
|
151
|
+
function getPropertiesFromIssue(issue) {
|
|
152
|
+
let $path = getIssuePath(issue);
|
|
153
|
+
const lastItem = issue.path?.[issue.path.length - 1];
|
|
154
|
+
const lastItemKey = typeof lastItem === "object" ? lastItem.key : lastItem;
|
|
155
|
+
return {
|
|
156
|
+
isArray: (typeof lastItem === "object" && "value" in lastItem ? Array.isArray(lastItem.value) : false) || ("type" in issue ? issue.type === "array" : false) || Array.isArray(getDotPath(processedState.value, $path)),
|
|
157
|
+
$path,
|
|
158
|
+
lastItemKey,
|
|
159
|
+
lastItem
|
|
160
|
+
};
|
|
161
|
+
}
|
|
148
162
|
function getIssuePath(issue) {
|
|
149
163
|
return issue.path?.map((item) => typeof item === "object" ? item.key : item.toString()).join(".") ?? "";
|
|
150
164
|
}
|
|
165
|
+
function getParentArrayPath(issue) {
|
|
166
|
+
const lastItem = issue.path?.at(-1);
|
|
167
|
+
const isNestedPath = typeof lastItem === "object" ? typeof lastItem.key === "string" : typeof lastItem === "string";
|
|
168
|
+
const index = issue.path?.findLastIndex((item) => typeof item === "object" ? typeof item.key === "number" : typeof item === "number");
|
|
169
|
+
if (!isNestedPath && index === -1) return;
|
|
170
|
+
if (index != null) {
|
|
171
|
+
const truncatedPath = issue.path?.slice(0, index + 1);
|
|
172
|
+
return {
|
|
173
|
+
...issue,
|
|
174
|
+
path: truncatedPath
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
151
178
|
if (!computedSchema.value?.["~standard"]) throw new Error(`Only "standard-schema" compatible libraries are supported`);
|
|
152
179
|
function filterIssues(issues, isValidate = false) {
|
|
153
180
|
if (!isValidate && resolvedOptions.rewardEarly) {
|
|
154
|
-
if (previousIssues.value.length) return previousIssues.value.
|
|
181
|
+
if (previousIssues.value.length) return previousIssues.value.reduce((acc, issue) => {
|
|
182
|
+
if ("$currentArrayValue" in issue && isObject(issue.$currentArrayValue) && "$id" in issue.$currentArrayValue) {
|
|
183
|
+
let itemId = issue.$currentArrayValue.$id;
|
|
184
|
+
const previousArrayIssue = issues.find((i) => i?.$currentArrayValue?.["$id"] === itemId);
|
|
185
|
+
if (previousArrayIssue) acc.push({
|
|
186
|
+
...issue,
|
|
187
|
+
path: previousArrayIssue?.path ?? []
|
|
188
|
+
});
|
|
189
|
+
} else if (issues.some((i) => getIssuePath(i) === getIssuePath(issue))) acc.push(issue);
|
|
190
|
+
return acc;
|
|
191
|
+
}, []);
|
|
155
192
|
return [];
|
|
156
193
|
}
|
|
157
194
|
return issues;
|
|
158
195
|
}
|
|
159
196
|
function issuesToRegleErrors(result, isValidate = false) {
|
|
160
197
|
const output = {};
|
|
161
|
-
|
|
162
|
-
|
|
198
|
+
const mappedIssues = result.issues?.map((issue) => {
|
|
199
|
+
const parentArrayPath = getParentArrayPath(issue);
|
|
200
|
+
if (parentArrayPath) {
|
|
201
|
+
const $currentArrayValue = getDotPath(processedState.value, getIssuePath(parentArrayPath));
|
|
202
|
+
Object.defineProperty(issue, "$currentArrayValue", {
|
|
203
|
+
value: $currentArrayValue,
|
|
204
|
+
enumerable: true,
|
|
205
|
+
configurable: true,
|
|
206
|
+
writable: true
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return issue;
|
|
210
|
+
});
|
|
211
|
+
const filteredIssues = filterIssues(mappedIssues ?? [], isValidate);
|
|
212
|
+
if (mappedIssues?.length) {
|
|
163
213
|
const issues = filteredIssues.map((issue) => {
|
|
164
|
-
let $path =
|
|
165
|
-
const lastItem = issue.path?.[issue.path.length - 1];
|
|
166
|
-
const lastItemKey = typeof lastItem === "object" ? lastItem.key : lastItem;
|
|
167
|
-
const isArray = (typeof lastItem === "object" && "value" in lastItem ? Array.isArray(lastItem.value) : false) || ("type" in issue ? issue.type === "array" : false) || Array.isArray(getDotPath(processedState.value, $path));
|
|
168
|
-
if (!isArray && typeof lastItemKey === "number") $path = issue.path?.slice(0, issue.path.length - 1)?.map((item) => typeof item === "object" ? item.key : item.toString()).join(".") ?? "";
|
|
214
|
+
let { isArray, $path, lastItemKey } = getPropertiesFromIssue(issue);
|
|
169
215
|
return {
|
|
170
216
|
...issue,
|
|
171
217
|
$path,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createScopedUseRegle as e,useRootStorage as t}from"@regle/core";import{computed as n,getCurrentScope as r,isRef as i,onScopeDispose as a,ref as o,unref as s,watch as c}from"vue";function l(e){return e?.constructor?.name==`File`||e?.constructor?.name==`FileList`}function u(e,t=!0){return e==null?!0:e instanceof Date?isNaN(e.getTime()):l(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 d(e){if(typeof e.source.flags==`string`)return e.source.flags;{let t=[];return e.global&&t.push(`g`),e.ignoreCase&&t.push(`i`),e.multiline&&t.push(`m`),e.sticky&&t.push(`y`),e.unicode&&t.push(`u`),t.join(``)}}function f(e,t=0){if(t>20)return e;let n=e,r={}.toString.call(e).slice(8,-1);if(r==`Set`&&(n=new Set([...e].map(e=>f(e,t++)))),r==`Map`&&(n=new Map([...e].map(e=>[f(e[0]),f(e[1])]))),r==`Date`&&(n=new Date(e.getTime())),r==`RegExp`&&(n=RegExp(e.source,d(e))),r==`Array`||r==`Object`)for(let r in n=Array.isArray(e)?[]:{},e)n[r]=f(e[r],t++);return n}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,t,n,r){var i,a;if(Array.isArray(t)&&(i=t.slice(0)),typeof t==`string`&&(i=t.split(`.`)),typeof t==`symbol`&&(i=[t]),!Array.isArray(i))throw Error(`props arg must be an array, a string or a symbol`);if(a=i.pop(),!a)return!1;g(a);for(var o;o=i.shift();)if(g(o),isNaN(parseInt(o))?(e[o]===void 0&&(e[o]={}),e=e[o]):(e.$each??=[],u(e.$each[o])&&(e.$each[o]={}),e=e.$each[o]),!e||typeof e!=`object`)return!1;return r?e[a]?e[a].$self=(e[a].$self??=[]).concat(n):e[a]={$self:n}:Array.isArray(e[a])?e[a]=e[a].concat(n):e[a]=n,!0}function h(e,t,n){if(!e)return n;var r,i;if(Array.isArray(t)&&(r=t.slice(0)),typeof t==`string`&&(r=t.split(`.`)),typeof t==`symbol`&&(r=[t]),!Array.isArray(r))throw Error(`props arg must be an array, a string or a symbol`);for(;r.length;)if(i=r.shift(),!e||!i||(e=e[i],e===void 0))return n;return e}function g(e){if(e==`__proto__`||e==`constructor`||e==`prototype`)throw Error(`setting of prototype values not supported`)}function _(e,...t){for(var n=[].slice.call(arguments),r,i=n.length;r=n[i-1],i--;)if(!r||typeof r!=`object`&&typeof r!=`function`)throw Error(`expected object, got `+r);for(var a=n[0],o=n.slice(1),s=o.length,i=0;i<s;i++){var c=o[i];for(var l in c)a[l]=c[l]}return a}function v(e,l){let u={autoDirty:e?.autoDirty,lazy:e?.lazy,rewardEarly:e?.rewardEarly,clearExternalErrorsOnChange:e?.clearExternalErrorsOnChange};function d(e,d,g){let v=n(()=>s(d)),{syncState:y={onUpdate:!1,onValidate:!1},...b}=g??{},{onUpdate:x=!1,onValidate:S=!1}=y,C={...u,...b},w=n(()=>!p(T.value)),T=i(e)?e:o(e),E=o(p(T.value)?{...f(T.value)}:f(T.value)),D=p(T.value)?{...f(T.value)}:f(T.value),O=o({}),k=o([]),A;function j(e){return e.path?.map(e=>typeof e==`object`?e.key:e.toString()).join(`.`)??``}if(!v.value?.[`~standard`])throw Error(`Only "standard-schema" compatible libraries are supported`);function
|
|
1
|
+
import{createScopedUseRegle as e,useRootStorage as t}from"@regle/core";import{computed as n,getCurrentScope as r,isRef as i,onScopeDispose as a,ref as o,unref as s,watch as c}from"vue";function l(e){return e?.constructor?.name==`File`||e?.constructor?.name==`FileList`}function u(e,t=!0){return e==null?!0:e instanceof Date?isNaN(e.getTime()):l(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 d(e){if(typeof e.source.flags==`string`)return e.source.flags;{let t=[];return e.global&&t.push(`g`),e.ignoreCase&&t.push(`i`),e.multiline&&t.push(`m`),e.sticky&&t.push(`y`),e.unicode&&t.push(`u`),t.join(``)}}function f(e,t=0){if(t>20)return e;let n=e,r={}.toString.call(e).slice(8,-1);if(r==`Set`&&(n=new Set([...e].map(e=>f(e,t++)))),r==`Map`&&(n=new Map([...e].map(e=>[f(e[0]),f(e[1])]))),r==`Date`&&(n=new Date(e.getTime())),r==`RegExp`&&(n=RegExp(e.source,d(e))),r==`Array`||r==`Object`)for(let r in n=Array.isArray(e)?[]:{},e)n[r]=f(e[r],t++);return n}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,t,n,r){var i,a;if(Array.isArray(t)&&(i=t.slice(0)),typeof t==`string`&&(i=t.split(`.`)),typeof t==`symbol`&&(i=[t]),!Array.isArray(i))throw Error(`props arg must be an array, a string or a symbol`);if(a=i.pop(),!a)return!1;g(a);for(var o;o=i.shift();)if(g(o),isNaN(parseInt(o))?(e[o]===void 0&&(e[o]={}),e=e[o]):(e.$each??=[],u(e.$each[o])&&(e.$each[o]={}),e=e.$each[o]),!e||typeof e!=`object`)return!1;return r?e[a]?e[a].$self=(e[a].$self??=[]).concat(n):e[a]={$self:n}:isNaN(parseInt(a))?Array.isArray(e[a])?e[a]=e[a].concat(n):e[a]=n:(e.$each??=[],e.$each[a]=(e.$each[a]??=[]).concat(n)),!0}function h(e,t,n){if(!e)return n;var r,i;if(Array.isArray(t)&&(r=t.slice(0)),typeof t==`string`&&(r=t.split(`.`)),typeof t==`symbol`&&(r=[t]),!Array.isArray(r))throw Error(`props arg must be an array, a string or a symbol`);for(;r.length;)if(i=r.shift(),!e||!i||(e=e[i],e===void 0))return n;return e}function g(e){if(e==`__proto__`||e==`constructor`||e==`prototype`)throw Error(`setting of prototype values not supported`)}function _(e,...t){for(var n=[].slice.call(arguments),r,i=n.length;r=n[i-1],i--;)if(!r||typeof r!=`object`&&typeof r!=`function`)throw Error(`expected object, got `+r);for(var a=n[0],o=n.slice(1),s=o.length,i=0;i<s;i++){var c=o[i];for(var l in c)a[l]=c[l]}return a}function v(e,l){let u={autoDirty:e?.autoDirty,lazy:e?.lazy,rewardEarly:e?.rewardEarly,clearExternalErrorsOnChange:e?.clearExternalErrorsOnChange};function d(e,d,g){let v=n(()=>s(d)),{syncState:y={onUpdate:!1,onValidate:!1},...b}=g??{},{onUpdate:x=!1,onValidate:S=!1}=y,C={...u,...b},w=n(()=>!p(T.value)),T=i(e)?e:o(e),E=o(p(T.value)?{...f(T.value)}:f(T.value)),D=p(T.value)?{...f(T.value)}:f(T.value),O=o({}),k=o([]),A;function j(e){let t=M(e),n=e.path?.[e.path.length-1],r=typeof n==`object`?n.key:n;return{isArray:(typeof n==`object`&&`value`in n?Array.isArray(n.value):!1)||(`type`in e?e.type===`array`:!1)||Array.isArray(h(T.value,t)),$path:t,lastItemKey:r,lastItem:n}}function M(e){return e.path?.map(e=>typeof e==`object`?e.key:e.toString()).join(`.`)??``}function N(e){let t=e.path?.at(-1),n=typeof t==`object`?typeof t.key==`string`:typeof t==`string`,r=e.path?.findLastIndex(e=>typeof e==`object`?typeof e.key==`number`:typeof e==`number`);if(!(!n&&r===-1)&&r!=null){let t=e.path?.slice(0,r+1);return{...e,path:t}}}if(!v.value?.[`~standard`])throw Error(`Only "standard-schema" compatible libraries are supported`);function P(e,t=!1){return!t&&C.rewardEarly?k.value.length?k.value.reduce((t,n)=>{if(`$currentArrayValue`in n&&p(n.$currentArrayValue)&&`$id`in n.$currentArrayValue){let r=n.$currentArrayValue.$id,i=e.find(e=>e?.$currentArrayValue?.$id===r);i&&t.push({...n,path:i?.path??[]})}else e.some(e=>M(e)===M(n))&&t.push(n);return t},[]):[]:e}function F(e,t=!1){let n={},r=e.issues?.map(e=>{let t=N(e);if(t){let n=h(T.value,M(t));Object.defineProperty(e,`$currentArrayValue`,{value:n,enumerable:!0,configurable:!0,writable:!0})}return e}),i=P(r??[],t);if(r?.length){let e=i.map(e=>{let{isArray:t,$path:n,lastItemKey:r}=j(e);return{...e,$path:n,isArray:t,$property:r,$rule:`schema`,$message:e.message}});e.forEach(({isArray:e,$path:t,...r})=>{m(n,t,[r],e)}),k.value=e}else k.value=[];return n}async function I(e=!1){let t=v.value[`~standard`].validate(T.value);return t instanceof Promise&&(t=await t),w.value?O.value=P(t.issues??[],e)?.map(e=>({$message:e.message,$property:e.path?.[e.path.length-1]?.toString()??`-`,$rule:`schema`,...e}))??[]:O.value=F(t,e),t.issues||(e&&S||!e&&x)&&(L?.(),p(T.value)?T.value=_(T.value,t.value):T.value=t.value,R()),t}let L;function R(){L=c([T,v],()=>{C.silent||I()},{deep:!0})}R(),I(),A=async()=>{try{let e=await I(!0);return z?.regle?.$touch(),{valid:!e.issues?.length,data:T.value,errors:z?.regle?.$errors,issues:O.value}}catch(e){return Promise.reject(e)}},r()&&a(()=>{L()});let z=t({scopeRules:n(()=>({})),state:T,options:C,schemaErrors:O,initialState:E,originalState:D,shortcuts:l,schemaMode:!0,onValidate:A});return{r$:z.regle}}return d}const y=v();function b(e,t){return e}function x(){function e(e,t){return t}return e}const S=x();function C({modifiers:e,shortcuts:t}){return{useRegleSchema:v(e,t),inferSchema:x()}}const{useCollectScope:w,useScopedRegle:T}=e({customUseRegle:y}),E=t=>{let{customStore:n,customUseRegle:r=y,asRecord:i=!1}=t??{};return e({customStore:n,customUseRegle:r,asRecord:i})};export{E as createScopedUseRegleSchema,C as defineRegleSchemaConfig,S as inferSchema,w as useCollectSchemaScope,y as useRegleSchema,T as useScopedRegleSchema,b as withDeps};
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@regle/schemas",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.0",
|
|
4
4
|
"description": "Schemas adapter for Regle",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@standard-schema/spec": "1.0.0",
|
|
7
7
|
"type-fest": "5.2.0",
|
|
8
|
-
"@regle/
|
|
9
|
-
"@regle/
|
|
8
|
+
"@regle/rules": "1.13.0",
|
|
9
|
+
"@regle/core": "1.13.0"
|
|
10
10
|
},
|
|
11
11
|
"peerDependencies": {
|
|
12
12
|
"valibot": "^1.0.0",
|