fix: make seeds test pass and refactor all require to import

This commit is contained in:
zk
2026-05-17 13:06:11 +00:00
parent fe76dad32d
commit 2f5b68920e
41 changed files with 177 additions and 159 deletions
+2 -7
View File
@@ -1,4 +1,4 @@
function FindChartWithPTDFVersion(collection, songID, playtype, difficulty, version) {
export function FindChartWithPTDFVersion(collection, songID, playtype, difficulty, version) {
return collection.find(
(chart) =>
chart.song.id === songID &&
@@ -8,11 +8,6 @@ function FindChartWithPTDFVersion(collection, songID, playtype, difficulty, vers
);
}
function FindSongWithTitle(collection, title) {
export function FindSongWithTitle(collection, title) {
return collection.find((e) => e.title === title || e.altTitles.includes(title));
}
module.exports = {
FindChartWithPTDFVersion,
FindSongWithTitle,
};
+8 -5
View File
@@ -5,12 +5,15 @@
// This script is for importing the collections *immediately* into
// any old mongo instance.
const { execSync } = require("child_process");
const { Command } = require("commander");
const fs = require("fs");
const path = require("path");
import { execSync } from "child_process";
import { Command } from "commander";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const logger = require("./log");
import { log as logger } from "./log.ts";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const program = new Command();
+2 -6
View File
@@ -1,4 +1,4 @@
const { EfficientInPlaceDeepmerge, MutateCollection } = require("./util");
import { EfficientInPlaceDeepmerge, MutateCollection } from "./util.js";
function DoesMatchCriteria(element, mutation) {
for (const [key, value] of Object.entries(mutation.match)) {
@@ -10,7 +10,7 @@ function DoesMatchCriteria(element, mutation) {
return true;
}
function ApplyMutations(name, mutations) {
export function ApplyMutations(name, mutations) {
MutateCollection(name, (collection) => {
for (const element of collection) {
for (const mutation of mutations) {
@@ -23,7 +23,3 @@ function ApplyMutations(name, mutations) {
return collection;
});
}
module.exports = {
ApplyMutations,
};
+1
View File
@@ -1,5 +1,6 @@
{
"name": "tachi-seeds-scripts",
"type": "module",
"version": "0.1.0-see-project-root",
"private": true,
"description": "Scripts for dealing with tachi-seeds.",
@@ -1,4 +1,4 @@
const { IterateCollections } = require("../util");
import { IterateCollections } from "../util.js";
IterateCollections((data, filename) => {
if (!filename.startsWith("songs-") && !filename.startsWith("charts-")) {
+6 -4
View File
@@ -1,9 +1,11 @@
const crypto = require("crypto");
const fs = require("fs");
const path = require("path");
import crypto from "crypto";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const { ReadCollection, WriteCollection } = require("../util");
import { ReadCollection, WriteCollection } from "../util.js";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const COLLECTIONS_DIR = path.join(__dirname, "../../../db/seeds");
const NOW = Date.now();
+1 -1
View File
@@ -1,4 +1,4 @@
const { MutateCollection } = require("../util");
import { MutateCollection } from "../util.js";
// This is an example SINGLE-USE script. It does something quickly and ad-hoc,
// that is of absolutely no interest to anyone else.
@@ -1,8 +1,8 @@
const { FormatGame } = require("../../common/src");
import { FormatGame } from "../../common/src/index.ts";
const { CreateFolderID, MutateCollection } = require("../util");
import { CreateFolderID, MutateCollection } from "../util.js";
module.exports = function AddLevelVersionFolders(name, game, playtypes, version, levels) {
export default function AddLevelVersionFolders(name, game, playtypes, version, levels) {
const ptFolders = {};
MutateCollection("folders.json", (folders) => {
@@ -1,4 +1,4 @@
const { CreateFolderID, MutateCollection } = require("../util");
import { CreateFolderID, MutateCollection } from "../util.js";
// Change these for whatever table you are adding.
const GAME = "ddr";
@@ -1,9 +1,12 @@
const fs = require("fs");
const path = require("path");
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const { FindChartWithPTDFVersion } = require("../../../finders");
const { ApplyMutations } = require("../../../mutations");
const { ReadCollection } = require("../../../util");
import { FindChartWithPTDFVersion } from "../../../finders.js";
import { ApplyMutations } from "../../../mutations.js";
import { ReadCollection } from "../../../util.js";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const MANUAL_TITLE_MAP = {
// Zero idea
@@ -1,7 +1,7 @@
const { Command } = require("commander");
const fetch = require("node-fetch");
import { Command } from "commander";
import fetch from "node-fetch";
const { MutateCollection } = require("../../util");
import { MutateCollection } from "../../util.js";
const program = new Command();
program
@@ -1,9 +1,9 @@
const { Command } = require("commander");
const { XMLParser } = require("fast-xml-parser");
const fs = require("fs");
const { GAME_PT_CONFIGS } = require("../../../common/src");
import { Command } from "commander";
import fs from "fs";
import { XMLParser } from "fast-xml-parser";
const { MutateCollection } = require("../../util");
import { GAME_PT_CONFIGS } from "../../../common/src/index.ts";
import { MutateCollection } from "../../util.js";
const program = new Command();
program
@@ -1,8 +1,8 @@
const { Command } = require("commander");
const fs = require("fs");
const path = require("path");
import { Command } from "commander";
import fs from "fs";
import path from "path";
const { MutateCollection } = require("../../util");
import { MutateCollection } from "../../util.js";
const program = new Command();
program.option("-i, --input <sieglinde output/folder>");
@@ -1,4 +1,4 @@
const { CreateFolderID, MutateCollection } = require("../../util");
import { CreateFolderID, MutateCollection } from "../../util.js";
const PLAYTYPES = ["SP", "DP"];
const VERSIONS = ["world", "konaste", "a3", "a20plus", "a20", "a"];
@@ -1,5 +1,11 @@
const logger = require("../log");
const { CreateFolderID, MutateCollection, ReadCollection, WriteCollection } = require("../util");
import { log as logger } from "../log.ts";
import {
CreateFolderID,
MutateCollection,
ReadCollection,
WriteCollection,
} from "../util.js";
const translateMap = new Map();
@@ -1,5 +1,11 @@
const logger = require("../log");
const { CreateGoalID, MutateCollection, ReadCollection, WriteCollection } = require("../util");
import { log as logger } from "../log.ts";
import {
CreateGoalID,
MutateCollection,
ReadCollection,
WriteCollection,
} from "../util.js";
const translateMap = new Map();
@@ -1,6 +1,6 @@
const { PrettyVersions } = require("tachi-common/config/versions");
import { PrettyVersions } from "tachi-common/config/versions";
const { CreateFolderID, MutateCollection } = require("../../util");
import { CreateFolderID, MutateCollection } from "../../util.js";
function CreateFolder(criteria, playtype, title) {
const f = {
@@ -1,4 +1,4 @@
const { MutateCollection } = require("../../util");
import { MutateCollection } from "../../util.js";
// this script will add "newVersion" to all charts that are in "baseVersion"
@@ -1,8 +1,8 @@
const { Command } = require("commander");
const { XMLParser } = require("fast-xml-parser");
const fs = require("fs");
import { Command } from "commander";
import { XMLParser } from "fast-xml-parser";
import fs from "fs";
const { CreateChartID, MutateCollection } = require("../../util");
import { CreateChartID, MutateCollection } from "../../util.js";
const program = new Command();
program
@@ -1,4 +1,4 @@
const { CreateChartID, MutateCollection } = require("../../util");
import { CreateChartID, MutateCollection } from "../../util.js";
const inGameID = 80052;
const tachiSongID = 2353;
@@ -1,9 +1,12 @@
const fs = require("fs");
const path = require("path");
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const { FindChartWithPTDFVersion, FindSongWithTitle } = require("../../../finders");
const { ApplyMutations } = require("../../../mutations");
const { ReadCollection } = require("../../../util");
import { FindChartWithPTDFVersion, FindSongWithTitle } from "../../../finders.js";
import { ApplyMutations } from "../../../mutations.js";
import { ReadCollection } from "../../../util.js";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const songs = ReadCollection("songs-iidx.json");
@@ -1,4 +1,4 @@
const { MutateCollection } = require("../../util");
import { MutateCollection } from "../../util.js";
function idMatch(idSet, inGameID) {
if (Array.isArray(inGameID)) {
@@ -15,7 +15,7 @@ function idMatch(idSet, inGameID) {
return false;
}
module.exports = (idSet) =>
export default (idSet) =>
MutateCollection("charts-iidx.json", (charts) => {
for (const chart of charts) {
if (
@@ -1,4 +1,4 @@
const { MutateCollection } = require("../../util");
import { MutateCollection } from "../../util.js";
// This is the numerical ID of the song we want to add to the Infinitas table
// Make sure to double check if it's using legacy charts for some stupid reason
@@ -1,4 +1,4 @@
const { CreateChartID, MutateCollection } = require("../../util");
import { CreateChartID, MutateCollection } from "../../util.js";
const inGameID = 25021;
const tachiSongID = 1728;
@@ -1,4 +1,4 @@
const { MutateCollection } = require("../../util");
import { MutateCollection } from "../../util.js";
// This is the numerical ID of the song we want to add to the Infinitas table
// Make sure to double check if it's using legacy charts for some stupid reason
@@ -1,10 +1,13 @@
const { Command } = require("commander");
const fs = require("fs");
const fetch = require("node-fetch");
const path = require("path");
import { Command } from "commander";
import fs from "fs";
import path from "path";
import fetch from "node-fetch";
import { fileURLToPath } from "url";
const logger = require("../../log");
const { MutateCollection, ReadCollection } = require("../../util");
import { log as logger } from "../../log.ts";
import { MutateCollection, ReadCollection } from "../../util.js";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const program = new Command();
@@ -1,4 +1,4 @@
const { CreateFolderID, MutateCollection } = require("../../util");
import { CreateFolderID, MutateCollection } from "../../util.js";
const folders = [];
@@ -1,13 +1,13 @@
const { Command } = require("commander");
const { readFileSync } = require("fs");
import { Command } from "commander";
import { readFileSync } from "fs";
const {
import {
CreateChartID,
GetFreshSongIDGenerator,
MutateCollection,
ReadCollection,
WriteCollection,
} = require("../../util");
} from "../../util.js";
const program = new Command();
program.requiredOption("-i, --input <file.json>");
@@ -1,4 +1,4 @@
const { CreateFolderID, MutateCollection } = require("../../util");
import { CreateFolderID, MutateCollection } from "../../util.js";
// Change these for whatever table you are adding.
const GAME = "maimaidx";
@@ -1,12 +1,11 @@
const { GetGamePTConfig } = require("../../../common/src");
import { Command } from "commander";
const { CreateFolderID, MutateCollection } = require("../../util");
import { GetGamePTConfig } from "../../../common/src/index.ts";
import { CreateFolderID, MutateCollection } from "../../util.js";
const tableMainFolders = [];
const tableAllFolders = [];
const { Command } = require("commander");
const program = new Command();
program.requiredOption("-v, --version <version>");
@@ -1,12 +1,12 @@
const { Command } = require("commander");
const fs = require("fs");
import { Command } from "commander";
import fs from "fs";
const {
import {
CreateChartID,
GetFreshSongIDGenerator: GetFreshScoreIDGenerator,
ReadCollection,
WriteCollection,
} = require("../../util");
} from "../../util.js";
const program = new Command();
program.requiredOption("-f, --file <mxb-json>");
@@ -1,9 +1,9 @@
const { Command } = require("commander");
const crypto = require("crypto");
const { XMLParser } = require("fast-xml-parser");
const fs = require("fs");
const iconv = require("iconv-lite");
const path = require("path");
import { Command } from "commander";
import crypto from "crypto";
import { XMLParser } from "fast-xml-parser";
import fs from "fs";
import iconv from "iconv-lite";
import path from "path";
const program = new Command();
program
@@ -1,10 +1,9 @@
/* eslint no-labels: "off", require-unicode-regexp: "off", no-irregular-whitespace: "off" */
import { Command } from "commander";
import { parse } from "csv-parse/sync";
import fs from "fs";
const { Command } = require("commander");
const { parse } = require("csv-parse/sync");
const fs = require("fs");
const { MutateCollection, ReadCollection } = require("../../util");
import { MutateCollection, ReadCollection } from "../../util.js";
// The tier lists are available at
// https://docs.google.com/spreadsheets/d/1cFltguBvPplBem-x1STHnG3k4TZzFfyNEZ-RwsQszoo/edit
@@ -1,9 +1,9 @@
const { Command } = require("commander");
const Encoding = require("encoding-japanese");
const { XMLParser } = require("fast-xml-parser");
const fs = require("fs");
import { Command } from "commander";
import Encoding from "encoding-japanese";
import { XMLParser } from "fast-xml-parser";
import fs from "fs";
const { CreateChartID, ReadCollection, WriteCollection } = require("../../util");
import { CreateChartID, ReadCollection, WriteCollection } from "../../util.js";
const VERSIONS = {
1: "booth",
@@ -1,7 +1,7 @@
const { Command } = require("commander");
const fs = require("fs");
import { Command } from "commander";
import fs from "fs";
const { CreateChartID, MutateCollection, ReadCollection } = require("../../util");
import { CreateChartID, MutateCollection, ReadCollection } from "../../util.js";
const program = new Command();
program.option("-f, --file <zk.json>");
@@ -1,6 +1,6 @@
const { Command } = require("commander");
import { Command } from "commander";
const { MutateCollection, ReadCollection, WriteCollection } = require("../util");
import { MutateCollection, ReadCollection, WriteCollection } from "../util.js";
const program = new Command();
program.requiredOption("-t, --tableID <tableID>");
@@ -1,13 +1,13 @@
const { Database } = require("bun:sqlite");
const { Command } = require("commander");
const fs = require("fs");
import { Database } from "bun:sqlite";
import { Command } from "commander";
import fs from "fs";
const {
import {
CreateChartID,
GetFreshSongIDGenerator,
ReadCollection,
WriteCollection,
} = require("../../util");
} from "../../util.js";
const program = new Command();
program.requiredOption("-d, --db <maps.db>");
@@ -1,7 +1,8 @@
const { Command } = require("commander");
const { GetGamePTConfig } = require("../../../common/src");
import { Command } from "commander";
import { GetGamePTConfig } from "../../../common/src/index.ts";
import { CreateFolderID, MutateCollection } from "../../util.js";
const { CreateFolderID, MutateCollection } = require("../../util");
const LEVELS = [
"1",
@@ -1,12 +1,12 @@
const { Command } = require("commander");
const fs = require("fs");
import { Command } from "commander";
import fs from "fs";
const {
import {
CreateChartID,
GetFreshSongIDGenerator,
MutateCollection,
ReadCollection,
} = require("../../util");
} from "../../util.js";
const getNewSongID = GetFreshSongIDGenerator("wacca");
const waccaDiffIndex = ["NORMAL", "HARD", "EXPERT", "INFERNO"];
+13 -5
View File
@@ -1,6 +1,7 @@
const fs = require("fs");
const path = require("path");
const { spawnSync } = require("child_process");
import { spawnSync } from "child_process";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
function ChartSort(a, b) {
// sink all 2dxtra charts to the bottom
@@ -76,6 +77,10 @@ function BMSCourseSort(a, b) {
*/
function SortSeeds(options = {}) {
const { skipBiomeFormat = false } = options;
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const collectionsDir = path.join(__dirname, "../../db/seeds");
const collections = fs.readdirSync(collectionsDir).filter((name) => name.endsWith(".json"));
@@ -140,8 +145,11 @@ function SortObjectKeys(object) {
return newObject;
}
if (require.main === module) {
const __resolvedMain =
process.argv[1] !== undefined ? path.resolve(process.argv[1]) : "";
if (__resolvedMain === fileURLToPath(import.meta.url)) {
SortSeeds();
}
module.exports = SortSeeds;
export default SortSeeds;
+26 -33
View File
@@ -1,25 +1,32 @@
const fjsh = require("fast-json-stable-hash");
const fs = require("fs");
const path = require("path");
import fjsh from "fast-json-stable-hash";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const {
import {
CreateChartID,
CreateFolderID,
CreateQuestID,
CreateSongID,
CreateTableID,
} = require("tachi-common");
} from "tachi-common";
const DeterministicCollectionSort = require("./sort-seeds");
import DeterministicCollectionSort from "./sort-seeds.js";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Seed JSON lives at repo root: db/seeds/ (was typescript/collections).
const COLLECTIONS_DIR = path.join(__dirname, "../../db/seeds");
/** Third argument to {@link WriteCollection} / {@link MutateCollection}: deterministic sort still runs. */
const WRITE_COLLECTION_SKIP_BIOME = Object.freeze({ skipBiomeFormat: true });
export const WRITE_COLLECTION_SKIP_BIOME = Object.freeze({ skipBiomeFormat: true });
/**
* @param {(data: unknown, collection: string) => unknown} cb
* @param {{ skipBiomeFormat?: boolean }} [writeOptions] forwarded to {@link DeterministicCollectionSort} after loop
*/
function IterateCollections(cb, writeOptions) {
export function IterateCollections(cb, writeOptions) {
for (const collection of fs
.readdirSync(COLLECTIONS_DIR)
.filter((name) => name.endsWith(".json"))) {
@@ -34,10 +41,7 @@ function IterateCollections(cb, writeOptions) {
DeterministicCollectionSort(writeOptions);
}
// Seed JSON lives at repo root: db/seeds/ (was typescript/collections).
const COLLECTIONS_DIR = path.join(__dirname, "../../db/seeds");
function ReadCollection(name, throwIfNotFound = false) {
export function ReadCollection(name, throwIfNotFound = false) {
const p = path.join(COLLECTIONS_DIR, name);
if (!fs.existsSync(p)) {
if (throwIfNotFound) {
@@ -57,7 +61,7 @@ function ReadCollection(name, throwIfNotFound = false) {
* @param {{ skipBiomeFormat?: boolean }} [writeOptions] pass `{ skipBiomeFormat: true }` to skip
* running Biome over all of `db/seeds` after the mandatory deterministic sort pass (much faster).
*/
function WriteCollection(name, data, writeOptions) {
export function WriteCollection(name, data, writeOptions) {
fs.writeFileSync(path.join(COLLECTIONS_DIR, name), JSON.stringify(data, null, "\t"));
DeterministicCollectionSort(writeOptions);
@@ -68,7 +72,7 @@ function WriteCollection(name, data, writeOptions) {
* @param {(collection: unknown) => unknown} cb
* @param {{ skipBiomeFormat?: boolean }} [writeOptions] see {@link WriteCollection}
*/
function MutateCollection(name, cb, writeOptions) {
export function MutateCollection(name, cb, writeOptions) {
const data = cb(ReadCollection(name));
if (data === undefined) {
@@ -81,21 +85,21 @@ function MutateCollection(name, cb, writeOptions) {
// this api sucks, maybe dont use it
//
// TODO(zk): remove this and give folders actual readable names
function CreateLegacyFolderID(query, game, playtype) {
export function CreateLegacyFolderID(query, game, playtype) {
return `F${fjsh.hash(Object.assign({ game, playtype }, query), "SHA256")}`;
}
function CreateLegacyFolderIDFromFolder(folder) {
export function CreateLegacyFolderIDFromFolder(folder) {
return CreateLegacyFolderID(folder.data, folder.game, folder.playtype);
}
function CreateGoalID(charts, criteria, game) {
export function CreateGoalID(charts, criteria, game) {
return `G${fjsh.hash({ charts, criteria, game }, "sha256")}`;
}
// quick inplace deepmerge hack
// probably doesn't work for arrays, i don't care though.
function EfficientInPlaceDeepmerge(ref, apply) {
export function EfficientInPlaceDeepmerge(ref, apply) {
for (const key in apply) {
if (typeof apply[key] === "object" && apply[key]) {
EfficientInPlaceDeepmerge(ref[key], apply[key]);
@@ -105,7 +109,7 @@ function EfficientInPlaceDeepmerge(ref, apply) {
}
}
function GetChartCollectionGame(filename) {
export function GetChartCollectionGame(filename) {
let result = filename.match(/charts-([\w-]+)\.json$/u);
if (result === null) {
@@ -125,28 +129,17 @@ function GetSongCollectionGameGroup(filename) {
return result[1];
}
function GetFreshSongIDGenerator(gameGroup) {
export function GetFreshSongIDGenerator(gameGroup) {
const existing = ReadCollection(`songs-${gameGroup}.json`);
let max = existing.reduce((acc, s) => Math.max(acc, s.id ?? 0), 0);
return () => ++max;
}
module.exports = {
export {
CreateChartID,
CreateFolderID,
CreateGoalID,
CreateLegacyFolderID,
CreateLegacyFolderIDFromFolder,
CreateQuestID,
CreateSongID,
CreateTableID,
EfficientInPlaceDeepmerge,
GetChartCollectionGame,
GetFreshSongIDGenerator,
GetSongCollectionGame: GetSongCollectionGameGroup,
IterateCollections,
MutateCollection,
ReadCollection,
WRITE_COLLECTION_SKIP_BIOME,
WriteCollection,
GetSongCollectionGameGroup as GetSongCollectionGame,
};