Skip to content

Commit 1956dbd

Browse files
authored
refactor: centralise status aliases into shared lib/aliases.mjs (#62)
* refactor: centralise status aliases into shared aliases.mjs * fix: add missing import, lowercase ALIASES return in analyze-patterns, add trailing newline
1 parent 6dd591a commit 1956dbd

5 files changed

Lines changed: 24 additions & 45 deletions

File tree

analyze-patterns.mjs

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import { readFileSync, existsSync } from 'fs';
1515
import { join, dirname } from 'path';
1616
import { fileURLToPath } from 'url';
17+
import { ALIASES } from './lib/aliases.mjs';
18+
1719

1820
const CAREER_OPS = dirname(fileURLToPath(import.meta.url));
1921
const APPS_FILE = existsSync(join(CAREER_OPS, 'data/applications.md'))
@@ -27,25 +29,13 @@ const summaryMode = args.includes('--summary');
2729
const minThresholdIdx = args.indexOf('--min-threshold');
2830
const MIN_THRESHOLD = minThresholdIdx !== -1 ? parseInt(args[minThresholdIdx + 1]) || 5 : 5;
2931

32+
3033
// --- Status normalization (mirrors verify-pipeline.mjs) ---
31-
const ALIASES = {
32-
'evaluada': 'evaluated', 'condicional': 'evaluated', 'hold': 'evaluated',
33-
'evaluar': 'evaluated', 'verificar': 'evaluated',
34-
'aplicado': 'applied', 'enviada': 'applied', 'aplicada': 'applied',
35-
'applied': 'applied', 'sent': 'applied',
36-
'respondido': 'responded',
37-
'entrevista': 'interview',
38-
'oferta': 'offer',
39-
'rechazado': 'rejected', 'rechazada': 'rejected',
40-
'descartado': 'discarded', 'descartada': 'discarded',
41-
'cerrada': 'discarded', 'cancelada': 'discarded',
42-
'no aplicar': 'skip', 'no_aplicar': 'skip', 'monitor': 'skip', 'geo blocker': 'skip',
43-
};
4434

4535
function normalizeStatus(raw) {
4636
const clean = raw.replace(/\*\*/g, '').trim().toLowerCase()
4737
.replace(/\s+\d{4}-\d{2}-\d{2}.*$/, '').trim();
48-
return ALIASES[clean] || clean;
38+
return (ALIASES[clean] || clean).toLowerCase();
4939
}
5040

5141
function classifyOutcome(status) {

lib/aliases.mjs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export const ALIASES = {
2+
'evaluada': 'Evaluated', 'condicional': 'Evaluated', 'hold': 'Evaluated',
3+
'evaluar': 'Evaluated', 'verificar': 'Evaluated',
4+
'aplicado': 'Applied', 'enviada': 'Applied', 'aplicada': 'Applied',
5+
'applied': 'Applied', 'sent': 'Applied',
6+
'respondido': 'Responded',
7+
'entrevista': 'Interview',
8+
'oferta': 'Offer',
9+
'rechazado': 'Rejected', 'rechazada': 'Rejected',
10+
'descartado': 'Discarded', 'descartada': 'Discarded',
11+
'cerrada': 'Discarded', 'cancelada': 'Discarded',
12+
'no aplicar': 'SKIP', 'no_aplicar': 'SKIP', 'monitor': 'SKIP', 'geo blocker': 'SKIP',
13+
};

merge-tracker.mjs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import { readFileSync, writeFileSync, readdirSync, mkdirSync, renameSync, existsSync } from 'fs';
1818
import { join, basename, dirname } from 'path';
1919
import { fileURLToPath } from 'url';
20+
import { ALIASES } from './lib/aliases.mjs';
2021

2122
const CAREER_OPS = dirname(fileURLToPath(import.meta.url));
2223
// Support both layouts: data/applications.md (boilerplate) and applications.md (original)
@@ -40,20 +41,8 @@ function validateStatus(status) {
4041
}
4142

4243
// Aliases
43-
const aliases = {
44-
// Spanish → English
45-
'evaluada': 'Evaluated', 'condicional': 'Evaluated', 'hold': 'Evaluated', 'evaluar': 'Evaluated', 'verificar': 'Evaluated',
46-
'aplicado': 'Applied', 'enviada': 'Applied', 'aplicada': 'Applied', 'applied': 'Applied', 'sent': 'Applied',
47-
'respondido': 'Responded',
48-
'entrevista': 'Interview',
49-
'oferta': 'Offer',
50-
'rechazado': 'Rejected', 'rechazada': 'Rejected',
51-
'descartado': 'Discarded', 'descartada': 'Discarded', 'cerrada': 'Discarded', 'cancelada': 'Discarded',
52-
'no aplicar': 'SKIP', 'no_aplicar': 'SKIP', 'skip': 'SKIP', 'monitor': 'SKIP',
53-
'geo blocker': 'SKIP',
54-
};
5544

56-
if (aliases[lower]) return aliases[lower];
45+
if (ALIASES[lower]) return ALIASES[lower];
5746

5847
// DUPLICADO/Repost → Discarded
5948
if (/^(duplicado|dup|repost)/i.test(lower)) return 'Discarded';

normalize-statuses.mjs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import { readFileSync, writeFileSync, copyFileSync, existsSync } from 'fs';
1515
import { join, dirname } from 'path';
1616
import { fileURLToPath } from 'url';
17+
import { ALIASES } from './lib/aliases.mjs';
18+
1719

1820
const CAREER_OPS = dirname(fileURLToPath(import.meta.url));
1921
// Support both layouts: data/applications.md (boilerplate) and applications.md (original)
@@ -71,13 +73,7 @@ function normalizeStatus(raw) {
7173
}
7274

7375
// Spanish aliases → English canonicals
74-
if (['evaluada'].includes(lower)) return { status: 'Evaluated' };
75-
if (['aplicado', 'enviada', 'aplicada', 'applied', 'sent'].includes(lower)) return { status: 'Applied' };
76-
if (['respondido'].includes(lower)) return { status: 'Responded' };
77-
if (['entrevista'].includes(lower)) return { status: 'Interview' };
78-
if (['oferta'].includes(lower)) return { status: 'Offer' };
79-
if (['cerrada', 'descartada'].includes(lower)) return { status: 'Discarded' };
80-
if (['no aplicar', 'no_aplicar', 'skip'].includes(lower)) return { status: 'SKIP' };
76+
if (ALIASES[lower]) return { status: ALIASES[lower] };
8177

8278
// Unknown — flag it
8379
return { status: null, unknown: true };

verify-pipeline.mjs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import { readFileSync, readdirSync, existsSync } from 'fs';
1818
import { join, dirname } from 'path';
1919
import { fileURLToPath } from 'url';
20+
import { ALIASES } from './lib/aliases.mjs';
21+
2022

2123
const CAREER_OPS = dirname(fileURLToPath(import.meta.url));
2224
// Support both layouts: data/applications.md (boilerplate) and applications.md (original)
@@ -34,17 +36,6 @@ const CANONICAL_STATUSES = [
3436
'offer', 'rejected', 'discarded', 'skip',
3537
];
3638

37-
const ALIASES = {
38-
'evaluada': 'evaluated', 'condicional': 'evaluated', 'hold': 'evaluated', 'evaluar': 'evaluated', 'verificar': 'evaluated',
39-
'aplicado': 'applied', 'enviada': 'applied', 'aplicada': 'applied', 'applied': 'applied', 'sent': 'applied',
40-
'respondido': 'responded',
41-
'entrevista': 'interview',
42-
'oferta': 'offer',
43-
'rechazado': 'rejected', 'rechazada': 'rejected',
44-
'descartado': 'discarded', 'descartada': 'discarded', 'cerrada': 'discarded', 'cancelada': 'discarded',
45-
'no aplicar': 'skip', 'no_aplicar': 'skip', 'monitor': 'skip', 'geo blocker': 'skip',
46-
};
47-
4839
let errors = 0;
4940
let warnings = 0;
5041

0 commit comments

Comments
 (0)