UNPKG

@frontitude/cli

Version:

The Frontitude CLI enables product teams to integrate their code with Frontitude (frontitude.com), thus creating a single source of truth for their product copy, from design to development.

1 lines 3.67 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getDryRunResult=exports.extendTextsPullOptions=exports.getFileDiff=exports.updateFileWithData=exports.getDataAndFileCombinedResult=void 0;const tslib_1=require("tslib"),isEqual=require("lodash.isequal"),lodash_merge_1=tslib_1.__importDefault(require("lodash.merge")),xmlJs=tslib_1.__importStar(require("xml-js")),files_1=require("../../../../utils/files"),object_1=require("../../../../utils/object"),replaceVariables=e=>e.replace(/{{/g,'<xliff:g id="').replace(/}}/g,'">%1$s</xliff:g>'),escapeTextKey=e=>e.replace(/-/g,"_");function escapeResourceXML(e){return e.replace(/(\r?\n|\r|\t|\@|\?|'|"|\\)/gm,(function(e){switch(e){case"'":return"\\'";case'"':return'\\"';case"\r":case"\n":case"\r\n":return"\\n";case"\t":return"\\t";case"\\":return"\\\\";case"@":return"\\@";case"?":return"\\?";default:return""}}))}const readFileAsJson=async e=>{if(!e||!(0,files_1.isPathOrFileExists)(e))return{};const t=await(0,files_1.readFile)(e,{encoding:"utf8"})||"",s=xmlJs.xml2js(t,{}),l={},a=(s&&s.elements||[]).find((e=>"resources"===e.name)),r=a&&a.elements;if(!r)return{};for(const e of r)if(l[e.attributes.name]=l[e.attributes.name]||{},"string"===e.name)l[e.attributes.name].value=e&&e.elements&&e.elements.length>0&&e.elements[0].text;else if("plurals"===e.name&&e.elements&&e.elements.length>0){const t=[];for(const s of e.elements)t.push({pluralId:s.attributes.quantity,pluralValue:s&&s.elements&&s.elements.length>0&&s.elements[0].text});l[e.attributes.name].plurals=t}return l},prepareXmlData=e=>{const t={_declaration:{_attributes:{version:"1.0",encoding:"utf-8"}},resources:{_attributes:{"xmlns:xliff":"urn:oasis:names:tc:xliff:document:1.2"},string:[],plurals:[]}};for(const[s,l]of Object.entries(e)){const e=escapeTextKey(s);if(l.plurals&&Object.keys(l.plurals).length>0){const s={_attributes:{name:e},item:[]};for(const e of l.plurals){const t={_attributes:{quantity:e.pluralId},_text:escapeResourceXML(e.pluralValue)};s.item.push(t)}t.resources.plurals.push(s)}else{const s={_attributes:{name:e},_text:escapeResourceXML(l.value)};t.resources.string.push(s)}}return t},getDataAndFileCombinedResult=async(e,t)=>{const s=await readFileAsJson(e),l={};for(const[e,s]of Object.entries(t)){const t=[];if(s.plurals)for(const[e,l]of Object.entries(s.plurals))t.push({pluralId:e,pluralValue:l});l[e]={plurals:t,value:s.value}}const a=(0,lodash_merge_1.default)({},s,l);return(0,object_1.sortObjectByKeys)(a)};exports.getDataAndFileCombinedResult=getDataAndFileCombinedResult;const updateFileWithData=async(e,t)=>{const s=await readFileAsJson(e),l=await(0,exports.getDataAndFileCombinedResult)(e,t),a=xmlJs.js2xml(prepareXmlData(l),{spaces:2,compact:!0,ignoreComment:!0,textFn:replaceVariables});return await(0,files_1.writeFile)(e,a),(0,exports.getFileDiff)(s,l)};exports.updateFileWithData=updateFileWithData;const getFileDiff=(e,t)=>{const s=[],l=[];for(const s of Object.keys(e))if(t[s]){(e[s].value&&t[s].value&&e[s].value!==replaceVariables(t[s].value)||e[s].value&&!t[s].value)&&l.push(s);const a=[];if(t[s].plurals&&t[s].plurals.length>0)for(const e of t[s].plurals)a.push({pluralId:e.pluralId,pluralValue:replaceVariables(e.pluralValue)});(e[s].plurals&&a.length>0&&!isEqual(e[s].plurals,a)||e[s].plurals&&0===a.length)&&l.push(s)}for(const l of Object.keys(t))e[l]||s.push(l);return{added:s.length,edited:l.length}};exports.getFileDiff=getFileDiff;const extendTextsPullOptions=e=>({...e,isIncludeMetadata:!0});exports.extendTextsPullOptions=extendTextsPullOptions;const getDryRunResult=async(e,t)=>await(0,exports.getDataAndFileCombinedResult)(e,t.source);exports.getDryRunResult=getDryRunResult;