Skip to content

Commit

Permalink
feat: add all query parameter (#1791)
Browse files Browse the repository at this point in the history
  • Loading branch information
veu committed Mar 22, 2023
1 parent b672ce5 commit 150af8e
Show file tree
Hide file tree
Showing 13 changed files with 67 additions and 4 deletions.
2 changes: 2 additions & 0 deletions lib/types/query/query.ts
Expand Up @@ -18,6 +18,7 @@ import {
EntryOrderFilterWithFields,
TagOrderFilter,
} from './order'
import { SetFilter } from './set'

type FixedPagedOptions = {
skip?: number
Expand Down Expand Up @@ -57,6 +58,7 @@ export type EntryFieldsQueries<Fields extends FieldsType> =
| InequalityFilter<Fields, 'fields'>
| FullTextSearchFilters<Fields, 'fields'>
| SubsetFilters<Fields, 'fields'>
| SetFilter<Fields, 'fields'>
| LocationSearchFilters<Fields, 'fields'>
| RangeFilters<Fields, 'fields'>
| ReferenceSearchFilters<Fields, 'fields'>
Expand Down
15 changes: 15 additions & 0 deletions lib/types/query/set.ts
@@ -0,0 +1,15 @@
import { EntryFields } from '..'
import { ConditionalListQueries } from './util'

type SupportedTypes = EntryFields.Symbol | EntryFields.Symbol[] | EntryFields.Text | undefined

/**
* @desc match multiple values
* @see [documentation]{@link https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters/array-with-multiple-values}
*/
export type SetFilter<Fields, Prefix extends string> = ConditionalListQueries<
Fields,
SupportedTypes,
Prefix,
`[all]`
>
3 changes: 0 additions & 3 deletions lib/types/query/subset.ts
Expand Up @@ -16,9 +16,6 @@ type SupportedTypes =
* @desc inclusion & exclusion
* @see [inclusion documentation]{@link https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters/inclusion}
* @see [exclusion documentation]{@link https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters/exclusion}
* @example
* // {'fields.myField', 'singleValue'}
* // {'fields.myField', 'firstValue,secondValue'}
*/
export type SubsetFilters<Fields, Prefix extends string> = ConditionalListQueries<
Fields,
Expand Down
14 changes: 13 additions & 1 deletion test/types/queries/entry-queries.test-d.ts
Expand Up @@ -5,9 +5,21 @@ import * as mocks from '../mocks'

// all operator

expectAssignable<EntriesQueries<{ numberField: number; stringArrayField: string[] }>>({
expectAssignable<EntriesQueries<{ stringField: string; stringArrayField: string[] }>>({
'metadata.tags.sys.id[all]': mocks.stringArrayValue,
})
expectNotAssignable<EntriesQueries<{ stringField: string; stringArrayField: string[] }>>({
'fields.stringField[all]': mocks.anyValue,
})
expectAssignable<EntriesQueries<{ stringField: string; stringArrayField: string[] }>>({
content_type: 'id',
'fields.stringField[all]': mocks.stringArrayValue,
'fields.stringArrayField[all]': mocks.stringArrayValue,
})
expectNotAssignable<EntriesQueries<{ stringField: string; stringArrayField: string[] }>>({
content_type: 'id',
'fields.unknownField[all]': mocks.anyValue,
})

// equality

Expand Down
3 changes: 3 additions & 0 deletions test/types/query-types/boolean.test-d.ts
Expand Up @@ -10,6 +10,9 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

expectAssignable<Required<SetFilter<{ testField: EntryFields.Boolean }, 'fields'>>>({})

expectAssignable<EqualityFilter<{ testField: EntryFields.Boolean }, 'fields'>>({})
expectType<Required<EqualityFilter<{ testField: EntryFields.Boolean }, 'fields'>>>({
Expand Down
7 changes: 7 additions & 0 deletions test/types/query-types/date.test-d.ts
Expand Up @@ -10,6 +10,13 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

// we can’t tell dates from text fields so the [all] operator is included here
expectAssignable<SetFilter<{ testField: EntryFields.Symbol }, 'fields'>>({})
expectType<Required<SetFilter<{ testField: EntryFields.Symbol }, 'fields'>>>({
'fields.testField[all]': mocks.stringArrayValue,
})

expectAssignable<EqualityFilter<{ testField: EntryFields.Date }, 'fields'>>({})
expectType<Required<EqualityFilter<{ testField: EntryFields.Date }, 'fields'>>>({
Expand Down
3 changes: 3 additions & 0 deletions test/types/query-types/integer.test-d.ts
Expand Up @@ -10,6 +10,9 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

expectAssignable<Required<SetFilter<{ testField: EntryFields.Integer }, 'fields'>>>({})

expectAssignable<EqualityFilter<{ testField: EntryFields.Integer }, 'fields'>>({})
expectType<Required<EqualityFilter<{ testField: EntryFields.Integer }, 'fields'>>>({
Expand Down
3 changes: 3 additions & 0 deletions test/types/query-types/location.test-d.ts
Expand Up @@ -10,6 +10,9 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

expectAssignable<Required<SetFilter<{ testField: EntryFields.Location }, 'fields'>>>({})

expectAssignable<Required<EqualityFilter<{ testField: EntryFields.Location }, 'fields'>>>({})

Expand Down
3 changes: 3 additions & 0 deletions test/types/query-types/number.test-d.ts
Expand Up @@ -10,6 +10,9 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

expectAssignable<Required<SetFilter<{ testField: EntryFields.Number }, 'fields'>>>({})

expectAssignable<EqualityFilter<{ testField: EntryFields.Number }, 'fields'>>({})
expectType<Required<EqualityFilter<{ testField: EntryFields.Number }, 'fields'>>>({
Expand Down
3 changes: 3 additions & 0 deletions test/types/query-types/object.test-d.ts
Expand Up @@ -8,9 +8,12 @@ import { FullTextSearchFilters } from '../../../lib/types/query/search'
import { EntrySelectFilterWithFields } from '../../../lib/types/query/select'
import { SubsetFilters } from '../../../lib/types/query/subset'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'
// @ts-ignore
import * as mocks from '../mocks'

expectAssignable<Required<SetFilter<{ testField: EntryFields.Object }, 'fields'>>>({})

expectAssignable<Required<EqualityFilter<{ testField: EntryFields.Object }, 'fields'>>>({})

expectAssignable<Required<InequalityFilter<{ testField: EntryFields.Object }, 'fields'>>>({})
Expand Down
3 changes: 3 additions & 0 deletions test/types/query-types/richtext.test-d.ts
Expand Up @@ -10,6 +10,9 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

expectAssignable<Required<SetFilter<{ testField: EntryFields.RichText }, 'fields'>>>({})

expectAssignable<Required<EqualityFilter<{ testField: EntryFields.RichText }, 'fields'>>>({})

Expand Down
6 changes: 6 additions & 0 deletions test/types/query-types/symbol.test-d.ts
Expand Up @@ -10,6 +10,12 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

expectAssignable<SetFilter<{ testField: EntryFields.Symbol }, 'fields'>>({})
expectType<Required<SetFilter<{ testField: EntryFields.Symbol }, 'fields'>>>({
'fields.testField[all]': mocks.stringArrayValue,
})

expectAssignable<EqualityFilter<{ testField: EntryFields.Symbol }, 'fields'>>({})
expectType<Required<EqualityFilter<{ testField: EntryFields.Symbol }, 'fields'>>>({
Expand Down
6 changes: 6 additions & 0 deletions test/types/query-types/text.test-d.ts
Expand Up @@ -10,6 +10,12 @@ import { SubsetFilters } from '../../../lib/types/query/subset'
// @ts-ignore
import * as mocks from '../mocks'
import { EntryOrderFilterWithFields } from '../../../lib/types/query/order'
import { SetFilter } from '../../../lib/types/query/set'

expectAssignable<SetFilter<{ testField: EntryFields.Text }, 'fields'>>({})
expectType<Required<SetFilter<{ testField: EntryFields.Text }, 'fields'>>>({
'fields.testField[all]': mocks.stringArrayValue,
})

expectAssignable<EqualityFilter<{ testField: EntryFields.Text }, 'fields'>>({})
expectType<Required<EqualityFilter<{ testField: EntryFields.Text }, 'fields'>>>({
Expand Down

0 comments on commit 150af8e

Please sign in to comment.