@managemint-solutions/sdk 0.36.0 → 0.38.0

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,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isWithinPeriod = exports.leavePeriodFor = exports.addOneYearMinusDay = exports.countWorkingDays = exports.isWorkingDay = exports.eachDate = exports.todayInJohannesburg = exports.toIsoDate = exports.LEAVE_TIME_ZONE = void 0;
4
+ // The calendar arithmetic behind leave: which days of a request count, and which leave year a
5
+ // date belongs to. Pure functions over `YYYY-MM-DD` strings - the columns are `date`, so a
6
+ // request never carries a time and nothing here depends on the caller's clock zone.
7
+ /**
8
+ * Where "today" is read for the cancel rule. Organizations carry no time zone yet, and every
9
+ * customer is South African; this is the one place to change when a column arrives.
10
+ */
11
+ exports.LEAVE_TIME_ZONE = 'Africa/Johannesburg';
12
+ /** Saturday and Sunday. Not configurable yet - a working-week setting is a later feature. */
13
+ const WEEKEND_DAYS = new Set([0, 6]);
14
+ const pad = (value) => String(value).padStart(2, '0');
15
+ /** A `Date` at UTC midnight of a `YYYY-MM-DD` string (a longer ISO string is cut to its date). */
16
+ const parseIsoDate = (value) => {
17
+ const [year, month, day] = value.slice(0, 10).split('-').map(Number);
18
+ return new Date(Date.UTC(year, month - 1, day));
19
+ };
20
+ /** The `YYYY-MM-DD` of a `Date`'s UTC calendar day. */
21
+ const toIsoDate = (date) => `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;
22
+ exports.toIsoDate = toIsoDate;
23
+ /** Today's calendar date in `LEAVE_TIME_ZONE`. */
24
+ const todayInJohannesburg = (now = new Date()) =>
25
+ // en-CA is the locale whose short date is already YYYY-MM-DD.
26
+ new Intl.DateTimeFormat('en-CA', {
27
+ timeZone: exports.LEAVE_TIME_ZONE,
28
+ year: 'numeric',
29
+ month: '2-digit',
30
+ day: '2-digit',
31
+ }).format(now);
32
+ exports.todayInJohannesburg = todayInJohannesburg;
33
+ /** Every calendar date from `start` to `end` inclusive; empty when `end` is before `start`. */
34
+ const eachDate = (start, end) => {
35
+ const dates = [];
36
+ const last = end.slice(0, 10);
37
+ for (const cursor = parseIsoDate(start); (0, exports.toIsoDate)(cursor) <= last; cursor.setUTCDate(cursor.getUTCDate() + 1)) {
38
+ dates.push((0, exports.toIsoDate)(cursor));
39
+ }
40
+ return dates;
41
+ };
42
+ exports.eachDate = eachDate;
43
+ /** Monday to Friday and not one of the organization's holidays. */
44
+ const isWorkingDay = (isoDate, holidays) => !WEEKEND_DAYS.has(parseIsoDate(isoDate).getUTCDay()) && !holidays.has(isoDate.slice(0, 10));
45
+ exports.isWorkingDay = isWorkingDay;
46
+ /**
47
+ * The days a request is worth: the working days from `start` to `end` inclusive, halved for a
48
+ * half day. A half day is only meaningful on a single working day, so it yields 0.5 there and 0
49
+ * on a weekend or holiday - the caller rejects a zero either way.
50
+ */
51
+ const countWorkingDays = (start, end, holidays, isHalfDay = false) => {
52
+ const working = (0, exports.eachDate)(start, end).filter((date) => (0, exports.isWorkingDay)(date, holidays)).length;
53
+ return isHalfDay ? working * 0.5 : working;
54
+ };
55
+ exports.countWorkingDays = countWorkingDays;
56
+ /** The day before the same date next year - the end of a period that starts on `isoDate`. */
57
+ const addOneYearMinusDay = (isoDate) => {
58
+ const date = parseIsoDate(isoDate);
59
+ date.setUTCFullYear(date.getUTCFullYear() + 1);
60
+ date.setUTCDate(date.getUTCDate() - 1);
61
+ return (0, exports.toIsoDate)(date);
62
+ };
63
+ exports.addOneYearMinusDay = addOneYearMinusDay;
64
+ /**
65
+ * The leave year containing `date` for an organization whose year starts on the first of
66
+ * `startMonth` (1-12, `organizations.leave_calendar_start_month`). A March start puts
67
+ * 2026-02-10 in the year that began 2025-03-01.
68
+ */
69
+ const leavePeriodFor = (date, startMonth) => {
70
+ const parsed = parseIsoDate(date);
71
+ const year = parsed.getUTCMonth() + 1 >= startMonth ? parsed.getUTCFullYear() : parsed.getUTCFullYear() - 1;
72
+ const period_start = (0, exports.toIsoDate)(new Date(Date.UTC(year, startMonth - 1, 1)));
73
+ return { period_start, period_end: (0, exports.addOneYearMinusDay)(period_start) };
74
+ };
75
+ exports.leavePeriodFor = leavePeriodFor;
76
+ const isWithinPeriod = (date, period) => {
77
+ const day = date.slice(0, 10);
78
+ return day >= period.period_start && day <= period.period_end;
79
+ };
80
+ exports.isWithinPeriod = isWithinPeriod;
@@ -12,6 +12,18 @@ export declare class UpdatePermissionsDto implements UpdatePermissionsDtoType {
12
12
  readonly read_tasks: boolean;
13
13
  readonly update_tasks: boolean;
14
14
  readonly delete_tasks: boolean;
15
+ readonly create_leave: boolean;
16
+ readonly read_leave: boolean;
17
+ readonly update_leave: boolean;
18
+ readonly delete_leave: boolean;
19
+ readonly create_leave_types: boolean;
20
+ readonly read_leave_types: boolean;
21
+ readonly update_leave_types: boolean;
22
+ readonly delete_leave_types: boolean;
23
+ readonly create_leave_requests: boolean;
24
+ readonly read_leave_requests: boolean;
25
+ readonly update_leave_requests: boolean;
26
+ readonly delete_leave_requests: boolean;
15
27
  readonly read_invoices: boolean;
16
28
  readonly create_users: boolean;
17
29
  readonly read_users: boolean;
@@ -42,30 +42,18 @@ class UpdatePermissionsDto {
42
42
  // readonly update_documents!: boolean;
43
43
  // @IsBoolean({ message: 'Delete Documents must be a boolean' })
44
44
  // readonly delete_documents!: boolean;
45
- // @IsBoolean({ message: 'Create Leave must be a boolean' })
46
- // readonly create_leave!: boolean;
47
- // @IsBoolean({ message: 'Read Leave must be a boolean' })
48
- // readonly read_leave!: boolean;
49
- // @IsBoolean({ message: 'Update Leave must be a boolean' })
50
- // readonly update_leave!: boolean;
51
- // @IsBoolean({ message: 'Delete Leave must be a boolean' })
52
- // readonly delete_leave!: boolean;
53
- // @IsBoolean({ message: 'Create Leave Types must be a boolean' })
54
- // readonly create_leave_types!: boolean;
55
- // @IsBoolean({ message: 'Read Leave Types must be a boolean' })
56
- // readonly read_leave_types!: boolean;
57
- // @IsBoolean({ message: 'Update Leave Types must be a boolean' })
58
- // readonly update_leave_types!: boolean;
59
- // @IsBoolean({ message: 'Delete Leave Types must be a boolean' })
60
- // readonly delete_leave_types!: boolean;
61
- // @IsBoolean({ message: 'Create Leave Requests must be a boolean' })
62
- // readonly create_leave_requests!: boolean;
63
- // @IsBoolean({ message: 'Read Leave Requests must be a boolean' })
64
- // readonly read_leave_requests!: boolean;
65
- // @IsBoolean({ message: 'Update Leave Requests must be a boolean' })
66
- // readonly update_leave_requests!: boolean;
67
- // @IsBoolean({ message: 'Delete Leave Requests must be a boolean' })
68
- // readonly delete_leave_requests!: boolean;
45
+ create_leave;
46
+ read_leave;
47
+ update_leave;
48
+ delete_leave;
49
+ create_leave_types;
50
+ read_leave_types;
51
+ update_leave_types;
52
+ delete_leave_types;
53
+ create_leave_requests;
54
+ read_leave_requests;
55
+ update_leave_requests;
56
+ delete_leave_requests;
69
57
  // @IsBoolean({ message: 'Create Invoices must be a boolean' })
70
58
  // readonly create_invoices!: boolean;
71
59
  read_invoices;
@@ -164,6 +152,54 @@ __decorate([
164
152
  (0, class_validator_1.IsBoolean)({ message: 'Delete Tasks must be a boolean' }),
165
153
  __metadata("design:type", Boolean)
166
154
  ], UpdatePermissionsDto.prototype, "delete_tasks", void 0);
155
+ __decorate([
156
+ (0, class_validator_1.IsBoolean)({ message: 'Create Leave must be a boolean' }),
157
+ __metadata("design:type", Boolean)
158
+ ], UpdatePermissionsDto.prototype, "create_leave", void 0);
159
+ __decorate([
160
+ (0, class_validator_1.IsBoolean)({ message: 'Read Leave must be a boolean' }),
161
+ __metadata("design:type", Boolean)
162
+ ], UpdatePermissionsDto.prototype, "read_leave", void 0);
163
+ __decorate([
164
+ (0, class_validator_1.IsBoolean)({ message: 'Update Leave must be a boolean' }),
165
+ __metadata("design:type", Boolean)
166
+ ], UpdatePermissionsDto.prototype, "update_leave", void 0);
167
+ __decorate([
168
+ (0, class_validator_1.IsBoolean)({ message: 'Delete Leave must be a boolean' }),
169
+ __metadata("design:type", Boolean)
170
+ ], UpdatePermissionsDto.prototype, "delete_leave", void 0);
171
+ __decorate([
172
+ (0, class_validator_1.IsBoolean)({ message: 'Create Leave Types must be a boolean' }),
173
+ __metadata("design:type", Boolean)
174
+ ], UpdatePermissionsDto.prototype, "create_leave_types", void 0);
175
+ __decorate([
176
+ (0, class_validator_1.IsBoolean)({ message: 'Read Leave Types must be a boolean' }),
177
+ __metadata("design:type", Boolean)
178
+ ], UpdatePermissionsDto.prototype, "read_leave_types", void 0);
179
+ __decorate([
180
+ (0, class_validator_1.IsBoolean)({ message: 'Update Leave Types must be a boolean' }),
181
+ __metadata("design:type", Boolean)
182
+ ], UpdatePermissionsDto.prototype, "update_leave_types", void 0);
183
+ __decorate([
184
+ (0, class_validator_1.IsBoolean)({ message: 'Delete Leave Types must be a boolean' }),
185
+ __metadata("design:type", Boolean)
186
+ ], UpdatePermissionsDto.prototype, "delete_leave_types", void 0);
187
+ __decorate([
188
+ (0, class_validator_1.IsBoolean)({ message: 'Create Leave Requests must be a boolean' }),
189
+ __metadata("design:type", Boolean)
190
+ ], UpdatePermissionsDto.prototype, "create_leave_requests", void 0);
191
+ __decorate([
192
+ (0, class_validator_1.IsBoolean)({ message: 'Read Leave Requests must be a boolean' }),
193
+ __metadata("design:type", Boolean)
194
+ ], UpdatePermissionsDto.prototype, "read_leave_requests", void 0);
195
+ __decorate([
196
+ (0, class_validator_1.IsBoolean)({ message: 'Update Leave Requests must be a boolean' }),
197
+ __metadata("design:type", Boolean)
198
+ ], UpdatePermissionsDto.prototype, "update_leave_requests", void 0);
199
+ __decorate([
200
+ (0, class_validator_1.IsBoolean)({ message: 'Delete Leave Requests must be a boolean' }),
201
+ __metadata("design:type", Boolean)
202
+ ], UpdatePermissionsDto.prototype, "delete_leave_requests", void 0);
167
203
  __decorate([
168
204
  (0, class_validator_1.IsBoolean)({ message: 'Read Invoices must be a boolean' }),
169
205
  __metadata("design:type", Boolean)
@@ -0,0 +1,4 @@
1
+ import type { GetPublicHolidaysDto as GetPublicHolidaysDtoType } from '@managemint-solutions/entities/public-holidays/dto';
2
+ export declare class GetPublicHolidaysDto implements GetPublicHolidaysDtoType {
3
+ readonly year?: number | null;
4
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.GetPublicHolidaysDto = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ const class_transformer_1 = require("class-transformer");
15
+ const validators_1 = require("../validators");
16
+ // class-validator version of the shared DTO type from @managemint-solutions/entities.
17
+ // The class `implements` its entities type so the wire contract cannot drift.
18
+ class GetPublicHolidaysDto {
19
+ year;
20
+ }
21
+ exports.GetPublicHolidaysDto = GetPublicHolidaysDto;
22
+ __decorate([
23
+ (0, class_validator_1.IsOptional)(),
24
+ (0, validators_1.IsNullable)(),
25
+ (0, class_transformer_1.Transform)(({ value }) => (value ? Number(value) : value), { toClassOnly: true }),
26
+ (0, class_validator_1.IsInt)({ message: 'Year must be a whole number' }),
27
+ (0, class_validator_1.Min)(2000, { message: 'Year must be 2000 or later' }),
28
+ (0, class_validator_1.Max)(2100, { message: 'Year must be 2100 or earlier' }),
29
+ __metadata("design:type", Object)
30
+ ], GetPublicHolidaysDto.prototype, "year", void 0);
@@ -0,0 +1,21 @@
1
+ import type { PublicHolidayEntity } from '@managemint-solutions/entities/public-holidays';
2
+ import type { TypedSupabaseClient } from '../client';
3
+ import type { GetPublicHolidaysDto } from './dto';
4
+ export * from './dto';
5
+ /**
6
+ * The public-holiday calendar. Global, like configs: every signed-in caller reads the same
7
+ * rows (the READ policy is `true` - there is no tenant on them), so this hangs off the user
8
+ * client with no auth context, and nothing writes them but Scott in Supabase Studio.
9
+ */
10
+ export declare class PublicHolidaysResource {
11
+ private readonly supabase;
12
+ constructor(supabase: TypedSupabaseClient);
13
+ /** The calendar in date order, or one calendar year of it. */
14
+ list(query: GetPublicHolidaysDto): Promise<PublicHolidayEntity[]>;
15
+ /**
16
+ * The dates between `start` and `end` (inclusive) that are a day off for everyone - the input
17
+ * to leave's working-day count. A faith-specific holiday (`religion` set) is on the calendar
18
+ * but does not shorten a request, since nothing yet says which employees observe it.
19
+ */
20
+ datesBetween(start: string, end: string): Promise<Set<string>>;
21
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.PublicHolidaysResource = void 0;
18
+ const errors_1 = require("../errors");
19
+ __exportStar(require("./dto"), exports);
20
+ const PUBLIC_HOLIDAY_SELECT = 'mms_id, created_at, name, date, religion, notes';
21
+ /**
22
+ * The public-holiday calendar. Global, like configs: every signed-in caller reads the same
23
+ * rows (the READ policy is `true` - there is no tenant on them), so this hangs off the user
24
+ * client with no auth context, and nothing writes them but Scott in Supabase Studio.
25
+ */
26
+ class PublicHolidaysResource {
27
+ supabase;
28
+ constructor(supabase) {
29
+ this.supabase = supabase;
30
+ }
31
+ /** The calendar in date order, or one calendar year of it. */
32
+ async list(query) {
33
+ let holidaysQuery = this.supabase
34
+ .from('public_holidays')
35
+ .select(PUBLIC_HOLIDAY_SELECT)
36
+ .order('date')
37
+ .order('name');
38
+ if (query.year) {
39
+ holidaysQuery = holidaysQuery.gte('date', `${query.year}-01-01`).lte('date', `${query.year}-12-31`);
40
+ }
41
+ const { data, error } = await holidaysQuery;
42
+ if (error)
43
+ throw (0, errors_1.mapPostgrestError)(error);
44
+ return (data ?? []);
45
+ }
46
+ /**
47
+ * The dates between `start` and `end` (inclusive) that are a day off for everyone - the input
48
+ * to leave's working-day count. A faith-specific holiday (`religion` set) is on the calendar
49
+ * but does not shorten a request, since nothing yet says which employees observe it.
50
+ */
51
+ async datesBetween(start, end) {
52
+ const { data, error } = await this.supabase
53
+ .from('public_holidays')
54
+ .select('date')
55
+ .is('religion', null)
56
+ .gte('date', start)
57
+ .lte('date', end);
58
+ if (error)
59
+ throw (0, errors_1.mapPostgrestError)(error);
60
+ return new Set((data ?? []).map((row) => row.date));
61
+ }
62
+ }
63
+ exports.PublicHolidaysResource = PublicHolidaysResource;
@@ -26,6 +26,8 @@ export declare class UsersResource {
26
26
  * client — it needs no service role.
27
27
  */
28
28
  identityById(userId?: string | null): Promise<UserIdentity | null>;
29
+ /** The users who report to `managerId` - the direct reports a leave approver may act on. */
30
+ idsManagedBy(managerId: string): Promise<string[]>;
29
31
  /** Seats in use. Counts rows rather than fetching them. */
30
32
  activeCount(): Promise<number>;
31
33
  isActive(userId: string): Promise<boolean>;
@@ -92,6 +92,17 @@ class UsersResource {
92
92
  throw (0, errors_1.mapPostgrestError)(error);
93
93
  return data;
94
94
  }
95
+ /** The users who report to `managerId` - the direct reports a leave approver may act on. */
96
+ async idsManagedBy(managerId) {
97
+ const { data, error } = await this.supabase
98
+ .from('users')
99
+ .select('mms_id')
100
+ .eq('organization_id', this.auth.organization_id)
101
+ .eq('manager_id', managerId);
102
+ if (error)
103
+ throw (0, errors_1.mapPostgrestError)(error);
104
+ return (data ?? []).map((row) => row.mms_id);
105
+ }
95
106
  /** Seats in use. Counts rows rather than fetching them. */
96
107
  async activeCount() {
97
108
  const { count, error } = await this.supabase
@@ -1,4 +1,12 @@
1
1
  import { ValidationOptions } from 'class-validator';
2
+ /** A real `YYYY-MM-DD` - the only date shape a `date` column's DTO accepts. */
3
+ export declare const isCalendarDate: (value: unknown) => value is string;
4
+ /**
5
+ * Calendar dates, `YYYY-MM-DD` and nothing more, for the leave and public-holiday columns
6
+ * that are `date`: a timestamp would leave the day to whoever's time zone did the
7
+ * conversion. Stricter on purpose than the `@IsDateString` the timestamp columns use.
8
+ */
9
+ export declare const IsCalendarDate: (options?: ValidationOptions) => PropertyDecorator;
2
10
  export declare function IsNullable(validationOptions?: ValidationOptions): PropertyDecorator;
3
11
  /**
4
12
  * An empty string from a cleared form field means "none". It becomes null before validation,
@@ -1,9 +1,41 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.IsCalendarDate = exports.isCalendarDate = void 0;
3
10
  exports.IsNullable = IsNullable;
4
11
  exports.EmptyToNull = EmptyToNull;
5
12
  const class_validator_1 = require("class-validator");
6
13
  const class_transformer_1 = require("class-transformer");
14
+ const CALENDAR_DATE = /^\d{4}-\d{2}-\d{2}$/;
15
+ /** A real `YYYY-MM-DD` - the only date shape a `date` column's DTO accepts. */
16
+ const isCalendarDate = (value) => {
17
+ if (typeof value !== 'string' || !CALENDAR_DATE.test(value))
18
+ return false;
19
+ const [year, month, day] = value.split('-').map(Number);
20
+ const parsed = new Date(Date.UTC(year, month - 1, day));
21
+ return (parsed.getUTCFullYear() === year && parsed.getUTCMonth() === month - 1 && parsed.getUTCDate() === day);
22
+ };
23
+ exports.isCalendarDate = isCalendarDate;
24
+ let CalendarDateConstraint = class CalendarDateConstraint {
25
+ validate(value) {
26
+ return (0, exports.isCalendarDate)(value);
27
+ }
28
+ };
29
+ CalendarDateConstraint = __decorate([
30
+ (0, class_validator_1.ValidatorConstraint)({ name: 'isCalendarDate' })
31
+ ], CalendarDateConstraint);
32
+ /**
33
+ * Calendar dates, `YYYY-MM-DD` and nothing more, for the leave and public-holiday columns
34
+ * that are `date`: a timestamp would leave the day to whoever's time zone did the
35
+ * conversion. Stricter on purpose than the `@IsDateString` the timestamp columns use.
36
+ */
37
+ const IsCalendarDate = (options) => (0, class_validator_1.Validate)(CalendarDateConstraint, options);
38
+ exports.IsCalendarDate = IsCalendarDate;
7
39
  function IsNullable(validationOptions) {
8
40
  return (0, class_validator_1.ValidateIf)((_object, value) => value !== null, validationOptions);
9
41
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@managemint-solutions/sdk",
3
- "version": "0.36.0",
3
+ "version": "0.38.0",
4
4
  "description": "Typed Supabase data-access SDK for ManageMint Solutions",
5
5
  "license": "UNLICENSED",
6
6
  "author": "Scott Bebington <scottbebington@gmail.com>",
@@ -51,7 +51,7 @@
51
51
  "testEnvironment": "node"
52
52
  },
53
53
  "dependencies": {
54
- "@managemint-solutions/entities": "^1.20.0"
54
+ "@managemint-solutions/entities": "^1.22.0"
55
55
  },
56
56
  "peerDependencies": {
57
57
  "@nestjs/common": "^11.0.0",