mirror of
https://github.com/tiennm99/thptqg2017.git
synced 2026-09-18 06:21:39 +00:00
The repo held two near-duplicate projects. 2016/ and 2017/ each carried their
own React frontend, their own copy of the same Rust crate, and their own
package manager setup. 2016/tools/sync-from-thptqg2017.sh existed purely to
copy the parser source between them.
New layout:
index.html + src/ the 2017 frontend, now the only one
data/<id>/ 2016, 2017, 2017-old, 2017-old2
parser/ the single Rust crate, configs renamed to <id>.toml
docs/ both projects' docs, 2016 copies suffixed -2016-legacy
pending the merge pass
<id> is now one identifier end to end: data/<id>/ feeds parser/configs/<id>.toml
and produces db/<id>.db.gz.
pnpm gives way to npm. pnpm-workspace.yaml existed only to whitelist
better-sqlite3's native build, which npm permits by default, so it has no
equivalent and is simply gone. Lockfiles cannot be converted; package-lock.json
is generated fresh. The migration direction is safe — pnpm's strict layout
forbids phantom dependencies, so anything that resolved under pnpm resolves
under npm's flat tree.
Adds parser/scripts/build-db.js and src/datasets.js: the four dataset IDs are
declared once and read by both the build tooling and (from the next phase) the
frontend.
Follow-on fixes the move made necessary:
- eslint's Node-globals override pointed at scripts/, now parser/scripts/
- crawl-baotintuc.js wrote to <root>/data, now data/2017
- golden tests loaded configs by their old thptqg*-data.toml names
Drops the #[ignore]d Rust-vs-Node golden test. It shelled out to pnpm to run
scripts/build-database.js, a file removed when the parser was ported to Rust,
so it could never pass. check-duplicates.js and diff-datasets.js were already
broken before this change and are annotated as such rather than half-fixed.
63 Rust tests pass and clippy is clean from the new location.
67 lines
2.0 KiB
JavaScript
67 lines
2.0 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Build the SQLite database for one or all datasets, then gzip it.
|
|
*
|
|
* Replaces the six per-dataset npm scripts the two old projects carried. The
|
|
* dataset list comes from src/datasets.js so it is written in exactly one place.
|
|
*
|
|
* Output goes to .build/public/db/ — the directory Vite copies as its publicDir.
|
|
* Only the .gz survives: shipping a 100+ MB uncompressed database is made
|
|
* structurally impossible rather than left to a cleanup step.
|
|
*
|
|
* Usage:
|
|
* node parser/scripts/build-db.js # all four datasets
|
|
* node parser/scripts/build-db.js 2017-old # just one
|
|
*/
|
|
|
|
import { execFileSync } from "node:child_process";
|
|
import { mkdirSync, rmSync, existsSync } from "node:fs";
|
|
import { dirname, resolve } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
import { DATASET_IDS } from "../../src/datasets.js";
|
|
|
|
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
const BIN = resolve(ROOT, "parser/target/release/xlsxread");
|
|
const OUT_DIR = resolve(ROOT, ".build/public/db");
|
|
|
|
const requested = process.argv.slice(2);
|
|
const unknown = requested.filter((id) => !DATASET_IDS.includes(id));
|
|
if (unknown.length) {
|
|
console.error(`unknown dataset(s): ${unknown.join(", ")}`);
|
|
console.error(`known: ${DATASET_IDS.join(", ")}`);
|
|
process.exit(2);
|
|
}
|
|
const targets = requested.length ? requested : DATASET_IDS;
|
|
|
|
if (!existsSync(BIN)) {
|
|
console.error(`parser binary not found at ${BIN}`);
|
|
console.error("run: npm run build:rust");
|
|
process.exit(1);
|
|
}
|
|
|
|
mkdirSync(OUT_DIR, { recursive: true });
|
|
|
|
for (const id of targets) {
|
|
const db = resolve(OUT_DIR, `${id}.db`);
|
|
|
|
execFileSync(
|
|
BIN,
|
|
[
|
|
"build",
|
|
"--schema",
|
|
resolve(ROOT, `parser/configs/${id}.toml`),
|
|
"--input",
|
|
resolve(ROOT, `data/${id}`),
|
|
"--output",
|
|
db,
|
|
],
|
|
{ stdio: "inherit" },
|
|
);
|
|
|
|
// -9 without -k: the raw .db must not reach the published artifact.
|
|
rmSync(`${db}.gz`, { force: true });
|
|
execFileSync("gzip", ["-9", db], { stdio: "inherit" });
|
|
console.log(` → db/${id}.db.gz\n`);
|
|
}
|