Core Core plugin

npm install @anyblades/buildawesome-kit

Then addPlugin() to your config:

import kitPlugin from "@anyblades/buildawesome-kit";

export default function ($config) {
  $config.addPlugin(kitPlugin);
}

Live example: /anyblades/buildawesome-micro-starters/blob/main/bare-plugin

Features

All /plugin/features except mdAutoRawTags are enabled by default.

You can toggle them like this:

$config.addPlugin(kitPlugin, {
  autoLinkFavicons: false,
  mdAutoRawTags: true,
});

Filters

All /plugin/filters are enabled by default.

You can toggle them like this:

$config.addPlugin(kitPlugin, {
  filters: { attr_set: false },
});

Appendix


How it works

/anyblades/buildawesome-kit/refs/heads/main/core/plugin.js :

import { readdirSync } from "node:fs";

export const discoverModules = (dir) =>
  Object.fromEntries(
    readdirSync(new URL(dir, import.meta.url))
      .filter((f) => f.endsWith(".js") && !f.endsWith(".test.js"))
      .map((f) => [f.replace(/\.js$/, ""), true]),
  );

export default async function ($config, userOptions) {
  const defaultOptions = { mdAutoRawTags: false };
  const options = Object.assign(
    {},
    discoverModules("./features"),
    { filters: discoverModules("./filters") },
    defaultOptions,
    userOptions,
  );
  // console.log("[options]", defaultOptions, userOptions, options);

  /* FILTERS
   * Fallback to default list if options.filters doesn't exist
   * By using import.meta.url, Node figures out exactly where your script is installed inside their node_modules folder and targets the directory relative to that script.
   */
  const filterNames = Object.entries(options.filters).filter(([, v]) => v);
  for (const [filterName] of filterNames) {
    console.log("Loading filter: " + filterName + "...");
    try {
      if (filterName == "fetch") await import("@11ty/eleventy-fetch");
      const filterFunc = (await import("./filters/" + filterName + ".js")).default;
      $config.addFilter(filterName, filterFunc);
    } catch (error) {
      console.log("^ N/A ^");
    }
  }

  /* FEATURES */
  delete options.filters;
  const featureNames = Object.entries(options).filter(([, v]) => v);
  for (const [featureName] of featureNames) {
    console.log("Loading feature: " + featureName + "...");
    try {
      const featureConfig = (await import("./features/" + featureName + ".js")).default;
      featureConfig($config);
    } catch (error) {
      console.log("^ N/A ^");
    }
  }
}