@tableau/taco-toolkit
Version:
Tableau Connector Toolkit
162 lines • 12 kB
JavaScript
;
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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