Просмотр исходного кода

feat(core): Implement null filters on PaginatedList queries

Closes #1490
Michael Bromley 3 лет назад
Родитель
Сommit
3906cbf0d7

+ 5 - 0
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -307,6 +307,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Returned if an attempting to cancel lines from an Order which is still active */
@@ -1366,6 +1367,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1807,6 +1809,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type ImportInfo = {
@@ -3434,6 +3437,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -5194,6 +5198,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 5 - 0
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -296,6 +296,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Returned if an attempting to cancel lines from an Order which is still active */
@@ -1319,6 +1320,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1740,6 +1742,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type ImportInfo = {
@@ -3286,6 +3289,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -4980,6 +4984,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 5 - 0
packages/common/src/generated-shop-types.ts

@@ -128,6 +128,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type Channel = Node & {
@@ -804,6 +805,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1121,6 +1123,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /**
@@ -1836,6 +1839,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -2998,6 +3002,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 5 - 0
packages/common/src/generated-types.ts

@@ -306,6 +306,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Returned if an attempting to cancel lines from an Order which is still active */
@@ -1358,6 +1359,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1799,6 +1801,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type ImportInfo = {
@@ -3370,6 +3373,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -5126,6 +5130,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 35 - 0
packages/core/e2e/fixtures/test-plugins/list-query-plugin.ts

@@ -91,6 +91,21 @@ export class TestEntity extends VendureEntity implements Translatable {
     @OneToOne(type => Order)
     @JoinColumn()
     orderRelation: Order;
+
+    @Column({ nullable: true })
+    nullableString: string;
+
+    @Column({ nullable: true })
+    nullableBoolean: boolean;
+
+    @Column({ nullable: true })
+    nullableNumber: number;
+
+    @Column('varchar', { nullable: true })
+    nullableId: ID;
+
+    @Column({ nullable: true })
+    nullableDate: Date;
 }
 
 @Entity()
@@ -193,6 +208,11 @@ const apiExtensions = gql`
         ownerId: ID!
         translations: [TestEntityTranslation!]!
         orderRelation: Order
+        nullableString: String
+        nullableBoolean: Boolean
+        nullableNumber: Int
+        nullableId: ID
+        nullableDate: DateTime
     }
 
     type TestEntityList implements PaginatedList {
@@ -247,6 +267,11 @@ export class ListQueryPlugin implements OnApplicationBootstrap {
                     active: true,
                     order: 0,
                     ownerId: 10,
+                    nullableString: 'lorem',
+                    nullableBoolean: true,
+                    nullableNumber: 42,
+                    nullableId: 123,
+                    nullableDate: new Date('2022-01-05T10:00:00.000Z'),
                 }),
                 new TestEntity({
                     label: 'B',
@@ -263,6 +288,11 @@ export class ListQueryPlugin implements OnApplicationBootstrap {
                     active: false,
                     order: 2,
                     ownerId: 12,
+                    nullableString: 'lorem',
+                    nullableBoolean: true,
+                    nullableNumber: 42,
+                    nullableId: 123,
+                    nullableDate: new Date('2022-01-05T10:00:00.000Z'),
                 }),
                 new TestEntity({
                     label: 'D',
@@ -279,6 +309,11 @@ export class ListQueryPlugin implements OnApplicationBootstrap {
                     active: false,
                     order: 4,
                     ownerId: 14,
+                    nullableString: 'lorem',
+                    nullableBoolean: true,
+                    nullableNumber: 42,
+                    nullableId: 123,
+                    nullableDate: new Date('2022-01-05T10:00:00.000Z'),
                 }),
                 new TestEntity({
                     label: 'F',

+ 5 - 0
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -296,6 +296,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Returned if an attempting to cancel lines from an Order which is still active */
@@ -1319,6 +1320,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1740,6 +1742,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type ImportInfo = {
@@ -3286,6 +3289,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -4980,6 +4984,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 5 - 0
packages/core/e2e/graphql/generated-e2e-shop-types.ts

@@ -121,6 +121,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type Channel = Node & {
@@ -775,6 +776,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1077,6 +1079,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /**
@@ -1777,6 +1780,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -2890,6 +2894,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 140 - 0
packages/core/e2e/list-query-builder.e2e-spec.ts

@@ -248,6 +248,34 @@ describe('ListQueryBuilder', () => {
             expect(getItemLabels(testEntities.items)).toEqual(['B', 'D', 'E', 'F']);
         });
 
+        it('isNull true', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableString: {
+                            isNull: true,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['B', 'D', 'F']);
+        });
+
+        it('isNull false', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableString: {
+                            isNull: false,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['A', 'C', 'E']);
+        });
+
         describe('regex', () => {
             it('simple substring', async () => {
                 const { testEntities } = await adminClient.query(GET_LIST, {
@@ -378,6 +406,34 @@ describe('ListQueryBuilder', () => {
             expect(getItemLabels(testEntities.items)).toEqual(['B', 'C', 'D', 'E']);
         });
 
+        it('isNull true', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableId: {
+                            isNull: true,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['B', 'D', 'F']);
+        });
+
+        it('isNull false', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableId: {
+                            isNull: false,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['A', 'C', 'E']);
+        });
+
         describe('regex', () => {
             it('simple substring', async () => {
                 const { testEntities } = await adminClient.query(GET_LIST, {
@@ -465,6 +521,34 @@ describe('ListQueryBuilder', () => {
 
             expect(getItemLabels(testEntities.items)).toEqual(['C', 'E', 'F']);
         });
+
+        it('isNull true', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableBoolean: {
+                            isNull: true,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['B', 'D', 'F']);
+        });
+
+        it('isNull false', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableBoolean: {
+                            isNull: false,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['A', 'C', 'E']);
+        });
     });
 
     describe('number filtering', () => {
@@ -554,6 +638,34 @@ describe('ListQueryBuilder', () => {
 
             expect(getItemLabels(testEntities.items)).toEqual(['C', 'D', 'E']);
         });
+
+        it('isNull true', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableNumber: {
+                            isNull: true,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['B', 'D', 'F']);
+        });
+
+        it('isNull false', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableNumber: {
+                            isNull: false,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['A', 'C', 'E']);
+        });
     });
 
     describe('date filtering', () => {
@@ -629,6 +741,34 @@ describe('ListQueryBuilder', () => {
 
             expect(getItemLabels(testEntities.items)).toEqual(['B']);
         });
+
+        it('isNull true', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableDate: {
+                            isNull: true,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['B', 'D', 'F']);
+        });
+
+        it('isNull false', async () => {
+            const { testEntities } = await adminClient.query(GET_LIST, {
+                options: {
+                    filter: {
+                        nullableDate: {
+                            isNull: false,
+                        },
+                    },
+                },
+            });
+
+            expect(getItemLabels(testEntities.items)).toEqual(['A', 'C', 'E']);
+        });
     });
 
     describe('multiple filters with filterOperator', () => {

+ 5 - 0
packages/core/src/api/schema/common/common-types.graphql

@@ -82,6 +82,7 @@ input StringOperators {
     in: [String!]
     notIn: [String!]
     regex: String
+    isNull: Boolean
 }
 
 "Operators for filtering on an ID field"
@@ -90,11 +91,13 @@ input IDOperators {
     notEq: String
     in: [String!]
     notIn: [String!]
+    isNull: Boolean
 }
 
 "Operators for filtering on a Boolean field"
 input BooleanOperators {
     eq: Boolean
+    isNull: Boolean
 }
 
 input NumberRange {
@@ -110,6 +113,7 @@ input NumberOperators {
     gt: Float
     gte: Float
     between: NumberRange
+    isNull: Boolean
 }
 
 input DateRange {
@@ -123,6 +127,7 @@ input DateOperators {
     before: DateTime
     after: DateTime
     between: DateRange
+    isNull: Boolean
 }
 
 "Operators for filtering on a list of String fields"

+ 4 - 0
packages/core/src/common/types/common-types.ts

@@ -115,10 +115,12 @@ export interface StringOperators {
     in?: string[];
     notIn?: string[];
     regex?: string;
+    isNull?: boolean;
 }
 
 export interface BooleanOperators {
     eq?: boolean;
+    isNull?: boolean;
 }
 
 export interface NumberRange {
@@ -133,6 +135,7 @@ export interface NumberOperators {
     gt?: number;
     gte?: number;
     between?: NumberRange;
+    isNull?: boolean;
 }
 
 export interface DateRange {
@@ -145,6 +148,7 @@ export interface DateOperators {
     before?: Date;
     after?: Date;
     between?: DateRange;
+    isNull?: boolean;
 }
 
 export interface ListOperators {

+ 5 - 0
packages/core/src/service/helpers/list-query-builder/parse-filter-params.ts

@@ -160,6 +160,11 @@ function buildWhereCondition(
                     [`arg${argIndex}_b`]: convertDate(operand.end),
                 },
             };
+        case 'isNull':
+            return {
+                clause: operand === true ? `${fieldName} IS NULL` : `${fieldName} IS NOT NULL`,
+                parameters: {},
+            };
         default:
             assertNever(operator);
     }

+ 5 - 0
packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts

@@ -296,6 +296,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Returned if an attempting to cancel lines from an Order which is still active */
@@ -1319,6 +1320,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1740,6 +1742,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type ImportInfo = {
@@ -3286,6 +3289,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -4980,6 +4984,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 5 - 0
packages/payments-plugin/e2e/graphql/generated-admin-types.ts

@@ -296,6 +296,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Returned if an attempting to cancel lines from an Order which is still active */
@@ -1319,6 +1320,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1740,6 +1742,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type ImportInfo = {
@@ -3286,6 +3289,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -4980,6 +4984,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 5 - 0
packages/payments-plugin/e2e/graphql/generated-shop-types.ts

@@ -121,6 +121,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type Channel = Node & {
@@ -775,6 +776,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1077,6 +1079,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /**
@@ -1777,6 +1780,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -2890,6 +2894,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

+ 5 - 0
packages/payments-plugin/src/mollie/graphql/generated-shop-types.ts

@@ -128,6 +128,7 @@ export type BooleanListOperators = {
 /** Operators for filtering on a Boolean field */
 export type BooleanOperators = {
   eq?: Maybe<Scalars['Boolean']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type Channel = Node & {
@@ -804,6 +805,7 @@ export type DateOperators = {
   before?: Maybe<Scalars['DateTime']>;
   after?: Maybe<Scalars['DateTime']>;
   between?: Maybe<DateRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type DateRange = {
@@ -1121,6 +1123,7 @@ export type IdOperators = {
   notEq?: Maybe<Scalars['String']>;
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /**
@@ -1887,6 +1890,7 @@ export type NumberOperators = {
   gt?: Maybe<Scalars['Float']>;
   gte?: Maybe<Scalars['Float']>;
   between?: Maybe<NumberRange>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 export type NumberRange = {
@@ -3055,6 +3059,7 @@ export type StringOperators = {
   in?: Maybe<Array<Scalars['String']>>;
   notIn?: Maybe<Array<Scalars['String']>>;
   regex?: Maybe<Scalars['String']>;
+  isNull?: Maybe<Scalars['Boolean']>;
 };
 
 /** Indicates that an operation succeeded, where we do not want to return any more specific information. */

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
schema-admin.json


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
schema-shop.json


Некоторые файлы не были показаны из-за большого количества измененных файлов