diff --git a/.gitignore b/.gitignore
index 671711b..1fc495a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -132,3 +132,5 @@ dist
*.DS_STORE
*.env
+
+test-results.xml
diff --git a/Jenkinsfile b/Jenkinsfile
index 501d3a5..f218c35 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -31,6 +31,22 @@ pipeline {
}
}
+ stage('Run Tests') {
+ steps {
+ nodejs(nodeJSInstallationName: 'Node23') {
+ sh '''
+ export NODE_ENV=test
+ yarn test
+ '''
+ }
+ }
+ post {
+ always {
+ junit 'test-results.xml'
+ }
+ }
+ }
+
stage('Deploy via SSH') {
steps {
sshPublisher(publishers: [
@@ -41,9 +57,9 @@ pipeline {
cleanRemote: false,
excludes: 'node_modules/**',
execCommand: '''
- cd /opt/farmcontrol-ws
+ cd /home/farmcontrol/farmcontrol-ws
yarn install --production
- pm2 restart ecosystem.config.js --env production || pm2 start ecosystem.config.js --env production
+ sudo systemctl restart farmcontrol-ws
''',
execTimeout: 120000,
flatten: false,
diff --git a/config.json b/config.json
index b735a2e..66e68da 100644
--- a/config.json
+++ b/config.json
@@ -21,6 +21,28 @@
},
"otpExpiryMins": 0.5
},
+ "test": {
+ "server": {
+ "port": 9091,
+ "logLevel": "error"
+ },
+ "auth": {
+ "enabled": false,
+ "keycloak": {
+ "url": "http://localhost:8080",
+ "realm": "test",
+ "clientId": "test-client"
+ },
+ "requiredRoles": []
+ },
+ "database": {
+ "mongo": {
+ "url": "mongodb://127.0.0.1:27017/farmcontrol-test"
+ },
+ "redis": { "host": "localhost", "port": 6379, "password": "" }
+ },
+ "otpExpiryMins": 0.5
+ },
"production": {
"server": {
"port": 8081,
diff --git a/jest.config.cjs b/jest.config.cjs
new file mode 100644
index 0000000..6bf9e0f
--- /dev/null
+++ b/jest.config.cjs
@@ -0,0 +1,23 @@
+module.exports = {
+ testEnvironment: 'node',
+ transform: {},
+ moduleFileExtensions: ['js', 'json', 'jsx', 'node'],
+ testMatch: ['**/__tests__/**/*.js', '**/?(*.)+(spec|test).js'],
+ verbose: true,
+ reporters: [
+ 'default',
+ [
+ 'jest-junit',
+ {
+ outputDirectory: '.',
+ outputName: 'test-results.xml',
+ suiteName: 'farmcontrol-ws-tests',
+ classNameTemplate: '{classname}',
+ titleTemplate: '{title}',
+ ancestorSeparator: ' › ',
+ usePathForSuiteName: 'true',
+ },
+ ],
+ ],
+};
+
diff --git a/package.json b/package.json
index a0e248f..4834809 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"main": "app.js",
"type": "module",
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1",
+ "test": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js",
"start": "node src/index.js",
"dev": "nodemon src/index.js",
"lint": "eslint src/",
@@ -43,11 +43,16 @@
"socketio-jwt": "^4.6.2"
},
"devDependencies": {
+ "@jest/globals": "^30.2.0",
+ "babel-jest": "^30.2.0",
"eslint": "^9.39.1",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
+ "jest": "^30.2.0",
+ "jest-junit": "^16.0.0",
"nodemon": "^3.1.11",
"prettier": "^3.6.2",
- "standard": "^17.1.2"
+ "standard": "^17.1.2",
+ "supertest": "^7.1.4"
}
}
diff --git a/src/__tests__/config.test.js b/src/__tests__/config.test.js
new file mode 100644
index 0000000..39aa0ad
--- /dev/null
+++ b/src/__tests__/config.test.js
@@ -0,0 +1,60 @@
+import { jest } from '@jest/globals';
+
+describe('Config Module', () => {
+ let originalEnv;
+
+ beforeEach(() => {
+ originalEnv = process.env.NODE_ENV;
+ jest.clearAllMocks();
+ });
+
+ afterEach(() => {
+ process.env.NODE_ENV = originalEnv;
+ delete process.env.KEYCLOAK_CLIENT_SECRET;
+ });
+
+ describe('loadConfig', () => {
+ it('should load test config when NODE_ENV=test', async () => {
+ process.env.NODE_ENV = 'test';
+ const { loadConfig } = await import('../config.js');
+ const config = loadConfig();
+
+ expect(config).toBeDefined();
+ expect(config.server).toBeDefined();
+ expect(config.server.port).toBe(9091);
+ expect(config.server.logLevel).toBe('error');
+ });
+
+ it('should override keycloak client secret from environment variable', async () => {
+ process.env.NODE_ENV = 'test';
+ process.env.KEYCLOAK_CLIENT_SECRET = 'test-secret';
+ const { loadConfig } = await import('../config.js');
+ const config = loadConfig();
+
+ expect(config.auth.keycloak.clientSecret).toBe('test-secret');
+ });
+
+ it('should throw error if environment config does not exist', async () => {
+ process.env.NODE_ENV = 'nonexistent';
+ const { loadConfig } = await import('../config.js');
+
+ // Suppress console.error during this test as it's expected
+ const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
+
+ expect(() => loadConfig()).toThrow(
+ "Configuration for environment 'nonexistent' not found in config.json"
+ );
+
+ consoleSpy.mockRestore();
+ });
+ });
+
+ describe('getEnvironment', () => {
+ it('should return current NODE_ENV', async () => {
+ process.env.NODE_ENV = 'test';
+ const { getEnvironment } = await import('../config.js');
+ expect(getEnvironment()).toBe('test');
+ });
+ });
+});
+
diff --git a/src/actions/__tests__/actionmanager.test.js b/src/actions/__tests__/actionmanager.test.js
new file mode 100644
index 0000000..4415f59
--- /dev/null
+++ b/src/actions/__tests__/actionmanager.test.js
@@ -0,0 +1,164 @@
+import { jest } from '@jest/globals';
+
+jest.unstable_mockModule('../../database/nats.js', () => ({
+ natsServer: {
+ publish: jest.fn().mockResolvedValue({ success: true }),
+ subscribe: jest.fn().mockResolvedValue({ success: true }),
+ removeSubscription: jest.fn().mockResolvedValue({ success: true })
+ }
+}));
+
+jest.unstable_mockModule('../../utils.js', () => ({
+ generateEtcId: jest.fn(() => 'test-etc-id')
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn()
+ })
+ }
+}));
+
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: {
+ logLevel: 'info'
+ }
+ }))
+}));
+
+const { ActionManager } = await import('../actionmanager.js');
+const { natsServer } = await import('../../database/nats.js');
+const { generateEtcId } = await import('../../utils.js');
+
+describe('ActionManager', () => {
+ let mockSocketClient;
+ let actionManager;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+
+ mockSocketClient = {
+ id: 'test-socket-id',
+ socketId: 'test-socket-id',
+ socket: {
+ emit: jest.fn((event, data, cb) => {
+ if (cb) cb({ status: 'success' });
+ })
+ }
+ };
+
+ actionManager = new ActionManager(mockSocketClient);
+ });
+
+ describe('subscribeToObjectActions', () => {
+ it('should subscribe to object actions and emit when received', async () => {
+ const id = 'obj-123';
+ const objectType = 'printer';
+
+ await actionManager.subscribeToObjectActions(id, objectType);
+
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'printers.obj-123.actions',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+
+ // Simulate NATS message
+ const natsCallback = natsServer.subscribe.mock.calls[0][2];
+ const actionData = { some: 'action', actionId: 'act-1' };
+
+ natsCallback('printers.obj-123.actions', actionData);
+
+ expect(mockSocketClient.socket.emit).toHaveBeenCalledWith(
+ 'objectAction',
+ expect.objectContaining({
+ _id: id,
+ objectType: objectType,
+ action: actionData
+ }),
+ expect.any(Function)
+ );
+
+ // Verify that the emit callback publishes back to NATS
+ expect(natsServer.publish).toHaveBeenCalledWith(
+ 'printers.obj-123.actions.act-1',
+ expect.objectContaining({
+ ...actionData,
+ result: { status: 'success' }
+ })
+ );
+ });
+ });
+
+ describe('removeObjectActionsListener', () => {
+ it('should remove subscription and update internal state', async () => {
+ const id = 'obj-123';
+ const objectType = 'printer';
+
+ await actionManager.subscribeToObjectActions(id, objectType);
+ await actionManager.removeObjectActionsListener(id, objectType);
+
+ expect(natsServer.removeSubscription).toHaveBeenCalledWith(
+ 'printers.obj-123.actions',
+ 'test-socket-id'
+ );
+ expect(actionManager.subscriptions.size).toBe(0);
+ });
+ });
+
+ describe('sendObjectAction', () => {
+ it('should publish action and subscribe for response', async () => {
+ const id = 'obj-123';
+ const objectType = 'printer';
+ const action = { type: 'start' };
+ const callback = jest.fn();
+
+ await actionManager.sendObjectAction(id, objectType, action, callback);
+
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'printers.obj-123.actions.test-etc-id',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+
+ expect(natsServer.publish).toHaveBeenCalledWith(
+ 'printers.obj-123.actions',
+ expect.objectContaining({
+ ...action,
+ actionId: 'test-etc-id'
+ })
+ );
+
+ // Simulate NATS response
+ const natsCallback = natsServer.subscribe.mock.calls[0][2];
+ await natsCallback('printers.obj-123.actions.test-etc-id', {
+ result: 'ok'
+ });
+
+ expect(callback).toHaveBeenCalledWith('ok');
+ expect(natsServer.removeSubscription).toHaveBeenCalledWith(
+ 'printers.obj-123.actions.test-etc-id',
+ 'test-socket-id'
+ );
+ });
+ });
+
+ describe('removeAllListeners', () => {
+ it('should remove all active subscriptions', async () => {
+ await actionManager.subscribeToObjectActions('1', 'printer');
+ await actionManager.subscribeToObjectActions('2', 'printer');
+
+ await actionManager.removeAllListeners();
+
+ expect(natsServer.removeSubscription).toHaveBeenCalledTimes(2);
+ expect(actionManager.subscriptions.size).toBe(0);
+ });
+ });
+});
diff --git a/src/config.js b/src/config.js
index e94da0a..7449540 100644
--- a/src/config.js
+++ b/src/config.js
@@ -12,11 +12,9 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const CONFIG_PATH = path.resolve(__dirname, '../config.json');
-// Determine environment
-const NODE_ENV = process.env.NODE_ENV || 'development';
-
// Load config file
export function loadConfig() {
+ const env = process.env.NODE_ENV || 'development';
try {
if (!fs.existsSync(CONFIG_PATH)) {
throw new Error(`Configuration file not found at ${CONFIG_PATH}`);
@@ -25,13 +23,13 @@ export function loadConfig() {
const configData = fs.readFileSync(CONFIG_PATH, 'utf8');
const config = JSON.parse(configData);
- if (!config[NODE_ENV]) {
+ if (!config[env]) {
throw new Error(
- `Configuration for environment '${NODE_ENV}' not found in config.json`
+ `Configuration for environment '${env}' not found in config.json`
);
}
- const envConfig = config[NODE_ENV];
+ const envConfig = config[env];
// Override keycloak client secret with environment variable if available
if (process.env.KEYCLOAK_CLIENT_SECRET) {
@@ -53,5 +51,5 @@ export function loadConfig() {
// Get current environment
export function getEnvironment() {
- return NODE_ENV;
+ return process.env.NODE_ENV || 'development';
}
diff --git a/src/events/__tests__/eventmanager.test.js b/src/events/__tests__/eventmanager.test.js
new file mode 100644
index 0000000..90753a5
--- /dev/null
+++ b/src/events/__tests__/eventmanager.test.js
@@ -0,0 +1,134 @@
+import { jest } from '@jest/globals';
+
+jest.unstable_mockModule('../../database/nats.js', () => ({
+ natsServer: {
+ publish: jest.fn().mockResolvedValue({ success: true }),
+ subscribe: jest.fn().mockResolvedValue({ success: true }),
+ removeSubscription: jest.fn().mockResolvedValue({ success: true })
+ }
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn()
+ })
+ }
+}));
+
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: {
+ logLevel: 'info'
+ }
+ }))
+}));
+
+const { EventManager } = await import('../eventmanager.js');
+const { natsServer } = await import('../../database/nats.js');
+
+describe('EventManager', () => {
+ let mockSocketClient;
+ let eventManager;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+
+ mockSocketClient = {
+ socketId: 'test-socket-id',
+ socket: {
+ emit: jest.fn()
+ }
+ };
+
+ eventManager = new EventManager(mockSocketClient);
+ });
+
+ describe('subscribeToObjectEvent', () => {
+ it('should subscribe to object events and emit when received', async () => {
+ const id = 'obj-123';
+ const objectType = 'printer';
+ const eventType = 'status';
+
+ await eventManager.subscribeToObjectEvent(id, objectType, eventType);
+
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'printers.obj-123.events.status',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+
+ // Simulate NATS message
+ const natsCallback = natsServer.subscribe.mock.calls[0][2];
+ const eventData = { status: 'online' };
+
+ natsCallback('printers.obj-123.events.status', eventData);
+
+ expect(mockSocketClient.socket.emit).toHaveBeenCalledWith('objectEvent', {
+ _id: id,
+ objectType: objectType,
+ event: eventData
+ });
+ });
+ });
+
+ describe('removeObjectEventsListener', () => {
+ it('should remove specific subscription', async () => {
+ const id = 'obj-123';
+ const objectType = 'printer';
+ const eventType = 'status';
+
+ await eventManager.subscribeToObjectEvent(id, objectType, eventType);
+ await eventManager.removeObjectEventsListener(id, objectType, eventType);
+
+ expect(natsServer.removeSubscription).toHaveBeenCalledWith(
+ 'printers.obj-123.events.status',
+ 'test-socket-id'
+ );
+ expect(eventManager.subscriptions.size).toBe(0);
+ });
+ });
+
+ describe('sendObjectEvent', () => {
+ it('should publish event to NATS', async () => {
+ const id = 'obj-123';
+ const objectType = 'printer';
+ const event = { type: 'alert', message: 'low filament' };
+
+ const result = await eventManager.sendObjectEvent(id, objectType, event);
+
+ expect(result).toEqual({ success: true });
+ expect(natsServer.publish).toHaveBeenCalledWith(
+ 'printers.obj-123.events.alert',
+ event
+ );
+ });
+
+ it('should handle errors when publishing fails', async () => {
+ natsServer.publish.mockRejectedValueOnce(new Error('NATS error'));
+
+ const result = await eventManager.sendObjectEvent('id', 'type', {
+ type: 't'
+ });
+
+ expect(result).toHaveProperty('error', 'NATS error');
+ });
+ });
+
+ describe('removeAllListeners', () => {
+ it('should remove all subscriptions', async () => {
+ await eventManager.subscribeToObjectEvent('1', 'printer', 'e1');
+ await eventManager.subscribeToObjectEvent('2', 'printer', 'e2');
+
+ await eventManager.removeAllListeners();
+
+ expect(natsServer.removeSubscription).toHaveBeenCalledTimes(2);
+ expect(eventManager.subscriptions.size).toBe(0);
+ });
+ });
+});
diff --git a/src/lock/__tests__/lockmanager.test.js b/src/lock/__tests__/lockmanager.test.js
new file mode 100644
index 0000000..1a13244
--- /dev/null
+++ b/src/lock/__tests__/lockmanager.test.js
@@ -0,0 +1,226 @@
+import { jest } from '@jest/globals';
+
+jest.unstable_mockModule('../../database/nats.js', () => ({
+ natsServer: {
+ publish: jest.fn().mockResolvedValue({ success: true }),
+ subscribe: jest.fn().mockResolvedValue({ success: true }),
+ },
+}));
+
+jest.unstable_mockModule('../../database/redis.js', () => ({
+ redisServer: {
+ setKey: jest.fn().mockResolvedValue(undefined),
+ getKey: jest.fn().mockResolvedValue(null),
+ deleteKey: jest.fn().mockResolvedValue(undefined),
+ },
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn(),
+ }),
+ },
+}));
+
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: {
+ logLevel: 'info',
+ },
+ })),
+}));
+
+const { LockManager } = await import('../lockmanager.js');
+const { natsServer } = await import('../../database/nats.js');
+const { redisServer } = await import('../../database/redis.js');
+
+describe('LockManager', () => {
+ let mockSocketClient;
+ let lockManager;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+
+ mockSocketClient = {
+ id: 'test-socket-id',
+ socket: {
+ emit: jest.fn(),
+ },
+ };
+
+ lockManager = new LockManager(mockSocketClient);
+ });
+
+ describe('lockObject', () => {
+ it('should lock an object and publish via NATS', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ };
+
+ const result = await lockManager.lockObject(testObject);
+
+ expect(result).toBe(true);
+ expect(redisServer.setKey).toHaveBeenCalledWith(
+ 'locks:products:test-id-123',
+ expect.objectContaining({
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ locked: true,
+ })
+ );
+ expect(natsServer.publish).toHaveBeenCalledWith(
+ 'locks.products.test-id-123',
+ expect.objectContaining({
+ locked: true,
+ })
+ );
+ });
+
+ it('should handle errors when locking fails', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ };
+
+ redisServer.setKey.mockRejectedValueOnce(new Error('Redis error'));
+
+ await expect(lockManager.lockObject(testObject)).rejects.toThrow('Redis error');
+ });
+ });
+
+ describe('unlockObject', () => {
+ it('should unlock an object when user matches', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ };
+
+ redisServer.getKey.mockResolvedValueOnce({
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ locked: true,
+ });
+
+ const result = await lockManager.unlockObject(testObject);
+
+ expect(result).toBe(true);
+ expect(redisServer.deleteKey).toHaveBeenCalledWith('locks:products:test-id-123');
+ expect(natsServer.publish).toHaveBeenCalledWith(
+ 'locks.products.test-id-123',
+ expect.objectContaining({
+ _id: 'test-id-123',
+ type: 'product',
+ locked: false,
+ })
+ );
+ });
+
+ it('should not unlock when user does not match', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ };
+
+ redisServer.getKey.mockResolvedValueOnce({
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'different-user',
+ locked: true,
+ });
+
+ const result = await lockManager.unlockObject(testObject);
+
+ expect(result).toBeUndefined();
+ expect(redisServer.deleteKey).not.toHaveBeenCalled();
+ expect(natsServer.publish).not.toHaveBeenCalled();
+ });
+
+ it('should handle errors when unlocking fails', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ };
+
+ redisServer.getKey.mockRejectedValueOnce(new Error('Redis error'));
+
+ await expect(lockManager.unlockObject(testObject)).rejects.toThrow('Redis error');
+ });
+ });
+
+ describe('getObjectLock', () => {
+ it('should return locked status when object is locked', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ };
+
+ redisServer.getKey.mockResolvedValueOnce({
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ locked: true,
+ });
+
+ const result = await lockManager.getObjectLock(testObject);
+
+ expect(result).toEqual({
+ _id: 'test-id-123',
+ type: 'product',
+ user: 'user-123',
+ locked: true,
+ });
+ expect(redisServer.getKey).toHaveBeenCalledWith('locks:products:test-id-123');
+ });
+
+ it('should return unlocked status when object is not locked', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ };
+
+ redisServer.getKey.mockResolvedValueOnce(null);
+
+ const result = await lockManager.getObjectLock(testObject);
+
+ expect(result).toEqual({
+ _id: 'test-id-123',
+ locked: false,
+ });
+ });
+
+ it('should handle errors when getting lock status fails', async () => {
+ const testObject = {
+ _id: 'test-id-123',
+ type: 'product',
+ };
+
+ redisServer.getKey.mockRejectedValueOnce(new Error('Redis error'));
+
+ await expect(lockManager.getObjectLock(testObject)).rejects.toThrow('Redis error');
+ });
+ });
+
+ describe('setupLocksListeners', () => {
+ it('should subscribe to NATS lock changes', () => {
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'locks.>',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+ });
+ });
+});
+
diff --git a/src/socket/__tests__/sockethost.test.js b/src/socket/__tests__/sockethost.test.js
new file mode 100644
index 0000000..a03f3ea
--- /dev/null
+++ b/src/socket/__tests__/sockethost.test.js
@@ -0,0 +1,215 @@
+import { jest } from '@jest/globals';
+
+// Mock dependencies
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: { logLevel: 'info' }
+ }))
+}));
+
+jest.unstable_mockModule('../../auth/auth.js', () => ({
+ CodeAuth: jest.fn().mockImplementation(() => ({
+ verifyCode: jest.fn(),
+ verifyOtp: jest.fn()
+ })),
+ createAuthMiddleware: jest.fn(() => (socket, next) => next())
+}));
+
+jest.unstable_mockModule('../../database/database.js', () => ({
+ newObject: jest.fn(),
+ editObject: jest.fn(),
+ getObject: jest.fn(),
+ listObjects: jest.fn()
+}));
+
+jest.unstable_mockModule(
+ '../../database/schemas/management/host.schema.js',
+ () => ({
+ hostModel: { modelName: 'host' }
+ })
+);
+
+jest.unstable_mockModule('../../updates/updatemanager.js', () => ({
+ UpdateManager: jest.fn().mockImplementation(() => ({
+ subscribeToObjectUpdate: jest.fn(),
+ unsubscribeToObjectUpdate: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../actions/actionmanager.js', () => ({
+ ActionManager: jest.fn().mockImplementation(() => ({
+ subscribeToObjectActions: jest.fn(),
+ removeAllListeners: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../events/eventmanager.js', () => ({
+ EventManager: jest.fn().mockImplementation(() => ({
+ sendObjectEvent: jest.fn(),
+ subscribeToObjectEvent: jest.fn(),
+ removeObjectEventsListener: jest.fn(),
+ removeAllListeners: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../templates/templatemanager.js', () => ({
+ TemplateManager: jest.fn().mockImplementation(() => ({
+ renderPDF: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../utils.js', () => ({
+ getModelByName: jest.fn(name => ({ modelName: name }))
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn()
+ })
+ }
+}));
+
+const { SocketHost } = await import('../sockethost.js');
+const { editObject, newObject, getObject, listObjects } = await import(
+ '../../database/database.js'
+);
+
+describe('SocketHost', () => {
+ let mockSocket;
+ let mockSocketManager;
+ let socketHost;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ mockSocket = {
+ id: 'test-socket-id',
+ use: jest.fn(),
+ on: jest.fn(),
+ emit: jest.fn()
+ };
+ mockSocketManager = {};
+ socketHost = new SocketHost(mockSocket, mockSocketManager);
+ });
+
+ it('should initialize correctly and setup event handlers', () => {
+ expect(mockSocket.use).toHaveBeenCalled();
+ expect(mockSocket.on).toHaveBeenCalledWith(
+ 'authenticate',
+ expect.any(Function)
+ );
+ expect(mockSocket.on).toHaveBeenCalledWith(
+ 'disconnect',
+ expect.any(Function)
+ );
+ });
+
+ describe('handleAuthenticate', () => {
+ it('should authenticate with id and authCode', async () => {
+ const data = { id: 'host-1', authCode: 'code-123' };
+ const callback = jest.fn();
+ const mockHost = { _id: 'host-id-obj' };
+
+ socketHost.codeAuth.verifyCode.mockResolvedValue({
+ valid: true,
+ host: mockHost
+ });
+ editObject.mockResolvedValue({});
+
+ await socketHost.handleAuthenticate(data, callback);
+
+ expect(socketHost.codeAuth.verifyCode).toHaveBeenCalledWith(
+ 'host-1',
+ 'code-123'
+ );
+ expect(editObject).toHaveBeenCalled();
+ expect(callback).toHaveBeenCalledWith({ valid: true, host: mockHost });
+ expect(socketHost.authenticated).toBe(true);
+ });
+
+ it('should authenticate with otp', async () => {
+ const data = { otp: '123456' };
+ const callback = jest.fn();
+ const mockHost = { _id: 'host-id-obj' };
+
+ socketHost.codeAuth.verifyOtp.mockResolvedValue({
+ valid: true,
+ host: mockHost
+ });
+ editObject.mockResolvedValue({});
+
+ await socketHost.handleAuthenticate(data, callback);
+
+ expect(socketHost.codeAuth.verifyOtp).toHaveBeenCalledWith('123456');
+ expect(callback).toHaveBeenCalledWith({ valid: true, host: mockHost });
+ });
+
+ it('should return error if params are missing', async () => {
+ const data = {};
+ const callback = jest.fn();
+
+ await socketHost.handleAuthenticate(data, callback);
+
+ expect(callback).toHaveBeenCalledWith({
+ valid: false,
+ error: 'Missing params.'
+ });
+ });
+ });
+
+ describe('database operations handlers', () => {
+ beforeEach(() => {
+ socketHost.host = { _id: 'host-id' };
+ });
+
+ it('handleNewObject should call newObject and callback', async () => {
+ const data = { objectType: 'printer', newData: { name: 'P1' } };
+ const callback = jest.fn();
+ newObject.mockResolvedValue({ _id: 'new-id' });
+
+ await socketHost.handleNewObject(data, callback);
+
+ expect(newObject).toHaveBeenCalled();
+ expect(callback).toHaveBeenCalledWith({ _id: 'new-id' });
+ });
+
+ it('handleEditObject should call editObject and callback', async () => {
+ const data = {
+ objectType: 'printer',
+ _id: 'p1',
+ updateData: { status: 'idle' }
+ };
+ const callback = jest.fn();
+ editObject.mockResolvedValue({ success: true });
+
+ await socketHost.handleEditObject(data, callback);
+
+ expect(editObject).toHaveBeenCalled();
+ expect(callback).toHaveBeenCalledWith({ success: true });
+ });
+ });
+
+ describe('handleDisconnect', () => {
+ it('should set host offline if authenticated', async () => {
+ socketHost.authenticated = true;
+ socketHost.id = 'host-id';
+ socketHost.host = { _id: 'host-id' };
+ listObjects.mockResolvedValue([]); // for setDevicesState
+
+ await socketHost.handleDisconnect();
+
+ expect(editObject).toHaveBeenCalledWith(
+ expect.objectContaining({
+ id: 'host-id',
+ updateData: expect.objectContaining({ online: false })
+ })
+ );
+ expect(socketHost.actionManager.removeAllListeners).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/src/socket/__tests__/socketmanager.test.js b/src/socket/__tests__/socketmanager.test.js
new file mode 100644
index 0000000..4b93283
--- /dev/null
+++ b/src/socket/__tests__/socketmanager.test.js
@@ -0,0 +1,136 @@
+import { jest } from '@jest/globals';
+
+jest.unstable_mockModule('socket.io', () => ({
+ Server: jest.fn(() => ({
+ on: jest.fn(),
+ emit: jest.fn(),
+ })),
+}));
+
+jest.unstable_mockModule('../socketuser.js', () => ({
+ SocketUser: jest.fn((socket, manager) => ({
+ id: socket.id,
+ socket,
+ })),
+}));
+
+jest.unstable_mockModule('../sockethost.js', () => ({
+ SocketHost: jest.fn((socket, manager) => ({
+ id: socket.id,
+ socket,
+ })),
+}));
+
+jest.unstable_mockModule('../../database/nats.js', () => ({
+ natsServer: {
+ publish: jest.fn().mockResolvedValue({ success: true }),
+ subscribe: jest.fn().mockResolvedValue({ success: true }),
+ removeSubscription: jest.fn().mockResolvedValue({ success: true }),
+ },
+}));
+
+jest.unstable_mockModule('../../database/redis.js', () => ({
+ redisServer: {
+ setKey: jest.fn().mockResolvedValue(undefined),
+ getKey: jest.fn().mockResolvedValue(null),
+ deleteKey: jest.fn().mockResolvedValue(undefined),
+ getKeysByPattern: jest.fn().mockResolvedValue([]),
+ connect: jest.fn().mockResolvedValue(undefined),
+ disconnect: jest.fn().mockResolvedValue(undefined),
+ },
+}));
+
+jest.unstable_mockModule('../../lock/lockmanager.js', () => ({
+ LockManager: jest.fn(),
+}));
+
+jest.unstable_mockModule('../../templates/templatemanager.js', () => ({
+ TemplateManager: jest.fn(),
+}));
+
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: {
+ logLevel: 'info',
+ corsOrigins: '*',
+ },
+ })),
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn(),
+ }),
+ },
+}));
+
+const { SocketManager } = await import('../socketmanager.js');
+const { Server } = await import('socket.io');
+
+describe('SocketManager', () => {
+ let mockServer;
+ let socketManager;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ mockServer = {};
+ socketManager = new SocketManager(mockServer);
+ });
+
+ it('should initialize correctly', () => {
+ expect(Server).toHaveBeenCalledWith(mockServer, expect.any(Object));
+ expect(socketManager.io.on).toHaveBeenCalledWith('connection', expect.any(Function));
+ });
+
+ describe('connection handling', () => {
+ it('should add a user when auth type is user', async () => {
+ const mockSocket = {
+ id: 'user-socket',
+ handshake: { auth: { type: 'user' } },
+ on: jest.fn(),
+ };
+
+ const connectionHandler = socketManager.io.on.mock.calls[0][1];
+ await connectionHandler(mockSocket);
+
+ expect(socketManager.socketUsers.has('user-socket')).toBe(true);
+ });
+
+ it('should add a host when auth type is host', async () => {
+ const mockSocket = {
+ id: 'host-socket',
+ handshake: { auth: { type: 'host' } },
+ on: jest.fn(),
+ };
+
+ const connectionHandler = socketManager.io.on.mock.calls[0][1];
+ await connectionHandler(mockSocket);
+
+ expect(socketManager.socketHosts.has('host-socket')).toBe(true);
+ });
+ });
+
+ describe('sendToUser', () => {
+ it('should emit event to all matching user connections', () => {
+ const mockUserSocket = {
+ id: 's1',
+ emit: jest.fn(),
+ };
+ socketManager.socketUsers.set('s1', {
+ user: { _id: 'u1' },
+ socket: mockUserSocket,
+ });
+
+ socketManager.sendToUser('u1', 'testEvent', { data: 'ok' });
+
+ expect(mockUserSocket.emit).toHaveBeenCalledWith('testEvent', { data: 'ok' });
+ });
+ });
+});
+
diff --git a/src/socket/__tests__/socketuser.test.js b/src/socket/__tests__/socketuser.test.js
new file mode 100644
index 0000000..2a29c3c
--- /dev/null
+++ b/src/socket/__tests__/socketuser.test.js
@@ -0,0 +1,187 @@
+import { jest } from '@jest/globals';
+
+// Mock dependencies
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: { logLevel: 'info' }
+ }))
+}));
+
+jest.unstable_mockModule('../../auth/auth.js', () => ({
+ KeycloakAuth: jest.fn().mockImplementation(() => ({
+ verifyToken: jest.fn()
+ })),
+ createAuthMiddleware: jest.fn(() => (socket, next) => next())
+}));
+
+jest.unstable_mockModule('../../utils.js', () => ({
+ generateHostOTP: jest.fn()
+}));
+
+jest.unstable_mockModule('../../lock/lockmanager.js', () => ({
+ LockManager: jest.fn().mockImplementation(() => ({
+ lockObject: jest.fn(),
+ unlockObject: jest.fn(),
+ getObjectLock: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../updates/updatemanager.js', () => ({
+ UpdateManager: jest.fn().mockImplementation(() => ({
+ subscribeToObjectNew: jest.fn(),
+ subscribeToObjectDelete: jest.fn(),
+ subscribeToObjectUpdate: jest.fn(),
+ removeObjectNewListener: jest.fn(),
+ removeObjectDeleteListener: jest.fn(),
+ removeObjectUpdateListener: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../actions/actionmanager.js', () => ({
+ ActionManager: jest.fn().mockImplementation(() => ({
+ sendObjectAction: jest.fn(),
+ removeAllListeners: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../events/eventmanager.js', () => ({
+ EventManager: jest.fn().mockImplementation(() => ({
+ subscribeToObjectEvent: jest.fn(),
+ removeObjectEventsListener: jest.fn(),
+ removeAllListeners: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('../../stats/statsmanager.js', () => ({
+ StatsManager: jest.fn().mockImplementation(() => ({
+ subscribeToStats: jest.fn(),
+ removeStatsListener: jest.fn(),
+ removeAllListeners: jest.fn()
+ }))
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn()
+ })
+ }
+}));
+
+const { SocketUser } = await import('../socketuser.js');
+const { generateHostOTP } = await import('../../utils.js');
+
+describe('SocketUser', () => {
+ let mockSocket;
+ let mockSocketManager;
+ let socketUser;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ mockSocket = {
+ id: 'test-user-socket-id',
+ use: jest.fn(),
+ on: jest.fn(),
+ emit: jest.fn()
+ };
+ mockSocketManager = {
+ templateManager: {
+ renderTemplate: jest.fn(),
+ renderPDF: jest.fn()
+ }
+ };
+ socketUser = new SocketUser(mockSocket, mockSocketManager);
+ });
+
+ it('should initialize correctly and setup event handlers', () => {
+ expect(mockSocket.use).toHaveBeenCalled();
+ expect(mockSocket.on).toHaveBeenCalledWith('authenticate', expect.any(Function));
+ expect(mockSocket.on).toHaveBeenCalledWith('lock', expect.any(Function));
+ expect(mockSocket.on).toHaveBeenCalledWith('disconnect', expect.any(Function));
+ });
+
+ describe('handleAuthenticateEvent', () => {
+ it('should authenticate user with valid token', async () => {
+ const data = { token: 'valid-token' };
+ const callback = jest.fn();
+ const mockUser = { _id: 'user-id-obj', username: 'testuser' };
+
+ socketUser.keycloakAuth.verifyToken.mockResolvedValue({ valid: true, user: mockUser });
+
+ await socketUser.handleAuthenticateEvent(data, callback);
+
+ expect(socketUser.keycloakAuth.verifyToken).toHaveBeenCalledWith('valid-token');
+ expect(socketUser.authenticated).toBe(true);
+ expect(socketUser.user).toEqual(mockUser);
+ expect(socketUser.id).toBe('user-id-obj');
+ expect(callback).toHaveBeenCalledWith({ valid: true, user: mockUser });
+ });
+
+ it('should not authenticate user with invalid token', async () => {
+ const data = { token: 'invalid-token' };
+ const callback = jest.fn();
+
+ socketUser.keycloakAuth.verifyToken.mockResolvedValue({ valid: false });
+
+ await socketUser.handleAuthenticateEvent(data, callback);
+
+ expect(socketUser.authenticated).toBe(false);
+ expect(callback).toHaveBeenCalledWith({ valid: false });
+ });
+ });
+
+ describe('lock event handlers', () => {
+ beforeEach(() => {
+ socketUser.user = { _id: 'user-id' };
+ });
+
+ it('handleLockEvent should call lockManager.lockObject', async () => {
+ const data = { _id: 'obj-1', type: 'printer' };
+ await socketUser.handleLockEvent(data);
+
+ expect(socketUser.lockManager.lockObject).toHaveBeenCalledWith({
+ ...data,
+ user: 'user-id'
+ });
+ });
+
+ it('handleUnlockEvent should call lockManager.unlockObject', async () => {
+ const data = { _id: 'obj-1' };
+ await socketUser.handleUnlockEvent(data);
+
+ expect(socketUser.lockManager.unlockObject).toHaveBeenCalledWith({
+ ...data,
+ user: 'user-id'
+ });
+ });
+ });
+
+ describe('handleGenerateHostOtpEvent', () => {
+ it('should call generateHostOTP and callback', async () => {
+ const data = { _id: 'host-id' };
+ const callback = jest.fn();
+ generateHostOTP.mockResolvedValue('otp-123');
+
+ await socketUser.handleGenerateHostOtpEvent(data, callback);
+
+ expect(generateHostOTP).toHaveBeenCalledWith('host-id');
+ expect(callback).toHaveBeenCalledWith('otp-123');
+ });
+ });
+
+ describe('handleDisconnect', () => {
+ it('should remove all listeners', async () => {
+ await socketUser.handleDisconnect();
+
+ expect(socketUser.actionManager.removeAllListeners).toHaveBeenCalled();
+ expect(socketUser.eventManager.removeAllListeners).toHaveBeenCalled();
+ expect(socketUser.statsManager.removeAllListeners).toHaveBeenCalled();
+ });
+ });
+});
+
diff --git a/src/stats/__tests__/statsmanager.test.js b/src/stats/__tests__/statsmanager.test.js
new file mode 100644
index 0000000..6720987
--- /dev/null
+++ b/src/stats/__tests__/statsmanager.test.js
@@ -0,0 +1,123 @@
+import { jest } from '@jest/globals';
+
+jest.unstable_mockModule('../../database/nats.js', () => ({
+ natsServer: {
+ publish: jest.fn().mockResolvedValue({ success: true }),
+ subscribe: jest.fn().mockResolvedValue({ success: true }),
+ removeSubscription: jest.fn().mockResolvedValue({ success: true })
+ }
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn()
+ })
+ }
+}));
+
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: {
+ logLevel: 'info'
+ }
+ }))
+}));
+
+const { StatsManager } = await import('../statsmanager.js');
+const { natsServer } = await import('../../database/nats.js');
+
+describe('StatsManager', () => {
+ let mockSocketClient;
+ let statsManager;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+
+ mockSocketClient = {
+ socketId: 'test-socket-id',
+ socket: {
+ emit: jest.fn()
+ }
+ };
+
+ statsManager = new StatsManager(mockSocketClient);
+ });
+
+ describe('subscribeToStats', () => {
+ it('should subscribe to stats updates and emit when received', async () => {
+ const type = 'printer';
+
+ await statsManager.subscribeToStats(type);
+
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'printers.stats',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+
+ // Simulate NATS message
+ const natsCallback = natsServer.subscribe.mock.calls[0][2];
+ const statsData = { count: 5, active: 2 };
+
+ natsCallback('printers.stats', statsData);
+
+ expect(mockSocketClient.socket.emit).toHaveBeenCalledWith('modelStats', {
+ objectType: type,
+ stats: statsData
+ });
+ });
+ });
+
+ describe('removeStatsListener', () => {
+ it('should remove stats subscription', async () => {
+ const type = 'printer';
+
+ await statsManager.subscribeToStats(type);
+ await statsManager.removeStatsListener(type);
+
+ expect(natsServer.removeSubscription).toHaveBeenCalledWith(
+ 'printers.stats',
+ 'test-socket-id'
+ );
+ expect(statsManager.subscriptions.size).toBe(0);
+ });
+ });
+
+ describe('sendStats', () => {
+ it('should publish stats to NATS', async () => {
+ const type = 'printer';
+ const stats = { total: 10 };
+
+ const result = await statsManager.sendStats(type, stats);
+
+ expect(result).toEqual({ success: true });
+ expect(natsServer.publish).toHaveBeenCalledWith('printers.stats', stats);
+ });
+
+ it('should handle errors when publishing fails', async () => {
+ natsServer.publish.mockRejectedValueOnce(new Error('NATS error'));
+
+ const result = await statsManager.sendStats('type', {});
+
+ expect(result).toHaveProperty('error', 'NATS error');
+ });
+ });
+
+ describe('removeAllListeners', () => {
+ it('should remove all subscriptions', async () => {
+ await statsManager.subscribeToStats('type1');
+ await statsManager.subscribeToStats('type2');
+
+ await statsManager.removeAllListeners();
+
+ expect(natsServer.removeSubscription).toHaveBeenCalledTimes(2);
+ expect(statsManager.subscriptions.size).toBe(0);
+ });
+ });
+});
diff --git a/src/templates/__tests__/templatemanager.test.js b/src/templates/__tests__/templatemanager.test.js
new file mode 100644
index 0000000..e027ef9
--- /dev/null
+++ b/src/templates/__tests__/templatemanager.test.js
@@ -0,0 +1,184 @@
+import { jest } from '@jest/globals';
+import path from 'path';
+
+// Mock fs before importing TemplateManager
+jest.unstable_mockModule('fs', () => ({
+ default: {
+ readFileSync: jest.fn(filePath => {
+ if (filePath.endsWith('basetemplate.ejs'))
+ return '<%- content %>';
+ if (filePath.endsWith('styles.css')) return 'body { color: red; }';
+ if (filePath.endsWith('previewtemplate.ejs'))
+ return '
<%- content %>
';
+ if (filePath.endsWith('rendertemplate.ejs'))
+ return '<%- content %>
';
+ if (filePath.endsWith('contentplaceholder.ejs'))
+ return '';
+ if (filePath.endsWith('previewpagination.js'))
+ return 'console.log("pagination");';
+ return '';
+ })
+ }
+}));
+
+jest.unstable_mockModule('ejs', () => ({
+ default: {
+ render: jest.fn(async (content, data) => `rendered: ${content}`),
+ compile: jest.fn(() => jest.fn())
+ }
+}));
+
+jest.unstable_mockModule('posthtml', () => ({
+ default: jest.fn(() => ({
+ process: jest.fn(async content => ({ html: `transformed: ${content}` }))
+ }))
+}));
+
+jest.unstable_mockModule('../../database/nats.js', () => ({
+ natsServer: {
+ publish: jest.fn().mockResolvedValue({ success: true }),
+ subscribe: jest.fn().mockResolvedValue({ success: true }),
+ removeSubscription: jest.fn().mockResolvedValue({ success: true })
+ }
+}));
+
+jest.unstable_mockModule('../../database/redis.js', () => ({
+ redisServer: {
+ setKey: jest.fn().mockResolvedValue(undefined),
+ getKey: jest.fn().mockResolvedValue(null),
+ deleteKey: jest.fn().mockResolvedValue(undefined),
+ getKeysByPattern: jest.fn().mockResolvedValue([])
+ }
+}));
+
+jest.unstable_mockModule('../../database/database.js', () => ({
+ getObject: jest.fn(),
+ listObjects: jest.fn()
+}));
+
+jest.unstable_mockModule(
+ '../../database/schemas/management/documenttemplate.schema.js',
+ () => ({
+ documentTemplateModel: { modelName: 'DocumentTemplate' }
+ })
+);
+
+jest.unstable_mockModule('../../utils.js', () => ({
+ getModelByName: jest.fn(() => ({
+ schema: {
+ obj: { name: {}, status: {} }
+ }
+ }))
+}));
+
+jest.unstable_mockModule('../pdffactory.js', () => ({
+ generatePDF: jest.fn().mockResolvedValue(Buffer.from('pdf-data'))
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn()
+ })
+ }
+}));
+
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: {
+ logLevel: 'info'
+ }
+ }))
+}));
+
+const { TemplateManager } = await import('../templatemanager.js');
+const { getObject } = await import('../../database/database.js');
+const ejs = (await import('ejs')).default;
+const { generatePDF } = await import('../pdffactory.js');
+
+describe('TemplateManager', () => {
+ let templateManager;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+ templateManager = new TemplateManager();
+ });
+
+ describe('renderTemplate', () => {
+ it('should render a template successfully', async () => {
+ const mockTemplate = {
+ documentSize: { width: 100, height: 100, infiniteHeight: false },
+ global: false,
+ objectType: 'printer'
+ };
+
+ getObject.mockResolvedValue(mockTemplate);
+
+ const result = await templateManager.renderTemplate(
+ 'temp-id',
+ 'some content',
+ { name: 'Test' }
+ );
+
+ expect(getObject).toHaveBeenCalledWith(
+ expect.objectContaining({ id: 'temp-id' })
+ );
+ expect(ejs.render).toHaveBeenCalled();
+ expect(result).toHaveProperty('html');
+ expect(result.width).toBe(100);
+ expect(result.height).toBe(100);
+ });
+
+ it('should return error if template not found', async () => {
+ getObject.mockResolvedValue(null);
+
+ const result = await templateManager.renderTemplate('invalid', 'content');
+
+ expect(result).toEqual({ error: 'Document template not found.' });
+ });
+ });
+
+ describe('validateTemplate', () => {
+ it('should return true for valid EJS', () => {
+ expect(templateManager.validateTemplate('<%= name %>
')).toBe(
+ true
+ );
+ });
+
+ it('should return false for invalid EJS', () => {
+ ejs.compile.mockImplementationOnce(() => {
+ throw new Error('syntax error');
+ });
+ expect(templateManager.validateTemplate('<% invalid %>')).toBe(false);
+ });
+ });
+
+ describe('renderPDF', () => {
+ it('should render a PDF successfully', async () => {
+ const mockTemplate = {
+ documentSize: { width: 100, height: 100, infiniteHeight: false },
+ global: false,
+ objectType: 'printer'
+ };
+ getObject.mockResolvedValue(mockTemplate);
+
+ const result = await templateManager.renderPDF('temp-id', 'content');
+
+ expect(generatePDF).toHaveBeenCalled();
+ expect(result.pdf).toBeDefined();
+ });
+ });
+
+ describe('formatDate', () => {
+ it('should format date correctly', () => {
+ const date = new Date('2023-01-01T12:00:00Z');
+ const formatted = templateManager.formatDate(date, 'YYYY-MM-DD');
+ expect(formatted).toBe('2023-01-01');
+ });
+ });
+});
diff --git a/src/updates/__tests__/updatemanager.test.js b/src/updates/__tests__/updatemanager.test.js
new file mode 100644
index 0000000..526872e
--- /dev/null
+++ b/src/updates/__tests__/updatemanager.test.js
@@ -0,0 +1,146 @@
+import { jest } from '@jest/globals';
+
+jest.unstable_mockModule('../../database/nats.js', () => ({
+ natsServer: {
+ subscribe: jest.fn().mockResolvedValue({ success: true }),
+ removeSubscription: jest.fn().mockResolvedValue({ success: true })
+ }
+}));
+
+jest.unstable_mockModule('log4js', () => ({
+ default: {
+ getLogger: () => ({
+ level: 'info',
+ debug: jest.fn(),
+ error: jest.fn(),
+ warn: jest.fn(),
+ trace: jest.fn(),
+ info: jest.fn()
+ })
+ }
+}));
+
+jest.unstable_mockModule('../../config.js', () => ({
+ loadConfig: jest.fn(() => ({
+ server: {
+ logLevel: 'info'
+ }
+ }))
+}));
+
+const { UpdateManager } = await import('../updatemanager.js');
+const { natsServer } = await import('../../database/nats.js');
+
+describe('UpdateManager', () => {
+ let mockSocketClient;
+ let updateManager;
+
+ beforeEach(() => {
+ jest.clearAllMocks();
+
+ mockSocketClient = {
+ socketId: 'test-socket-id',
+ socket: {
+ emit: jest.fn()
+ }
+ };
+
+ updateManager = new UpdateManager(mockSocketClient);
+ });
+
+ describe('subscribeToObjectNew', () => {
+ it('should subscribe to new object events and emit', async () => {
+ await updateManager.subscribeToObjectNew('printer');
+
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'printers.new',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+
+ const natsCallback = natsServer.subscribe.mock.calls[0][2];
+ const data = { name: 'New Printer' };
+ natsCallback('printers.new', data);
+
+ expect(mockSocketClient.socket.emit).toHaveBeenCalledWith('objectNew', {
+ object: data,
+ objectType: 'printer'
+ });
+ });
+ });
+
+ describe('subscribeToObjectDelete', () => {
+ it('should subscribe to delete events and emit', async () => {
+ await updateManager.subscribeToObjectDelete('printer');
+
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'printers.delete',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+
+ const natsCallback = natsServer.subscribe.mock.calls[0][2];
+ const data = { _id: '123' };
+ natsCallback('printers.delete', data);
+
+ expect(mockSocketClient.socket.emit).toHaveBeenCalledWith(
+ 'objectDelete',
+ {
+ object: data,
+ objectType: 'printer'
+ }
+ );
+ });
+ });
+
+ describe('subscribeToObjectUpdate', () => {
+ it('should subscribe to update events for specific object', async () => {
+ await updateManager.subscribeToObjectUpdate('123', 'printer');
+
+ expect(natsServer.subscribe).toHaveBeenCalledWith(
+ 'printers.123.object',
+ 'test-socket-id',
+ expect.any(Function)
+ );
+
+ const natsCallback = natsServer.subscribe.mock.calls[0][2];
+ const data = { status: 'idle' };
+ natsCallback('printers.123.object', data);
+
+ expect(mockSocketClient.socket.emit).toHaveBeenCalledWith(
+ 'objectUpdate',
+ {
+ _id: '123',
+ objectType: 'printer',
+ object: data
+ }
+ );
+ });
+ });
+
+ describe('remove methods', () => {
+ it('should remove new listener', async () => {
+ await updateManager.removeObjectNewListener('printer');
+ expect(natsServer.removeSubscription).toHaveBeenCalledWith(
+ 'printers.new',
+ 'test-socket-id'
+ );
+ });
+
+ it('should remove delete listener', async () => {
+ await updateManager.removeObjectDeleteListener('printer');
+ expect(natsServer.removeSubscription).toHaveBeenCalledWith(
+ 'printers.delete',
+ 'test-socket-id'
+ );
+ });
+
+ it('should remove update listener', async () => {
+ await updateManager.removeObjectUpdateListener('123', 'printer');
+ expect(natsServer.removeSubscription).toHaveBeenCalledWith(
+ 'printers.123.object',
+ 'test-socket-id'
+ );
+ });
+ });
+});
diff --git a/yarn.lock b/yarn.lock
index b02afa3..88e4ff0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,7 +2,7 @@
# yarn lockfile v1
-"@babel/code-frame@^7.0.0":
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1":
version "7.27.1"
resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz"
integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
@@ -11,11 +11,287 @@
js-tokens "^4.0.0"
picocolors "^1.1.1"
-"@babel/helper-validator-identifier@^7.27.1":
+"@babel/compat-data@^7.27.2":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f"
+ integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==
+
+"@babel/core@^7.23.9", "@babel/core@^7.27.4":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e"
+ integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.5"
+ "@babel/helper-compilation-targets" "^7.27.2"
+ "@babel/helper-module-transforms" "^7.28.3"
+ "@babel/helpers" "^7.28.4"
+ "@babel/parser" "^7.28.5"
+ "@babel/template" "^7.27.2"
+ "@babel/traverse" "^7.28.5"
+ "@babel/types" "^7.28.5"
+ "@jridgewell/remapping" "^2.3.5"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.27.5", "@babel/generator@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298"
+ integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==
+ dependencies:
+ "@babel/parser" "^7.28.5"
+ "@babel/types" "^7.28.5"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
+ jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d"
+ integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==
+ dependencies:
+ "@babel/compat-data" "^7.27.2"
+ "@babel/helper-validator-option" "^7.27.1"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-globals@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
+ integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
+
+"@babel/helper-module-imports@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204"
+ integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==
+ dependencies:
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
+
+"@babel/helper-module-transforms@^7.28.3":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6"
+ integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+ "@babel/traverse" "^7.28.3"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c"
+ integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==
+
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5":
version "7.28.5"
resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"
integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
+"@babel/helper-validator-option@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f"
+ integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
+
+"@babel/helpers@^7.28.4":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827"
+ integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==
+ dependencies:
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.4"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08"
+ integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==
+ dependencies:
+ "@babel/types" "^7.28.5"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07"
+ integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c"
+ integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18"
+ integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/template@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
+ integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/parser" "^7.27.2"
+ "@babel/types" "^7.27.1"
+
+"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b"
+ integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.5"
+ "@babel/helper-globals" "^7.28.0"
+ "@babel/parser" "^7.28.5"
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.5"
+ debug "^4.3.1"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5":
+ version "7.28.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b"
+ integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.28.5"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@emnapi/core@^1.4.3":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.7.1.tgz#3a79a02dbc84f45884a1806ebb98e5746bdfaac4"
+ integrity sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==
+ dependencies:
+ "@emnapi/wasi-threads" "1.1.0"
+ tslib "^2.4.0"
+
+"@emnapi/runtime@^1.4.3":
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.7.1.tgz#a73784e23f5d57287369c808197288b52276b791"
+ integrity sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==
+ dependencies:
+ tslib "^2.4.0"
+
+"@emnapi/wasi-threads@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf"
+ integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==
+ dependencies:
+ tslib "^2.4.0"
+
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.8.0":
version "4.9.0"
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz"
@@ -141,6 +417,288 @@
resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz"
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-30.2.0.tgz#c52fcd5b58fdd2e8eb66b2fd8ae56f2f64d05b28"
+ integrity sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==
+ dependencies:
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ chalk "^4.1.2"
+ jest-message-util "30.2.0"
+ jest-util "30.2.0"
+ slash "^3.0.0"
+
+"@jest/core@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-30.2.0.tgz#813d59faa5abd5510964a8b3a7b17cc77b775275"
+ integrity sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==
+ dependencies:
+ "@jest/console" "30.2.0"
+ "@jest/pattern" "30.0.1"
+ "@jest/reporters" "30.2.0"
+ "@jest/test-result" "30.2.0"
+ "@jest/transform" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ ansi-escapes "^4.3.2"
+ chalk "^4.1.2"
+ ci-info "^4.2.0"
+ exit-x "^0.2.2"
+ graceful-fs "^4.2.11"
+ jest-changed-files "30.2.0"
+ jest-config "30.2.0"
+ jest-haste-map "30.2.0"
+ jest-message-util "30.2.0"
+ jest-regex-util "30.0.1"
+ jest-resolve "30.2.0"
+ jest-resolve-dependencies "30.2.0"
+ jest-runner "30.2.0"
+ jest-runtime "30.2.0"
+ jest-snapshot "30.2.0"
+ jest-util "30.2.0"
+ jest-validate "30.2.0"
+ jest-watcher "30.2.0"
+ micromatch "^4.0.8"
+ pretty-format "30.2.0"
+ slash "^3.0.0"
+
+"@jest/diff-sequences@30.0.1":
+ version "30.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz#0ededeae4d071f5c8ffe3678d15f3a1be09156be"
+ integrity sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==
+
+"@jest/environment@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-30.2.0.tgz#1e673cdb8b93ded707cf6631b8353011460831fa"
+ integrity sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==
+ dependencies:
+ "@jest/fake-timers" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ jest-mock "30.2.0"
+
+"@jest/expect-utils@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-30.2.0.tgz#4f95413d4748454fdb17404bf1141827d15e6011"
+ integrity sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==
+ dependencies:
+ "@jest/get-type" "30.1.0"
+
+"@jest/expect@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-30.2.0.tgz#9a5968499bb8add2bbb09136f69f7df5ddbf3185"
+ integrity sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==
+ dependencies:
+ expect "30.2.0"
+ jest-snapshot "30.2.0"
+
+"@jest/fake-timers@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-30.2.0.tgz#0941ddc28a339b9819542495b5408622dc9e94ec"
+ integrity sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==
+ dependencies:
+ "@jest/types" "30.2.0"
+ "@sinonjs/fake-timers" "^13.0.0"
+ "@types/node" "*"
+ jest-message-util "30.2.0"
+ jest-mock "30.2.0"
+ jest-util "30.2.0"
+
+"@jest/get-type@30.1.0":
+ version "30.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/get-type/-/get-type-30.1.0.tgz#4fcb4dc2ebcf0811be1c04fd1cb79c2dba431cbc"
+ integrity sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==
+
+"@jest/globals@30.2.0", "@jest/globals@^30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-30.2.0.tgz#2f4b696d5862664b89c4ee2e49ae24d2bb7e0988"
+ integrity sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==
+ dependencies:
+ "@jest/environment" "30.2.0"
+ "@jest/expect" "30.2.0"
+ "@jest/types" "30.2.0"
+ jest-mock "30.2.0"
+
+"@jest/pattern@30.0.1":
+ version "30.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/pattern/-/pattern-30.0.1.tgz#d5304147f49a052900b4b853dedb111d080e199f"
+ integrity sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==
+ dependencies:
+ "@types/node" "*"
+ jest-regex-util "30.0.1"
+
+"@jest/reporters@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-30.2.0.tgz#a36b28fcbaf0c4595250b108e6f20e363348fd91"
+ integrity sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "30.2.0"
+ "@jest/test-result" "30.2.0"
+ "@jest/transform" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ "@types/node" "*"
+ chalk "^4.1.2"
+ collect-v8-coverage "^1.0.2"
+ exit-x "^0.2.2"
+ glob "^10.3.10"
+ graceful-fs "^4.2.11"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^6.0.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^5.0.0"
+ istanbul-reports "^3.1.3"
+ jest-message-util "30.2.0"
+ jest-util "30.2.0"
+ jest-worker "30.2.0"
+ slash "^3.0.0"
+ string-length "^4.0.2"
+ v8-to-istanbul "^9.0.1"
+
+"@jest/schemas@30.0.5":
+ version "30.0.5"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-30.0.5.tgz#7bdf69fc5a368a5abdb49fd91036c55225846473"
+ integrity sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==
+ dependencies:
+ "@sinclair/typebox" "^0.34.0"
+
+"@jest/snapshot-utils@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz#387858eb90c2f98f67bff327435a532ac5309fbe"
+ integrity sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==
+ dependencies:
+ "@jest/types" "30.2.0"
+ chalk "^4.1.2"
+ graceful-fs "^4.2.11"
+ natural-compare "^1.4.0"
+
+"@jest/source-map@30.0.1":
+ version "30.0.1"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-30.0.1.tgz#305ebec50468f13e658b3d5c26f85107a5620aaa"
+ integrity sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.25"
+ callsites "^3.1.0"
+ graceful-fs "^4.2.11"
+
+"@jest/test-result@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-30.2.0.tgz#9c0124377fb7996cdffb86eda3dbc56eacab363d"
+ integrity sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==
+ dependencies:
+ "@jest/console" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/istanbul-lib-coverage" "^2.0.6"
+ collect-v8-coverage "^1.0.2"
+
+"@jest/test-sequencer@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz#bf0066bc72e176d58f5dfa7f212b6e7eee44f221"
+ integrity sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==
+ dependencies:
+ "@jest/test-result" "30.2.0"
+ graceful-fs "^4.2.11"
+ jest-haste-map "30.2.0"
+ slash "^3.0.0"
+
+"@jest/transform@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-30.2.0.tgz#54bef1a4510dcbd58d5d4de4fe2980a63077ef2a"
+ integrity sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==
+ dependencies:
+ "@babel/core" "^7.27.4"
+ "@jest/types" "30.2.0"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ babel-plugin-istanbul "^7.0.1"
+ chalk "^4.1.2"
+ convert-source-map "^2.0.0"
+ fast-json-stable-stringify "^2.1.0"
+ graceful-fs "^4.2.11"
+ jest-haste-map "30.2.0"
+ jest-regex-util "30.0.1"
+ jest-util "30.2.0"
+ micromatch "^4.0.8"
+ pirates "^4.0.7"
+ slash "^3.0.0"
+ write-file-atomic "^5.0.1"
+
+"@jest/types@30.2.0":
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-30.2.0.tgz#1c678a7924b8f59eafd4c77d56b6d0ba976d62b8"
+ integrity sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==
+ dependencies:
+ "@jest/pattern" "30.0.1"
+ "@jest/schemas" "30.0.5"
+ "@types/istanbul-lib-coverage" "^2.0.6"
+ "@types/istanbul-reports" "^3.0.4"
+ "@types/node" "*"
+ "@types/yargs" "^17.0.33"
+ chalk "^4.1.2"
+
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/remapping@^2.3.5":
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1"
+ integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
+"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.31"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0"
+ integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
"@mongodb-js/saslprep@^1.3.0":
version "1.3.2"
resolved "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.2.tgz"
@@ -148,6 +706,15 @@
dependencies:
sparse-bitfield "^3.0.3"
+"@napi-rs/wasm-runtime@^0.2.11":
+ version "0.2.12"
+ resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz#3e78a8b96e6c33a6c517e1894efbd5385a7cb6f2"
+ integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==
+ dependencies:
+ "@emnapi/core" "^1.4.3"
+ "@emnapi/runtime" "^1.4.3"
+ "@tybys/wasm-util" "^0.10.0"
+
"@nats-io/nats-core@3.2.0", "@nats-io/nats-core@^3.2.0":
version "3.2.0"
resolved "https://registry.npmjs.org/@nats-io/nats-core/-/nats-core-3.2.0.tgz"
@@ -177,6 +744,11 @@
"@nats-io/nkeys" "2.0.3"
"@nats-io/nuid" "2.0.3"
+"@noble/hashes@^1.1.5":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a"
+ integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
@@ -198,6 +770,18 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
+"@paralleldrive/cuid2@^2.2.2":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz#3d62ea9e7be867d3fa94b9897fab5b0ae187d784"
+ integrity sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==
+ dependencies:
+ "@noble/hashes" "^1.1.5"
+
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
"@pkgr/core@^0.2.9":
version "0.2.9"
resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz"
@@ -248,6 +832,25 @@
resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz"
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
+"@sinclair/typebox@^0.34.0":
+ version "0.34.45"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.45.tgz#6c0426b584c74d57625ed6b180ac59a62f139f7c"
+ integrity sha512-qJcFVfCa5jxBFSuv7S5WYbA8XdeCPmhnaVVfX/2Y6L8WYg8sk3XY2+6W0zH+3mq1Cz+YC7Ki66HfqX6IHAwnkg==
+
+"@sinonjs/commons@^3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd"
+ integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^13.0.0":
+ version "13.0.5"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5"
+ integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==
+ dependencies:
+ "@sinonjs/commons" "^3.0.1"
+
"@socket.io/component-emitter@~3.1.0":
version "3.1.2"
resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz"
@@ -258,6 +861,46 @@
resolved "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz"
integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==
+"@tybys/wasm-util@^0.10.0":
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414"
+ integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==
+ dependencies:
+ tslib "^2.4.0"
+
+"@types/babel__core@^7.20.5":
+ version "7.20.5"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.27.0"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9"
+ integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74"
+ integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==
+ dependencies:
+ "@babel/types" "^7.28.2"
+
"@types/cors@^2.8.12":
version "2.8.19"
resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz"
@@ -270,6 +913,25 @@
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.1", "@types/istanbul-lib-coverage@^2.0.6":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+ integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf"
+ integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.4":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54"
+ integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
"@types/json-schema@^7.0.15":
version "7.0.15"
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
@@ -287,6 +949,11 @@
dependencies:
undici-types "~7.16.0"
+"@types/stack-utils@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
+ integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
+
"@types/webidl-conversions@*":
version "7.0.3"
resolved "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz"
@@ -299,6 +966,18 @@
dependencies:
"@types/webidl-conversions" "*"
+"@types/yargs-parser@*":
+ version "21.0.3"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
+
+"@types/yargs@^17.0.33":
+ version "17.0.35"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24"
+ integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==
+ dependencies:
+ "@types/yargs-parser" "*"
+
"@types/yauzl@^2.9.1":
version "2.10.3"
resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz"
@@ -306,11 +985,108 @@
dependencies:
"@types/node" "*"
-"@ungap/structured-clone@^1.2.0":
+"@ungap/structured-clone@^1.2.0", "@ungap/structured-clone@^1.3.0":
version "1.3.0"
resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz"
integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==
+"@unrs/resolver-binding-android-arm-eabi@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz#9f5b04503088e6a354295e8ea8fe3cb99e43af81"
+ integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==
+
+"@unrs/resolver-binding-android-arm64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz#7414885431bd7178b989aedc4d25cccb3865bc9f"
+ integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==
+
+"@unrs/resolver-binding-darwin-arm64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz#b4a8556f42171fb9c9f7bac8235045e82aa0cbdf"
+ integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==
+
+"@unrs/resolver-binding-darwin-x64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz#fd4d81257b13f4d1a083890a6a17c00de571f0dc"
+ integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==
+
+"@unrs/resolver-binding-freebsd-x64@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz#d2513084d0f37c407757e22f32bd924a78cfd99b"
+ integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==
+
+"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz#844d2605d057488d77fab09705f2866b86164e0a"
+ integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==
+
+"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz#204892995cefb6bd1d017d52d097193bc61ddad3"
+ integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==
+
+"@unrs/resolver-binding-linux-arm64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz#023eb0c3aac46066a10be7a3f362e7b34f3bdf9d"
+ integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==
+
+"@unrs/resolver-binding-linux-arm64-musl@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz#9e6f9abb06424e3140a60ac996139786f5d99be0"
+ integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==
+
+"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz#b111417f17c9d1b02efbec8e08398f0c5527bb44"
+ integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==
+
+"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz#92ffbf02748af3e99873945c9a8a5ead01d508a9"
+ integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==
+
+"@unrs/resolver-binding-linux-riscv64-musl@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz#0bec6f1258fc390e6b305e9ff44256cb207de165"
+ integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==
+
+"@unrs/resolver-binding-linux-s390x-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz#577843a084c5952f5906770633ccfb89dac9bc94"
+ integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==
+
+"@unrs/resolver-binding-linux-x64-gnu@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz#36fb318eebdd690f6da32ac5e0499a76fa881935"
+ integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==
+
+"@unrs/resolver-binding-linux-x64-musl@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz#bfb9af75f783f98f6a22c4244214efe4df1853d6"
+ integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==
+
+"@unrs/resolver-binding-wasm32-wasi@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz#752c359dd875684b27429500d88226d7cc72f71d"
+ integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==
+ dependencies:
+ "@napi-rs/wasm-runtime" "^0.2.11"
+
+"@unrs/resolver-binding-win32-arm64-msvc@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz#ce5735e600e4c2fbb409cd051b3b7da4a399af35"
+ integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==
+
+"@unrs/resolver-binding-win32-ia32-msvc@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz#72fc57bc7c64ec5c3de0d64ee0d1810317bc60a6"
+ integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==
+
+"@unrs/resolver-binding-win32-x64-msvc@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz#538b1e103bf8d9864e7b85cc96fa8d6fb6c40777"
+ integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==
+
accepts@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz"
@@ -352,11 +1128,23 @@ ajv@^6.12.4:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+ansi-escapes@^4.3.2:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+ansi-regex@^6.0.1:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1"
+ integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==
+
ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
@@ -364,7 +1152,17 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
-anymatch@~3.1.2:
+ansi-styles@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+ansi-styles@^6.1.0:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041"
+ integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==
+
+anymatch@^3.1.3, anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
@@ -372,6 +1170,13 @@ anymatch@~3.1.2:
normalize-path "^3.0.0"
picomatch "^2.0.4"
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
@@ -468,6 +1273,11 @@ arraybuffer.prototype.slice@^1.0.4:
get-intrinsic "^1.2.6"
is-array-buffer "^3.0.4"
+asap@^2.0.0:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
+
ast-types@^0.13.4:
version "0.13.4"
resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz"
@@ -511,6 +1321,66 @@ b4a@^1.6.4:
resolved "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz"
integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==
+babel-jest@30.2.0, babel-jest@^30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-30.2.0.tgz#fd44a1ec9552be35ead881f7381faa7d8f3b95ac"
+ integrity sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==
+ dependencies:
+ "@jest/transform" "30.2.0"
+ "@types/babel__core" "^7.20.5"
+ babel-plugin-istanbul "^7.0.1"
+ babel-preset-jest "30.2.0"
+ chalk "^4.1.2"
+ graceful-fs "^4.2.11"
+ slash "^3.0.0"
+
+babel-plugin-istanbul@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz#d8b518c8ea199364cf84ccc82de89740236daf92"
+ integrity sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.3"
+ istanbul-lib-instrument "^6.0.2"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz#94c250d36b43f95900f3a219241e0f4648191ce2"
+ integrity sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==
+ dependencies:
+ "@types/babel__core" "^7.20.5"
+
+babel-preset-current-node-syntax@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6"
+ integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+
+babel-preset-jest@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz#04717843e561347781d6d7f69c81e6bcc3ed11ce"
+ integrity sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==
+ dependencies:
+ babel-plugin-jest-hoist "30.2.0"
+ babel-preset-current-node-syntax "^1.2.0"
+
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
@@ -568,6 +1438,11 @@ base64id@2.0.0, base64id@~2.0.0:
resolved "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz"
integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
+baseline-browser-mapping@^2.9.0:
+ version "2.9.11"
+ resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz#53724708c8db5f97206517ecfe362dbe5181deea"
+ integrity sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==
+
basic-ftp@^5.0.2:
version "5.0.5"
resolved "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz"
@@ -616,13 +1491,31 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
-braces@~3.0.2:
+braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.1.1"
+browserslist@^4.24.0:
+ version "4.28.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95"
+ integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
+ dependencies:
+ baseline-browser-mapping "^2.9.0"
+ caniuse-lite "^1.0.30001759"
+ electron-to-chromium "^1.5.263"
+ node-releases "^2.0.27"
+ update-browserslist-db "^1.2.0"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
bson@^6.10.4:
version "6.10.4"
resolved "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz"
@@ -643,6 +1536,11 @@ buffer-equal-constant-time@^1.0.1:
resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz"
integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
buffer-shims@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz"
@@ -686,17 +1584,32 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
call-bind-apply-helpers "^1.0.2"
get-intrinsic "^1.3.0"
-callsites@^3.0.0:
+callsites@^3.0.0, callsites@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001759:
+ version "1.0.30001761"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz#4ca4c6e3792b24e8e2214baa568fc0e43de28191"
+ integrity sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==
+
canonical-json@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/canonical-json/-/canonical-json-0.2.0.tgz"
integrity sha512-xeH/NgtNA7kIuKSxopJVdXqCKWyDB79aqxQRQ9FV02fvmqW7DSnjoFyzAUrBpfbwjU6lwTYOLc+HM6KupbsfVQ==
-chalk@^4.0.0:
+chalk@^4.0.0, chalk@^4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -704,6 +1617,11 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
chokidar@^3.5.2:
version "3.6.0"
resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
@@ -727,6 +1645,16 @@ chromium-bidi@11.0.0:
mitt "^3.0.1"
zod "^3.24.1"
+ci-info@^4.2.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.1.tgz#355ad571920810b5623e11d40232f443f16f1daa"
+ integrity sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==
+
+cjs-module-lexer@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-2.1.1.tgz#bff23b0609cc9afa428bd35f1918f7d03b448562"
+ integrity sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==
+
cliui@^8.0.1:
version "8.0.1"
resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz"
@@ -746,6 +1674,16 @@ cluster-key-slot@1.1.2:
resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz"
integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+collect-v8-coverage@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz#cc1f01eb8d02298cbc9a437c74c70ab4e5210b80"
+ integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==
+
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
@@ -765,6 +1703,11 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
+component-emitter@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
+ integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
+
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
@@ -782,6 +1725,11 @@ content-type@^1.0.5:
resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
cookie-signature@^1.2.1:
version "1.2.2"
resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz"
@@ -792,6 +1740,11 @@ cookie@^0.7.1, cookie@~0.7.2:
resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz"
integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==
+cookiejar@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b"
+ integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==
+
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
@@ -815,7 +1768,7 @@ cosmiconfig@^9.0.0:
js-yaml "^4.1.0"
parse-json "^5.2.0"
-cross-spawn@^7.0.2, cross-spawn@^7.0.6:
+cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6:
version "7.0.6"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
@@ -878,7 +1831,7 @@ debug@2.6.9:
dependencies:
ms "2.0.0"
-debug@4, debug@4.x, debug@^4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.3:
+debug@4, debug@4.x, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@^4.4.3:
version "4.4.3"
resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
@@ -899,11 +1852,21 @@ debug@~4.3.1, debug@~4.3.2, debug@~4.3.4:
dependencies:
ms "^2.1.3"
+dedent@^1.6.0:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.7.1.tgz#364661eea3d73f3faba7089214420ec2f8f13e15"
+ integrity sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==
+
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+deepmerge@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
define-data-property@^1.0.1, define-data-property@^1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz"
@@ -941,11 +1904,24 @@ depd@2.0.0, depd@^2.0.0:
resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+detect-newline@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
devtools-protocol@0.0.1521046:
version "0.0.1521046"
resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz"
integrity sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==
+dezalgo@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81"
+ integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==
+ dependencies:
+ asap "^2.0.0"
+ wrappy "1"
+
doctrine@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz"
@@ -1004,6 +1980,11 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1:
es-errors "^1.3.0"
gopd "^1.2.0"
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
ecdsa-sig-formatter@1.0.11:
version "1.0.11"
resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz"
@@ -1023,11 +2004,26 @@ ejs@^3.1.10:
dependencies:
jake "^10.8.5"
+electron-to-chromium@^1.5.263:
+ version "1.5.267"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz#5d84f2df8cdb6bfe7e873706bb21bd4bfb574dc7"
+ integrity sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==
+
+emittery@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
+ integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==
+
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
encodeurl@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz"
@@ -1212,7 +2208,7 @@ es6-promise@3.2.1:
resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz"
integrity sha512-oj4jOSXvWglTsc3wrw86iom3LDPOx1nbipQk+jaG3dy+sMRM6ReSgVr/VlmBuF6lXUrflN9DCcQHeSbAwGUl4g==
-escalade@^3.1.1:
+escalade@^3.1.1, escalade@^3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
@@ -1222,6 +2218,11 @@ escape-html@^1.0.3:
resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
@@ -1505,7 +2506,7 @@ espree@^9.6.0, espree@^9.6.1:
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.4.1"
-esprima@^4.0.1:
+esprima@^4.0.0, esprima@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
@@ -1546,6 +2547,38 @@ events-universal@^1.0.0:
dependencies:
bare-events "^2.7.0"
+execa@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+exit-x@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/exit-x/-/exit-x-0.2.2.tgz#1f9052de3b8d99a696b10dad5bced9bdd5c3aa64"
+ integrity sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==
+
+expect@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-30.2.0.tgz#d4013bed267013c14bc1199cec8aa57cee9b5869"
+ integrity sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==
+ dependencies:
+ "@jest/expect-utils" "30.2.0"
+ "@jest/get-type" "30.1.0"
+ jest-matcher-utils "30.2.0"
+ jest-message-util "30.2.0"
+ jest-mock "30.2.0"
+ jest-util "30.2.0"
+
express@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/express/-/express-5.1.0.tgz"
@@ -1605,7 +2638,7 @@ fast-fifo@^1.2.0, fast-fifo@^1.3.2:
resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz"
integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
-fast-json-stable-stringify@^2.0.0:
+fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
@@ -1615,6 +2648,11 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+fast-safe-stringify@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
+ integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
+
fastq@^1.6.0:
version "1.19.1"
resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz"
@@ -1622,6 +2660,13 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
+fb-watchman@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
+ integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
+ dependencies:
+ bser "2.1.1"
+
fd-slicer@~1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz"
@@ -1676,6 +2721,14 @@ find-up@^3.0.0:
dependencies:
locate-path "^3.0.0"
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
@@ -1718,6 +2771,14 @@ for-each@^0.3.3, for-each@^0.3.5:
dependencies:
is-callable "^1.2.7"
+foreground-child@^3.1.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
+ integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
+ dependencies:
+ cross-spawn "^7.0.6"
+ signal-exit "^4.0.1"
+
form-data@^4.0.4:
version "4.0.4"
resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz"
@@ -1729,6 +2790,15 @@ form-data@^4.0.4:
hasown "^2.0.2"
mime-types "^2.1.12"
+formidable@^3.5.4:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-3.5.4.tgz#ac9a593b951e829b3298f21aa9a2243932f32ed9"
+ integrity sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==
+ dependencies:
+ "@paralleldrive/cuid2" "^2.2.2"
+ dezalgo "^1.0.4"
+ once "^1.4.0"
+
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"
@@ -1753,7 +2823,7 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-fsevents@~2.3.2:
+fsevents@^2.3.3, fsevents@~2.3.2:
version "2.3.3"
resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
@@ -1785,6 +2855,11 @@ generator-function@^2.0.0:
resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz"
integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
@@ -1806,6 +2881,11 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@
hasown "^2.0.2"
math-intrinsics "^1.1.0"
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
get-proto@^1.0.0, get-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz"
@@ -1826,6 +2906,11 @@ get-stream@^5.1.0:
dependencies:
pump "^3.0.0"
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
get-symbol-description@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz"
@@ -1858,7 +2943,19 @@ glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
-glob@^7.1.3:
+glob@^10.3.10:
+ version "10.5.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c"
+ integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^3.1.2"
+ minimatch "^9.0.4"
+ minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
+ path-scurry "^1.11.1"
+
+glob@^7.1.3, glob@^7.1.4:
version "7.2.3"
resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -1895,7 +2992,7 @@ gopd@^1.0.1, gopd@^1.2.0:
resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
-graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11:
version "4.2.11"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -1958,6 +3055,11 @@ he@^1.2.0:
resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
htmlparser2@^7.1.1:
version "7.2.0"
resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz"
@@ -1995,6 +3097,11 @@ https-proxy-agent@^7.0.6:
agent-base "^7.1.2"
debug "4"
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
iconv-lite@0.7.0:
version "0.7.0"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz"
@@ -2027,6 +3134,14 @@ import-fresh@^3.2.1, import-fresh@^3.3.0:
parent-module "^1.0.0"
resolve-from "^4.0.0"
+import-local@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+ integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
@@ -2157,6 +3272,11 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+is-generator-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
is-generator-function@^1.0.10:
version "1.1.2"
resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz"
@@ -2235,6 +3355,11 @@ is-shared-array-buffer@^1.0.4:
dependencies:
call-bound "^1.0.3"
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
is-string@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz"
@@ -2294,6 +3419,48 @@ isexe@^2.0.0:
resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
+
+istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765"
+ integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==
+ dependencies:
+ "@babel/core" "^7.23.9"
+ "@babel/parser" "^7.23.9"
+ "@istanbuljs/schema" "^0.1.3"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^7.5.4"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^5.0.0:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz#acaef948df7747c8eb5fbf1265cb980f6353a441"
+ integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.23"
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+
+istanbul-reports@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93"
+ integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
iterator.prototype@^1.1.4:
version "1.1.5"
resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz"
@@ -2306,6 +3473,15 @@ iterator.prototype@^1.1.4:
has-symbols "^1.1.0"
set-function-name "^2.0.2"
+jackspeak@^3.1.2:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
+ integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
jake@^10.8.5:
version "10.9.4"
resolved "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz"
@@ -2315,11 +3491,385 @@ jake@^10.8.5:
filelist "^1.0.4"
picocolors "^1.1.1"
+jest-changed-files@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-30.2.0.tgz#602266e478ed554e1e1469944faa7efd37cee61c"
+ integrity sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==
+ dependencies:
+ execa "^5.1.1"
+ jest-util "30.2.0"
+ p-limit "^3.1.0"
+
+jest-circus@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-30.2.0.tgz#98b8198b958748a2f322354311023d1d02e7603f"
+ integrity sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==
+ dependencies:
+ "@jest/environment" "30.2.0"
+ "@jest/expect" "30.2.0"
+ "@jest/test-result" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ chalk "^4.1.2"
+ co "^4.6.0"
+ dedent "^1.6.0"
+ is-generator-fn "^2.1.0"
+ jest-each "30.2.0"
+ jest-matcher-utils "30.2.0"
+ jest-message-util "30.2.0"
+ jest-runtime "30.2.0"
+ jest-snapshot "30.2.0"
+ jest-util "30.2.0"
+ p-limit "^3.1.0"
+ pretty-format "30.2.0"
+ pure-rand "^7.0.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.6"
+
+jest-cli@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-30.2.0.tgz#1780f8e9d66bf84a10b369aea60aeda7697dcc67"
+ integrity sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==
+ dependencies:
+ "@jest/core" "30.2.0"
+ "@jest/test-result" "30.2.0"
+ "@jest/types" "30.2.0"
+ chalk "^4.1.2"
+ exit-x "^0.2.2"
+ import-local "^3.2.0"
+ jest-config "30.2.0"
+ jest-util "30.2.0"
+ jest-validate "30.2.0"
+ yargs "^17.7.2"
+
+jest-config@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-30.2.0.tgz#29df8c50e2ad801cc59c406b50176c18c362a90b"
+ integrity sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==
+ dependencies:
+ "@babel/core" "^7.27.4"
+ "@jest/get-type" "30.1.0"
+ "@jest/pattern" "30.0.1"
+ "@jest/test-sequencer" "30.2.0"
+ "@jest/types" "30.2.0"
+ babel-jest "30.2.0"
+ chalk "^4.1.2"
+ ci-info "^4.2.0"
+ deepmerge "^4.3.1"
+ glob "^10.3.10"
+ graceful-fs "^4.2.11"
+ jest-circus "30.2.0"
+ jest-docblock "30.2.0"
+ jest-environment-node "30.2.0"
+ jest-regex-util "30.0.1"
+ jest-resolve "30.2.0"
+ jest-runner "30.2.0"
+ jest-util "30.2.0"
+ jest-validate "30.2.0"
+ micromatch "^4.0.8"
+ parse-json "^5.2.0"
+ pretty-format "30.2.0"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-30.2.0.tgz#e3ec3a6ea5c5747f605c9e874f83d756cba36825"
+ integrity sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==
+ dependencies:
+ "@jest/diff-sequences" "30.0.1"
+ "@jest/get-type" "30.1.0"
+ chalk "^4.1.2"
+ pretty-format "30.2.0"
+
+jest-docblock@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-30.2.0.tgz#42cd98d69f887e531c7352309542b1ce4ee10256"
+ integrity sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==
+ dependencies:
+ detect-newline "^3.1.0"
+
+jest-each@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-30.2.0.tgz#39e623ae71641c2ac3ee69b3ba3d258fce8e768d"
+ integrity sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==
+ dependencies:
+ "@jest/get-type" "30.1.0"
+ "@jest/types" "30.2.0"
+ chalk "^4.1.2"
+ jest-util "30.2.0"
+ pretty-format "30.2.0"
+
+jest-environment-node@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-30.2.0.tgz#3def7980ebd2fd86e74efd4d2e681f55ab38da0f"
+ integrity sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==
+ dependencies:
+ "@jest/environment" "30.2.0"
+ "@jest/fake-timers" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ jest-mock "30.2.0"
+ jest-util "30.2.0"
+ jest-validate "30.2.0"
+
+jest-haste-map@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-30.2.0.tgz#808e3889f288603ac70ff0ac047598345a66022e"
+ integrity sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==
+ dependencies:
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ anymatch "^3.1.3"
+ fb-watchman "^2.0.2"
+ graceful-fs "^4.2.11"
+ jest-regex-util "30.0.1"
+ jest-util "30.2.0"
+ jest-worker "30.2.0"
+ micromatch "^4.0.8"
+ walker "^1.0.8"
+ optionalDependencies:
+ fsevents "^2.3.3"
+
+jest-junit@^16.0.0:
+ version "16.0.0"
+ resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-16.0.0.tgz#d838e8c561cf9fdd7eb54f63020777eee4136785"
+ integrity sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==
+ dependencies:
+ mkdirp "^1.0.4"
+ strip-ansi "^6.0.1"
+ uuid "^8.3.2"
+ xml "^1.0.1"
+
+jest-leak-detector@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz#292fdca7b7c9cf594e1e570ace140b01d8beb736"
+ integrity sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==
+ dependencies:
+ "@jest/get-type" "30.1.0"
+ pretty-format "30.2.0"
+
+jest-matcher-utils@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz#69a0d4c271066559ec8b0d8174829adc3f23a783"
+ integrity sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==
+ dependencies:
+ "@jest/get-type" "30.1.0"
+ chalk "^4.1.2"
+ jest-diff "30.2.0"
+ pretty-format "30.2.0"
+
+jest-message-util@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-30.2.0.tgz#fc97bf90d11f118b31e6131e2b67fc4f39f92152"
+ integrity sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@jest/types" "30.2.0"
+ "@types/stack-utils" "^2.0.3"
+ chalk "^4.1.2"
+ graceful-fs "^4.2.11"
+ micromatch "^4.0.8"
+ pretty-format "30.2.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.6"
+
+jest-mock@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-30.2.0.tgz#69f991614eeb4060189459d3584f710845bff45e"
+ integrity sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==
+ dependencies:
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ jest-util "30.2.0"
+
+jest-pnp-resolver@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
+ integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
+
+jest-regex-util@30.0.1:
+ version "30.0.1"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-30.0.1.tgz#f17c1de3958b67dfe485354f5a10093298f2a49b"
+ integrity sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==
+
+jest-resolve-dependencies@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz#3370e2c0b49cc560f6a7e8ec3a59dd99525e1a55"
+ integrity sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==
+ dependencies:
+ jest-regex-util "30.0.1"
+ jest-snapshot "30.2.0"
+
+jest-resolve@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-30.2.0.tgz#2e2009cbd61e8f1f003355d5ec87225412cebcd7"
+ integrity sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==
+ dependencies:
+ chalk "^4.1.2"
+ graceful-fs "^4.2.11"
+ jest-haste-map "30.2.0"
+ jest-pnp-resolver "^1.2.3"
+ jest-util "30.2.0"
+ jest-validate "30.2.0"
+ slash "^3.0.0"
+ unrs-resolver "^1.7.11"
+
+jest-runner@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-30.2.0.tgz#c62b4c3130afa661789705e13a07bdbcec26a114"
+ integrity sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==
+ dependencies:
+ "@jest/console" "30.2.0"
+ "@jest/environment" "30.2.0"
+ "@jest/test-result" "30.2.0"
+ "@jest/transform" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ chalk "^4.1.2"
+ emittery "^0.13.1"
+ exit-x "^0.2.2"
+ graceful-fs "^4.2.11"
+ jest-docblock "30.2.0"
+ jest-environment-node "30.2.0"
+ jest-haste-map "30.2.0"
+ jest-leak-detector "30.2.0"
+ jest-message-util "30.2.0"
+ jest-resolve "30.2.0"
+ jest-runtime "30.2.0"
+ jest-util "30.2.0"
+ jest-watcher "30.2.0"
+ jest-worker "30.2.0"
+ p-limit "^3.1.0"
+ source-map-support "0.5.13"
+
+jest-runtime@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-30.2.0.tgz#395ea792cde048db1b0cd1a92dc9cb9f1921bf8a"
+ integrity sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==
+ dependencies:
+ "@jest/environment" "30.2.0"
+ "@jest/fake-timers" "30.2.0"
+ "@jest/globals" "30.2.0"
+ "@jest/source-map" "30.0.1"
+ "@jest/test-result" "30.2.0"
+ "@jest/transform" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ chalk "^4.1.2"
+ cjs-module-lexer "^2.1.0"
+ collect-v8-coverage "^1.0.2"
+ glob "^10.3.10"
+ graceful-fs "^4.2.11"
+ jest-haste-map "30.2.0"
+ jest-message-util "30.2.0"
+ jest-mock "30.2.0"
+ jest-regex-util "30.0.1"
+ jest-resolve "30.2.0"
+ jest-snapshot "30.2.0"
+ jest-util "30.2.0"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-snapshot@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-30.2.0.tgz#266fbbb4b95fc4665ce6f32f1f38eeb39f4e26d0"
+ integrity sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==
+ dependencies:
+ "@babel/core" "^7.27.4"
+ "@babel/generator" "^7.27.5"
+ "@babel/plugin-syntax-jsx" "^7.27.1"
+ "@babel/plugin-syntax-typescript" "^7.27.1"
+ "@babel/types" "^7.27.3"
+ "@jest/expect-utils" "30.2.0"
+ "@jest/get-type" "30.1.0"
+ "@jest/snapshot-utils" "30.2.0"
+ "@jest/transform" "30.2.0"
+ "@jest/types" "30.2.0"
+ babel-preset-current-node-syntax "^1.2.0"
+ chalk "^4.1.2"
+ expect "30.2.0"
+ graceful-fs "^4.2.11"
+ jest-diff "30.2.0"
+ jest-matcher-utils "30.2.0"
+ jest-message-util "30.2.0"
+ jest-util "30.2.0"
+ pretty-format "30.2.0"
+ semver "^7.7.2"
+ synckit "^0.11.8"
+
+jest-util@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-30.2.0.tgz#5142adbcad6f4e53c2776c067a4db3c14f913705"
+ integrity sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==
+ dependencies:
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ chalk "^4.1.2"
+ ci-info "^4.2.0"
+ graceful-fs "^4.2.11"
+ picomatch "^4.0.2"
+
+jest-validate@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-30.2.0.tgz#273eaaed4c0963b934b5b31e96289edda6e0a2ef"
+ integrity sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==
+ dependencies:
+ "@jest/get-type" "30.1.0"
+ "@jest/types" "30.2.0"
+ camelcase "^6.3.0"
+ chalk "^4.1.2"
+ leven "^3.1.0"
+ pretty-format "30.2.0"
+
+jest-watcher@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-30.2.0.tgz#f9c055de48e18c979e7756a3917e596e2d69b07b"
+ integrity sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==
+ dependencies:
+ "@jest/test-result" "30.2.0"
+ "@jest/types" "30.2.0"
+ "@types/node" "*"
+ ansi-escapes "^4.3.2"
+ chalk "^4.1.2"
+ emittery "^0.13.1"
+ jest-util "30.2.0"
+ string-length "^4.0.2"
+
+jest-worker@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-30.2.0.tgz#fd5c2a36ff6058ec8f74366ec89538cc99539d26"
+ integrity sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==
+ dependencies:
+ "@types/node" "*"
+ "@ungap/structured-clone" "^1.3.0"
+ jest-util "30.2.0"
+ merge-stream "^2.0.0"
+ supports-color "^8.1.1"
+
+jest@^30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-30.2.0.tgz#9f0a71e734af968f26952b5ae4b724af82681630"
+ integrity sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==
+ dependencies:
+ "@jest/core" "30.2.0"
+ "@jest/types" "30.2.0"
+ import-local "^3.2.0"
+ jest-cli "30.2.0"
+
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+js-yaml@^3.13.1:
+ version "3.14.2"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0"
+ integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
js-yaml@^4.1.0:
version "4.1.1"
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz"
@@ -2327,6 +3877,11 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
json-buffer@3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
@@ -2359,6 +3914,11 @@ json5@^1.0.2:
dependencies:
minimist "^1.2.0"
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
jsonfile@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
@@ -2437,6 +3997,11 @@ keyv@^4.5.3, keyv@^4.5.4:
dependencies:
json-buffer "3.0.1"
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
levn@^0.4.1:
version "0.4.1"
resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
@@ -2469,6 +4034,13 @@ locate-path@^3.0.0:
p-locate "^3.0.0"
path-exists "^3.0.0"
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
locate-path@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
@@ -2539,11 +4111,37 @@ loose-envify@^1.4.0:
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
+lru-cache@^10.2.0:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
lru-cache@^7.14.1:
version "7.18.3"
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz"
integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
math-intrinsics@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
@@ -2564,6 +4162,24 @@ merge-descriptors@^2.0.0:
resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz"
integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+methods@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+micromatch@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
@@ -2588,7 +4204,17 @@ mime-types@^3.0.0, mime-types@^3.0.1:
dependencies:
mime-db "^1.54.0"
-minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+mime@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -2602,16 +4228,33 @@ minimatch@^5.0.1:
dependencies:
brace-expansion "^2.0.1"
+minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
minimist@^1.2.0, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
+ integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+
mitt@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz"
integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
+mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
mongodb-connection-string-url@^3.0.2:
version "3.0.2"
resolved "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz"
@@ -2714,6 +4357,11 @@ nanoid@^5.1.6:
resolved "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz"
integrity sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==
+napi-postinstall@^0.3.0:
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz#7af256d6588b5f8e952b9190965d6b019653bbb9"
+ integrity sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==
+
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
@@ -2741,6 +4389,16 @@ node-cache@^5.1.2:
dependencies:
clone "2.x"
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
+
+node-releases@^2.0.27:
+ version "2.0.27"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e"
+ integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==
+
nodemon@^3.1.11:
version "3.1.11"
resolved "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz"
@@ -2762,6 +4420,13 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
object-assign@^4, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
@@ -2852,6 +4517,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
optionator@^0.9.3:
version "0.9.4"
resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
@@ -2873,14 +4545,14 @@ own-keys@^1.0.1:
object-keys "^1.1.1"
safe-push-apply "^1.0.0"
-p-limit@^2.0.0:
+p-limit@^2.0.0, p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
dependencies:
p-try "^2.0.0"
-p-limit@^3.0.2:
+p-limit@^3.0.2, p-limit@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
@@ -2894,6 +4566,13 @@ p-locate@^3.0.0:
dependencies:
p-limit "^2.0.0"
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
p-locate@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
@@ -2928,6 +4607,11 @@ pac-resolver@^7.0.1:
degenerator "^5.0.0"
netmask "^2.0.2"
+package-json-from-dist@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
+ integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
@@ -2973,7 +4657,7 @@ path-is-absolute@^1.0.0:
resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
-path-key@^3.1.0:
+path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -2983,6 +4667,14 @@ path-parse@^1.0.7:
resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+path-scurry@^1.11.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
path-to-regexp@^8.0.0:
version "8.3.0"
resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz"
@@ -2998,16 +4690,26 @@ picocolors@^1.1.1:
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-picomatch@^2.0.4, picomatch@^2.2.1:
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+picomatch@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042"
+ integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
+
pify@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+pirates@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22"
+ integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==
+
pkg-conf@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz"
@@ -3016,6 +4718,13 @@ pkg-conf@^3.1.0:
find-up "^3.0.0"
load-json-file "^5.2.0"
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
possible-typed-array-names@^1.0.0:
version "1.1.0"
resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz"
@@ -3060,6 +4769,15 @@ prettier@^3.6.2:
resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz"
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
+pretty-format@30.2.0:
+ version "30.2.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-30.2.0.tgz#2d44fe6134529aed18506f6d11509d8a62775ebe"
+ integrity sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==
+ dependencies:
+ "@jest/schemas" "30.0.5"
+ ansi-styles "^5.2.0"
+ react-is "^18.3.1"
+
process-nextick-args@~1.0.6:
version "1.0.7"
resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz"
@@ -3149,7 +4867,12 @@ puppeteer@^24.31.0:
puppeteer-core "24.31.0"
typed-query-selector "^2.12.0"
-qs@^6.14.0:
+pure-rand@^7.0.0:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-7.0.1.tgz#6f53a5a9e3e4a47445822af96821ca509ed37566"
+ integrity sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==
+
+qs@^6.11.2, qs@^6.14.0:
version "6.14.0"
resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz"
integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==
@@ -3181,6 +4904,11 @@ react-is@^16.13.1:
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+react-is@^18.3.1:
+ version "18.3.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
+ integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+
readable-stream@2.2.7:
version "2.2.7"
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz"
@@ -3256,6 +4984,13 @@ require_optional@~1.0.0:
resolve-from "^2.0.0"
semver "^5.1.0"
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
resolve-from@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz"
@@ -3266,6 +5001,11 @@ resolve-from@^4.0.0:
resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
resolve@^1.22.1, resolve@^1.22.4:
version "1.22.11"
resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz"
@@ -3372,7 +5112,7 @@ semver@^6.3.1:
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.0.0, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.7.3:
+semver@^7.0.0, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.7.2, semver@^7.7.3:
version "7.7.3"
resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
@@ -3497,6 +5237,16 @@ sift@17.1.3:
resolved "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz"
integrity sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==
+signal-exit@^3.0.3:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+signal-exit@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
simple-update-notifier@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz"
@@ -3504,6 +5254,11 @@ simple-update-notifier@^2.0.0:
dependencies:
semver "^7.5.3"
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
smart-buffer@^4.2.0:
version "4.2.0"
resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz"
@@ -3580,7 +5335,15 @@ socks@^2.8.3:
ip-address "^10.0.1"
smart-buffer "^4.2.0"
-source-map@~0.6.1:
+source-map-support@0.5.13:
+ version "0.5.13"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
+ integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -3592,6 +5355,18 @@ sparse-bitfield@^3.0.3:
dependencies:
memory-pager "^1.0.2"
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stack-utils@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
standard-engine@^15.1.0:
version "15.1.0"
resolved "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz"
@@ -3653,6 +5428,23 @@ streamx@^2.15.0, streamx@^2.21.0:
fast-fifo "^1.3.2"
text-decoder "^1.1.0"
+string-length@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
@@ -3662,6 +5454,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
string.prototype.matchall@^4.0.12:
version "4.0.12"
resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz"
@@ -3728,6 +5529,13 @@ string_decoder@~1.0.0:
dependencies:
safe-buffer "~5.1.0"
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
@@ -3735,16 +5543,56 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
+strip-ansi@^7.0.1:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba"
+ integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==
+ dependencies:
+ ansi-regex "^6.0.1"
+
strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+superagent@^10.2.3:
+ version "10.2.3"
+ resolved "https://registry.yarnpkg.com/superagent/-/superagent-10.2.3.tgz#d1e4986f2caac423c37e38077f9073ccfe73a59b"
+ integrity sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==
+ dependencies:
+ component-emitter "^1.3.1"
+ cookiejar "^2.1.4"
+ debug "^4.3.7"
+ fast-safe-stringify "^2.1.1"
+ form-data "^4.0.4"
+ formidable "^3.5.4"
+ methods "^1.1.2"
+ mime "2.6.0"
+ qs "^6.11.2"
+
+supertest@^7.1.4:
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/supertest/-/supertest-7.1.4.tgz#3175e2539f517ca72fdc7992ffff35b94aca7d34"
+ integrity sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==
+ dependencies:
+ methods "^1.1.2"
+ superagent "^10.2.3"
+
supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
@@ -3759,12 +5607,19 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+supports-color@^8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
-synckit@^0.11.7:
+synckit@^0.11.7, synckit@^0.11.8:
version "0.11.11"
resolved "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz"
integrity sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==
@@ -3791,6 +5646,15 @@ tar-stream@^3.1.5:
fast-fifo "^1.2.0"
streamx "^2.15.0"
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
text-decoder@^1.1.0:
version "1.2.3"
resolved "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz"
@@ -3803,6 +5667,11 @@ text-table@^0.2.0:
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
@@ -3842,7 +5711,7 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@^2.0.1:
+tslib@^2.0.1, tslib@^2.4.0:
version "2.8.1"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
@@ -3859,11 +5728,21 @@ type-check@^0.4.0, type-check@~0.4.0:
dependencies:
prelude-ls "^1.2.1"
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
type-fest@^0.3.0:
version "0.3.1"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz"
@@ -3963,6 +5842,41 @@ unpipe@1.0.0:
resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+unrs-resolver@^1.7.11:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz#be9cd8686c99ef53ecb96df2a473c64d304048a9"
+ integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==
+ dependencies:
+ napi-postinstall "^0.3.0"
+ optionalDependencies:
+ "@unrs/resolver-binding-android-arm-eabi" "1.11.1"
+ "@unrs/resolver-binding-android-arm64" "1.11.1"
+ "@unrs/resolver-binding-darwin-arm64" "1.11.1"
+ "@unrs/resolver-binding-darwin-x64" "1.11.1"
+ "@unrs/resolver-binding-freebsd-x64" "1.11.1"
+ "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1"
+ "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1"
+ "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-arm64-musl" "1.11.1"
+ "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1"
+ "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-x64-gnu" "1.11.1"
+ "@unrs/resolver-binding-linux-x64-musl" "1.11.1"
+ "@unrs/resolver-binding-wasm32-wasi" "1.11.1"
+ "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1"
+ "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1"
+ "@unrs/resolver-binding-win32-x64-msvc" "1.11.1"
+
+update-browserslist-db@^1.2.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d"
+ integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.1"
+
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
@@ -3975,6 +5889,20 @@ util-deprecate@~1.0.1:
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+v8-to-istanbul@^9.0.1:
+ version "9.3.0"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175"
+ integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.12"
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^2.0.0"
+
vary@^1, vary@^1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
@@ -3985,6 +5913,13 @@ version-guard@^1.1.1:
resolved "https://registry.npmjs.org/version-guard/-/version-guard-1.1.3.tgz"
integrity sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==
+walker@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
webdriver-bidi-protocol@0.3.9:
version "0.3.9"
resolved "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.9.tgz"
@@ -4068,6 +6003,15 @@ word-wrap@^1.2.5:
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
@@ -4077,11 +6021,28 @@ wrap-ansi@^7.0.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+write-file-atomic@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7"
+ integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^4.0.1"
+
ws@^8.18.3:
version "8.18.3"
resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz"
@@ -4097,6 +6058,11 @@ xdg-basedir@^4.0.0:
resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+xml@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
+ integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==
+
xtend@~2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz"
@@ -4109,6 +6075,11 @@ y18n@^5.0.5:
resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"
integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
yargs-parser@^21.1.1:
version "21.1.1"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"