import type { Root } from "postcss"; import { AtRule } from "postcss"; import { createMobileFirstMediaQueries } from "./createMobileFirstMediaQueries"; const plugin = (opts: Record = {}) => { const { strings, numbers } = extractNumbers(opts); const config = Object.assign(strings, createMobileFirstMediaQueries(numbers), {}); return { postcssPlugin: "postcss-custom-media-generator", Once(root: Root) { for (let [key, value] of Object.entries(config).reverse()) { if (!key.startsWith("--")) key = `--${key}`; if (!(value.startsWith("(") && value.endsWith(")"))) value = `(${value})`; const rule = new AtRule({ name: "custom-media", params: `${key} ${value}` }); root.prepend(rule); } }, }; }; function extractNumbers(obj: Record) { let numbers: Record = {}; let strings: Record = {}; for (let [key, value] of Object.entries(obj)) { if (typeof value === "number") { numbers[key] = value; } else { strings[key] = value; } } return { numbers, strings }; } plugin.postcss = true; export = plugin;