mirror of
https://github.com/pcottle/learnGitBranching.git
synced 2026-10-02 13:56:52 +02:00
61 lines
2.2 KiB
JavaScript
61 lines
2.2 KiB
JavaScript
/**
|
|
* Generates src/levels/generated/manifest.js.
|
|
*
|
|
* The full level definitions (dialog copy, trees, solutions) for every locale
|
|
* are by far the largest part of the bundle. The browser only needs a tiny
|
|
* metadata slice up front (id / name / hint) to render the level map; the heavy
|
|
* definition is code-split behind `load()` and fetched when a level is opened.
|
|
*
|
|
* Source of truth is src/levels/index.js (levelFiles) plus the level modules
|
|
* themselves, so this must run before `dev`, `build` and `test`.
|
|
*/
|
|
const { writeFileSync, mkdirSync } = require('fs');
|
|
const { join, dirname } = require('path');
|
|
|
|
const { levelFiles, levelSequences } = require('../src/levels/index');
|
|
|
|
const OUT_DIR = join(__dirname, '..', 'src', 'levels', 'generated');
|
|
const OUT_FILE = join(OUT_DIR, 'manifest.js');
|
|
|
|
// Relative to src/levels/generated/, where the manifest lives.
|
|
function importPath(modulePath) {
|
|
return '../' + modulePath.replace(/^\.\//, '') + '.js';
|
|
}
|
|
|
|
const sequences = {};
|
|
Object.keys(levelFiles).forEach((sequenceName) => {
|
|
sequences[sequenceName] = levelSequences[sequenceName].map((level, index) => {
|
|
const entry = {
|
|
id: sequenceName + String(index + 1),
|
|
index,
|
|
sequenceName,
|
|
name: level.name,
|
|
};
|
|
return entry;
|
|
});
|
|
});
|
|
|
|
let out = '// AUTO-GENERATED by scripts/generateLevelManifest.js -- do not edit.\n';
|
|
out += "'use strict';\n\n";
|
|
out += 'exports.sequences = {\n';
|
|
Object.keys(sequences).forEach((sequenceName) => {
|
|
out += ' ' + JSON.stringify(sequenceName) + ': [\n';
|
|
sequences[sequenceName].forEach((entry, index) => {
|
|
const spec = importPath(levelFiles[sequenceName][index]);
|
|
out += ' { id: ' + JSON.stringify(entry.id) +
|
|
', index: ' + entry.index +
|
|
', sequenceName: ' + JSON.stringify(entry.sequenceName) +
|
|
', name: ' + JSON.stringify(entry.name);
|
|
out += ', load: function () { return import(' + JSON.stringify(spec) + '); } },\n';
|
|
});
|
|
out += ' ],\n';
|
|
});
|
|
out += '};\n';
|
|
|
|
mkdirSync(OUT_DIR, { recursive: true });
|
|
writeFileSync(OUT_FILE, out);
|
|
|
|
const count = Object.keys(sequences).reduce((n, s) => n + sequences[s].length, 0);
|
|
console.log('Generated ' + OUT_FILE + ' (' + count + ' levels, ' +
|
|
Math.round(out.length / 1024) + ' KB)');
|