Added merge script

This commit is contained in:
Thom Werring 2023-11-27 08:37:55 +01:00
parent 2e3eca72eb
commit 1ef77b3447
9 changed files with 200 additions and 34 deletions

17
.vscode/launch.json vendored
View File

@ -1,17 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${file}"
}
]
}

View File

@ -2,7 +2,7 @@
"json.schemas": [
{
"fileMatch": [
"*.json"
"homebrew/*.json"
],
"url": "https://raw.githubusercontent.com/TheGiddyLimit/5etools-utils/master/schema/brew-fast/homebrew.json"
}

View File

@ -1,3 +1,99 @@
{
"_meta": {
"sources": [
{
"json": "SCGtD",
"abbreviation": "SCGtD",
"full": "Sebastian Crowe's Guide to Drakkenheim",
"version": "0"
}
],
"dateAdded": 0,
"dateLastModified": 0
},
"class": [
{
"name": "Apothecary",
"source": "SCGtD",
"classFeatures": [
],
"hd": {
"number": 0,
"faces": 0
},
"proficiency": [
"str",
"str"
],
"startingProficiencies": {
"armor": [
"light"
],
"weapons": [
"simple and martial are rendered as x weapons, but you can write any string that you want."
],
"tools": [
"Name of any tool or artisan tools"
],
"skills": [
{
"skillName": true
}
]
},
"startingEquipment": {
"default": [
"Each string will appear as a list entry"
],
"additionalFromBackground": true,
"goldAlternative": "{@dice xdy}"
},
"multiclassing": {
"requirements": {
"str": 0
},
"proficienciesGained": {
"armor": [
"light"
],
"weapons": [
"simple"
],
"tools": [
""
],
"skills": [
{
"acrobatics": true
}
]
}
},
"casterProgression": "full",
"spellcastingAbility": "str",
"classSpells": [
""
],
"fluff": [
]
}
],
"subclass": [{
"name": "Apothecary",
"source": "SCGtD",
"page": 0,
"className": "Apothecary",
"classSource": "SCGtD",
"shortName": "Apo",
"subclassFeatures": [
],
"casterProgression": "full",
"spellcastingAbility": "str",
"subclassSpells": [
""
]
}]
}

View File

@ -5,18 +5,11 @@
"json": "SCGtD",
"abbreviation": "SCGtD",
"full": "Sebastian Crowe's Guide to Drakkenheim",
"authors": [
"Dungeon Dudes"
],
"convertedBy": [
"Werring"
],
"version": "1.0",
"targetSchema": "1.0.0"
"version": "0"
}
],
"dateAdded": 1700993345,
"dateLastModified": 1700993345
"dateAdded": 0,
"dateLastModified": 0
},
"spell": [
{

View File

@ -1,12 +1,24 @@
{
"_meta": {
"sources": [
{
"json": "SCGtD",
"abbreviation": "SCGtD",
"full": "Sebastian Crowe's Guide to Drakkenheim",
"version": "0"
}
],
"dateAdded": 0,
"dateLastModified": 0
},
"subclass": [
{
"name": "",
"source": "",
"name": "Barb",
"source": "SCGtD",
"page": 0,
"className": "",
"classSource": "",
"shortName": "",
"className": "Barbarian",
"classSource": "PHB",
"shortName": "Barb",
"subclassFeatures": [
],

View File

@ -6,6 +6,7 @@
"type": "module",
"scripts": {
"validate": "test-json-brew",
"merge": "node scripts/combine.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",

View File

@ -0,0 +1,63 @@
import path from "path";
import fs from "fs";
import { selectProject } from "./lib/select-project.js";
import { importSourceFactory } from "./lib/import-source.js";
const PROJECT_DIR = process.env.npm_config_local_prefix;
const HOMEBREW_DIR = path.join(PROJECT_DIR, "homebrew");
const projects = fs.readdirSync(HOMEBREW_DIR, {
withFileTypes: true,
})
.filter((dir) => dir.isDirectory())
.map((dir) => dir.name);
if (projects.length === 0) {
console.error("No homebrew projects");
process.exit(1);
}
const project = selectProject(projects);
const SOURCE_DIR = path.join(HOMEBREW_DIR, project);
const importSource = importSourceFactory(SOURCE_DIR);
const meta = importSource("meta.json");
meta._meta.dateLastModified = parseInt(Date.now()/1000);
const sources = fs.readdirSync(SOURCE_DIR, {
withFileTypes: true,
})
.filter((source) => source.isFile() && source.name.endsWith(".json") && source.name !== "meta.json")
.map((source) => source.name);
const homebrew = sources.reduce((result, source) => {
const sourceData = importSource(source);
delete sourceData._meta;
Object.entries(sourceData).forEach(([sourceKey, sourceValue]) => {
if (!(sourceKey in result)) {
result[sourceKey] = sourceValue;
return;
}
if (Array.isArray(result[sourceKey])) {
result[sourceKey] = result[sourceKey].concat(sourceValue);
return;
}
throw new Error(`Could not merge non-array key ${sourceKey}`);
});
return result;
}, meta);
console.log(homebrew.subclass);
const outFile = path.join(HOMEBREW_DIR, `${project}.json`);
if (fs.existsSync(outFile)) {
fs.unlinkSync(outFile);
}
fs.writeFileSync(outFile, JSON.stringify(homebrew, null, 4), { encoding: "utf-8"});

View File

@ -0,0 +1,11 @@
import fs from "fs";
import path from "path";
/**
*
* @param {string} sourceDir
* @returns ({string} filePath ) => Record<string, any>
*/
export function importSourceFactory(sourceDir) {
return (filePath) => JSON.parse(fs.readFileSync(path.join(sourceDir, filePath)).toString("utf-8"));
}

View File

@ -0,0 +1,7 @@
/**
* @param {string[]} projects
* @returns string
*/
export function selectProject(projects) {
return projects[0];
}