@stacksjs/orm 0.70.369 → 0.70.370

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,4 +16,8 @@
16
16
  * ```
17
17
  */
18
18
  // eslint-disable-next-line pickier/no-unused-vars
19
- export declare function batchLoad<T extends { findMany?: (ids: any[]) => Promise<any[]>, find?: (id: any) => Promise<any> }, K = number | string>(model: T, key: K): Promise<unknown>;
19
+ export declare function batchLoad<TKey = number | string, TValue = Record<string, unknown>>(model: {
20
+ name?: string
21
+ findMany?: (ids: TKey[]) => Promise<TValue[]>
22
+ find?: (id: TKey) => Promise<TValue | undefined>
23
+ }, key: TKey): Promise<TValue | undefined>;
@@ -6,7 +6,10 @@ import { createSoftDeleteMethods } from './traits/soft-deletes';
6
6
  import { createTaggableMethods } from './traits/taggable';
7
7
  import { createTwoFactorMethods } from './traits/two-factor';
8
8
  import { type OrmModelDefinition as BQBModelDefinition, type OrmModelStatic } from '@stacksjs/query-builder';
9
+ import type { ApiMiddleware } from '@stacksjs/types';
10
+ import type { Faker } from '@stacksjs/faker';
9
11
  import type { InferRelationNames } from '@stacksjs/query-builder';
12
+ import type { Validator } from '@stacksjs/validation';
10
13
  // Re-export types from bun-query-builder for convenience
11
14
  export type { ModelDefinition, InferRelationNames, ModelAttributes, InferModelAttributes, SystemFields, ColumnName, AttributeKeys, FillableKeys, HiddenKeys, ModelInstance, ModelQueryBuilder } from '@stacksjs/query-builder';
12
15
  /**
@@ -95,18 +98,12 @@ export declare interface StacksModelDefinition extends Omit<BQBModelDefinition,
95
98
  useApi?: boolean | {
96
99
  readonly uri?: string
97
100
  readonly routes?: readonly string[]
98
- readonly middleware?: any
101
+ readonly middleware?: ApiMiddleware
99
102
  }
100
103
  } & Record<string, unknown>
101
104
  indexes?: Array<{ name: string, columns: string[], unique?: boolean, where?: string }>
102
105
  casts?: Record<string, CastType | CasterInterface>
103
- attributes: {
104
- [key: string]: {
105
- factory?: (faker: any) => any
106
- [key: string]: any
107
- }
108
- }
109
- [key: string]: any
106
+ attributes: Record<string, StacksModelAttribute>
110
107
  }
111
108
  /**
112
109
  * Scout-style search index sync when `traits.useSearch` is set.
@@ -164,7 +161,46 @@ export declare interface TraitMethods {
164
161
  * the render layer.
165
162
  */
166
163
  export type CastType = 'string' | 'number' | 'boolean' | 'json' | 'datetime' | 'date' | 'array' | 'integer' | 'float';
164
+ declare type BQBModelAttribute = BQBModelDefinition['attributes'][string];
165
+ export type StacksModelAttribute = Omit<BQBModelAttribute, 'factory'> & {
166
+ factory?: (faker: Faker) => unknown
167
+ }
167
168
  declare type ModelDefinition = StacksModelDefinition;
169
+ declare type ValidationRuleOf<TAttribute> = TAttribute extends { validation: { rule: infer TRule } } ? TRule : never;
170
+ declare type ValidationInferenceRule<TRule> = TRule extends Validator<number> ? 'number' : TRule;
171
+ declare type BQBFaker = Parameters<NonNullable<BQBModelAttribute['factory']>>[0];
172
+ declare type FactoryReturnOf<TAttribute> = TAttribute extends { factory: (...args: never[]) => infer TResult } ? TResult : never;
173
+ declare type DefaultTypeToken<TAttribute> = TAttribute extends { default: infer TDefault }
174
+ ? TDefault extends string ? 'string'
175
+ : TDefault extends number ? 'number'
176
+ : TDefault extends boolean ? 'boolean'
177
+ : TDefault extends Date ? 'date'
178
+ : TDefault extends Record<string, unknown> ? 'json'
179
+ : never
180
+ : never;
181
+ declare type InferenceHint<TAttribute> = TAttribute extends { type: unknown } | { factory: (...args: never[]) => unknown }
182
+ ? object
183
+ : [ValidationRuleOf<TAttribute>] extends [never]
184
+ ? [DefaultTypeToken<TAttribute>] extends [never]
185
+ ? object
186
+ : { type: DefaultTypeToken<TAttribute> }
187
+ : { type: ValidationInferenceRule<ValidationRuleOf<TAttribute>> }
188
+ declare type QueryAttribute<TAttribute> = Omit<TAttribute, 'factory'>
189
+ & InferenceHint<TAttribute>
190
+ & ([FactoryReturnOf<TAttribute>] extends [never]
191
+ ? object
192
+ : { factory: (faker: BQBFaker) => FactoryReturnOf<TAttribute> });
193
+ declare type QueryTraits<TDef extends ModelDefinition> = TDef extends { traits: infer TTraits }
194
+ ? { traits: TTraits & NonNullable<BQBModelDefinition['traits']> }
195
+ : { traits?: BQBModelDefinition['traits'] }
196
+ declare type QueryDefinition<TDef extends ModelDefinition> = TDef
197
+ & {
198
+ attributes: { [TKey in keyof TDef['attributes']]: QueryAttribute<TDef['attributes'][TKey]> }
199
+ }
200
+ & QueryTraits<TDef>;
201
+ declare type QueryModel<TDef extends ModelDefinition> = OrmModelStatic<QueryDefinition<TDef>>;
202
+ declare type ModelWriteData<TDef extends ModelDefinition> = Parameters<QueryModel<TDef>['create']>[0];
203
+ declare type ModelForceWriteData<TDef extends ModelDefinition> = Parameters<ReturnType<QueryModel<TDef>['make']>['forceFill']>[0];
168
204
  /**
169
205
  * Stacks-enhanced model definition.
170
206
  *
@@ -198,22 +234,23 @@ declare type ModelDefinition = StacksModelDefinition;
198
234
  * name: 'Post',
199
235
  * table: 'posts',
200
236
  * attributes: {
201
- * title: { type: 'string', fillable: true, validation: { rule: schema.string() } },
202
- * views: { type: 'number', fillable: true, validation: { rule: schema.number() } },
237
+ * title: { fillable: true, validation: { rule: schema.string() } },
238
+ * views: { fillable: true, validation: { rule: schema.number() } },
203
239
  * },
204
240
  * belongsTo: ['Author'],
205
241
  * hasMany: ['Tag', 'Category', 'Comment'],
206
242
  * traits: { useTimestamps: true, useUuid: true },
207
- * } as const)
243
+ * })
208
244
  *
209
245
  * // Result: Post.where('title', 'test') — 'title' narrowed to valid columns
210
246
  * // Result: Post.with('author') — 'author' narrowed to valid relations
211
247
  * ```
212
248
  */
213
- export type StacksModelStatic<TDef extends ModelDefinition> = OrmModelStatic<TDef> & TDef & TraitMethods & {
214
- update: (id: number | string, data: Record<string, unknown>) => ReturnType<OrmModelStatic<TDef>['find']>
215
- forceUpdate: (id: number | string, data: Record<string, unknown>) => ReturnType<OrmModelStatic<TDef>['find']>
216
- forceCreate: (data: Record<string, unknown>) => ReturnType<OrmModelStatic<TDef>['create']>
249
+ export type StacksModelStatic<TDef extends ModelDefinition> = QueryModel<TDef> & TDef & TraitMethods & {
250
+ readonly [MODEL_DEFINITION]: TDef
251
+ update: (id: number | string, data: ModelWriteData<TDef>) => ReturnType<QueryModel<TDef>['find']>
252
+ forceUpdate: (id: number | string, data: ModelForceWriteData<TDef>) => ReturnType<QueryModel<TDef>['find']>
253
+ forceCreate: (data: ModelForceWriteData<TDef>) => ReturnType<QueryModel<TDef>['create']>
217
254
  delete: (id: number | string) => Promise<boolean>
218
255
  withoutEvents: <T>(fn: () => T | Promise<T>) => Promise<T>
219
256
  /** Run `fn` with declared `validation.rule`s suppressed (bulk imports, backfills). */
package/dist/index.d.ts CHANGED
@@ -69,6 +69,9 @@ export declare const DriverPing: ReturnType<typeof lazyModel<typeof import('../.
69
69
  export declare const CampaignSend: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/CampaignSend').default>>;
70
70
  export declare const EmailList: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/EmailList').default>>;
71
71
  export declare const EmailListSubscriber: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/EmailListSubscriber').default>>;
72
+ export declare const EmailIdempotency: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/EmailIdempotency').default>>;
73
+ export declare const EmailSuppression: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/EmailSuppression').default>>;
74
+ export declare const EmailWebhookEvent: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/EmailWebhookEvent').default>>;
72
75
  export declare const ErrorModel: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/Error').default>>;
73
76
  export declare const GiftCard: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/commerce/GiftCard').default>>;
74
77
  export declare const Label: ReturnType<typeof lazyModel<typeof import('../../../defaults/app/Models/Label').default>>;