1*082815dcSEvan Baconexport type PropertiesItem = 2*082815dcSEvan Bacon | { 3*082815dcSEvan Bacon type: 'comment'; 4*082815dcSEvan Bacon value: string; 5*082815dcSEvan Bacon } 6*082815dcSEvan Bacon | { 7*082815dcSEvan Bacon type: 'empty'; 8*082815dcSEvan Bacon } 9*082815dcSEvan Bacon | { 10*082815dcSEvan Bacon type: 'property'; 11*082815dcSEvan Bacon key: string; 12*082815dcSEvan Bacon value: string; 13*082815dcSEvan Bacon }; 14*082815dcSEvan Bacon 15*082815dcSEvan Baconexport function parsePropertiesFile(contents: string): PropertiesItem[] { 16*082815dcSEvan Bacon const propertiesList: PropertiesItem[] = []; 17*082815dcSEvan Bacon const lines = contents.split('\n'); 18*082815dcSEvan Bacon for (let i = 0; i < lines.length; i++) { 19*082815dcSEvan Bacon const line = lines[i].trim(); 20*082815dcSEvan Bacon if (!line) { 21*082815dcSEvan Bacon propertiesList.push({ type: 'empty' }); 22*082815dcSEvan Bacon } else if (line.startsWith('#')) { 23*082815dcSEvan Bacon propertiesList.push({ type: 'comment', value: line.substring(1).trimStart() }); 24*082815dcSEvan Bacon } else { 25*082815dcSEvan Bacon const eok = line.indexOf('='); 26*082815dcSEvan Bacon const key = line.slice(0, eok); 27*082815dcSEvan Bacon const value = line.slice(eok + 1, line.length); 28*082815dcSEvan Bacon propertiesList.push({ type: 'property', key, value }); 29*082815dcSEvan Bacon } 30*082815dcSEvan Bacon } 31*082815dcSEvan Bacon 32*082815dcSEvan Bacon return propertiesList; 33*082815dcSEvan Bacon} 34*082815dcSEvan Bacon 35*082815dcSEvan Baconexport function propertiesListToString(props: PropertiesItem[]): string { 36*082815dcSEvan Bacon let output = ''; 37*082815dcSEvan Bacon for (let i = 0; i < props.length; i++) { 38*082815dcSEvan Bacon const prop = props[i]; 39*082815dcSEvan Bacon if (prop.type === 'empty') { 40*082815dcSEvan Bacon output += ''; 41*082815dcSEvan Bacon } else if (prop.type === 'comment') { 42*082815dcSEvan Bacon output += '# ' + prop.value; 43*082815dcSEvan Bacon } else if (prop.type === 'property') { 44*082815dcSEvan Bacon output += `${prop.key}=${prop.value}`; 45*082815dcSEvan Bacon } else { 46*082815dcSEvan Bacon // @ts-ignore: assertion 47*082815dcSEvan Bacon throw new Error(`Invalid properties type "${prop.type}"`); 48*082815dcSEvan Bacon } 49*082815dcSEvan Bacon if (i < props.length - 1) { 50*082815dcSEvan Bacon output += '\n'; 51*082815dcSEvan Bacon } 52*082815dcSEvan Bacon } 53*082815dcSEvan Bacon return output; 54*082815dcSEvan Bacon} 55