c3dd6b25a6
## What Many `oxlint-disable` / `eslint-disable` directives across the repo carry a corrupted rule id — `@typescripttypescript/<rule>` — most likely a find-and-replace accident that mangled the eslint-era `@typescript-eslint/` prefix. oxlint matches disable directives **loosely by rule name**, so these still suppress in practice (not a silent no-op), but the id is malformed and misleading. ## Change Replace them with the **canonical oxlint id** `typescript/<rule>` — matching the plugin name and rule keys declared in `.oxlintrc.json` — **127 files, 262 directives**: | rule | count | | --- | ----- | | `typescript/no-explicit-any` | 250 | | `typescript/ban-ts-comment` | 6 | | `typescript/no-misused-promises` | 4 | | `typescript/no-empty-object-type` | 2 | - `twenty-server`: 122 files - `twenty-front`: 5 files Comment-only — no code or runtime changes. ## Verification `oxlint --type-aware -c .oxlintrc.json` reports **0 warnings / 0 errors** for both `twenty-server` and `twenty-front`. Every changed line is exactly the id correction inside a disable directive (262 insertions / 262 deletions, no collateral edits). > Addresses the cubic review, which flagged that the canonical oxlint id is `typescript/...` (no `@`). Worth noting the original `@typescripttypescript/` was not actually a silent no-op — oxlint matches these directives loosely by rule name — but `typescript/` is the correct, config-aligned id.
123 lines
3.8 KiB
TypeScript
123 lines
3.8 KiB
TypeScript
import {
|
|
FieldMetadataType,
|
|
compositeTypeDefinitions,
|
|
} from 'twenty-shared/types';
|
|
import { capitalize } from 'twenty-shared/utils';
|
|
|
|
import { type CompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type';
|
|
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
|
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
|
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
|
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
|
import {
|
|
buildFieldMapsFromFlatObjectMetadata,
|
|
type FieldMapsForObject,
|
|
} from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
|
|
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
|
|
|
export function formatData<T>(
|
|
data: T,
|
|
flatObjectMetadata: FlatObjectMetadata,
|
|
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>,
|
|
fieldMapsForObject?: FieldMapsForObject,
|
|
): T {
|
|
if (!data) {
|
|
return data;
|
|
}
|
|
|
|
const fieldMaps =
|
|
fieldMapsForObject ??
|
|
buildFieldMapsFromFlatObjectMetadata(
|
|
flatFieldMetadataMaps,
|
|
flatObjectMetadata,
|
|
);
|
|
|
|
if (Array.isArray(data)) {
|
|
return data.map((item) =>
|
|
formatData(item, flatObjectMetadata, flatFieldMetadataMaps, fieldMaps),
|
|
) as T;
|
|
}
|
|
|
|
const { fieldIdByName, fieldIdByJoinColumnName } = fieldMaps;
|
|
|
|
// oxlint-disable-next-line typescript/no-explicit-any
|
|
const newData: Record<string, any> = {};
|
|
|
|
for (const [key, value] of Object.entries(data)) {
|
|
const fieldMetadataId = fieldIdByName[key] || fieldIdByJoinColumnName[key];
|
|
|
|
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
|
|
flatEntityId: fieldMetadataId,
|
|
flatEntityMaps: flatFieldMetadataMaps,
|
|
});
|
|
|
|
if (!fieldMetadata) {
|
|
throw new Error(
|
|
`Field metadata for field "${key}" is missing in object metadata ${flatObjectMetadata.nameSingular}`,
|
|
);
|
|
}
|
|
|
|
if (isCompositeFieldMetadataType(fieldMetadata.type)) {
|
|
const formattedCompositeField = formatCompositeField(
|
|
value,
|
|
fieldMetadata,
|
|
);
|
|
|
|
Object.assign(newData, formattedCompositeField);
|
|
} else {
|
|
newData[key] = formatFieldMetadataValue(value, fieldMetadata);
|
|
}
|
|
}
|
|
|
|
return newData as T;
|
|
}
|
|
|
|
export function formatCompositeField(
|
|
// oxlint-disable-next-line typescript/no-explicit-any
|
|
value: any,
|
|
fieldMetadata: FlatFieldMetadata,
|
|
// oxlint-disable-next-line typescript/no-explicit-any
|
|
): Record<string, any> {
|
|
const compositeType = compositeTypeDefinitions.get(
|
|
fieldMetadata.type as CompositeFieldMetadataType,
|
|
);
|
|
|
|
if (!compositeType) {
|
|
throw new Error(
|
|
`Composite type definition not found for type: ${fieldMetadata.type}`,
|
|
);
|
|
}
|
|
|
|
// oxlint-disable-next-line typescript/no-explicit-any
|
|
const formattedCompositeField: Record<string, any> = {};
|
|
|
|
for (const property of compositeType.properties) {
|
|
const subFieldKey = property.name;
|
|
const fullFieldName = `${fieldMetadata.name}${capitalize(subFieldKey)}`;
|
|
|
|
if (value && value[subFieldKey] !== undefined) {
|
|
formattedCompositeField[fullFieldName] = formatFieldMetadataValue(
|
|
value[subFieldKey],
|
|
property as unknown as FlatFieldMetadata,
|
|
);
|
|
}
|
|
}
|
|
|
|
return formattedCompositeField;
|
|
}
|
|
|
|
function formatFieldMetadataValue(
|
|
// oxlint-disable-next-line typescript/no-explicit-any
|
|
value: any,
|
|
fieldMetadata: FlatFieldMetadata,
|
|
) {
|
|
if (
|
|
fieldMetadata.type === FieldMetadataType.RAW_JSON &&
|
|
typeof value === 'string'
|
|
) {
|
|
return JSON.parse(value as string);
|
|
}
|
|
|
|
return value;
|
|
}
|