This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch js-translator in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 728e654a7324c00318e520c20dd7e6db20060b16 Author: Stephen Mallette <[email protected]> AuthorDate: Fri Mar 20 15:44:33 2026 -0400 Bumped to typescript for gremlint --- gremlin-mcp/src/main/javascript/package-lock.json | 149 +-------------------- gremlin-mcp/src/main/javascript/package.json | 1 - .../src/main/javascript/src/gremlin/connection.ts | 24 ++-- .../main/javascript/src/gremlin/edge-patterns.ts | 8 +- .../javascript/src/gremlin/property-analyzer.ts | 5 +- .../src/main/javascript/src/gremlin/query-utils.ts | 8 +- .../javascript/src/gremlin/schema-generator.ts | 4 +- .../src/main/javascript/src/gremlin/service.ts | 2 +- .../src/main/javascript/src/gremlin/types.ts | 10 +- gremlin-mcp/src/main/javascript/tsconfig.json | 9 ++ 10 files changed, 39 insertions(+), 181 deletions(-) diff --git a/gremlin-mcp/src/main/javascript/package-lock.json b/gremlin-mcp/src/main/javascript/package-lock.json index ae1d20a78a..ccdfaae386 100644 --- a/gremlin-mcp/src/main/javascript/package-lock.json +++ b/gremlin-mcp/src/main/javascript/package-lock.json @@ -13,10 +13,8 @@ "@effect/platform": "^0.90.6", "@effect/platform-node": "^0.96.0", "@modelcontextprotocol/sdk": "^1.17.4", - "@types/gremlin": "^3.6.7", "effect": "^3.17.9", - "gremlin": "^3.7.4", - "gremlin-language": "file:../../../../gremlin-javascript/src/main/javascript/gremlin-javascript", + "gremlin": "file:../../../../gremlin-javascript/src/main/javascript/gremlin-javascript", "gremlint": "~3.8.0", "winston": "^3.17.0", "zod": "^3.25.76" @@ -2535,12 +2533,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/gremlin": { - "version": "3.6.7", - "resolved": "https://registry.npmjs.org/@types/gremlin/-/gremlin-3.6.7.tgz", - "integrity": "sha512-qbzClMUhVb2+6XOtAwUnNtVmDeBsvAYXyoQYIvQcv9pQkk7z+Fct0o59rYCyLf4R47Xlg7U+6lvUkP3Ec/XRdg==", - "license": "MIT" - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -3160,17 +3152,6 @@ "win32" ] }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -3424,25 +3405,6 @@ "dev": true, "license": "MIT" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -3542,29 +3504,6 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4526,28 +4465,13 @@ "through": "^2.3.8" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, "license": "MIT" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, "node_modules/eventsource": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", @@ -5153,36 +5077,9 @@ "license": "MIT" }, "node_modules/gremlin": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/gremlin/-/gremlin-3.8.0.tgz", - "integrity": "sha512-VG4XhHZjqmJsVSrEKwYE3adW/G5jwQ5AoYWb3NUSV+sXRsdGHOvYLYzTIwax/CoyRHeL971vCO2jsdGJHIcuGQ==", - "dependencies": { - "buffer": "^6.0.3", - "eventemitter3": "^5.0.1", - "readable-stream": "^4.5.2", - "uuid": "^9.0.1", - "ws": "^8.16.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/gremlin-language": { "resolved": "../../../../gremlin-javascript/src/main/javascript/gremlin-javascript", "link": true }, - "node_modules/gremlin/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/gremlint": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/gremlint/-/gremlint-3.8.0.tgz", @@ -5317,25 +5214,6 @@ "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -7441,14 +7319,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7554,21 +7424,6 @@ "dev": true, "license": "MIT" }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/readline-transform": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/readline-transform/-/readline-transform-1.0.0.tgz", diff --git a/gremlin-mcp/src/main/javascript/package.json b/gremlin-mcp/src/main/javascript/package.json index 79d9e536ee..64507c5c0d 100644 --- a/gremlin-mcp/src/main/javascript/package.json +++ b/gremlin-mcp/src/main/javascript/package.json @@ -47,7 +47,6 @@ "@effect/platform": "^0.90.6", "@effect/platform-node": "^0.96.0", "@modelcontextprotocol/sdk": "^1.17.4", - "@types/gremlin": "^3.6.7", "effect": "^3.17.9", "gremlin": "file:../../../../gremlin-javascript/src/main/javascript/gremlin-javascript", "winston": "^3.17.0", diff --git a/gremlin-mcp/src/main/javascript/src/gremlin/connection.ts b/gremlin-mcp/src/main/javascript/src/gremlin/connection.ts index db97f27b5a..7e45d3101b 100644 --- a/gremlin-mcp/src/main/javascript/src/gremlin/connection.ts +++ b/gremlin-mcp/src/main/javascript/src/gremlin/connection.ts @@ -32,16 +32,15 @@ */ import { Effect, Layer, Option, Redacted, Ref, pipe } from 'effect'; -import gremlin from 'gremlin'; +import { driver, process } from 'gremlin'; import { AppConfig } from '../config.js'; import { Errors } from '../errors.js'; import { GremlinClient } from './client.js'; import type { ConnectionState } from './types.js'; import type { GremlinConnectionError } from '../errors.js'; -const { PlainTextSaslAuthenticator } = gremlin.driver.auth; -const { Client, DriverRemoteConnection } = gremlin.driver; -const { AnonymousTraversalSource } = gremlin.process; +const { Client, DriverRemoteConnection } = driver; +const { AnonymousTraversalSource } = process; const NO_ENDPOINT_MSG = 'No Gremlin Server configured. Set GREMLIN_MCP_ENDPOINT to enable graph operations.'; @@ -83,16 +82,21 @@ const createConnection = ( traversalSource, }); - const authenticator = Option.map( - authenticatorInput, - ({ username, password }) => new PlainTextSaslAuthenticator(username, password) - ); + const headers = Option.match(authenticatorInput, { + onNone: () => undefined, + onSome: ({ username, password }) => { + const credentials = `${username}:${password}`; + return { + Authorization: `Basic ${Buffer.from(credentials).toString('base64')}`, + }; + }, + }); const connection = yield* Effect.try({ try: () => new DriverRemoteConnection(url, { traversalSource, - authenticator: Option.getOrUndefined(authenticator), + headers, }), catch: error => Errors.connection('Failed to create remote connection', { error }), }); @@ -100,7 +104,7 @@ const createConnection = ( const g = AnonymousTraversalSource.traversal().withRemote(connection); const client = new Client(url, { traversalSource, - authenticator: Option.getOrUndefined(authenticator), + headers, }); // Verify the server is reachable before caching diff --git a/gremlin-mcp/src/main/javascript/src/gremlin/edge-patterns.ts b/gremlin-mcp/src/main/javascript/src/gremlin/edge-patterns.ts index 9a61147335..aefdc151ef 100644 --- a/gremlin-mcp/src/main/javascript/src/gremlin/edge-patterns.ts +++ b/gremlin-mcp/src/main/javascript/src/gremlin/edge-patterns.ts @@ -25,15 +25,13 @@ */ import { Effect } from 'effect'; -import gremlin from 'gremlin'; +import { process } from 'gremlin'; import type { EdgePattern } from './models/index.js'; import { executeGremlinQuery } from './query-utils.js'; import type { GremlinQueryError } from '../errors.js'; -import type { process } from 'gremlin'; +import type { GraphTraversalSource } from './types.js'; -type GraphTraversalSource = process.GraphTraversalSource; - -const { inV, outV, label } = gremlin.process.statics; +const { inV, outV, label } = process.statics; /** * Raw pattern data from Gremlin project() query. diff --git a/gremlin-mcp/src/main/javascript/src/gremlin/property-analyzer.ts b/gremlin-mcp/src/main/javascript/src/gremlin/property-analyzer.ts index e1d05b61c5..0f0fa626d0 100644 --- a/gremlin-mcp/src/main/javascript/src/gremlin/property-analyzer.ts +++ b/gremlin-mcp/src/main/javascript/src/gremlin/property-analyzer.ts @@ -26,13 +26,10 @@ import { Effect } from 'effect'; import type { Property } from './models/index.js'; -import type { SchemaConfig } from './types.js'; -import type { process } from 'gremlin'; +import type { GraphTraversalSource, SchemaConfig } from './types.js'; import { getSamplePropertyValues, processBatched } from './query-utils.js'; import type { GremlinQueryError } from '../errors.js'; -type GraphTraversalSource = process.GraphTraversalSource; - /** * Analyzes property characteristics from collected values. * diff --git a/gremlin-mcp/src/main/javascript/src/gremlin/query-utils.ts b/gremlin-mcp/src/main/javascript/src/gremlin/query-utils.ts index 592d2c71af..13a4bfb56b 100644 --- a/gremlin-mcp/src/main/javascript/src/gremlin/query-utils.ts +++ b/gremlin-mcp/src/main/javascript/src/gremlin/query-utils.ts @@ -25,13 +25,11 @@ */ import { Effect } from 'effect'; -import gremlin from 'gremlin'; +import { process } from 'gremlin'; import { Errors, type GremlinQueryError } from '../errors.js'; -import type { process } from 'gremlin'; +import type { GraphTraversalSource } from './types.js'; -type GraphTraversalSource = process.GraphTraversalSource; - -const { label } = gremlin.process.statics; +const { label } = process.statics; type CountResult = { value?: unknown }; diff --git a/gremlin-mcp/src/main/javascript/src/gremlin/schema-generator.ts b/gremlin-mcp/src/main/javascript/src/gremlin/schema-generator.ts index 84b87b9193..be1992c89c 100644 --- a/gremlin-mcp/src/main/javascript/src/gremlin/schema-generator.ts +++ b/gremlin-mcp/src/main/javascript/src/gremlin/schema-generator.ts @@ -28,7 +28,7 @@ import { Effect, Duration } from 'effect'; import { type GraphSchema, type Vertex, type Edge } from './models/index.js'; import { Errors, type GremlinQueryError } from '../errors.js'; -import type { ConnectionState, SchemaConfig } from './types.js'; +import type { ConnectionState, GraphTraversalSource, SchemaConfig } from './types.js'; import { getVertexLabels, getEdgeLabels, @@ -40,9 +40,7 @@ import { import { analyzeElementProperties, withElementCounts } from './property-analyzer.js'; import { generateEdgePatterns } from './edge-patterns.js'; import { assembleGraphSchema } from './schema-assembly.js'; -import type { process } from 'gremlin'; -type GraphTraversalSource = process.GraphTraversalSource; type SchemaCountData = { value?: Record<string, number> } | null; const DEFAULT_SCHEMA_TIMEOUT_MS = 30000; diff --git a/gremlin-mcp/src/main/javascript/src/gremlin/service.ts b/gremlin-mcp/src/main/javascript/src/gremlin/service.ts index 8fc8d397a7..337a9a17d9 100644 --- a/gremlin-mcp/src/main/javascript/src/gremlin/service.ts +++ b/gremlin-mcp/src/main/javascript/src/gremlin/service.ts @@ -98,7 +98,7 @@ const makeGremlinService = Effect.gen(function* () { client: GremlinClientType ): Effect.Effect<unknown, GremlinQueryError> => pipe( - Effect.tryPromise(() => client.submit(query)), + Effect.tryPromise(() => client.submit(query, null)), Effect.mapError((error: unknown) => Errors.query('Query execution failed', query, error)) ); diff --git a/gremlin-mcp/src/main/javascript/src/gremlin/types.ts b/gremlin-mcp/src/main/javascript/src/gremlin/types.ts index 1629d23d0a..92eb1b170c 100644 --- a/gremlin-mcp/src/main/javascript/src/gremlin/types.ts +++ b/gremlin-mcp/src/main/javascript/src/gremlin/types.ts @@ -21,15 +21,15 @@ * Shared types and interfaces for Gremlin service modules */ -import type { driver, process } from 'gremlin'; +import { driver, process } from 'gremlin'; import type { GraphSchema } from './models/index.js'; export type { GraphSchema }; -export type GremlinClientType = driver.Client; -export type GremlinResultSet = driver.ResultSet; -export type GremlinConnection = driver.DriverRemoteConnection; -export type GraphTraversalSource = process.GraphTraversalSource; +export type GremlinClientType = InstanceType<(typeof driver)['Client']>; +export type GremlinResultSet = InstanceType<(typeof driver)['ResultSet']>; +export type GremlinConnection = InstanceType<(typeof driver)['DriverRemoteConnection']>; +export type GraphTraversalSource = InstanceType<(typeof process)['GraphTraversalSource']>; /** * Active Gremlin connection state. Only created when the connection succeeds. diff --git a/gremlin-mcp/src/main/javascript/tsconfig.json b/gremlin-mcp/src/main/javascript/tsconfig.json index 61dc9119d7..3d4adebadc 100644 --- a/gremlin-mcp/src/main/javascript/tsconfig.json +++ b/gremlin-mcp/src/main/javascript/tsconfig.json @@ -3,6 +3,15 @@ "target": "ES2022", "module": "ESNext", "moduleResolution": "node", + "baseUrl": ".", + "paths": { + "gremlin": [ + "../../../../gremlin-javascript/src/main/javascript/gremlin-javascript/build/esm/index.d.ts" + ], + "gremlin/language": [ + "../../../../gremlin-javascript/src/main/javascript/gremlin-javascript/build/esm/language/index.d.ts" + ] + }, "lib": ["ES2022"], "outDir": "./dist", "rootDir": "./src",
