9ad8287dbc
# Introduction In this PR we've migrated `twenty-shared` from a `vite` app [libary-mode](https://vite.dev/guide/build#library-mode) to a [preconstruct](https://preconstruct.tools/) "atomic" application ( in the future would like to introduce preconstruct to handle of all our atomic dependencies such as `twenty-emails` `twenty-ui` etc it will be integrated at the monorepo's root directly, would be to invasive in the first, starting incremental via `twenty-shared`) For more information regarding the motivations please refer to nor: - https://github.com/twentyhq/core-team-issues/issues/587 - https://github.com/twentyhq/core-team-issues/issues/281#issuecomment-2630949682 close https://github.com/twentyhq/core-team-issues/issues/589 close https://github.com/twentyhq/core-team-issues/issues/590 ## How to test In order to ease the review this PR will ship all the codegen at the very end, the actual meaning full diff is `+2,411 −114` In order to migrate existing dependent packages to `twenty-shared` multi barrel new arch you need to run in local: ```sh yarn tsx packages/twenty-shared/scripts/migrateFromSingleToMultiBarrelImport.ts && \ npx nx run-many -t lint --fix -p twenty-front twenty-ui twenty-server twenty-emails twenty-shared twenty-zapier ``` Note that `migrateFromSingleToMultiBarrelImport` is idempotent, it's atm included in the PR but should not be merged. ( such as codegen will be added before merging this script will be removed ) ## Misc - related opened issue preconstruct https://github.com/preconstruct/preconstruct/issues/617 ## Closed related PR - https://github.com/twentyhq/twenty/pull/11028 - https://github.com/twentyhq/twenty/pull/10993 - https://github.com/twentyhq/twenty/pull/10960 ## Upcoming enhancement: ( in others dedicated PRs ) - 1/ refactor generate barrel to export atomic module instead of `*` - 2/ generate barrel own package with several files and tests - 3/ Migration twenty-ui the same way - 4/ Use `preconstruct` at monorepo global level ## Conclusion As always any suggestions are welcomed !
84 lines
2.9 KiB
TypeScript
84 lines
2.9 KiB
TypeScript
import { FieldMetadataType } from 'twenty-shared/types';
|
|
|
|
import { CompositeProperty } from 'src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface';
|
|
import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface';
|
|
|
|
import {
|
|
FieldMetadataException,
|
|
FieldMetadataExceptionCode,
|
|
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
|
|
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
|
import { pascalCase } from 'src/utils/pascal-case';
|
|
|
|
type ComputeColumnNameOptions = { isForeignKey?: boolean };
|
|
|
|
export type FieldTypeAndNameMetadata = {
|
|
name: string;
|
|
type: FieldMetadataType;
|
|
};
|
|
|
|
export function computeColumnName(
|
|
fieldName: string,
|
|
options?: ComputeColumnNameOptions,
|
|
): string;
|
|
export function computeColumnName<T extends FieldMetadataType>(
|
|
fieldMetadata: FieldMetadataInterface<T>,
|
|
ioptions?: ComputeColumnNameOptions,
|
|
): string;
|
|
// TODO: If we need to implement custom name logic for columns, we can do it here
|
|
export function computeColumnName<T extends FieldMetadataType>(
|
|
fieldMetadataOrFieldName: FieldMetadataInterface<T> | string,
|
|
options?: ComputeColumnNameOptions,
|
|
): string {
|
|
const generateName = (name: string) => {
|
|
return options?.isForeignKey ? `${name}Id` : name;
|
|
};
|
|
|
|
if (typeof fieldMetadataOrFieldName === 'string') {
|
|
return generateName(fieldMetadataOrFieldName);
|
|
}
|
|
|
|
if (isCompositeFieldMetadataType(fieldMetadataOrFieldName.type)) {
|
|
throw new FieldMetadataException(
|
|
`Cannot compute composite column name for field: ${fieldMetadataOrFieldName.type}`,
|
|
FieldMetadataExceptionCode.INVALID_FIELD_INPUT,
|
|
);
|
|
}
|
|
|
|
return generateName(fieldMetadataOrFieldName.name);
|
|
}
|
|
export function computeCompositeColumnName(
|
|
fieldName: string,
|
|
compositeProperty: CompositeProperty,
|
|
): string;
|
|
export function computeCompositeColumnName<T extends FieldMetadataType>(
|
|
fieldMetadata: FieldTypeAndNameMetadata | FieldMetadataInterface<T>,
|
|
compositeProperty: CompositeProperty,
|
|
): string;
|
|
export function computeCompositeColumnName<T extends FieldMetadataType>(
|
|
fieldMetadataOrFieldName:
|
|
| FieldTypeAndNameMetadata
|
|
| FieldMetadataInterface<T>
|
|
| string,
|
|
compositeProperty: CompositeProperty,
|
|
): string {
|
|
const generateName = (name: string) => {
|
|
return `${name}${pascalCase(compositeProperty.name)}`;
|
|
};
|
|
|
|
if (typeof fieldMetadataOrFieldName === 'string') {
|
|
return generateName(fieldMetadataOrFieldName);
|
|
}
|
|
|
|
if (!isCompositeFieldMetadataType(fieldMetadataOrFieldName.type)) {
|
|
throw new FieldMetadataException(
|
|
`Cannot compute composite column name for non-composite field metadata type: ${fieldMetadataOrFieldName.type}`,
|
|
FieldMetadataExceptionCode.INVALID_FIELD_INPUT,
|
|
);
|
|
}
|
|
|
|
return `${fieldMetadataOrFieldName.name}${pascalCase(
|
|
compositeProperty.name,
|
|
)}`;
|
|
}
|