69 lines
1.8 KiB
JavaScript
69 lines
1.8 KiB
JavaScript
/*
|
|
* Copyright (c) 2022 The ZMK Contributors
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
//@ts-check
|
|
"use strict";
|
|
|
|
/** @typedef {import('../hardware-metadata').HardwareMetadata} HardwareMetadata */
|
|
/** @typedef {HardwareMetadata & { directory: string}} LocatedHardwareMetadata */
|
|
|
|
const fs = require("fs").promises;
|
|
const glob = require("util").promisify(require("glob"));
|
|
const path = require("path");
|
|
const yaml = require("js-yaml");
|
|
|
|
const BASE_DIR = "..";
|
|
const METADATA_GLOB = path.posix.join(BASE_DIR, "app/boards/**/*.zmk.yml");
|
|
|
|
/**
|
|
* @param {string} file
|
|
*/
|
|
async function readMetadata(file) {
|
|
/** @type HardwareMetadata[] */
|
|
// @ts-ignore
|
|
const documents = yaml.loadAll(await fs.readFile(file, "utf-8"));
|
|
|
|
return documents.map(
|
|
(metadata) =>
|
|
/** @type LocatedHardwareMetadata */
|
|
({
|
|
...metadata,
|
|
// External tools need a way to locate this hardware within the repo.
|
|
// Append each item's relative path.
|
|
directory: path.posix.dirname(path.posix.relative(BASE_DIR, file)),
|
|
})
|
|
);
|
|
}
|
|
|
|
async function aggregateMetadata() {
|
|
const files = await glob(METADATA_GLOB);
|
|
const data = await Promise.all(files.map(readMetadata));
|
|
|
|
return data.flat();
|
|
}
|
|
|
|
/**
|
|
* Aggregates .zmk.yml files and writes hardware-metadata.json to the site's
|
|
* static files post-build.
|
|
*
|
|
* This is very similar to hardware-metadata-collection-plugin but adjusts the
|
|
* output for consumption by external tools rather than the website build system.
|
|
*
|
|
* @type {import('@docusaurus/types').PluginModule}
|
|
*/
|
|
module.exports = function () {
|
|
return {
|
|
name: "hardware-metadata-static-plugin",
|
|
|
|
async postBuild({ outDir }) {
|
|
const hardware = await aggregateMetadata();
|
|
|
|
const hardwarePath = path.join(outDir, "hardware-metadata.json");
|
|
await fs.writeFile(hardwarePath, JSON.stringify(hardware));
|
|
},
|
|
};
|
|
};
|