Files

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)');