Files
twenty/packages/twenty-sdk/scripts/remote-dom/twenty-ui-extractor/utils/should-skip-export.ts
T
Raphaël Bosi cb7d0b83a8 [FRONT COMPONENTS] Twenty UI elements generation (#17866)
## 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
2026-02-12 12:48:16 +01:00

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;
};