UNPKG

@tableau/taco-toolkit

Version:
162 lines 12 kB
"use strict"; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateDistConnectorJson = exports.validateXmlFiles = exports.validateTacoXmlFiles = exports.validateTaco = void 0; var path_1 = __importDefault(require("path")); var fs_1 = __importDefault(require("fs")); var libxmljs2_1 = __importDefault(require("libxmljs2")); var connector_1 = require("../utils/connector"); var connector_json_1 = require("../utils/connector-json"); var toolkit_paths_1 = require("../utils/toolkit-paths"); var logging_1 = require("../utils/logging"); var status_code_1 = require("../../../shared/errors/status-code"); var error_source_1 = require("../../../shared/errors/error-source"); var error_codes_1 = require("../../../shared/errors/error-codes"); var constants_1 = require("../utils/constants"); var COMMON_XML_XDS_MAP = { 'manifest.xml': 'connector_plugin_manifest_latest.xsd', 'connection-fields.xml': 'connection_fields.xsd', 'connection-metadata.xml': 'connector_plugin_metadata.xsd', }; function validateTaco(tacoRootPath, state) { var spinner = state.spinner; spinner.start("Validating taco project at ".concat(tacoRootPath)); try { var connectorJsonPath = (0, connector_1.getConnectorJsonPath)(tacoRootPath); var connectorJson = (0, connector_json_1.getConnectorJson)(connectorJsonPath); validateDistConnectorJson(connectorJson, tacoRootPath); validateTacoXmlFiles(connectorJson, tacoRootPath); } catch (e) { spinner.fail('Validation failed!'); (0, logging_1.logFatalError)({ statusCode: status_code_1.StatusCode.Cancelled, errorSource: error_source_1.ErrorSources.Client, errorCode: error_codes_1.ErrorCodes.T7LNRZ5C, message: e.toString(), error: e, }); process.exit(constants_1.TACO_COMMAND_ERROR_EXIT_CODE); } spinner.success('Validation succeeded! The project is ready to pack.'); } exports.validateTaco = validateTaco; function getValidationFileInfos(connectorJson, tacoRootPath) { var e_1, _a; var validationFileInfos = []; try { for (var _b = __values(Object.entries(COMMON_XML_XDS_MAP)), _c = _b.next(); !_c.done; _c = _b.next()) { var _d = __read(_c.value, 2), xmlFile = _d[0], xsdFile = _d[1]; validationFileInfos.push({ xmlFilePath: path_1.default.join(tacoRootPath, xmlFile), xsdFilePath: path_1.default.join(toolkit_paths_1.VALIDATION_DIR_PATH, xsdFile), }); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } if ((0, connector_json_1.isOauthConnector)(connectorJson)) { validationFileInfos.push({ xmlFilePath: path_1.default.join(tacoRootPath, 'oauth-config.xml'), xsdFilePath: path_1.default.join(toolkit_paths_1.VALIDATION_DIR_PATH, 'oauth_config.xsd'), }); } return validationFileInfos; } function validateTacoXmlFiles(connectorJson, tacoRootPath) { var validationFileInfos = getValidationFileInfos(connectorJson, tacoRootPath); // separate the impl, so that we can individually test the validation files validateXmlFiles(validationFileInfos); } exports.validateTacoXmlFiles = validateTacoXmlFiles; function validateXmlFiles(validationFileInfos) { var e_2, _a; // validate required xml files are existed var missingFiles = validationFileInfos.filter(function (_a) { var xmlFilePath = _a.xmlFilePath; return !fs_1.default.existsSync(xmlFilePath); }); if (missingFiles.length > 0) { throw new Error("Missing required taco files:\n".concat(missingFiles.map(function (_a) { var xmlFilePath = _a.xmlFilePath; return xmlFilePath; }).join('\n'))); } try { // validate xml files content for (var validationFileInfos_1 = __values(validationFileInfos), validationFileInfos_1_1 = validationFileInfos_1.next(); !validationFileInfos_1_1.done; validationFileInfos_1_1 = validationFileInfos_1.next()) { var _b = validationFileInfos_1_1.value, xmlFilePath = _b.xmlFilePath, xsdFilePath = _b.xsdFilePath; logging_1.logger.debug("Validating ".concat(xmlFilePath, " with schema ").concat(xsdFilePath)); var xmlDoc = libxmljs2_1.default.parseXml(fs_1.default.readFileSync(xmlFilePath).toString()); var xsdDoc = libxmljs2_1.default.parseXml(fs_1.default.readFileSync(xsdFilePath).toString()); if (!xmlDoc.validate(xsdDoc)) { throw new Error("Invalid taco XML file was found at: ".concat(xmlFilePath, ".\nErrors: ").concat(xmlDoc.validationErrors)); } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (validationFileInfos_1_1 && !validationFileInfos_1_1.done && (_a = validationFileInfos_1.return)) _a.call(validationFileInfos_1); } finally { if (e_2) throw e_2.error; } } } exports.validateXmlFiles = validateXmlFiles; function validateDistConnectorJson(sourceConnectorJson, tacoRootPath) { var e_3, _a; var sourceContent = JSON.stringify(sourceConnectorJson); try { for (var sourceTypes_1 = __values(connector_1.sourceTypes), sourceTypes_1_1 = sourceTypes_1.next(); !sourceTypes_1_1.done; sourceTypes_1_1 = sourceTypes_1.next()) { var target = sourceTypes_1_1.value; var connectorJsonPath = path_1.default.join(tacoRootPath, 'dist', target, 'connector.json'); var connectJson = (0, connector_json_1.getConnectorJson)(connectorJsonPath); if (sourceContent !== JSON.stringify(connectJson)) { throw new Error("Forgot to build? connector.json at '".concat(connectorJsonPath, "' is inconsistent with its source at ").concat((0, connector_1.getConnectorJsonPath)(tacoRootPath))); } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (sourceTypes_1_1 && !sourceTypes_1_1.done && (_a = sourceTypes_1.return)) _a.call(sourceTypes_1); } finally { if (e_3) throw e_3.error; } } } exports.validateDistConnectorJson = validateDistConnectorJson; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGkvdGFjby1jb21tYW5kcy9wYWNrL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQXVCO0FBQ3ZCLDBDQUFtQjtBQUNuQix3REFBaUM7QUFHakMsZ0RBQXNFO0FBQ3RFLDBEQUE0RTtBQUM1RSx3REFBNEQ7QUFDNUQsNENBQXdEO0FBQ3hELGtFQUErRDtBQUMvRCxvRUFBa0U7QUFDbEUsa0VBQStEO0FBRS9ELGdEQUFpRTtBQUVqRSxJQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxjQUFjLEVBQUUsc0NBQXNDO0lBQ3RELHVCQUF1QixFQUFFLHVCQUF1QjtJQUNoRCx5QkFBeUIsRUFBRSwrQkFBK0I7Q0FDbEQsQ0FBQTtBQU9WLFNBQWdCLFlBQVksQ0FBQyxZQUFvQixFQUFFLEtBQXFCO0lBQzlELElBQUEsT0FBTyxHQUFLLEtBQUssUUFBVixDQUFVO0lBRXpCLE9BQU8sQ0FBQyxLQUFLLENBQUMscUNBQThCLFlBQVksQ0FBRSxDQUFDLENBQUE7SUFDM0QsSUFBSTtRQUNGLElBQU0saUJBQWlCLEdBQUcsSUFBQSxnQ0FBb0IsRUFBQyxZQUFZLENBQUMsQ0FBQTtRQUM1RCxJQUFNLGFBQWEsR0FBRyxJQUFBLGlDQUFnQixFQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFekQseUJBQXlCLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ3RELG9CQUFvQixDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQTtLQUNsRDtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ2xDLElBQUEsdUJBQWEsRUFBQztZQUNaLFVBQVUsRUFBRSx3QkFBVSxDQUFDLFNBQVM7WUFDaEMsV0FBVyxFQUFFLDJCQUFZ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