mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-14 18:01:06 +00:00
116 lines
2.9 KiB
JavaScript
116 lines
2.9 KiB
JavaScript
// @ts-check
|
|
import fs from "node:fs";
|
|
import componentApi from "../docs/src/COMPONENT_API.json" with { type: "json" };
|
|
import { format } from "prettier";
|
|
import plugin from "prettier/plugins/typescript";
|
|
|
|
const formatTypeScript = async (value) => {
|
|
return await format(value, {
|
|
parser: "typescript",
|
|
plugins: [plugin],
|
|
printWidth: 40, // Force breaking onto new lines
|
|
bracketSameLine: false,
|
|
});
|
|
};
|
|
|
|
console.time("formatComponentApi");
|
|
|
|
const modified = { ...componentApi };
|
|
|
|
modified.components = await Promise.all(
|
|
componentApi.components.map(async (component) => {
|
|
component.props = await Promise.all(
|
|
component.props.map(async (prop) => {
|
|
if (!prop.value || !/\s{2,}/.test(prop.value)) {
|
|
return prop;
|
|
}
|
|
|
|
let normalizedValue = prop.value;
|
|
const prefix = `const ${prop.name} = `;
|
|
|
|
if (prop.isFunction || prop.value.startsWith("{")) {
|
|
normalizedValue = prefix + prop.value;
|
|
}
|
|
|
|
const formatted = (await formatTypeScript(normalizedValue))
|
|
// Remove prefix needed for formatting.
|
|
.replace(new RegExp(`^${prefix}`), "")
|
|
// Remove trailing semi-colon.
|
|
.replace(/;\s*$/, "");
|
|
|
|
return {
|
|
...prop,
|
|
value: formatted,
|
|
};
|
|
}),
|
|
);
|
|
|
|
component.typedefs = await Promise.all(
|
|
component.typedefs.map(async (typedef) => {
|
|
if (!typedef.ts) {
|
|
return typedef;
|
|
}
|
|
|
|
return {
|
|
...typedef,
|
|
ts: await formatTypeScript(typedef.ts),
|
|
};
|
|
}),
|
|
);
|
|
|
|
component.events = await Promise.all(
|
|
component.events.map(async (event) => {
|
|
if (event.type === "forwarded") {
|
|
return event;
|
|
}
|
|
|
|
const normalizedValue = `type EventDetail = ${event.detail}`;
|
|
|
|
const formatted = (await formatTypeScript(normalizedValue))
|
|
// Remove prefix needed for formatting.
|
|
.replace(/type EventDetail = /, "")
|
|
// Remove trailing semi-colon.
|
|
.replace(/;\s*$/, "");
|
|
|
|
return {
|
|
...event,
|
|
detail: formatted,
|
|
};
|
|
}),
|
|
);
|
|
|
|
component.slots = await Promise.all(
|
|
component.slots.map(async (slot) => {
|
|
if (!slot.slot_props) {
|
|
return slot;
|
|
}
|
|
|
|
let normalizedValue = slot.slot_props;
|
|
|
|
if (normalizedValue.startsWith("{")) {
|
|
normalizedValue = `type SlotProps = ${normalizedValue}`;
|
|
}
|
|
|
|
const formatted = (await formatTypeScript(normalizedValue))
|
|
// Remove prefix needed for formatting.
|
|
.replace(/type SlotProps = /, "")
|
|
// Remove trailing semi-colon.
|
|
.replace(/;\s*$/, "");
|
|
|
|
return {
|
|
...slot,
|
|
slot_props: formatted,
|
|
};
|
|
}),
|
|
);
|
|
|
|
return component;
|
|
}),
|
|
);
|
|
|
|
fs.writeFileSync(
|
|
"./docs/src/COMPONENT_API.json",
|
|
JSON.stringify(modified, null, 2),
|
|
);
|
|
|
|
console.timeEnd("formatComponentApi");
|