forked from kofal.net/zmk
feat(docs): Add aggregated metadata to website
Added /hardware-metadata.json to the ZMK website. This gives external tools a way to grab all hardware metadata at once.
This commit is contained in:
committed by
Pete Johanson
parent
20fcd35026
commit
ed41d42874
68
docs/src/hardware-metadata-static-plugin/index.js
Normal file
68
docs/src/hardware-metadata-static-plugin/index.js
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* 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));
|
||||
},
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user