You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by xi...@apache.org on 2025/04/11 21:49:06 UTC

(tinkerpop) branch master updated (49cad097f3 -> 9829c01291)

This is an automated email from the ASF dual-hosted git repository.

xiazcy pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


    from 49cad097f3 Merge branch '3.8-dev'
     add a0c5851521 Backport OffsetDateTime changes from 4.0 (#3090)
     new 9829c01291 Merge branch '3.8-dev'

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CHANGELOG.asciidoc                                 |  5 +-
 docs/src/reference/the-traversal.asciidoc          |  7 +-
 docs/src/upgrade/release-3.8.x.asciidoc            | 25 ++++++-
 .../tinkerpop/gremlin/jsr223/CoreImports.java      |  1 +
 .../gremlin/language/grammar/ArgumentVisitor.java  |  7 +-
 .../translator/AnonymizedTranslatorVisitor.java    |  4 +-
 .../translator/DotNetTranslateVisitor.java         |  7 +-
 .../language/translator/GoTranslateVisitor.java    | 13 +++-
 .../language/translator/JavaTranslateVisitor.java  |  1 -
 .../translator/JavascriptTranslateVisitor.java     |  8 +--
 .../translator/PythonTranslateVisitor.java         |  8 ++-
 .../traversal/dsl/graph/GraphTraversal.java        | 20 +++++-
 .../gremlin/process/traversal/dsl/graph/__.java    | 10 +++
 .../process/traversal/step/map/AsDateStep.java     |  9 ++-
 .../process/traversal/step/map/DateAddStep.java    | 47 ++++++++-----
 .../process/traversal/step/map/DateDiffStep.java   | 56 +++++++++++----
 .../tinkerpop/gremlin/util/DatetimeHelper.java     | 12 +---
 .../grammar/GeneralLiteralVisitorTest.java         |  2 +-
 .../language/translator/GremlinTranslatorTest.java | 19 +++--
 .../process/traversal/step/map/AsDateStepTest.java | 14 ++++
 .../traversal/step/map/DateAddStepTest.java        | 63 +++++++++++++++++
 .../traversal/step/map/DateDiffStepTest.java       | 56 +++++++++++++++
 .../Structure/IO/GraphBinary/DataType.cs           |  1 +
 .../IO/GraphBinary/TypeSerializerRegistry.cs       |  7 +-
 ...meOffsetSerializer.cs => DateTimeSerializer.cs} | 10 +--
 .../GraphBinary/Types/OffsetDateTimeSerializer.cs  | 80 ++++++++++++++++++++++
 .../Structure/IO/GraphSON/GraphSONReader.cs        |  1 +
 .../Structure/IO/GraphSON/GraphSONWriter.cs        |  2 +-
 ...serializer.cs => OffsetDateTimeDeserializer.cs} |  9 ++-
 ...teSerializer.cs => OffsetDateTimeSerializer.cs} |  4 +-
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 19 ++---
 .../Structure/IO/GraphSON/GraphSONWriterTests.cs   |  2 +-
 gremlin-go/driver/cucumber/cucumberSteps_test.go   |  7 +-
 gremlin-go/driver/cucumber/gremlin.go              | 19 ++---
 gremlin-go/driver/graphBinary.go                   | 73 +++++++++++++++++++-
 gremlin-go/driver/graphBinary_test.go              | 33 +++++++++
 gremlin-go/driver/serializer.go                    |  8 ++-
 .../lib/structure/io/binary/GraphBinary.js         |  3 +
 .../structure/io/binary/internals/AnySerializer.js |  1 +
 ...teSerializer.js => OffsetDateTimeSerializer.js} | 69 ++++++++++++++++---
 .../lib/structure/io/graph-serializer.ts           |  4 +-
 .../lib/structure/io/type-serializers.ts           | 19 ++++-
 .../gremlin-javascript/test/cucumber/gremlin.js    | 19 ++---
 .../test/unit/graphbinary/AnySerializer-test.js    | 16 ++++-
 .../gremlin-javascript/test/unit/graphson-test.js  |  4 +-
 gremlin-python/src/main/python/radish/gremlin.py   | 19 ++---
 .../gremlin/test/features/map/AsDate.feature       | 12 ++++
 47 files changed, 681 insertions(+), 154 deletions(-)
 rename gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/{DateTimeOffsetSerializer.cs => DateTimeSerializer.cs} (84%)
 create mode 100644 gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphBinary/Types/OffsetDateTimeSerializer.cs
 copy gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/{MergeDeserializer.cs => OffsetDateTimeDeserializer.cs} (79%)
 rename gremlin-dotnet/src/Gremlin.Net/Structure/IO/GraphSON/{DateSerializer.cs => OffsetDateTimeSerializer.cs} (87%)
 copy gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/{DateSerializer.js => OffsetDateTimeSerializer.js} (54%)


(tinkerpop) 01/01: Merge branch '3.8-dev'

Posted by xi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

xiazcy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 9829c012912fa357923929e1f409491e6530d801
Merge: 49cad097f3 a0c5851521
Author: xiazcy <xi...@gmail.com>
AuthorDate: Fri Apr 11 14:48:51 2025 -0700

    Merge branch '3.8-dev'

 CHANGELOG.asciidoc                                 |   5 +-
 docs/src/reference/the-traversal.asciidoc          |   7 +-
 docs/src/upgrade/release-3.8.x.asciidoc            |  25 +++-
 .../tinkerpop/gremlin/jsr223/CoreImports.java      |   1 +
 .../gremlin/language/grammar/ArgumentVisitor.java  |   7 +-
 .../translator/AnonymizedTranslatorVisitor.java    |   4 +-
 .../translator/DotNetTranslateVisitor.java         |   7 +-
 .../language/translator/GoTranslateVisitor.java    |  13 +-
 .../language/translator/JavaTranslateVisitor.java  |   1 -
 .../translator/JavascriptTranslateVisitor.java     |   8 +-
 .../translator/PythonTranslateVisitor.java         |   8 +-
 .../traversal/dsl/graph/GraphTraversal.java        |  20 ++-
 .../gremlin/process/traversal/dsl/graph/__.java    |  10 ++
 .../process/traversal/step/map/AsDateStep.java     |   9 +-
 .../process/traversal/step/map/DateAddStep.java    |  47 ++++---
 .../process/traversal/step/map/DateDiffStep.java   |  56 ++++++--
 .../tinkerpop/gremlin/util/DatetimeHelper.java     |  12 +-
 .../grammar/GeneralLiteralVisitorTest.java         |   2 +-
 .../language/translator/GremlinTranslatorTest.java |  19 ++-
 .../process/traversal/step/map/AsDateStepTest.java |  14 ++
 .../traversal/step/map/DateAddStepTest.java        |  63 +++++++++
 .../traversal/step/map/DateDiffStepTest.java       |  56 ++++++++
 .../Structure/IO/GraphBinary/DataType.cs           |   1 +
 .../IO/GraphBinary/TypeSerializerRegistry.cs       |   7 +-
 ...meOffsetSerializer.cs => DateTimeSerializer.cs} |  10 +-
 .../GraphBinary/Types/OffsetDateTimeSerializer.cs  |  80 +++++++++++
 .../Structure/IO/GraphSON/GraphSONReader.cs        |   1 +
 .../Structure/IO/GraphSON/GraphSONWriter.cs        |   2 +-
 ...Serializer.cs => OffsetDateTimeDeserializer.cs} |  12 +-
 ...teSerializer.cs => OffsetDateTimeSerializer.cs} |   4 +-
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs |  19 +--
 .../Structure/IO/GraphSON/GraphSONWriterTests.cs   |   2 +-
 gremlin-go/driver/cucumber/cucumberSteps_test.go   |   7 +-
 gremlin-go/driver/cucumber/gremlin.go              |  19 +--
 gremlin-go/driver/graphBinary.go                   |  73 +++++++++-
 gremlin-go/driver/graphBinary_test.go              |  33 +++++
 gremlin-go/driver/serializer.go                    |   8 +-
 .../lib/structure/io/binary/GraphBinary.js         |   3 +
 .../structure/io/binary/internals/AnySerializer.js |   1 +
 .../binary/internals/OffsetDateTimeSerializer.js   | 151 +++++++++++++++++++++
 .../lib/structure/io/graph-serializer.ts           |   4 +-
 .../lib/structure/io/type-serializers.ts           |  19 ++-
 .../gremlin-javascript/test/cucumber/gremlin.js    |  19 +--
 .../test/unit/graphbinary/AnySerializer-test.js    |  16 ++-
 .../gremlin-javascript/test/unit/graphson-test.js  |   4 +-
 gremlin-python/src/main/python/radish/gremlin.py   |  19 +--
 .../gremlin/test/features/map/AsDate.feature       |  12 ++
 47 files changed, 776 insertions(+), 144 deletions(-)

diff --cc CHANGELOG.asciidoc
index 72cce9a950,f50e509d06..8292960326
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@@ -14,77 -14,7 +14,76 @@@ WITHOUT WARRANTIES OR CONDITIONS OF AN
  See the License for the specific language governing permissions and
  limitations under the License.
  ////
 -= TinkerPop3 CHANGELOG
 += TinkerPop CHANGELOG
 +
 +== TinkerPop 4.0.0 (Gremlin's Wildest Dreams)
 +
 +image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/gremlins-wildest-dreams.png[width=185]
 +
 +[[release-4-0-0]]
 +=== TinkerPop 4.0.0 (NOT OFFICIALLY RELEASED YET)
 +
 +* Bumped SLF4j to 2.0.16.
 +* Modified grammar to make `discard()` usage more consistent as a filter step where it can now be used to chain additional traversal steps and be used anonymously.
 +* Bumped GMavenPlus to 4.1.1
 +
 +[[release-4-0-0-beta-1]]
 +=== TinkerPop 4.0.0-beta.1 (January 17, 2025)
 +
 +* Added support for deserialization of `Set` for `gremlin-javascript`.
 +* Added grammar-based `Translator` for all languages including explicit ones for Java and anonymization.
 +* Removed old `Translator` infrastructure.
 +* Removed grammar support for enums to be used as variables.
 +* Changed `valueMap` in grammar to disallow the `boolean` argument as a variable to avoid ambiguous step calls.
 +* Added integer overflow checks for `sum()`.
 +* Modified Gremlin Server to only support instantiation of `authentication.authenticationHandler` with three-arg constructor.
 +* Removed previously deprecated two-arg constructors for `authentication.authenticationHandler` implementations.
 +* Removed previously deprecated one-arg constructor for `AbstractAuthenticationHandler`.
 +* Renamed the traversal discarding `none()` step to `discard()`.
 +* Added new list filtering step `none()`.
 +* Replaced `gremlin-groovy` with `gremlin-lang` as the default language in `gremlin-server`.
 +* Changed `sum()` to retain the type common to the stream rather than always promoting to `long` given the need for it to multiple by the `long` bulk value for the traverser.
 +* Added support for `Set` in GraphSON and GraphBinary serialization for `gremlin-javascript`, where it previously just converted to array.
 +* Added `Set` syntax in `gremlin-language`.
 +* Modified RequestInterceptor to be a `UnaryOperator<HttpRequest>` to abstract the underlying implementation.
 +* Renamed `MergeStep` to `MergeElementStep` as it is a base class to `mergeV()` and `mergeE()`.
 +* Renamed `TraversalMergeStep` of `merge()` to `MergeStep` for consistency.
 +* Removed the `gremlin-archetype` module in favor of newer sample applications in each GLV's `examples` folder.
 +* Bumped to `commons-collection4`.
 +* Made `mergeE()` and `mergeV()` consistent in their use as a start step and as mid-traversal by always promoting the currently created or matched `Element` to the `onCreate` or `onMatch` child traversal.
 +* Switched to HTTP protocol in `gremlin-python` and replaced GraphSONV2, GraphSONV2 & GraphBinaryV1 with GraphBinaryV4
 +* Added support for chunked transfer in `gremlin-python`
 +* Added TypeScript & ECMAScript module support.
 +* Improved graph structures type definitions in TypeScript.
 +* Removed usage of `Bytecode` for Gremlin Server and Java GLV, script engines and `GremlinExecutor` will not be able to handle `Bytecode`.
 +* Removed `Bytecode` based authorization.
 +* Added `GremlinLang` which allows to generate gremlin-lang compatible string based on Traversal.
 +* Removed serialization support for `Bindings` and `Bytecode`.
 +* Changed `EmbeddedRemoteConnection` to prefer the grammar-based translator.
 +* Removed `Client.submit(Traversal)` as a mechanism for submitting traversal, prefer `DriverRemoteConnection` instead.
 +* Removed usage of `Bytecode` from `gremlin-python`.
 +* Added `auth` module in `gremlin-python` for pluggable authentication.
 +* Fixed `GremlinLangScriptEngine` handling for some strategies.
 +* Updated Docker test suite set-up in `gremlin-python` to work with HTTP driver/server.
- * Added `DateTime` serializer for Java and Python according for GraphBinaryV4.
- * Replaced `Date` with `OffsetDateTime` in Java core.
++* Updated `DateTime` serializers for Java and Python according to GraphBinaryV4.
 +* Defined GraphBinaryV4 specification.
 +* Defined GraphSONV4 specification.
 +* Update serializers for `label` of an `Element` as a singleton list of string for GraphBinaryV4.
 +* Added `bulked` byte to `Response Message` serialization for GraphBinaryV4.
 +* Added a `bulked` header set by cluster setting, as well as a with `bulked` request option to turn on the bulking of result data.
 +* Updated `List` and `BulkSet` serializers to implement `bulk` value flag for `List`.
 +* Renamed `maxContentLength` setting for Gremlin Driver to `maxResponseContentLength` and blocked incoming responses that are too large based on total response size.
 +* Renamed `maxContentLength` setting for Gremlin Server to `maxRequestContentLength`.
 +* Added missing strategies to the `TraversalStrategies` global cache as well as `CoreImports` in `gremlin-groovy`.
 +* Added missing strategies to `strategies.py` in `gremlin-python`.
 +* Updated `OptionsStrategy` in `gremlin-python` to take options directly as keyword arguments.
 +* Added static `instance()` method to `ElementIdStrategy` to an instance with the default configuration.
 +* Updated `ElementIdStrategy.getConfiguration()` to help with serialization.
 +* Updated `TraversalStrategyProxy` to utilize strategy names instead of strategy classes
 +* Established mechanism for using customer strategies in remote context by using `TraversalStrategyProxy` in Java, or `TraversalStrategy` in GLVs.
 +* Removed `minSize` setting for Gremlin Driver connection pool since connections are now short-lived HTTP connections
 +* Added `idleConnectionTimeout` setting for Gremlin Driver and automatic closing of idle connections
 +* Enabled TCP Keep-Alive in GremlinServer.
  
  == TinkerPop 3.8.0 (NOT OFFICIALLY NAMED YET)
  
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
index c5f5438ed2,a4d77b0fd2..b248341efb
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
@@@ -323,10 -330,9 +323,11 @@@ public final class CoreImports 
          CLASS_IMPORTS.add(TimeUtil.class);
          CLASS_IMPORTS.add(Lambda.class);
          CLASS_IMPORTS.add(java.util.Date.class);
+         CLASS_IMPORTS.add(java.time.OffsetDateTime.class);
          CLASS_IMPORTS.add(java.sql.Timestamp.class);
          CLASS_IMPORTS.add(java.util.UUID.class);
 +        CLASS_IMPORTS.add(GremlinTranslator.class);
 +        CLASS_IMPORTS.add(Translator.class);
  
          /////////////
          // METHODS //
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 64404a7288,32b830c252..0b7294b389
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@@ -2225,9 -1870,11 +2226,11 @@@ public interface GraphTraversal<S, E> e
       * @return the traversal with an appended {@link DateDiffStep}.
       * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#dateDiff-step" target="_blank">Reference Documentation - dateDiff Step</a>
       * @since 3.7.1
+      * @deprecated As of release 3.8.0, deprecated in favor of {@link GraphTraversal#dateDiff(OffsetDateTime)}.
       */
-     public default GraphTraversal<S, Long> dateDiff(final OffsetDateTime value) {
+     @Deprecated
+     public default GraphTraversal<S, Long> dateDiff(final Date value) {
 -        this.asAdmin().getBytecode().addStep(Symbols.dateDiff, value);
 +        this.asAdmin().getGremlinLang().addStep(Symbols.dateDiff, value);
          return this.asAdmin().addStep(new DateDiffStep<>(this.asAdmin(), value));
      }
  
@@@ -2238,8 -1885,21 +2241,21 @@@
       * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#dateDiff-step" target="_blank">Reference Documentation - dateDiff Step</a>
       * @since 3.7.1
       */
-     public default GraphTraversal<S, Long> dateDiff(final Traversal<?, OffsetDateTime> dateTraversal) {
+     public default GraphTraversal<S, Long> dateDiff(final OffsetDateTime value) {
 -        this.asAdmin().getBytecode().addStep(Symbols.dateDiff, value);
++        this.asAdmin().getGremlinLang().addStep(Symbols.dateDiff, value);
+         return this.asAdmin().addStep(new DateDiffStep<>(this.asAdmin(), value));
+     }
+ 
+     /**
+      * Returns the difference between two dates in epoch time.
+      *
+      * @param dateTraversal a traversal that supplies a {@link OffsetDateTime} object ({@link Date} is also accepted for compatibility).
+      * @return the traversal with an appended {@link DateDiffStep}.
+      * @see <a href="http://tinkerpop.apache.org/docs/${project.version}/reference/#dateDiff-step" target="_blank">Reference Documentation - dateDiff Step</a>
+      * @since 3.7.1
+      */
+     public default GraphTraversal<S, Long> dateDiff(final Traversal<?, ?> dateTraversal) {
 -        this.asAdmin().getBytecode().addStep(Symbols.dateDiff, dateTraversal);
 +        this.asAdmin().getGremlinLang().addStep(Symbols.dateDiff, dateTraversal);
          return this.asAdmin().addStep(new DateDiffStep<>(this.asAdmin(), dateTraversal));
      }
  
diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/GraphBinary.js
index 4b8bafacad,d3cdfd8c1d..4e78e90bbc
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/GraphBinary.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/GraphBinary.js
@@@ -58,43 -58,7 +58,44 @@@
   * @author Igor Ostapenko
   */
  /*eslint-disable*/
 -'use strict';
 +
 +import DataType from './internals/DataType.js';
 +import * as utils from './internals/utils.js';
 +import IntSerializer from './internals/IntSerializer.js';
 +import LongSerializer from './internals/LongSerializer.js';
 +import LongSerializerNg from './internals/LongSerializerNg.js';
 +import StringSerializer from './internals/StringSerializer.js';
 +import DateSerializer from './internals/DateSerializer.js';
++import OffsetDateTimeSerializer from './internals/OffsetDateTimeSerializer.js';
 +import DoubleSerializer from './internals/DoubleSerializer.js';
 +import FloatSerializer from './internals/FloatSerializer.js';
 +import ArraySerializer from './internals/ArraySerializer.js';
 +import MapSerializer from './internals/MapSerializer.js';
 +import SetSerializer from './internals/SetSerializer.js';
 +import UuidSerializer from './internals/UuidSerializer.js';
 +import EdgeSerializer from './internals/EdgeSerializer.js';
 +import PathSerializer from './internals/PathSerializer.js';
 +import PropertySerializer from './internals/PropertySerializer.js';
 +import VertexSerializer from './internals/VertexSerializer.js';
 +import VertexPropertySerializer from './internals/VertexPropertySerializer.js';
 +import BytecodeSerializer from './internals/BytecodeSerializer.js';
 +import PSerializer from './internals/PSerializer.js';
 +import TraverserSerializer from './internals/TraverserSerializer.js';
 +import EnumSerializer from './internals/EnumSerializer.js';
 +import LambdaSerializer from './internals/LambdaSerializer.js';
 +import BigIntegerSerializer from './internals/BigIntegerSerializer.js';
 +import ByteSerializer from './internals/ByteSerializer.js';
 +import ByteBufferSerializer from './internals/ByteBufferSerializer.js';
 +import ShortSerializer from './internals/ShortSerializer.js';
 +import BooleanSerializer from './internals/BooleanSerializer.js';
 +import TextPSerializer from './internals/TextPSerializer.js';
 +import TraversalStrategySerializer from './internals/TraversalStrategySerializer.js';
 +import BulkSetSerializer from './internals/BulkSetSerializer.js';
 +import UnspecifiedNullSerializer from './internals/UnspecifiedNullSerializer.js';
 +import NumberSerializationStrategy from './internals/NumberSerializationStrategy.js';
 +import AnySerializer from './internals/AnySerializer.js';
 +import GraphBinaryReader from './internals/GraphBinaryReader.js';
 +import GraphBinaryWriter from './internals/GraphBinaryWriter.js';
  
  const ioc = {};
  
@@@ -103,85 -67,44 +104,87 @@@ ioc.utils = utils
  
  ioc.serializers = {};
  
 -ioc.intSerializer               = new (require('./internals/IntSerializer'))(ioc);
 -ioc.longSerializer              = new (require('./internals/LongSerializer'))(ioc);
 -ioc.longSerializerNg            = new (require('./internals/LongSerializerNg'))(ioc);
 -ioc.stringSerializer            = new (require('./internals/StringSerializer'))(ioc, ioc.DataType.STRING);
 -ioc.offsetDateTimeSerializer    = new (require('./internals/OffsetDateTimeSerializer'))(ioc, ioc.DataType.OFFSETDATETIME);
 -ioc.dateSerializer              = new (require('./internals/DateSerializer'))(ioc, ioc.DataType.DATE);
 -ioc.timestampSerializer         = new (require('./internals/DateSerializer'))(ioc, ioc.DataType.TIMESTAMP);
 -ioc.classSerializer             = new (require('./internals/StringSerializer'))(ioc, ioc.DataType.CLASS);
 -ioc.doubleSerializer            = new (require('./internals/DoubleSerializer'))(ioc);
 -ioc.floatSerializer             = new (require('./internals/FloatSerializer'))(ioc);
 -ioc.listSerializer              = new (require('./internals/ArraySerializer'))(ioc, ioc.DataType.LIST);
 -ioc.mapSerializer               = new (require('./internals/MapSerializer'))(ioc);
 -ioc.setSerializer               = new (require('./internals/SetSerializer'))(ioc, ioc.DataType.SET);
 -ioc.uuidSerializer              = new (require('./internals/UuidSerializer'))(ioc);
 -ioc.edgeSerializer              = new (require('./internals/EdgeSerializer'))(ioc);
 -ioc.pathSerializer              = new (require('./internals/PathSerializer'))(ioc);
 -ioc.propertySerializer          = new (require('./internals/PropertySerializer'))(ioc);
 -ioc.vertexSerializer            = new (require('./internals/VertexSerializer'))(ioc);
 -ioc.vertexPropertySerializer    = new (require('./internals/VertexPropertySerializer'))(ioc);
 -ioc.bytecodeSerializer          = new (require('./internals/BytecodeSerializer'))(ioc);
 -ioc.pSerializer                 = new (require('./internals/PSerializer'))(ioc);
 -ioc.traverserSerializer         = new (require('./internals/TraverserSerializer'))(ioc);
 -ioc.enumSerializer              = new (require('./internals/EnumSerializer'))(ioc);
 -ioc.lambdaSerializer            = new (require('./internals/LambdaSerializer'))(ioc);
 -ioc.bigIntegerSerializer        = new (require('./internals/BigIntegerSerializer'))(ioc);
 -ioc.byteSerializer              = new (require('./internals/ByteSerializer'))(ioc);
 -ioc.byteBufferSerializer        = new (require('./internals/ByteBufferSerializer'))(ioc);
 -ioc.shortSerializer             = new (require('./internals/ShortSerializer'))(ioc);
 -ioc.booleanSerializer           = new (require('./internals/BooleanSerializer'))(ioc);
 -ioc.textPSerializer             = new (require('./internals/TextPSerializer'))(ioc);
 -ioc.traversalStrategySerializer = new (require('./internals/TraversalStrategySerializer'))(ioc);
 -ioc.bulkSetSerializer           = new (require('./internals/BulkSetSerializer'))(ioc);
 -ioc.unspecifiedNullSerializer   = new (require('./internals/UnspecifiedNullSerializer'))(ioc);
 +ioc.intSerializer = new IntSerializer(ioc);
 +ioc.longSerializer = new LongSerializer(ioc);
 +ioc.longSerializerNg = new LongSerializerNg(ioc);
 +ioc.stringSerializer = new StringSerializer(ioc, ioc.DataType.STRING);
 +ioc.dateSerializer = new DateSerializer(ioc, ioc.DataType.DATE);
++ioc.offsetDateTimeSerializer = new OffsetDateTimeSerializer(ioc, ioc.DataType.OFFSETDATETIME);
 +ioc.timestampSerializer = new DateSerializer(ioc, ioc.DataType.TIMESTAMP);
 +ioc.classSerializer = new StringSerializer(ioc, ioc.DataType.CLASS);
 +ioc.doubleSerializer = new DoubleSerializer(ioc);
 +ioc.floatSerializer = new FloatSerializer(ioc);
 +ioc.listSerializer = new ArraySerializer(ioc, ioc.DataType.LIST);
 +ioc.mapSerializer = new MapSerializer(ioc);
 +ioc.setSerializer = new SetSerializer(ioc, ioc.DataType.SET);
 +ioc.uuidSerializer = new UuidSerializer(ioc);
 +ioc.edgeSerializer = new EdgeSerializer(ioc);
 +ioc.pathSerializer = new PathSerializer(ioc);
 +ioc.propertySerializer = new PropertySerializer(ioc);
 +ioc.vertexSerializer = new VertexSerializer(ioc);
 +ioc.vertexPropertySerializer = new VertexPropertySerializer(ioc);
 +ioc.bytecodeSerializer = new BytecodeSerializer(ioc);
 +ioc.pSerializer = new PSerializer(ioc);
 +ioc.traverserSerializer = new TraverserSerializer(ioc);
 +ioc.enumSerializer = new EnumSerializer(ioc);
 +ioc.lambdaSerializer = new LambdaSerializer(ioc);
 +ioc.bigIntegerSerializer = new BigIntegerSerializer(ioc);
 +ioc.byteSerializer = new ByteSerializer(ioc);
 +ioc.byteBufferSerializer = new ByteBufferSerializer(ioc);
 +ioc.shortSerializer = new ShortSerializer(ioc);
 +ioc.booleanSerializer = new BooleanSerializer(ioc);
 +ioc.textPSerializer = new TextPSerializer(ioc);
 +ioc.traversalStrategySerializer = new TraversalStrategySerializer(ioc);
 +ioc.bulkSetSerializer = new BulkSetSerializer(ioc);
 +ioc.unspecifiedNullSerializer = new UnspecifiedNullSerializer(ioc);
 +
 +ioc.numberSerializationStrategy = new NumberSerializationStrategy(ioc);
 +ioc.anySerializer = new AnySerializer(ioc);
 +
 +ioc.graphBinaryReader = new GraphBinaryReader(ioc);
 +ioc.graphBinaryWriter = new GraphBinaryWriter(ioc);
  
 -ioc.numberSerializationStrategy = new (require('./internals/NumberSerializationStrategy'))(ioc);
 -ioc.anySerializer               = new (require('./internals/AnySerializer'))(ioc);
 +export { default as DataType } from './internals/DataType.js';
  
 -ioc.graphBinaryReader           = new (require('./internals/GraphBinaryReader.js'))(ioc);
 -ioc.graphBinaryWriter           = new (require('./internals/GraphBinaryWriter'))(ioc);
 +export const {
 +  serializers,
 +  intSerializer,
 +  longSerializer,
 +  longSerializerNg,
 +  stringSerializer,
 +  dateSerializer,
++  offsetDateTimeSerializer,
 +  timestampSerializer,
 +  classSerializer,
 +  doubleSerializer,
 +  floatSerializer,
 +  listSerializer,
 +  mapSerializer,
 +  setSerializer,
 +  uuidSerializer,
 +  edgeSerializer,
 +  pathSerializer,
 +  propertySerializer,
 +  vertexSerializer,
 +  vertexPropertySerializer,
 +  bytecodeSerializer,
 +  pSerializer,
 +  traverserSerializer,
 +  enumSerializer,
 +  lambdaSerializer,
 +  bigIntegerSerializer,
 +  byteSerializer,
 +  byteBufferSerializer,
 +  shortSerializer,
 +  booleanSerializer,
 +  textPSerializer,
 +  traversalStrategySerializer,
 +  bulkSetSerializer,
 +  unspecifiedNullSerializer,
 +  numberSerializationStrategy,
 +  anySerializer,
 +  graphBinaryReader,
 +  graphBinaryWriter,
 +} = ioc;
  
 -module.exports = ioc;
 +export default ioc;
diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/graph-serializer.ts
index ba2f4dd088,e022d9ef58..cc7cb93381
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/graph-serializer.ts
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/graph-serializer.ts
@@@ -20,39 -20,11 +20,40 @@@
  /**
   * @author Jorge Bay Gondra
   */
 -'use strict';
  
 -const { Buffer } = require('buffer');
 -const typeSerializers = require('./type-serializers');
 -const Bytecode = require('../../process/bytecode');
 +import { Buffer } from 'buffer';
 +import Bytecode from '../../process/bytecode.js';
 +import {
 +  BulkSetSerializer,
 +  BytecodeSerializer,
 +  DateSerializer,
++  OffsetDateTimeSerializer,
 +  DirectionSerializer,
 +  EdgeSerializer,
 +  EnumSerializer,
 +  LambdaSerializer,
 +  ListSerializer,
 +  LongSerializer,
 +  MapSerializer,
 +  NumberSerializer,
 +  PSerializer,
 +  Path3Serializer,
 +  PropertySerializer,
 +  SetSerializer,
 +  TSerializer,
 +  TextPSerializer,
 +  TraversalStrategySerializer,
 +  TraverserSerializer,
 +  TypeSerializer,
 +  VertexPropertySerializer,
 +  VertexSerializer,
 +  typeKey,
 +  valueKey,
 +} from './type-serializers.js';
 +
 +export type GraphWriterOptions = {
 +  serializers?: Record<string, TypeSerializer<any>>;
 +};
  
  /**
   * GraphSON2 writer.
@@@ -290,22 -246,23 +290,23 @@@ export class GraphSON3Reader extends Gr
  }
  
  const graphSON2Deserializers = {
 -  'g:Traverser': typeSerializers.TraverserSerializer,
 -  'g:TraversalStrategy': typeSerializers.TraversalStrategySerializer,
 -  'g:Int32': typeSerializers.NumberSerializer,
 -  'g:Int64': typeSerializers.NumberSerializer,
 -  'g:Float': typeSerializers.NumberSerializer,
 -  'g:Double': typeSerializers.NumberSerializer,
 -  'g:Date': typeSerializers.DateSerializer,
 -  'gx:OffsetDateTime': typeSerializers.OffsetDateTimeSerializer,
 -  'g:Direction': typeSerializers.DirectionSerializer,
 -  'g:Vertex': typeSerializers.VertexSerializer,
 -  'g:Edge': typeSerializers.EdgeSerializer,
 -  'g:VertexProperty': typeSerializers.VertexPropertySerializer,
 -  'g:Property': typeSerializers.PropertySerializer,
 -  'g:Path': typeSerializers.Path3Serializer,
 -  'g:TextP': typeSerializers.TextPSerializer,
 -  'g:T': typeSerializers.TSerializer,
 -  'g:BulkSet': typeSerializers.BulkSetSerializer,
 +  'g:Traverser': TraverserSerializer,
 +  'g:TraversalStrategy': TraversalStrategySerializer,
 +  'g:Int32': NumberSerializer,
 +  'g:Int64': NumberSerializer,
 +  'g:Float': NumberSerializer,
 +  'g:Double': NumberSerializer,
 +  'g:Date': DateSerializer,
++  'gx:OffsetDateTime': OffsetDateTimeSerializer,
 +  'g:Direction': DirectionSerializer,
 +  'g:Vertex': VertexSerializer,
 +  'g:Edge': EdgeSerializer,
 +  'g:VertexProperty': VertexPropertySerializer,
 +  'g:Property': PropertySerializer,
 +  'g:Path': Path3Serializer,
 +  'g:TextP': TextPSerializer,
 +  'g:T': TSerializer,
 +  'g:BulkSet': BulkSetSerializer,
  };
  
  const graphSON3Deserializers = Object.assign({}, graphSON2Deserializers, {
@@@ -315,23 -272,31 +316,24 @@@
  });
  
  const graphSON2Serializers = [
 -  typeSerializers.NumberSerializer,
 -  typeSerializers.OffsetDateTimeSerializer,
 -  typeSerializers.BytecodeSerializer,
 -  typeSerializers.TraverserSerializer,
 -  typeSerializers.TraversalStrategySerializer,
 -  typeSerializers.PSerializer,
 -  typeSerializers.TextPSerializer,
 -  typeSerializers.LambdaSerializer,
 -  typeSerializers.EnumSerializer,
 -  typeSerializers.VertexSerializer,
 -  typeSerializers.EdgeSerializer,
 -  typeSerializers.LongSerializer,
 +  NumberSerializer,
 +  DateSerializer,
++  OffsetDateTimeSerializer,
 +  BytecodeSerializer,
 +  TraverserSerializer,
 +  TraversalStrategySerializer,
 +  PSerializer,
 +  TextPSerializer,
 +  LambdaSerializer,
 +  EnumSerializer,
 +  VertexSerializer,
 +  EdgeSerializer,
 +  LongSerializer,
  ];
  
 -const graphSON3Serializers = graphSON2Serializers.concat([
 -  typeSerializers.ListSerializer,
 -  typeSerializers.SetSerializer,
 -  typeSerializers.MapSerializer,
 -]);
 -
 -module.exports = {
 -  GraphSON3Writer,
 -  GraphSON3Reader,
 -  GraphSON2Writer,
 -  GraphSON2Reader,
 -  GraphSONWriter: GraphSON3Writer,
 -  GraphSONReader: GraphSON3Reader,
 -};
 +// @ts-expect-error
 +const graphSON3Serializers = graphSON2Serializers.concat([ListSerializer, SetSerializer, MapSerializer]);
 +
 +export const GraphSONWriter = GraphSON3Writer;
 +
 +export const GraphSONReader = GraphSON3Reader;
diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.ts
index f483e59376,dc9c705f88..96190f074f
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.ts
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.ts
@@@ -89,26 -85,34 +89,43 @@@ export class NumberSerializer extends T
      return typeof value === 'number';
    }
  }
- 
++// consolidate into DateTime when implementing HTTP for js
 +export class DateSerializer extends TypeSerializer<Date> {
 +  serialize(item: Date) {
 +    return {
 +      [typeKey]: 'g:Date',
 +      [valueKey]: item.getTime(),
 +    };
 +  }
  
 -class DateSerializer extends TypeSerializer {
 -  // only deserialize g:Date objects
 -  deserialize(obj) {
 +  deserialize(obj: SerializedValue) {
      return new Date(obj[valueKey]);
    }
 +
 +  canBeUsedFor(value: unknown) {
 +    return value instanceof Date;
 +  }
  }
  
 -class OffsetDateTimeSerializer extends TypeSerializer {
 -  // Date objects are serialized as OffsetDateTime by default
 -  serialize(item) {
++export class OffsetDateTimeSerializer extends TypeSerializer<Date> {
++  serialize(item: Date) {
+     return {
+       [typeKey]: 'gx:OffsetDateTime',
 -      [valueKey]: item.toISOString(),
++      [valueKey]: item.getTime(),
+     };
+   }
+ 
 -  deserialize(obj) {
++  deserialize(obj: SerializedValue) {
+     return new Date(obj[valueKey]);
+   }
+ 
 -  canBeUsedFor(value) {
++  canBeUsedFor(value: unknown) {
+     return value instanceof Date;
+   }
+ }
+ 
 -class LongSerializer extends TypeSerializer {
 -  serialize(item) {
 +export class LongSerializer extends TypeSerializer<utils.Long> {
 +  serialize(item: utils.Long) {
      return {
        [typeKey]: 'g:Int64',
        [valueKey]: item.value,