THRIFT-4675: Generate Int64 constants for js
diff --git a/lib/ts/Gruntfile.js b/lib/ts/Gruntfile.js
new file mode 100644
index 0000000..fcd79f8
--- /dev/null
+++ b/lib/ts/Gruntfile.js
@@ -0,0 +1,163 @@
+//To build dist/thrift.js, dist/thrift.min.js and doc/*
+//run grunt at the command line in this directory.
+//Prerequisites:
+// Node Setup -   nodejs.org
+// Grunt Setup -  npm install  //reads the ./package.json and installs project dependencies
+// Run grunt -    npx grunt  // uses project-local installed version of grunt (from package.json)
+
+module.exports = function(grunt) {
+  'use strict';
+
+  grunt.initConfig({
+    pkg: grunt.file.readJSON('package.json'),
+    concat: {
+      options: {
+        separator: ';'
+      },
+      dist: {
+        src: ['src/**/*.js'],
+        dest: 'dist/<%= pkg.name %>.js'
+      }
+    },
+    shell: {
+      InstallThriftJS: {
+        command: 'mkdir -p test/build/ts/lib; cp ../js/src/thrift.js test/build/ts/thrift.js'
+      },
+      InstallThriftNodeJSDep: {
+        command: 'cd ../..; npm install'
+      },
+      InstallTestLibs: {
+        command: 'cd test; ant download_jslibs'
+      },
+      ThriftGen: {
+        command: [
+          'mkdir -p test/gen-js',
+          '../../compiler/cpp/thrift -gen js:ts --out test/gen-js ../../test/ThriftTest.thrift',
+          'mkdir -p test/gen-nodejs',
+          '../../compiler/cpp/thrift -gen js:node,ts --out test/gen-nodejs ../../test/ThriftTest.thrift',
+        ].join(' && ')
+      },
+      ThriftBrowserifyNodeInt64: {
+        command: [
+          './node_modules/browserify/bin/cmd.js ./node_modules/node-int64/Int64.js -s Int64 -o test/build/js/lib/Int64.js',
+          './node_modules/browserify/bin/cmd.js ../nodejs/lib/thrift/int64_util.js -s Int64Util -o test/build/js/lib/Int64Util.js',
+          './node_modules/browserify/bin/cmd.js ./node_modules/json-int64/index.js -s JSONInt64 -o test/build/js/lib/JSONInt64.js'
+        ].join(' && ')
+      },
+      ThriftGenInt64: {
+        command: '../../compiler/cpp/thrift -gen js:ts -o test ../../test/Int64Test.thrift'
+      },
+      ThriftTestServer: {
+        options: {
+          async: true,
+          execOptions: {
+            cwd: "./test",
+            env: {NODE_PATH: "../../nodejs/lib:../../../node_modules"}
+          }
+        },
+        command: "node server_http.js",
+      },
+      BuildTS: {
+        options: {
+          execOptions: {
+            cwd: "./test",
+          }
+        },
+        command : "../node_modules/typescript/bin/tsc --listFiles --outDir build/ts"
+      },
+      BrowserifyCompiledTS: {
+        command: [
+          "./node_modules/browserify/bin/cmd.js test/build/ts/test.js -o test/build/ts/lib/test.js --standalone test",
+          "./node_modules/browserify/bin/cmd.js test/build/ts/test-int64.js -o test/build/ts/lib/test-int64.js --standalone testInt64",
+        ].join(" && ")
+      },
+      InstallGeneratedCode: {
+        command: [
+          "mkdir -p test/build/ts",
+          "cp -r test/gen-js test/build/ts"
+        ].join(" && ")
+      },
+    },
+    qunit: {
+      ThriftJS: {
+        options: {
+          urls: [
+            'http://localhost:8089/test.html'
+          ],
+          puppeteer: {
+            headless: true,
+            args: ['--no-sandbox'],
+          },
+        }
+      },
+      ThriftJS_Int64: {
+        options: {
+          urls: [
+            'http://localhost:8089/test-int64.html'
+          ],
+          puppeteer: {
+            headless: true,
+            args: ['--no-sandbox'],
+            ignoreHTTPSErrors: true,
+          },
+        }
+      },
+    },
+    jshint: {
+      // The main Thrift library file. not es6 yet :(
+      lib: {
+        src: ['../js/src/**/*.js'],
+      },
+      // The test files use es6
+      test: {
+        src: ['Gruntfile.js', 'test/*.js'],
+        options: {
+          esversion: 6,
+        }
+      },
+      gen_js_code: {
+        src: ['test/gen-js/*.js'],
+      },
+      gen_node_code: {
+        src: ['test/gen-nodejs/*.js'],
+        options: {
+          node: true,
+        }
+      },
+    },
+  });
+
+  grunt.loadNpmTasks('grunt-contrib-jshint');
+  grunt.loadNpmTasks('grunt-contrib-qunit');
+  grunt.loadNpmTasks('grunt-shell-spawn');
+
+  grunt.registerTask('wait', 'Wait just one second for the server to start', function () {
+    var done = this.async();
+    setTimeout(function() {
+      done(true);
+    }, 1000);
+  });
+
+  grunt.registerTask('installAndGenerate', [
+    'shell:InstallThriftJS',
+    'shell:InstallThriftNodeJSDep',
+    'shell:ThriftGen',
+    'shell:ThriftBrowserifyNodeInt64',
+    'shell:ThriftGenInt64',
+    'shell:InstallTestLibs',
+    'shell:BuildTS',
+    'shell:InstallGeneratedCode',
+    'shell:BrowserifyCompiledTS',
+  ]);
+
+  grunt.registerTask('test', [
+    'installAndGenerate',
+    'jshint',
+    'shell:ThriftTestServer',
+    'wait',
+    'qunit:ThriftJS',
+    'qunit:ThriftJS_Int64',
+    'shell:ThriftTestServer:kill',
+  ]);
+  grunt.registerTask('default', ['test']);
+};