ilana-orm 1.0.3 → 1.0.5

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.
@@ -0,0 +1,45 @@
1
+ import { Knex } from 'knex';
2
+
3
+ export interface DatabaseConfig {
4
+ default: string;
5
+ connections: {
6
+ [name: string]: Knex.Config;
7
+ };
8
+ migrations?: {
9
+ directory?: string;
10
+ tableName?: string;
11
+ };
12
+ seeds?: {
13
+ directory?: string;
14
+ };
15
+ }
16
+
17
+ export interface Transaction extends Knex.Transaction {
18
+ commit(): Promise<void>;
19
+ rollback(): Promise<void>;
20
+ }
21
+
22
+ export default class Database {
23
+ static connections: Map<string, Knex>;
24
+ static config: DatabaseConfig;
25
+ static defaultConnection: string;
26
+ static instance: Knex;
27
+ private static _currentTransaction: Knex.Transaction | null;
28
+
29
+ static configure(config: DatabaseConfig): void;
30
+ static connection(name?: string): Knex;
31
+ static getDefaultConnection(): string;
32
+ static hasConnection(name: string): boolean;
33
+ static getInstance(): Knex;
34
+ static transaction<T>(
35
+ callback: (trx: Knex.Transaction) => Promise<T>,
36
+ attempts?: number,
37
+ connection?: string
38
+ ): Promise<T>;
39
+ static beginTransaction(connection?: string): Promise<Transaction>;
40
+ static commit(trx: Knex.Transaction): Promise<void>;
41
+ static rollback(trx: Knex.Transaction): Promise<void>;
42
+ static getCurrentTransaction(): Knex.Transaction | null;
43
+ static table(tableName: string, connectionName?: string): Knex.QueryBuilder;
44
+ static raw(sql: string, bindings?: any[]): Knex.Raw;
45
+ }
package/index.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export { default as Model } from './orm/Model';
2
+ export { default as QueryBuilder } from './orm/QueryBuilder';
3
+ export { default as Collection } from './orm/Collection';
4
+ export { default as Database } from './database/connection';
5
+ export * from './orm/Relation';
6
+ export * from './orm/CustomCasts';
7
+
8
+ // Default export
9
+ export { default } from './orm/Model';
@@ -0,0 +1,53 @@
1
+ export default class Collection<T = any> extends Array<T> {
2
+ constructor(items?: T[]);
3
+
4
+ // Static factory methods
5
+ static make<T>(items?: T[]): Collection<T>;
6
+ static times<T>(count: number, callback: (index: number) => T): Collection<T>;
7
+ static range(start: number, end: number): Collection<number>;
8
+
9
+ // Collection methods
10
+ filter(callback: (item: T, index: number) => boolean): Collection<T>;
11
+ map<U>(callback: (item: T, index: number) => U): Collection<U>;
12
+ first(): T | undefined;
13
+ last(): T | undefined;
14
+ pluck<K extends keyof T>(key: K): Collection<T[K]>;
15
+ unique(): Collection<T>;
16
+ unique<K extends keyof T>(key: K): Collection<T>;
17
+ groupBy<K extends keyof T>(key: K): { [key: string]: Collection<T> };
18
+ sortBy<K extends keyof T>(key: K): Collection<T>;
19
+ sortByDesc<K extends keyof T>(key: K): Collection<T>;
20
+ where<K extends keyof T>(key: K, value: T[K]): Collection<T>;
21
+ firstWhere<K extends keyof T>(key: K, value: T[K]): T | undefined;
22
+ sum(): number;
23
+ sum<K extends keyof T>(key: K): number;
24
+ avg(): number;
25
+ avg<K extends keyof T>(key: K): number;
26
+ min(): T | undefined;
27
+ min<K extends keyof T>(key: K): T[K] | undefined;
28
+ max(): T | undefined;
29
+ max<K extends keyof T>(key: K): T[K] | undefined;
30
+ chunk(size: number): Collection<Collection<T>>;
31
+ toJSON(): any[];
32
+
33
+ // Advanced collection methods
34
+ reject(callback: (item: T, index: number) => boolean): Collection<T>;
35
+ partition(callback: (item: T, index: number) => boolean): [Collection<T>, Collection<T>];
36
+ keyBy<K extends keyof T>(key: K): { [key: string]: T };
37
+ countBy<K extends keyof T>(key: K): { [key: string]: number };
38
+ flatten(): Collection<any>;
39
+ take(count: number): Collection<T>;
40
+ skip(count: number): Collection<T>;
41
+ random(): T | undefined;
42
+ random(count: number): Collection<T>;
43
+ shuffle(): Collection<T>;
44
+ tap(callback: (collection: this) => void): this;
45
+ pipe<U>(callback: (collection: this) => U): U;
46
+ whenEmpty(callback: (collection: this) => void): this;
47
+ whenNotEmpty(callback: (collection: this) => void): this;
48
+ unless(condition: boolean, callback: (collection: this) => void): this;
49
+ when(condition: boolean, callback: (collection: this) => void): this;
50
+ toArray(): T[];
51
+ isEmpty(): boolean;
52
+ isNotEmpty(): boolean;
53
+ }
@@ -0,0 +1,30 @@
1
+ export interface Cast {
2
+ get(value: any): any;
3
+ set(value: any): any;
4
+ }
5
+
6
+ export class MoneyCast implements Cast {
7
+ get(value: any): number | null;
8
+ set(value: any): number | null;
9
+ }
10
+
11
+ export class EncryptedCast implements Cast {
12
+ constructor(key?: string);
13
+ get(value: any): string | null;
14
+ set(value: any): string | null;
15
+ }
16
+
17
+ export class JsonCast implements Cast {
18
+ get(value: any): any;
19
+ set(value: any): string | null;
20
+ }
21
+
22
+ export class ArrayCast implements Cast {
23
+ get(value: any): any[] | null;
24
+ set(value: any): string | null;
25
+ }
26
+
27
+ export class DateCast implements Cast {
28
+ get(value: any): Date | null;
29
+ set(value: any): string | null;
30
+ }
package/orm/Model.d.ts ADDED
@@ -0,0 +1,160 @@
1
+ import QueryBuilder from './QueryBuilder';
2
+ import { HasOne, HasMany, BelongsTo, BelongsToMany, HasManyThrough, MorphTo, MorphMany } from './Relation';
3
+
4
+ export interface ModelAttributes {
5
+ [key: string]: any;
6
+ }
7
+
8
+ export interface ModelCasts {
9
+ [key: string]: 'string' | 'number' | 'boolean' | 'date' | 'json' | 'array' | 'object' | 'float';
10
+ }
11
+
12
+ export interface ModelEvents {
13
+ [event: string]: Array<(model: any) => Promise<boolean | void> | boolean | void>;
14
+ }
15
+
16
+ export interface Observer {
17
+ creating?(model: any): Promise<void> | void;
18
+ created?(model: any): Promise<void> | void;
19
+ updating?(model: any): Promise<void> | void;
20
+ updated?(model: any): Promise<void> | void;
21
+ saving?(model: any): Promise<void> | void;
22
+ saved?(model: any): Promise<void> | void;
23
+ deleting?(model: any): Promise<void> | void;
24
+ deleted?(model: any): Promise<void> | void;
25
+ restoring?(model: any): Promise<void> | void;
26
+ restored?(model: any): Promise<void> | void;
27
+ }
28
+
29
+ export default class Model {
30
+ // Static properties
31
+ protected static table: string;
32
+ protected static connection?: string;
33
+ protected static primaryKey: string;
34
+ protected static keyType: 'number' | 'string';
35
+ protected static incrementing: boolean;
36
+ protected static timestamps: boolean;
37
+ protected static softDeletes: boolean;
38
+ protected static fillable: string[];
39
+ protected static guarded: string[];
40
+ protected static casts: ModelCasts;
41
+ protected static events: ModelEvents;
42
+ protected static globalScopes: Map<string, (query: QueryBuilder) => void>;
43
+ protected static appends: string[];
44
+ protected static timezone: string;
45
+
46
+ // Instance properties
47
+ attributes: ModelAttributes;
48
+ original: ModelAttributes;
49
+ relations: { [key: string]: any };
50
+ exists: boolean;
51
+ wasRecentlyCreated: boolean;
52
+ protected _dirty: Set<string>;
53
+ protected fillable: string[];
54
+ protected guarded: string[];
55
+ protected casts: ModelCasts;
56
+ protected hidden?: string[];
57
+ protected appends?: string[];
58
+ protected _deferred?: ModelAttributes;
59
+
60
+ constructor(attributes?: ModelAttributes);
61
+
62
+ // Static methods
63
+ static register(): void;
64
+ static resolveRelatedModel(related: string | typeof Model): typeof Model;
65
+ static query(): QueryBuilder;
66
+ static with(...relations: string[]): QueryBuilder;
67
+ static on(connectionOrTrx: string | any): QueryBuilder;
68
+ static all(): Promise<Model[]>;
69
+ static find(id: any): Promise<Model | null>;
70
+ static findBy(column: string, value: any): Promise<Model | null>;
71
+ static first(): Promise<Model | null>;
72
+ static firstOrFail(): Promise<Model>;
73
+ static latest(column?: string): QueryBuilder;
74
+ static oldest(column?: string): QueryBuilder;
75
+ static make(attributes?: ModelAttributes): Model;
76
+ static create(attributes?: ModelAttributes): Promise<Model>;
77
+ static generateUuid(): string;
78
+ static insert(data: ModelAttributes | ModelAttributes[]): Promise<any>;
79
+ static destroy(ids: any | any[]): Promise<number>;
80
+ static firstOrCreate(attributes: ModelAttributes, values?: ModelAttributes): Promise<Model>;
81
+ static firstOrNew(attributes: ModelAttributes, values?: ModelAttributes): Promise<Model>;
82
+ static updateOrCreate(attributes: ModelAttributes, values?: ModelAttributes): Promise<Model>;
83
+
84
+ // Scopes
85
+ static addGlobalScope(name: string, scope: (query: QueryBuilder) => void): void;
86
+ static removeGlobalScope(name: string): void;
87
+ static withoutGlobalScope(name: string): QueryBuilder;
88
+ static applyGlobalScopes(query: QueryBuilder): void;
89
+
90
+ // Events
91
+ static creating(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
92
+ static created(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
93
+ static updating(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
94
+ static updated(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
95
+ static saving(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
96
+ static saved(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
97
+ static deleting(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
98
+ static deleted(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
99
+ static restoring(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
100
+ static restored(callback: (model: Model) => Promise<boolean | void> | boolean | void): void;
101
+ static observe(observer: Observer | (new () => Observer)): void;
102
+ static fireEvent(event: string, model: Model): Promise<boolean>;
103
+
104
+ // Table info
105
+ protected static getTableName(): string;
106
+ protected static getPrimaryKey(): string;
107
+ protected static getKeyType(): string;
108
+ protected static getIncrementing(): boolean;
109
+ protected static getConnectionName(): string | undefined;
110
+
111
+ // Instance methods
112
+ getKey(): any;
113
+ fill(attributes: ModelAttributes): this;
114
+ isFillable(key: string): boolean;
115
+ getAttribute(key: string): any;
116
+ setAttribute(key: string, value: any): this;
117
+ syncOriginal(): void;
118
+ save(): Promise<boolean>;
119
+ update(attributes?: ModelAttributes): Promise<boolean>;
120
+ isDirty(key?: string): boolean;
121
+ getDirty(): ModelAttributes;
122
+ delete(): Promise<boolean>;
123
+ restore(): Promise<boolean>;
124
+ trashed(): boolean;
125
+ only(keys: string[]): ModelAttributes;
126
+ except(keys: string[]): ModelAttributes;
127
+ forceDelete(): Promise<boolean>;
128
+ toJSON(): any;
129
+
130
+ // Relationships
131
+ hasOne(related: string | typeof Model, foreignKey?: string, localKey?: string): HasOne;
132
+ hasMany(related: string | typeof Model, foreignKey?: string, localKey?: string): HasMany;
133
+ belongsTo(related: string | typeof Model, foreignKey?: string, ownerKey?: string): BelongsTo;
134
+ belongsToMany(
135
+ related: string | typeof Model,
136
+ pivotTable?: string,
137
+ foreignPivotKey?: string,
138
+ relatedPivotKey?: string,
139
+ parentKey?: string,
140
+ relatedKey?: string
141
+ ): BelongsToMany;
142
+ hasManyThrough(
143
+ related: string | typeof Model,
144
+ through: string | typeof Model,
145
+ firstKey?: string,
146
+ secondKey?: string,
147
+ localKey?: string,
148
+ secondLocalKey?: string
149
+ ): HasManyThrough;
150
+ morphTo(typeColumn?: string, idColumn?: string): MorphTo;
151
+ morphMany(related: string | typeof Model, typeColumn?: string, idColumn?: string): MorphMany;
152
+
153
+ // Protected methods
154
+ protected _initialize(): void;
155
+ protected _createAttributeGetters(): void;
156
+ protected _getCurrentTimestamp(): Date;
157
+ protected _getTimezoneOffset(timezone: string, date: Date): number;
158
+ protected _getConfig(): any;
159
+ protected _resolveRelatedName(related: string | typeof Model): string;
160
+ }
@@ -0,0 +1,11 @@
1
+ import Model from './Model';
2
+
3
+ export default class ModelRegistry {
4
+ private static models: Map<string, typeof Model>;
5
+
6
+ static register(name: string, model: typeof Model): void;
7
+ static get(name: string): typeof Model | undefined;
8
+ static has(name: string): boolean;
9
+ static all(): Map<string, typeof Model>;
10
+ static clear(): void;
11
+ }
@@ -0,0 +1,155 @@
1
+ import Collection from './Collection';
2
+ import Model from './Model';
3
+
4
+ export interface PaginationResult<T> {
5
+ data: Collection<T>;
6
+ total: number;
7
+ perPage: number;
8
+ currentPage: number;
9
+ lastPage: number;
10
+ from: number | null;
11
+ to: number | null;
12
+ nextPage: number | null;
13
+ }
14
+
15
+ export interface SimplePaginationResult<T> {
16
+ data: Collection<T>;
17
+ hasMore: boolean;
18
+ }
19
+
20
+ export interface CursorPaginationResult<T> {
21
+ data: Collection<T>;
22
+ nextCursor?: string;
23
+ prevCursor?: string;
24
+ hasNextPage: boolean;
25
+ hasPrevPage: boolean;
26
+ path: string;
27
+ perPage: number;
28
+ }
29
+
30
+ export default class QueryBuilder {
31
+ protected query: any;
32
+ protected modelClass: typeof Model;
33
+ protected connectionName?: string;
34
+ protected eagerLoad: string[];
35
+ protected eagerLoadConstraints: { [key: string]: (query: QueryBuilder) => void };
36
+ protected _transaction?: any;
37
+ protected _includeTrashed?: boolean;
38
+ protected _onlyTrashed?: boolean;
39
+ protected _withoutTrashed?: boolean;
40
+
41
+ constructor(tableName: string, modelClass: typeof Model, connectionName?: string);
42
+
43
+ // Where clauses
44
+ where(column: string, value: any): this;
45
+ where(column: string, operator: string, value: any): this;
46
+ orWhere(column: string, value: any): this;
47
+ orWhere(column: string, operator: string, value: any): this;
48
+ whereIn(column: string, values: any[]): this;
49
+ whereNotIn(column: string, values: any[]): this;
50
+ whereNull(column: string): this;
51
+ whereNotNull(column: string): this;
52
+ whereBetween(column: string, range: [any, any]): this;
53
+ whereJsonContains(column: string, value: any): this;
54
+ whereJsonLength(column: string, operator: string, value: number): this;
55
+ whereDate(column: string, value: string): this;
56
+ whereDate(column: string, operator: string, value: string): this;
57
+ whereMonth(column: string, month: number): this;
58
+ whereYear(column: string, year: number): this;
59
+ whereExists(callback: (query: QueryBuilder) => void): this;
60
+ when<T>(condition: T, callback: (query: this, condition: T) => void, otherwise?: (query: this) => void): this;
61
+
62
+ // Joins
63
+ join(table: string, first: string, operator: string, second: string): this;
64
+ leftJoin(table: string, first: string, operator: string, second: string): this;
65
+ rightJoin(table: string, first: string, operator: string, second: string): this;
66
+
67
+ // Ordering and limits
68
+ orderBy(column: string, direction?: 'asc' | 'desc'): this;
69
+ latest(column?: string): this;
70
+ oldest(column?: string): this;
71
+ limit(count: number): this;
72
+ offset(count: number): this;
73
+ take(count: number): this;
74
+ skip(count: number): this;
75
+
76
+ // Grouping
77
+ groupBy(...columns: string[]): this;
78
+ having(column: string, operator: string, value: any): this;
79
+ having(rawSql: string): this;
80
+
81
+ // Locking
82
+ lockForUpdate(): this;
83
+ sharedLock(): this;
84
+ skipLocked(): this;
85
+ noWait(): this;
86
+
87
+ // Selection
88
+ select(...columns: string[]): this;
89
+ distinct(): this;
90
+
91
+ // Raw queries
92
+ whereRaw(sql: string, bindings?: any[]): this;
93
+ selectRaw(sql: string, bindings?: any[]): this;
94
+
95
+ // Aggregates
96
+ count(column?: string): Promise<number>;
97
+ sum(column: string): Promise<number>;
98
+ avg(column: string): Promise<number>;
99
+ min(column: string): Promise<any>;
100
+ max(column: string): Promise<any>;
101
+
102
+ // Eager loading
103
+ with(...relations: string[]): this;
104
+ withConstraints(relation: string, callback: (query: QueryBuilder) => void): this;
105
+ withConstraints(relations: { [key: string]: (query: QueryBuilder) => void }): this;
106
+ withCount(...relations: string[]): this;
107
+ whereHas(relation: string, callback?: (query: QueryBuilder) => void): this;
108
+
109
+ // Execution methods
110
+ get(): Promise<Collection<Model>>;
111
+ first(): Promise<Model | null>;
112
+ find(id: any): Promise<Model | null>;
113
+ findOrFail(id: any): Promise<Model>;
114
+ pluck(column: string): Promise<any[]>;
115
+ exists(): Promise<boolean>;
116
+
117
+ // Pagination
118
+ paginate(page?: number, perPage?: number): Promise<PaginationResult<Model>>;
119
+ simplePaginate(page?: number, perPage?: number): Promise<SimplePaginationResult<Model>>;
120
+ cursorPaginate(perPage?: number, cursor?: string, column?: string, direction?: 'asc' | 'desc'): Promise<CursorPaginationResult<Model>>;
121
+
122
+ // Chunking
123
+ chunk(size: number, callback: (models: Collection<Model>) => Promise<void>): Promise<void>;
124
+ cursor(chunkSize?: number): AsyncGenerator<Model, void, unknown>;
125
+ lazy(chunkSize?: number): AsyncGenerator<Model, void, unknown>;
126
+
127
+ // Insert/Update/Delete
128
+ insert(data: any | any[]): Promise<any>;
129
+ insertGetId(data: any): Promise<any>;
130
+ update(data: any): Promise<number>;
131
+ delete(): Promise<number>;
132
+ upsert(data: any[], uniqueBy: string[], update?: string[]): Promise<any>;
133
+
134
+ // Connection switching
135
+ connection(name: string): QueryBuilder;
136
+ on(connectionOrTrx: string | any): QueryBuilder;
137
+
138
+ // Clone query
139
+ clone(): QueryBuilder;
140
+
141
+ // Get underlying Knex query
142
+ toKnex(): any;
143
+
144
+ // Soft delete methods
145
+ withTrashed(): this;
146
+ onlyTrashed(): this;
147
+ withoutTrashed(): this;
148
+
149
+ // Debug
150
+ toSql(): string;
151
+
152
+ // Protected methods
153
+ protected loadRelations(models: Model[]): Promise<void>;
154
+ protected loadRelation(models: Model[], relationName: string): Promise<void>;
155
+ }
@@ -0,0 +1,99 @@
1
+ import QueryBuilder from './QueryBuilder';
2
+ import Model from './Model';
3
+ import Collection from './Collection';
4
+
5
+ export class Relation {
6
+ protected parent: Model;
7
+ protected related: string | typeof Model;
8
+ protected foreignKey: string;
9
+ protected localKey: string;
10
+
11
+ constructor(parent: Model, related: string | typeof Model, foreignKey: string, localKey?: string);
12
+
13
+ getRelatedClass(): typeof Model;
14
+ newQuery(): QueryBuilder;
15
+ }
16
+
17
+ export class HasOne extends Relation {
18
+ addConstraints(): void;
19
+ getResults(): Promise<Model | null>;
20
+ }
21
+
22
+ export class HasMany extends Relation {
23
+ addConstraints(): void;
24
+ getResults(): Promise<Collection<Model>>;
25
+ }
26
+
27
+ export class BelongsTo extends Relation {
28
+ addConstraints(): void;
29
+ getResults(): Promise<Model | null>;
30
+ }
31
+
32
+ export class BelongsToMany extends Relation {
33
+ protected pivotTable: string;
34
+ protected parentPivotKey: string;
35
+ protected relatedPivotKey: string;
36
+ protected parentKey: string;
37
+ protected relatedKey: string;
38
+ protected pivotColumns: string[];
39
+ protected pivotTimestamps: boolean;
40
+
41
+ constructor(
42
+ parent: Model,
43
+ related: string | typeof Model,
44
+ pivotTable?: string,
45
+ foreignPivotKey?: string,
46
+ relatedPivotKey?: string,
47
+ parentKey?: string,
48
+ relatedKey?: string
49
+ );
50
+
51
+ withPivot(...columns: string[]): this;
52
+ withTimestamps(): this;
53
+ addConstraints(): void;
54
+ getResults(): Promise<Model[]>;
55
+ attach(id: any, attributes?: any): Promise<void>;
56
+ detach(id?: any): Promise<number>;
57
+ sync(ids: any[]): Promise<void>;
58
+ }
59
+
60
+ export class HasManyThrough extends Relation {
61
+ protected through: string | typeof Model;
62
+ protected firstKey: string;
63
+ protected secondKey: string;
64
+ protected secondLocalKey: string;
65
+
66
+ constructor(
67
+ parent: Model,
68
+ related: string | typeof Model,
69
+ through: string | typeof Model,
70
+ firstKey?: string,
71
+ secondKey?: string,
72
+ localKey?: string,
73
+ secondLocalKey?: string
74
+ );
75
+
76
+ addConstraints(): void;
77
+ getResults(): Promise<Collection<Model>>;
78
+ }
79
+
80
+ export class MorphTo extends Relation {
81
+ protected morphType: string;
82
+ protected morphId: string;
83
+
84
+ constructor(parent: Model, morphType: string, morphId: string);
85
+
86
+ addConstraints(): void;
87
+ getResults(): Promise<Model | null>;
88
+ }
89
+
90
+ export class MorphMany extends Relation {
91
+ protected morphType: string;
92
+ protected morphId: string;
93
+ protected morphClass: string;
94
+
95
+ constructor(parent: Model, related: string | typeof Model, morphType: string, morphId: string, morphClass: string);
96
+
97
+ addConstraints(): void;
98
+ getResults(): Promise<Collection<Model>>;
99
+ }
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "ilana-orm",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "A fully-featured, Eloquent-style ORM for Node.js with TypeScript support",
5
5
  "main": "index.js",
6
+ "types": "index.d.ts",
6
7
  "bin": {
7
8
  "ilana": "cli/ilana.js"
8
9
  },
@@ -38,9 +39,12 @@
38
39
  },
39
40
  "files": [
40
41
  "*.js",
42
+ "*.d.ts",
41
43
  "cli/**/*.js",
42
44
  "database/**/*.js",
45
+ "database/**/*.d.ts",
43
46
  "orm/**/*.js",
47
+ "orm/**/*.d.ts",
44
48
  "README.md",
45
49
  "LICENSE",
46
50
  "ilana.png"
@@ -65,6 +69,9 @@
65
69
  "@types/jest": "^29.0.0",
66
70
  "ts-jest": "^29.0.0"
67
71
  },
72
+ "peerDependencies": {
73
+ "@types/node": ">=16.0.0"
74
+ },
68
75
  "engines": {
69
76
  "node": ">=16.0.0"
70
77
  }