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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2ec93c8  THRIFT-4763: HTML compiler produces invalid HTML document 
(#1720)
2ec93c8 is described below

commit 2ec93c8a2da2531755078ab6d5a65a96e26cf4c2
Author: Sebastian Zenker <sebastian.zen...@gmx.de>
AuthorDate: Thu Jan 31 02:14:27 2019 +0100

    THRIFT-4763: HTML compiler produces invalid HTML document (#1720)
    
    * HTML: the html generator did generate a closing </code> tag without a 
match <code>
    * THRIFT-4763: added HTML test and fixed up additional HTML generation 
issues
---
 .../cpp/src/thrift/generate/t_html_generator.cc    |  39 ++-
 package-lock.json                                  | 362 +++++++++++++++++++++
 package.json                                       |   1 +
 test/Makefile.am                                   |   9 +-
 4 files changed, 390 insertions(+), 21 deletions(-)

diff --git a/compiler/cpp/src/thrift/generate/t_html_generator.cc 
b/compiler/cpp/src/thrift/generate/t_html_generator.cc
index 8dfa389..00c9a0a 100644
--- a/compiler/cpp/src/thrift/generate/t_html_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_html_generator.cc
@@ -127,10 +127,10 @@ private:
  */
 void t_html_generator::generate_program_toc() {
   f_out_ << "<table class=\"table-bordered table-striped "
-            "table-condensed\"><thead><th>Module</th><th>Services</th>"
-         << "<th>Data types</th><th>Constants</th></thead>" << endl;
+            "table-condensed\"><thead><tr><th>Module</th><th>Services</th>"
+         << "<th>Data types</th><th>Constants</th></tr></thead><tbody>" << 
endl;
   generate_program_toc_row(program_);
-  f_out_ << "</table>" << endl;
+  f_out_ << "</tbody></table>" << endl;
 }
 
 /**
@@ -240,7 +240,7 @@ void t_html_generator::generate_program_toc_row(t_program* 
tprog) {
       f_out_ << con_iter->second << "<br/>" << endl;
     }
   }
-  f_out_ << "</code></td>" << endl << "</tr>";
+  f_out_ << "</td>" << endl << "</tr>";
 }
 
 /**
@@ -253,9 +253,8 @@ void t_html_generator::generate_program() {
   current_file_ = program_->get_name() + ".html";
   string fname = get_out_dir() + current_file_;
   f_out_.open(fname.c_str());
-  f_out_ << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"" << 
endl;
-  f_out_ << "    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\";>" << 
endl;
-  f_out_ << "<html xmlns=\"http://www.w3.org/1999/xhtml\";>" << endl;
+  f_out_ << "<!DOCTYPE html>" << endl;
+  f_out_ << "<html lang=\"en\">" << endl;
   f_out_ << "<head>" << endl;
   f_out_ << "<meta http-equiv=\"Content-Type\" 
content=\"text/html;charset=utf-8\" />" << endl;
   generate_style_tag();
@@ -271,9 +270,9 @@ void t_html_generator::generate_program() {
     f_out_ << "<hr/><h2 id=\"Constants\">Constants</h2>" << endl;
     vector<t_const*> consts = program_->get_consts();
     f_out_ << "<table class=\"table-bordered table-striped table-condensed\">";
-    f_out_ << "<thead><th>Constant</th><th>Type</th><th>Value</th></thead>" << 
endl;
+    f_out_ << 
"<thead><tr><th>Constant</th><th>Type</th><th>Value</th></tr></thead><tbody>" 
<< endl;
     generate_consts(consts);
-    f_out_ << "</table>";
+    f_out_ << "</tbody></table>";
   }
 
   if (!program_->get_enums().empty()) {
@@ -335,16 +334,16 @@ void t_html_generator::generate_index() {
   current_file_ = "index.html";
   string index_fname = get_out_dir() + current_file_;
   f_out_.open(index_fname.c_str());
-  f_out_ << "<html><head>" << endl;
+  f_out_ << "<!DOCTYPE html>" << endl << "<html lang=\"en\"><head>" << endl;
   generate_style_tag();
   f_out_ << "<title>All Thrift declarations</title></head><body>" << endl
          << "<div class=\"container-fluid\">" << endl << "<h1>All Thrift 
declarations</h1>" << endl;
   f_out_ << "<table class=\"table-bordered table-striped "
-            "table-condensed\"><thead><th>Module</th><th>Services</th><th>Data 
types</th>"
-         << "<th>Constants</th></thead>" << endl;
+            
"table-condensed\"><thead><tr><th>Module</th><th>Services</th><th>Data 
types</th>"
+         << "<th>Constants</th></tr></thead><tbody>" << endl;
   vector<t_program*> programs;
   generate_program_toc_rows(program_, programs);
-  f_out_ << "</table>" << endl;
+  f_out_ << "</tbody></table>" << endl;
   f_out_ << "</div></body></html>" << endl;
   f_out_.close();
 }
@@ -861,14 +860,14 @@ void t_html_generator::print_fn_args_doc(t_function* 
tfunction) {
       f_out_ << "<br/><h4 id=\"Parameters_" << service_name_ << "_" << 
tfunction->get_name()
              << "\">Parameters</h4>" << endl;
       f_out_ << "<table class=\"table-bordered table-striped 
table-condensed\">";
-      f_out_ << "<thead><th>Name</th><th>Description</th></thead>";
+      f_out_ << 
"<thead><tr><th>Name</th><th>Description</th></tr></thead><tbody>";
       for (; arg_iter != args.end(); arg_iter++) {
         f_out_ << "<tr><td>" << (*arg_iter)->get_name();
         f_out_ << "</td><td>";
         f_out_ << escape_html((*arg_iter)->get_doc());
         f_out_ << "</td></tr>" << endl;
       }
-      f_out_ << "</table>";
+      f_out_ << "</tbody></table>";
     }
   }
 
@@ -885,14 +884,14 @@ void t_html_generator::print_fn_args_doc(t_function* 
tfunction) {
       f_out_ << "<br/><h4 id=\"Exceptions_" << service_name_ << "_" << 
tfunction->get_name()
              << "\">Exceptions</h4>" << endl;
       f_out_ << "<table class=\"table-bordered table-striped 
table-condensed\">";
-      f_out_ << "<thead><th>Type</th><th>Description</th></thead>";
+      f_out_ << 
"<thead><tr><th>Type</th><th>Description</th></tr></thead><tbody>";
       for (; ex_iter != excepts.end(); ex_iter++) {
         f_out_ << "<tr><td>" << (*ex_iter)->get_type()->get_name();
         f_out_ << "</td><td>";
         f_out_ << escape_html((*ex_iter)->get_doc());
         f_out_ << "</td></tr>" << endl;
       }
-      f_out_ << "</table>";
+      f_out_ << "</tbody></table>";
     }
   }
 }
@@ -975,8 +974,8 @@ void t_html_generator::generate_struct(t_struct* tstruct) {
   vector<t_field*> members = tstruct->get_members();
   vector<t_field*>::iterator mem_iter = members.begin();
   f_out_ << "<table class=\"table-bordered table-striped table-condensed\">";
-  f_out_ << 
"<thead><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</"
-            "th><th>Default value</th></thead>" << endl;
+  f_out_ << 
"<thead><tr><th>Key</th><th>Field</th><th>Type</th><th>Description</th><th>Requiredness</"
+            "th><th>Default value</th></tr></thead><tbody>" << endl;
   for (; mem_iter != members.end(); mem_iter++) {
     f_out_ << "<tr><td>" << (*mem_iter)->get_key() << "</td><td>";
     f_out_ << (*mem_iter)->get_name();
@@ -1001,7 +1000,7 @@ void t_html_generator::generate_struct(t_struct* tstruct) 
{
     }
     f_out_ << "</td></tr>" << endl;
   }
-  f_out_ << "</table><br/>";
+  f_out_ << "</tbody></table><br/>";
   print_doc(tstruct);
   f_out_ << "</div>";
 }
diff --git a/package-lock.json b/package-lock.json
index 8a6645f..8eb8a21 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -149,6 +149,21 @@
       "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
       "dev": true
     },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";,
+      "integrity": 
"sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "~2.1.0"
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";,
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
     "async": {
       "version": "1.5.2",
       "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz";,
@@ -160,6 +175,24 @@
       "resolved": 
"https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz";,
       "integrity": 
"sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
     },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";,
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";,
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";,
+      "integrity": 
"sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+      "dev": true
+    },
     "babylon": {
       "version": "7.0.0-beta.19",
       "resolved": 
"https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz";,
@@ -172,6 +205,15 @@
       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
       "dev": true
     },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": 
"https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";,
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "requires": {
+        "tweetnacl": "^0.14.3"
+      }
+    },
     "bindings": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz";,
@@ -247,6 +289,12 @@
       "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
       "dev": true
     },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";,
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
     "catharsis": {
       "version": "0.8.9",
       "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz";,
@@ -321,6 +369,15 @@
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
+    "combined-stream": {
+      "version": "1.0.7",
+      "resolved": 
"https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz";,
+      "integrity": 
"sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "~1.0.0"
+      }
+    },
     "commander": {
       "version": "2.19.0",
       "resolved": 
"https://registry.npmjs.org/commander/-/commander-2.19.0.tgz";,
@@ -370,6 +427,15 @@
         "which": "^1.2.9"
       }
     },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";,
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
     "debug": {
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";,
@@ -436,6 +502,12 @@
         "rimraf": "^2.2.8"
       }
     },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";,
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
     "delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";,
@@ -457,6 +529,16 @@
         "esutils": "^2.0.2"
       }
     },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";,
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "requires": {
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz";,
@@ -697,6 +779,12 @@
       "integrity": 
"sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==",
       "dev": true
     },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";,
+      "integrity": 
"sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
     "external-editor": {
       "version": "3.0.3",
       "resolved": 
"https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz";,
@@ -708,6 +796,12 @@
         "tmp": "^0.0.33"
       }
     },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": 
"https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";,
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": 
"https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";,
@@ -787,6 +881,23 @@
         "is-callable": "^1.1.3"
       }
     },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": 
"https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";,
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";,
+      "integrity": 
"sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+      "dev": true,
+      "requires": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.6",
+        "mime-types": "^2.1.12"
+      }
+    },
     "fs-constants": {
       "version": "1.0.0",
       "resolved": 
"https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz";,
@@ -870,6 +981,15 @@
       "integrity": 
"sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
       "dev": true
     },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";,
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
     "github-from-package": {
       "version": "0.0.0",
       "resolved": 
"https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz";,
@@ -945,6 +1065,36 @@
         }
       }
     },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": 
"https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";,
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.1.3",
+      "resolved": 
"https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";,
+      "integrity": 
"sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.5.5",
+        "har-schema": "^2.0.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz";,
+          "integrity": 
"sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        }
+      }
+    },
     "has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz";,
@@ -972,6 +1122,45 @@
       "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
       "dev": true
     },
+    "html-validator": {
+      "version": "3.1.3",
+      "resolved": 
"https://registry.npmjs.org/html-validator/-/html-validator-3.1.3.tgz";,
+      "integrity": 
"sha512-RhjcQIHS/SfYzQ+/JrFWKU6AVve6AuwftAG/cWX3+bpvBK/tGMqbOleKlsAxLrKD84+GSJ1oJGnkyhdVLBGCqg==",
+      "dev": true,
+      "requires": {
+        "request": "2.88.0",
+        "valid-url": "1.0.9"
+      }
+    },
+    "html-validator-cli": {
+      "version": "4.1.4",
+      "resolved": 
"https://registry.npmjs.org/html-validator-cli/-/html-validator-cli-4.1.4.tgz";,
+      "integrity": 
"sha512-4vGP107UDhhNHeWA5N8j/nUPlQbtB/W/K2x/P7aElbWMWrOkJA0MRSVFsMFrTPSAAjZWCG9uki2+1cQDzFtVcQ==",
+      "dev": true,
+      "requires": {
+        "html-validator": "3.1.3",
+        "minimist": "1.2.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": 
"https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz";,
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": 
"https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";,
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
+      }
+    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": 
"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";,
@@ -1108,6 +1297,12 @@
         "has-symbols": "^1.0.0"
       }
     },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": 
"https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";,
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";,
@@ -1120,6 +1315,12 @@
       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
       "dev": true
     },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";,
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
     "istanbul": {
       "version": "0.4.5",
       "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz";,
@@ -1203,6 +1404,12 @@
         "xmlcreate": "^1.0.1"
       }
     },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";,
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true
+    },
     "jsdoc": {
       "version": "3.5.5",
       "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz";,
@@ -1232,6 +1439,12 @@
         "node-int64": "0.4.0"
       }
     },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": 
"https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";,
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
     "json-schema-traverse": {
       "version": "0.4.1",
       "resolved": 
"https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";,
@@ -1244,6 +1457,24 @@
       "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
       "dev": true
     },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": 
"https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";,
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";,
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
     "klaw": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz";,
@@ -1275,6 +1506,21 @@
       "integrity": 
"sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
       "dev": true
     },
+    "mime-db": {
+      "version": "1.37.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz";,
+      "integrity": 
"sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.21",
+      "resolved": 
"https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz";,
+      "integrity": 
"sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
+      "dev": true,
+      "requires": {
+        "mime-db": "~1.37.0"
+      }
+    },
     "mimic-fn": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz";,
@@ -1388,6 +1634,12 @@
       "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
       "dev": true
     },
+    "oauth-sign": {
+      "version": "0.9.0",
+      "resolved": 
"https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";,
+      "integrity": 
"sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+      "dev": true
+    },
     "object-assign": {
       "version": "4.1.1",
       "resolved": 
"https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";,
@@ -1507,6 +1759,12 @@
       "integrity": 
"sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
       "dev": true
     },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": 
"https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";,
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
+    },
     "pify": {
       "version": "2.3.0",
       "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz";,
@@ -1598,6 +1856,12 @@
       "integrity": 
"sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==",
       "dev": true
     },
+    "psl": {
+      "version": "1.1.31",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz";,
+      "integrity": 
"sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
+      "dev": true
+    },
     "pump": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz";,
@@ -1619,6 +1883,12 @@
       "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz";,
       "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
     },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";,
+      "integrity": 
"sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "dev": true
+    },
     "rc": {
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz";,
@@ -1660,6 +1930,34 @@
       "integrity": 
"sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
       "dev": true
     },
+    "request": {
+      "version": "2.88.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz";,
+      "integrity": 
"sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "~0.7.0",
+        "aws4": "^1.8.0",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.6",
+        "extend": "~3.0.2",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.3.2",
+        "har-validator": "~5.1.0",
+        "http-signature": "~1.2.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.19",
+        "oauth-sign": "~0.9.0",
+        "performance-now": "^2.1.0",
+        "qs": "~6.5.2",
+        "safe-buffer": "^5.1.2",
+        "tough-cookie": "~2.4.3",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.3.2"
+      }
+    },
     "require-uncached": {
       "version": "1.0.3",
       "resolved": 
"https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz";,
@@ -1832,6 +2130,23 @@
       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
     },
+    "sshpk": {
+      "version": "1.16.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";,
+      "integrity": 
"sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+      "dev": true,
+      "requires": {
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.0.2",
+        "tweetnacl": "~0.14.0"
+      }
+    },
     "statuses": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz";,
@@ -2014,6 +2329,24 @@
       "integrity": 
"sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==",
       "dev": true
     },
+    "tough-cookie": {
+      "version": "2.4.3",
+      "resolved": 
"https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz";,
+      "integrity": 
"sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+      "dev": true,
+      "requires": {
+        "psl": "^1.1.24",
+        "punycode": "^1.4.1"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.4.1",
+          "resolved": 
"https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";,
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+          "dev": true
+        }
+      }
+    },
     "tslib": {
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz";,
@@ -2029,6 +2362,12 @@
         "safe-buffer": "^5.0.1"
       }
     },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": 
"https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";,
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true
+    },
     "type-check": {
       "version": "0.3.2",
       "resolved": 
"https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";,
@@ -2132,6 +2471,29 @@
       "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
       "dev": true
     },
+    "uuid": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz";,
+      "integrity": 
"sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+      "dev": true
+    },
+    "valid-url": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz";,
+      "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";,
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "^1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "^1.2.0"
+      }
+    },
     "which": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz";,
diff --git a/package.json b/package.json
index 729e9bf..6393ee7 100644
--- a/package.json
+++ b/package.json
@@ -47,6 +47,7 @@
     "eslint": "^5.7.0",
     "eslint-config-prettier": "^3.1.0",
     "eslint-plugin-prettier": "^3.0.0",
+    "html-validator-cli": "^4.1.4",
     "istanbul": "^0.4.5",
     "jsdoc": "^3.5.5",
     "json-int64": "^1.0.0",
diff --git a/test/Makefile.am b/test/Makefile.am
index 682e04a..f6b867c 100755
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -103,10 +103,17 @@ PRECROSS_TARGET += precross-rs
 endif
 
 #
-# generate html for ThriftTest.thrift
+# generate html for ThriftTest.thrift AND validate it!
 #
+if WITH_NODEJS
 check-local:
        $(top_builddir)/compiler/cpp/thrift --gen html -r 
$(top_srcdir)/test/ThriftTest.thrift
+       $(top_builddir)/node_modules/.bin/html-validator 
--file=gen-html/index.html --verbose
+       $(top_builddir)/node_modules/.bin/html-validator 
--file=gen-html/ThriftTest.html --verbose
+else
+check-local:
+       $(top_builddir)/compiler/cpp/thrift --gen html -r 
$(top_srcdir)/test/ThriftTest.thrift
+endif
 
 clean-local:
        $(RM) -r $(top_srcdir)/test/gen-html/

Reply via email to