fix: ( passenger ) read permissions from position types and all positions

This commit is contained in:
Abubeker Yasin
2026-08-20 12:33:39 +03:00
parent a00606823e
commit e174efb8e0
6 changed files with 651 additions and 84 deletions

View File

@@ -46,7 +46,7 @@
"@prisma/client": "^6.19.3", "@prisma/client": "^6.19.3",
"@sendgrid/mail": "^8.1.0", "@sendgrid/mail": "^8.1.0",
"@tria-plc/api-common": "file:../../local-packages/tria-plc-api-common-1.6.0.tgz", "@tria-plc/api-common": "file:../../local-packages/tria-plc-api-common-1.6.0.tgz",
"@tria-plc/iamapi-common": "file:../../local-packages/tria-plc-iamapi-common-1.0.0.tgz", "@tria-plc/iamapi-common": "file:../../local-packages/tria-plc-iamapi-common-1.1.0.tgz",
"@types/bcrypt": "^6.0.0", "@types/bcrypt": "^6.0.0",
"amqp-connection-manager": "^5.0.0", "amqp-connection-manager": "^5.0.0",
"amqplib": "^2.0.1", "amqplib": "^2.0.1",

View File

@@ -0,0 +1,280 @@
import { ForbiddenException } from '@nestjs/common';
import {
assertPassengerPermission,
collectPermissionKeys,
hasPassengerPermission,
hasPassengerPermissionStrict,
isOrganizationAdmin,
isSuperAdmin,
} from './passenger-permission.util';
const TICKETS_MANAGE = 'edr_passenger_app:tickets:manage';
const TICKETS_VIEW = 'edr_passenger_app:tickets:view';
const BOOKINGS_VIEW = 'edr_passenger_app:bookings:view';
const FLEET_MANAGE = 'edr_passenger_app:fleet:manage';
/** IAM shape: position types nest the key one level deeper, under `.permission`. */
const positionType = (keys: string[]) => ({
positionTypePermissions: keys.map((key) => ({ permission: { key } })),
});
/** Mirrors the ticket-officer position IAM returns: own grant + two position types. */
const ticketOfficerPosition = () => ({
id: 'pos-ticket-officer',
permissions: [{ key: BOOKINGS_VIEW }],
positionType: positionType([TICKETS_VIEW, TICKETS_MANAGE]),
positionTypes: [
positionType(['can:view:expectation']),
positionType([TICKETS_VIEW, TICKETS_MANAGE]),
],
});
const hrPosition = () => ({
id: 'pos-hr',
permissions: [{ key: 'hr_app:employees:view' }],
positionType: positionType(['hr_app:leave:approve']),
positionTypes: [positionType(['hr_app:leave:approve'])],
});
/** `/v1/auth/me` — `employee` is an array of employees, each with `positions[]`. */
const meShape = (positions: any[]) => ({
roles: [],
permissions: [],
employee: [{ id: 'emp-1', positions }],
});
/**
* `request.user` — `JwtGuard.parseToken` spreads the employee, then overwrites
* `position` with the one it selected and adds `delegatedPositions[]`. The full
* `positions[]` survives the spread.
*/
const requestShape = (positions: any[], selectedIndex = 0) => ({
roles: [],
permissions: [],
employee: {
id: 'emp-1',
positions,
position: positions[selectedIndex],
delegatedPositions: positions.filter((p: any) => p.isDelegate),
},
});
describe('collectPermissionKeys', () => {
it('returns nothing for a missing user', () => {
expect(collectPermissionKeys(null)).toEqual([]);
expect(collectPermissionKeys(undefined)).toEqual([]);
expect(collectPermissionKeys({})).toEqual([]);
});
it('collects role permissions when there is no employee record', () => {
expect(collectPermissionKeys({ permissions: [{ key: TICKETS_VIEW }] })).toEqual([TICKETS_VIEW]);
expect(collectPermissionKeys({ permissions: [{ key: TICKETS_VIEW }], employee: null })).toEqual([
TICKETS_VIEW,
]);
});
describe('backward compatibility — positions with no position types', () => {
it('still reads a position own permissions[] in the /v1/auth/me shape', () => {
const user = meShape([{ id: 'p1', permissions: [{ key: BOOKINGS_VIEW }] }]);
expect(collectPermissionKeys(user)).toEqual([BOOKINGS_VIEW]);
});
it('still reads a position own permissions[] in the request.user shape', () => {
const user = requestShape([{ id: 'p1', permissions: [{ key: BOOKINGS_VIEW }] }]);
expect(collectPermissionKeys(user)).toEqual([BOOKINGS_VIEW]);
});
it('merges role permissions with position permissions', () => {
const user = {
permissions: [{ key: 'role:key' }],
employee: [{ positions: [{ permissions: [{ key: BOOKINGS_VIEW }] }] }],
};
expect(collectPermissionKeys(user).sort()).toEqual([BOOKINGS_VIEW, 'role:key'].sort());
});
});
describe('position types', () => {
it('collects from the legacy singular positionType', () => {
const user = meShape([{ permissions: [], positionType: positionType([TICKETS_MANAGE]) }]);
expect(collectPermissionKeys(user)).toEqual([TICKETS_MANAGE]);
});
it('collects from the new positionTypes[] array', () => {
const user = meShape([{ permissions: [], positionTypes: [positionType([TICKETS_MANAGE])] }]);
expect(collectPermissionKeys(user)).toEqual([TICKETS_MANAGE]);
});
it('collects from every entry of positionTypes[], not just the first', () => {
const user = meShape([
{
permissions: [],
positionTypes: [positionType(['a']), positionType(['b']), positionType(['c'])],
},
]);
expect(collectPermissionKeys(user).sort()).toEqual(['a', 'b', 'c']);
});
it('unions permissions[], positionType and positionTypes[] without duplicates', () => {
// ticket-officer appears as BOTH the singular positionType and inside positionTypes[]
const keys = collectPermissionKeys(meShape([ticketOfficerPosition()]));
expect(keys.sort()).toEqual(
[BOOKINGS_VIEW, TICKETS_VIEW, TICKETS_MANAGE, 'can:view:expectation'].sort(),
);
expect(keys).toHaveLength(new Set(keys).size);
});
it('works identically in the request.user shape', () => {
expect(collectPermissionKeys(requestShape([ticketOfficerPosition()])).sort()).toEqual(
collectPermissionKeys(meShape([ticketOfficerPosition()])).sort(),
);
});
});
describe('all positions count, not only the selected one', () => {
it('grants a permission held by a position that is not positions[0]', () => {
// parseToken selected positions[0] (HR) because no x-current-position-id was sent
const user = requestShape([hrPosition(), ticketOfficerPosition()], 0);
expect(collectPermissionKeys(user)).toContain(TICKETS_MANAGE);
});
it('matches what the backoffice computes from the same payload', () => {
const positions = [hrPosition(), ticketOfficerPosition()];
expect(collectPermissionKeys(requestShape(positions, 0)).sort()).toEqual(
collectPermissionKeys(meShape(positions)).sort(),
);
});
it('spans multiple employee records', () => {
const user = {
employee: [{ positions: [hrPosition()] }, { positions: [ticketOfficerPosition()] }],
};
expect(collectPermissionKeys(user)).toContain(TICKETS_MANAGE);
expect(collectPermissionKeys(user)).toContain('hr_app:leave:approve');
});
it('includes delegated positions', () => {
const delegated = { ...ticketOfficerPosition(), isDelegate: true };
const user = {
employee: { positions: undefined, position: hrPosition(), delegatedPositions: [delegated] },
};
expect(collectPermissionKeys(user)).toContain(TICKETS_MANAGE);
});
it('does not invent permissions nobody was granted', () => {
const user = requestShape([hrPosition(), ticketOfficerPosition()]);
expect(collectPermissionKeys(user)).not.toContain(FLEET_MANAGE);
});
});
describe('malformed payloads', () => {
it('survives nulls, missing keys and non-array fields', () => {
const user: any = {
permissions: [{}, { key: 'kept' }],
employee: {
// parseToken passes `positions` through untouched when it is not an array
positions: { id: 'not-an-array' },
position: {
permissions: null,
positionType: null,
positionTypes: [null, { positionTypePermissions: null }, positionType([TICKETS_VIEW])],
},
delegatedPositions: null,
},
};
expect(collectPermissionKeys(user).sort()).toEqual(['kept', TICKETS_VIEW].sort());
});
it('ignores positionTypePermissions entries with no permission object', () => {
const user: any = {
employee: [
{
positions: [
{
positionTypes: [
{
positionTypePermissions: [
{},
{ permission: null },
{ permission: { key: 'ok' } },
],
},
],
},
],
},
],
};
expect(collectPermissionKeys(user)).toEqual(['ok']);
});
});
});
describe('role helpers', () => {
it('detects super admin and org admin', () => {
expect(isSuperAdmin({ roles: [{ key: 'super_admin' }] })).toBe(true);
expect(isOrganizationAdmin({ roles: [{ key: 'organization_admin' }] })).toBe(true);
expect(isSuperAdmin({ roles: [{ key: 'ticket_officer' }] })).toBe(false);
expect(isOrganizationAdmin({})).toBe(false);
});
});
describe('hasPassengerPermission', () => {
it('is true for a permission granted only through a position type', () => {
expect(hasPassengerPermission(requestShape([ticketOfficerPosition()]), TICKETS_MANAGE)).toBe(
true,
);
});
it('is true when the granting position is not the selected one', () => {
const user = requestShape([hrPosition(), ticketOfficerPosition()], 0);
expect(hasPassengerPermission(user, TICKETS_MANAGE)).toBe(true);
});
it('is false for a permission nobody granted', () => {
expect(hasPassengerPermission(requestShape([ticketOfficerPosition()]), FLEET_MANAGE)).toBe(
false,
);
});
it('is false without a user', () => {
expect(hasPassengerPermission(null, TICKETS_MANAGE)).toBe(false);
});
it('lets super admins and org admins bypass', () => {
expect(hasPassengerPermission({ roles: [{ key: 'super_admin' }] }, FLEET_MANAGE)).toBe(true);
expect(hasPassengerPermission({ roles: [{ key: 'organization_admin' }] }, FLEET_MANAGE)).toBe(
true,
);
});
});
describe('hasPassengerPermissionStrict', () => {
it('does not let super admins bypass', () => {
expect(hasPassengerPermissionStrict({ roles: [{ key: 'super_admin' }] }, FLEET_MANAGE)).toBe(
false,
);
});
it('honours a position-type grant', () => {
expect(hasPassengerPermissionStrict(requestShape([ticketOfficerPosition()]), TICKETS_MANAGE)).toBe(
true,
);
});
});
describe('assertPassengerPermission', () => {
it('passes silently when granted through a position type', () => {
expect(() =>
assertPassengerPermission(requestShape([ticketOfficerPosition()]), TICKETS_MANAGE),
).not.toThrow();
});
it('throws ForbiddenException naming the missing key', () => {
expect(() => assertPassengerPermission(requestShape([hrPosition()]), TICKETS_MANAGE)).toThrow(
ForbiddenException,
);
expect(() => assertPassengerPermission(requestShape([hrPosition()]), TICKETS_MANAGE)).toThrow(
TICKETS_MANAGE,
);
});
});

View File

@@ -4,13 +4,34 @@ const SUPER_ADMIN_ROLE = 'super_admin';
const ORGANIZATION_ADMIN_ROLE = 'organization_admin'; const ORGANIZATION_ADMIN_ROLE = 'organization_admin';
type PermissionLike = { key?: string }; type PermissionLike = { key?: string };
/**
* A position type carries its own grants. IAM ships them as
* `positionTypePermissions[].permission.key` — note the extra `permission`
* wrapper, unlike the flat `permissions[]` on a position.
*/
type PositionTypeLike = {
positionTypePermissions?: ({ permission?: PermissionLike | null } | null)[] | null;
};
type PositionLike = {
permissions?: PermissionLike[];
/** Legacy single position type. */
positionType?: PositionTypeLike | null;
/** Newer array — a position can now carry several position types. */
positionTypes?: (PositionTypeLike | null)[] | null;
};
type EmployeeLike = {
position?: PositionLike;
positions?: PositionLike[];
delegatedPositions?: PositionLike[];
};
type MeLikeUser = { type MeLikeUser = {
roles?: { key?: string }[]; roles?: { key?: string }[];
permissions?: PermissionLike[]; permissions?: PermissionLike[];
employee?: employee?: EmployeeLike | EmployeeLike[] | null;
| { position?: { permissions?: PermissionLike[] }; delegatedPositions?: { permissions?: PermissionLike[] }[] }
| { positions?: { permissions?: PermissionLike[] }[] }[]
| null;
}; };
export function isSuperAdmin(user: MeLikeUser | null | undefined): boolean { export function isSuperAdmin(user: MeLikeUser | null | undefined): boolean {
@@ -21,6 +42,42 @@ export function isOrganizationAdmin(user: MeLikeUser | null | undefined): boolea
return user?.roles?.some((r) => r.key === ORGANIZATION_ADMIN_ROLE) ?? false; return user?.roles?.some((r) => r.key === ORGANIZATION_ADMIN_ROLE) ?? false;
} }
/**
* Add every permission key a single position grants.
*
* A position's own `permissions[]` used to be the whole story. IAM now also
* hangs grants off *position types* — the legacy singular `positionType` plus
* the newer `positionTypes[]` array — so we union all three rather than trust
* IAM to have merged them back into `permissions[]`.
*/
function addPositionPermissionKeys(
position: PositionLike | null | undefined,
keys: Set<string>,
): void {
if (!position) return;
for (const p of position.permissions ?? []) {
if (p?.key) keys.add(p.key);
}
const positionTypes: (PositionTypeLike | null | undefined)[] = [
position.positionType,
...(position.positionTypes ?? []),
];
for (const positionType of positionTypes) {
for (const ptp of positionType?.positionTypePermissions ?? []) {
const key = ptp?.permission?.key;
if (key) keys.add(key);
}
}
}
/** `parseToken` passes `positions` through untouched, so it is not always an array. */
function asArray<T>(value: T[] | null | undefined): T[] {
return Array.isArray(value) ? value : [];
}
export function collectPermissionKeys(user: MeLikeUser | null | undefined): string[] { export function collectPermissionKeys(user: MeLikeUser | null | undefined): string[] {
if (!user) return []; if (!user) return [];
@@ -33,23 +90,25 @@ export function collectPermissionKeys(user: MeLikeUser | null | undefined): stri
const employee = user.employee; const employee = user.employee;
if (!employee) return [...keys]; if (!employee) return [...keys];
if (Array.isArray(employee)) { // `/v1/auth/me` hands back `employee` as an array of employees, each with
for (const emp of employee) { // `positions[]`. `JwtGuard.parseToken` collapses it to a single employee with
for (const pos of emp.positions ?? []) { // the active `position` plus `delegatedPositions[]` — but it spreads the
for (const p of pos.permissions ?? []) { // employee, so the full `positions[]` survives on `request.user` too. Both
if (p.key) keys.add(p.key); // shapes reach here.
} const employees = Array.isArray(employee) ? employee : [employee];
}
}
return [...keys];
}
for (const p of employee.position?.permissions ?? []) { for (const emp of employees) {
if (p.key) keys.add(p.key); // Every position the person holds counts, not just the one
} // `parseToken` selected. Without a `x-current-position-id` header it picks
for (const delegated of employee.delegatedPositions ?? []) { // `positions[0]`, so a second-listed passenger position would 403 here while
for (const p of delegated.permissions ?? []) { // the backoffice — which unions all positions at login — renders the action
if (p.key) keys.add(p.key); // as available. Union them here so the two agree.
addPositionPermissionKeys(emp.position, keys);
for (const pos of asArray(emp.positions)) {
addPositionPermissionKeys(pos, keys);
}
for (const delegated of asArray(emp.delegatedPositions)) {
addPositionPermissionKeys(delegated, keys);
} }
} }

View File

@@ -6,6 +6,33 @@ import axios from 'axios';
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000'; const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000';
/**
* Every permission key a single IAM position grants.
*
* A position's own `permissions[]` used to be the whole story. IAM now also
* hangs grants off *position types* — the legacy singular `positionType` plus
* the newer `positionTypes[]` array, whose entries expose
* `positionTypePermissions[].permission.key` (note the extra `permission`
* wrapper). Union all three rather than trust IAM to have merged them back into
* `permissions[]`. Mirrors collectPermissionKeys() on the API.
*/
export function positionPermissionKeys(pos: any): string[] {
const keys: string[] = (pos?.permissions ?? [])
.map((p: any) => p?.key)
.filter(Boolean)
.map(String);
const positionTypes: any[] = [pos?.positionType, ...(pos?.positionTypes ?? [])];
for (const pt of positionTypes) {
for (const ptp of pt?.positionTypePermissions ?? []) {
const key = ptp?.permission?.key;
if (key) keys.push(String(key));
}
}
return keys;
}
function mapIamRole(roles: { key?: string }[]): 'ADMIN' | 'AGENT' | 'SUPERVISOR' { function mapIamRole(roles: { key?: string }[]): 'ADMIN' | 'AGENT' | 'SUPERVISOR' {
const keys = roles.map((r) => r.key ?? ''); const keys = roles.map((r) => r.key ?? '');
if (keys.some((k) => k.includes('admin') || k === 'super_admin' || k === 'organization_admin')) return 'ADMIN'; if (keys.some((k) => k.includes('admin') || k === 'super_admin' || k === 'organization_admin')) return 'ADMIN';
@@ -70,12 +97,11 @@ export const useAuthStore = create<AuthState>((set, get) => ({
// Role permissions — flat array in data.permissions // Role permissions — flat array in data.permissions
const rolePerms = (iamUser.permissions ?? []).map((p: any) => String(p.key)); const rolePerms = (iamUser.permissions ?? []).map((p: any) => String(p.key));
// Position permissions — employee[] is an array here; positions[].permissions[] merged by IAM // Position permissions — employee[] is an array here; each position contributes
// its own permissions[] plus everything its position type(s) grant.
const employeeArr: any[] = Array.isArray(iamUser.employee) ? iamUser.employee : []; const employeeArr: any[] = Array.isArray(iamUser.employee) ? iamUser.employee : [];
const positionPerms = employeeArr.flatMap((emp: any) => const positionPerms = employeeArr.flatMap((emp: any) =>
(emp.positions ?? []).flatMap((pos: any) => (emp.positions ?? []).flatMap((pos: any) => positionPermissionKeys(pos))
(pos.permissions ?? []).map((p: any) => String(p.key))
)
); );
const permissions = Array.from(new Set([...rolePerms, ...positionPerms])); const permissions = Array.from(new Set([...rolePerms, ...positionPerms]));

Binary file not shown.

320
pnpm-lock.yaml generated
View File

@@ -604,7 +604,7 @@ importers:
version: 5.101.0(react@19.2.6) version: 5.101.0(react@19.2.6)
'@tria-plc/iamui': '@tria-plc/iamui':
specifier: file:../../../local-packages/tria-plc-iamui-0.1.1.tgz specifier: file:../../../local-packages/tria-plc-iamui-0.1.1.tgz
version: file:local-packages/tria-plc-iamui-0.1.1.tgz(0ce39b7e349029277dcd938d06eeb0f7) version: file:local-packages/tria-plc-iamui-0.1.1.tgz(a5d0bdee55164ae56064fb273b530e00)
'@vis.gl/react-google-maps': '@vis.gl/react-google-maps':
specifier: ^1.8.3 specifier: ^1.8.3
version: 1.8.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) version: 1.8.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
@@ -836,8 +836,8 @@ importers:
specifier: file:../../local-packages/tria-plc-api-common-1.6.0.tgz specifier: file:../../local-packages/tria-plc-api-common-1.6.0.tgz
version: file:local-packages/tria-plc-api-common-1.6.0.tgz(2b4e99ab22f78c34e7861d649f4ff29b) version: file:local-packages/tria-plc-api-common-1.6.0.tgz(2b4e99ab22f78c34e7861d649f4ff29b)
'@tria-plc/iamapi-common': '@tria-plc/iamapi-common':
specifier: file:../../local-packages/tria-plc-iamapi-common-1.0.0.tgz specifier: file:../../local-packages/tria-plc-iamapi-common-1.1.0.tgz
version: file:local-packages/tria-plc-iamapi-common-1.0.0.tgz(cc085a020c559b355f168432c579a024) version: file:local-packages/tria-plc-iamapi-common-1.1.0.tgz(cc085a020c559b355f168432c579a024)
'@types/bcrypt': '@types/bcrypt':
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.0.0 version: 6.0.0
@@ -5051,6 +5051,28 @@ packages:
rxjs: ^7.8.0 rxjs: ^7.8.0
typeorm: ^0.3.0 typeorm: ^0.3.0
'@tria-plc/iamapi-common@file:local-packages/tria-plc-iamapi-common-1.1.0.tgz':
resolution: {integrity: sha512-MWsfKmd+6+LxMx6fpJR9+c9oFtxiaNwR3KW2ptRVGinnmHofmqAsC3nURhRqTyWQeUbdNrvRdoiZtRx/0936Pw==, tarball: file:local-packages/tria-plc-iamapi-common-1.1.0.tgz}
version: 1.1.0
engines: {node: '>=20'}
peerDependencies:
'@nestjs/axios': ^4.0.0
'@nestjs/common': ^11.0.0
'@nestjs/core': ^11.0.0
'@nestjs/jwt': ^11.0.0
'@nestjs/microservices': ^11.0.0
'@nestjs/passport': ^11.0.0
'@nestjs/swagger': ^11.0.0
'@nestjs/throttler': ^6.0.0
'@nestjs/typeorm': ^11.0.0
'@tria-plc/api-common': '*'
axios: ^1.9.0
class-transformer: ^0.5.1
class-validator: ^0.14.1
reflect-metadata: ^0.2.0
rxjs: ^7.8.0
typeorm: ^0.3.0
'@tria-plc/iamui@file:local-packages/tria-plc-iamui-0.1.1.tgz': '@tria-plc/iamui@file:local-packages/tria-plc-iamui-0.1.1.tgz':
resolution: {integrity: sha512-FTihoH0lIqKV/0s+FTJZokQw8xX3XztXIqT8eEYEZgDM2xyzVSCHY8pHCUxw0MQtiR8R97zxZJ/o192eWt+E/g==, tarball: file:local-packages/tria-plc-iamui-0.1.1.tgz} resolution: {integrity: sha512-FTihoH0lIqKV/0s+FTJZokQw8xX3XztXIqT8eEYEZgDM2xyzVSCHY8pHCUxw0MQtiR8R97zxZJ/o192eWt+E/g==, tarball: file:local-packages/tria-plc-iamui-0.1.1.tgz}
version: 0.1.1 version: 0.1.1
@@ -13059,11 +13081,11 @@ snapshots:
'@babel/helpers': 7.29.7 '@babel/helpers': 7.29.7
'@babel/parser': 7.29.7 '@babel/parser': 7.29.7
'@babel/template': 7.29.7 '@babel/template': 7.29.7
'@babel/traverse': 7.29.7(supports-color@5.5.0) '@babel/traverse': 7.29.7
'@babel/types': 7.29.7 '@babel/types': 7.29.7
'@jridgewell/remapping': 2.3.5 '@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0 convert-source-map: 2.0.0
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
gensync: 1.0.0-beta.2 gensync: 1.0.0-beta.2
json5: 2.2.3 json5: 2.2.3
semver: 6.3.1 semver: 6.3.1
@@ -13098,7 +13120,7 @@ snapshots:
'@babel/helper-optimise-call-expression': 7.29.7 '@babel/helper-optimise-call-expression': 7.29.7
'@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7)
'@babel/helper-skip-transparent-expression-wrappers': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers': 7.29.7
'@babel/traverse': 7.29.7(supports-color@5.5.0) '@babel/traverse': 7.29.7
semver: 6.3.1 semver: 6.3.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -13107,7 +13129,14 @@ snapshots:
'@babel/helper-member-expression-to-functions@7.29.7': '@babel/helper-member-expression-to-functions@7.29.7':
dependencies: dependencies:
'@babel/traverse': 7.29.7(supports-color@5.5.0) '@babel/traverse': 7.29.7
'@babel/types': 7.29.7
transitivePeerDependencies:
- supports-color
'@babel/helper-module-imports@7.29.7':
dependencies:
'@babel/traverse': 7.29.7
'@babel/types': 7.29.7 '@babel/types': 7.29.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -13122,9 +13151,9 @@ snapshots:
'@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
dependencies: dependencies:
'@babel/core': 7.29.7 '@babel/core': 7.29.7
'@babel/helper-module-imports': 7.29.7(supports-color@5.5.0) '@babel/helper-module-imports': 7.29.7
'@babel/helper-validator-identifier': 7.29.7 '@babel/helper-validator-identifier': 7.29.7
'@babel/traverse': 7.29.7(supports-color@5.5.0) '@babel/traverse': 7.29.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -13139,13 +13168,13 @@ snapshots:
'@babel/core': 7.29.7 '@babel/core': 7.29.7
'@babel/helper-member-expression-to-functions': 7.29.7 '@babel/helper-member-expression-to-functions': 7.29.7
'@babel/helper-optimise-call-expression': 7.29.7 '@babel/helper-optimise-call-expression': 7.29.7
'@babel/traverse': 7.29.7(supports-color@5.5.0) '@babel/traverse': 7.29.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@babel/helper-skip-transparent-expression-wrappers@7.29.7': '@babel/helper-skip-transparent-expression-wrappers@7.29.7':
dependencies: dependencies:
'@babel/traverse': 7.29.7(supports-color@5.5.0) '@babel/traverse': 7.29.7
'@babel/types': 7.29.7 '@babel/types': 7.29.7
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -13298,6 +13327,18 @@ snapshots:
'@babel/parser': 7.29.7 '@babel/parser': 7.29.7
'@babel/types': 7.29.7 '@babel/types': 7.29.7
'@babel/traverse@7.29.7':
dependencies:
'@babel/code-frame': 7.29.7
'@babel/generator': 7.29.7
'@babel/helper-globals': 7.29.7
'@babel/parser': 7.29.7
'@babel/template': 7.29.7
'@babel/types': 7.29.7
debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
'@babel/traverse@7.29.7(supports-color@5.5.0)': '@babel/traverse@7.29.7(supports-color@5.5.0)':
dependencies: dependencies:
'@babel/code-frame': 7.29.7 '@babel/code-frame': 7.29.7
@@ -13782,7 +13823,7 @@ snapshots:
'@emotion/babel-plugin@11.13.5': '@emotion/babel-plugin@11.13.5':
dependencies: dependencies:
'@babel/helper-module-imports': 7.29.7(supports-color@5.5.0) '@babel/helper-module-imports': 7.29.7
'@babel/runtime': 7.29.7 '@babel/runtime': 7.29.7
'@emotion/hash': 0.9.2 '@emotion/hash': 0.9.2
'@emotion/memoize': 0.9.0 '@emotion/memoize': 0.9.0
@@ -13948,7 +13989,7 @@ snapshots:
'@eslint/eslintrc@2.1.4': '@eslint/eslintrc@2.1.4':
dependencies: dependencies:
ajv: 6.15.0 ajv: 6.15.0
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
espree: 9.6.1 espree: 9.6.1
globals: 13.24.0 globals: 13.24.0
ignore: 5.3.2 ignore: 5.3.2
@@ -14108,7 +14149,7 @@ snapshots:
'@humanwhocodes/config-array@0.13.0': '@humanwhocodes/config-array@0.13.0':
dependencies: dependencies:
'@humanwhocodes/object-schema': 2.0.3 '@humanwhocodes/object-schema': 2.0.3
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
minimatch: 3.1.5 minimatch: 3.1.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -15707,7 +15748,7 @@ snapshots:
'@puppeteer/browsers@2.13.2': '@puppeteer/browsers@2.13.2':
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
extract-zip: 2.0.1 extract-zip: 2.0.1
progress: 2.0.3 progress: 2.0.3
proxy-agent: 6.5.0 proxy-agent: 6.5.0
@@ -17781,7 +17822,7 @@ snapshots:
'@tokenizer/inflate@0.4.1': '@tokenizer/inflate@0.4.1':
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
token-types: 6.1.2 token-types: 6.1.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -17876,7 +17917,7 @@ snapshots:
- debug - debug
- supports-color - supports-color
'@tria-plc/iamapi-common@file:local-packages/tria-plc-iamapi-common-1.0.0.tgz(cc085a020c559b355f168432c579a024)': '@tria-plc/iamapi-common@file:local-packages/tria-plc-iamapi-common-1.0.0.tgz(d0be280d95adfc1b38e59bdc80c5dec5)':
dependencies: dependencies:
'@nestjs/axios': 4.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.17.0)(rxjs@7.8.2) '@nestjs/axios': 4.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.17.0)(rxjs@7.8.2)
'@nestjs/common': 11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/common': 11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)
@@ -17884,10 +17925,10 @@ snapshots:
'@nestjs/jwt': 11.0.2(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@nestjs/jwt': 11.0.2(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))
'@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(@nestjs/websockets@11.1.27)(amqp-connection-manager@5.0.0(amqplib@2.0.1))(amqplib@2.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(@nestjs/websockets@11.1.27)(amqp-connection-manager@5.0.0(amqplib@2.0.1))(amqplib@2.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/passport': 10.0.3(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) '@nestjs/passport': 10.0.3(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)
'@nestjs/swagger': 7.4.2(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) '@nestjs/swagger': 11.4.4(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)
'@nestjs/throttler': 6.5.0(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2) '@nestjs/throttler': 6.5.0(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)
'@nestjs/typeorm': 11.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3))) '@nestjs/typeorm': 11.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)))
'@tria-plc/api-common': file:local-packages/tria-plc-api-common-1.6.0.tgz(2b4e99ab22f78c34e7861d649f4ff29b) '@tria-plc/api-common': file:local-packages/tria-plc-api-common-1.6.0.tgz(ae9a56cc1c6d93629dd85f7605ccd5b6)
argon2: 0.43.1 argon2: 0.43.1
axios: 1.17.0 axios: 1.17.0
class-transformer: 0.5.1 class-transformer: 0.5.1
@@ -17910,7 +17951,7 @@ snapshots:
- '@faker-js/faker' - '@faker-js/faker'
- supports-color - supports-color
'@tria-plc/iamapi-common@file:local-packages/tria-plc-iamapi-common-1.0.0.tgz(d0be280d95adfc1b38e59bdc80c5dec5)': '@tria-plc/iamapi-common@file:local-packages/tria-plc-iamapi-common-1.1.0.tgz(cc085a020c559b355f168432c579a024)':
dependencies: dependencies:
'@nestjs/axios': 4.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.17.0)(rxjs@7.8.2) '@nestjs/axios': 4.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(axios@1.17.0)(rxjs@7.8.2)
'@nestjs/common': 11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/common': 11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)
@@ -17918,10 +17959,10 @@ snapshots:
'@nestjs/jwt': 11.0.2(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@nestjs/jwt': 11.0.2(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))
'@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(@nestjs/websockets@11.1.27)(amqp-connection-manager@5.0.0(amqplib@2.0.1))(amqplib@2.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/microservices': 11.1.24(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(@nestjs/websockets@11.1.27)(amqp-connection-manager@5.0.0(amqplib@2.0.1))(amqplib@2.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/passport': 10.0.3(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0) '@nestjs/passport': 10.0.3(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)
'@nestjs/swagger': 11.4.4(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) '@nestjs/swagger': 7.4.2(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)
'@nestjs/throttler': 6.5.0(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2) '@nestjs/throttler': 6.5.0(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)
'@nestjs/typeorm': 11.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3))) '@nestjs/typeorm': 11.0.1(@nestjs/common@11.1.24(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.30(babel-plugin-macros@3.1.0)(pg@8.21.0)(ts-node@10.9.2(@types/node@20.19.42)(typescript@5.9.3)))
'@tria-plc/api-common': file:local-packages/tria-plc-api-common-1.6.0.tgz(ae9a56cc1c6d93629dd85f7605ccd5b6) '@tria-plc/api-common': file:local-packages/tria-plc-api-common-1.6.0.tgz(2b4e99ab22f78c34e7861d649f4ff29b)
argon2: 0.43.1 argon2: 0.43.1
axios: 1.17.0 axios: 1.17.0
class-transformer: 0.5.1 class-transformer: 0.5.1
@@ -18068,6 +18109,130 @@ snapshots:
- utf-8-validate - utf-8-validate
- vite - vite
'@tria-plc/iamui@file:local-packages/tria-plc-iamui-0.1.1.tgz(a5d0bdee55164ae56064fb273b530e00)':
dependencies:
'@emotion/react': 11.14.0(@types/react@18.3.31)(react@19.2.6)
'@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.31)(react@19.2.6))(@types/react@18.3.31)(react@19.2.6)
'@hookform/resolvers': 5.4.0(react-hook-form@7.77.0(react@19.2.6))
'@lottiefiles/react-lottie-player': 3.6.0(react@19.2.6)
'@mantine/charts': 7.17.8(@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@7.17.8(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(recharts@3.8.1(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6)(redux@5.0.1))
'@mantine/core': 7.17.8(@mantine/hooks@7.17.8(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@mantine/dates': 7.17.8(@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@7.17.8(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@mantine/hooks': 7.17.8(react@19.2.6)
'@mantine/notifications': 7.17.8(@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@7.17.8(react@19.2.6))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-accordion': 1.2.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-alert-dialog': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-avatar': 1.1.12(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-checkbox': 1.3.4(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-collapsible': 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-context-menu': 2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-dialog': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-dropdown-menu': 2.1.17(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-hover-card': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-label': 2.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-navigation-menu': 1.2.15(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-popover': 1.1.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-progress': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-radio-group': 1.4.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-scroll-area': 1.2.11(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-select': 2.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-separator': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-slot': 1.2.5(@types/react@18.3.31)(react@19.2.6)
'@radix-ui/react-switch': 1.3.0(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-tabs': 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-toast': 1.2.16(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@radix-ui/react-tooltip': 1.2.9(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@react-pdf-viewer/core': 3.12.0(pdfjs-dist@5.4.296)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@react-pdf-viewer/default-layout': 3.12.0(pdfjs-dist@5.4.296)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@react-pdf/renderer': 4.5.1(react@19.2.6)
'@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@18.3.31)(react@19.2.6)(redux@5.0.1))(react@19.2.6)
'@tabler/icons-react': 3.44.0(react@19.2.6)
'@tailwindcss/vite': 4.3.0(vite@5.4.21(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0))
'@tanstack/react-query': 5.101.0(react@19.2.6)
'@tanstack/react-query-devtools': 5.101.0(@tanstack/react-query@5.101.0(react@19.2.6))(react@19.2.6)
'@tanstack/react-table': 8.21.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
'@tinymce/tinymce-react': 6.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(tinymce@7.9.3)
'@types/dompurify': 3.2.0
'@types/node': 24.13.1
'@types/tinymce': 4.6.9
axios: 1.17.0
class-variance-authority: 0.7.1
clsx: 2.1.1
cmdk: 1.1.1(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
date-fns: 3.6.0
dayjs: 1.11.21
dompurify: 3.4.8
ethiopian-calendar-date-converter: 2.1.6
ethiopian-calendar-new: 1.1.0
file-type: 18.7.0
framer-motion: 12.40.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
html2canvas: 1.4.1
i18next: 25.10.10(typescript@5.9.3)
i18next-browser-languagedetector: 8.2.1
jquery: 3.7.1
js-cookie: 3.0.8
jspdf: 3.0.4
lodash: 4.18.1
lucide-react: 0.513.0(react@19.2.6)
mantine-react-table: 2.0.0-beta.9(@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/dates@7.17.8(@mantine/core@7.17.8(@mantine/hooks@7.17.8(react@19.2.6))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@7.17.8(react@19.2.6))(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@mantine/hooks@7.17.8(react@19.2.6))(@tabler/icons-react@3.44.0(react@19.2.6))(clsx@2.1.1)(dayjs@1.11.21)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
mui-ethiopian-datepicker: 0.3.2(4b3af212eafdf0059f009b005d7e343d)
next-themes: 0.4.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
path: 0.12.7
pdf-lib: 1.17.1
qs: 6.15.2
react: 19.2.6
react-cookie: 8.1.2(@types/react@18.3.31)(react@19.2.6)
react-css-nocode-editor: 1.0.13(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6)
react-day-picker: 8.10.2(date-fns@3.6.0)(react@19.2.6)
react-dom: 19.2.6(react@19.2.6)
react-dropzone: 14.4.1(react@19.2.6)
react-hook-form: 7.77.0(react@19.2.6)
react-i18next: 15.7.4(i18next@25.10.10(typescript@5.9.3))(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@5.9.3)
react-icons: 5.6.0(react@19.2.6)
react-image-crop: 11.0.10(react@19.2.6)
react-intersection-observer: 9.16.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-pdf: 10.4.1(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-pdf-html: 2.1.5(@react-pdf/renderer@4.5.1(react@19.2.6))(react@19.2.6)
react-redux: 9.3.0(@types/react@18.3.31)(react@19.2.6)(redux@5.0.1)
react-resizable-panels: 3.0.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-router-dom: 7.17.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
react-signature-canvas: 1.1.0-alpha.2(@types/prop-types@15.7.15)(@types/react@18.3.31)(prop-types@15.8.1)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
recharts: 3.8.1(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6)(redux@5.0.1)
rollup-plugin-visualizer: 7.0.1(rollup@4.61.1)
socket.io-client: 4.8.3
sonner: 2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
tailwind-merge: 3.6.0
tailwind-scrollbar-hide: 4.0.0(tailwindcss@4.3.0)
tailwindcss: 4.3.0
tailwindcss-animate: 1.0.7(tailwindcss@4.3.0)
tinymce: 7.9.3
url: 0.11.4
vaul: 1.1.2(@types/react-dom@18.3.7(@types/react@18.3.31))(@types/react@18.3.31)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
xlsx: 0.18.5
zod: 3.25.76
transitivePeerDependencies:
- '@babel/core'
- '@emotion/is-prop-valid'
- '@mui/icons-material'
- '@mui/material'
- '@mui/x-date-pickers'
- '@types/prop-types'
- '@types/react'
- '@types/react-dom'
- bufferutil
- debug
- pdfjs-dist
- prop-types
- react-is
- react-native
- redux
- rolldown
- rollup
- supports-color
- typescript
- utf-8-validate
- vite
'@ts-morph/common@0.27.0': '@ts-morph/common@0.27.0':
dependencies: dependencies:
fast-glob: 3.3.3 fast-glob: 3.3.3
@@ -18465,7 +18630,7 @@ snapshots:
'@typescript-eslint/types': 8.60.1 '@typescript-eslint/types': 8.60.1
'@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3)
'@typescript-eslint/visitor-keys': 8.60.1 '@typescript-eslint/visitor-keys': 8.60.1
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
eslint: 8.57.1 eslint: 8.57.1
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
@@ -18475,7 +18640,7 @@ snapshots:
dependencies: dependencies:
'@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3)
'@typescript-eslint/types': 8.60.1 '@typescript-eslint/types': 8.60.1
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
typescript: 5.9.3 typescript: 5.9.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -18494,7 +18659,7 @@ snapshots:
'@typescript-eslint/types': 8.60.1 '@typescript-eslint/types': 8.60.1
'@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3)
'@typescript-eslint/utils': 8.60.1(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/utils': 8.60.1(eslint@8.57.1)(typescript@5.9.3)
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
eslint: 8.57.1 eslint: 8.57.1
ts-api-utils: 2.5.0(typescript@5.9.3) ts-api-utils: 2.5.0(typescript@5.9.3)
typescript: 5.9.3 typescript: 5.9.3
@@ -18509,7 +18674,7 @@ snapshots:
'@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3)
'@typescript-eslint/types': 8.60.1 '@typescript-eslint/types': 8.60.1
'@typescript-eslint/visitor-keys': 8.60.1 '@typescript-eslint/visitor-keys': 8.60.1
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
minimatch: 10.2.5 minimatch: 10.2.5
semver: 7.8.2 semver: 7.8.2
tinyglobby: 0.2.17 tinyglobby: 0.2.17
@@ -18798,7 +18963,7 @@ snapshots:
agent-base@6.0.2: agent-base@6.0.2:
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -19307,6 +19472,16 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
babel-plugin-styled-components@2.3.0(styled-components@5.3.11(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6))(supports-color@5.5.0):
dependencies:
'@babel/helper-annotate-as-pure': 7.29.7
'@babel/helper-module-imports': 7.29.7(supports-color@5.5.0)
'@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7)
picomatch: 4.0.4
styled-components: 5.3.11(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6)
transitivePeerDependencies:
- supports-color
babel-polyfill@6.26.0: babel-polyfill@6.26.0:
dependencies: dependencies:
babel-runtime: 6.26.0 babel-runtime: 6.26.0
@@ -19462,7 +19637,7 @@ snapshots:
dependencies: dependencies:
bytes: 3.1.2 bytes: 3.1.2
content-type: 1.0.5 content-type: 1.0.5
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
http-errors: 2.0.1 http-errors: 2.0.1
iconv-lite: 0.7.2 iconv-lite: 0.7.2
on-finished: 2.4.1 on-finished: 2.4.1
@@ -20511,7 +20686,7 @@ snapshots:
engine.io-client@6.6.5: engine.io-client@6.6.5:
dependencies: dependencies:
'@socket.io/component-emitter': 3.1.2 '@socket.io/component-emitter': 3.1.2
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
engine.io-parser: 5.2.3 engine.io-parser: 5.2.3
ws: 8.20.1 ws: 8.20.1
xmlhttprequest-ssl: 2.1.2 xmlhttprequest-ssl: 2.1.2
@@ -20531,7 +20706,7 @@ snapshots:
base64id: 2.0.0 base64id: 2.0.0
cookie: 0.7.2 cookie: 0.7.2
cors: 2.8.6 cors: 2.8.6
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
engine.io-parser: 5.2.3 engine.io-parser: 5.2.3
ws: 8.21.0 ws: 8.21.0
transitivePeerDependencies: transitivePeerDependencies:
@@ -20762,7 +20937,7 @@ snapshots:
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
eslint: 8.57.1 eslint: 8.57.1
get-tsconfig: 4.14.0 get-tsconfig: 4.14.0
is-bun-module: 2.0.0 is-bun-module: 2.0.0
@@ -20890,7 +21065,7 @@ snapshots:
ajv: 6.15.0 ajv: 6.15.0
chalk: 4.1.2 chalk: 4.1.2
cross-spawn: 7.0.6 cross-spawn: 7.0.6
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
doctrine: 3.0.0 doctrine: 3.0.0
escape-string-regexp: 4.0.0 escape-string-regexp: 4.0.0
eslint-scope: 7.2.2 eslint-scope: 7.2.2
@@ -21127,7 +21302,7 @@ snapshots:
content-type: 1.0.5 content-type: 1.0.5
cookie: 0.7.2 cookie: 0.7.2
cookie-signature: 1.2.2 cookie-signature: 1.2.2
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
depd: 2.0.0 depd: 2.0.0
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
@@ -21180,7 +21355,7 @@ snapshots:
extract-zip@2.0.1: extract-zip@2.0.1:
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
get-stream: 5.2.0 get-stream: 5.2.0
yauzl: 2.10.0 yauzl: 2.10.0
optionalDependencies: optionalDependencies:
@@ -21335,7 +21510,7 @@ snapshots:
finalhandler@2.1.1: finalhandler@2.1.1:
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
on-finished: 2.4.1 on-finished: 2.4.1
@@ -21583,7 +21758,7 @@ snapshots:
dependencies: dependencies:
basic-ftp: 5.3.1 basic-ftp: 5.3.1
data-uri-to-buffer: 6.0.2 data-uri-to-buffer: 6.0.2
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -21892,7 +22067,7 @@ snapshots:
http-proxy-agent@7.0.2: http-proxy-agent@7.0.2:
dependencies: dependencies:
agent-base: 7.1.4 agent-base: 7.1.4
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -21905,14 +22080,14 @@ snapshots:
https-proxy-agent@5.0.1: https-proxy-agent@5.0.1:
dependencies: dependencies:
agent-base: 6.0.2 agent-base: 6.0.2
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
https-proxy-agent@7.0.6: https-proxy-agent@7.0.6:
dependencies: dependencies:
agent-base: 7.1.4 agent-base: 7.1.4
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -22352,7 +22527,7 @@ snapshots:
istanbul-lib-source-maps@4.0.1: istanbul-lib-source-maps@4.0.1:
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
istanbul-lib-coverage: 3.2.2 istanbul-lib-coverage: 3.2.2
source-map: 0.6.1 source-map: 0.6.1
transitivePeerDependencies: transitivePeerDependencies:
@@ -23012,7 +23187,7 @@ snapshots:
dependencies: dependencies:
chalk: 5.6.2 chalk: 5.6.2
commander: 13.1.0 commander: 13.1.0
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
execa: 8.0.1 execa: 8.0.1
lilconfig: 3.1.3 lilconfig: 3.1.3
listr2: 8.3.3 listr2: 8.3.3
@@ -23699,7 +23874,7 @@ snapshots:
micromark@4.0.2: micromark@4.0.2:
dependencies: dependencies:
'@types/debug': 4.1.13 '@types/debug': 4.1.13
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
decode-named-character-reference: 1.3.0 decode-named-character-reference: 1.3.0
devlop: 1.1.0 devlop: 1.1.0
micromark-core-commonmark: 2.0.3 micromark-core-commonmark: 2.0.3
@@ -24225,7 +24400,7 @@ snapshots:
dependencies: dependencies:
'@tootallnate/quickjs-emscripten': 0.23.0 '@tootallnate/quickjs-emscripten': 0.23.0
agent-base: 7.1.4 agent-base: 7.1.4
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
get-uri: 6.0.5 get-uri: 6.0.5
http-proxy-agent: 7.0.2 http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6 https-proxy-agent: 7.0.6
@@ -24575,7 +24750,7 @@ snapshots:
proxy-agent@6.5.0: proxy-agent@6.5.0:
dependencies: dependencies:
agent-base: 7.1.4 agent-base: 7.1.4
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
http-proxy-agent: 7.0.2 http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6 https-proxy-agent: 7.0.6
lru-cache: 7.18.3 lru-cache: 7.18.3
@@ -24604,7 +24779,7 @@ snapshots:
dependencies: dependencies:
'@puppeteer/browsers': 2.13.2 '@puppeteer/browsers': 2.13.2
chromium-bidi: 14.0.0(devtools-protocol@0.0.1608973) chromium-bidi: 14.0.0(devtools-protocol@0.0.1608973)
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
devtools-protocol: 0.0.1608973 devtools-protocol: 0.0.1608973
typed-query-selector: 2.12.2 typed-query-selector: 2.12.2
webdriver-bidi-protocol: 0.4.1 webdriver-bidi-protocol: 0.4.1
@@ -24857,6 +25032,15 @@ snapshots:
- '@babel/core' - '@babel/core'
- react-is - react-is
react-css-nocode-editor@1.0.13(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6):
dependencies:
react: 19.2.6
react-dom: 19.2.6(react@19.2.6)
styled-components: 5.3.11(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6)
transitivePeerDependencies:
- '@babel/core'
- react-is
react-day-picker@8.10.2(date-fns@3.6.0)(react@19.2.6): react-day-picker@8.10.2(date-fns@3.6.0)(react@19.2.6):
dependencies: dependencies:
date-fns: 3.6.0 date-fns: 3.6.0
@@ -25467,7 +25651,7 @@ snapshots:
router@2.2.0: router@2.2.0:
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
depd: 2.0.0 depd: 2.0.0
is-promise: 4.0.0 is-promise: 4.0.0
parseurl: 1.3.3 parseurl: 1.3.3
@@ -25589,7 +25773,7 @@ snapshots:
send@1.2.1: send@1.2.1:
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
encodeurl: 2.0.0 encodeurl: 2.0.0
escape-html: 1.0.3 escape-html: 1.0.3
etag: 1.8.1 etag: 1.8.1
@@ -25805,7 +25989,7 @@ snapshots:
socket.io-adapter@2.5.8: socket.io-adapter@2.5.8:
dependencies: dependencies:
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
ws: 8.21.0 ws: 8.21.0
transitivePeerDependencies: transitivePeerDependencies:
- bufferutil - bufferutil
@@ -25815,7 +25999,7 @@ snapshots:
socket.io-client@4.8.3: socket.io-client@4.8.3:
dependencies: dependencies:
'@socket.io/component-emitter': 3.1.2 '@socket.io/component-emitter': 3.1.2
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
engine.io-client: 6.6.5 engine.io-client: 6.6.5
socket.io-parser: 4.2.6 socket.io-parser: 4.2.6
transitivePeerDependencies: transitivePeerDependencies:
@@ -25826,7 +26010,7 @@ snapshots:
socket.io-parser@4.2.6: socket.io-parser@4.2.6:
dependencies: dependencies:
'@socket.io/component-emitter': 3.1.2 '@socket.io/component-emitter': 3.1.2
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -25835,7 +26019,7 @@ snapshots:
accepts: 1.3.8 accepts: 1.3.8
base64id: 2.0.0 base64id: 2.0.0
cors: 2.8.6 cors: 2.8.6
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
engine.io: 6.6.9 engine.io: 6.6.9
socket.io-adapter: 2.5.8 socket.io-adapter: 2.5.8
socket.io-parser: 4.2.6 socket.io-parser: 4.2.6
@@ -25847,7 +26031,7 @@ snapshots:
socks-proxy-agent@8.0.5: socks-proxy-agent@8.0.5:
dependencies: dependencies:
agent-base: 7.1.4 agent-base: 7.1.4
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
socks: 2.8.9 socks: 2.8.9
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -26142,6 +26326,24 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
styled-components@5.3.11(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6):
dependencies:
'@babel/helper-module-imports': 7.29.7(supports-color@5.5.0)
'@babel/traverse': 7.29.7(supports-color@5.5.0)
'@emotion/is-prop-valid': 1.4.0
'@emotion/stylis': 0.8.5
'@emotion/unitless': 0.7.5
babel-plugin-styled-components: 2.3.0(styled-components@5.3.11(react-dom@19.2.6(react@19.2.6))(react-is@19.2.7)(react@19.2.6))(supports-color@5.5.0)
css-to-react-native: 3.2.0
hoist-non-react-statics: 3.3.2
react: 19.2.6
react-dom: 19.2.6(react@19.2.6)
react-is: 19.2.7
shallowequal: 1.1.0
supports-color: 5.5.0
transitivePeerDependencies:
- '@babel/core'
styled-jsx@5.1.1(babel-plugin-macros@3.1.0)(react@18.3.1): styled-jsx@5.1.1(babel-plugin-macros@3.1.0)(react@18.3.1):
dependencies: dependencies:
client-only: 0.0.1 client-only: 0.0.1
@@ -26167,7 +26369,7 @@ snapshots:
dependencies: dependencies:
component-emitter: 1.3.1 component-emitter: 1.3.1
cookiejar: 2.1.4 cookiejar: 2.1.4
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
fast-safe-stringify: 2.1.1 fast-safe-stringify: 2.1.1
form-data: 4.0.5 form-data: 4.0.5
formidable: 3.5.4 formidable: 3.5.4
@@ -26680,7 +26882,7 @@ snapshots:
app-root-path: 3.1.0 app-root-path: 3.1.0
buffer: 6.0.3 buffer: 6.0.3
dayjs: 1.11.21 dayjs: 1.11.21
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
dedent: 1.7.2(babel-plugin-macros@3.1.0) dedent: 1.7.2(babel-plugin-macros@3.1.0)
dotenv: 16.6.1 dotenv: 16.6.1
glob: 10.5.0 glob: 10.5.0
@@ -26704,7 +26906,7 @@ snapshots:
app-root-path: 3.1.0 app-root-path: 3.1.0
buffer: 6.0.3 buffer: 6.0.3
dayjs: 1.11.21 dayjs: 1.11.21
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
dedent: 1.7.2(babel-plugin-macros@3.1.0) dedent: 1.7.2(babel-plugin-macros@3.1.0)
dotenv: 16.6.1 dotenv: 16.6.1
glob: 10.5.0 glob: 10.5.0
@@ -27065,7 +27267,7 @@ snapshots:
vite-node@2.1.9(@types/node@22.20.1)(lightningcss@1.32.0)(terser@5.48.0): vite-node@2.1.9(@types/node@22.20.1)(lightningcss@1.32.0)(terser@5.48.0):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
pathe: 1.1.2 pathe: 1.1.2
vite: 5.4.21(@types/node@22.20.1)(lightningcss@1.32.0)(terser@5.48.0) vite: 5.4.21(@types/node@22.20.1)(lightningcss@1.32.0)(terser@5.48.0)
@@ -27083,7 +27285,7 @@ snapshots:
vite-node@2.1.9(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0): vite-node@2.1.9(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
pathe: 1.1.2 pathe: 1.1.2
vite: 5.4.21(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0) vite: 5.4.21(@types/node@24.13.1)(lightningcss@1.32.0)(terser@5.48.0)
@@ -27130,7 +27332,7 @@ snapshots:
'@vitest/spy': 2.1.9 '@vitest/spy': 2.1.9
'@vitest/utils': 2.1.9 '@vitest/utils': 2.1.9
chai: 5.3.3 chai: 5.3.3
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
expect-type: 1.3.0 expect-type: 1.3.0
magic-string: 0.30.21 magic-string: 0.30.21
pathe: 1.1.2 pathe: 1.1.2
@@ -27166,7 +27368,7 @@ snapshots:
'@vitest/spy': 2.1.9 '@vitest/spy': 2.1.9
'@vitest/utils': 2.1.9 '@vitest/utils': 2.1.9
chai: 5.3.3 chai: 5.3.3
debug: 4.4.3(supports-color@5.5.0) debug: 4.4.3(supports-color@8.1.1)
expect-type: 1.3.0 expect-type: 1.3.0
magic-string: 0.30.21 magic-string: 0.30.21
pathe: 1.1.2 pathe: 1.1.2