diff --git a/scripts/import/store.js b/scripts/import/store.js index 2709846..856c5d1 100644 --- a/scripts/import/store.js +++ b/scripts/import/store.js @@ -58,6 +58,8 @@ const claim = (brand, names) => names.forEach((name) => claimed.add(`${brand}/${name.toLowerCase()}`)); const unclaimed = (brand, names = []) => [...new Set(names)].filter((name) => !claimed.has(`${brand}/${name.toLowerCase()}`)); +const aliasesFor = (brand, name, aliases) => + unclaimed(brand, aliases).filter((alias) => alias.toLowerCase() !== name.toLowerCase()); function track(entry) { const { brand, device } = entry; @@ -98,7 +100,7 @@ const deviceFields = ({ released, soc, type, hardware }) => ({ function createDevice(brand, { name, codenames, aliases, bootloader, ...rest }) { const slug = slugify(name); - const newAliases = unclaimed(brand, aliases); + const newAliases = aliasesFor(brand, name, aliases); const entry = { brand, key: codenames[0], @@ -128,9 +130,7 @@ function fillBootloader(current, { unlock, notes, source }) { function fillGaps(brand, current, { aliases, bootloader = {}, ...rest }) { for (const [key, value] of Object.entries(deviceFields(rest))) current[key] ??= value; fillBootloader(current.bootloader, bootloader); - const newAliases = unclaimed(brand, aliases).filter( - (alias) => alias.toLowerCase() !== current.name.toLowerCase(), - ); + const newAliases = aliasesFor(brand, current.name, aliases); if (newAliases.length) current.aliases = [...(current.aliases ?? []), ...newAliases]; claim(brand, newAliases); } diff --git a/tests/import/store.test.js b/tests/import/store.test.js index 474c896..07e56f1 100644 --- a/tests/import/store.test.js +++ b/tests/import/store.test.js @@ -62,8 +62,11 @@ test('a name that opens with another brand we list goes to that brand', () => { test("a device's own name never turns up as one of its aliases", () => { upsertDevice('Acme', { name: 'Comet', codenames: ['c1'] }); upsertDevice('Acme', { name: 'Comet Max', codenames: ['c1'], aliases: ['COMET', 'Comet Max'] }); - const file = join(process.env.DATA_DIR, 'devices/acme/c1.yml'); - assert.deepEqual(parse(readFileSync(file, 'utf8')).aliases, ['Comet Max']); + upsertDevice('Acme', { name: 'Nova 3', codenames: ['n3'], aliases: ['Nova 3', 'N-3'] }); + const aliasesOf = (file) => + parse(readFileSync(join(process.env.DATA_DIR, 'devices/acme', file), 'utf8')).aliases; + assert.deepEqual(aliasesOf('c1.yml'), ['Comet Max']); + assert.deepEqual(aliasesOf('n3.yml'), ['N-3']); }); test('a source that loses a fifth of its devices fails and leaves the file alone', () => {