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