diff --git a/package-lock.json b/package-lock.json index a6131cf..06587e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,11 @@ "@actions/github": "^5.0.0", "@actions/io": "^1.1.1", "@actions/tool-cache": "^2.0.1", + "@iarna/toml": "^2.2.5", + "hcl-parser": "^0.1.1", + "hcl2-parser": "^1.0.3", + "js-hcl-parser": "^1.0.1", + "js-yaml": "^4.1.0", "moment": "^2.29.4", "uuid": "^8.3.2" }, @@ -94,14 +99,6 @@ "undici": "^5.25.4" } }, - "node_modules/@actions/tool-cache/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@actions/tool-cache/node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -119,6 +116,11 @@ "node": ">=14" } }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, "node_modules/@octokit/auth-token": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", @@ -235,6 +237,11 @@ "ncc": "dist/ncc/cli.js" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/before-after-hook": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", @@ -245,6 +252,16 @@ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, + "node_modules/hcl-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/hcl-parser/-/hcl-parser-0.1.1.tgz", + "integrity": "sha512-14aEh09F3MXJLgCrWsVHKem7oK8HFnnYkgRkgPfv6qBPoay290UN6hIxcy5PkeATt5BZa/AKAbPboiipglPqow==" + }, + "node_modules/hcl2-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hcl2-parser/-/hcl2-parser-1.0.3.tgz", + "integrity": "sha512-NQUm/BFF+2nrBfeqDhhsy4DxxiLHgkeE3FywtjFiXnjSUaio3w4Tz1MQ3vGJBUhyArzOXJ24pO7JwE5LAn7Ncg==" + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -253,6 +270,22 @@ "node": ">=0.10.0" } }, + "node_modules/js-hcl-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-hcl-parser/-/js-hcl-parser-1.0.1.tgz", + "integrity": "sha512-fCs/gex31g5FYiXItz6UJBJpKnQoRE7+B3yVv6YqPKce9/k/a0QlJXjoicfvt8jGLy8CHKJ641RXe93xSZCM7A==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -300,6 +333,14 @@ "node": ">=10.13.0" } }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -431,11 +472,6 @@ "undici": "^5.25.4" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -448,6 +484,11 @@ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==" }, + "@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" + }, "@octokit/auth-token": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", @@ -555,6 +596,11 @@ "integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==", "dev": true }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "before-after-hook": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", @@ -565,11 +611,34 @@ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, + "hcl-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/hcl-parser/-/hcl-parser-0.1.1.tgz", + "integrity": "sha512-14aEh09F3MXJLgCrWsVHKem7oK8HFnnYkgRkgPfv6qBPoay290UN6hIxcy5PkeATt5BZa/AKAbPboiipglPqow==" + }, + "hcl2-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hcl2-parser/-/hcl2-parser-1.0.3.tgz", + "integrity": "sha512-NQUm/BFF+2nrBfeqDhhsy4DxxiLHgkeE3FywtjFiXnjSUaio3w4Tz1MQ3vGJBUhyArzOXJ24pO7JwE5LAn7Ncg==" + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" }, + "js-hcl-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-hcl-parser/-/js-hcl-parser-1.0.1.tgz", + "integrity": "sha512-fCs/gex31g5FYiXItz6UJBJpKnQoRE7+B3yVv6YqPKce9/k/a0QlJXjoicfvt8jGLy8CHKJ641RXe93xSZCM7A==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -597,6 +666,11 @@ "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", diff --git a/package.json b/package.json index 7b04ac0..66c2405 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,17 @@ "@actions/github": "^5.0.0", "@actions/io": "^1.1.1", "@actions/tool-cache": "^2.0.1", + "@iarna/toml": "^2.2.5", + "hcl-parser": "^0.1.1", + "hcl2-parser": "^1.0.3", + "js-hcl-parser": "^1.0.1", + "js-yaml": "^4.1.0", "moment": "^2.29.4", "uuid": "^8.3.2" }, "devDependencies": { + "@types/uuid": "^8.3.4", "@vercel/ncc": "^0.36.1", - "prettier": "^2.4.1", - "@types/uuid": "^8.3.4" + "prettier": "^2.4.1" } } diff --git a/src/main.js b/src/main.js index ef5fb35..762ae42 100644 --- a/src/main.js +++ b/src/main.js @@ -5,11 +5,13 @@ const github = require("@actions/github"); const io = require("@actions/io"); const filepath = require('path'); const fs = require("fs"); +const yaml = require('js-yaml'); +const HCL = require("js-hcl-parser") +const toml = require('@iarna/toml'); function readJSON(filename) { - const rawdata = fs.readFileSync(filename); - const parsedJSON = JSON.parse(rawdata.toString()); - return parsedJSON; + const rawData = fs.readFileSync(filename); + return JSON.parse(rawData.toString()); } function cleanupOutput(resultsJSONFile, outputFormats) { @@ -18,17 +20,88 @@ function cleanupOutput(resultsJSONFile, outputFormats) { } } -function processOutputPath(output) { - if (output === '') { - return { - path: "./", - resultsJSONFile: "./results.json" +async function processOutputPath(output, configPath) { + const workspace = "/github/workspace" + let resultsFileName = ''; + if (configPath !== '' ) { + + [config_type, content] = await fileAnalyzer(configPath, workspace); + + if (config_type !== '') { + resultsFileName = content["output-name"] || ''; + if (resultsFileName !== '') { + // if the output file name does not have an extension, add .json + if (!resultsFileName.includes('.')) { + resultsFileName = resultsFileName + ".json"; + } + } } } + if (output === '') { + output = "./"; + } + + if (resultsFileName === '') { + resultsFileName = filepath.join(output, "/results.json") + } else { + resultsFileName = filepath.join(workspace, resultsFileName); + } + return { path: output, - resultsJSONFile: filepath.join(output, "/results.json") + resultsJSONFile: resultsFileName + } +} + +function readFileContent(filePath, workspace) { + try { + // read file content + console.log(`Reading file: ${filePath}`); + console.log(`Workspace: ${workspace}`); + const path = filepath.join(workspace, filePath); + const stats = fs.statSync(path); // Use fs.statSync to get file stats synchronously + if (!stats.isFile()) { + throw new Error('Provided path is not a file.'); + } + const data = fs.readFileSync(path, 'utf8'); // Use fs.readFileSync to read file content synchronously + return data; + } catch (error) { + console.error('Error reading file:', error); + return ''; // Return empty string or handle the error as needed + } +} +async function fileAnalyzer(filePath, workspace) { + const fileContent = await readFileContent(filePath, workspace); + let temp = {}; + + if (fileContent === '') { + console.log('Error analyzing file: Empty file content'); + return ['', {}]; + } + + try { + const jsonData = JSON.parse(fileContent); + return ['json', jsonData]; + } catch (jsonError) { + try { + const parsed = HCL.parse(fileContent); + const jsonData = JSON.parse(parsed); + return ['hcl', jsonData]; + } catch (hclErr) { + try { + temp = toml.parse(fileContent); + return ['toml', temp]; + } catch (tomlErr) { + try { + temp = yaml.load(fileContent); + return ['yaml', temp]; + } catch (yamlErr) { + console.log(`Error analyzing file: Invalid configuration file format`); + return ['', {}]; + } + } + } } } @@ -52,10 +125,11 @@ async function main() { let enableJobsSummary = process.env.INPUT_ENABLE_JOBS_SUMMARY; const commentsWithQueries = process.env.INPUT_COMMENTS_WITH_QUERIES; const excludedColumnsForCommentsWithQueries = process.env.INPUT_EXCLUDED_COLUMNS_FOR_COMMENTS_WITH_QUERIES.split(','); - const outputPath = processOutputPath(process.env.INPUT_OUTPUT_PATH); + const outputPath = await processOutputPath(process.env.INPUT_OUTPUT_PATH, process.env.INPUT_CONFIG_PATH); const outputFormats = process.env.INPUT_OUTPUT_FORMATS; const exitCode = process.env.KICS_EXIT_CODE + console.log("Output Path: ", outputPath); try { const octokit = github.getOctokit(githubToken); let context = {};