Skip to content

Commit 42d3136

Browse files
authored
Merge pull request #55 from kreuzerk/feature/handleCRLFLineEnding
fix: 🐛 handle multiple line endings
2 parents 311fdf6 + 6fc41ff commit 42d3136

File tree

3 files changed

+27
-7
lines changed

3 files changed

+27
-7
lines changed

src/conductor/format-import-statements.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@ type CategoryEntry = [string, Map<string, string>];
55

66
const categoriesOrder = ['thirdParty', 'userLibrary', 'differentModule', 'sameModule'];
77

8-
export function formatImportStatements(importCategories: ImportCategories) {
8+
export function formatImportStatements(importCategories: ImportCategories, lineEnding: string) {
99
const { separator } = getConfig();
10-
const [first, ...otherCategories] = Object.entries(importCategories).filter(hasImports).sort(byCategoriesOrder).map(toImportBlock);
10+
const [first, ...otherCategories] = Object.entries(importCategories)
11+
.filter(hasImports)
12+
.sort(byCategoriesOrder)
13+
.map((imports) => toImportBlock(imports, lineEnding));
1114

1215
let result = first || '';
1316

1417
for (const imports of otherCategories) {
15-
result += `${separator}\n${imports}`;
18+
result += `${separator}${lineEnding}${imports}`;
1619
}
1720

1821
return result;
@@ -26,8 +29,8 @@ function hasImports([, imports]: CategoryEntry) {
2629
return imports.size > 0;
2730
}
2831

29-
function toImportBlock([, imports]: CategoryEntry) {
30-
return [...imports.values()].map((l) => trim(l, ' \n')).join('\n');
32+
function toImportBlock([, imports]: CategoryEntry, lineEnding: string) {
33+
return [...imports.values()].map((l) => trim(l, ` ${lineEnding}`)).join(lineEnding);
3134
}
3235

3336
function escapeRegex(string: string) {

src/conductor/optimize-imports.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import simpleGit, { SimpleGit } from 'simple-git';
33
import ts from 'typescript';
44

55
import { getConfig } from '../config';
6+
import { detectLineEnding } from '../helpers/line-ending-detector';
67
import { log } from '../helpers/log';
78

8-
import { collectNonImportNodes } from './collect-non-import-nodes';
99
import { categorizeImportLiterals } from './categorize-imports';
1010
import { collectImportNodes } from './collect-import-nodes';
11+
import { collectNonImportNodes } from './collect-non-import-nodes';
1112
import { formatImportStatements } from './format-import-statements';
1213
import { getImportStatementMap } from './get-import-statement-map';
1314
import { sortImportCategories } from './sort-import-categories';
@@ -37,6 +38,7 @@ export async function optimizeImports(filePath: string): Promise<string> {
3738
}
3839

3940
let fileContent = readFileSync(filePath).toString();
41+
const lineEnding = detectLineEnding(fileContent);
4042
const { staged, autoAdd, dryRun } = getConfig();
4143
if (/\/[/*]\s*import-conductor-skip/.test(fileContent)) {
4244
log('gray', filePath, 'skipped (via comment)');
@@ -58,7 +60,7 @@ export async function optimizeImports(filePath: string): Promise<string> {
5860

5961
const categorizedImports = categorizeImportLiterals(importStatementMap);
6062
const sortedAndCategorizedImports = sortImportCategories(categorizedImports);
61-
let updatedContent = formatImportStatements(sortedAndCategorizedImports);
63+
let updatedContent = formatImportStatements(sortedAndCategorizedImports, lineEnding);
6264

6365
const lastImport = importNodes.pop();
6466
const contentWithoutImportStatements = fileContent.slice(lastImport.end);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export const detectLineEnding = (value: string) => {
2+
if (typeof value !== 'string') {
3+
throw new TypeError('Expected a string for new line detection');
4+
}
5+
const newlines = value.match(/(?:\r?\n)/g) || [];
6+
7+
if (newlines.length === 0) {
8+
return;
9+
}
10+
11+
const crlf = newlines.filter((newline) => newline === '\r\n').length;
12+
const lf = newlines.length - crlf;
13+
console.log(crlf > lf ? 'returning r and n' : 'returning r');
14+
return crlf > lf ? '\r\n' : '\n';
15+
};

0 commit comments

Comments
 (0)