diff --git a/packages/jobs/src/plugin.ts b/packages/jobs/src/plugin.ts index d87d09c8..868b528c 100644 --- a/packages/jobs/src/plugin.ts +++ b/packages/jobs/src/plugin.ts @@ -89,7 +89,7 @@ export class JobsPlugin implements Plugin { (this.scheduler as any).logger = context.logger; // Register jobs service - context.registerService('jobs', this); + context.registerService('job', this); // Register built-in jobs if enabled if (this.config.enableBuiltInJobs) { @@ -360,7 +360,7 @@ export class JobsPlugin implements Plugin { */ export function getJobsAPI(kernel: any): JobsPlugin | null { try { - return kernel.getService('jobs'); + return kernel.getService('job'); } catch { return null; } diff --git a/packages/jobs/test/plugin.test.ts b/packages/jobs/test/plugin.test.ts index 65207878..a3ff7c75 100644 --- a/packages/jobs/test/plugin.test.ts +++ b/packages/jobs/test/plugin.test.ts @@ -97,7 +97,7 @@ describe('Jobs Plugin', () => { it('should initialize successfully', async () => { await plugin.init(mockContext); - expect(mockContext.registerService).toHaveBeenCalledWith('jobs', plugin); + expect(mockContext.registerService).toHaveBeenCalledWith('job', plugin); expect(mockContext.logger.info).toHaveBeenCalledWith( expect.stringContaining('Initialized successfully') ); diff --git a/packages/realtime/src/plugin.ts b/packages/realtime/src/plugin.ts index dd8e1eff..69cf3969 100644 --- a/packages/realtime/src/plugin.ts +++ b/packages/realtime/src/plugin.ts @@ -117,7 +117,7 @@ export const createRealtimePlugin = (options: RealtimePluginOptions = {}): Plugi startedAt = Date.now(); // 1. Register the service so Adapters can find us - ctx.registerService('websocket-server', { + ctx.registerService('realtime', { broadcast: (eventName: string, payload: any, meta?: { object?: string, userId?: string }) => { if (!wss) return; @@ -187,7 +187,7 @@ export const createRealtimePlugin = (options: RealtimePluginOptions = {}): Plugi getServer: () => wss }); - ctx.logger.info('[Realtime] Service registered as "websocket-server"'); + ctx.logger.info('[Realtime] Service registered as "realtime"'); }, async start(ctx: PluginContext) { @@ -338,7 +338,7 @@ export const createRealtimePlugin = (options: RealtimePluginOptions = {}): Plugi metrics: { uptime: startedAt ? Date.now() - startedAt : 0, }, - checks: [{ name: 'websocket-server', status: wss ? 'passed' : 'failed', message }], + checks: [{ name: 'realtime', status: wss ? 'passed' : 'failed', message }], }; }, diff --git a/packages/realtime/test/plugin.test.ts b/packages/realtime/test/plugin.test.ts index 795b0d5b..ccb15920 100644 --- a/packages/realtime/test/plugin.test.ts +++ b/packages/realtime/test/plugin.test.ts @@ -110,7 +110,7 @@ describe('Realtime Plugin', () => { await plugin.init(mockContext); expect(mockContext.registerService).toHaveBeenCalledWith( - 'websocket-server', + 'realtime', expect.objectContaining({ broadcast: expect.any(Function), updatePresence: expect.any(Function), @@ -131,7 +131,7 @@ describe('Realtime Plugin', () => { ); // Verify server is accessible via the registered service - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); expect(service.getServer()).toBeDefined(); }); @@ -196,7 +196,7 @@ describe('Realtime Plugin', () => { // Wait for the close event to propagate await new Promise(resolve => setTimeout(resolve, 100)); - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); const wss = service.getServer() as WebSocketServer; expect(wss.clients.size).toBe(0); }); @@ -318,7 +318,7 @@ describe('Realtime Plugin', () => { await waitForMessage(client); // ack // Broadcast via service - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('user.created', { name: 'John', email: 'john@test.com' }); const event = await waitForMessage(client); @@ -339,7 +339,7 @@ describe('Realtime Plugin', () => { await waitForMessage(client); // ack // Broadcast an order event - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('order.created', { orderId: '123' }); // Should NOT receive anything (use timeout to verify) @@ -355,7 +355,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('user.updated', { id: '1', name: 'Jane' }); const event = await waitForMessage(client); @@ -372,7 +372,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('anything.goes', { data: true }); const event = await waitForMessage(client); @@ -392,7 +392,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); // Should match service.broadcast('record.updated', { name: 'Acme' }, { object: 'Account' }); @@ -424,7 +424,7 @@ describe('Realtime Plugin', () => { await waitForMessage(client); // ack // Broadcast should not reach client - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('user.created', { name: 'Test' }); await expect(waitForMessage(client, 300)).rejects.toThrow('Message timeout'); @@ -459,7 +459,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); // Should match service.broadcast('order.updated', { status: 'paid', amount: 100 }); @@ -484,7 +484,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); // Should match (amount > 100) service.broadcast('order.created', { amount: 200 }); @@ -509,7 +509,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('user.login', { role: 'admin' }); const event = await waitForMessage(client); @@ -532,7 +532,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('log.entry', { message: 'Critical error occurred' }); const event = await waitForMessage(client); @@ -555,7 +555,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.broadcast('email.sent', { to: 'user@company.com' }); const event = await waitForMessage(client); @@ -583,7 +583,7 @@ describe('Realtime Plugin', () => { })); await waitForMessage(client); // ack - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); // Both conditions met service.broadcast('order.updated', { status: 'paid', amount: 150 }); @@ -658,7 +658,7 @@ describe('Realtime Plugin', () => { }); it('should broadcast presence via service API', async () => { - const service = mockKernel.services.get('websocket-server'); + const service = mockKernel.services.get('realtime'); service.updatePresence('user-99', { status: 'busy' }, { page: '/dashboard' }); // Both clients should receive presence update @@ -856,7 +856,7 @@ describe('Kernel Compliance', () => { expect(report.status).toBe('healthy'); expect(report.metrics?.uptime).toBeGreaterThanOrEqual(0); expect(report.checks).toHaveLength(1); - expect(report.checks![0].name).toBe('websocket-server'); + expect(report.checks![0].name).toBe('realtime'); expect(report.timestamp).toBeDefined(); }); }); diff --git a/packages/storage/src/plugin.ts b/packages/storage/src/plugin.ts index 15c6205e..0228497e 100644 --- a/packages/storage/src/plugin.ts +++ b/packages/storage/src/plugin.ts @@ -95,7 +95,7 @@ export class StoragePlugin implements Plugin { this.startedAt = Date.now(); // Register storage service - context.registerService('storage', this); + context.registerService('file-storage', this); // For Redis backend, connect if (this.backend instanceof RedisStorageBackend) { @@ -239,7 +239,7 @@ export class StoragePlugin implements Plugin { */ export function getStorageAPI(kernel: any): StoragePlugin | null { try { - return kernel.getService('storage'); + return kernel.getService('file-storage'); } catch { return null; } diff --git a/packages/storage/test/plugin.test.ts b/packages/storage/test/plugin.test.ts index d81e602f..ae6ba43a 100644 --- a/packages/storage/test/plugin.test.ts +++ b/packages/storage/test/plugin.test.ts @@ -72,7 +72,7 @@ describe('Storage Plugin', () => { it('should initialize successfully', async () => { await plugin.init(mockContext); - expect(mockContext.registerService).toHaveBeenCalledWith('storage', plugin); + expect(mockContext.registerService).toHaveBeenCalledWith('file-storage', plugin); expect(mockContext.logger.info).toHaveBeenCalledWith( expect.stringContaining('Initialized successfully') ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26dae629..46fdd424 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -494,10 +494,9 @@ importers: '@objectstack/runtime': specifier: ^2.0.1 version: 2.0.1(pino@10.3.0) - optionalDependencies: - ioredis: - specifier: ^5.4.2 - version: 5.9.2 + '@objectstack/spec': + specifier: 2.0.1 + version: 2.0.1 devDependencies: '@types/jest': specifier: ^30.0.0 @@ -517,16 +516,19 @@ importers: typescript: specifier: ^5.9.3 version: 5.9.3 + optionalDependencies: + ioredis: + specifier: ^5.4.2 + version: 5.9.2 packages/i18n: dependencies: '@objectstack/runtime': specifier: ^2.0.1 version: 2.0.1(pino@10.3.0) - optionalDependencies: - js-yaml: - specifier: ^4.1.0 - version: 4.1.1 + '@objectstack/spec': + specifier: 2.0.1 + version: 2.0.1 devDependencies: '@types/jest': specifier: ^30.0.0 @@ -549,6 +551,10 @@ importers: typescript: specifier: ^5.9.3 version: 5.9.3 + optionalDependencies: + js-yaml: + specifier: ^4.1.0 + version: 4.1.1 packages/jobs: dependencies: @@ -589,6 +595,9 @@ importers: '@objectstack/runtime': specifier: ^2.0.1 version: 2.0.1(pino@10.3.0) + '@objectstack/spec': + specifier: 2.0.1 + version: 2.0.1 devDependencies: '@types/jest': specifier: ^30.0.0 @@ -614,16 +623,9 @@ importers: '@objectstack/runtime': specifier: ^2.0.1 version: 2.0.1(pino@10.3.0) - optionalDependencies: - axios: - specifier: ^1.7.9 - version: 1.13.4 - handlebars: - specifier: ^4.7.8 - version: 4.7.8 - nodemailer: - specifier: ^6.9.15 - version: 6.10.1 + '@objectstack/spec': + specifier: 2.0.1 + version: 2.0.1 devDependencies: '@types/jest': specifier: ^30.0.0 @@ -646,6 +648,16 @@ importers: typescript: specifier: ^5.9.3 version: 5.9.3 + optionalDependencies: + axios: + specifier: ^1.7.9 + version: 1.13.4 + handlebars: + specifier: ^4.7.8 + version: 4.7.8 + nodemailer: + specifier: ^6.9.15 + version: 6.10.1 packages/permissions: dependencies: @@ -692,6 +704,9 @@ importers: '@objectstack/runtime': specifier: ^2.0.1 version: 2.0.1(pino@10.3.0) + '@objectstack/spec': + specifier: 2.0.1 + version: 2.0.1 ws: specifier: ^8.16.0 version: 8.19.0 @@ -723,13 +738,9 @@ importers: '@objectstack/runtime': specifier: ^2.0.1 version: 2.0.1(pino@10.3.0) - optionalDependencies: - better-sqlite3: - specifier: ^11.0.0 - version: 11.10.0 - ioredis: - specifier: ^5.4.2 - version: 5.9.2 + '@objectstack/spec': + specifier: 2.0.1 + version: 2.0.1 devDependencies: '@types/better-sqlite3': specifier: ^7.6.12 @@ -752,6 +763,13 @@ importers: typescript: specifier: ^5.9.3 version: 5.9.3 + optionalDependencies: + better-sqlite3: + specifier: ^11.0.0 + version: 11.10.0 + ioredis: + specifier: ^5.4.2 + version: 5.9.2 packages/workflow: dependencies: @@ -1791,89 +1809,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -2074,24 +2108,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@next/swc-linux-arm64-musl@16.1.6': resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@next/swc-linux-x64-gnu@16.1.6': resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@next/swc-linux-x64-musl@16.1.6': resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@next/swc-win32-arm64-msvc@16.1.6': resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} @@ -2249,36 +2287,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-arm64-musl@0.105.0': resolution: {integrity: sha512-ZR5yR/Eh5ve8+cxMnnhscadN5ev6jpAQWPZpJd/PGMDPDbE5AFbhHFEBurmUo09vPF4s12QabMsRk3dz70jn0Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@oxc-transform/binding-linux-riscv64-gnu@0.105.0': resolution: {integrity: sha512-rowG6vGQMEoJPryhg40ksyfDpULbJeDHIZuNzIIDRuTi6GwxgXCA3fZk1F3gh6n+asCqEMYJJ3mcndcDXPIOtA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-s390x-gnu@0.105.0': resolution: {integrity: sha512-oN3wPVwFXmWRYgJpuKpKnGqFzE0wX6+ZDRB0SYMYzplTZeRWX/CDeIXYnEFCCWUeDf0PC/LEEc94ZndgiroddQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-gnu@0.105.0': resolution: {integrity: sha512-AWYMf+rqSKsd208K0VF+InXs2QMaF5PIzMdHofelXJksIjhc2C4AJbQOWedeCyCJ8X04bjTtVJy4kD8RHvZP/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-x64-musl@0.105.0': resolution: {integrity: sha512-0wJamm+2HyzegH1bmssak1K6uGFAU9bLuVAiSfiQrLMZQtRvorbdF0nn7TZspP3CjJivT8bYMUvzdJdUz7rYQw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@oxc-transform/binding-openharmony-arm64@0.105.0': resolution: {integrity: sha512-auAZW1//kFGVosmTB4dehCK1c12V3/KbtoZXBzG4PV4BJmxl89m4qKQopi8l/CXmh1i/DrXyF5Wem13SK0QBbA==} @@ -2771,66 +2815,79 @@ packages: resolution: {integrity: sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.57.0': resolution: {integrity: sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.57.0': resolution: {integrity: sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.57.0': resolution: {integrity: sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.57.0': resolution: {integrity: sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.57.0': resolution: {integrity: sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.57.0': resolution: {integrity: sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.57.0': resolution: {integrity: sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.57.0': resolution: {integrity: sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.57.0': resolution: {integrity: sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.57.0': resolution: {integrity: sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.57.0': resolution: {integrity: sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.57.0': resolution: {integrity: sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.57.0': resolution: {integrity: sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==} @@ -2989,24 +3046,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} @@ -3297,41 +3358,49 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -5089,24 +5158,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}