Files
medusa-store/packages/admin/dashboard/src/lib/form-helpers.ts
Kasper Fabricius Kristensen 0fe1201435 feat(admin-sdk,admin-bundler,admin-shared,medusa): Restructure admin packages (#8988)
**What**
- Renames /admin-next -> /admin
- Renames @medusajs/admin-sdk -> @medusajs/admin-bundler
- Creates a new package called @medusajs/admin-sdk that will hold all tooling relevant to creating admin extensions. This is currently `defineRouteConfig` and `defineWidgetConfig`, but will eventually also export methods for adding custom fields, register translation, etc. 
  - cc: @shahednasser we should update the examples in the docs so these functions are imported from `@medusajs/admin-sdk`. People will also need to install the package in their project, as it's no longer a transient dependency.
  - cc: @olivermrbl we might want to publish a changelog when this is merged, as it is a breaking change, and will require people to import the `defineXConfig` from the new package instead of `@medusajs/admin-shared`.
- Updates CODEOWNERS so /admin packages does not require a review from the UI team.
2024-09-04 19:00:25 +00:00

70 lines
1.9 KiB
TypeScript

import { castNumber } from "./cast-number"
export function transformNullableFormValue<T>(
value: T,
nullify = true
): T | undefined | null {
if (typeof value === "string" && value.trim() === "") {
return nullify ? null : undefined
}
if (Array.isArray(value) && value.length === 0) {
return nullify ? null : undefined
}
return value
}
type Nullable<T> = { [K in keyof T]: T[K] | null }
type Optional<T> = { [K in keyof T]: T[K] | undefined }
export function transformNullableFormData<
T extends Record<string, unknown>,
K extends boolean = true
>(data: T, nullify: K = true as K): K extends true ? Nullable<T> : Optional<T> {
return Object.entries(data).reduce((acc, [key, value]) => {
return {
...acc,
[key]: transformNullableFormValue(value, nullify),
}
}, {} as K extends true ? Nullable<T> : Optional<T>)
}
export function transformNullableFormNumber<K extends boolean = true>(
value?: string | number,
nullify: K = true as K
): K extends true ? number | null : number | undefined {
if (
typeof value === "undefined" ||
(typeof value === "string" && value.trim() === "")
) {
return (nullify ? null : undefined) as K extends true
? number | null
: number | undefined
}
if (typeof value === "string") {
return castNumber(value)
}
return value
}
type NullableNumbers = Record<string, number | null>
type OptionalNumbers = Record<string, number | undefined>
export function transformNullableFormNumbers<
T extends Record<string, string | number | undefined>,
K extends boolean = true
>(
data: T,
nullify: K = true as K
): K extends true ? NullableNumbers : OptionalNumbers {
return Object.entries(data).reduce((acc, [key, value]) => {
return {
...acc,
[key]: transformNullableFormNumber(value, nullify),
}
}, {} as K extends true ? NullableNumbers : OptionalNumbers)
}