mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-14 18:01:06 +00:00
74 lines
2.3 KiB
JavaScript
74 lines
2.3 KiB
JavaScript
import fs from "fs";
|
|
import path from "path";
|
|
import pkg from "../../package.json";
|
|
import { format } from "prettier";
|
|
import { parseComponent } from "./parse-component";
|
|
import { generateTypes } from "./generate-types";
|
|
import { generateIndex } from "./generate-index";
|
|
|
|
/**
|
|
* Rollup plugin to generate library TypeScript definitions and documentation.
|
|
*/
|
|
function pluginGenerateDocs() {
|
|
const groups = new Map();
|
|
const components = new Map();
|
|
|
|
return {
|
|
name: "generate-docs",
|
|
async generateBundle(options, bundle) {
|
|
for (const filename in bundle) {
|
|
const chunkOrAsset = bundle[filename];
|
|
|
|
if (chunkOrAsset.type !== "asset" && chunkOrAsset.isEntry) {
|
|
chunkOrAsset.exports.forEach((exportee) => {
|
|
components.set(exportee, {});
|
|
});
|
|
|
|
const shared_types = new Set();
|
|
|
|
Object.keys(chunkOrAsset.modules)
|
|
.sort()
|
|
.forEach(async (filename) => {
|
|
const { dir, ext, name } = path.parse(filename);
|
|
const moduleName = name.replace(/\./g, "");
|
|
|
|
if (ext === ".svelte" && components.has(moduleName)) {
|
|
const group = dir.split("src/").pop().split("/")[0];
|
|
|
|
if (groups.has(group)) {
|
|
groups.set(group, [...groups.get(group), moduleName]);
|
|
} else {
|
|
groups.set(group, [moduleName]);
|
|
}
|
|
|
|
const typedefs = [];
|
|
const source = fs.readFileSync(filename, "utf-8");
|
|
const component = parseComponent(source, {
|
|
component: moduleName,
|
|
onTypeDef: (tag) => {
|
|
if (shared_types.has(tag.name)) return;
|
|
shared_types.add(tag.name);
|
|
typedefs.push(tag);
|
|
},
|
|
});
|
|
|
|
components.set(moduleName, { typedefs, component });
|
|
}
|
|
});
|
|
}
|
|
}
|
|
},
|
|
writeBundle() {
|
|
const { code: types } = generateTypes(components, pkg);
|
|
fs.writeFileSync(pkg.types, format(types, { parser: "typescript" }));
|
|
|
|
const { code: index } = generateIndex(components, groups, pkg);
|
|
fs.writeFileSync(
|
|
"./COMPONENT_INDEX.md",
|
|
format(index, { parser: "markdown" })
|
|
);
|
|
},
|
|
};
|
|
}
|
|
|
|
export default pluginGenerateDocs;
|