mirror of
https://github.com/nextui-org/nextui.git
synced 2025-12-08 19:26:11 +00:00
* docs: optimize route higtlight (#4520) * docs: optimize home display (#4519) * docs: optimize home display and route highlight * docs: optimize home display * fix(alert): propagate className (#4535) * fix(alert): propagate className * chore(alert): remove className from alert theme * fix(avatar): title type in Avatar (#4529) * fix(avatar): title type in Avatar * fix(alert): apply isEmpty check on title * fix(alert): alert interface props type * refactor: remove unnecessary props types (#4530) * refactor(docs): remove string type as it is included in ReactNode * refactor: remove unnecessary types * feat(changeset): add changeset * chore: remove changeset * refactor: remove null since ReactNode unions it already * fix(input): use onPress for wrapper click focus (#4483) * fix(input): use onPress for wrapper click focus * test(input): wrapper click focus test * chore(changeset): input onPress for wrapper click focus * chore(changeset): minor wording * Refactor/rebrand (#4532) * chore: rebrand in progress * chore: update docs to use heroui * chore: components renbranded * chore: figma moved to the docs files * fix: posthog config * fix(docs): extra classname in form example (#4465) * chore: clean git * chore: make heroui private * chore: new logo * chore: node env var renamed * chore: public robots txt deleted * chore: wrangler installed * chore: wrangler renamed * chore: cloudlfare workers removed * chore: force vercel deploy * refactor: first migration and provider * refactor: rename nextui plugin * refactor: rename github site * refactor: rename CONTRIBUTING * refactor: rename package name * refactor: nextjs image hostname * refactor: mdx repo nextui-org rename frontio-ai * refactor: nextui.org rename heroui.com * refactor: add heroui to missing places * fix: heroui plugin name * fix: update docs * docs: nextui to heroui add npmrc pnpm migratation * chore: rename all packages with new org name * chore: replace frontio-ai by frontioai * chore: revert previous changes * chore: small adjustment * chore: doc updated * feat: blog * chore: avatar updated * fix: url * chore: add new ogimage * fix: ogimage command * fix: heroui name and storybook welcome page * fix: og image url * feat: favicon and icon changed --------- Co-authored-by: աӄա <wingkwong.code@gmail.com> Co-authored-by: winches <329487092@qq.com> * fix: postbuild script * chore: core package updates * ci(changesets): version packages (#4569) Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * feat: contributors added to the blog --------- Co-authored-by: winches <329487092@qq.com> Co-authored-by: աӄա <wingkwong.code@gmail.com> Co-authored-by: Peterl561 <76144929+Peterl561@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
157 lines
4.5 KiB
TypeScript
157 lines
4.5 KiB
TypeScript
import {SandpackPredefinedTemplate, SandpackFiles} from "@codesandbox/sandpack-react";
|
|
|
|
import {HighlightedLines, HighlightedLine} from "./types";
|
|
|
|
const getLines = (lines?: string): HighlightedLine => {
|
|
const [start, end] = lines?.includes("-") ? lines?.split("-") : [0, 0];
|
|
|
|
const count = end ? parseInt(`${end}`, 10) - parseInt(`${start}`, 10) + 1 : 0;
|
|
|
|
return {
|
|
start,
|
|
end,
|
|
count,
|
|
};
|
|
};
|
|
|
|
export const getHighlightedLines = (
|
|
highlightedLines?: HighlightedLines,
|
|
template?: SandpackPredefinedTemplate,
|
|
) => {
|
|
if (!highlightedLines) {
|
|
return [];
|
|
}
|
|
|
|
let lines: HighlightedLine = {};
|
|
|
|
// if integer, we assume it's a line number
|
|
if (Number.isInteger(Number(highlightedLines))) {
|
|
return [
|
|
{
|
|
className: "sp-highlight",
|
|
line: Number(highlightedLines),
|
|
},
|
|
];
|
|
}
|
|
|
|
if (typeof highlightedLines === "string") {
|
|
lines = getLines(highlightedLines);
|
|
}
|
|
|
|
if (typeof highlightedLines === "object" && template) {
|
|
const templateLines = highlightedLines[template];
|
|
|
|
if (Number.isInteger(Number(templateLines))) {
|
|
return [
|
|
{
|
|
className: "sp-highlight",
|
|
line: Number(templateLines),
|
|
},
|
|
];
|
|
}
|
|
lines = getLines(templateLines);
|
|
}
|
|
|
|
if (!lines.count || lines.count === 0) {
|
|
return [];
|
|
}
|
|
|
|
// map linesCount to { className: 'sp-highlight', line: 1 }
|
|
return Array.from({length: lines.count}, (_, i) => ({
|
|
className: "sp-highlight",
|
|
line: parseInt(`${lines.start}`, 10) + i,
|
|
}));
|
|
};
|
|
|
|
export const getFileName = (filePath: string) => {
|
|
return filePath?.split(".")?.[0]?.replace(/\W/g, "");
|
|
};
|
|
|
|
export const getId = () => {
|
|
return Math.random().toString(32).slice(2, 10);
|
|
};
|
|
|
|
export function getHeroUIComponents(files: SandpackFiles): {[filePath: string]: string} {
|
|
const output: {[filePath: string]: string} = {};
|
|
|
|
for (const filePath in files) {
|
|
const file = files[filePath];
|
|
const code = typeof file === "string" ? file : file.code;
|
|
|
|
// Extract the import statements
|
|
const importStatements = extractHeroUIImport(code);
|
|
|
|
// Convert the import statements
|
|
const convertedImports = importStatements.map(convertImportStatement);
|
|
|
|
// Join the converted import statements and assign them to the output dictionary
|
|
output[filePath] = convertedImports.join("\n");
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
export function extractHeroUIImport(code: string): string[] {
|
|
// Split the code into lines
|
|
const lines = code.split("\n");
|
|
|
|
// Filter the lines to only include import statements from "@heroui/react"
|
|
const importStatements = lines.filter(
|
|
(line) => line.startsWith("import") && line.includes("@heroui/react"),
|
|
);
|
|
|
|
// Return the import statements
|
|
return importStatements;
|
|
}
|
|
|
|
export function convertImportStatement(importStatement: string): string[] {
|
|
// Use a regular expression to find the part of the string between the curly braces
|
|
const matches = importStatement.match(/{(.*)}/);
|
|
|
|
// If the regular expression found a match
|
|
if (matches && matches[1]) {
|
|
// Split the match into individual components, trim whitespace, convert to lowercase
|
|
const components = matches[1].split(",").map((item) => item.trim().toLowerCase());
|
|
|
|
// Filter the components to exclude those that start with the name of another component
|
|
const filteredComponents = components.filter(
|
|
(component, index, self) =>
|
|
!self.some((other, otherIndex) => otherIndex !== index && component.startsWith(other)),
|
|
);
|
|
|
|
// Wrap each in quotes to create a string representation of a string array
|
|
return filteredComponents;
|
|
}
|
|
|
|
// If the regular expression didn't find a match, return an empty string
|
|
return [];
|
|
}
|
|
|
|
export function updateTailwindConfig(tailwindConfig: string, componentNames: string[]): string {
|
|
// Split the tailwindConfig into lines
|
|
const lines = tailwindConfig.split("\n");
|
|
|
|
// Find the index of the line to replace
|
|
const lineIndex = lines.findIndex((line) =>
|
|
line.includes("./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}"),
|
|
);
|
|
|
|
// If the line was found
|
|
if (lineIndex !== -1) {
|
|
// Remove the line to replace
|
|
lines.splice(lineIndex, 1);
|
|
|
|
// Add the new lines for each component name
|
|
componentNames.forEach((componentName) => {
|
|
// Remove the quotes from the component name
|
|
const name = componentName.replace(/"/g, "");
|
|
|
|
// Add the new line
|
|
lines.splice(lineIndex, 0, ` "./node_modules/@heroui/theme/dist/components/${name}.js",`);
|
|
});
|
|
}
|
|
|
|
// Join the lines back together and return the result
|
|
return lines.join("\n");
|
|
}
|