diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
index c3b6f9b92d..619bab842a 100644
--- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
+++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
@@ -565,7 +565,7 @@ signals:
      * restrictions on permissible scale values imposed by the domain.
      * @function MyAvatar.targetScaleChanged
      * @param {number} targetScale - The avatar's target scale.
-     * @returns Signal
+     * @returns {*} Signal
      */
     void targetScaleChanged(float targetScale);
 
diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp
index fc28ad9e02..ef792dd328 100644
--- a/libraries/avatars/src/AvatarData.cpp
+++ b/libraries/avatars/src/AvatarData.cpp
@@ -2857,14 +2857,24 @@ glm::mat4 AvatarData::getControllerRightHandMatrix() const {
  * @property {boolean} intersects - <code>true</code> if an avatar is intersected, <code>false</code> if it isn't.
  * @property {string} avatarID - The ID of the avatar that is intersected.
  * @property {number} distance - The distance from the ray origin to the intersection.
- * @property {string} face - The name of the box face that is intersected; <code>"UNKNOWN_FACE"</code> if mesh was picked
- *     against.
+ * @property {string} face - The name of the box face that is intersected; <code>"UNKNOWN_FACE"</code> if mesh was picked against.
  * @property {Vec3} intersection - The ray intersection point in world coordinates.
  * @property {Vec3} surfaceNormal - The surface normal at the intersection point.
  * @property {number} jointIndex - The index of the joint intersected.
  * @property {SubmeshIntersection} extraInfo - Extra information on the mesh intersected if mesh was picked against,
  *     <code>{}</code> if it wasn't.
  */
+
+ /*@jsdoc
+ * Information about a parabola-to-avatar intersection.
+ * @typedef {Object} ParabolaToAvatarIntersectionParameters
+ * @property {PickParabola} pick - The pick used for the intersection calculation.
+ * @property {Uuid[]} avatarsToInclude - List of avatars to include in the intersection check.
+ * @property {Uuid[]} avatarsToDiscard - List of avatars to exclude from the intersection check.
+ * 
+ * @typedef {RayToAvatarIntersectionResult} ParabolaToAvatarIntersectionResult
+ */
+
 ScriptValue RayToAvatarIntersectionResultToScriptValue(ScriptEngine* engine, const RayToAvatarIntersectionResult& value) {
     ScriptValue obj = engine->newObject();
     obj.setProperty("intersects", value.intersects);
diff --git a/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h b/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h
index 99004f9f41..567dbd0657 100644
--- a/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h
+++ b/libraries/controllers/src/controllers/impl/MappingBuilderProxy.h
@@ -116,9 +116,9 @@ class UserInputMapper;
  * A filter in a {@link Controller.MappingJSONRoute}.
  * @typedef {object} Controller.MappingJSONFilter
  * @property {string} type - The name of the filter, being the name of the one of the {@link RouteObject}'s filter methods.
- * @property {string} [?] - If the filter method has a first parameter, the property name is the name of that parameter and the 
+ * @property {string} [_1] - If the filter method has a first parameter, the property name is the name of that parameter and the 
  *     property value is the value to use.
- * @property {string} [?] - If the filter method has a second parameter, the property name  is the name of that parameter and 
+ * @property {string} [_2] - If the filter method has a second parameter, the property name  is the name of that parameter and 
  *     the property value is the value to use.
  * @example <caption>A hysteresis filter.</caption>
  * { 
diff --git a/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h b/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h
index da3e3ec26b..8879d3611b 100644
--- a/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h
+++ b/libraries/controllers/src/controllers/impl/RouteBuilderProxy.h
@@ -71,7 +71,7 @@ class RouteBuilderProxy : public QObject {
          * routes using the same input are processed.
          * <p>This is a QML-specific version of {@link MappingObject#when|when}: use this version in QML files.</p>
          * @function RouteObject#whenQml
-         * @param {condition|condition[]} expression - <p>A <code>condition</code> may be a:</p>
+         * @param { boolean | boolean[] | number | number[] } expression - <p>A <code>condition</code> may be a:</p>
          *     <ul>
          *         <li>A boolean or numeric {@link Controller.Hardware} property, which is evaluated as a boolean.</li>
          *         <li><code>!</code> followed by a {@link Controller.Hardware} property, indicating the logical NOT should be
@@ -165,7 +165,7 @@ class RouteBuilderProxy : public QObject {
          * the input is read only if the condition is <code>true</code>. Thus, if the condition is not met then subsequent 
          * routes using the same input are processed.
          * @function RouteObject#when
-         * @param {condition|condition[]} expression - <p>A <code>condition</code> may be a:</p>
+         * @param { boolean | boolean[] | number | number[] } expression - <p>A <code>condition</code> may be a:</p>
          *     <ul>
          *         <li>A numeric {@link Controller.Hardware} property, which is evaluated as a boolean.</li>
          *         <li><code>!</code> followed by a {@link Controller.Hardware} property to use the logical NOT of the property 
diff --git a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h
index 2412a17d1a..0b615e2647 100644
--- a/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h
+++ b/libraries/graphics-scripting/src/graphics-scripting/GraphicsScriptingInterface.h
@@ -48,7 +48,7 @@ public slots:
      * Gets a handle to the model data used for displaying an avatar, 3D entity, or 3D overlay.
      * <p>Note: The model data may be used for more than one instance of the item displayed in the scene.</p>
      * @function Graphics.getModel
-     * @param {UUID} id - The ID of the avatar, 3D entity, or 3D overlay.
+     * @param {Uuid} id - The ID of the avatar, 3D entity, or 3D overlay.
      * @returns {GraphicsModel} The model data for the avatar, entity, or overlay, as displayed. This includes the results of
      *     applying any {@link Entities.EntityProperties-Material|Material} entities to the item.
      * @example <caption>Report some details of your avatar's model.</caption>
diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp b/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp
index 0387b66da4..5c4fae7944 100644
--- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp
+++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableMesh.cpp
@@ -261,7 +261,7 @@ bool scriptable::ScriptableMesh::setVertexProperty(glm::uint32 vertexIndex, cons
 
 /*@jsdoc
  * Called for each vertex when {@link GraphicsMesh.updateVertexAttributes} is called.
- * @callback GraphicsMesh~forEachVertextCallback
+ * @callback GraphicsMesh~forEachVertexCallback
  * @param {Object<Graphics.BufferTypeName, Graphics.BufferType>} attributes - The attributes  of the vertex.
  * @param {number} index - The vertex index.
  * @param {object} properties - The properties of the mesh, per {@link GraphicsMesh}.
diff --git a/libraries/graphics-scripting/src/graphics-scripting/ScriptableMeshPart.h b/libraries/graphics-scripting/src/graphics-scripting/ScriptableMeshPart.h
index cb06b39710..de5ba3ac13 100644
--- a/libraries/graphics-scripting/src/graphics-scripting/ScriptableMeshPart.h
+++ b/libraries/graphics-scripting/src/graphics-scripting/ScriptableMeshPart.h
@@ -116,7 +116,7 @@ namespace scriptable {
 
         /*@jsdoc
          * Gets the value of an attribute for all vertices in the <em>whole</em> mesh (i.e., parent and mesh parts).
-         * @function GraphicsMeshPArt.queryVertexAttributes
+         * @function GraphicsMeshPart.queryVertexAttributes
          * @param {Graphics.BufferTypeName} name - The name of the attribute to get the vertex values of.
          * @throws Throws an error if the <code>name</code> is invalid or isn't used in the mesh.
          * @returns {Graphics.BufferType[]} The attribute values for all vertices.
@@ -230,7 +230,7 @@ namespace scriptable {
         /*@jsdoc
          * Removes an attribute from all vertices in the <em>whole</em> mesh (i.e., parent and mesh parts).
          * <p>Note: The <code>"position"</code> attribute cannot be removed.</p>
-         * @function GraphicsMeshPArt.removeAttribute
+         * @function GraphicsMeshPart.removeAttribute
          * @param {Graphics.BufferTypeName} name - The name of the attribute to remove.
          * @returns {boolean} <code>true</code> if the attribute existed and was removed, <code>false</code> otherwise.
          */
@@ -255,7 +255,7 @@ namespace scriptable {
         /*@jsdoc
          * Replaces a mesh part with a copy of another mesh part.
          * @function GraphicsMeshPart.replaceMeshPartData
-         * @param {GrphicsMeshPart} source - The mesh part to copy.
+         * @param {GraphicsMeshPart} source - The mesh part to copy.
          * @param {Graphics.BufferTypeName[]} [attributes] - The attributes to copy. If not specified, all attributes are 
          *     copied from the source.
          * @throws Throws an error if the mesh part of source mesh part aren't valid.
@@ -291,7 +291,7 @@ namespace scriptable {
 
         /*@jsdoc
          * Calls a function for each vertex in the <em>whole</em> mesh (i.e., parent and mesh parts).
-         * @function GraphicsMeshPArt.forEachVertex
+         * @function GraphicsMeshPart.forEachVertex
          * @param {GraphicsMesh~forEachVertexCallback} callback - The function to call for each vertex.
          * @returns {number} The number of vertices the callback was called for.
          */
diff --git a/libraries/midi/src/Midi.h b/libraries/midi/src/Midi.h
index ee1ba6e8b3..1ebe653734 100644
--- a/libraries/midi/src/Midi.h
+++ b/libraries/midi/src/Midi.h
@@ -143,8 +143,8 @@ public slots:
     /*@jsdoc
      * Unblocks a MIDI device's input or output.
      * @function Midi.unblockMidiDevice
-     * @param {string} name- The name of the MIDI device to unblock.
-     * @param {boolean} output -  <code>true</code> to unblock the device's output, <code>false</code> to unblock its input.
+     * @param {string} name - The name of the MIDI device to unblock.
+     * @param {boolean} output - <code>true</code> to unblock the device's output, <code>false</code> to unblock its input.
      */
     Q_INVOKABLE void unblockMidiDevice(QString name, bool output);
 
diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp
index 5f87c31b86..44f701b693 100644
--- a/libraries/networking/src/AssetClient.cpp
+++ b/libraries/networking/src/AssetClient.cpp
@@ -132,7 +132,8 @@ MiniPromise::Promise AssetClient::cacheInfoRequestAsync(MiniPromise::Promise def
  * @property {object} [rawHeaders] - The raw headers that are set in the meta data. <em>Not used.</em>
  * @property {boolean} [saveToDisk] - <code>true</code> if the cache item is allowed to be store on disk,
  *     <code>false</code> if it isn't.
- * @property {string} [url|metaDataURL] - The ATP URL of the cached item.
+ * @property {string} [url] - The ATP URL of the cached item.
+ * @property {string} [metaDataURL] - The ATP URL of the cached item.
  */
 MiniPromise::Promise AssetClient::queryCacheMetaAsync(const QUrl& url, MiniPromise::Promise deferred) {
     if (QThread::currentThread() != thread()) {
@@ -235,7 +236,7 @@ namespace {
  * @typedef {object} Assets.SaveToCacheHeaders
  * @property {string} [expires] - The date and time the cache value expires, in the format:
  *     <code>"ddd, dd MMM yyyy HH:mm:ss"</code>. The default value is an invalid date, representing "never expires".
- * @property {string} [last-modified] - The date and time the cache value was last modified, in the format:
+ * @property {string} ["last-modified"] - The date and time the cache value was last modified, in the format:
  *     <code>"ddd, dd MMM yyyy HH:mm:ss"</code>. The default value is the current date and time.
  */
 /*@jsdoc
diff --git a/libraries/physics/src/ObjectDynamic.cpp b/libraries/physics/src/ObjectDynamic.cpp
index 4c20bc1e21..cb70059f24 100644
--- a/libraries/physics/src/ObjectDynamic.cpp
+++ b/libraries/physics/src/ObjectDynamic.cpp
@@ -106,14 +106,14 @@ bool ObjectDynamic::updateArguments(QVariantMap arguments) {
  *     <code>0</code> means that the action should not be deleted.
  * @property {boolean} isMine=true - <code>true</code> if the action was created during the current client session, 
  *     <code>false</code> if it wasn't. <em>Read-only.</em>
- * @property {boolean} ::no-motion-state - Is present with a value of <code>true</code> when the entity hasn't been registered 
+ * @property {boolean} 'no-motion-state' - Is present with a value of <code>true</code> when the entity hasn't been registered 
  *     with the physics engine yet (e.g., if the action hasn't been properly configured), otherwise the property is 
  *     <code>undefined</code>. <em>Read-only.</em>
- * @property {boolean} ::active - <code>true</code> when the action is modifying the entity's motion, <code>false</code> 
+ * @property {boolean} 'active' - <code>true</code> when the action is modifying the entity's motion, <code>false</code> 
  *     otherwise. Is present once the entity has been registered with the physics engine, otherwise the property is 
  *     <code>undefined</code>. 
  *     <em>Read-only.</em>
- * @property {Entities.PhysicsMotionType} ::motion-type - How the entity moves with the action. Is present once the entity has 
+ * @property {Entities.PhysicsMotionType} 'motion-type' - How the entity moves with the action. Is present once the entity has 
  *     been registered with the physics engine, otherwise the property is <code>undefined</code>. <em>Read-only.</em>
  *
  * @comment The different action types have additional arguments as follows:
diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h
index 0265b5e35b..a419bd73f2 100644
--- a/libraries/render-utils/src/GeometryCache.h
+++ b/libraries/render-utils/src/GeometryCache.h
@@ -45,6 +45,19 @@ typedef QPair<Vec3Pair, Vec4Pair> Vec3PairVec4Pair;
 typedef QPair<Vec4Pair, glm::vec4> Vec4PairVec4;
 typedef QPair<Vec4Pair, Vec4Pair> Vec4PairVec4Pair;
 
+/*@jsdoc
+ * **Note:** This is just scaffolding and has not been properly implemented.
+ * @typedef {Object} Vec3Pair
+ * @property {Vec3} first - The first 3D vector.
+ * @property {Vec3} second - The second 3D vector.
+ * 
+ * @example <caption>Creating a pair of vec3 objects to represent two 3D vectors.</caption>
+ * const myVec3Pair = {
+ *   first: new vec3(1.0, 0.0, 0.0),  // First vector pointing along the X-axis
+ *   second: new vec3(0.0, 1.0, 0.0) // Second vector pointing along the Y-axis
+ * };
+ */
+
 inline uint qHash(const Vec2FloatPairPair& v, uint seed) {
     // multiply by prime numbers greater than the possible size
     return qHash(v.first.first.x + 5009 * v.first.first.y + 5011 * v.first.second +
diff --git a/libraries/script-engine/src/AssetScriptingInterface.cpp b/libraries/script-engine/src/AssetScriptingInterface.cpp
index fe11582abf..a37fee33b3 100644
--- a/libraries/script-engine/src/AssetScriptingInterface.cpp
+++ b/libraries/script-engine/src/AssetScriptingInterface.cpp
@@ -455,6 +455,33 @@ void AssetScriptingInterface::compressData(const ScriptValue& options, const Scr
  * @property {string} [url] - The <code>atp:</code> URL of the content: using the path if specified, otherwise the hash.
  * @property {string} [path] - The uploaded content's mapped path, if specified.
  */
+ /*@jsdoc
+ * Content and delete options for {@link Assets.deleteAsset}.
+ * 
+ * **Note:** This is just scaffolding and has not been properly implemented yet.
+ * 
+ * @typedef {Object} Assets.DeleteOptions
+ * @property {string | ArrayBuffer} data - The content to upload.
+ * @property {string} [path] - A user-friendly path for the file in the asset server. May have a leading `"atp:"`.
+ * 
+ * If not specified, no path-to-hash mapping is set.
+ * 
+ * **Warning:** The asset server destroys any unmapped SHA256-named file at server restart. Either set the mapping path
+ * with this property or use {@link Assets.setMapping} to set a path-to-hash mapping for the uploaded file.
+ */
+
+/*@jsdoc
+ * Result value returned by {@link Assets.putAsset}.
+ * 
+ * **Note:** This is just scaffolding and has not been properly implemented yet.
+ * 
+ * @typedef {Object} Assets.DeleteResult
+ * @property {number} [byteLength] - The number of bytes in the hash file stored on the asset server.
+ * @property {string} [contentType] - `"application/gzip"` if the content stored is gzip compressed.
+ * @property {string} [url] - The `atp:` URL of the content: using the path if specified, otherwise the hash.
+ * @property {string} [path] - The uploaded content's mapped path, if specified.
+ */
+
 void AssetScriptingInterface::putAsset(const ScriptValue& options, const ScriptValue& scope, const ScriptValue& callback) {
     auto compress = options.property("compress").toBool() || options.property("compressed").toBool();
     auto data = options.isObject() ? options.property("data") : options;
diff --git a/libraries/script-engine/src/ConsoleScriptingInterface.h b/libraries/script-engine/src/ConsoleScriptingInterface.h
index bfa6d42ecb..c8f4c46f89 100644
--- a/libraries/script-engine/src/ConsoleScriptingInterface.h
+++ b/libraries/script-engine/src/ConsoleScriptingInterface.h
@@ -56,7 +56,7 @@ public:
      * Logs an "INFO" message to the program log and triggers {@link Script.infoMessage}. 
      * The message logged is "INFO -" followed by the message values separated by spaces.
      * @function console.info
-     * @param {...*} [message] - The message values to log.
+     * @param {*} [message] - The message values to log.
      */
     static ScriptValue info(ScriptContext* context, ScriptEngine* engine);
 
@@ -65,7 +65,7 @@ public:
      * The message logged is the message values separated by spaces.
      * <p>If a {@link console.group} is in effect, the message is indented by an amount proportional to the group level.</p>
      * @function console.log
-     * @param {...*} [message] - The message values to log.
+     * @param {*} [message] - The message values to log.
      * @example <caption>Log some values.</caption>
      * Script.printedMessage.connect(function (message, scriptName) {
      *     console.info("Console.log message:", "\"" + message + "\"", "in", "[" + scriptName + "]");
@@ -82,7 +82,7 @@ public:
      * Logs a message to the program log and triggers {@link Script.printedMessage}.
      * The message logged is the message values separated by spaces.
      * @function console.debug
-     * @param {...*} [message] - The message values to log.
+     * @param {*} [message] - The message values to log.
      */
     static ScriptValue debug(ScriptContext* context, ScriptEngine* engine);
 
@@ -90,7 +90,7 @@ public:
      * Logs a "WARNING" message to the program log and triggers {@link Script.warningMessage}.
      * The message logged is "WARNING - " followed by the message values separated by spaces.
      * @function console.warn
-     * @param {...*} [message] - The message values to log.
+     * @param {*} [message] - The message values to log.
      */
     static ScriptValue warn(ScriptContext* context, ScriptEngine* engine);
 
@@ -98,7 +98,7 @@ public:
      * Logs an "ERROR" message to the program log and triggers {@link Script.errorMessage}.
      * The message logged is "ERROR - " followed by the message values separated by spaces.
      * @function console.error
-     * @param {...*} [message] - The message values to log.
+     * @param {*} [message] - The message values to log.
      */
     static ScriptValue error(ScriptContext* context, ScriptEngine* engine);
 
@@ -107,7 +107,7 @@ public:
      * Logs an "ERROR" message to the program log and triggers {@link Script.errorMessage}.
      * The message logged is "ERROR - " followed by the message values separated by spaces.
      * @function console.exception
-     * @param {...*} [message] - The message values to log.
+     * @param {*} [message] - The message values to log.
      */
     static ScriptValue exception(ScriptContext* context, ScriptEngine* engine);
 
@@ -117,7 +117,7 @@ public:
      * <p>Note: Script execution continues whether or not the test condition fails.</p>
      * @function console.assert
      * @param {boolean} assertion - The test condition value.
-     * @param {...*} [message] - The message values to log if the assertion evaluates to <code>false</code>.
+     * @param {*} [message] - The message values to log if the assertion evaluates to <code>false</code>.
      * @example <caption>Demonstrate assertion behavior.</caption>
      * Script.errorMessage.connect(function (message, scriptName) {
      *     console.info("Error message logged:", "\"" + message + "\"", "in", "[" + scriptName + "]");
diff --git a/libraries/script-engine/src/ScriptManager.cpp b/libraries/script-engine/src/ScriptManager.cpp
index 58fee1f06d..07527cd68b 100644
--- a/libraries/script-engine/src/ScriptManager.cpp
+++ b/libraries/script-engine/src/ScriptManager.cpp
@@ -782,7 +782,7 @@ void ScriptManager::init() {
      * The message logged is the message values separated by spaces.
      * <p>Alternatively, you can use {@link Script.print} or one of the {@link console} API methods.</p>
      * @function print
-     * @param {...*} [message] - The message values to print.
+     * @param {*} [message] - The message values to print.
      */
     scriptEngine->globalObject().setProperty("print", scriptEngine->newFunction(debugPrint));
 
diff --git a/libraries/script-engine/src/ScriptManager.h b/libraries/script-engine/src/ScriptManager.h
index 7185d3e615..e07e91efae 100644
--- a/libraries/script-engine/src/ScriptManager.h
+++ b/libraries/script-engine/src/ScriptManager.h
@@ -580,7 +580,7 @@ public:
      * @brief Registers a global object by name.
      *
      * @param valueName
-     * @param value
+     * @param string
      */
     Q_INVOKABLE void registerValue(const QString& valueName, ScriptValue value);
 
diff --git a/libraries/script-engine/src/ScriptManagerScriptingInterface.h b/libraries/script-engine/src/ScriptManagerScriptingInterface.h
index 0a2ccb66e3..7bdb61feff 100644
--- a/libraries/script-engine/src/ScriptManagerScriptingInterface.h
+++ b/libraries/script-engine/src/ScriptManagerScriptingInterface.h
@@ -162,7 +162,7 @@ public:
      * registers a global object by name.
      * @function Script.registerValue
      * @param {string} valueName
-     * @param {value} value
+     * @param {*} value
      */
     /// registers a global object by name
     Q_INVOKABLE void registerValue(const QString& valueName, ScriptValue value) { _manager->registerValue(valueName, value); }
@@ -547,8 +547,8 @@ public:
 
     /*@jsdoc
      * Create test object for garbage collector debugging.
-     * @function Script.createGarbageCollectorDebuggingObject()
-     * @Returns Test object.
+     * @function Script.createGarbageCollectorDebuggingObject
+     * @Returns {*} Test object.
      */
      Q_INVOKABLE ScriptValue createGarbageCollectorDebuggingObject();
 
@@ -800,7 +800,7 @@ protected:
     /*@jsdoc
      * @function Script.executeOnScriptThread
      * @param {function} function - Function.
-     * @param {ConnectionType} [type=2] - Connection type.
+     * @param {*} [type=2] - Connection type.
      * @deprecated This function is deprecated and will be removed.
      */
     // V8TODO: Nothing seems to be using this, and it generates:
diff --git a/libraries/shared/src/DebugDraw.h b/libraries/shared/src/DebugDraw.h
index c5ba290514..ce63f436f2 100644
--- a/libraries/shared/src/DebugDraw.h
+++ b/libraries/shared/src/DebugDraw.h
@@ -95,7 +95,7 @@ public:
      * @param {Quat} rotation - The orientation of the marker in world coordinates.
      * @param {Vec3} position - The position of the market in world coordinates.
      * @param {Vec4} color - The color of the marker.
-     * @param {float} size - A float between 0.0 and 1.0 (10 cm) to control the size of the marker.
+     * @param {number} size - A float between 0.0 and 1.0 (10 cm) to control the size of the marker.
      * @example <caption>Briefly draw a debug marker in front of your avatar, in world coordinates.</caption>
      * var MARKER_NAME = "my marker";
      * DebugDraw.addMarker(
@@ -128,7 +128,7 @@ public:
      * @param {Quat} rotation - The orientation of the marker in avatar coordinates.
      * @param {Vec3} position - The position of the market in avatar coordinates.
      * @param {Vec4} color - color of the marker.
-     * @param {float} size - A float between 0.0 and 1.0 (10 cm) to control the size of the marker.
+     * @param {number} size - A float between 0.0 and 1.0 (10 cm) to control the size of the marker.
      * @example <caption>Briefly draw a debug marker in front of your avatar, in avatar coordinates.</caption>
      * var MARKER_NAME = "My avatar marker";
      * DebugDraw.addMyAvatarMarker(
diff --git a/libraries/ui/src/QmlFragmentClass.h b/libraries/ui/src/QmlFragmentClass.h
index ea42125a9a..b432c379a7 100644
--- a/libraries/ui/src/QmlFragmentClass.h
+++ b/libraries/ui/src/QmlFragmentClass.h
@@ -36,7 +36,7 @@ public:
     /*@jsdoc
      * Creates a new button, adds it to this and returns it.
      * @function QmlFragmentClass#addButton
-     * @param properties {object} button properties 
+     * @param {object} properties - button properties 
      * @returns {TabletButtonProxy}
      */
     Q_INVOKABLE QObject* addButton(const QVariant& properties);
diff --git a/tools/jsdoc/CMakeLists.txt b/tools/jsdoc/CMakeLists.txt
index 5a062b7ee9..382147cc7d 100644
--- a/tools/jsdoc/CMakeLists.txt
+++ b/tools/jsdoc/CMakeLists.txt
@@ -10,12 +10,14 @@ set(JSDOC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
 file(TO_NATIVE_PATH ${JSDOC_WORKING_DIR}/node_modules/.bin/jsdoc JSDOC_PATH)
 file(TO_NATIVE_PATH ${JSDOC_WORKING_DIR}/config.json JSDOC_CONFIG_PATH)
 file(TO_NATIVE_PATH ${JSDOC_OUTPUT_DIR}/out OUTPUT_DIR)
+file(TO_NATIVE_PATH ${OVERTE_TSD_JSDOC_DIR}/overte-tsd-jsdoc)
 file(TO_NATIVE_PATH ${JSDOC_WORKING_DIR}/root.js NATIVE_JSDOC_WORKING_DIR)
 
 set(JSDOC_OUTPUT_PATH ${OUTPUT_DIR} CACHE INTERNAL "${PROJECT_NAME}: JSDoc output directory")
 
 add_custom_command(TARGET ${TARGET_NAME}
   COMMAND ${NPM_EXECUTABLE} --no-progress install && ${JSDOC_PATH} ${NATIVE_JSDOC_WORKING_DIR} -c ${JSDOC_CONFIG_PATH} -d ${OUTPUT_DIR}
+  COMMAND ${NPM_EXECUTABLE} --no-progress install && ${JSDOC_PATH} ${NATIVE_JSDOC_WORKING_DIR} -t ${OVERTE_TSD_JSDOC_DIR} -c ${JSDOC_CONFIG_PATH} -d ${OUTPUT_DIR}
   WORKING_DIRECTORY ${JSDOC_WORKING_DIR}
   COMMENT "generate the JSDoc JSON"
 )
diff --git a/tools/jsdoc/overte-tsd-jsdoc/Dictionary.js b/tools/jsdoc/overte-tsd-jsdoc/Dictionary.js
new file mode 100644
index 0000000000..8b2ca2f629
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/Dictionary.js
@@ -0,0 +1,3 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+//# sourceMappingURL=Dictionary.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/Dictionary.js.map b/tools/jsdoc/overte-tsd-jsdoc/Dictionary.js.map
new file mode 100644
index 0000000000..3299351f24
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/Dictionary.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Dictionary.js","sourceRoot":"","sources":["../src/Dictionary.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/Emitter.js b/tools/jsdoc/overte-tsd-jsdoc/Emitter.js
new file mode 100644
index 0000000000..933ac09ddb
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/Emitter.js
@@ -0,0 +1,681 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const ts = __importStar(require("typescript"));
+const logger_1 = require("./logger");
+const assert_never_1 = require("./assert_never");
+const doclet_utils_1 = require("./doclet_utils");
+const create_helpers_1 = require("./create_helpers");
+const type_resolve_helpers_1 = require("./type_resolve_helpers");
+function shouldMoveOutOfClass(doclet) {
+    return doclet_utils_1.isClassDoclet(doclet)
+        || doclet_utils_1.isNamespaceDoclet(doclet)
+        || doclet_utils_1.isEnumDoclet(doclet)
+        || doclet.kind === 'typedef';
+}
+class Emitter {
+    constructor(options) {
+        this.options = options;
+        this.results = [];
+        this._treeRoots = [];
+        this._treeNodes = {};
+    }
+    parse(docs) {
+        logger_1.debug(`Emitter.parse()`);
+        this.results = [];
+        this._treeRoots = [];
+        this._treeNodes = {};
+        if (!docs)
+            return;
+        this._createTreeNodes(docs);
+        this._buildTree(docs);
+        if (this.options.generationStrategy === 'exported')
+            this._markExported();
+        this._parseTree();
+    }
+    emit() {
+        console.log(`----------------------------------------------------------------`);
+        console.log(`Emitter.emit()`);
+        const resultFile = ts.createSourceFile('types.d.ts', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
+        const printer = ts.createPrinter({
+            removeComments: false,
+            newLine: ts.NewLineKind.LineFeed,
+        });
+        let out2 = '';
+        for (let i = 0; i < this.results.length; ++i) {
+            out2 += printer.printNode(ts.EmitHint.Unspecified, this.results[i], resultFile);
+            out2 += '\n\n';
+        }
+        return out2;
+    }
+    _createTreeNodes(docs) {
+        logger_1.debug(`----------------------------------------------------------------`);
+        logger_1.debug(`Emitter._createTreeNodes()`);
+        for (let i = 0; i < docs.length; ++i) {
+            const doclet = docs[i];
+            if (doclet.kind === 'package') {
+                logger_1.debug(`Emitter._createTreeNodes(): skipping ${logger_1.docletDebugInfo(doclet)} (package)`);
+                continue;
+            }
+            const node = this._treeNodes[doclet.longname];
+            if (!node) {
+                logger_1.debug(`Emitter._createTreeNodes(): adding ${logger_1.docletDebugInfo(doclet)} to this._treeNodes`);
+                this._treeNodes[doclet.longname] = { doclet, children: [] };
+            }
+            else {
+                logger_1.debug(`Emitter._createTreeNodes(): skipping ${logger_1.docletDebugInfo(doclet)} (doclet name already known)`);
+            }
+        }
+    }
+    _buildTree(docs) {
+        logger_1.debug(`----------------------------------------------------------------`);
+        logger_1.debug(`Emitter._buildTree()`);
+        for (let i = 0; i < docs.length; ++i) {
+            const doclet = docs[i];
+            this._buildTreeNode(docs, doclet);
+        }
+    }
+    _buildTreeNode(docs, doclet) {
+        if (doclet.kind === 'package') {
+            logger_1.debug(`Emitter._buildTreeNode(): skipping ${logger_1.docletDebugInfo(doclet)} (package)`);
+            return;
+        }
+        if (doclet_utils_1.isClassDoclet(doclet) && doclet_utils_1.isConstructorDoclet(doclet)) {
+            const ownerClass = this._getNodeFromLongname(doclet.longname, (node) => doclet_utils_1.isClassDeclarationDoclet(node.doclet));
+            if (!ownerClass) {
+                logger_1.warn(`Failed to find owner class of constructor '${doclet.longname}'.`, doclet);
+                return;
+            }
+            if (this._checkDuplicateChild(doclet, ownerClass, (child) => doclet_utils_1.isConstructorDoclet(child.doclet)))
+                return;
+            logger_1.debug(`Emitter._buildTreeNode(): adding constructor ${logger_1.docletDebugInfo(doclet)} to class declaration ${logger_1.docletDebugInfo(ownerClass.doclet)}`);
+            ownerClass.children.push({ doclet: doclet, children: [] });
+            if (!doclet_utils_1.hasParamsDoclet(doclet) && doclet_utils_1.isClassDoclet(ownerClass.doclet) && doclet_utils_1.hasParamsDoclet(ownerClass.doclet)) {
+                logger_1.debug(`Emitter._buildTreeNode(): inheriting 'params' from owner class ${logger_1.docletDebugInfo(ownerClass.doclet)} for undocumented constructor ${logger_1.docletDebugInfo(doclet)}`);
+                doclet.params = ownerClass.doclet.params;
+            }
+            return;
+        }
+        let interfaceMerge = null;
+        if (doclet.kind === 'class') {
+            const impls = doclet.implements || [];
+            const mixes = doclet.mixes || [];
+            const extras = impls.concat(mixes);
+            if (extras.length) {
+                const longname = this._getInterfaceKey(doclet.longname);
+                interfaceMerge = this._treeNodes[longname] = {
+                    doclet: {
+                        kind: 'interface',
+                        name: doclet.name,
+                        scope: doclet.scope,
+                        longname: longname,
+                        augments: extras,
+                        memberof: doclet.memberof,
+                    },
+                    children: [],
+                };
+                logger_1.debug(`Emitter._buildTreeNode(): merge interface ${logger_1.docletDebugInfo(interfaceMerge.doclet)} created for ${logger_1.docletDebugInfo(doclet)}`);
+            }
+        }
+        let namespaceMerge = null;
+        if (doclet.kind === 'interface' || doclet.kind === 'mixin') {
+            const staticChildren = docs.filter(d => d.memberof === doclet.longname && d.scope === 'static');
+            if (staticChildren.length) {
+                const longname = this._getNamespaceKey(doclet.longname);
+                namespaceMerge = this._treeNodes[longname] = {
+                    doclet: {
+                        kind: 'namespace',
+                        name: doclet.name,
+                        scope: doclet.scope,
+                        longname: longname,
+                        memberof: doclet.memberof,
+                    },
+                    children: [],
+                };
+                logger_1.debug(`Emitter._buildTreeNode(): merge namespace ${logger_1.docletDebugInfo(namespaceMerge.doclet)} created for ${logger_1.docletDebugInfo(doclet)}`);
+                staticChildren.forEach(c => c.memberof = longname);
+            }
+        }
+        doclet_utils_1.isDefaultExportDoclet(doclet, this._treeNodes);
+        if (doclet.memberof) {
+            const parent = this._getNodeFromLongname(doclet.memberof, function (node) {
+                if (doclet.scope === 'instance')
+                    return doclet_utils_1.isClassDoclet(node.doclet);
+                return true;
+            });
+            if (!parent) {
+                logger_1.warn(`Failed to find parent of doclet '${doclet.longname}' using memberof '${doclet.memberof}', this is likely due to invalid JSDoc.`, doclet);
+                return;
+            }
+            if (doclet_utils_1.isDefaultExportDoclet(doclet, this._treeNodes)) {
+                if (doclet.meta && doclet.meta.code.value && doclet.meta.code.value.startsWith('{')) {
+                    logger_1.debug(`Emitter._buildTreeNode(): 'module.exports = {name: ... }' named export pattern doclet ${logger_1.docletDebugInfo(doclet)}: skipping doclet but scan the object members`);
+                    const value = JSON.parse(doclet.meta.code.value);
+                    for (const name in value) {
+                        this._resolveDocletType(name, parent, function (namedExportNode) {
+                            logger_1.debug(`Emitter._buildTreeNode(): tagging ${logger_1.docletDebugInfo(namedExportNode.doclet)} as a named export`);
+                            namedExportNode.isNamedExport = true;
+                        });
+                    }
+                    return;
+                }
+                else {
+                    const thisEmitter = this;
+                    if (this._checkDuplicateChild(doclet, parent, (child) => doclet_utils_1.isDefaultExportDoclet(child.doclet, thisEmitter._treeNodes)))
+                        return;
+                    logger_1.debug(`Emitter._buildTreeNode(): adding default export ${logger_1.docletDebugInfo(doclet)} to module ${logger_1.docletDebugInfo(parent.doclet)}`);
+                    parent.children.push({ doclet: doclet, children: [] });
+                    return;
+                }
+            }
+            if (doclet_utils_1.isExportsAssignmentDoclet(doclet, this._treeNodes)) {
+                logger_1.debug(`Emitter._buildTreeNode(): adding 'exports =' assignment ${logger_1.docletDebugInfo(doclet)} to module ${logger_1.docletDebugInfo(parent.doclet)}`);
+                parent.children.push({ doclet: doclet, children: [] });
+                return;
+            }
+            const obj = this._treeNodes[doclet.longname];
+            if (!obj) {
+                logger_1.warn('Failed to find doclet node when building tree, this is likely a bug.', doclet);
+                return;
+            }
+            const isParentClassLike = doclet_utils_1.isClassDoclet(parent.doclet);
+            if (isParentClassLike && shouldMoveOutOfClass(doclet)) {
+                logger_1.debug(`Emitter._buildTreeNode(): move out of class!`);
+                const mod = this._getOrCreateClassNamespace(parent);
+                if (interfaceMerge) {
+                    logger_1.debug(`Emitter._buildTreeNode(): adding ${logger_1.docletDebugInfo(interfaceMerge.doclet)} to ${logger_1.docletDebugInfo(mod.doclet)}`);
+                    mod.children.push(interfaceMerge);
+                }
+                if (namespaceMerge) {
+                    logger_1.debug(`Emitter._buildTreeNode(): adding ${logger_1.docletDebugInfo(namespaceMerge.doclet)} to ${logger_1.docletDebugInfo(mod.doclet)}`);
+                    mod.children.push(namespaceMerge);
+                }
+                logger_1.debug(`Emitter._buildTreeNode(): adding ${logger_1.docletDebugInfo(obj.doclet)} to ${logger_1.docletDebugInfo(mod.doclet)}`);
+                mod.children.push(obj);
+            }
+            else {
+                if (this._checkDuplicateChild(doclet, parent, function (child) {
+                    if (child.doclet.kind !== doclet.kind)
+                        return false;
+                    if (child.doclet.longname === doclet.longname)
+                        return true;
+                    const shortname = doclet.name || '';
+                    const optionalLongname = doclet.longname.slice(0, doclet.longname.length - shortname.length) + `[${shortname}]`;
+                    if (child.doclet.longname === optionalLongname)
+                        return true;
+                    return false;
+                }))
+                    return;
+                const isObjModuleLike = doclet_utils_1.isNamespaceDoclet(doclet);
+                const isParentModuleLike = doclet_utils_1.isNamespaceDoclet(parent.doclet);
+                if (isObjModuleLike && isParentModuleLike) {
+                    logger_1.debug(`Emitter._buildTreeNode(): nested modules / namespaces!`);
+                    obj.isNested = true;
+                }
+                const isParentEnum = doclet_utils_1.isEnumDoclet(parent.doclet);
+                if (!isParentEnum) {
+                    if (interfaceMerge) {
+                        logger_1.debug(`Emitter._buildTreeNode(): adding ${logger_1.docletDebugInfo(interfaceMerge.doclet)} to ${logger_1.docletDebugInfo(parent.doclet)}`);
+                        parent.children.push(interfaceMerge);
+                    }
+                    if (namespaceMerge) {
+                        logger_1.debug(`Emitter._buildTreeNode(): adding ${logger_1.docletDebugInfo(namespaceMerge.doclet)} to ${logger_1.docletDebugInfo(parent.doclet)}`);
+                        parent.children.push(namespaceMerge);
+                    }
+                    logger_1.debug(`Emitter._buildTreeNode(): adding ${logger_1.docletDebugInfo(obj.doclet)} to ${logger_1.docletDebugInfo(parent.doclet)}`);
+                    parent.children.push(obj);
+                }
+            }
+        }
+        else {
+            const obj = this._treeNodes[doclet.longname];
+            if (!obj) {
+                logger_1.warn('Failed to find doclet node when building tree, this is likely a bug.', doclet);
+                return;
+            }
+            if (interfaceMerge) {
+                logger_1.debug(`Emitter._buildTreeNode(): ${logger_1.docletDebugInfo(interfaceMerge.doclet)} detected as a root`);
+                this._treeRoots.push(interfaceMerge);
+            }
+            if (namespaceMerge) {
+                logger_1.debug(`Emitter._buildTreeNode(): ${logger_1.docletDebugInfo(namespaceMerge.doclet)} detected as a root`);
+                this._treeRoots.push(namespaceMerge);
+            }
+            logger_1.debug(`Emitter._buildTreeNode(): ${logger_1.docletDebugInfo(obj.doclet)} detected as a root`);
+            this._treeRoots.push(obj);
+        }
+    }
+    _checkDuplicateChild(doclet, parent, match) {
+        for (const child of parent.children) {
+            if (match(child)) {
+                if (!doclet_utils_1.isDocumentedDoclet(doclet)) {
+                    logger_1.debug(`Emitter._checkConcurrentChild(): skipping undocumented ${logger_1.docletDebugInfo(doclet)} because ${logger_1.docletDebugInfo(child.doclet)} is already known in parent ${logger_1.docletDebugInfo(parent.doclet)}`);
+                }
+                else {
+                    logger_1.debug(`Emitter._buildTreeNode(): replacing ${logger_1.docletDebugInfo(child.doclet)} with ${logger_1.docletDebugInfo(doclet)} in ${logger_1.docletDebugInfo(parent.doclet)}`);
+                    child.doclet = doclet;
+                }
+                return true;
+            }
+        }
+        return false;
+    }
+    _markExported() {
+        logger_1.debug(`----------------------------------------------------------------`);
+        logger_1.debug(`Emitter._markExported()`);
+        this._markExportedNode = this._markExportedNode.bind(this);
+        for (let i = 0; i < this._treeRoots.length; i++) {
+            const node = this._treeRoots[i];
+            if (node.doclet.kind === 'module')
+                this._markExportedNode(node);
+        }
+    }
+    _markExportedNode(node, markThisNode = true) {
+        logger_1.debug(`Emitter._markExportedNode(${logger_1.docletDebugInfo(node.doclet)}, markThisNode=${markThisNode})`);
+        const doProcessNode = (node.isExported === undefined);
+        if (markThisNode)
+            node.isExported = true;
+        else if (!node.isExported)
+            node.isExported = false;
+        if (!doProcessNode)
+            return;
+        switch (node.doclet.kind) {
+            case 'class':
+            case 'interface':
+            case 'mixin':
+                this._markExportedParams(node, node.doclet.params);
+                if (node.doclet.augments)
+                    for (const augment of node.doclet.augments)
+                        this._resolveDocletType(augment, node, this._markExportedNode);
+                if (node.doclet.implements)
+                    for (const implement of node.doclet.implements)
+                        this._resolveDocletType(implement, node, this._markExportedNode);
+                if (node.doclet.mixes)
+                    for (const mix of node.doclet.mixes)
+                        this._resolveDocletType(mix, node, this._markExportedNode);
+                this._markExportedChildren(node);
+                break;
+            case 'file':
+                this._markExportedParams(node, node.doclet.params);
+                break;
+            case 'event':
+                this._markExportedParams(node, node.doclet.params);
+                break;
+            case 'callback':
+            case 'function':
+                if (node.doclet.this)
+                    this._resolveDocletType(node.doclet.this, node, this._markExportedNode);
+                this._markExportedParams(node, node.doclet.params);
+                this._markExportedReturns(node, node.doclet.returns);
+                break;
+            case 'member':
+            case 'constant':
+                if (doclet_utils_1.isDefaultExportDoclet(node.doclet, this._treeNodes)) {
+                    if (node.doclet.meta && node.doclet.meta.code.value) {
+                        this._resolveDocletType(node.doclet.meta.code.value, node, this._markExportedNode);
+                    }
+                }
+                else if (doclet_utils_1.isNamedExportDoclet(node.doclet, this._treeNodes)
+                    && node.doclet.meta && node.doclet.meta.code.value
+                    && (!doclet_utils_1.isEnumDoclet(node.doclet))) {
+                    const thisEmitter = this;
+                    this._resolveDocletType(node.doclet.meta.code.value, node, function (refNode) {
+                        const markThisNode = node.doclet.meta && (node.doclet.meta.code.value === node.doclet.name);
+                        thisEmitter._markExportedNode(refNode, markThisNode);
+                    }, function (target) {
+                        return (target !== node);
+                    });
+                }
+                else {
+                    this._markExportedTypes(node, node.doclet.type);
+                }
+                break;
+            case 'module':
+                for (const child of node.children) {
+                    if (doclet_utils_1.isDefaultExportDoclet(child.doclet, this._treeNodes)
+                        || doclet_utils_1.isNamedExportDoclet(child.doclet, this._treeNodes)) {
+                        this._markExportedNode(child);
+                    }
+                }
+                break;
+            case 'namespace':
+                this._markExportedChildren(node);
+                break;
+            case 'typedef':
+                this._markExportedTypes(node, node.doclet.type);
+                this._markExportedParams(node, node.doclet.params);
+                this._markExportedReturns(node, node.doclet.returns);
+                break;
+            case 'signal':
+                break;
+            default:
+                return assert_never_1.assertNever(node.doclet);
+        }
+    }
+    _markExportedTypes(node, types) {
+        if (types) {
+            for (const typeName of types.names) {
+                this._resolveDocletType(typeName, node, this._markExportedNode);
+            }
+        }
+    }
+    _markExportedParams(node, params) {
+        if (params) {
+            for (const param of params) {
+                if (param.type) {
+                    for (const paramType of param.type.names) {
+                        this._resolveDocletType(paramType, node, this._markExportedNode);
+                    }
+                }
+            }
+        }
+    }
+    _markExportedReturns(node, returns) {
+        if (returns) {
+            for (const ret of returns) {
+                for (const retType of ret.type.names) {
+                    this._resolveDocletType(retType, node, this._markExportedNode);
+                }
+            }
+        }
+    }
+    _markExportedChildren(node) {
+        for (const child of node.children) {
+            this._markExportedNode(child);
+        }
+    }
+    _parseTree() {
+        logger_1.debug(`----------------------------------------------------------------`);
+        logger_1.debug(`Emitter._parseTree()`);
+        for (let i = 0; i < this._treeRoots.length; ++i) {
+            const node = this._parseTreeNode(this._treeRoots[i]);
+            if (node)
+                this.results.push(node);
+        }
+    }
+    _parseTreeNode(node, parent) {
+        if (this.options.generationStrategy === 'exported' && !node.isExported) {
+            logger_1.debug(`Emitter._parseTreeNode(${logger_1.docletDebugInfo(node.doclet)}): skipping doclet, not exported`);
+            return null;
+        }
+        if (!node.exportName
+            && this._ignoreDoclet(node.doclet)) {
+            logger_1.debug(`Emitter._parseTreeNode(${logger_1.docletDebugInfo(node.doclet)}): skipping ignored doclet`);
+            return null;
+        }
+        logger_1.debug(`Emitter._parseTreeNode(${logger_1.docletDebugInfo(node.doclet)}, parent=${parent ? logger_1.docletDebugInfo(parent.doclet) : parent})`);
+        const children = [];
+        if (children) {
+            for (let i = 0; i < node.children.length; ++i) {
+                const childNode = this._parseTreeNode(node.children[i], node);
+                if (childNode)
+                    children.push(childNode);
+            }
+        }
+        switch (node.doclet.kind) {
+            case 'class':
+                if (doclet_utils_1.isConstructorDoclet(node.doclet)) {
+                    return create_helpers_1.createConstructor(node.doclet);
+                }
+                else {
+                    return create_helpers_1.createClass(node.doclet, children, node.exportName);
+                }
+            case 'constant':
+            case 'member':
+                if (doclet_utils_1.isDefaultExportDoclet(node.doclet, this._treeNodes)
+                    && node.doclet.meta
+                    && node.doclet.meta.code.value) {
+                    return create_helpers_1.createExportDefault(node.doclet, node.doclet.meta.code.value);
+                }
+                if (doclet_utils_1.isNamedExportDoclet(node.doclet, this._treeNodes)
+                    && node.doclet.meta
+                    && node.doclet.meta.code.value
+                    && !doclet_utils_1.isEnumDoclet(node.doclet)) {
+                    if (node.doclet.meta.code.value !== node.doclet.name) {
+                        const thisEmitter = this;
+                        let tsRes = null;
+                        this._resolveDocletType(node.doclet.meta.code.value, node, function (refNode) {
+                            const namedRefNode = {
+                                doclet: refNode.doclet,
+                                children: refNode.children,
+                                isNested: refNode.isNested,
+                                isExported: true,
+                                exportName: node.doclet.name
+                            };
+                            tsRes = thisEmitter._parseTreeNode(namedRefNode, parent);
+                        });
+                        return tsRes;
+                    }
+                    else {
+                        logger_1.debug(`Emitter._parseTreeNode(): skipping named export with reference of the same name`);
+                        return null;
+                    }
+                }
+                if (doclet_utils_1.isExportsAssignmentDoclet(node.doclet, this._treeNodes)) {
+                    logger_1.debug(`Emitter._parseTreeNode(): skipping 'exports =' assignment`);
+                    return null;
+                }
+                if (node.doclet.isEnum)
+                    return create_helpers_1.createEnum(node.doclet, node.exportName);
+                else if (parent && parent.doclet.kind === 'class')
+                    return create_helpers_1.createClassMember(node.doclet);
+                else if (parent && parent.doclet.kind === 'interface')
+                    return create_helpers_1.createInterfaceMember(node.doclet);
+                else
+                    return create_helpers_1.createNamespaceMember(node.doclet, node.exportName);
+            case 'callback':
+            case 'function':
+                if (node.doclet.memberof) {
+                    const parent = this._treeNodes[node.doclet.memberof];
+                    if (parent && parent.doclet.kind === 'class')
+                        return create_helpers_1.createClassMethod(node.doclet);
+                    else if (parent && parent.doclet.kind === 'interface')
+                        return create_helpers_1.createInterfaceMethod(node.doclet);
+                }
+                return create_helpers_1.createFunction(node.doclet, node.exportName);
+            case 'interface':
+                return create_helpers_1.createInterface(node.doclet, children, node.exportName);
+            case 'mixin':
+                return create_helpers_1.createInterface(node.doclet, children, node.exportName);
+            case 'module':
+                return create_helpers_1.createModule(node.doclet, !!node.isNested, children);
+            case 'namespace':
+                return create_helpers_1.createNamespace(node.doclet, !!node.isNested, children, node.exportName);
+            case 'typedef':
+                return create_helpers_1.createTypedef(node.doclet, children, node.exportName);
+            case 'file':
+                return null;
+            case 'event':
+                return null;
+            case 'signal':
+                return null;
+            default:
+                return assert_never_1.assertNever(node.doclet);
+        }
+    }
+    _ignoreDoclet(doclet) {
+        if (doclet.kind !== 'package' && doclet_utils_1.isConstructorDoclet(doclet)) {
+            return false;
+        }
+        let reason = undefined;
+        if (doclet.kind === 'package')
+            reason = 'package doclet';
+        else if (!!doclet.ignore)
+            reason = 'doclet with an ignore flag';
+        else if (!this.options.private && doclet.access === 'private')
+            reason = 'private access disabled';
+        else if (doclet.kind === 'function' && (doclet.override || doclet.overrides))
+            reason = 'overriding doclet';
+        if (reason
+            || doclet.kind === 'package') {
+            logger_1.debug(`Emitter._ignoreDoclet(doclet=${logger_1.docletDebugInfo(doclet)}) => true (${reason})`);
+            return true;
+        }
+        if (doclet.access === undefined) {
+            return false;
+        }
+        const accessLevels = ["private", "package", "protected", "public"];
+        const ignored = accessLevels.indexOf(doclet.access.toString()) < accessLevels.indexOf(this.options.access || "package");
+        if (ignored) {
+            logger_1.debug(`Emitter._ignoreDoclet(doclet=${logger_1.docletDebugInfo(doclet)}) => true (low access level)`);
+        }
+        return ignored;
+    }
+    _getInterfaceKey(longname) {
+        return longname ? longname + '$$interface$helper' : '';
+    }
+    _getNamespaceKey(longname) {
+        return longname ? longname + '$$namespace$helper' : '';
+    }
+    _getOrCreateClassNamespace(obj) {
+        if (obj.doclet.kind === 'module' || obj.doclet.kind === 'namespace') {
+            return obj;
+        }
+        const namespaceKey = this._getNamespaceKey(obj.doclet.longname);
+        let mod = this._treeNodes[namespaceKey];
+        if (mod) {
+            return mod;
+        }
+        mod = this._treeNodes[namespaceKey] = {
+            doclet: {
+                kind: 'namespace',
+                name: obj.doclet.name,
+                scope: 'static',
+                longname: namespaceKey,
+            },
+            children: [],
+        };
+        if (obj.doclet.memberof) {
+            const parent = this._treeNodes[obj.doclet.memberof];
+            if (!parent) {
+                logger_1.warn(`Failed to find parent of doclet '${obj.doclet.longname}' using memberof '${obj.doclet.memberof}', this is likely due to invalid JSDoc.`, obj.doclet);
+                return mod;
+            }
+            let parentMod = this._getOrCreateClassNamespace(parent);
+            logger_1.debug(`Emitter._getOrCreateClassNamespace(): pushing ${logger_1.docletDebugInfo(mod.doclet)} as a child of ${logger_1.docletDebugInfo(parentMod.doclet)}`);
+            mod.doclet.memberof = parentMod.doclet.longname;
+            parentMod.children.push(mod);
+        }
+        else {
+            logger_1.debug(`Emitter._getOrCreateClassNamespace(): no memberof, pushing ${logger_1.docletDebugInfo(mod.doclet)} as a root`);
+            this._treeRoots.push(mod);
+        }
+        return mod;
+    }
+    _getNodeFromLongname(longname, filter) {
+        function _debug(msg) { }
+        const node = this._treeNodes[longname];
+        if (!node) {
+            _debug(`Emitter._getNodeFromLongname('${longname}') => null`);
+            logger_1.warn(`No such doclet '${longname}'`);
+            return null;
+        }
+        if (!filter || filter(node)) {
+            _debug(`Emitter._getNodeFromLongname('${longname}') => ${logger_1.docletDebugInfo(node.doclet)}`);
+            return node;
+        }
+        if (node.doclet.kind === 'module') {
+            for (const child of node.children) {
+                if (child.doclet.longname === longname && filter(child)) {
+                    _debug(`Emitter._getNodeFromLongname('${longname}') => ${logger_1.docletDebugInfo(child.doclet)}`);
+                    return child;
+                }
+            }
+            _debug(`Emitter._getNodeFromLongname('${longname}') => null`);
+            logger_1.warn(`No such doclet '${longname}' in module`);
+            return null;
+        }
+        else {
+            _debug(`Emitter._getNodeFromLongname('${longname}') => null`);
+            logger_1.warn(`Unexpected doclet for longname '${longname}`, node.doclet);
+            return null;
+        }
+    }
+    _resolveDocletType(typeName, currentNode, callback, filter) {
+        function _debug(msg) { }
+        _debug(`Emitter._resolveDocletType(typeName='${typeName}', currentNode=${logger_1.docletDebugInfo(currentNode.doclet)})`);
+        const tokens = type_resolve_helpers_1.generateTree(typeName);
+        if (!tokens) {
+            logger_1.warn(`Could not resolve type '${typeName}' in current node:`, currentNode.doclet);
+            return;
+        }
+        tokens.dump((msg) => _debug(`Emitter._resolveDocletType(): tokens = ${msg}`));
+        const thisEmitter = this;
+        tokens.walkTypes(function (token) {
+            _debug(`Emitter._resolveDocletType(): token = {name:${token.name}, type:${token.typeToString()}}`);
+            typeName = token.name;
+            if (typeName.match(/.*\[ *\].*/))
+                typeName = typeName.slice(0, typeName.indexOf('['));
+            _debug(`Emitter._resolveDocletType(): typeName = ${typeName}`);
+            switch (typeName) {
+                case 'void':
+                case 'null':
+                case 'string':
+                case 'String':
+                case 'boolean':
+                case 'Boolean':
+                case 'number':
+                case 'Number':
+                case 'function':
+                case 'Function':
+                case 'any':
+                case 'object':
+                case 'Object':
+                case '*':
+                case 'Array':
+                case 'Union':
+                case 'Promise':
+                case 'HTMLElement':
+                    return;
+            }
+            let scope = currentNode.doclet.longname;
+            while (scope) {
+                _debug(`Emitter._resolveDocletType(): scope='${scope}'`);
+                const longnames = [
+                    `${scope}.${typeName}`,
+                    `${scope}~${typeName}`,
+                    `${scope}~${typeName}$$interface$helper`,
+                    `${scope}~${typeName}$$namespace$helper`,
+                ];
+                let targetFound = false;
+                for (const longname of longnames) {
+                    _debug(`Emitter._resolveDocletType(): trying longname '${longname}'...`);
+                    const target = thisEmitter._treeNodes[longname];
+                    if (target) {
+                        if (filter && (!filter(target))) {
+                            _debug(`Emitter._resolveDocletType(): filtered out ${logger_1.docletDebugInfo(target.doclet)}`);
+                        }
+                        else {
+                            _debug(`Emitter._resolveDocletType(): found! ${logger_1.docletDebugInfo(target.doclet)}`);
+                            callback(target);
+                            targetFound = true;
+                        }
+                    }
+                }
+                if (targetFound) {
+                    _debug(`Emitter._resolveDocletType(): done`);
+                    return;
+                }
+                const scopeNode = thisEmitter._treeNodes[scope];
+                if (!scopeNode)
+                    break;
+                for (const tsTypeParameterDeclaration of type_resolve_helpers_1.resolveTypeParameters(scopeNode.doclet)) {
+                    if (tsTypeParameterDeclaration.name.text === typeName) {
+                        _debug(`Emitter._resolveDocletType(): template found! in ${logger_1.docletDebugInfo(scopeNode.doclet)}`);
+                        return;
+                    }
+                }
+                scope = scopeNode.doclet.memberof;
+            }
+            logger_1.warn(`Could not resolve type '${typeName}' in current node:`, currentNode.doclet);
+        });
+    }
+}
+exports.Emitter = Emitter;
+//# sourceMappingURL=Emitter.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/Emitter.js.map b/tools/jsdoc/overte-tsd-jsdoc/Emitter.js.map
new file mode 100644
index 0000000000..f72f2bfcb8
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/Emitter.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"Emitter.js","sourceRoot":"","sources":["../src/Emitter.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/LICENSE b/tools/jsdoc/overte-tsd-jsdoc/LICENSE
new file mode 100644
index 0000000000..ee604dfb68
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2016 Chad Engler
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tools/jsdoc/overte-tsd-jsdoc/PropTree.js b/tools/jsdoc/overte-tsd-jsdoc/PropTree.js
new file mode 100644
index 0000000000..7100b2dd97
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/PropTree.js
@@ -0,0 +1,50 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const logger_1 = require("./logger");
+class PropTree {
+    constructor(props) {
+        this.roots = [];
+        this.nodes = {};
+        for (let i = 0; i < props.length; ++i) {
+            const prop = props[i];
+            if (!prop || !prop.name) {
+                logger_1.warn('Encountered a property with no name, this is likely due to invalid JSDoc. Skipping.');
+                continue;
+            }
+            const parts = prop.name.split('.');
+            this.nodes[prop.name] = {
+                prop,
+                name: parts[parts.length - 1],
+                children: [],
+            };
+        }
+        for (let i = 0; i < props.length; ++i) {
+            const prop = props[i];
+            if (!prop || !prop.name)
+                continue;
+            const parts = prop.name.split('.');
+            const obj = this.nodes[prop.name];
+            if (!obj) {
+                logger_1.warn('Failed to find dot-notation property in map. This is likely a bug.');
+                continue;
+            }
+            if (parts.length > 1) {
+                parts.pop();
+                let parentName = parts.join('.');
+                if (parentName.endsWith('[]')) {
+                    parentName = parentName.substring(0, parentName.length - '[]'.length);
+                }
+                const parent = this.nodes[parentName];
+                if (!parent) {
+                    continue;
+                }
+                parent.children.push(obj);
+            }
+            else {
+                this.roots.push(obj);
+            }
+        }
+    }
+}
+exports.PropTree = PropTree;
+//# sourceMappingURL=PropTree.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/PropTree.js.map b/tools/jsdoc/overte-tsd-jsdoc/PropTree.js.map
new file mode 100644
index 0000000000..99ea1f45ef
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/PropTree.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"PropTree.js","sourceRoot":"","sources":["../src/PropTree.ts"],"names":[],"mappings":";;AACA,qCAAgC;AAShC,MAAa,QAAQ;IAKjB,YAAY,KAAoB;QAHhC,UAAK,GAAgB,EAAE,CAAC;QACxB,UAAK,GAA0B,EAAE,CAAC;QAK9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EACrC;YACI,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EACvB;gBACI,aAAI,CAAC,qFAAqF,CAAC,CAAC;gBAC5F,SAAS;aACZ;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACpB,IAAI;gBACJ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC7B,QAAQ,EAAE,EAAE;aACf,CAAC;SACL;QAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EACrC;YACI,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI;gBACnB,SAAS;YAEb,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,CAAC,GAAG,EACR;gBACI,aAAI,CAAC,oEAAoE,CAAC,CAAC;gBAC3E,SAAS;aACZ;YAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EACpB;gBACI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACZ,IAAI,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC7B;oBACI,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;iBACzE;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAEtC,IAAI,CAAC,MAAM,EACX;oBAEI,SAAS;iBACZ;gBAED,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAC7B;iBAED;gBACI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;aACvB;SACJ;IACL,CAAC;CACJ;AAtED,4BAsEC"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/assert_never.js b/tools/jsdoc/overte-tsd-jsdoc/assert_never.js
new file mode 100644
index 0000000000..42b2f38738
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/assert_never.js
@@ -0,0 +1,7 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function assertNever(x) {
+    throw new Error("Unexpected object: " + JSON.stringify(x));
+}
+exports.assertNever = assertNever;
+//# sourceMappingURL=assert_never.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/assert_never.js.map b/tools/jsdoc/overte-tsd-jsdoc/assert_never.js.map
new file mode 100644
index 0000000000..c7d223e828
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/assert_never.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"assert_never.js","sourceRoot":"","sources":["../src/assert_never.ts"],"names":[],"mappings":";;AAAA,SAAgB,WAAW,CAAC,CAAQ;IAEhC,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAHD,kCAGC"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/create_helpers.js b/tools/jsdoc/overte-tsd-jsdoc/create_helpers.js
new file mode 100644
index 0000000000..c6cfbc7026
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/create_helpers.js
@@ -0,0 +1,390 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const ts = __importStar(require("typescript"));
+const logger_1 = require("./logger");
+const doclet_utils_1 = require("./doclet_utils");
+const PropTree_1 = require("./PropTree");
+const type_resolve_helpers_1 = require("./type_resolve_helpers");
+const declareModifier = ts.createModifier(ts.SyntaxKind.DeclareKeyword);
+const constModifier = ts.createModifier(ts.SyntaxKind.ConstKeyword);
+const readonlyModifier = ts.createModifier(ts.SyntaxKind.ReadonlyKeyword);
+const exportModifier = ts.createModifier(ts.SyntaxKind.ExportKeyword);
+const defaultModifier = ts.createModifier(ts.SyntaxKind.DefaultKeyword);
+function validateClassLikeChildren(children, validate, msg) {
+    if (children) {
+        for (let i = children.length - 1; i >= 0; --i) {
+            const child = children[i];
+            if (!validate(child)) {
+                logger_1.warn(`Encountered child that is not a ${msg}, this is likely due to invalid JSDoc.`, child);
+                children.splice(i, 1);
+            }
+        }
+    }
+}
+function validateClassChildren(children) {
+    validateClassLikeChildren(children, ts.isClassElement, 'ClassElement');
+}
+function validateInterfaceChildren(children) {
+    validateClassLikeChildren(children, ts.isTypeElement, 'TypeElement');
+}
+function validateModuleChildren(children) {
+    if (children) {
+        for (let i = children.length - 1; i >= 0; --i) {
+            const child = children[i];
+            if (!ts.isClassDeclaration(child)
+                && !ts.isInterfaceDeclaration(child)
+                && !ts.isFunctionDeclaration(child)
+                && !ts.isEnumDeclaration(child)
+                && !ts.isModuleDeclaration(child)
+                && !ts.isTypeAliasDeclaration(child)
+                && !ts.isVariableStatement(child)
+                && !ts.isExportAssignment(child)) {
+                logger_1.warn('Encountered child that is not a supported declaration, this is likely due to invalid JSDoc.', child);
+                children.splice(i, 1);
+            }
+        }
+    }
+}
+function buildName(doclet, altName) {
+    if (altName)
+        return ts.createIdentifier(altName);
+    if (doclet.name.startsWith('exports.'))
+        return ts.createIdentifier(doclet.name.replace('exports.', ''));
+    return ts.createIdentifier(doclet.name);
+}
+function buildOptionalName(doclet, altName) {
+    if (altName)
+        return ts.createIdentifier(altName);
+    if (doclet.meta && (doclet.meta.code.name === 'module.exports'))
+        return undefined;
+    if (doclet.name.startsWith('exports.'))
+        return ts.createIdentifier(doclet.name.replace('exports.', ''));
+    return ts.createIdentifier(doclet.name);
+}
+function formatMultilineComment(comment) {
+    return comment.split('\n').join('\n * ');
+}
+function handlePropsComment(props, jsdocTagName) {
+    return props.map((prop) => {
+        if (prop.description) {
+            let name;
+            if (prop.optional) {
+                if (prop.defaultvalue !== undefined) {
+                    name = `[${prop.name} = ${prop.defaultvalue}]`;
+                }
+                else {
+                    name = `[${prop.name}]`;
+                }
+            }
+            else {
+                name = prop.name;
+            }
+            const description = ` - ${formatMultilineComment(prop.description)}`;
+            return `\n * @${jsdocTagName} ${name}${description}`;
+        }
+        return '';
+    }).filter((value) => value !== '').join('');
+}
+function handleReturnsComment(doclet) {
+    if (doclet_utils_1.isFunctionDoclet(doclet) && doclet.returns) {
+        return doclet.returns.map((ret) => {
+            if (ret.description)
+                return `\n * @returns ${formatMultilineComment(ret.description)}`;
+            return '';
+        })
+            .filter((value) => value !== '').join('');
+    }
+    return '';
+}
+function handleExamplesComment(doclet) {
+    if (doclet.examples !== undefined) {
+        return doclet.examples.map((example) => {
+            return `\n * @example
+ * ${formatMultilineComment(example)}`;
+        })
+            .join('');
+    }
+    return '';
+}
+function handleParamsComment(doclet) {
+    if ((doclet_utils_1.isClassDoclet(doclet)
+        || doclet_utils_1.isFileDoclet(doclet)
+        || doclet_utils_1.isEventDoclet(doclet)
+        || doclet_utils_1.isFunctionDoclet(doclet)
+        || doclet_utils_1.isTypedefDoclet(doclet))
+        && doclet.params) {
+        return handlePropsComment(doclet.params, 'param');
+    }
+    return '';
+}
+function handlePropertiesComment(doclet) {
+    if (!doclet_utils_1.isEnumDoclet(doclet) && doclet.properties) {
+        return handlePropsComment(doclet.properties, 'property');
+    }
+    return '';
+}
+function handleComment(doclet, node) {
+    if (doclet.comment && doclet.comment.length > 4) {
+        let description = '';
+        if (doclet.description) {
+            description = `\n * ${formatMultilineComment(doclet.description)}`;
+        }
+        else if (doclet_utils_1.isClassDoclet(doclet) && doclet.classdesc) {
+            if (!ts.isConstructorDeclaration(node)) {
+                description = `\n * ${formatMultilineComment(doclet.classdesc)}`;
+            }
+        }
+        const examples = handleExamplesComment(doclet);
+        const properties = handlePropertiesComment(doclet);
+        const params = handleParamsComment(doclet);
+        const returns = handleReturnsComment(doclet);
+        if (doclet_utils_1.isEnumDoclet(doclet)) {
+            if (!ts.isEnumDeclaration(node)) {
+                logger_1.warn(`Node is not an enum declaration, even though the doclet is. This is likely a tsd-jsdoc bug.`);
+                return node;
+            }
+            if (doclet.properties) {
+                const enumProperties = doclet.properties;
+                const enumMembers = node.members;
+                for (let index = 0; index < enumProperties.length; index++) {
+                    const enumProperty = enumProperties[index];
+                    const enumMember = enumMembers[index];
+                    handleComment(enumProperty, enumMember);
+                }
+            }
+        }
+        if (description || examples || properties || params || returns) {
+            let comment = `*${description}${examples}${properties}${params}${returns}
+ `;
+            if (doclet.kind === 'typedef') {
+                comment = `*${description}${examples}${params}${returns}
+ `;
+            }
+            const kind = ts.SyntaxKind.MultiLineCommentTrivia;
+            ts.addSyntheticLeadingComment(node, kind, comment, true);
+        }
+    }
+    return node;
+}
+function createClass(doclet, children, altName) {
+    logger_1.debug(`createClass(${logger_1.docletDebugInfo(doclet)}, altName=${altName})`);
+    validateClassChildren(children);
+    const mods = [];
+    if (!doclet.memberof)
+        mods.push(declareModifier);
+    if (doclet.meta && doclet.meta.code.name === 'module.exports')
+        mods.push(exportModifier, defaultModifier);
+    const members = children || [];
+    const typeParams = type_resolve_helpers_1.resolveTypeParameters(doclet);
+    const heritageClauses = type_resolve_helpers_1.resolveHeritageClauses(doclet, false);
+    if (doclet.params) {
+        if (members.filter(member => ts.isConstructorDeclaration(member)).length === 0) {
+            logger_1.debug(`createClass(): no constructor set yet, adding one automatically`);
+            members.unshift(ts.createConstructor(undefined, undefined, type_resolve_helpers_1.createFunctionParams(doclet), undefined));
+        }
+    }
+    if (doclet.properties) {
+        const tree = new PropTree_1.PropTree(doclet.properties);
+        nextProperty: for (let i = 0; i < tree.roots.length; ++i) {
+            const node = tree.roots[i];
+            for (const tsProp of members.filter(member => ts.isPropertyDeclaration(member))) {
+                if (tsProp.name) {
+                    const propName = tsProp.name.text;
+                    if (propName === node.name) {
+                        logger_1.debug(`createClass(): skipping property already declared '${node.name}'`);
+                        continue nextProperty;
+                    }
+                }
+            }
+            const opt = node.prop.optional ? ts.createToken(ts.SyntaxKind.QuestionToken) : undefined;
+            const t = node.children.length ? type_resolve_helpers_1.createTypeLiteral(node.children, node) : type_resolve_helpers_1.resolveType(node.prop.type);
+            const property = ts.createProperty(undefined, undefined, node.name, opt, t, undefined);
+            if (node.prop.description) {
+                let comment = `*\n * ${node.prop.description.split(/\r\s*/).join("\n * ")}\n`;
+                ts.addSyntheticLeadingComment(property, ts.SyntaxKind.MultiLineCommentTrivia, comment, true);
+            }
+            members.push(property);
+        }
+    }
+    return handleComment(doclet, ts.createClassDeclaration(undefined, mods, buildOptionalName(doclet, altName), typeParams, heritageClauses, members));
+}
+exports.createClass = createClass;
+function createInterface(doclet, children, altName) {
+    logger_1.debug(`createInterface(${logger_1.docletDebugInfo(doclet)}, altName=${altName})`);
+    validateInterfaceChildren(children);
+    const mods = doclet.memberof ? undefined : [declareModifier];
+    const members = children;
+    const typeParams = type_resolve_helpers_1.resolveTypeParameters(doclet);
+    const heritageClauses = type_resolve_helpers_1.resolveHeritageClauses(doclet, true);
+    return handleComment(doclet, ts.createInterfaceDeclaration(undefined, mods, buildName(doclet, altName), typeParams, heritageClauses, members));
+}
+exports.createInterface = createInterface;
+function createFunction(doclet, altName) {
+    logger_1.debug(`createFunction(${logger_1.docletDebugInfo(doclet)}, altName=${altName})`);
+    const mods = [];
+    if (!doclet.memberof)
+        mods.push(declareModifier);
+    if (doclet.meta && (doclet.meta.code.name === 'module.exports'))
+        mods.push(exportModifier, defaultModifier);
+    const params = type_resolve_helpers_1.createFunctionParams(doclet);
+    const type = type_resolve_helpers_1.createFunctionReturnType(doclet);
+    const typeParams = type_resolve_helpers_1.resolveTypeParameters(doclet);
+    return handleComment(doclet, ts.createFunctionDeclaration(undefined, mods, undefined, buildOptionalName(doclet, altName), typeParams, params, type, undefined));
+}
+exports.createFunction = createFunction;
+function createClassMethod(doclet) {
+    logger_1.debug(`createClassMethod(${logger_1.docletDebugInfo(doclet)})`);
+    const mods = [];
+    const params = type_resolve_helpers_1.createFunctionParams(doclet);
+    const type = type_resolve_helpers_1.createFunctionReturnType(doclet);
+    const typeParams = type_resolve_helpers_1.resolveTypeParameters(doclet);
+    if (!doclet.memberof)
+        mods.push(declareModifier);
+    if (doclet.access === 'private')
+        mods.push(ts.createModifier(ts.SyntaxKind.PrivateKeyword));
+    else if (doclet.access === 'protected')
+        mods.push(ts.createModifier(ts.SyntaxKind.ProtectedKeyword));
+    else if (doclet.access === 'public')
+        mods.push(ts.createModifier(ts.SyntaxKind.PublicKeyword));
+    if (doclet.scope === 'static')
+        mods.push(ts.createModifier(ts.SyntaxKind.StaticKeyword));
+    const [name, questionToken] = type_resolve_helpers_1.resolveOptionalFromName(doclet);
+    return handleComment(doclet, ts.createMethod(undefined, mods, undefined, name, questionToken, typeParams, params, type, undefined));
+}
+exports.createClassMethod = createClassMethod;
+function createInterfaceMethod(doclet) {
+    logger_1.debug(`createInterfaceMethod(${logger_1.docletDebugInfo(doclet)})`);
+    const mods = [];
+    const params = type_resolve_helpers_1.createFunctionParams(doclet);
+    const type = type_resolve_helpers_1.createFunctionReturnType(doclet);
+    const typeParams = type_resolve_helpers_1.resolveTypeParameters(doclet);
+    const [name, questionToken] = type_resolve_helpers_1.resolveOptionalFromName(doclet);
+    return handleComment(doclet, ts.createMethodSignature(typeParams, params, type, name, questionToken));
+}
+exports.createInterfaceMethod = createInterfaceMethod;
+function createEnum(doclet, altName) {
+    logger_1.debug(`createEnum(${logger_1.docletDebugInfo(doclet)}, altName=${altName})`);
+    const mods = [];
+    const props = [];
+    if (!doclet.memberof)
+        mods.push(declareModifier);
+    if (doclet.kind === 'constant')
+        mods.push(constModifier);
+    if (doclet.properties && doclet.properties.length) {
+        for (let i = 0; i < doclet.properties.length; ++i) {
+            const p = doclet.properties[i];
+            const l = p.defaultvalue !== undefined ? ts.createLiteral(p.defaultvalue) : undefined;
+            props.push(ts.createEnumMember(p.name, l));
+        }
+    }
+    return handleComment(doclet, ts.createEnumDeclaration(undefined, mods, buildName(doclet, altName), props));
+}
+exports.createEnum = createEnum;
+function createClassMember(doclet) {
+    logger_1.debug(`createClassMember(${logger_1.docletDebugInfo(doclet)})`);
+    const type = type_resolve_helpers_1.resolveType(doclet.type, doclet);
+    const mods = getAccessModifiers(doclet);
+    if (doclet.scope === 'static')
+        mods.push(ts.createModifier(ts.SyntaxKind.StaticKeyword));
+    if (doclet.kind === 'constant' || doclet.readonly)
+        mods.push(readonlyModifier);
+    const [name, questionToken] = type_resolve_helpers_1.resolveOptionalFromName(doclet);
+    return handleComment(doclet, ts.createProperty(undefined, mods, name, questionToken, type, undefined));
+}
+exports.createClassMember = createClassMember;
+function getAccessModifiers(doclet) {
+    const mods = [];
+    if (doclet.access === 'private' || doclet.access === 'package')
+        mods.push(ts.createModifier(ts.SyntaxKind.PrivateKeyword));
+    else if (doclet.access === 'protected')
+        mods.push(ts.createModifier(ts.SyntaxKind.ProtectedKeyword));
+    else if (doclet.access === 'public')
+        mods.push(ts.createModifier(ts.SyntaxKind.PublicKeyword));
+    return mods;
+}
+function createConstructor(doclet) {
+    logger_1.debug(`createConstructor(${logger_1.docletDebugInfo(doclet)})`);
+    return handleComment(doclet, ts.createConstructor(undefined, getAccessModifiers(doclet), type_resolve_helpers_1.createFunctionParams(doclet), undefined));
+}
+exports.createConstructor = createConstructor;
+function createInterfaceMember(doclet) {
+    logger_1.debug(`createInterfaceMember(${logger_1.docletDebugInfo(doclet)})`);
+    const mods = [];
+    const type = type_resolve_helpers_1.resolveType(doclet.type, doclet);
+    if (doclet.kind === 'constant')
+        mods.push(readonlyModifier);
+    if (doclet.scope === 'static')
+        mods.push(ts.createModifier(ts.SyntaxKind.StaticKeyword));
+    const [name, questionToken] = type_resolve_helpers_1.resolveOptionalFromName(doclet);
+    return handleComment(doclet, ts.createPropertySignature(mods, name, questionToken, type, undefined));
+}
+exports.createInterfaceMember = createInterfaceMember;
+function createNamespaceMember(doclet, altName) {
+    logger_1.debug(`createNamespaceMember(${logger_1.docletDebugInfo(doclet)})`);
+    const mods = doclet.memberof ? undefined : [declareModifier];
+    const flags = (doclet.kind === 'constant' || doclet.readonly) ? ts.NodeFlags.Const : undefined;
+    const literalValue = doclet.defaultvalue !== undefined ? doclet.defaultvalue
+        : doclet.meta && doclet.meta.code.type === 'Literal' ? doclet.meta.code.value
+            : undefined;
+    const initializer = (flags === ts.NodeFlags.Const && literalValue !== undefined) ? ts.createLiteral(literalValue) : undefined;
+    const type = initializer ? undefined : type_resolve_helpers_1.resolveType(doclet.type, doclet);
+    return handleComment(doclet, ts.createVariableStatement(mods, ts.createVariableDeclarationList([
+        ts.createVariableDeclaration(buildName(doclet, altName), type, initializer)
+    ], flags)));
+}
+exports.createNamespaceMember = createNamespaceMember;
+function createExportDefault(doclet, value) {
+    logger_1.debug(`createExportDefault(${logger_1.docletDebugInfo(doclet)}, '${value}')`);
+    const expression = ts.createIdentifier(value);
+    return handleComment(doclet, ts.createExportDefault(expression));
+}
+exports.createExportDefault = createExportDefault;
+function createModule(doclet, nested, children) {
+    logger_1.debug(`createModule(${logger_1.docletDebugInfo(doclet)})`);
+    validateModuleChildren(children);
+    const mods = doclet.memberof ? undefined : [declareModifier];
+    let body = undefined;
+    let flags = ts.NodeFlags.None;
+    if (nested)
+        flags |= ts.NodeFlags.NestedNamespace;
+    if (children)
+        body = ts.createModuleBlock(children);
+    let nameStr = doclet.name;
+    if ((nameStr[0] === '"' && nameStr[nameStr.length - 1] === '"')
+        || (nameStr[0] === '\'' && nameStr[nameStr.length - 1] === '\'')) {
+        nameStr = nameStr.substr(1, nameStr.length - 2);
+    }
+    const name = ts.createStringLiteral(nameStr);
+    return handleComment(doclet, ts.createModuleDeclaration(undefined, mods, name, body, flags));
+}
+exports.createModule = createModule;
+function createNamespace(doclet, nested, children, altName) {
+    logger_1.debug(`createNamespace(${logger_1.docletDebugInfo(doclet)}, altName=${altName})`);
+    validateModuleChildren(children);
+    const mods = doclet.memberof ? undefined : [declareModifier];
+    let body = undefined;
+    let flags = ts.NodeFlags.Namespace;
+    if (nested)
+        flags |= ts.NodeFlags.NestedNamespace;
+    if (children) {
+        body = ts.createModuleBlock(children);
+    }
+    return handleComment(doclet, ts.createModuleDeclaration(undefined, mods, buildName(doclet, altName), body, flags));
+}
+exports.createNamespace = createNamespace;
+function createTypedef(doclet, children, altName) {
+    logger_1.debug(`createTypedef(${logger_1.docletDebugInfo(doclet)}, altName=${altName})`);
+    const mods = doclet.memberof ? undefined : [declareModifier];
+    const type = type_resolve_helpers_1.resolveType(doclet.type, doclet);
+    const typeParams = type_resolve_helpers_1.resolveTypeParameters(doclet);
+    return handleComment(doclet, ts.createTypeAliasDeclaration(undefined, mods, buildName(doclet, altName), typeParams, type));
+}
+exports.createTypedef = createTypedef;
+//# sourceMappingURL=create_helpers.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/create_helpers.js.map b/tools/jsdoc/overte-tsd-jsdoc/create_helpers.js.map
new file mode 100644
index 0000000000..d5e0f9726d
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/create_helpers.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"create_helpers.js","sourceRoot":"","sources":["../src/create_helpers.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/doclet_utils.js b/tools/jsdoc/overte-tsd-jsdoc/doclet_utils.js
new file mode 100644
index 0000000000..5e884697a9
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/doclet_utils.js
@@ -0,0 +1,164 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const fs = __importStar(require("fs"));
+const path = __importStar(require("path"));
+const logger_1 = require("./logger");
+function isDocumentedDoclet(doclet) {
+    if (doclet.undocumented)
+        if (doclet.comment && doclet.comment.length > 0)
+            return true;
+        else
+            return false;
+    else
+        return true;
+}
+exports.isDocumentedDoclet = isDocumentedDoclet;
+function hasParamsDoclet(doclet) {
+    if (doclet.kind === 'class'
+        || doclet.kind === 'interface'
+        || doclet.kind === 'mixin'
+        || doclet.kind === 'file'
+        || doclet.kind === 'event'
+        || doclet.kind === 'function'
+        || doclet.kind === 'callback'
+        || doclet.kind === 'typedef') {
+        if (doclet.params && doclet.params.length > 0)
+            return true;
+    }
+    return false;
+}
+exports.hasParamsDoclet = hasParamsDoclet;
+function isClassDoclet(doclet) {
+    return doclet.kind === 'class' || doclet.kind === 'interface' || doclet.kind === 'mixin';
+}
+exports.isClassDoclet = isClassDoclet;
+function isClassDeclarationDoclet(doclet) {
+    return !!(doclet.kind === 'class'
+        && doclet.meta
+        && (!doclet.meta.code.type
+            || doclet.meta.code.type === 'ClassDeclaration'
+            || doclet.meta.code.type === 'ClassExpression'));
+}
+exports.isClassDeclarationDoclet = isClassDeclarationDoclet;
+function isConstructorDoclet(doclet) {
+    return !!(doclet.kind === 'class'
+        && doclet.meta
+        && doclet.meta.code.type === 'MethodDefinition');
+}
+exports.isConstructorDoclet = isConstructorDoclet;
+function isFileDoclet(doclet) {
+    return doclet.kind === 'file';
+}
+exports.isFileDoclet = isFileDoclet;
+function isEventDoclet(doclet) {
+    return doclet.kind === 'event';
+}
+exports.isEventDoclet = isEventDoclet;
+function isFunctionDoclet(doclet) {
+    return doclet.kind === 'function' || doclet.kind === 'callback';
+}
+exports.isFunctionDoclet = isFunctionDoclet;
+function isMemberDoclet(doclet) {
+    return doclet.kind === 'member' || doclet.kind === 'constant';
+}
+exports.isMemberDoclet = isMemberDoclet;
+function isNamespaceDoclet(doclet) {
+    return doclet.kind === 'module' || doclet.kind === 'namespace';
+}
+exports.isNamespaceDoclet = isNamespaceDoclet;
+function isTypedefDoclet(doclet) {
+    return doclet.kind === 'typedef';
+}
+exports.isTypedefDoclet = isTypedefDoclet;
+function isPackageDoclet(doclet) {
+    return doclet.kind === 'package';
+}
+exports.isPackageDoclet = isPackageDoclet;
+function isEnumDoclet(doclet) {
+    return isMemberDoclet(doclet) && (doclet.isEnum === true);
+}
+exports.isEnumDoclet = isEnumDoclet;
+function isDefaultExportDoclet(doclet, treeNodes) {
+    if (doclet.kind !== 'module'
+        && doclet.meta
+        && doclet.meta.code.name === 'module.exports'
+        && doclet.longname.startsWith('module:')) {
+        const moduleName = doclet.memberof ? doclet.memberof : doclet.longname;
+        const node = treeNodes[moduleName];
+        if (node && node.doclet.kind === 'module') {
+            if (!doclet.memberof) {
+                doclet.memberof = node.doclet.longname;
+                logger_1.debug(`isDefaultExport(): ${logger_1.docletDebugInfo(doclet)}.memberof fixed to '${doclet.memberof}'`);
+            }
+            if (!doclet.meta.code.value) {
+                const sourcePath = path.join(doclet.meta.path, doclet.meta.filename);
+                const fd = fs.openSync(sourcePath, 'r');
+                if (fd < 0) {
+                    logger_1.warn(`Could not read from '${sourcePath}'`);
+                    return true;
+                }
+                const begin = doclet.meta.range[0];
+                const end = doclet.meta.range[1];
+                const length = end - begin;
+                const buffer = Buffer.alloc(length);
+                if (fs.readSync(fd, buffer, 0, length, begin) !== length) {
+                    logger_1.warn(`Could not read from '${sourcePath}'`);
+                    return true;
+                }
+                doclet.meta.code.value = buffer.toString().trim();
+                if (doclet.meta.code.value.endsWith(";"))
+                    doclet.meta.code.value = doclet.meta.code.value.slice(0, -1).trimRight();
+                if (doclet.meta.code.value.match(/^export +default +/))
+                    doclet.meta.code.value = doclet.meta.code.value.replace(/^export +default +/, "");
+                logger_1.debug(`isDefaultExport(): ${logger_1.docletDebugInfo(doclet)}.meta.code.value fixed to '${doclet.meta.code.value}'`);
+            }
+            return true;
+        }
+    }
+    return false;
+}
+exports.isDefaultExportDoclet = isDefaultExportDoclet;
+function isNamedExportDoclet(doclet, treeNodes) {
+    const node = treeNodes[doclet.longname];
+    if (node && node.isNamedExport) {
+        return true;
+    }
+    if (doclet.kind !== 'module'
+        && doclet.meta
+        && doclet.meta.code.name
+        && (doclet.meta.code.name.startsWith('module.exports.') || doclet.meta.code.name.startsWith('exports.'))
+        && doclet.longname.startsWith('module:')
+        && doclet.memberof) {
+        const parent = treeNodes[doclet.memberof];
+        if (parent && parent.doclet.kind === 'module') {
+            if (node) {
+                node.isNamedExport = true;
+            }
+            return true;
+        }
+    }
+    return false;
+}
+exports.isNamedExportDoclet = isNamedExportDoclet;
+function isExportsAssignmentDoclet(doclet, treeNodes) {
+    if (doclet.kind === 'member'
+        && doclet.meta
+        && doclet.meta.code.name
+        && doclet.meta.code.name === 'exports'
+        && doclet.longname.startsWith('module:')
+        && doclet.memberof) {
+        const node = treeNodes[doclet.memberof];
+        if (node && node.doclet.kind === 'module')
+            return true;
+    }
+    return false;
+}
+exports.isExportsAssignmentDoclet = isExportsAssignmentDoclet;
+//# sourceMappingURL=doclet_utils.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/doclet_utils.js.map b/tools/jsdoc/overte-tsd-jsdoc/doclet_utils.js.map
new file mode 100644
index 0000000000..3128c00874
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/doclet_utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"doclet_utils.js","sourceRoot":"","sources":["../src/doclet_utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/logger.js b/tools/jsdoc/overte-tsd-jsdoc/logger.js
new file mode 100644
index 0000000000..d94c9bba99
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/logger.js
@@ -0,0 +1,59 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const header = '[TSD-JSDoc]';
+let isVerbose = false;
+function setVerbose(value) {
+    isVerbose = value;
+}
+exports.setVerbose = setVerbose;
+function warn(msg, data) {
+    if (typeof (console) === 'undefined')
+        return;
+    let prefix = header;
+    if (data && data.meta) {
+        const meta = data.meta;
+        prefix = `${prefix} ${meta.filename}:${meta.lineno}:${meta.columnno}`;
+    }
+    console.warn(`${prefix} ${msg}`);
+    if (isVerbose && arguments.length > 1) {
+        console.warn(data);
+    }
+    if (isDebug) {
+        console.log(`${header} WARN: ${msg}`);
+        if (arguments.length > 1) {
+            console.log(data);
+        }
+    }
+}
+exports.warn = warn;
+let isDebug = false;
+function setDebug(value) {
+    isDebug = value;
+}
+exports.setDebug = setDebug;
+function debug(msg, data) {
+    if (typeof (console) === 'undefined')
+        return;
+    if (isDebug) {
+        console.log(`${header} DEBUG: ${msg}`);
+        if (arguments.length > 1) {
+            console.log(data);
+        }
+    }
+}
+exports.debug = debug;
+function docletDebugInfo(doclet) {
+    let debugInfo = `{longname='${doclet.longname}', kind='${doclet.kind}'`;
+    if ((doclet.kind !== 'package') && doclet.meta) {
+        if (doclet.meta.code.id)
+            debugInfo += `, id='${doclet.meta.code.id}'`;
+        if (doclet.meta.range)
+            debugInfo += `, range=[${doclet.meta.range[0]}-${doclet.meta.range[1]}]`;
+        else if (doclet.meta.lineno)
+            debugInfo += `, lineno=${doclet.meta.lineno}`;
+    }
+    debugInfo += `}`;
+    return debugInfo;
+}
+exports.docletDebugInfo = docletDebugInfo;
+//# sourceMappingURL=logger.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/logger.js.map b/tools/jsdoc/overte-tsd-jsdoc/logger.js.map
new file mode 100644
index 0000000000..c8bfc3f958
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/logger.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;AAAA,MAAM,MAAM,GAAG,aAAa,CAAC;AAE7B,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,SAAgB,UAAU,CAAC,KAAc;IAErC,SAAS,GAAG,KAAK,CAAC;AACtB,CAAC;AAHD,gCAGC;AAED,SAAgB,IAAI,CAAC,GAAW,EAAE,IAAU;IAExC,IAAI,OAAM,CAAC,OAAO,CAAC,KAAK,WAAW;QAC/B,OAAO;IAEX,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EACrB;QACI,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;KACzE;IAED,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IAEjC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EACrC;QACI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACtB;IAED,IAAI,OAAO,EACX;QAGI,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,UAAU,GAAG,EAAE,CAAC,CAAC;QACtC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EACxB;YACI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACrB;KACJ;AACL,CAAC;AA7BD,oBA6BC;AAED,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,SAAgB,QAAQ,CAAC,KAAc;IAEnC,OAAO,GAAG,KAAK,CAAC;AACpB,CAAC;AAHD,4BAGC;AAED,SAAgB,KAAK,CAAC,GAAW,EAAE,IAAU;IAEzC,IAAI,OAAM,CAAC,OAAO,CAAC,KAAK,WAAW;QAC/B,OAAO;IAEX,IAAI,OAAO,EACX;QAEI,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EACxB;YACI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACrB;KACJ;AACL,CAAC;AAdD,sBAcC;AAED,SAAgB,eAAe,CAAC,MAAkB;IAC9C,IAAI,SAAS,GAAG,cAAc,MAAM,CAAC,QAAQ,YAAY,MAAM,CAAC,IAAI,GAAG,CAAC;IACxE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,MAAM,CAAC,IAAI,EAC9C;QACI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACnB,SAAS,IAAI,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QACjD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK;YACjB,SAAS,IAAI,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;aACxE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM;YACvB,SAAS,IAAI,YAAY,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;KACrD;IACD,SAAS,IAAI,GAAG,CAAC;IACjB,OAAO,SAAS,CAAC;AACrB,CAAC;AAbD,0CAaC"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/package.json b/tools/jsdoc/overte-tsd-jsdoc/package.json
new file mode 100644
index 0000000000..d01abc6b9a
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/package.json
@@ -0,0 +1,41 @@
+{
+  "name": "tsd-jsdoc",
+  "version": "0.0.1",
+  "description": "Compiles JSDoc annotated javascript into a Typescript Declaration File (.d.ts).",
+  "main": "dist/publish.js",
+  "author": "Chad Engler <chad@pantherdev.com>",
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "git@github.com:englercj/jsdoc2tsd.git"
+  },
+  "scripts": {
+    "build": "tsc -p tsconfig.json",
+    "watch": "tsc -w -p tsconfig.json",
+    "prepare": "npm run build",
+    "test": "npm run build && mocha --ui tdd -r ts-node/register --timeout 5000 --colors test/specs/**.ts"
+  },
+  "files": [
+    "dist/*",
+    "README.md",
+    "LICENSE"
+  ],
+  "devDependencies": {
+    "@types/chai": "^4.1.7",
+    "@types/mocha": "^5.2.5",
+    "@types/node": "^10.12.12",
+    "chai": "^4.2.0",
+    "jsdoc": "^3.6.3",
+    "jsdoc-api": "^5.0.3",
+    "mocha": "^5.2.0",
+    "object-to-spawn-args": "^2.0.0",
+    "ts-node": "^7.0.1",
+    "walk-back": "^3.0.1"
+  },
+  "peerDependencies": {
+    "jsdoc": "^3.6.3"
+  },
+  "dependencies": {
+    "typescript": "^3.2.1"
+  }
+}
diff --git a/tools/jsdoc/overte-tsd-jsdoc/plugin.js b/tools/jsdoc/overte-tsd-jsdoc/plugin.js
new file mode 100644
index 0000000000..1e9636c3ce
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/plugin.js
@@ -0,0 +1,25 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function defineTags(dictionary) {
+    dictionary.defineTag("template", {
+        onTagged: function (doclet, tag) {
+            doclet.tags = doclet.tags || [];
+            doclet.tags.push(tag);
+        }
+    });
+}
+exports.defineTags = defineTags;
+;
+const regexTypeOf = /typeof\s+([^\|\}]+)/g;
+exports.handlers = {
+    jsdocCommentFound: function (event) {
+        let oldResult = "";
+        let newResult = event.comment || "";
+        while (newResult !== oldResult) {
+            oldResult = newResult;
+            newResult = newResult.replace(regexTypeOf, (typeExpression, className) => "Class<" + className + ">");
+        }
+        event.comment = newResult;
+    }
+};
+//# sourceMappingURL=plugin.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/plugin.js.map b/tools/jsdoc/overte-tsd-jsdoc/plugin.js.map
new file mode 100644
index 0000000000..832ffcc9db
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/plugin.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";;AAAA,SAAgB,UAAU,CAAC,UAA0B;IACjD,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE;QAC7B,QAAQ,EAAE,UAAS,MAAM,EAAE,GAAG;YAC1B,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;KACJ,CAAC,CAAC;AACP,CAAC;AAPD,gCAOC;AAAA,CAAC;AAEF,MAAM,WAAW,GAAG,sBAAsB,CAAA;AAE/B,QAAA,QAAQ,GAAG;IAClB,iBAAiB,EAAE,UAAS,KAAgE;QACxF,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,SAAS,GAAG,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;QACpC,OAAO,SAAS,KAAK,SAAS,EAAE;YAC5B,SAAS,GAAG,SAAS,CAAC;YACtB,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,CAAC,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC;SACzG;QACD,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;IAC9B,CAAC;CACJ,CAAC"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/publish.js b/tools/jsdoc/overte-tsd-jsdoc/publish.js
new file mode 100644
index 0000000000..2173872472
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/publish.js
@@ -0,0 +1,82 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path = __importStar(require("path"));
+const fs = __importStar(require("fs"));
+const helper = __importStar(require("jsdoc/util/templateHelper"));
+const Emitter_1 = require("./Emitter");
+const logger_1 = require("./logger");
+function publish(data, opts) {
+    logger_1.setVerbose(!!opts.verbose);
+    logger_1.setDebug(!!opts.debug);
+    if (!opts.generationStrategy) {
+        opts.generationStrategy = 'documented';
+    }
+    logger_1.debug(`publish(): Generation strategy: '${opts.generationStrategy}'`);
+    if (opts.generationStrategy === 'documented') {
+        data(function () {
+            if (this.undocumented) {
+                if ((!this.comment) || (this.comment === '')) {
+                    logger_1.debug(`publish(): ${logger_1.docletDebugInfo(this)} removed`);
+                    return true;
+                }
+                else {
+                    logger_1.debug(`publish(): ${logger_1.docletDebugInfo(this)} saved from removal`);
+                }
+            }
+            return false;
+        }).remove();
+    }
+    else if (opts.generationStrategy === 'exported') {
+        logger_1.warn(`Note: The 'exported' generation strategy is still an experimental feature for the moment, thank you for your comprehension. `
+            + `Feel free to contribute in case you find a bug.`);
+    }
+    const docs = data().get().filter(d => !d.inherited || d.overrides);
+    const emitter = new Emitter_1.Emitter(opts);
+    emitter.parse(docs);
+    if (opts.destination === 'console') {
+        console.log(emitter.emit());
+    }
+    else {
+        try {
+            fs.mkdirSync(opts.destination);
+        }
+        catch (e) {
+            if (e.code !== 'EEXIST') {
+                throw e;
+            }
+        }
+        let filedata = emitter.emit().toString();
+        console.log('stage1 starting preprocesing');
+        filedata = filedata.replace(/(: void)/gmi, '');
+        filedata = filedata.replace(/(: int)/gmi, ': number');
+        filedata = filedata.replace(/(numberer)/gmi, 'Inter');
+        console.log('stage2 replacing Void and int');
+        filedata = filedata.replace(/([a-zA-Z])~([a-zA-Z])/g, '$1.$2');
+        filedata = filedata.replace(/\b(([A-Z][a-z]+)+)-(([A-Z][a-z]+)+)\b/g, '$1$3');
+        console.log('stage3 removing "-" from type names');
+        filedata = filedata.replace(/\b(Vec[2-4]|Mat4|Quat)\b/g, 'T$1');
+        console.log('stage4 add prefix "T" to the types');
+        filedata = filedata.replace(/\bdeclare namespace T(Vec[2-4]|Mat4|Quat)/g, 'declare namespace $1');
+        filedata = filedata.replace(/\bT(Vec[2-4]|Mat4|Quat)\./g, '$1.');
+        console.log('stage5 Restore previous names for namespace');
+        filedata = filedata.replace(/function: \(/g, 'fn: (');
+        console.log('stage6 "function" is really wrong name for na variable');
+        const pkgArray = helper.find(data, { kind: 'package' }) || [];
+        const pkg = pkgArray[0];
+        let definitionName = 'types';
+        if (pkg && pkg.name) {
+            definitionName = pkg.name.split('/').pop() || definitionName;
+        }
+        const out = path.join(opts.destination, opts.outFile || `${definitionName}.d.ts`);
+        fs.writeFileSync(out, filedata);
+    }
+}
+exports.publish = publish;
+//# sourceMappingURL=publish.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/publish.js.map b/tools/jsdoc/overte-tsd-jsdoc/publish.js.map
new file mode 100644
index 0000000000..e2bd77f46f
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/publish.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/type_resolve_helpers.js b/tools/jsdoc/overte-tsd-jsdoc/type_resolve_helpers.js
new file mode 100644
index 0000000000..42b4e63a59
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/type_resolve_helpers.js
@@ -0,0 +1,523 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const ts = __importStar(require("typescript"));
+const logger_1 = require("./logger");
+const PropTree_1 = require("./PropTree");
+const rgxObjectTokenize = /(<|>|,|\(|\)|\||\{|\}|:)/;
+const rgxCommaAll = /,/g;
+const rgxParensAll = /\(|\)/g;
+const anyTypeNode = ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
+const voidTypeNode = ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword);
+const strTypeNode = ts.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
+var ENodeType;
+(function (ENodeType) {
+    ENodeType[ENodeType["GENERIC"] = 0] = "GENERIC";
+    ENodeType[ENodeType["UNION"] = 1] = "UNION";
+    ENodeType[ENodeType["FUNCTION"] = 2] = "FUNCTION";
+    ENodeType[ENodeType["TUPLE"] = 3] = "TUPLE";
+    ENodeType[ENodeType["TYPE"] = 4] = "TYPE";
+    ENodeType[ENodeType["OBJECT"] = 5] = "OBJECT";
+})(ENodeType || (ENodeType = {}));
+class StringTreeNode {
+    constructor(name, type, parent) {
+        this.name = name;
+        this.type = type;
+        this.parent = parent;
+        this.children = [];
+    }
+    dump(output, indent = 0) {
+        output(`${'  '.repeat(indent)}name: ${this.name}, type:${this.typeToString()}`);
+        this.children.forEach((child) => {
+            child.dump(output, indent + 1);
+        });
+    }
+    walkTypes(callback) {
+        for (let i = 0; i < this.children.length; ++i) {
+            if (this.type === ENodeType.OBJECT && (i % 2 === 0))
+                continue;
+            this.children[i].walkTypes(callback);
+        }
+        callback(this);
+    }
+    typeToString() {
+        switch (this.type) {
+            case ENodeType.GENERIC:
+                return 'GENERIC';
+            case ENodeType.UNION:
+                return 'UNION';
+            case ENodeType.FUNCTION:
+                return 'FUNCTION';
+            case ENodeType.TUPLE:
+                return 'TUPLE';
+            case ENodeType.TYPE:
+                return 'TYPE';
+            case ENodeType.OBJECT:
+                return 'OBJECT';
+            default:
+                return 'UNKNOWN';
+        }
+    }
+}
+exports.StringTreeNode = StringTreeNode;
+function resolveComplexTypeName(name, doclet) {
+    const root = generateTree(name);
+    if (!root) {
+        logger_1.warn(`failed to generate tree for ${name}, defaulting to any`);
+        return anyTypeNode;
+    }
+    return resolveTree(root);
+}
+exports.resolveComplexTypeName = resolveComplexTypeName;
+function generateTree(name, parent = null) {
+    const anyNode = new StringTreeNode('any', ENodeType.TYPE, parent);
+    const parts = name.split(rgxObjectTokenize).filter(function (e) {
+        return e.trim() !== '';
+    });
+    for (let i = 0; i < parts.length; ++i) {
+        const part = parts[i].trim();
+        const partUpper = part.toUpperCase();
+        if (part.endsWith('.')) {
+            const matchingIndex = findMatchingBracket(parts, i + 1, '<', '>');
+            if (matchingIndex === -1) {
+                logger_1.warn(`Unable to find matching '<', '>' brackets in '${part}', defaulting to \`any\``, name);
+                return anyNode;
+            }
+            const node = new StringTreeNode(part.substring(0, part.length - 1), ENodeType.GENERIC, parent);
+            generateTree(parts.slice(i + 2, matchingIndex).join(''), node);
+            if (!parent)
+                return node;
+            parent.children.push(node);
+            i = matchingIndex + 1;
+            continue;
+        }
+        if (part === '(') {
+            const matchingIndex = findMatchingBracket(parts, i, '(', ')');
+            if (matchingIndex === -1) {
+                logger_1.warn(`Unable to find matching '(', ')' brackets in '${part}', defaulting to \`any\``, name);
+                return anyNode;
+            }
+            const node = new StringTreeNode('Union', ENodeType.UNION, parent);
+            generateTree(parts.slice(i + 1, matchingIndex).join(''), node);
+            if (!parent)
+                return node;
+            parent.children.push(node);
+            i = matchingIndex + 1;
+            continue;
+        }
+        if (part === '{') {
+            const matchingIndex = findMatchingBracket(parts, i, '{', '}');
+            if (matchingIndex === -1) {
+                logger_1.warn(`Unable to find matching '{', '}' brackets in '${part}', defaulting to \`any\``, name);
+                return anyNode;
+            }
+            const node = new StringTreeNode('Object', ENodeType.OBJECT, parent);
+            generateTree(parts.slice(i + 1, matchingIndex).join(''), node);
+            if (!parent)
+                return node;
+            parent.children.push(node);
+            i = matchingIndex + 1;
+            continue;
+        }
+        if (partUpper === 'FUNCTION') {
+            const node = new StringTreeNode(part, ENodeType.FUNCTION, parent);
+            let matchingIndex = findMatchingBracket(parts, i + 1, '(', ')');
+            if (matchingIndex === -1) {
+                logger_1.warn(`Unable to find matching '(', ')' brackets in '${part}', defaulting to \`any\``, name);
+                return anyNode;
+            }
+            if (matchingIndex > i + 2)
+                generateTree(parts.slice(i + 2, matchingIndex).join(''), node);
+            if (parts.length > matchingIndex + 2 && parts[matchingIndex + 1] === ':') {
+                generateTree(parts[matchingIndex + 2], node);
+                matchingIndex += 2;
+            }
+            else {
+                node.children.push(new StringTreeNode('void', ENodeType.TYPE, node));
+            }
+            if (!parent)
+                return node;
+            parent.children.push(node);
+            i = matchingIndex + 1;
+            continue;
+        }
+        if (part === '|' || part === ',' || part === ':') {
+            continue;
+        }
+        const node = new StringTreeNode(part, ENodeType.TYPE, parent);
+        if (part === '*')
+            node.name = 'any';
+        else if (partUpper === 'OBJECT')
+            node.name = 'object';
+        else if (partUpper === 'ARRAY')
+            node.name = 'any[]';
+        if (!parent)
+            return node;
+        parent.children.push(node);
+    }
+    return anyNode;
+}
+exports.generateTree = generateTree;
+function findMatchingBracket(parts, startIndex, openBracket, closeBracket) {
+    let count = 0;
+    for (let i = startIndex; i < parts.length; ++i) {
+        if (parts[i] === openBracket) {
+            ++count;
+        }
+        else if (parts[i] === closeBracket) {
+            if (--count === 0) {
+                return i;
+            }
+        }
+    }
+    return -1;
+}
+function resolveTree(node, parentTypes = null) {
+    const childTypes = [];
+    node.children.forEach((child) => resolveTree(child, childTypes));
+    const upperName = node.name.toUpperCase();
+    switch (node.type) {
+        case ENodeType.OBJECT:
+            const objectProperties = [];
+            for (var i = 0; i < node.children.length; i = i + 2) {
+                let valType = childTypes[i + 1];
+                if (!valType) {
+                    logger_1.warn('Unable to resolve object value type, this is likely due to invalid JSDoc. Defaulting to \`any\`.', node);
+                    valType = anyTypeNode;
+                }
+                const property = ts.createPropertySignature(undefined, ts.createIdentifier(node.children[i].name), undefined, valType, undefined);
+                objectProperties.push(property);
+            }
+            const objectNode = ts.createTypeLiteralNode(objectProperties);
+            ts.setEmitFlags(objectNode, ts.EmitFlags.SingleLine);
+            if (!parentTypes)
+                return objectNode;
+            parentTypes.push(objectNode);
+            break;
+        case ENodeType.GENERIC:
+            let genericNode;
+            if (upperName === 'OBJECT') {
+                let keyType = childTypes[0];
+                if (!keyType) {
+                    logger_1.warn(`Unable to resolve object key type, this is likely due to invalid JSDoc. Defaulting to \`string\`.`);
+                    keyType = strTypeNode;
+                }
+                else if (node.children[0].type !== ENodeType.TYPE || (node.children[0].name !== 'string' && node.children[0].name !== 'number')) {
+                    logger_1.warn(`Invalid object key type. It must be \`string\` or \`number\`, but got: ${node.children[0].name}. Defaulting to \`string\`.`);
+                    keyType = strTypeNode;
+                }
+                let valType = childTypes[1];
+                if (!valType) {
+                    logger_1.warn('Unable to resolve object value type, this is likely due to invalid JSDoc. Defaulting to \`any\`.', node);
+                    valType = anyTypeNode;
+                }
+                const indexParam = ts.createParameter(undefined, undefined, undefined, 'key', undefined, keyType, undefined);
+                const indexSignature = ts.createIndexSignature(undefined, undefined, [indexParam], valType);
+                genericNode = ts.createTypeLiteralNode([indexSignature]);
+            }
+            else if (upperName === 'ARRAY') {
+                let valType = childTypes[0];
+                if (!valType) {
+                    logger_1.warn('Unable to resolve array value type, defaulting to \`any\`.', node);
+                    valType = anyTypeNode;
+                }
+                genericNode = ts.createArrayTypeNode(valType);
+            }
+            else if (upperName === 'CLASS') {
+                let valType = childTypes[0];
+                if (!valType) {
+                    logger_1.warn('Unable to resolve class value type, defaulting to \`any\`.', node);
+                    valType = anyTypeNode;
+                }
+                genericNode = ts.createTypeQueryNode(ts.createIdentifier(node.children[0].name));
+            }
+            else {
+                if (childTypes.length === 0) {
+                    logger_1.warn('Unable to resolve generic type, defaulting to \`any\`.', node);
+                    childTypes.push(anyTypeNode);
+                }
+                if (upperName === 'PROMISE') {
+                    while (childTypes.length > 1)
+                        childTypes.pop();
+                }
+                genericNode = ts.createTypeReferenceNode(node.name, childTypes);
+            }
+            if (!parentTypes)
+                return genericNode;
+            parentTypes.push(genericNode);
+            break;
+        case ENodeType.UNION:
+            if (childTypes.length === 0) {
+                logger_1.warn('Unable to resolve any types for union, defaulting to \`any\`.', node);
+                childTypes.push(anyTypeNode);
+            }
+            const unionNode = ts.createUnionTypeNode(childTypes);
+            if (!parentTypes)
+                return unionNode;
+            parentTypes.push(unionNode);
+            break;
+        case ENodeType.FUNCTION:
+            const funcParameters = [];
+            if (childTypes.length === 0 || childTypes.length === 1) {
+                const anyArray = ts.createArrayTypeNode(anyTypeNode);
+                const dotDotDot = ts.createToken(ts.SyntaxKind.DotDotDotToken);
+                funcParameters.push(ts.createParameter(undefined, undefined, dotDotDot, 'params', undefined, anyArray, undefined));
+                if (childTypes.length === 0)
+                    childTypes.push(voidTypeNode);
+            }
+            for (var i = 0; i < node.children.length - 1; ++i) {
+                const param = ts.createParameter(undefined, undefined, undefined, 'arg' + i, undefined, childTypes[i], undefined);
+                funcParameters.push(param);
+            }
+            const functionNode = ts.createFunctionTypeNode(undefined, funcParameters, childTypes[childTypes.length - 1]);
+            if (!parentTypes)
+                return functionNode;
+            parentTypes.push(functionNode);
+            break;
+        case ENodeType.TYPE:
+            const typeNode = ts.createTypeReferenceNode(node.name, undefined);
+            if (!parentTypes)
+                return typeNode;
+            parentTypes.push(typeNode);
+            break;
+    }
+    return anyTypeNode;
+}
+function toKeywordTypeKind(k) {
+    if (!k || k.length === 0)
+        return null;
+    k = k.toUpperCase();
+    switch (k) {
+        case 'ANY': return ts.SyntaxKind.AnyKeyword;
+        case 'UNKNOWN': return ts.SyntaxKind.UnknownKeyword;
+        case 'NUMBER': return ts.SyntaxKind.NumberKeyword;
+        case 'BIGINT': return ts.SyntaxKind.BigIntKeyword;
+        case 'OBJECT': return ts.SyntaxKind.ObjectKeyword;
+        case 'BOOLEAN': return ts.SyntaxKind.BooleanKeyword;
+        case 'BOOL': return ts.SyntaxKind.BooleanKeyword;
+        case 'STRING': return ts.SyntaxKind.StringKeyword;
+        case 'SYMBOL': return ts.SyntaxKind.SymbolKeyword;
+        case 'THIS': return ts.SyntaxKind.ThisKeyword;
+        case 'VOID': return ts.SyntaxKind.VoidKeyword;
+        case 'UNDEFINED': return ts.SyntaxKind.UndefinedKeyword;
+        case 'NULL': return ts.SyntaxKind.NullKeyword;
+        case 'NEVER': return ts.SyntaxKind.NeverKeyword;
+        default:
+            return null;
+    }
+}
+exports.toKeywordTypeKind = toKeywordTypeKind;
+function resolveOptionalParameter(doclet) {
+    if (doclet.defaultvalue || doclet.optional)
+        return ts.createToken(ts.SyntaxKind.QuestionToken);
+    return undefined;
+}
+exports.resolveOptionalParameter = resolveOptionalParameter;
+function resolveVariableParameter(doclet) {
+    if (doclet.variable)
+        return ts.createToken(ts.SyntaxKind.DotDotDotToken);
+    return undefined;
+}
+exports.resolveVariableParameter = resolveVariableParameter;
+function resolveOptionalFromName(doclet) {
+    let name = doclet.name;
+    if (name.startsWith('[') && name.endsWith(']')) {
+        name = name.substring(1, name.length - 1);
+        return [name, ts.createToken(ts.SyntaxKind.QuestionToken)];
+    }
+    if (doclet.optional) {
+        return [name, ts.createToken(ts.SyntaxKind.QuestionToken)];
+    }
+    return [name, undefined];
+}
+exports.resolveOptionalFromName = resolveOptionalFromName;
+function getExprWithTypeArgs(identifier) {
+    const expr = ts.createIdentifier(identifier);
+    return ts.createExpressionWithTypeArguments(undefined, expr);
+}
+function resolveHeritageClauses(doclet, onlyExtend) {
+    const clauses = [];
+    let extensions = doclet.augments || [];
+    if (onlyExtend) {
+        extensions = extensions.concat(doclet.implements || []);
+        extensions = extensions.concat(doclet.mixes || []);
+    }
+    if (extensions.length) {
+        clauses.push(ts.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, extensions.map(getExprWithTypeArgs)));
+    }
+    if (onlyExtend)
+        return clauses;
+    let implementations = (doclet.implements || []).concat(doclet.mixes || []);
+    if (implementations.length) {
+        clauses.push(ts.createHeritageClause(ts.SyntaxKind.ImplementsKeyword, implementations.map(getExprWithTypeArgs)));
+    }
+    return clauses;
+}
+exports.resolveHeritageClauses = resolveHeritageClauses;
+function resolveTypeParameters(doclet) {
+    const typeParams = [];
+    if (doclet.tags) {
+        for (let i = 0; i < doclet.tags.length; ++i) {
+            const tag = doclet.tags[i];
+            if (tag.title === 'template') {
+                onTemplateTag(tag.text);
+            }
+        }
+    }
+    else if (doclet.comment && doclet.comment.includes('@template')) {
+        logger_1.debug(`resolveTypeParameters(): jsdoc@3.6.x @template handling directly in the comment text for ${logger_1.docletDebugInfo(doclet)}`);
+        for (let line of doclet.comment.split(/\r?\n/)) {
+            line = line.trim();
+            if (line.startsWith('*'))
+                line = line.slice(1).trim();
+            if (line.startsWith('@template')) {
+                line = line.slice('@template'.length).trim();
+                onTemplateTag(line);
+            }
+        }
+    }
+    function onTemplateTag(tagText) {
+        const types = (tagText || 'T').split(',');
+        for (let x = 0; x < types.length; ++x) {
+            const name = types[x].trim();
+            if (!name)
+                continue;
+            typeParams.push(ts.createTypeParameterDeclaration(name, undefined, undefined));
+        }
+    }
+    return typeParams;
+}
+exports.resolveTypeParameters = resolveTypeParameters;
+function resolveType(t, doclet) {
+    if (!t || !t.names || t.names.length === 0) {
+        if (doclet && doclet.properties)
+            return resolveTypeName('object', doclet);
+        if (doclet) {
+            logger_1.warn(`Unable to resolve type for ${doclet.longname || doclet.name}, none specified in JSDoc. Defaulting to \`any\`.`, doclet);
+        }
+        else {
+            logger_1.warn(`Unable to resolve type for an unnamed item, this is likely due to invalid JSDoc.` +
+                ` Often this is caused by invalid JSDoc on a parameter. Defaulting to \`any\`.`, doclet);
+        }
+        return anyTypeNode;
+    }
+    if (t.names.length === 1) {
+        return resolveTypeName(t.names[0], doclet);
+    }
+    else {
+        const types = [];
+        for (let i = 0; i < t.names.length; ++i) {
+            types.push(resolveTypeName(t.names[i], doclet));
+        }
+        return ts.createUnionTypeNode(types);
+    }
+}
+exports.resolveType = resolveType;
+function resolveTypeName(name, doclet) {
+    if (!name) {
+        logger_1.warn('Unable to resolve type name, it is null, undefined, or empty. Defaulting to \`any\`.', doclet);
+        return anyTypeNode;
+    }
+    if (name === '*')
+        return anyTypeNode;
+    const keyword = toKeywordTypeKind(name);
+    if (keyword !== null) {
+        if (keyword === ts.SyntaxKind.ThisKeyword)
+            return ts.createThisTypeNode();
+        if (keyword === ts.SyntaxKind.ObjectKeyword) {
+            if (!doclet || !doclet.properties)
+                return anyTypeNode;
+            else
+                return resolveTypeLiteral(doclet.properties);
+        }
+        return ts.createKeywordTypeNode(keyword);
+    }
+    const upperName = name.toUpperCase();
+    if (upperName === 'FUNCTION' || upperName === 'FUNCTION()') {
+        if (doclet && doclet.kind === 'typedef') {
+            const params = createFunctionParams(doclet);
+            const type = createFunctionReturnType(doclet);
+            return ts.createFunctionTypeNode(undefined, params, type);
+        }
+        else {
+            const anyArray = ts.createArrayTypeNode(anyTypeNode);
+            const dotDotDot = ts.createToken(ts.SyntaxKind.DotDotDotToken);
+            const param = ts.createParameter(undefined, undefined, dotDotDot, 'params', undefined, anyArray, undefined);
+            return ts.createFunctionTypeNode(undefined, [param], anyTypeNode);
+        }
+    }
+    return resolveComplexTypeName(name);
+}
+exports.resolveTypeName = resolveTypeName;
+function resolveTypeLiteral(props) {
+    if (!props)
+        return ts.createTypeLiteralNode([]);
+    const tree = new PropTree_1.PropTree(props);
+    return createTypeLiteral(tree.roots);
+}
+exports.resolveTypeLiteral = resolveTypeLiteral;
+function createTypeLiteral(children, parent) {
+    const members = [];
+    for (let i = 0; i < children.length; ++i) {
+        const node = children[i];
+        const opt = node.prop.optional ? ts.createToken(ts.SyntaxKind.QuestionToken) : undefined;
+        const t = node.children.length ? createTypeLiteral(node.children, node) : resolveType(node.prop.type);
+        const property = ts.createPropertySignature(undefined, node.name, opt, t, undefined);
+        if (!parent && (node.prop.description || node.prop.defaultvalue)) {
+            let comment = `*\n `;
+            if (node.prop.description)
+                comment += `* ${node.prop.description.split(/\r\s*/).join("\n * ")}\n `;
+            if (node.prop.defaultvalue)
+                comment += `* @defaultValue ${node.prop.defaultvalue}\n `;
+            ts.addSyntheticLeadingComment(property, ts.SyntaxKind.MultiLineCommentTrivia, comment, true);
+        }
+        members.push(property);
+    }
+    let node = ts.createTypeLiteralNode(members);
+    if (parent && parent.prop.type) {
+        const names = parent.prop.type.names;
+        if (names.length === 1 && names[0].toLowerCase() === 'array.<object>') {
+            node = ts.createArrayTypeNode(node);
+        }
+    }
+    return node;
+}
+exports.createTypeLiteral = createTypeLiteral;
+function createFunctionParams(doclet) {
+    const params = [];
+    if ((doclet.kind === 'function' || doclet.kind === 'typedef') && doclet.this) {
+        const type = resolveType({ names: [doclet.this] }, doclet);
+        params.push(ts.createParameter(undefined, undefined, undefined, 'this', undefined, type, undefined));
+    }
+    if (!doclet.params || !doclet.params.length)
+        return params;
+    const tree = new PropTree_1.PropTree(doclet.params);
+    for (let i = 0; i < tree.roots.length; ++i) {
+        const node = tree.roots[i];
+        const opt = resolveOptionalParameter(node.prop);
+        const dots = resolveVariableParameter(node.prop);
+        let type = node.children.length ? createTypeLiteral(node.children, node) : resolveType(node.prop.type);
+        if (dots) {
+            type = ts.createArrayTypeNode(type);
+        }
+        params.push(ts.createParameter(undefined, undefined, dots, node.name, opt, type, undefined));
+    }
+    return params;
+}
+exports.createFunctionParams = createFunctionParams;
+function createFunctionReturnType(doclet) {
+    if (doclet.returns && doclet.returns.length === 1) {
+        return resolveType(doclet.returns[0].type, doclet);
+    }
+    else {
+        return ts.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword);
+    }
+}
+exports.createFunctionReturnType = createFunctionReturnType;
+//# sourceMappingURL=type_resolve_helpers.js.map
\ No newline at end of file
diff --git a/tools/jsdoc/overte-tsd-jsdoc/type_resolve_helpers.js.map b/tools/jsdoc/overte-tsd-jsdoc/type_resolve_helpers.js.map
new file mode 100644
index 0000000000..6859b7cb5c
--- /dev/null
+++ b/tools/jsdoc/overte-tsd-jsdoc/type_resolve_helpers.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"type_resolve_helpers.js","sourceRoot":"","sources":["../src/type_resolve_helpers.ts"],"names":[],"mappings":"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"}
\ No newline at end of file