1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
'use strict';
import {mkdir, writeFile} from 'node:fs/promises';
import * as path from 'node:path';
import FlexSearch from 'flexsearch';
import {logError, logInfo, logWarn} from '#cli';
import Thing from '#thing';
export async function writeSearchIndex({
wikiCachePath,
wikiData,
}) {
if (!wikiCachePath) {
throw new Error(`Expected wikiCachePath to write into`);
}
// Basic flow is:
// 1. Define schema for type
// 2. Add documents to index
// 3. Save index to exportable json
// Copy this block directly into clientSearch.js
const indexes = {
albums: new FlexSearch.Document({
id: "reference",
index: ["name", "groups"],
}),
tracks: new FlexSearch.Document({
id: "reference",
index: ["track", "album", "artists", "directory", "additionalNames"],
}),
artists: new FlexSearch.Document({
id: "reference",
index: ["names"],
}),
};
for (const album of wikiData.albumData) {
indexes.albums.add({
reference: Thing.getReference(album),
name: album.name,
groups: album.groups.map(group => group.name),
});
for (const track of album.tracks) {
indexes.tracks.add({
reference: Thing.getReference(track),
album: album.name,
track: track.name,
artists: [
track.artistContribs.map(contrib => contrib.artist.name),
...track.artistContribs.map(contrib => contrib.artist.aliasNames)
],
additionalNames:
track.additionalNames.map(entry => entry.name),
});
}
}
for (const artist of wikiData.artistData) {
if (artist.isAlias) {
continue;
}
indexes.artists.add({
reference: Thing.getReference(artist),
names: [artist.name, ...artist.aliasNames],
});
}
// Export indexes to json
const searchData = {}
await Promise.all(
Object.entries(indexes)
.map(([indexName, index]) => {
searchData[indexName] = {};
return index.export((key, data) => {
searchData[indexName][key] = data
});
}));
const outputDirectory =
path.join(wikiCachePath, 'search');
const outputFile =
path.join(outputDirectory, 'index.json');
await mkdir(outputDirectory, {recursive: true});
await writeFile(outputFile, JSON.stringify(searchData));
logInfo`Search index successfully written.`;
}
|