cb7d0b83a8
## PR description This PR: - Creates a TypeScript-based extractor that discovers all exported twenty-ui components by scanning barrel files, extracting props/slots/events via ts-morph type analysis, and generating the remote DOM bindings automatically. - Adds a new ESLint rule which enforces all *Props types in twenty-ui components to be exported, which is required for the extractor to discover component prop types. Existing twenty-ui components are updated to comply with this rule. - Extends the remote DOM generation to support slots, per-component events, forwardRef wrappers, and richer property types (array, object, function) ## Edge cases to fix in another PR - Icons cannot be rendered inside buttons - IconButtons throw an error when mounted - MenuItems are not displayed correctly - MenuItemNavigate throws on click ## Video Demo https://github.com/user-attachments/assets/c2ed67cf-6a15-4896-9fec-e83fac0e862b
32 lines
734 B
TypeScript
32 lines
734 B
TypeScript
const SCREAMING_SNAKE_CASE_REGEX = /^[A-Z][A-Z_0-9]+$/;
|
|
|
|
const SKIP_PREFIXES = [
|
|
'Styled',
|
|
'use',
|
|
'Icon',
|
|
'Illustration',
|
|
'base',
|
|
'BASE',
|
|
'get',
|
|
] as const;
|
|
|
|
const SKIP_SUFFIXES = ['Provider', 'State', 'state'] as const;
|
|
|
|
const NEVER_SKIP = new Set(['Icon']);
|
|
|
|
export const shouldSkipExport = (exportName: string): boolean => {
|
|
if (NEVER_SKIP.has(exportName)) {
|
|
return false;
|
|
}
|
|
|
|
const hasSkipPrefix = SKIP_PREFIXES.some((prefix) =>
|
|
exportName.startsWith(prefix),
|
|
);
|
|
const hasSkipSuffix = SKIP_SUFFIXES.some((suffix) =>
|
|
exportName.endsWith(suffix),
|
|
);
|
|
const isScreamingSnakeCase = SCREAMING_SNAKE_CASE_REGEX.test(exportName);
|
|
|
|
return hasSkipPrefix || hasSkipSuffix || isScreamingSnakeCase;
|
|
};
|