import { emptyDir, exists } from "https://deno.land/std@0.119.0/fs/mod.ts"; import { parse as tomlParse } from "https://deno.land/std@0.173.0/encoding/toml.ts"; import { load as yamlLoad } from "https://deno.land/x/js_yaml_port@3.14.0/js-yaml.js"; let _silentMode = false; export class DeConfEngine { constructor(options = {}) { this.options = options; this.srcDir = this.options.srcDir || "./data"; this.outputDir = this.options.outputDir || "./dist"; this.publicUrl = this.options.publicUrl || "https://data.prgblockweek.com"; this.githubUrl = this.options.githubUrl || "https://github.com/utxo-foundation/prague-blockchain-week/tree/main/data"; if (options.silentMode) { _silentMode = true; } } async init() { this.entries = []; for await (const f of Deno.readDir(this.srcDir)) { if (!f.name.match(/^\d+$/)) continue; const pkg = new DeConf_Package(f.name, this); await pkg.load([this.srcDir, f.name]); this.entries.push(pkg); } } async build() { await emptyDir(this.outputDir); for (const pkg of this.entries) { console.table(pkg.data.events.map((e) => e.data.index), ["name"]); await pkg.write(this.outputDir); } await _jsonWrite( [this.outputDir, "index.json"], this.entries.map((p) => ({ id: p.id, name: p.data.index.name, dataUrl: p.data.index.dataUrl, })), ); } async schemas(version = "1") { const schemaDir = `./utils/schema/${version}`; const arr = []; for await (const f of Deno.readDir(schemaDir)) { const m = f.name.match(/^(.+)\.yaml$/); if (!m) { continue; } arr.push({ name: m[1], schema: Object.assign( { $id: this.schemaUrl(version, m[1]) }, await _yamlLoad([schemaDir, f.name].join("/")), ), }); } return arr.sort((x, y) => x.name > y.name ? 1 : -1); } schemaUrl(version = "1", type = "index") { return `${this.publicUrl}/schema/${version}/${type}.json`; } entriesList() { return this.entries.map((e) => e.id); } } class DeConf_Package { constructor(id, engine) { this.id = id; this.data = null; this.engine = engine; } async load(specDir) { const pkg = {}; // load year index pkg.index = await _tomlLoad([...specDir, "index.toml"].join("/")); pkg.index.dataUrl = [this.engine.publicUrl, this.id].join("/"); pkg.index.dataGithubUrl = [this.engine.githubUrl, this.id].join("/"); //console.log(`\n##\n## [${pkg.index.name}] \n##`); // load sub-events pkg.events = []; for await (const ef of Deno.readDir([...specDir, "events"].join("/"))) { if (!ef.name.match(/^[\w\d\-]+$/)) continue; const ev = new DeConf_Event(ef.name); await ev.load([...specDir, "events", ef.name]); pkg.events.push(ev); } this.data = pkg; } async write(dir) { const outputDir = [dir, this.id].join("/"); await emptyDir(outputDir); await _jsonWrite([outputDir, "index.json"], this.toJSON()); } toJSON() { return Object.assign({ id: this.id }, this.data.index, { events: this.data.events, time: new Date(), }); } } class DeConf_Event { constructor(id) { this.id = id; this.data = null; } async load(dir) { const efIndex = await _tomlLoad([...dir, "index.toml"].join("/")); const event = { index: { id: this.id, ...efIndex }, }; this.data = event; } toJSON() { return Object.assign({ id: this.id }, this.data.index); } } async function _tomlLoad(fn) { return tomlParse(await Deno.readTextFile(fn)); } async function _yamlLoad(fn) { return yamlLoad(await Deno.readTextFile(fn)); } async function _jsonWrite(fn, data) { if (Array.isArray(fn)) { fn = fn.join("/"); } await Deno.writeTextFile(fn, JSON.stringify(data, null, 2)); if (!_silentMode) { console.log(`${fn} writed`); } return true; }