@tableau/taco-toolkit
Version:
Tableau Connector Toolkit
113 lines • 12.8 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.adaptConnectorForLocalization = void 0;
var path_1 = __importDefault(require("path"));
var fs_1 = __importDefault(require("fs"));
var fs_extra_1 = __importDefault(require("fs-extra"));
var os_1 = __importDefault(require("os"));
var eps_logger_1 = require("../../logging/eps-logger");
var app_config_utils_1 = require("../../utils/app-config-utils");
// Note:
// -- one alternative is to use packaged parsers(htmlparser2, cheerio, html - parser etc) but we probably wouldn't intend to do extra maintainence or owning for 3PL packages for this use case only
// -- one alternative is to do resource file level actions but seems parcel would build index.html with detailed src for script tag which is not working with Tableau Localize package impl thus leave as a future option
// => utilize regex for now to avoid extra maintainence for 3PL package and this is for now a single line identifier, will add detailed test cases to protect
var languagePattern = /<script id=("|')taco-language("|').*><\/script>/g;
var localePattern = /<script id=("|')taco-locale("|').*><\/script>/g;
var fallbackLanguage = 'en_US';
var fallbackLocale = 'en_US';
var i18nResourceFolder = 'i18n';
// [i18n] LocalizationAdapter to adapt connectors based on monolith user runtime localization context
// TODO: add a way to check allowed language and locale, leave for future impl since for now all passed from the monolith
function adaptConnectorForLocalization(distinctConnectorName, connectorAppPath, language, locale, defaultLanguage, defaultLocale) {
var isHyperforce = (0, app_config_utils_1.getRequiredEnvVariable)('EPS_UNPACK_STATIC_TACOS').valueOf() === 'true';
var baseFileName = 'index.html';
var baseIndexFilePath = path_1.default.resolve(connectorAppPath, baseFileName);
if (!fs_extra_1.default.existsSync(baseIndexFilePath) && isHyperforce) {
eps_logger_1.Logger.info("[i18n] connector - ".concat(distinctConnectorName, " has no entry point file provided by '").concat(baseIndexFilePath, "'"));
return baseFileName; // It can fail above
}
try {
var content = fs_extra_1.default.readFileSync(baseIndexFilePath).toString();
// shouldn't we check for the localePattern?
if (!content.match(languagePattern)) {
eps_logger_1.Logger.info("[i18n] connector - ".concat(distinctConnectorName, " is not localized so bypass localiztion adapting"));
return baseFileName;
}
eps_logger_1.Logger.info("[i18n] adapt ".concat(distinctConnectorName, " at ").concat(connectorAppPath, " - language:").concat(language, ", locale:").concat(locale, ", defaultLanguage:").concat(defaultLanguage, ", defaultLocale:").concat(defaultLocale));
var runtimeLanguage = getLanguageByCheckingResourceFilePath(language, defaultLanguage, connectorAppPath);
var runtimeLocale = getLocaleByCheckingResourceFilePath(locale, defaultLocale, connectorAppPath);
eps_logger_1.Logger.info("[i18n] runtime localization context - language:".concat(runtimeLanguage, ", locale:").concat(runtimeLocale));
if (isHyperforce) {
// if we have already created the localized version, we don't have to repeat
var locFileName = "index.".concat(runtimeLanguage, ".").concat(runtimeLocale, ".html");
var locIndexFilePath = path_1.default.join(connectorAppPath, locFileName);
if (!fs_extra_1.default.existsSync(locIndexFilePath)) {
content = adaptConnectorContent(content, runtimeLanguage, runtimeLocale);
// We write to a temp file and then move to the app folder to make sure we don't step on the file
// this code to figure out the temp dir and create it is to be deleted
var tempDir = process.env.EPS_TEMP_DIR_PATH || path_1.default.join(os_1.default.tmpdir(), 'tableau-eps-temp');
fs_1.default.mkdirSync(tempDir, { recursive: true }); // tis should already have been done
var tmpDir = fs_1.default.mkdtempSync(path_1.default.join(tempDir, 'i18n-adapt'));
var tmpFile = path_1.default.join(tmpDir, 'index.html');
eps_logger_1.Logger.info("[i18n] creating ".concat(locIndexFilePath, " via ").concat(tmpFile));
fs_extra_1.default.writeFileSync(tmpFile, content);
fs_extra_1.default.moveSync(tmpFile, locIndexFilePath, { overwrite: true });
}
return locFileName;
}
else {
content = adaptConnectorContent(content, runtimeLanguage, runtimeLocale);
fs_extra_1.default.writeFileSync(baseIndexFilePath, content);
}
return baseFileName;
}
catch (err) {
// adapting logic does not break main workflow
eps_logger_1.Logger.error("[i18n] localization connector adapting error: ".concat(err));
return baseFileName;
}
}
exports.adaptConnectorForLocalization = adaptConnectorForLocalization;
// adapt connector content
function adaptConnectorContent(content, language, locale) {
// ex - initial:
// original: <script id="taco-language"></script>
// overridden: <script id="taco-language" src="./i18n/messages.ja_JP.js"></script>
// ex - reuse:
// original: <script id="taco-language" src="./i18n/messages.ja_JP.js"></script>
// overridden: <script id="taco-language" src="./i18n/messages.es_ES.js"></script>
var runtimeLanguageResource = "<script id=\"taco-language\" src=\"./".concat(i18nResourceFolder, "/messages.").concat(language, ".js\"></script>");
content = content.replace(languagePattern, runtimeLanguageResource);
var runtimeLocaleResource = "<script id=\"taco-locale\" src=\"./".concat(i18nResourceFolder, "/formatters-and-parsers.").concat(locale, ".js\"></script>");
content = content.replace(localePattern, runtimeLocaleResource);
return content;
}
// get language based on validating resource path
function getLanguageByCheckingResourceFilePath(language, defaultLanguage, connectorAppPath) {
// runtime language -> default startup language -> fallback language
var languageFilePath = path_1.default.resolve(connectorAppPath, i18nResourceFolder, "messages.".concat(language, ".js"));
if (fs_extra_1.default.existsSync(languageFilePath)) {
return language;
}
var defaultLanguageFilePath = path_1.default.resolve(connectorAppPath, i18nResourceFolder, "messages.".concat(defaultLanguage, ".js"));
if (fs_extra_1.default.existsSync(defaultLanguageFilePath)) {
return defaultLanguage;
}
return fallbackLanguage;
}
// get locale based on validating resource path
function getLocaleByCheckingResourceFilePath(locale, defaultLocale, connectorAppPath) {
var localeFilePath = path_1.default.resolve(connectorAppPath, i18nResourceFolder, "formatters-and-parsers.".concat(locale, ".js"));
if (fs_extra_1.default.existsSync(localeFilePath)) {
return locale;
}
var defaultLocaleFilePath = path_1.default.resolve(connectorAppPath, i18nResourceFolder, "formatters-and-parsers.".concat(defaultLocale, ".js"));
if (fs_extra_1.default.existsSync(defaultLocaleFilePath)) {
return defaultLocale;
}
return fallbackLocale;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZXBzL21haW4vY29tcG9uZW50cy9sb2NhbGl6YXRpb24tYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4Q0FBdUI7QUFDdkIsMENBQW1CO0FBQ25CLHNEQUEwQjtBQUMxQiwwQ0FBbUI7QUFDbkIsdURBQWlEO0FBQ2pELGlFQUFxRTtBQUVyRSxRQUFRO0FBQ1Isb01BQW9NO0FBQ3BNLHlOQUF5TjtBQUN6Tiw2SkFBNko7QUFDN0osSUFBTSxlQUFlLEdBQUcsa0RBQWtELENBQUE7QUFDMUUsSUFBTSxhQUFhLEdBQUcsZ0RBQWdELENBQUE7QUFFdEUsSUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUE7QUFDaEMsSUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFBO0FBRTlCLElBQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFBO0FBRWpDLHFHQUFxRztBQUNyRyx5SEFBeUg7QUFDekgsU0FBZ0IsNkJBQTZCLENBQzNDLHFCQUE2QixFQUM3QixnQkFBd0IsRUFDeEIsUUFBZ0IsRUFDaEIsTUFBYyxFQUNkLGVBQXVCLEVBQ3ZCLGFBQXFCO0lBRXJCLElBQU0sWUFBWSxHQUFHLElBQUEseUNBQXNCLEVBQUMseUJBQXlCLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxNQUFNLENBQUE7SUFDM0YsSUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFBO0lBQ2pDLElBQU0saUJBQWlCLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN0RSxJQUFJLENBQUMsa0JBQUcsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxZQUFZLEVBQUU7UUFDdEQsbUJBQU0sQ0FBQyxJQUFJLENBQ1QsNkJBQXNCLHFCQUFxQixtREFBeUMsaUJBQWlCLE1BQUcsQ0FDekcsQ0FBQTtRQUNELE9BQU8sWUFB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