From dc46d05c4a2a49f9e071755c7468e057f13ecf2e Mon Sep 17 00:00:00 2001 From: onmax Date: Thu, 5 Feb 2026 13:15:09 +0100 Subject: [PATCH 1/3] fix: bundle validators for snapshot --- server/tasks/sync/snapshot.ts | 6 ++-- server/utils/validators-bundle.ts | 53 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 server/utils/validators-bundle.ts diff --git a/server/tasks/sync/snapshot.ts b/server/tasks/sync/snapshot.ts index be3c04c..fe30f2c 100644 --- a/server/tasks/sync/snapshot.ts +++ b/server/tasks/sync/snapshot.ts @@ -16,11 +16,11 @@ export default defineTask({ throw new Error('No Albatross RPC Node URL') initRpcClient({ url: rpcUrl }) - // Use import.meta.dev for consistent behavior with Cloudflare Workers runtime - const source = import.meta.dev ? 'filesystem' : 'github' const { nimiqNetwork, gitBranch } = config.public - const [importSuccess, errorImport, importData] = await importValidators(source, { nimiqNetwork, gitBranch }) + const [importSuccess, errorImport, importData] = import.meta.dev + ? await importValidators('filesystem', { nimiqNetwork, gitBranch }) + : await importValidatorsBundled(nimiqNetwork) if (!importSuccess || !importData) { const error = new Error(errorImport || 'Unable to import from GitHub') await sendSyncFailureNotification('snapshot', error) diff --git a/server/utils/validators-bundle.ts b/server/utils/validators-bundle.ts new file mode 100644 index 0000000..2d2ebea --- /dev/null +++ b/server/utils/validators-bundle.ts @@ -0,0 +1,53 @@ +import type { Result } from 'nimiq-validator-trustscore/types' +import type { ValidatorJSON } from './schemas' +import { validatorSchema } from './schemas' +import { storeValidator } from './validators' + +interface ImportValidatorsBundledOptions { + shouldStore?: boolean +} + +function normalizePath(value: string) { + return value.replace(/\\/g, '/') +} + +function extractNetworkFromPath(path: string) { + const normalized = normalizePath(path) + const match = normalized.match(/\/public\/validators\/([^/]+)\/[^/]+\.json$/) + return match?.[1] +} + +export async function importValidatorsBundled(nimiqNetwork?: string, options: ImportValidatorsBundledOptions = {}): Result { + if (!nimiqNetwork) + return [false, 'Nimiq network is required', undefined] + + const { shouldStore = true } = options + const modules = import.meta.glob('../../public/validators/*/*.json', { eager: true, import: 'default' }) + + const validators: ValidatorJSON[] = [] + for (const [path, mod] of Object.entries(modules)) { + if (path.endsWith('.example.json')) + continue + + const network = extractNetworkFromPath(path) + if (network !== nimiqNetwork) + continue + + const data = (mod as any)?.default ?? mod + const parsed = validatorSchema.safeParse(data) + if (!parsed.success) { + return [false, `Invalid validator data at ${path}: ${parsed.error}`, undefined] + } + validators.push(parsed.data) + } + + if (!shouldStore) + return [true, undefined, validators] + + const results = await Promise.allSettled(validators.map(v => storeValidator(v.address, v, { upsert: true }))) + const failures = results.filter(r => r.status === 'rejected') + if (failures.length > 0) + return [false, `Errors importing validators: ${failures.map((f: any) => f.reason).join(', ')}`, undefined] + + return [true, undefined, validators] +} From d0539e99ccb6bf675e7adb311e4cc7cb1ca6a745 Mon Sep 17 00:00:00 2001 From: onmax Date: Thu, 5 Feb 2026 13:53:26 +0100 Subject: [PATCH 2/3] refactor: use safe runtime config --- app/app.vue | 2 +- app/composables/useSafeRuntimeConfig.ts | 3 +++ app/pages/index.vue | 2 +- nuxt.config.ts | 3 --- packages/nimiq-validator-trustscore/src/range.test.ts | 8 +++++--- server/api/[version]/distribution.get.ts | 2 +- server/api/[version]/status.get.ts | 2 +- server/api/[version]/validators/[address].get.ts | 2 +- server/api/[version]/validators/index.get.ts | 2 +- server/plugins/setup-database.ts | 2 +- server/tasks/sync/epochs.ts | 2 +- server/tasks/sync/snapshot.ts | 2 +- server/utils/activities.ts | 2 +- server/utils/rpc.ts | 2 +- server/utils/scores.ts | 2 +- server/utils/slack.ts | 8 ++++---- server/utils/validators-bundle.ts | 8 ++++++-- server/utils/validators.ts | 2 +- 18 files changed, 31 insertions(+), 25 deletions(-) create mode 100644 app/composables/useSafeRuntimeConfig.ts diff --git a/app/app.vue b/app/app.vue index 50b7a7d..ee7fcbc 100644 --- a/app/app.vue +++ b/app/app.vue @@ -10,7 +10,7 @@ const isActivitySync = computed(() => Boolean(status.value?.missingEpochs?.lengt const isScoreSync = computed(() => status.value?.missingScore === false) const isSynced = computed(() => isActivitySync.value && isScoreSync.value) -const { gitBranch, nimiqNetwork } = useRuntimeConfig().public +const { gitBranch, nimiqNetwork } = useSafeRuntimeConfig().public interface EnvItemType { branch: string, network: string, link: string } diff --git a/app/composables/useSafeRuntimeConfig.ts b/app/composables/useSafeRuntimeConfig.ts new file mode 100644 index 0000000..977eaee --- /dev/null +++ b/app/composables/useSafeRuntimeConfig.ts @@ -0,0 +1,3 @@ +export function useSafeRuntimeConfig() { + return useRuntimeConfig() +} diff --git a/app/pages/index.vue b/app/pages/index.vue index 7e3a3eb..79df0de 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -37,7 +37,7 @@ const tooltips = { } function useStats() { - const network = useRuntimeConfig().public.nimiqNetwork as 'test-albatross' | 'main-albatross' + const network = useSafeRuntimeConfig().public.nimiqNetwork as 'test-albatross' | 'main-albatross' const averageScore = computed(() => { if (!validators?.value?.length) diff --git a/nuxt.config.ts b/nuxt.config.ts index 7c725f1..a39be03 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -90,9 +90,6 @@ export default defineNuxtConfig({ consola.info(`Nimiq network: \`${nimiqNetwork}\``) consola.info(`Git branch: \`${gitBranch}\``) - - const { projectUrl, env } = nuxt.options.runtimeConfig.hub - consola.info(`Remote NuxtHub: \`${projectUrl || 'local'}@${env}\``) }, }, diff --git a/packages/nimiq-validator-trustscore/src/range.test.ts b/packages/nimiq-validator-trustscore/src/range.test.ts index fabecc9..12a8f2b 100644 --- a/packages/nimiq-validator-trustscore/src/range.test.ts +++ b/packages/nimiq-validator-trustscore/src/range.test.ts @@ -301,10 +301,12 @@ describe('get range with mock implementation', () => { }) }) -describe('get range without mocking', () => { - const rpcUrl = env.ALBATROSS_RPC_NODE_URL - const network = env.NUXT_PUBLIC_NIMIQ_NETWORK +const rpcUrl = env.ALBATROSS_RPC_NODE_URL +const network = env.NUXT_PUBLIC_NIMIQ_NETWORK +const hasRpcEnv = Boolean(rpcUrl && network) +const describeIf = hasRpcEnv ? describe : describe.skip +describeIf('get range without mocking', () => { it('env ok', () => { expect(rpcUrl).toBeDefined() expect(network).toBeDefined() diff --git a/server/api/[version]/distribution.get.ts b/server/api/[version]/distribution.get.ts index a0be9ce..cb42d46 100644 --- a/server/api/[version]/distribution.get.ts +++ b/server/api/[version]/distribution.get.ts @@ -33,7 +33,7 @@ export default defineCachedEventHandler(async () => { if (!latestBlockOk) throw createError(latestBlockError) - const network = useRuntimeConfig().public.nimiqNetwork as 'test-albatross' | 'main-albatross' + const network = useSafeRuntimeConfig().public.nimiqNetwork as 'test-albatross' | 'main-albatross' const circulating = posSupplyAt(latestBlock.timestamp, { network }) const stakedRatio = staked / circulating diff --git a/server/api/[version]/status.get.ts b/server/api/[version]/status.get.ts index 50ff2ff..c60e49c 100644 --- a/server/api/[version]/status.get.ts +++ b/server/api/[version]/status.get.ts @@ -28,7 +28,7 @@ export default defineCachedEventHandler(async () => { throw createError('No Albatross RPC Node URL') initRpcClient({ url: rpcUrl }) - const { nimiqNetwork: network } = useRuntimeConfig().public + const { nimiqNetwork: network } = useSafeRuntimeConfig().public // We get a "window" whose size is determined by the range const [rangeSuccess, errorRange, range] = await getRange({ network }) diff --git a/server/api/[version]/validators/[address].get.ts b/server/api/[version]/validators/[address].get.ts index 7087afc..be09f9d 100644 --- a/server/api/[version]/validators/[address].get.ts +++ b/server/api/[version]/validators/[address].get.ts @@ -17,7 +17,7 @@ export default defineEventHandler(async (event) => { const isValid = ValidationUtils.isValidAddress(address) if (!isValid) throw createError({ statusCode: 400, statusMessage: 'Invalid address format' }) - const { nimiqNetwork: network } = useRuntimeConfig().public + const { nimiqNetwork: network } = useSafeRuntimeConfig().public const [rangeSuccess, errorRange, range] = await getRange({ network }) if (!rangeSuccess || !range) diff --git a/server/api/[version]/validators/index.get.ts b/server/api/[version]/validators/index.get.ts index eec16ca..9740b4f 100644 --- a/server/api/[version]/validators/index.get.ts +++ b/server/api/[version]/validators/index.get.ts @@ -11,7 +11,7 @@ export default defineEventHandler(async (event) => { if (!rpcUrl) throw createError('No Albatross RPC Node URL') initRpcClient({ url: rpcUrl }) - const { nimiqNetwork: network } = useRuntimeConfig().public + const { nimiqNetwork: network } = useSafeRuntimeConfig().public const [rangeSuccess, errorRange, range] = await getRange({ network }) if (!rangeSuccess || !range) diff --git a/server/plugins/setup-database.ts b/server/plugins/setup-database.ts index 2877c57..5b0f47d 100644 --- a/server/plugins/setup-database.ts +++ b/server/plugins/setup-database.ts @@ -6,7 +6,7 @@ export default defineNitroPlugin(async () => { // Import validators on dev branch hubHooks.hookOnce('database:migrations:done', async () => { - const { nimiqNetwork, gitBranch } = useRuntimeConfig().public + const { nimiqNetwork, gitBranch } = useSafeRuntimeConfig().public if (gitBranch !== 'dev') return diff --git a/server/tasks/sync/epochs.ts b/server/tasks/sync/epochs.ts index 2a86279..ea76b84 100644 --- a/server/tasks/sync/epochs.ts +++ b/server/tasks/sync/epochs.ts @@ -15,7 +15,7 @@ export default defineTask({ description: 'Sync all missing blockchain epochs to D1 database', }, async run() { - const config = useRuntimeConfig() + const config = useSafeRuntimeConfig() try { const rpcUrl = getRpcUrl() diff --git a/server/tasks/sync/snapshot.ts b/server/tasks/sync/snapshot.ts index fe30f2c..95a31cb 100644 --- a/server/tasks/sync/snapshot.ts +++ b/server/tasks/sync/snapshot.ts @@ -8,7 +8,7 @@ export default defineTask({ description: 'Sync validator snapshot and calculate scores', }, async run() { - const config = useRuntimeConfig() + const config = useSafeRuntimeConfig() try { const rpcUrl = getRpcUrl() diff --git a/server/utils/activities.ts b/server/utils/activities.ts index 546aab9..1fa40e8 100644 --- a/server/utils/activities.ts +++ b/server/utils/activities.ts @@ -98,7 +98,7 @@ interface FetchMissingEpochsParams { * Fetches the activities of the epochs that have finished and are missing in the database. */ export async function fetchMissingEpochs({ report, controller }: FetchMissingEpochsParams = {}): Result { - const { nimiqNetwork: network } = useRuntimeConfig().public + const { nimiqNetwork: network } = useSafeRuntimeConfig().public // The range that we will consider const [rangeSuccess, errorRange, range] = await getRange({ network }) diff --git a/server/utils/rpc.ts b/server/utils/rpc.ts index 5498285..434c7cb 100644 --- a/server/utils/rpc.ts +++ b/server/utils/rpc.ts @@ -1,5 +1,5 @@ import process from 'node:process' export function getRpcUrl() { - return useRuntimeConfig().albatrossRpcNodeUrl || process.env.ALBATROSS_RPC_NODE_URL || '' + return useSafeRuntimeConfig().albatrossRpcNodeUrl || process.env.ALBATROSS_RPC_NODE_URL || '' } diff --git a/server/utils/scores.ts b/server/utils/scores.ts index 9fa93d6..3e32a06 100644 --- a/server/utils/scores.ts +++ b/server/utils/scores.ts @@ -84,7 +84,7 @@ async function calculateScore(range: Range, validatorId: number): Result { - const { nimiqNetwork: network } = useRuntimeConfig().public + const { nimiqNetwork: network } = useSafeRuntimeConfig().public const [rangeSuccess, errorRange, range] = await getRange({ network }) if (!rangeSuccess || !range) return [false, errorRange || 'No range', undefined] diff --git a/server/utils/slack.ts b/server/utils/slack.ts index 840bed1..405e66a 100644 --- a/server/utils/slack.ts +++ b/server/utils/slack.ts @@ -41,14 +41,14 @@ export async function sendSlackNotification(options: SlackNotificationOptions): return } - const { slackWebhookUrl } = useRuntimeConfig() + const { slackWebhookUrl } = useSafeRuntimeConfig() if (!slackWebhookUrl) { consola.warn('NUXT_SLACK_WEBHOOK_URL not configured, skipping Slack notification') return } - const { nimiqNetwork, gitBranch } = useRuntimeConfig().public + const { nimiqNetwork, gitBranch } = useSafeRuntimeConfig().public // Prepare the message let messageText = options.message @@ -124,7 +124,7 @@ export async function sendSyncFailureNotification( error: any, endpoint?: string, ): Promise { - const { nimiqNetwork } = useRuntimeConfig().public + const { nimiqNetwork } = useSafeRuntimeConfig().public await sendSlackNotification({ message: `🚨 Sync failure detected on ${nimiqNetwork}`, @@ -157,7 +157,7 @@ export async function sendNewEpochNotification( epochNumber: number, totalSynced: number, ): Promise { - const { nimiqNetwork } = useRuntimeConfig().public + const { nimiqNetwork } = useSafeRuntimeConfig().public // Only send for mainnet if (nimiqNetwork !== 'main-albatross') { diff --git a/server/utils/validators-bundle.ts b/server/utils/validators-bundle.ts index 2d2ebea..b632b22 100644 --- a/server/utils/validators-bundle.ts +++ b/server/utils/validators-bundle.ts @@ -13,7 +13,7 @@ function normalizePath(value: string) { function extractNetworkFromPath(path: string) { const normalized = normalizePath(path) - const match = normalized.match(/\/public\/validators\/([^/]+)\/[^/]+\.json$/) + const match = normalized.match(/(?:^|\/)public\/validators\/([^/]+)\/[^/]+\.json$/) return match?.[1] } @@ -30,7 +30,7 @@ export async function importValidatorsBundled(nimiqNetwork?: string, options: Im continue const network = extractNetworkFromPath(path) - if (network !== nimiqNetwork) + if (!network || network !== nimiqNetwork) continue const data = (mod as any)?.default ?? mod @@ -44,6 +44,10 @@ export async function importValidatorsBundled(nimiqNetwork?: string, options: Im if (!shouldStore) return [true, undefined, validators] + if (validators.length === 0) { + return [false, `No bundled validators found for network: ${nimiqNetwork}`, undefined] + } + const results = await Promise.allSettled(validators.map(v => storeValidator(v.address, v, { upsert: true }))) const failures = results.filter(r => r.status === 'rejected') if (failures.length > 0) diff --git a/server/utils/validators.ts b/server/utils/validators.ts index a5e0335..ebddcda 100644 --- a/server/utils/validators.ts +++ b/server/utils/validators.ts @@ -296,7 +296,7 @@ export const cachedFetchValidator = defineCachedFunction((_event: H3Event, param * Deleted validators are the ones that are not in the staking contract anymore, but are still in the database. */ export async function categorizeValidatorsSnapshotEpoch(): Result { - const { nimiqNetwork: network } = useRuntimeConfig().public + const { nimiqNetwork: network } = useSafeRuntimeConfig().public const [epochOk, error, epoch] = await fetchSnapshotEpoch({ network }) if (!epochOk) return [false, error, undefined] From e0dbee74f58a67fb62e2d0dd07ebfba3535af6c7 Mon Sep 17 00:00:00 2001 From: onmax Date: Thu, 5 Feb 2026 13:59:34 +0100 Subject: [PATCH 3/3] chore: update safe runtime config --- app/composables/useSafeRuntimeConfig.ts | 3 - eslint.config.js | 2 + pnpm-lock.yaml | 85 ++++++++++++++++++++++--- pnpm-workspace.yaml | 2 +- 4 files changed, 78 insertions(+), 14 deletions(-) delete mode 100644 app/composables/useSafeRuntimeConfig.ts diff --git a/app/composables/useSafeRuntimeConfig.ts b/app/composables/useSafeRuntimeConfig.ts deleted file mode 100644 index 977eaee..0000000 --- a/app/composables/useSafeRuntimeConfig.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function useSafeRuntimeConfig() { - return useRuntimeConfig() -} diff --git a/eslint.config.js b/eslint.config.js index 2742413..6573b05 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,5 +1,6 @@ // @ts-check import antfu from '@antfu/eslint-config' +import safeRuntimeConfig from 'nuxt-safe-runtime-config/eslint' import withNuxt from './.nuxt/eslint.config.mjs' export default withNuxt( @@ -14,4 +15,5 @@ export default withNuxt( 'vue/object-property-newline': ['error', { allowAllPropertiesOnSameLine: false }], }, }), + safeRuntimeConfig.configs.recommended, ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86d8da1..3d5e613 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,8 +106,8 @@ catalogs: specifier: ^4.0.1 version: 4.0.1 nuxt-safe-runtime-config: - specifier: ^0.0.3 - version: 0.0.3 + specifier: ^0.0.17 + version: 0.0.17 ofetch: specifier: ^1.4.1 version: 1.4.1 @@ -290,7 +290,7 @@ importers: version: 1.0.0-beta.61(@unocss/webpack@66.3.3(webpack@5.100.2(esbuild@0.25.8)))(postcss@8.5.6)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.0)(lightningcss@1.31.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.18(typescript@5.8.3)) nuxt-safe-runtime-config: specifier: 'catalog:' - version: 0.0.3(magicast@0.3.5) + version: 0.0.17(@types/json-schema@7.0.15)(eslint@9.31.0(jiti@2.5.0))(magicast@0.3.5)(quansync@1.0.0)(valibot@1.1.0(typescript@5.8.3))(zod@4.0.8) ofetch: specifier: 'catalog:' version: 1.4.1 @@ -572,6 +572,9 @@ packages: resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} engines: {node: '>=18'} + '@cfworker/json-schema@4.1.1': + resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} + '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -2855,8 +2858,40 @@ packages: '@speed-highlight/core@1.2.7': resolution: {integrity: sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-community/standard-json@0.3.5': + resolution: {integrity: sha512-4+ZPorwDRt47i+O7RjyuaxHRK/37QY/LmgxlGrRrSTLYoFatEOzvqIc85GTlM18SFZ5E91C+v0o/M37wZPpUHA==} + peerDependencies: + '@standard-schema/spec': ^1.0.0 + '@types/json-schema': ^7.0.15 + '@valibot/to-json-schema': ^1.3.0 + arktype: ^2.1.20 + effect: ^3.16.8 + quansync: ^0.2.11 + sury: ^10.0.0 + typebox: ^1.0.17 + valibot: ^1.1.0 + zod: ^3.25.0 || ^4.0.0 + zod-to-json-schema: ^3.24.5 + peerDependenciesMeta: + '@valibot/to-json-schema': + optional: true + arktype: + optional: true + effect: + optional: true + sury: + optional: true + typebox: + optional: true + valibot: + optional: true + zod: + optional: true + zod-to-json-schema: + optional: true + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@stylistic/eslint-plugin@5.2.2': resolution: {integrity: sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==} @@ -6572,8 +6607,13 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nuxt-safe-runtime-config@0.0.3: - resolution: {integrity: sha512-Unts9lCXlTF6q35GT0Com2iidQfLuwcgsUZ8vCSRNz1JhIuPmaOrce54VsAvUQCwlQw60jtT790b/bBB0pxZAA==} + nuxt-safe-runtime-config@0.0.17: + resolution: {integrity: sha512-C9Y4/d8OHJYZ6SuKthWshxFSXXIpgv0Tych3xFr7Lcvq9yxz05EFYndHl84e8uQx+OS56j7ppAFazpQ7btVgug==} + peerDependencies: + eslint: ^9.0.0 + peerDependenciesMeta: + eslint: + optional: true nuxt@4.0.1: resolution: {integrity: sha512-1WbtiX127640PXUJ2Mb32ck0A0/hzBk6+oPQ0YvJnS/HZK3A/oJEW7sYCRPYyEBwUyIQk12QRCBHxmr6LLeXZQ==} @@ -8888,6 +8928,8 @@ snapshots: dependencies: fontkitten: 1.0.2 + '@cfworker/json-schema@4.1.1': {} + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 @@ -10935,7 +10977,16 @@ snapshots: '@speed-highlight/core@1.2.7': {} - '@standard-schema/spec@1.0.0': {} + '@standard-community/standard-json@0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@1.0.0)(valibot@1.1.0(typescript@5.8.3))(zod@4.0.8)': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/json-schema': 7.0.15 + quansync: 1.0.0 + optionalDependencies: + valibot: 1.1.0(typescript@5.8.3) + zod: 4.0.8 + + '@standard-schema/spec@1.1.0': {} '@stylistic/eslint-plugin@5.2.2(eslint@9.31.0(jiti@2.5.0))': dependencies: @@ -15380,13 +15431,27 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt-safe-runtime-config@0.0.3(magicast@0.3.5): + nuxt-safe-runtime-config@0.0.17(@types/json-schema@7.0.15)(eslint@9.31.0(jiti@2.5.0))(magicast@0.3.5)(quansync@1.0.0)(valibot@1.1.0(typescript@5.8.3))(zod@4.0.8): dependencies: + '@cfworker/json-schema': 4.1.1 '@nuxt/kit': 3.17.7(magicast@0.3.5) - '@standard-schema/spec': 1.0.0 + '@standard-community/standard-json': 0.3.5(@standard-schema/spec@1.1.0)(@types/json-schema@7.0.15)(quansync@1.0.0)(valibot@1.1.0(typescript@5.8.3))(zod@4.0.8) + '@standard-schema/spec': 1.1.0 consola: 3.4.2 + optionalDependencies: + eslint: 9.31.0(jiti@2.5.0) transitivePeerDependencies: + - '@types/json-schema' + - '@valibot/to-json-schema' + - arktype + - effect - magicast + - quansync + - sury + - typebox + - valibot + - zod + - zod-to-json-schema nuxt@4.0.1(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.1.0)(@vue/compiler-sfc@3.5.18)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.3(@cloudflare/workers-types@4.20260203.0)))(drizzle-orm@0.44.3(@cloudflare/workers-types@4.20260203.0))(eslint@9.31.0(jiti@2.5.0))(ioredis@5.6.1)(lightningcss@1.31.1)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(vite@7.0.6(@types/node@24.1.0)(jiti@2.5.0)(lightningcss@1.31.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue-tsc@3.0.3(typescript@5.8.3))(yaml@2.8.0): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f69fd25..c9f56a8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -35,7 +35,7 @@ catalog: nimiq-css: ^1.0.0-beta.61 nimiq-rpc-client-ts: 1.0.0-beta.28 nuxt: ^4.0.1 - nuxt-safe-runtime-config: ^0.0.3 + nuxt-safe-runtime-config: ^0.0.17 ofetch: ^1.4.1 pathe: ^2.0.3 reka-ui: ^2.4.0