Kaynağa Gözat

HUE-9239 [frontend] Add custom package.json for parser generation

With this change there's no longer a need to install jison globally
Johan Ahlen 5 yıl önce
ebeveyn
işleme
640687d143
4 değiştirilmiş dosya ile 193 ekleme ve 61 silme
  1. 8 8
      Makefile
  2. 43 53
      tools/jison/generateParsers.js
  3. 128 0
      tools/jison/package-lock.json
  4. 14 0
      tools/jison/package.json

+ 8 - 8
Makefile

@@ -279,35 +279,35 @@ ace:
 # <<<< DEV ONLY
 .PHONY: global-search-parser
 global-search-parser:
-	@node tools/jison/generateParsers.js globalSearchParser
+	@pushd tools/jison/ && node tools/jison/generateParsers.js globalSearchParser && popd
 
 .PHONY: solr-all-parsers
 solr-all-parsers:
-	@node tools/jison/generateParsers.js solrQueryParser solrFormulaParser
+	@pushd tools/jison/ && node tools/jison/generateParsers.js solrQueryParser solrFormulaParser && popd
 
 .PHONY: solr-query-parser
 solr-query-parser:
-	@node tools/jison/generateParsers.js solrQueryParser
+	@pushd tools/jison/ && node tools/jison/generateParsers.js solrQueryParser && popd
 
 .PHONY: solr-formula-parser
 solr-formula-parser:
-	@node tools/jison/generateParsers.js solrFormulaParser
+	@pushd tools/jison/ && node tools/jison/generateParsers.js solrFormulaParser && popd
 
 .PHONY: sql-all-parsers
 sql-all-parsers:
-	@node tools/jison/generateParsers.js generic hive impala
+	@pushd tools/jison/ && node generateParsers.js generic hive impala && popd && popd
 
 .PHONY: sql-autocomplete-parser
 sql-autocomplete-parser:
-	@node tools/jison/generateParsers.js genericAutocomp hiveAutocomp impalaAutocomp
+	@pushd tools/jison/ && node tools/jison/generateParsers.js genericAutocomp hiveAutocomp impalaAutocomp && popd
 
 .PHONY: sql-statement-parser
 sql-statement-parser:
-	@node tools/jison/generateParsers.js sqlStatementsParser
+	@pushd tools/jison/ && node tools/jison/generateParsers.js sqlStatementsParser && popd
 
 .PHONY: sql-syntax-parser
 sql-syntax-parser:
-	@node tools/jison/generateParsers.js genericSyntax hiveSyntax impalaSyntax
+	@pushd tools/jison/ && node tools/jison/generateParsers.js genericSyntax hiveSyntax impalaSyntax && popd
 # END DEV ONLY >>>>
 
 ###################################

+ 43 - 53
tools/jison/generateParsers.js

@@ -17,7 +17,7 @@
 /* eslint-disable no-restricted-syntax */
 
 const fs = require('fs');
-const exec = require('child_process').exec;
+const cli = require('jison/lib/cli');
 
 const LICENSE =
   '// Licensed to Cloudera, Inc. under one\n' +
@@ -43,9 +43,11 @@ const SQL_STATEMENTS_PARSER_JSDOC =
   ' * @return {SqlStatementsParserResult}\n' +
   ' */\n';
 
-const PARSER_FOLDER = 'desktop/core/src/desktop/js/parse/sql/';
-const JISON_FOLDER = 'desktop/core/src/desktop/js/parse/jison/';
-const SQL_PARSER_REPOSITORY_PATH = 'desktop/core/src/desktop/js/parse/sql/sqlParserRepository.js';
+const PARSER_FOLDER = '../../desktop/core/src/desktop/js/parse/sql/';
+const OUTPUT_FOLDER = '../../desktop/core/src/desktop/js/parse/';
+const JISON_FOLDER = '../../desktop/core/src/desktop/js/parse/jison/';
+const SQL_PARSER_REPOSITORY_PATH =
+  '../../desktop/core/src/desktop/js/parse/sql/sqlParserRepository.js';
 const SYNTAX_PARSER_IMPORT_TEMPLATE =
   '  KEY: () => import(/* webpackChunkName: "KEY-parser" */ \'parse/sql/KEY/KEYSyntaxParser\')';
 const AUTOCOMPLETE_PARSER_IMPORT_TEMPLATE =
@@ -55,7 +57,7 @@ const parserDefinitions = {
   globalSearchParser: {
     sources: ['globalSearchParser.jison'],
     target: 'globalSearchParser.jison',
-    outputFolder: 'desktop/core/src/desktop/js/parse/',
+    outputFolder: OUTPUT_FOLDER,
     afterParse: contents =>
       new Promise(resolve => {
         resolve(
@@ -71,7 +73,7 @@ const parserDefinitions = {
   solrFormulaParser: {
     sources: ['solrFormulaParser.jison'],
     target: 'solrFormulaParser.jison',
-    outputFolder: 'desktop/core/src/desktop/js/parse/',
+    outputFolder: OUTPUT_FOLDER,
     afterParse: contents =>
       new Promise(resolve => {
         resolve(LICENSE + contents + 'export default solrFormulaParser;\n');
@@ -80,7 +82,7 @@ const parserDefinitions = {
   solrQueryParser: {
     sources: ['solrQueryParser.jison'],
     target: 'solrQueryParser.jison',
-    outputFolder: 'desktop/core/src/desktop/js/parse/',
+    outputFolder: OUTPUT_FOLDER,
     afterParse: contents =>
       new Promise(resolve => {
         resolve(LICENSE + contents + 'export default solrQueryParser;\n');
@@ -89,7 +91,7 @@ const parserDefinitions = {
   sqlStatementsParser: {
     sources: ['sqlStatementsParser.jison'],
     target: 'sqlStatementsParser.jison',
-    outputFolder: 'desktop/core/src/desktop/js/parse/',
+    outputFolder: OUTPUT_FOLDER,
     afterParse: contents =>
       new Promise(resolve => {
         resolve(
@@ -153,16 +155,6 @@ const deleteFile = path => {
   fs.unlinkSync(path);
 };
 
-const execCmd = cmd =>
-  new Promise((resolve, reject) => {
-    exec(cmd, (err, stdout, stderr) => {
-      if (err) {
-        reject('stderr:\n' + stderr + '\n\nstdout:\n' + stdout);
-      }
-      resolve(stdout);
-    });
-  });
-
 const generateParser = parserName =>
   new Promise((resolve, reject) => {
     const parserConfig = parserDefinitions[parserName];
@@ -188,36 +180,38 @@ const generateParser = parserName =>
 
     concatPromise
       .then(targetPath => {
-        let jisonCommand = 'jison ' + targetPath;
+        const options = {
+          file: targetPath,
+          'module-type': 'js'
+        };
         if (parserConfig.lexer) {
-          jisonCommand += ' ' + JISON_FOLDER + parserConfig.lexer;
+          options['lexfile'] = JISON_FOLDER + parserConfig.lexer;
         }
-        jisonCommand += ' -m js';
+
         console.log('Generating parser...');
-        execCmd(jisonCommand)
-          .then(stdout => {
-            if (/\S/.test(stdout)) {
-              console.log('got output for: ' + jisonCommand);
-              console.log(stdout);
-            }
-            if (parserConfig.sources.length > 1) {
-              deleteFile(targetPath); // Remove concatenated file
-            }
-            console.log('Adjusting JS...');
-            const generatedJsFileName = parserConfig.target
-              .replace('.jison', '.js')
-              .replace(/^.*\/([^/]+)$/, '$1');
-            readFile(generatedJsFileName)
-              .then(contents => {
-                parserConfig
-                  .afterParse(contents)
-                  .then(finalContents => {
-                    writeFile(parserConfig.outputFolder + generatedJsFileName, finalContents)
-                      .then(() => {
-                        deleteFile(generatedJsFileName);
-                        resolve();
-                      })
-                      .catch(reject);
+        try {
+          cli.main(options);
+        } catch (err) {
+          console.error('Failed calling jison cli');
+          throw err;
+        }
+        if (parserConfig.sources.length > 1) {
+          deleteFile(targetPath); // Remove concatenated file
+        }
+        console.log('Adjusting JS...');
+        const generatedJsFileName = parserConfig.target
+          .replace('.jison', '.js')
+          .replace(/^.*\/([^/]+)$/, '$1');
+        console.log(generatedJsFileName);
+        readFile(generatedJsFileName)
+          .then(contents => {
+            parserConfig
+              .afterParse(contents)
+              .then(finalContents => {
+                writeFile(parserConfig.outputFolder + generatedJsFileName, finalContents)
+                  .then(() => {
+                    deleteFile(generatedJsFileName);
+                    resolve();
                   })
                   .catch(reject);
               })
@@ -249,7 +243,7 @@ const findParser = (fileIndex, folder, sharedFiles, autocomplete) => {
       lexer: 'sql/' + folder + '/sql.jisonlex',
       target: 'sql/' + folder + '/' + parserName + '.jison',
       sqlParser: autocomplete ? 'AUTOCOMPLETE' : 'SYNTAX',
-      outputFolder: 'desktop/core/src/desktop/js/parse/sql/' + folder + '/',
+      outputFolder: OUTPUT_FOLDER + 'sql/' + folder + '/',
       afterParse: contents =>
         new Promise(resolve => {
           resolve(
@@ -397,14 +391,10 @@ const prepareForNewParser = () =>
                         });
                         autocompleteSources.push('sql/' + target + '/autocomplete_footer.jison');
                         syntaxSources.push('sql/' + target + '/syntax_footer.jison');
-                        mkdir('desktop/core/src/desktop/js/parse/sql/' + target).then(() => {
+                        mkdir(PARSER_FOLDER + target).then(() => {
                           copyFile(
-                            'desktop/core/src/desktop/js/parse/sql/' +
-                              source +
-                              '/sqlParseSupport.js',
-                            'desktop/core/src/desktop/js/parse/sql/' +
-                              target +
-                              '/sqlParseSupport.js',
+                            PARSER_FOLDER + source + '/sqlParseSupport.js',
+                            PARSER_FOLDER + target + '/sqlParseSupport.js',
                             contents =>
                               contents.replace(
                                 /parser\.yy\.activeDialect = '[^']+';'/g,

+ 128 - 0
tools/jison/package-lock.json

@@ -0,0 +1,128 @@
+{
+  "name": "parser-generator",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "JSONSelect": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.4.0.tgz",
+      "integrity": "sha1-oI7cxn6z/L6Z7WMIVTRKDPKCu40="
+    },
+    "JSV": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz",
+      "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c="
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "optional": true
+    },
+    "cjson": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/cjson/-/cjson-0.3.0.tgz",
+      "integrity": "sha1-5kObkHA9MS/24iJAl76pLOPQKhQ=",
+      "requires": {
+        "jsonlint": "1.6.0"
+      }
+    },
+    "colors": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz",
+      "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q="
+    },
+    "ebnf-parser": {
+      "version": "0.1.10",
+      "resolved": "https://registry.npmjs.org/ebnf-parser/-/ebnf-parser-0.1.10.tgz",
+      "integrity": "sha1-zR9rpHfFY4xAyX7ZtXLbW6tdgzE="
+    },
+    "escodegen": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz",
+      "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=",
+      "requires": {
+        "esprima": "~1.1.1",
+        "estraverse": "~1.5.0",
+        "esutils": "~1.0.0",
+        "source-map": "~0.1.33"
+      }
+    },
+    "esprima": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz",
+      "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk="
+    },
+    "estraverse": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz",
+      "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E="
+    },
+    "esutils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz",
+      "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA="
+    },
+    "jison": {
+      "version": "https://github.com/JohanAhlen/jison/tarball/ad8e41475e",
+      "integrity": "sha512-kKqzzhj1GaVw5vTDQWV3pvKjJS9v5fheDNyN8h3CLj3mHZhbcw2Kb8iT+wPlpCJhbZ3HIxoVJFbmwg7z+ZvGrg==",
+      "requires": {
+        "JSONSelect": "0.4.0",
+        "cjson": "0.3.0",
+        "ebnf-parser": "0.1.10",
+        "escodegen": "1.3.x",
+        "esprima": "1.1.x",
+        "jison-lex": "0.3.x",
+        "lex-parser": "~0.1.3",
+        "nomnom": "1.5.2"
+      }
+    },
+    "jison-lex": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/jison-lex/-/jison-lex-0.3.4.tgz",
+      "integrity": "sha1-gcoo2E+ESZ36jFlNzePYo/Jux6U=",
+      "requires": {
+        "lex-parser": "0.1.x",
+        "nomnom": "1.5.2"
+      }
+    },
+    "jsonlint": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.0.tgz",
+      "integrity": "sha1-iKpGvCiaesk7tGyuLVihh6m7SUo=",
+      "requires": {
+        "JSV": ">= 4.0.x",
+        "nomnom": ">= 1.5.x"
+      }
+    },
+    "lex-parser": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/lex-parser/-/lex-parser-0.1.4.tgz",
+      "integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA="
+    },
+    "nomnom": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.5.2.tgz",
+      "integrity": "sha1-9DRUSKhTz71cDSYyDyR3qwUm/i8=",
+      "requires": {
+        "colors": "0.5.x",
+        "underscore": "1.1.x"
+      }
+    },
+    "source-map": {
+      "version": "0.1.43",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
+      "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
+      "optional": true,
+      "requires": {
+        "amdefine": ">=0.0.4"
+      }
+    },
+    "underscore": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.1.7.tgz",
+      "integrity": "sha1-QLq4S60Z0jAJbo1u9ii/8FXYPbA="
+    }
+  }
+}

+ 14 - 0
tools/jison/package.json

@@ -0,0 +1,14 @@
+{
+  "name": "parser-generator",
+  "version": "1.0.0",
+  "description": "",
+  "main": "generateParsers.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "jison": "https://github.com/JohanAhlen/jison/tarball/ad8e41475e"
+  }
+}