From f3934525c6c6769d476c94a364a46069c8206d80 Mon Sep 17 00:00:00 2001 From: Shishant Biswas Date: Tue, 21 Apr 2026 15:34:27 +0530 Subject: [PATCH] working primary key in code mode --- .../data/specs/fields/PrimaryField.spec.ts | 4 +- app/src/data/fields/PrimaryField.ts | 14 ++++- app/src/data/prototype/index.ts | 53 +++++++++++-------- app/src/index.ts | 1 + 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/app/__test__/data/specs/fields/PrimaryField.spec.ts b/app/__test__/data/specs/fields/PrimaryField.spec.ts index cd1aafc8..de642e03 100644 --- a/app/__test__/data/specs/fields/PrimaryField.spec.ts +++ b/app/__test__/data/specs/fields/PrimaryField.spec.ts @@ -24,7 +24,7 @@ describe("[data] PrimaryField", async () => { }); test("isFillable", async () => { - expect(field.isFillable()).toBe(false); + expect(field.isFillable()).toBe(true); }); test("isHidden", async () => { @@ -36,7 +36,7 @@ describe("[data] PrimaryField", async () => { }); test("transformPersist/Retrieve", async () => { - expect(field.transformPersist(1)).rejects.toThrow(); + expect(field.transformPersist(1)).resolves.toBe(1); expect(field.transformRetrieve(1)).toBe(1); }); diff --git a/app/src/data/fields/PrimaryField.ts b/app/src/data/fields/PrimaryField.ts index 3e1743e5..09c62a43 100644 --- a/app/src/data/fields/PrimaryField.ts +++ b/app/src/data/fields/PrimaryField.ts @@ -24,7 +24,11 @@ export class PrimaryField extends Field< override readonly type = "primary"; 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 { @@ -60,7 +64,13 @@ export class PrimaryField extends Field< return undefined; } - override async transformPersist(value: any): Promise { + override async transformPersist(value: any): Promise { + if (this.isFillable()) { + if (value == null) { + return this.getNewValue(); + } + return value; + } throw new Error("PrimaryField: This function should not be called"); } diff --git a/app/src/data/prototype/index.ts b/app/src/data/prototype/index.ts index 0741f956..f7559100 100644 --- a/app/src/data/prototype/index.ts +++ b/app/src/data/prototype/index.ts @@ -21,6 +21,8 @@ import { type NumberFieldConfig, TextField, type TextFieldConfig, + PrimaryField, + type PrimaryFieldConfig, } from "data/fields"; import { Entity, type EntityConfig, type TEntityType } from "data/entities"; @@ -51,6 +53,8 @@ type Options = { }; const FieldMap = { + primary: (o: Omit) => + new PrimaryField(o.field_name, { ...o.config, required: true }), 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 }), 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 config: any, public is_required: boolean, - ) {} + ) { } required() { this.is_required = true; @@ -108,6 +112,11 @@ export class FieldPrototype { } } +export function primary( + config?: Omit, +): PrimaryField & { required: () => PrimaryField } { + return new FieldPrototype("primary", config, false) as any; +} export function text( config?: Omit, ): TextField & { required: () => TextField } { @@ -296,8 +305,8 @@ class EntityManagerPrototype> extends En type Chained any>> = { [K in keyof R]: R[K] extends (...args: any[]) => any - ? (...args: Parameters) => Chained - : never; + ? (...args: Parameters) => Chained + : never; }; type ChainedFn< Fn extends (...args: any[]) => Record any>, @@ -356,22 +365,22 @@ export function em>( export type InferEntityFields = T extends Entity ? { - [K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required } - ? Required extends true - ? Type - : Type | undefined - : never; - } + [K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required } + ? Required extends true + ? Type + : Type | undefined + : never; + } : never; export type InferFields = Fields extends Record> ? { - [K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required } - ? Required extends true - ? Type - : Type | undefined - : never; - } + [K in keyof Fields]: Fields[K] extends { _type: infer Type; _required: infer Required } + ? Required extends true + ? Type + : Type | undefined + : never; + } : never; type Prettify = { @@ -387,10 +396,10 @@ type OptionalUndefined< T, Props extends keyof T = keyof T, OptionsProps extends keyof T = Props extends keyof T - ? undefined extends T[Props] - ? Props - : never - : never, + ? undefined extends T[Props] + ? Props + : never + : never, > = Merge< { [K in OptionsProps]?: T[K]; @@ -401,8 +410,8 @@ type OptionalUndefined< export type InferField = Field extends { _type: infer Type; _required: infer Required } ? Required extends true - ? Type - : Type | undefined + ? Type + : Type | undefined : never; export type Schemas> = { @@ -410,5 +419,5 @@ export type Schemas> = { }; export type InsertSchema = Simplify>>; -export type Schema = Simplify<{ id: Generated } & InsertSchema>; +export type Schema = Simplify<{ id: Generated | string } & InsertSchema>; export type FieldSchema = Simplify>>; diff --git a/app/src/index.ts b/app/src/index.ts index c158502e..8ee39bfe 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -173,6 +173,7 @@ export { // data prototype export { + primary, text, number, date,