Fix generation of episodic nodejs for services

- Extending services from the episode must also take the episodes into account
- Remove the reference in the generated ts for imported types since it can't be relative
- Extend the tests
diff --git a/lib/nodejs/test/episodic-code-generation-test/client.js b/lib/nodejs/test/episodic-code-generation-test/client.js
index cf014c2..57f520f 100644
--- a/lib/nodejs/test/episodic-code-generation-test/client.js
+++ b/lib/nodejs/test/episodic-code-generation-test/client.js
@@ -23,19 +23,32 @@
 const test = require("tape");
 const thrift = require("thrift");
 const { program } = require("commander");
+const tape = require("tape");
 
 program
   .option("--host <host>", "Set the thrift server host to connect", "localhost")
   .option("--port <port>", "Set the thrift server port number to connect", 9090)
+  .option("--base <base>", "Set the base: 'pure', 'base' or 'extend'", "pure")
   .parse(process.argv);
 
-const Service = require("./gen-2/second-episode/gen-nodejs/Service");
+const ServiceBase = require("types-package/first-episode/BaseService");
+const ServicePure = require("./gen-2/second-episode/gen-nodejs/Service");
+const ServiceExtended = require("./gen-2/second-episode/gen-nodejs/ExtendedService");
 const Types = require("types-package/first-episode/Types_types");
 
 const opts = program.opts();
 const host = opts.host;
 const port = opts.port;
 
+let Service;
+if (opts.base === "pure") {
+  Service = ServicePure;
+} else if (opts.base === "base") {
+  Service = ServiceBase;
+} else if (opts.base === "extend") {
+  Service = ServiceExtended;
+}
+
 const options = {
   transport: thrift.TBufferedTransport,
   protocol: thrift.TJSONProtocol,
@@ -58,6 +71,24 @@
       callback("Server successfully tested");
     });
   });
+
+  if (opts.base === "extend") {
+    test("NodeJS episodic compilation client-server extended test", function (assert) {
+      const type1Object = new Types.Type1();
+      type1Object.number = 42;
+      type1Object.message = "The answer";
+      client.testEpisodeExtend(type1Object, function (err, response) {
+        assert.error(err, "no callback error");
+        assert.equal(response.number, type1Object.number + 1);
+        assert.equal(
+          response.message,
+          type1Object.message + " [Hello from the extended server]",
+        );
+        assert.end();
+        callback("Extended Server successfully tested");
+      });
+    });
+  }
 };
 
 connection.on("error", function (err) {
@@ -71,6 +102,9 @@
 function runTests() {
   testDriver(client, function (status) {
     console.log(status);
+  });
+  tape.onFinish(function () {
+    console.log("Tests finished");
     connection.destroy();
   });
 }
diff --git a/lib/nodejs/test/episodic-code-generation-test/server.js b/lib/nodejs/test/episodic-code-generation-test/server.js
index 2b9a96d..5af48d9 100644
--- a/lib/nodejs/test/episodic-code-generation-test/server.js
+++ b/lib/nodejs/test/episodic-code-generation-test/server.js
@@ -24,14 +24,26 @@
 
 program
   .option("--port <port>", "Set the thrift server port", 9090)
+  .option("--base <base>", "Set the base: 'pure', 'base' or 'extend'", "pure")
   .parse(process.argv);
 
-const Service = require("./gen-2/second-episode/gen-nodejs/Service");
+const ServiceBase = require("types-package/first-episode/BaseService");
+const ServicePure = require("./gen-2/second-episode/gen-nodejs/Service");
+const ServiceExtended = require("./gen-2/second-episode/gen-nodejs/ExtendedService");
 const Types = require("types-package/first-episode/Types_types");
 
 const opts = program.opts();
 const port = opts.port;
 
+let Service;
+if (opts.base === "pure") {
+  Service = ServicePure;
+} else if (opts.base === "base") {
+  Service = ServiceBase;
+} else if (opts.base === "extend") {
+  Service = ServiceExtended;
+}
+
 const options = {
   transport: thrift.TBufferedTransport,
   protocol: thrift.TJSONProtocol,
@@ -45,6 +57,13 @@
       receivedType1Object.message + " [Hello from the server]";
     return type1Object;
   },
+  testEpisodeExtend: function (receivedType1Object) {
+    const type1Object = new Types.Type1();
+    type1Object.number = receivedType1Object.number + 1;
+    type1Object.message =
+      receivedType1Object.message + " [Hello from the extended server]";
+    return type1Object;
+  },
 };
 
 const server = thrift.createServer(Service, ServiceHandler, options);
diff --git a/lib/nodejs/test/testAll.sh b/lib/nodejs/test/testAll.sh
index 4f85ca4..d37f9a3 100755
--- a/lib/nodejs/test/testAll.sh
+++ b/lib/nodejs/test/testAll.sh
@@ -60,20 +60,23 @@
 
 testEpisodicCompilation()
 {
+  local _server=$1
+  local _client=$2
+  echo "  [Episodic Variant: ${_server}:${_client}] Testing Client(${_client})/Server(${_server})";
   RET=0
   if [ -n "${COVER}" ]; then
-    ${ISTANBUL} cover ${EPISODIC_DIR}/server.js --dir ${REPORT_PREFIX}${COUNT} --handle-sigint &
+    ${ISTANBUL} cover ${EPISODIC_DIR}/server.js --dir ${REPORT_PREFIX}${COUNT} --handle-sigint -- --base "${_server}"   &
     COUNT=$((COUNT+1))
   else
-    node ${EPISODIC_DIR}/server.js &
+    node ${EPISODIC_DIR}/server.js --base "${_server}" &
   fi
   SERVERPID=$!
   sleep 0.1
   if [ -n "${COVER}" ]; then
-    ${ISTANBUL} cover ${EPISODIC_DIR}/client.js --dir ${REPORT_PREFIX}${COUNT} || RET=1
+    ${ISTANBUL} cover ${EPISODIC_DIR}/client.js --dir ${REPORT_PREFIX}${COUNT} -- --base "${_client}" || RET=1
     COUNT=$((COUNT+1))
   else
-    node ${EPISODIC_DIR}/client.js || RET=1
+    node ${EPISODIC_DIR}/client.js --base "${_client}" || RET=1
   fi
   kill -2 $SERVERPID || RET=1
   wait $SERVERPID
@@ -105,17 +108,21 @@
 
 # generate the first episode
 mkdir --parents ${EPISODIC_DIR}/gen-1/first-episode
-${THRIFT_COMPILER} -o ${EPISODIC_DIR}/gen-1/first-episode --gen js:node,thrift_package_output_directory=first-episode ${THRIFT_FILES_DIR}/Types.thrift
+${THRIFT_COMPILER} -o ${EPISODIC_DIR}/gen-1/first-episode --gen js:node,ts,thrift_package_output_directory=first-episode ${THRIFT_FILES_DIR}/Types.thrift
 
 # create a "package" from the first episode and "install" it, the episode file must be at the module root
 mkdir --parents ${TYPES_PACKAGE}/first-episode
 cp --force ${EPISODIC_DIR}/episodic_compilation.package.json ${TYPES_PACKAGE}/package.json
 cp --force ${EPISODIC_DIR}/gen-1/first-episode/gen-nodejs/Types_types.js ${TYPES_PACKAGE}/first-episode/
+cp --force ${EPISODIC_DIR}/gen-1/first-episode/gen-nodejs/Types_types.d.ts ${TYPES_PACKAGE}/first-episode/
+cp --force ${EPISODIC_DIR}/gen-1/first-episode/gen-nodejs/BaseService.js ${TYPES_PACKAGE}/first-episode/
+cp --force ${EPISODIC_DIR}/gen-1/first-episode/gen-nodejs/BaseService.d.ts ${TYPES_PACKAGE}/first-episode/
 cp --force ${EPISODIC_DIR}/gen-1/first-episode/gen-nodejs/thrift.js.episode ${TYPES_PACKAGE}
+rm --force --recursive ${EPISODIC_DIR}/gen-1
 
 # generate the second episode
 mkdir --parents ${EPISODIC_DIR}/gen-2/second-episode
-${THRIFT_COMPILER} -o ${EPISODIC_DIR}/gen-2/second-episode --gen js:node,imports=${TYPES_PACKAGE} ${THRIFT_FILES_DIR}/Service.thrift
+${THRIFT_COMPILER} -o ${EPISODIC_DIR}/gen-2/second-episode --gen js:node,ts,imports=${TYPES_PACKAGE} ${THRIFT_FILES_DIR}/Service.thrift
 if [ -f ${EPISODIC_DIR}/gen-2/second-episode/Types_types.js ]; then
   TESTOK=1
 fi
@@ -148,7 +155,12 @@
 done
 
 # episodic compilation test
-testEpisodicCompilation
+echo "Testing Episode Compilation"
+testEpisodicCompilation 'pure' 'pure' || TESTOK=1
+testEpisodicCompilation 'base' 'base' || TESTOK=1
+testEpisodicCompilation 'extend' 'extend' || TESTOK=1
+testEpisodicCompilation 'extend' 'base' || TESTOK=1
+testEpisodicCompilation 'base' 'pure' || TESTOK=1
 
 if [ -n "${COVER}" ]; then
   ${ISTANBUL} report --dir "${DIR}/../coverage" --include "${DIR}/../coverage/report*/coverage.json" lcov cobertura html