@sanity/validation 3.0.0-dev-preview.20 → 3.0.0-dev-preview.22
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/lib/dts/src/index.d.ts +36 -13
- package/lib/index.esm.js +1259 -0
- package/lib/index.esm.js.map +1 -0
- package/lib/index.js +1253 -1310
- package/lib/index.js.map +1 -1
- package/package.json +23 -18
- package/src/index.ts +3 -1
- package/src/util/requestIdleCallback.ts +31 -0
- package/src/validateDocument.test.ts +0 -80
- package/src/validateDocument.ts +84 -45
- package/src/validators/slugValidator.ts +16 -2
- package/lib/dts/src/Rule.d.ts +0 -4
- package/lib/dts/src/Rule.d.ts.map +0 -1
- package/lib/dts/src/Rule.js +0 -336
- package/lib/dts/src/Rule.js.map +0 -1
- package/lib/dts/src/ValidationError.d.ts +0 -4
- package/lib/dts/src/ValidationError.d.ts.map +0 -1
- package/lib/dts/src/ValidationError.js +0 -18
- package/lib/dts/src/ValidationError.js.map +0 -1
- package/lib/dts/src/index.d.ts.map +0 -1
- package/lib/dts/src/index.js +0 -7
- package/lib/dts/src/index.js.map +0 -1
- package/lib/dts/src/inferFromSchema.d.ts +0 -4
- package/lib/dts/src/inferFromSchema.d.ts.map +0 -1
- package/lib/dts/src/inferFromSchema.js +0 -14
- package/lib/dts/src/inferFromSchema.js.map +0 -1
- package/lib/dts/src/inferFromSchemaType.d.ts +0 -5
- package/lib/dts/src/inferFromSchemaType.d.ts.map +0 -1
- package/lib/dts/src/inferFromSchemaType.js +0 -33
- package/lib/dts/src/inferFromSchemaType.js.map +0 -1
- package/lib/dts/src/util/convertToValidationMarker.d.ts +0 -6
- package/lib/dts/src/util/convertToValidationMarker.d.ts.map +0 -1
- package/lib/dts/src/util/convertToValidationMarker.js +0 -51
- package/lib/dts/src/util/convertToValidationMarker.js.map +0 -1
- package/lib/dts/src/util/deepEquals.d.ts +0 -6
- package/lib/dts/src/util/deepEquals.d.ts.map +0 -1
- package/lib/dts/src/util/deepEquals.js +0 -65
- package/lib/dts/src/util/deepEquals.js.map +0 -1
- package/lib/dts/src/util/escapeRegex.d.ts +0 -3
- package/lib/dts/src/util/escapeRegex.d.ts.map +0 -1
- package/lib/dts/src/util/escapeRegex.js +0 -6
- package/lib/dts/src/util/escapeRegex.js.map +0 -1
- package/lib/dts/src/util/normalizeValidationRules.d.ts +0 -6
- package/lib/dts/src/util/normalizeValidationRules.d.ts.map +0 -1
- package/lib/dts/src/util/normalizeValidationRules.js +0 -104
- package/lib/dts/src/util/normalizeValidationRules.js.map +0 -1
- package/lib/dts/src/util/normalizeValidationRules.test.d.ts +0 -2
- package/lib/dts/src/util/normalizeValidationRules.test.d.ts.map +0 -1
- package/lib/dts/src/util/normalizeValidationRules.test.js +0 -150
- package/lib/dts/src/util/normalizeValidationRules.test.js.map +0 -1
- package/lib/dts/src/util/pathToString.d.ts +0 -3
- package/lib/dts/src/util/pathToString.d.ts.map +0 -1
- package/lib/dts/src/util/pathToString.js +0 -18
- package/lib/dts/src/util/pathToString.js.map +0 -1
- package/lib/dts/src/util/typeString.d.ts +0 -2
- package/lib/dts/src/util/typeString.d.ts.map +0 -1
- package/lib/dts/src/util/typeString.js +0 -23
- package/lib/dts/src/util/typeString.js.map +0 -1
- package/lib/dts/src/util/typeString.test.d.ts +0 -2
- package/lib/dts/src/util/typeString.test.d.ts.map +0 -1
- package/lib/dts/src/util/typeString.test.js +0 -24
- package/lib/dts/src/util/typeString.test.js.map +0 -1
- package/lib/dts/src/validateDocument.d.ts +0 -25
- package/lib/dts/src/validateDocument.d.ts.map +0 -1
- package/lib/dts/src/validateDocument.js +0 -165
- package/lib/dts/src/validateDocument.js.map +0 -1
- package/lib/dts/src/validateDocument.test.d.ts +0 -2
- package/lib/dts/src/validateDocument.test.d.ts.map +0 -1
- package/lib/dts/src/validateDocument.test.js +0 -717
- package/lib/dts/src/validateDocument.test.js.map +0 -1
- package/lib/dts/src/validators/arrayValidator.d.ts +0 -4
- package/lib/dts/src/validators/arrayValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/arrayValidator.js +0 -79
- package/lib/dts/src/validators/arrayValidator.js.map +0 -1
- package/lib/dts/src/validators/booleanValidator.d.ts +0 -4
- package/lib/dts/src/validators/booleanValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/booleanValidator.js +0 -12
- package/lib/dts/src/validators/booleanValidator.js.map +0 -1
- package/lib/dts/src/validators/dateValidator.d.ts +0 -5
- package/lib/dts/src/validators/dateValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/dateValidator.js +0 -83
- package/lib/dts/src/validators/dateValidator.js.map +0 -1
- package/lib/dts/src/validators/genericValidator.d.ts +0 -4
- package/lib/dts/src/validators/genericValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/genericValidator.js +0 -93
- package/lib/dts/src/validators/genericValidator.js.map +0 -1
- package/lib/dts/src/validators/numberValidator.d.ts +0 -4
- package/lib/dts/src/validators/numberValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/numberValidator.js +0 -47
- package/lib/dts/src/validators/numberValidator.js.map +0 -1
- package/lib/dts/src/validators/objectValidator.d.ts +0 -4
- package/lib/dts/src/validators/objectValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/objectValidator.js +0 -48
- package/lib/dts/src/validators/objectValidator.js.map +0 -1
- package/lib/dts/src/validators/slugValidator.d.ts +0 -9
- package/lib/dts/src/validators/slugValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/slugValidator.js +0 -83
- package/lib/dts/src/validators/slugValidator.js.map +0 -1
- package/lib/dts/src/validators/stringValidator.d.ts +0 -4
- package/lib/dts/src/validators/stringValidator.d.ts.map +0 -1
- package/lib/dts/src/validators/stringValidator.js +0 -94
- package/lib/dts/src/validators/stringValidator.js.map +0 -1
- package/lib/dts/test/array.test.d.ts +0 -2
- package/lib/dts/test/array.test.d.ts.map +0 -1
- package/lib/dts/test/array.test.js +0 -55
- package/lib/dts/test/array.test.js.map +0 -1
- package/lib/dts/test/children.test.d.ts +0 -2
- package/lib/dts/test/children.test.d.ts.map +0 -1
- package/lib/dts/test/children.test.js +0 -70
- package/lib/dts/test/children.test.js.map +0 -1
- package/lib/dts/test/createSchema.d.ts +0 -6
- package/lib/dts/test/createSchema.d.ts.map +0 -1
- package/lib/dts/test/createSchema.js +0 -19
- package/lib/dts/test/createSchema.js.map +0 -1
- package/lib/dts/test/generics.test.d.ts +0 -2
- package/lib/dts/test/generics.test.d.ts.map +0 -1
- package/lib/dts/test/generics.test.js +0 -60
- package/lib/dts/test/generics.test.js.map +0 -1
- package/lib/dts/test/infer.test.d.ts +0 -2
- package/lib/dts/test/infer.test.d.ts.map +0 -1
- package/lib/dts/test/infer.test.js +0 -244
- package/lib/dts/test/infer.test.js.map +0 -1
- package/lib/dts/test/mocks/mockSanityClient.d.ts +0 -6
- package/lib/dts/test/mocks/mockSanityClient.d.ts.map +0 -1
- package/lib/dts/test/mocks/mockSanityClient.js +0 -8
- package/lib/dts/test/mocks/mockSanityClient.js.map +0 -1
- package/lib/dts/test/nullExport.d.ts +0 -3
- package/lib/dts/test/nullExport.d.ts.map +0 -1
- package/lib/dts/test/nullExport.js +0 -4
- package/lib/dts/test/nullExport.js.map +0 -1
- package/lib/dts/test/numbers.test.d.ts +0 -2
- package/lib/dts/test/numbers.test.d.ts.map +0 -1
- package/lib/dts/test/numbers.test.js +0 -57
- package/lib/dts/test/numbers.test.js.map +0 -1
- package/lib/dts/test/strings.test.d.ts +0 -2
- package/lib/dts/test/strings.test.d.ts.map +0 -1
- package/lib/dts/test/strings.test.js +0 -100
- package/lib/dts/test/strings.test.js.map +0 -1
- package/lib/dts/tsconfig.lib.tsbuildinfo +0 -1
- package/lib/dts/tsconfig.tsbuildinfo +0 -1
- package/lib/index.cjs +0 -1341
- package/lib/index.cjs.map +0 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple requestIdleCallback polyfill
|
|
3
|
+
* Can be removed when all browsers support requestIdleCallback: https://caniuse.com/requestidlecallback
|
|
4
|
+
* @param callback
|
|
5
|
+
* @param options
|
|
6
|
+
*/
|
|
7
|
+
const requestIdleCallbackShim: typeof window.requestIdleCallback = function requestIdleCallbackShim(
|
|
8
|
+
callback,
|
|
9
|
+
options?
|
|
10
|
+
): number {
|
|
11
|
+
const start = Date.now()
|
|
12
|
+
return window.setTimeout(() => {
|
|
13
|
+
callback({
|
|
14
|
+
didTimeout: false,
|
|
15
|
+
timeRemaining() {
|
|
16
|
+
return Math.max(0, Date.now() - start)
|
|
17
|
+
},
|
|
18
|
+
})
|
|
19
|
+
}, 0)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const cancelIdleCallbackShim: typeof window.cancelIdleCallback = function cancelIdleCallbackShim(
|
|
23
|
+
handle: number
|
|
24
|
+
): void {
|
|
25
|
+
return window.clearTimeout(handle)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const win = typeof window === 'undefined' ? undefined : window
|
|
29
|
+
|
|
30
|
+
export const requestIdleCallback = win?.requestIdleCallback || requestIdleCallbackShim
|
|
31
|
+
export const cancelIdleCallback = win?.cancelIdleCallback || cancelIdleCallbackShim
|
|
@@ -698,84 +698,4 @@ describe('validateItem', () => {
|
|
|
698
698
|
},
|
|
699
699
|
])
|
|
700
700
|
})
|
|
701
|
-
|
|
702
|
-
it('runs all nested validation checks concurrently', async () => {
|
|
703
|
-
type Resolver = (value: true) => void
|
|
704
|
-
const resolvers = new Set<Resolver>()
|
|
705
|
-
const customValidationFn = () => new Promise<true>((resolve) => resolvers.add(resolve))
|
|
706
|
-
|
|
707
|
-
const schema: Schema = createSchema({
|
|
708
|
-
types: [
|
|
709
|
-
{
|
|
710
|
-
name: 'root',
|
|
711
|
-
type: 'object',
|
|
712
|
-
fields: [
|
|
713
|
-
{
|
|
714
|
-
name: 'level1Object',
|
|
715
|
-
type: 'object',
|
|
716
|
-
validation: (rule: Rule) => [
|
|
717
|
-
rule.custom(customValidationFn),
|
|
718
|
-
rule.fields({
|
|
719
|
-
level2String: (r) => r.custom(customValidationFn),
|
|
720
|
-
}),
|
|
721
|
-
],
|
|
722
|
-
fields: [
|
|
723
|
-
{
|
|
724
|
-
name: 'level2String',
|
|
725
|
-
type: 'string',
|
|
726
|
-
validation: (rule: Rule) => rule.custom(customValidationFn),
|
|
727
|
-
},
|
|
728
|
-
],
|
|
729
|
-
},
|
|
730
|
-
{
|
|
731
|
-
name: 'level1Array',
|
|
732
|
-
type: 'array',
|
|
733
|
-
validation: (rule: Rule) => rule.custom(customValidationFn),
|
|
734
|
-
of: [
|
|
735
|
-
{
|
|
736
|
-
type: 'object',
|
|
737
|
-
fields: [
|
|
738
|
-
{
|
|
739
|
-
name: 'level2Number',
|
|
740
|
-
type: 'number',
|
|
741
|
-
validation: (rule: Rule) => rule.custom(customValidationFn),
|
|
742
|
-
},
|
|
743
|
-
],
|
|
744
|
-
},
|
|
745
|
-
],
|
|
746
|
-
},
|
|
747
|
-
],
|
|
748
|
-
validation: (rule: Rule) => rule.custom(customValidationFn),
|
|
749
|
-
},
|
|
750
|
-
],
|
|
751
|
-
})
|
|
752
|
-
|
|
753
|
-
const value = {
|
|
754
|
-
level1Object: {level3String: 'a string'},
|
|
755
|
-
level1Array: [{level2Number: 5}],
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
const resultPromise = validateItem({
|
|
759
|
-
client,
|
|
760
|
-
getClient,
|
|
761
|
-
schema,
|
|
762
|
-
value,
|
|
763
|
-
document: undefined,
|
|
764
|
-
parent: undefined,
|
|
765
|
-
path: undefined,
|
|
766
|
-
type: schema.get('root'),
|
|
767
|
-
getDocumentExists: undefined,
|
|
768
|
-
})
|
|
769
|
-
|
|
770
|
-
// after `validateItem(...)` has been initiated, all of the custom
|
|
771
|
-
// validation calls should have fired so the resolver size should equal the
|
|
772
|
-
// amount of total fields
|
|
773
|
-
expect(resolvers.size).toBe(6)
|
|
774
|
-
|
|
775
|
-
for (const resolver of resolvers) {
|
|
776
|
-
resolver(true)
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
await resultPromise
|
|
780
|
-
})
|
|
781
701
|
})
|
package/src/validateDocument.ts
CHANGED
|
@@ -10,9 +10,12 @@ import {
|
|
|
10
10
|
isBlockSchemaType,
|
|
11
11
|
isSpanSchemaType,
|
|
12
12
|
} from '@sanity/types'
|
|
13
|
-
import {
|
|
13
|
+
import {concat, defer, merge, Observable, of} from 'rxjs'
|
|
14
|
+
import {catchError, map, mergeAll, mergeMap, toArray} from 'rxjs/operators'
|
|
15
|
+
import {flatten, uniqBy} from 'lodash'
|
|
14
16
|
import type {SanityClient} from '@sanity/client'
|
|
15
17
|
import typeString from './util/typeString'
|
|
18
|
+
import {cancelIdleCallback, requestIdleCallback} from './util/requestIdleCallback'
|
|
16
19
|
import ValidationErrorClass from './ValidationError'
|
|
17
20
|
import normalizeValidationRules from './util/normalizeValidationRules'
|
|
18
21
|
|
|
@@ -46,6 +49,7 @@ export function resolveTypeForArrayItem(
|
|
|
46
49
|
candidates.find((candidate) => candidate.name === 'object' && primitive === 'object')
|
|
47
50
|
)
|
|
48
51
|
}
|
|
52
|
+
const EMPTY_MARKERS: ValidationMarker[] = []
|
|
49
53
|
|
|
50
54
|
export default async function validateDocument(
|
|
51
55
|
getClient: (options: {apiVersion: string}) => SanityClient,
|
|
@@ -53,10 +57,19 @@ export default async function validateDocument(
|
|
|
53
57
|
schema: Schema,
|
|
54
58
|
context?: Pick<ValidationContext, 'getDocumentExists'>
|
|
55
59
|
): Promise<ValidationMarker[]> {
|
|
60
|
+
return validateDocumentObservable(getClient, doc, schema, context).toPromise()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function validateDocumentObservable(
|
|
64
|
+
getClient: (options: {apiVersion: string}) => SanityClient,
|
|
65
|
+
doc: SanityDocument,
|
|
66
|
+
schema: Schema,
|
|
67
|
+
context?: Pick<ValidationContext, 'getDocumentExists'>
|
|
68
|
+
): Observable<ValidationMarker[]> {
|
|
56
69
|
const documentType = schema.get(doc._type)
|
|
57
70
|
if (!documentType) {
|
|
58
71
|
console.warn('Schema type for object type "%s" not found, skipping validation', doc._type)
|
|
59
|
-
return
|
|
72
|
+
return of(EMPTY_MARKERS)
|
|
60
73
|
}
|
|
61
74
|
|
|
62
75
|
const client = getClient({apiVersion: '2021-06-07'})
|
|
@@ -95,18 +108,19 @@ export default async function validateDocument(
|
|
|
95
108
|
/* eslint-enable no-proto */
|
|
96
109
|
// </TEMPORARY UGLY HACK TO PRINT DEPRECATION WARNINGS ON USE>
|
|
97
110
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
return validateItemObservable(validationOptions).pipe(
|
|
112
|
+
catchError((err) => {
|
|
113
|
+
console.error(err)
|
|
114
|
+
return of([
|
|
115
|
+
{
|
|
116
|
+
type: 'validation' as const,
|
|
117
|
+
level: 'error' as const,
|
|
118
|
+
path: [],
|
|
119
|
+
item: new ValidationErrorClass(err?.message),
|
|
120
|
+
},
|
|
121
|
+
])
|
|
122
|
+
})
|
|
123
|
+
)
|
|
110
124
|
}
|
|
111
125
|
|
|
112
126
|
/**
|
|
@@ -124,27 +138,32 @@ type ValidateItemOptions = {
|
|
|
124
138
|
value: unknown
|
|
125
139
|
} & ExplicitUndefined<ValidationContext>
|
|
126
140
|
|
|
127
|
-
export
|
|
141
|
+
export function validateItem(opts: ValidateItemOptions): Promise<ValidationMarker[]> {
|
|
142
|
+
return validateItemObservable(opts).toPromise()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function validateItemObservable({
|
|
128
146
|
value,
|
|
129
147
|
type,
|
|
130
148
|
path = [],
|
|
131
149
|
parent,
|
|
132
150
|
...restOfContext
|
|
133
|
-
}: ValidateItemOptions):
|
|
151
|
+
}: ValidateItemOptions): Observable<ValidationMarker[]> {
|
|
134
152
|
const rules = normalizeValidationRules(type)
|
|
135
|
-
|
|
136
153
|
// run validation for the current value
|
|
137
154
|
const selfChecks = rules.map((rule) =>
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
155
|
+
defer(() =>
|
|
156
|
+
rule.validate(value, {
|
|
157
|
+
...restOfContext,
|
|
158
|
+
parent,
|
|
159
|
+
path,
|
|
160
|
+
type,
|
|
161
|
+
})
|
|
162
|
+
)
|
|
144
163
|
)
|
|
145
164
|
|
|
146
165
|
// run validation for nested values (conditionally)
|
|
147
|
-
let nestedChecks: Array<
|
|
166
|
+
let nestedChecks: Array<Observable<ValidationMarker[]>> = []
|
|
148
167
|
|
|
149
168
|
const selfIsRequired = rules.some((rule) => rule.isRequired())
|
|
150
169
|
const shouldRunNestedObjectValidation =
|
|
@@ -171,12 +190,14 @@ export async function validateItem({
|
|
|
171
190
|
const fieldType = fieldTypes[name]
|
|
172
191
|
return normalizeValidationRules({...fieldType, validation}).map((subRule) => {
|
|
173
192
|
const nestedValue = isRecord(value) ? value[name] : undefined
|
|
174
|
-
return
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
193
|
+
return defer(() =>
|
|
194
|
+
subRule.validate(nestedValue, {
|
|
195
|
+
...restOfContext,
|
|
196
|
+
parent: value,
|
|
197
|
+
path: path.concat(name),
|
|
198
|
+
type: fieldType,
|
|
199
|
+
})
|
|
200
|
+
)
|
|
180
201
|
})
|
|
181
202
|
})
|
|
182
203
|
)
|
|
@@ -184,7 +205,7 @@ export async function validateItem({
|
|
|
184
205
|
// Validation from each field's schema `validation: Rule => {/* ... */}` function
|
|
185
206
|
nestedChecks = nestedChecks.concat(
|
|
186
207
|
type.fields.map((field) =>
|
|
187
|
-
|
|
208
|
+
validateItemObservable({
|
|
188
209
|
...restOfContext,
|
|
189
210
|
parent: value,
|
|
190
211
|
value: isRecord(value) ? value[field.name] : undefined,
|
|
@@ -203,12 +224,12 @@ export async function validateItem({
|
|
|
203
224
|
|
|
204
225
|
if (shouldRunNestedValidationForArrays) {
|
|
205
226
|
nestedChecks = nestedChecks.concat(
|
|
206
|
-
value.map((item) =>
|
|
207
|
-
|
|
227
|
+
value.map((item, index) =>
|
|
228
|
+
validateItemObservable({
|
|
208
229
|
...restOfContext,
|
|
209
230
|
parent: value,
|
|
210
231
|
value: item,
|
|
211
|
-
path: path.concat(isKeyedObject(item) ? {_key: item._key} :
|
|
232
|
+
path: path.concat(isKeyedObject(item) ? {_key: item._key} : index),
|
|
212
233
|
type: resolveTypeForArrayItem(item, type.of),
|
|
213
234
|
})
|
|
214
235
|
)
|
|
@@ -225,16 +246,16 @@ export async function validateItem({
|
|
|
225
246
|
const spanType = spanChildrenField.type.of.find(isSpanSchemaType)
|
|
226
247
|
|
|
227
248
|
const annotations = (spanType?.annotations || []).reduce<Map<string, SchemaType>>(
|
|
228
|
-
(
|
|
229
|
-
|
|
230
|
-
return
|
|
249
|
+
(acc, annotationType) => {
|
|
250
|
+
acc.set(annotationType.name, annotationType)
|
|
251
|
+
return acc
|
|
231
252
|
},
|
|
232
253
|
new Map()
|
|
233
254
|
)
|
|
234
255
|
|
|
235
256
|
nestedChecks = nestedChecks.concat(
|
|
236
257
|
value.markDefs.map((markDef) =>
|
|
237
|
-
|
|
258
|
+
validateItemObservable({
|
|
238
259
|
...restOfContext,
|
|
239
260
|
parent: value,
|
|
240
261
|
value: markDef,
|
|
@@ -245,13 +266,31 @@ export async function validateItem({
|
|
|
245
266
|
)
|
|
246
267
|
}
|
|
247
268
|
|
|
248
|
-
|
|
269
|
+
return defer(() => merge([...selfChecks, ...nestedChecks])).pipe(
|
|
270
|
+
mergeMap((validateNode) => concat(idle(), validateNode), 40),
|
|
271
|
+
mergeAll(),
|
|
272
|
+
toArray(),
|
|
273
|
+
map(flatten),
|
|
274
|
+
map((results) => {
|
|
275
|
+
// run `uniqBy` if `_fieldRules` are present because they can
|
|
276
|
+
// cause repeat markers
|
|
277
|
+
if (rules.some((rule) => rule._fieldRules)) {
|
|
278
|
+
return uniqBy(results, (rule) => JSON.stringify(rule))
|
|
279
|
+
}
|
|
280
|
+
return results
|
|
281
|
+
})
|
|
282
|
+
)
|
|
283
|
+
}
|
|
249
284
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
285
|
+
function idle(timeout?: number): Observable<never> {
|
|
286
|
+
return new Observable<never>((observer) => {
|
|
287
|
+
const handle = requestIdleCallback(
|
|
288
|
+
() => {
|
|
289
|
+
observer.complete()
|
|
290
|
+
},
|
|
291
|
+
timeout ? {timeout} : undefined
|
|
292
|
+
)
|
|
255
293
|
|
|
256
|
-
|
|
294
|
+
return () => cancelIdleCallback(handle)
|
|
295
|
+
})
|
|
257
296
|
}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
SlugIsUniqueValidator,
|
|
3
|
+
Path,
|
|
4
|
+
CustomValidator,
|
|
5
|
+
isKeyedObject,
|
|
6
|
+
SlugValidationContext,
|
|
7
|
+
SlugParent,
|
|
8
|
+
SlugSchemaType,
|
|
9
|
+
} from '@sanity/types'
|
|
2
10
|
import {memoize} from 'lodash'
|
|
3
11
|
// import getClient from '../getClient'
|
|
4
12
|
|
|
@@ -94,7 +102,13 @@ export const slugValidator: CustomValidator = async (value, context) => {
|
|
|
94
102
|
const options = context?.type?.options as {isUnique?: SlugIsUniqueValidator} | undefined
|
|
95
103
|
const isUnique = options?.isUnique || defaultIsUnique
|
|
96
104
|
|
|
97
|
-
const
|
|
105
|
+
const slugContext: SlugValidationContext = {
|
|
106
|
+
...context,
|
|
107
|
+
parent: context.parent as SlugParent,
|
|
108
|
+
type: context.type as SlugSchemaType,
|
|
109
|
+
defaultIsUnique,
|
|
110
|
+
}
|
|
111
|
+
const wasUnique = await isUnique(slugValue, slugContext)
|
|
98
112
|
if (wasUnique) {
|
|
99
113
|
return true
|
|
100
114
|
}
|
package/lib/dts/src/Rule.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Rule.d.ts","sourceRoot":"","sources":["../../../src/Rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAUV,MAAM,eAAe,CAAA;AA0DtB,QAAA,MAAM,IAAI,EAAE,SAsWX,CAAA;AAED,eAAe,IAAI,CAAA"}
|