Skip to content

Commit 9f5a445

Browse files
Remove enableRegex (#3097)
* docs: remove mentions of enableRegex * feat: remove enableRegex from config * docs: add migration guide section about enableRegex * docs: add changeset --------- Co-authored-by: Darrell Warde <[email protected]>
1 parent 051c197 commit 9f5a445

File tree

9 files changed

+41
-69
lines changed

9 files changed

+41
-69
lines changed

.changeset/wicked-ties-burn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@neo4j/graphql": major
3+
---
4+
5+
`enableRegex` has been removed and replaced with `MATCHES` filters in the features configuration object. See the migration guide for more information: https://neo4j.com/docs/graphql-manual/current/guides/v4-migration

docs/modules/ROOT/pages/api-reference/neo4jgraphql.adoc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ Accepts all of the options from https://www.graphql-tools.com/docs/generate-sche
5656
Type: xref::api-reference/neo4jgraphql.adoc#api-reference-neo4jgraphql-input-neo4jgraphqlconfig-driverconfig[`DriverConfig`]
5757
|Additional driver configuration options.
5858

59-
|`enableRegex` +
60-
+
61-
Type: `boolean`
62-
|Whether to enable RegEx filters, see xref::filtering.adoc#filtering-regex[RegEx matching] for more information.
63-
6459
|`queryOptions` +
6560
+
6661
Type: xref::api-reference/neo4jgraphql.adoc#api-reference-neo4jgraphql-input-neo4jgraphqlconfig-cypherqueryoptions[`CypherQueryOptions`]

docs/modules/ROOT/pages/filtering.adoc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,6 @@ const features = {
127127
const neoSchema = new Neo4jGraphQL({ features, typeDefs, driver });
128128
----
129129

130-
131-
Previously to enable to this filter the config option `enableRegex` was used, it has been deprecated. Use the `features` configuration object as described here, as the `enableRegex` will be removed in the future.
132-
133130
> The nature of RegEx matching means that on an unprotected API, this could potentially be used to execute a ReDoS attack (https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS) against the backing Neo4j database.
134131

135132
=== Array comparison

docs/modules/ROOT/pages/guides/v4-migration/index.adoc

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,29 @@ npm update @neo4j/graphql
1919
If you were passing any arguments from https://the-guild.dev/graphql/tools/docs/api/interfaces/schema_src.iexecutableschemadefinition[`IExecutableSchemaDefinition`] into the library
2020
other than `typeDefs` and `resolvers`, these are no longer supported.
2121

22+
=== config.enableRegex replaced by `MATCHES` in features.filters
23+
24+
`config.enableRegex` has been replaced by `MATCHES` in features.filters. With this change comes more granularity in the feature configuration. You can now enable the `MATCHES` filter on `String` and `ID` fields separately.
25+
26+
A direct replacement of the `enableRegex: true` configuration would be as follows:
27+
28+
[source, javascript, indent=0]
29+
----
30+
neoSchema = new Neo4jGraphQL({
31+
typeDefs,
32+
features: {
33+
filters: {
34+
String: {
35+
MATCHES: true,
36+
},
37+
ID: {
38+
MATCHES: true,
39+
},
40+
},
41+
},
42+
});
43+
----
44+
2245
== Updated Directives
2346

2447
We have renamed a number of directives and their arguments, in order to make using `@neo4j/graphql` more intuitive.
@@ -577,7 +600,6 @@ const neoSchema = new Neo4jGraphQL({
577600
});
578601
----
579602

580-
581603
== Miscellaneous changes
582604

583605
[[startup-validation]]

packages/graphql/src/classes/Neo4jGraphQL.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,6 @@ import { validateDocument } from "../schema/validation";
5454

5555
export interface Neo4jGraphQLConfig {
5656
driverConfig?: DriverConfig;
57-
/**
58-
* @deprecated This argument has been deprecated and will be removed in v4.0.0.
59-
* Please use features.filters instead. More information can be found at
60-
* https://neo4j.com/docs/graphql-manual/current/guides/v4-migration/#features
61-
*/
62-
enableRegex?: boolean;
6357
enableDebug?: boolean;
6458
/**
6559
* @deprecated This argument has been deprecated and will be removed in v4.0.0.
@@ -334,7 +328,6 @@ class Neo4jGraphQL {
334328

335329
const { nodes, relationships, typeDefs, resolvers } = makeAugmentedSchema(document, {
336330
features: this.features,
337-
enableRegex: this.config?.enableRegex,
338331
validateResolvers: validationConfig.validateResolvers,
339332
generateSubscriptions: Boolean(this.plugins?.subscriptions),
340333
callbacks: this.features?.populatedBy?.callbacks ?? this.config.callbacks,
@@ -372,7 +365,6 @@ class Neo4jGraphQL {
372365

373366
const { nodes, relationships, typeDefs, resolvers } = makeAugmentedSchema(document, {
374367
features: this.features,
375-
enableRegex: this.config?.enableRegex,
376368
validateResolvers: validationConfig.validateResolvers,
377369
generateSubscriptions: Boolean(this.plugins?.subscriptions),
378370
callbacks: this.features?.populatedBy?.callbacks ?? this.config.callbacks,

packages/graphql/src/schema/get-where-fields.ts

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,11 @@ interface Fields {
3939
function getWhereFields({
4040
typeName,
4141
fields,
42-
enableRegex,
4342
isInterface,
4443
features,
4544
}: {
4645
typeName: string;
4746
fields: Fields;
48-
enableRegex?: boolean;
4947
isInterface?: boolean;
5048
features?: Neo4jFeaturesSettings;
5149
}): { [k: string]: string } {
@@ -126,30 +124,25 @@ function getWhereFields({
126124
}
127125

128126
if (["String", "ID"].includes(f.typeMeta.name)) {
129-
const matchesSetting: boolean | undefined = features?.filters?.[f.typeMeta.name]?.MATCHES;
130-
if (matchesSetting !== undefined) {
131-
if (matchesSetting === true) {
132-
res[`${f.fieldName}_MATCHES`] = { type: "String", directives: deprecatedDirectives };
133-
}
134-
} else if (enableRegex) {
135-
// TODO: This is deprecated. To be removed in 4.0.0.
136-
res[`${f.fieldName}_MATCHES`] = { type: "String", directives: deprecatedDirectives };
137-
}
138-
139-
const stringWhereOperators = ["_CONTAINS", "_STARTS_WITH", "_ENDS_WITH"];
127+
const stringWhereOperators: Array<{ comparator: string; typeName: string }> = [
128+
{ comparator: "_CONTAINS", typeName: f.typeMeta.name },
129+
{ comparator: "_STARTS_WITH", typeName: f.typeMeta.name },
130+
{ comparator: "_ENDS_WITH", typeName: f.typeMeta.name },
131+
];
140132

141133
const stringWhereOperatorsNegate = ["_NOT_CONTAINS", "_NOT_STARTS_WITH", "_NOT_ENDS_WITH"];
142134

143-
Object.entries(features?.filters?.String || {}).forEach(([filter, enabled]) => {
144-
if (filter === "MATCHES") {
145-
return;
146-
}
135+
Object.entries(features?.filters?.[f.typeMeta.name] || {}).forEach(([filter, enabled]) => {
147136
if (enabled) {
148-
stringWhereOperators.push(`_${filter}`);
137+
if (filter === "MATCHES") {
138+
stringWhereOperators.push({ comparator: `_${filter}`, typeName: "String" });
139+
} else {
140+
stringWhereOperators.push({ comparator: `_${filter}`, typeName: f.typeMeta.name });
141+
}
149142
}
150143
});
151-
stringWhereOperators.forEach((comparator) => {
152-
res[`${f.fieldName}${comparator}`] = { type: f.typeMeta.name, directives: deprecatedDirectives };
144+
stringWhereOperators.forEach(({ comparator, typeName }) => {
145+
res[`${f.fieldName}${comparator}`] = { type: typeName, directives: deprecatedDirectives };
153146
});
154147

155148
stringWhereOperatorsNegate.forEach((comparator) => {

packages/graphql/src/schema/make-augmented-schema.test.ts

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -151,29 +151,6 @@ describe("makeAugmentedSchema", () => {
151151
expect(matchesField).toBeUndefined();
152152
});
153153

154-
test("should add the MATCHES filter when NEO4J_GRAPHQL_ENABLE_REGEX is set", () => {
155-
const typeDefs = gql`
156-
type User {
157-
name: String
158-
}
159-
`;
160-
161-
const neoSchema = makeAugmentedSchema(typeDefs, {
162-
enableRegex: true,
163-
validateResolvers: true,
164-
});
165-
166-
const document = neoSchema.typeDefs;
167-
168-
const nodeWhereInput = document.definitions.find(
169-
(x) => x.kind === "InputObjectTypeDefinition" && x.name.value === "UserWhere"
170-
) as InputObjectTypeDefinitionNode;
171-
172-
const matchesField = nodeWhereInput.fields?.find((x) => x.name.value.endsWith("_MATCHES"));
173-
174-
expect(matchesField).toBeDefined();
175-
});
176-
177154
test("should add the name_MATCHES filter when Features.Filters.String.MATCHES is set", () => {
178155
const typeDefs = gql`
179156
type User {

packages/graphql/src/schema/make-augmented-schema.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,13 @@ function makeAugmentedSchema(
9090
document: DocumentNode,
9191
{
9292
features,
93-
enableRegex,
9493
validateResolvers,
9594
generateSubscriptions,
9695
callbacks,
9796
userCustomResolvers,
9897
subgraph,
9998
}: {
10099
features?: Neo4jFeaturesSettings;
101-
enableRegex?: boolean;
102100
validateResolvers: boolean;
103101
generateSubscriptions?: boolean;
104102
callbacks?: Neo4jGraphQLCallbacks;
@@ -269,7 +267,6 @@ function makeAugmentedSchema(
269267
pointFields: relFields.pointFields,
270268
primitiveFields: relFields.primitiveFields,
271269
},
272-
enableRegex,
273270
features,
274271
});
275272

@@ -374,7 +371,6 @@ function makeAugmentedSchema(
374371
pointFields: interfaceFields.pointFields,
375372
primitiveFields: interfaceFields.primitiveFields,
376373
},
377-
enableRegex,
378374
isInterface: true,
379375
features,
380376
});
@@ -622,7 +618,6 @@ function makeAugmentedSchema(
622618

623619
const queryFields = getWhereFields({
624620
typeName: node.name,
625-
enableRegex,
626621
fields: {
627622
temporalFields: node.temporalFields,
628623
enumFields: node.enumFields,

packages/graphql/tests/tck/directives/customResolver.test.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ describe("@customResolver directive", () => {
160160
neoSchema = new Neo4jGraphQL({
161161
typeDefs,
162162
resolvers,
163-
config: { enableRegex: true },
164163
});
165164
});
166165

@@ -242,7 +241,6 @@ describe("@customResolver directive", () => {
242241
neoSchema = new Neo4jGraphQL({
243242
typeDefs,
244243
resolvers,
245-
config: { enableRegex: true },
246244
});
247245
});
248246

@@ -419,7 +417,6 @@ describe("@customResolver directive", () => {
419417
neoSchema = new Neo4jGraphQL({
420418
typeDefs,
421419
resolvers,
422-
config: { enableRegex: true },
423420
});
424421
});
425422

@@ -612,7 +609,6 @@ describe("@customResolver directive", () => {
612609
neoSchema = new Neo4jGraphQL({
613610
typeDefs,
614611
resolvers,
615-
config: { enableRegex: true },
616612
});
617613
});
618614

0 commit comments

Comments
 (0)