Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions packages/graphql/knip.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"$schema": "https://unpkg.com/knip@5/schema.json",
"ignoreExportsUsedInFile": {
"interface": false,
"type": false
},
"tags": ["-lintignore"],
"ignoreFiles": [
"tests/performance/**",
"tests/utils/**",
"tests/integration/teardown.ts",
"tests/e2e/**",
"jest-*-setup.js"
],
"ignoreBinaries": [],
"ignoreDependencies": ["jest", "rimraf", "ts-node"],
"treatConfigHintsAsErrors": true
}
6 changes: 3 additions & 3 deletions packages/graphql/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@
"test:schema": "jest tests/schema -c jest.minimal.config.js",
"test:tck": "jest tests/tck -c jest.minimal.config.js",
"test:unit": "jest src --coverage=true -c jest.minimal.config.js",
"test": "jest"
"test": "jest",
"knip": "knip"
},
"author": "Neo4j Inc.",
"devDependencies": {
"@apollo/gateway": "2.12.1",
"@apollo/server": "5.2.0",
"@types/deep-equal": "1.0.4",
"@types/is-uuid": "1.0.2",
"@types/jest": "30.0.0",
"@types/jsonwebtoken": "9.0.10",
Expand All @@ -65,11 +65,11 @@
"jest-extended": "7.0.0",
"jsonwebtoken": "9.0.2",
"jwks-rsa": "3.2.0",
"knip": "5.70.2",
"koa": "3.1.1",
"koa-jwt": "4.0.4",
"koa-router": "14.0.0",
"mock-jwks": "3.3.5",
"nock": "14.0.10",
"randomstring": "1.3.1",
"rimraf": "6.1.2",
"supertest": "7.1.4",
Expand Down
39 changes: 19 additions & 20 deletions packages/graphql/src/classes/subscription/cdc/cdc-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,22 @@

import type { DateTime } from "neo4j-driver";

export type CDCNodeEvent = {
elementId: string;
eventType: "n";
state: {
before?: CDCEventState;
after?: CDCEventState;
};
operation: CDCOperation;
labels: string[];
};
export type CDCQueryResponse = {
id: string;
event: CDCEvent;
metadata: CDCMetadata;
};

type CDCEventState = {
properties: Record<string, unknown>;
labels: string[];
Expand All @@ -34,7 +50,7 @@ type CDCRelationshipNode = {

type CDCOperation = "c" | "d" | "u";

export type CDCRelationshipEvent = {
type CDCRelationshipEvent = {
elementId: string;
eventType: "r";
start: CDCRelationshipNode;
Expand All @@ -47,26 +63,9 @@ export type CDCRelationshipEvent = {
type: string;
};

export type CDCNodeEvent = {
elementId: string;
eventType: "n";
state: {
before?: CDCEventState;
after?: CDCEventState;
};
operation: CDCOperation;
labels: string[];
};

export type CDCMetadata = {
type CDCMetadata = {
txStartTime: DateTime;
// Other metadata is ignored here
};

export type CDCEvent = CDCNodeEvent | CDCRelationshipEvent;

export type CDCQueryResponse = {
id: string;
event: CDCEvent;
metadata: CDCMetadata;
};
type CDCEvent = CDCNodeEvent | CDCRelationshipEvent;
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,6 @@ import type { Neo4jGraphQLSessionConfig } from "../Executor";

const debug = Debug(DEBUG_EXECUTE);

export interface AssertIndexesAndConstraintsOptions {
create?: boolean;
}

export async function assertIndexesAndConstraints({
driver,
sessionConfig,
Expand Down
4 changes: 0 additions & 4 deletions packages/graphql/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ export const AUTHORIZATION_UNAUTHENTICATED = "Unauthenticated";
export const DEBUG_ALL = `${DEBUG_PREFIX}:*`;
export const DEBUG_AUTH = `${DEBUG_PREFIX}:auth`;
export const DEBUG_EXECUTE = `${DEBUG_PREFIX}:execution`;
export const DEBUG_GENERATE = `${DEBUG_PREFIX}:generate`;
export const DEBUG_GRAPHQL = `${DEBUG_PREFIX}:graphql`;
export const DEBUG_TRANSLATE = `${DEBUG_PREFIX}:translate`;

Expand Down Expand Up @@ -87,9 +86,6 @@ export enum RelationshipNestedOperationsOption {
DISCONNECT = "DISCONNECT",
}

export const META_CYPHER_VARIABLE = "meta";
export const META_OLD_PROPS_CYPHER_VARIABLE = "oldProps";

export const DBMS_COMPONENTS_QUERY =
"CALL dbms.components() YIELD versions, edition UNWIND versions AS version RETURN version, edition";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import { DirectiveLocation, GraphQLBoolean, GraphQLDirective, GraphQLList, Graph
import { RelationshipNestedOperationsOption } from "../../constants";
import { RelationshipNestedOperationsEnum } from "./arguments/enums/RelationshipNestedOperations";

export const defaultNestedOperations = [
const defaultNestedOperations = [
RelationshipNestedOperationsOption.CREATE,
RelationshipNestedOperationsOption.UPDATE,
RelationshipNestedOperationsOption.DELETE,
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/graphql/directives/relationship.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import { RelationshipDirectionEnum } from "./arguments/enums/RelationshipDirecti
import { RelationshipNestedOperationsEnum } from "./arguments/enums/RelationshipNestedOperations";
import { RelationshipQueryDirectionEnum } from "./arguments/enums/RelationshipQueryDirection";

export const defaultNestedOperations = [
const defaultNestedOperations = [
RelationshipNestedOperationsOption.CREATE,
RelationshipNestedOperationsOption.UPDATE,
RelationshipNestedOperationsOption.DELETE,
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/graphql/directives/vector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {
GraphQLString,
} from "graphql";

export const vectorProviderNames = {
const vectorProviderNames = {
VERTEX_AI: "VertexAI",
OPEN_AI: "OpenAI",
AZURE_OPEN_AI: "AzureOpenAI",
Expand Down
10 changes: 5 additions & 5 deletions packages/graphql/src/graphql/scalars/Duration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,14 @@ const DURATION_REGEX_NO_DELIMITERS =

// Normalized components per https://neo4j.com/docs/cypher-manual/current/syntax/operators/#cypher-ordering
export const MONTHS_PER_YEAR = 12;
export const DAYS_PER_YEAR = 365.2425;
export const DAYS_PER_MONTH = DAYS_PER_YEAR / MONTHS_PER_YEAR;
const DAYS_PER_YEAR = 365.2425;
const DAYS_PER_MONTH = DAYS_PER_YEAR / MONTHS_PER_YEAR;
export const DAYS_PER_WEEK = 7;
export const HOURS_PER_DAY = 24;
export const MINUTES_PER_HOUR = 60;
const HOURS_PER_DAY = 24;
const MINUTES_PER_HOUR = 60;
export const SECONDS_PER_MINUTE = 60;
export const SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
export const NANOSECONDS_PER_SECOND = 1000000000;
const NANOSECONDS_PER_SECOND = 1000000000;

export const parseDuration = (
value: string
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/graphql/scalars/LocalTime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import type { ValueNode } from "graphql";
import { GraphQLError, GraphQLScalarType, Kind } from "graphql";
import neo4j, { isLocalTime } from "neo4j-driver";

export const LOCAL_TIME_REGEX =
const LOCAL_TIME_REGEX =
/^(?<hour>[01]\d|2[0-3]):(?<minute>[0-5]\d):(?<second>[0-5]\d)(\.(?<fraction>\d{1}(?:\d{0,8})))?$/;

type LocalTimeMatchGroups = {
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/graphql/scalars/Time.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import type { ValueNode } from "graphql";
import { GraphQLError, GraphQLScalarType, Kind } from "graphql";
import neo4j from "neo4j-driver";

export const TIME_REGEX =
const TIME_REGEX =
/^(?<hour>[01]\d|2[0-3]):(?<minute>[0-5]\d)(:(?<second>[0-5]\d)(\.(?<fraction>\d{1}(?:\d{0,8})))?((?:[Zz])|((?<offsetDirection>[-|+])(?<offsetHour>[01]\d|2[0-3]):(?<offsetMinute>[0-5]\d)))?)?$/;

export const validateTime = (value: unknown): string => {
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/schema-model/annotation/Annotation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export type Annotations = CheckAnnotationName<{
timestamp: TimestampAnnotation;
}>;

export type AnnotationParser<T extends Annotation> = (
type AnnotationParser<T extends Annotation> = (
firstDirective: DirectiveNode,
directives: readonly DirectiveNode[]
) => T;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ type SubscriptionEvents = {
delete_relationship: string;
};

export type UpdateMutationArgumentNames = {
type UpdateMutationArgumentNames = {
connect: string;
disconnect: string;
create: string;
Expand All @@ -59,7 +59,7 @@ export type UpdateMutationArgumentNames = {
where: string;
};

export type CreateMutationArgumentNames = {
type CreateMutationArgumentNames = {
input: string;
};

Expand Down
5 changes: 4 additions & 1 deletion packages/graphql/src/schema-model/library-directives.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export const LIBRARY_DIRECTIVES = [
...additionalDirectives,
] as const satisfies readonly LibraryDirectives[];

export const SCHEMA_CONFIGURATION_FIELD_DIRECTIVES = [
const SCHEMA_CONFIGURATION_FIELD_DIRECTIVES = [
"filterable",
"selectable",
"settable",
Expand Down Expand Up @@ -72,6 +72,7 @@ export const SCHEMA_CONFIGURATION_OBJECT_DIRECTIVES = [
"subscription",
] as const satisfies readonly LibraryDirectives[];

// eslint-disable-next-line @typescript-eslint/no-unused-vars
const OBJECT_DIRECTIVES = [
"authentication",
"authorization",
Expand All @@ -88,8 +89,10 @@ const OBJECT_DIRECTIVES = [
] as const satisfies readonly LibraryDirectives[];
export type ObjectDirective = ValueOf<typeof OBJECT_DIRECTIVES>;

// eslint-disable-next-line @typescript-eslint/no-unused-vars
const INTERFACE_DIRECTIVES = ["query", "plural", "limit"] as const satisfies readonly LibraryDirectives[];
export type InterfaceDirective = ValueOf<typeof INTERFACE_DIRECTIVES>;

// eslint-disable-next-line @typescript-eslint/no-unused-vars
const UNION_DIRECTIVES = ["query", "plural"] as const satisfies readonly LibraryDirectives[];
export type UnionDirective = ValueOf<typeof UNION_DIRECTIVES>;
12 changes: 6 additions & 6 deletions packages/graphql/src/schema-model/parser/parse-attribute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
* limitations under the License.
*/

import type { IResolvers } from "@graphql-tools/utils";
import type { FieldDefinitionNode, InputValueDefinitionNode, TypeNode } from "graphql";
import { Kind } from "graphql";
import { aliasDirective } from "../../graphql/directives";
Expand Down Expand Up @@ -44,7 +45,6 @@ import type { DefinitionCollection } from "./definition-collection";
import { parseAnnotations } from "./parse-annotation";
import { parseArguments } from "./parse-arguments";
import { findDirective } from "./utils";
import type { IResolvers } from "@graphql-tools/utils";

export function parseAttributeArguments(
fieldArgs: readonly InputValueDefinitionNode[],
Expand Down Expand Up @@ -144,15 +144,15 @@ function isUnion(definitionCollection: DefinitionCollection, name: string): bool
return definitionCollection.unionTypes.has(name);
}

export function isEnum(definitionCollection: DefinitionCollection, name: string): boolean {
function isEnum(definitionCollection: DefinitionCollection, name: string): boolean {
return definitionCollection.enumTypes.has(name);
}

export function isUserScalar(definitionCollection: DefinitionCollection, name: string) {
function isUserScalar(definitionCollection: DefinitionCollection, name: string) {
return definitionCollection.scalarTypes.has(name);
}

export function isObject(definitionCollection: DefinitionCollection, name: string) {
function isObject(definitionCollection: DefinitionCollection, name: string) {
return definitionCollection.objectTypes.has(name);
}

Expand All @@ -168,11 +168,11 @@ function isCartesianPoint(value: string): boolean {
return isNeo4jGraphQLSpatialType(value) && value === Neo4jGraphQLSpatialType.CartesianPoint;
}

export function isNeo4jGraphQLSpatialType(value: string): value is Neo4jGraphQLSpatialType {
function isNeo4jGraphQLSpatialType(value: string): value is Neo4jGraphQLSpatialType {
return Object.values<string>(Neo4jGraphQLSpatialType).includes(value);
}

export function isScalarType(value: string): value is GraphQLBuiltInScalarType | Neo4jGraphQLScalarType {
function isScalarType(value: string): value is GraphQLBuiltInScalarType | Neo4jGraphQLScalarType {
return isGraphQLBuiltInScalar(value) || isNeo4jGraphQLNumberType(value) || isNeo4jGraphQLTemporalType(value);
}

Expand Down
34 changes: 0 additions & 34 deletions packages/graphql/src/schema/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,6 @@
*/

import { DEPRECATED } from "../constants";
import type { ConcreteEntityAdapter } from "../schema-model/entity/model-adapters/ConcreteEntityAdapter";
import type { InterfaceEntityAdapter } from "../schema-model/entity/model-adapters/InterfaceEntityAdapter";
import type { RelationshipAdapter } from "../schema-model/relationship/model-adapters/RelationshipAdapter";
import type { RelationshipDeclarationAdapter } from "../schema-model/relationship/model-adapters/RelationshipDeclarationAdapter";

// TODO: Add constant deprecations here

Expand Down Expand Up @@ -65,33 +61,3 @@ export function DEPRECATE_AGGREGATION_FILTERS(name: string, aggregationOperation
},
};
}

export function DEPRECATE_AGGREGATION(entity: ConcreteEntityAdapter | InterfaceEntityAdapter) {
return {
name: DEPRECATED,
args: {
reason: `Please use the explicit field "aggregate" inside "${entity.operations.rootTypeFieldNames.connection}" instead`,
},
};
}

export function DEPRECATE_NESTED_AGGREGATION(relationship: RelationshipAdapter | RelationshipDeclarationAdapter) {
return {
name: DEPRECATED,
args: {
reason: `Please use field "aggregate" inside "${relationship.operations.connectionFieldName}" instead`,
},
};
}

export function DEPRECATE_UPDATE_WHERE(
relationship: RelationshipAdapter | RelationshipDeclarationAdapter,
ifUnionMemberEntity?: ConcreteEntityAdapter
) {
return {
name: DEPRECATED,
args: {
reason: `Please use field "where" inside "${relationship.operations.getUpdateConnectionInputTypename(ifUnionMemberEntity)}" instead`,
},
};
}
2 changes: 1 addition & 1 deletion packages/graphql/src/schema/generation/connect-input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import type { RelationshipDeclarationAdapter } from "../../schema-model/relation
import { relationshipTargetHasRelationshipWithNestedOperation } from "./utils";
import { withConnectWhereFieldInputType } from "./where-input";

export function withConnectInputType({
function withConnectInputType({
entityAdapter,
composer,
}: {
Expand Down
4 changes: 2 additions & 2 deletions packages/graphql/src/schema/generation/delete-input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import type { Neo4jFeaturesSettings } from "../../types";
import { withConnectionWhereInputType } from "./connection-where-input";
import { relationshipTargetHasRelationshipWithNestedOperation } from "./utils";

export function withDeleteInputType({
function withDeleteInputType({
entityAdapter,
composer,
}: {
Expand Down Expand Up @@ -125,7 +125,7 @@ function makeDeleteInputTypeRelationshipField({
};
}

export function withUnionDeleteInputType({
function withUnionDeleteInputType({
relationshipAdapter,
composer,
deprecatedDirectives,
Expand Down
2 changes: 1 addition & 1 deletion packages/graphql/src/schema/generation/disconnect-input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import type { Neo4jFeaturesSettings } from "../../types";
import { withConnectionWhereInputType } from "./connection-where-input";
import { relationshipTargetHasRelationshipWithNestedOperation } from "./utils";

export function withDisconnectInputType({
function withDisconnectInputType({
entityAdapter,
composer,
}: {
Expand Down
Loading
Loading