working primary key in code mode

This commit is contained in:
2026-04-21 15:34:27 +05:30
parent 8a90b9356b
commit f3934525c6
4 changed files with 46 additions and 26 deletions
@@ -24,7 +24,7 @@ describe("[data] PrimaryField", async () => {
}); });
test("isFillable", async () => { test("isFillable", async () => {
expect(field.isFillable()).toBe(false); expect(field.isFillable()).toBe(true);
}); });
test("isHidden", async () => { test("isHidden", async () => {
@@ -36,7 +36,7 @@ describe("[data] PrimaryField", async () => {
}); });
test("transformPersist/Retrieve", async () => { test("transformPersist/Retrieve", async () => {
expect(field.transformPersist(1)).rejects.toThrow(); expect(field.transformPersist(1)).resolves.toBe(1);
expect(field.transformRetrieve(1)).toBe(1); expect(field.transformRetrieve(1)).toBe(1);
}); });
+12 -2
View File
@@ -24,7 +24,11 @@ export class PrimaryField<Required extends true | false = false> extends Field<
override readonly type = "primary"; override readonly type = "primary";
constructor(name: string = config.data.default_primary_field, cfg?: PrimaryFieldConfig) { constructor(name: string = config.data.default_primary_field, cfg?: PrimaryFieldConfig) {
super(name, { ...cfg, fillable: false, required: false }); super(name, {
...cfg,
fillable: cfg?.fillable ?? name !== config.data.default_primary_field,
required: false,
});
} }
override isRequired(): boolean { override isRequired(): boolean {
@@ -60,7 +64,13 @@ export class PrimaryField<Required extends true | false = false> extends Field<
return undefined; return undefined;
} }
override async transformPersist(value: any): Promise<number> { override async transformPersist(value: any): Promise<any> {
if (this.isFillable()) {
if (value == null) {
return this.getNewValue();
}
return value;
}
throw new Error("PrimaryField: This function should not be called"); throw new Error("PrimaryField: This function should not be called");
} }
+31 -22
View File
@@ -21,6 +21,8 @@ import {
type NumberFieldConfig, type NumberFieldConfig,
TextField, TextField,
type TextFieldConfig, type TextFieldConfig,
PrimaryField,
type PrimaryFieldConfig,
} from "data/fields"; } from "data/fields";
import { Entity, type EntityConfig, type TEntityType } from "data/entities"; import { Entity, type EntityConfig, type TEntityType } from "data/entities";
@@ -51,6 +53,8 @@ type Options<Config = any> = {
}; };
const FieldMap = { const FieldMap = {
primary: (o: Omit<Options, "required">) =>
new PrimaryField(o.field_name, { ...o.config, required: true }),
text: (o: Options) => new TextField(o.field_name, { ...o.config, required: o.is_required }), text: (o: Options) => new TextField(o.field_name, { ...o.config, required: o.is_required }),
number: (o: Options) => new NumberField(o.field_name, { ...o.config, required: o.is_required }), number: (o: Options) => new NumberField(o.field_name, { ...o.config, required: o.is_required }),
date: (o: Options) => new DateField(o.field_name, { ...o.config, required: o.is_required }), date: (o: Options) => new DateField(o.field_name, { ...o.config, required: o.is_required }),
@@ -73,7 +77,7 @@ export class FieldPrototype {
public type: TFieldType, public type: TFieldType,
public config: any, public config: any,
public is_required: boolean, public is_required: boolean,
) {} ) { }
required() { required() {
this.is_required = true; this.is_required = true;
@@ -108,6 +112,11 @@ export class FieldPrototype {
} }
} }
export function primary(
config?: Omit<PrimaryFieldConfig, "required">,
): PrimaryField<false> & { required: () => PrimaryField<true> } {
return new FieldPrototype("primary", config, false) as any;
}
export function text( export function text(
config?: Omit<TextFieldConfig, "required">, config?: Omit<TextFieldConfig, "required">,
): TextField<false> & { required: () => TextField<true> } { ): TextField<false> & { required: () => TextField<true> } {
@@ -296,8 +305,8 @@ class EntityManagerPrototype<Entities extends Record<string, Entity>> extends En
type Chained<R extends Record<string, (...args: any[]) => any>> = { type Chained<R extends Record<string, (...args: any[]) => any>> = {
[K in keyof R]: R[K] extends (...args: any[]) => any [K in keyof R]: R[K] extends (...args: any[]) => any
? (...args: Parameters<R[K]>) => Chained<R> ? (...args: Parameters<R[K]>) => Chained<R>
: never; : never;
}; };
type ChainedFn< type ChainedFn<
Fn extends (...args: any[]) => Record<string, (...args: any[]) => any>, Fn extends (...args: any[]) => Record<string, (...args: any[]) => any>,
@@ -356,22 +365,22 @@ export function em<Entities extends Record<string, Entity>>(
export type InferEntityFields<T> = T extends Entity<infer _N, infer Fields> export type InferEntityFields<T> = T extends Entity<infer _N, infer Fields>
? { ? {
[K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required } [K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required }
? Required extends true ? Required extends true
? Type ? Type
: Type | undefined : Type | undefined
: never; : never;
} }
: never; : never;
export type InferFields<Fields> = Fields extends Record<string, Field<any, any, any>> export type InferFields<Fields> = Fields extends Record<string, Field<any, any, any>>
? { ? {
[K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required } [K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required }
? Required extends true ? Required extends true
? Type ? Type
: Type | undefined : Type | undefined
: never; : never;
} }
: never; : never;
type Prettify<T> = { type Prettify<T> = {
@@ -387,10 +396,10 @@ type OptionalUndefined<
T, T,
Props extends keyof T = keyof T, Props extends keyof T = keyof T,
OptionsProps extends keyof T = Props extends keyof T OptionsProps extends keyof T = Props extends keyof T
? undefined extends T[Props] ? undefined extends T[Props]
? Props ? Props
: never : never
: never, : never,
> = Merge< > = Merge<
{ {
[K in OptionsProps]?: T[K]; [K in OptionsProps]?: T[K];
@@ -401,8 +410,8 @@ type OptionalUndefined<
export type InferField<Field> = Field extends { _type: infer Type; _required: infer Required } export type InferField<Field> = Field extends { _type: infer Type; _required: infer Required }
? Required extends true ? Required extends true
? Type ? Type
: Type | undefined : Type | undefined
: never; : never;
export type Schemas<T extends Record<string, Entity>> = { export type Schemas<T extends Record<string, Entity>> = {
@@ -410,5 +419,5 @@ export type Schemas<T extends Record<string, Entity>> = {
}; };
export type InsertSchema<T> = Simplify<OptionalUndefined<InferEntityFields<T>>>; export type InsertSchema<T> = Simplify<OptionalUndefined<InferEntityFields<T>>>;
export type Schema<T> = Simplify<{ id: Generated<number> } & InsertSchema<T>>; export type Schema<T> = Simplify<{ id: Generated<number> | string } & InsertSchema<T>>;
export type FieldSchema<T> = Simplify<OptionalUndefined<InferFields<T>>>; export type FieldSchema<T> = Simplify<OptionalUndefined<InferFields<T>>>;
+1
View File
@@ -173,6 +173,7 @@ export {
// data prototype // data prototype
export { export {
primary,
text, text,
number, number,
date, date,