From 7ccc32675b0f9d9442aef2dbf3596667c5a7d550 Mon Sep 17 00:00:00 2001 From: "Calum H." Date: Fri, 14 Nov 2025 17:15:09 +0000 Subject: [PATCH] feat: start of cross platform page system (#4731) * feat: abstract api-client DI into ui package * feat: cross platform page system * feat: tanstack as cross platform useAsyncData * feat: archon servers routes + labrinth billing routes * fix: dont use partial * feat: migrate server list page to tanstack + api-client + re-enabled broken features! * feat: migrate servers manage page to api-client before page system * feat: migrate manage page to page system * fix: type issues * fix: upgrade wrapper bugs * refactor: move state types into api-client * feat: disable financial stuff on app frontend * feat: finalize cross platform page system for now * fix: lint * fix: build issues * feat: remove papaparse * fix: lint * fix: interface error --------- Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com> --- apps/app-frontend/package.json | 6 +- apps/app-frontend/src/App.vue | 20 + apps/app-frontend/src/main.js | 2 + apps/app-frontend/src/routes.js | 9 + apps/app-frontend/src/store/theme.ts | 1 + apps/frontend/nuxt.config.ts | 133 +---- apps/frontend/package.json | 5 +- apps/frontend/src/app.vue | 7 +- .../ui/servers/PanelServerActionButton.vue | 3 +- .../ui/servers/ServerListingSkeleton.vue | 24 - .../ui/servers/ServerManageEmptyState.vue | 19 - .../ui/servers/ServersUpgradeModalWrapper.vue | 268 +---------- .../servers/marketing/MedalPlanPromotion.vue | 3 +- .../marketing/MedalServerCountdown.vue | 4 +- apps/frontend/src/composables/generated.ts | 74 +-- apps/frontend/src/error.vue | 4 +- .../api-client.ts => helpers/api.ts} | 10 +- .../[type]/[id]/settings/environment.vue | 9 +- .../pages/[type]/[id]/settings/general.vue | 3 +- .../src/pages/servers/manage/[id].vue | 4 +- .../servers/manage/[id]/options/index.vue | 3 +- .../src/pages/servers/manage/index.vue | 257 +--------- .../src/pages/settings/billing/index.vue | 2 +- apps/frontend/src/plugins/tanstack.ts | 28 ++ .../api-client/src/core/abstract-client.ts | 9 +- packages/api-client/src/features/auth.ts | 6 + .../api-client/src/modules/archon/index.ts | 3 + .../src/modules/archon/servers/v0.ts | 57 +++ .../src/modules/archon/servers/v1.ts | 20 + .../api-client/src/modules/archon/types.ts | 128 +++++ packages/api-client/src/modules/index.ts | 12 + .../api-client/src/modules/iso3166/index.ts | 121 +++++ .../api-client/src/modules/iso3166/types.ts | 23 + .../api-client/src/modules/kyros/files/v0.ts | 52 ++ .../api-client/src/modules/kyros/types.ts | 7 + .../src/modules/labrinth/billing/internal.ts | 189 ++++++++ .../api-client/src/modules/labrinth/index.ts | 2 + .../src/modules/labrinth/projects/types/v2.ts | 115 ----- .../src/modules/labrinth/projects/types/v3.ts | 54 --- .../src/modules/labrinth/projects/v2.ts | 18 +- .../src/modules/labrinth/projects/v3.ts | 12 +- .../src/modules/labrinth/state/index.ts | 135 ++++++ .../api-client/src/modules/labrinth/types.ts | 453 ++++++++++++++++++ packages/api-client/src/modules/types.ts | 6 +- packages/api-client/src/types/request.ts | 2 +- packages/api-client/tsconfig.json | 5 +- .../illustrations}/minecraft_server_icon.png | Bin packages/assets/index.ts | 2 + packages/tooling-config/eslint/common.mjs | 2 + packages/ui/index.ts | 1 + packages/ui/package.json | 16 +- .../billing/ModalBasedServerPlan.vue | 32 +- .../billing/ModrinthServersPurchaseModal.vue | 46 +- .../src/components/billing/PurchaseModal.vue | 2 +- .../billing/ServersPurchase0Plan.vue | 29 +- .../billing/ServersPurchase1Region.vue | 143 +++--- .../billing/ServersPurchase3Review.vue | 61 ++- .../billing/ServersRegionButton.vue | 4 +- .../billing/ServersUpgradeModalWrapper.vue | 341 +++++++++++++ packages/ui/src/components/index.ts | 8 + .../ProjectSettingsEnvSelector.vue | 5 +- .../src/components}/servers/ServerListing.vue | 141 ++++-- .../servers/{ => icons}/LoaderIcon.vue | 0 .../components/servers/icons}/ServerIcon.vue | 4 +- .../servers/labels}/ServerGameLabel.vue | 9 +- .../servers/labels}/ServerInfoLabels.vue | 1 + .../servers/labels}/ServerLoaderLabel.vue | 12 +- .../servers/labels}/ServerSubdomainLabel.vue | 4 +- .../servers/labels}/ServerUptimeLabel.vue | 5 +- .../marketing/MedalBackgroundImage.vue | 1 - .../servers/marketing/MedalServerListing.vue | 66 +-- packages/ui/src/composables/stripe.ts | 138 ++---- packages/ui/src/pages/index.ts | 1 + .../ui/src/pages/servers/manage/index.vue | 339 +++++++++++++ packages/ui/src/providers/api-client.ts | 8 + packages/ui/src/providers/index.ts | 1 + packages/ui/src/providers/project-page.ts | 8 +- packages/ui/src/utils/product-utils.ts | 54 +++ pnpm-lock.yaml | 79 ++- 79 files changed, 2631 insertions(+), 1259 deletions(-) delete mode 100644 apps/frontend/src/components/ui/servers/ServerListingSkeleton.vue delete mode 100644 apps/frontend/src/components/ui/servers/ServerManageEmptyState.vue rename apps/frontend/src/{providers/api-client.ts => helpers/api.ts} (78%) create mode 100644 apps/frontend/src/plugins/tanstack.ts create mode 100644 packages/api-client/src/modules/archon/index.ts create mode 100644 packages/api-client/src/modules/archon/servers/v0.ts create mode 100644 packages/api-client/src/modules/archon/servers/v1.ts create mode 100644 packages/api-client/src/modules/archon/types.ts create mode 100644 packages/api-client/src/modules/iso3166/index.ts create mode 100644 packages/api-client/src/modules/iso3166/types.ts create mode 100644 packages/api-client/src/modules/kyros/files/v0.ts create mode 100644 packages/api-client/src/modules/kyros/types.ts create mode 100644 packages/api-client/src/modules/labrinth/billing/internal.ts delete mode 100644 packages/api-client/src/modules/labrinth/projects/types/v2.ts delete mode 100644 packages/api-client/src/modules/labrinth/projects/types/v3.ts create mode 100644 packages/api-client/src/modules/labrinth/state/index.ts create mode 100644 packages/api-client/src/modules/labrinth/types.ts rename {apps/frontend/src/assets/images/servers => packages/assets/external/illustrations}/minecraft_server_icon.png (100%) create mode 100644 packages/ui/src/components/billing/ServersUpgradeModalWrapper.vue rename {apps/frontend/src/components/ui => packages/ui/src/components}/servers/ServerListing.vue (56%) rename packages/ui/src/components/servers/{ => icons}/LoaderIcon.vue (100%) rename {apps/frontend/src/components/ui/servers => packages/ui/src/components/servers/icons}/ServerIcon.vue (85%) rename {apps/frontend/src/components/ui/servers => packages/ui/src/components/servers/labels}/ServerGameLabel.vue (89%) rename {apps/frontend/src/components/ui/servers => packages/ui/src/components/servers/labels}/ServerInfoLabels.vue (94%) rename {apps/frontend/src/components/ui/servers => packages/ui/src/components/servers/labels}/ServerLoaderLabel.vue (89%) rename {apps/frontend/src/components/ui/servers => packages/ui/src/components/servers/labels}/ServerSubdomainLabel.vue (93%) rename {apps/frontend/src/components/ui/servers => packages/ui/src/components/servers/labels}/ServerUptimeLabel.vue (94%) rename {apps/frontend/src/components/ui => packages/ui/src/components}/servers/marketing/MedalBackgroundImage.vue (96%) rename {apps/frontend/src/components/ui => packages/ui/src/components}/servers/marketing/MedalServerListing.vue (78%) create mode 100644 packages/ui/src/pages/index.ts create mode 100644 packages/ui/src/pages/servers/manage/index.vue create mode 100644 packages/ui/src/providers/api-client.ts create mode 100644 packages/ui/src/utils/product-utils.ts diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index 565b2391..d68bcf03 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -13,11 +13,13 @@ "test": "vue-tsc --noEmit" }, "dependencies": { - "@sfirew/minecraft-motd-parser": "^1.1.6", + "@modrinth/api-client": "workspace:^", "@modrinth/assets": "workspace:*", "@modrinth/ui": "workspace:*", "@modrinth/utils": "workspace:*", "@sentry/vue": "^8.27.0", + "@sfirew/minecraft-motd-parser": "^1.1.6", + "@tanstack/vue-query": "^5.90.7", "@tauri-apps/api": "^2.5.0", "@tauri-apps/plugin-dialog": "^2.2.1", "@tauri-apps/plugin-http": "^2.5.0", @@ -41,9 +43,9 @@ "vue-virtual-scroller": "v2.0.0-beta.8" }, "devDependencies": { - "@modrinth/tooling-config": "workspace:*", "@eslint/compat": "^1.1.1", "@formatjs/cli": "^6.2.12", + "@modrinth/tooling-config": "workspace:*", "@nuxt/eslint-config": "^0.5.6", "@taijased/vue-render-tracker": "^1.0.7", "@vitejs/plugin-vue": "^5.0.4", diff --git a/apps/app-frontend/src/App.vue b/apps/app-frontend/src/App.vue index 6eda2bc5..da980ba1 100644 --- a/apps/app-frontend/src/App.vue +++ b/apps/app-frontend/src/App.vue @@ -1,4 +1,5 @@ diff --git a/apps/frontend/src/components/ui/servers/ServerManageEmptyState.vue b/apps/frontend/src/components/ui/servers/ServerManageEmptyState.vue deleted file mode 100644 index cc2ab2ba..00000000 --- a/apps/frontend/src/components/ui/servers/ServerManageEmptyState.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue b/apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue index a9e5cf47..b3354419 100644 --- a/apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue +++ b/apps/frontend/src/components/ui/servers/ServersUpgradeModalWrapper.vue @@ -1,270 +1,24 @@ diff --git a/apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue b/apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue index 93898912..5af4b72f 100644 --- a/apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue +++ b/apps/frontend/src/components/ui/servers/marketing/MedalPlanPromotion.vue @@ -31,10 +31,9 @@ diff --git a/packages/ui/src/providers/api-client.ts b/packages/ui/src/providers/api-client.ts new file mode 100644 index 00000000..fcb9068f --- /dev/null +++ b/packages/ui/src/providers/api-client.ts @@ -0,0 +1,8 @@ +import type { AbstractModrinthClient } from '@modrinth/api-client' + +import { createContext } from './index' + +export const [injectModrinthClient, provideModrinthClient] = createContext( + 'root', + 'modrinthClient', +) diff --git a/packages/ui/src/providers/index.ts b/packages/ui/src/providers/index.ts index 646841b9..214a0f05 100644 --- a/packages/ui/src/providers/index.ts +++ b/packages/ui/src/providers/index.ts @@ -78,5 +78,6 @@ export function createContext( return [injectContext, provideContext] as const } +export * from './api-client' export * from './project-page' export * from './web-notifications' diff --git a/packages/ui/src/providers/project-page.ts b/packages/ui/src/providers/project-page.ts index 2f7183b5..cc9cbed4 100644 --- a/packages/ui/src/providers/project-page.ts +++ b/packages/ui/src/providers/project-page.ts @@ -1,11 +1,13 @@ -import type { Project, ProjectV3Partial, TeamMember } from '@modrinth/utils' +import type { Labrinth } from '@modrinth/api-client/src/modules/types' +// TODO: api client this shit +import type { TeamMember } from '@modrinth/utils' import type { Ref } from 'vue' import { createContext } from '.' export interface ProjectPageContext { - projectV2: Ref - projectV3: Ref + projectV2: Ref + projectV3: Ref refreshProject: () => Promise currentMember: Ref } diff --git a/packages/ui/src/utils/product-utils.ts b/packages/ui/src/utils/product-utils.ts new file mode 100644 index 00000000..21fdfb5d --- /dev/null +++ b/packages/ui/src/utils/product-utils.ts @@ -0,0 +1,54 @@ +import type { Labrinth } from '@modrinth/api-client' + +export function getProductDisplayName(product: Labrinth.Billing.Internal.Product): string { + const { metadata } = product + + if (metadata.type === 'pyro') { + const ramGB = metadata.ram / 1024 + return `${ramGB}GB Server` + } + + if (metadata.type === 'medal') { + const ramGB = metadata.ram / 1024 + return `${ramGB}GB Medal Server (${metadata.region})` + } + + return 'Unknown Product' +} + +export function getProductDescription(product: Labrinth.Billing.Internal.Product): string { + const { metadata } = product + + if (metadata.type === 'pyro') { + return `${metadata.cpu} vCPU, ${metadata.ram}MB RAM, ${metadata.storage}MB Storage` + } + + if (metadata.type === 'medal') { + return `${metadata.cpu} vCPU, ${metadata.ram}MB RAM, ${metadata.storage}MB Storage` + } + + return '' +} + +export function getPriceForInterval( + product: Labrinth.Billing.Internal.Product, + currency: string, + interval: Labrinth.Billing.Internal.PriceDuration, +): number | undefined { + const productPrice = product.prices.find((x) => x.currency_code === currency) + if (!productPrice) return undefined + + const { prices } = productPrice + + if (prices.type === 'recurring') { + return prices.intervals[interval] + } + + return undefined +} + +export const monthsInInterval: Record<'monthly' | 'quarterly' | 'yearly', number> = { + monthly: 1, + quarterly: 3, + yearly: 12, +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e114697..d73e11cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,6 +47,9 @@ importers: apps/app-frontend: dependencies: + '@modrinth/api-client': + specifier: workspace:^ + version: link:../../packages/api-client '@modrinth/assets': specifier: workspace:* version: link:../../packages/assets @@ -62,6 +65,9 @@ importers: '@sfirew/minecraft-motd-parser': specifier: ^1.1.6 version: 1.1.6 + '@tanstack/vue-query': + specifier: ^5.90.7 + version: 5.90.7(vue@3.5.13(typescript@5.5.4)) '@tauri-apps/api': specifier: ^2.5.0 version: 2.5.0 @@ -239,6 +245,9 @@ importers: '@pinia/nuxt': specifier: ^0.5.1 version: 0.5.1(magicast@0.3.5)(rollup@4.28.1)(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4)) + '@tanstack/vue-query': + specifier: ^5.90.7 + version: 5.90.7(vue@3.5.13(typescript@5.5.4)) '@types/three': specifier: ^0.172.0 version: 0.172.0 @@ -287,9 +296,6 @@ importers: markdown-it: specifier: 14.1.0 version: 14.1.0 - papaparse: - specifier: ^5.4.1 - version: 5.5.3 pathe: specifier: ^1.1.2 version: 1.1.2 @@ -342,9 +348,6 @@ importers: '@types/node': specifier: ^20.1.0 version: 20.14.11 - '@types/papaparse': - specifier: ^5.3.15 - version: 5.3.16 '@vintl/compact-number': specifier: ^2.0.5 version: 2.0.7(@formatjs/intl@2.10.4(typescript@5.5.4)) @@ -544,12 +547,18 @@ importers: '@codemirror/view': specifier: ^6.22.1 version: 6.28.4 + '@modrinth/api-client': + specifier: workspace:* + version: link:../api-client '@modrinth/assets': specifier: workspace:* version: link:../assets '@modrinth/utils': specifier: workspace:* version: link:../utils + '@tanstack/vue-query': + specifier: ^5.90.7 + version: 5.90.7(vue@3.5.13(typescript@5.5.4)) '@tresjs/cientos': specifier: ^4.3.0 version: 4.3.1(@tresjs/core@4.3.6(three@0.172.0)(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4)))(@types/three@0.172.0)(react@19.1.1)(three@0.172.0)(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4)) @@ -580,6 +589,9 @@ importers: floating-vue: specifier: ^5.2.2 version: 5.2.2(@nuxt/kit@3.17.5(magicast@0.3.5))(vue@3.5.13(typescript@5.5.4)) + fuse.js: + specifier: ^6.6.2 + version: 6.6.2 highlight.js: specifier: ^11.9.0 version: 11.9.0 @@ -670,7 +682,7 @@ importers: version: 11.9.0 highlightjs-mcfunction: specifier: github:modrinth/better-highlightjs-mcfunction - version: https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/68a27ae888cfc0e8737f4f2cf1abb67e82078166 + version: https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/aa999b763fd792ffb950d28347eeb6811c83ea8e markdown-it: specifier: ^14.1.0 version: 14.1.0 @@ -2587,6 +2599,22 @@ packages: peerDependencies: vue: ^3.0.0 + '@tanstack/match-sorter-utils@8.19.4': + resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} + engines: {node: '>=12'} + + '@tanstack/query-core@5.90.7': + resolution: {integrity: sha512-6PN65csiuTNfBMXqQUxQhCNdtm1rV+9kC9YwWAIKcaxAauq3Wu7p18j3gQY3YIBJU70jT/wzCCZ2uqto/vQgiQ==} + + '@tanstack/vue-query@5.90.7': + resolution: {integrity: sha512-2h0esebc2qVRVDge3gFArhss5+qn/Wb4abXuaEliSy+/xPWQMrEX7Ny0UKkCy1HcMZZjvfTtNRUfpYrx+vpipw==} + peerDependencies: + '@vue/composition-api': ^1.1.2 + vue: ^2.6.0 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + '@taplo/core@0.2.0': resolution: {integrity: sha512-r8bl54Zj1In3QLkiW/ex694bVzpPJ9EhwqT9xkcUVODnVUGirdB1JTsmiIv0o1uwqZiwhi8xNnTOQBRQCpizrQ==} @@ -2806,9 +2834,6 @@ packages: '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - '@types/papaparse@5.3.16': - resolution: {integrity: sha512-T3VuKMC2H0lgsjI9buTB3uuKj3EMD2eap1MOuEQuBQ44EnDx/IkGhU6EwiTf9zG3za4SKlmwKAImdDKdNnCsXg==} - '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -5041,8 +5066,8 @@ packages: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} - highlightjs-mcfunction@https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/68a27ae888cfc0e8737f4f2cf1abb67e82078166: - resolution: {tarball: https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/68a27ae888cfc0e8737f4f2cf1abb67e82078166} + highlightjs-mcfunction@https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/aa999b763fd792ffb950d28347eeb6811c83ea8e: + resolution: {tarball: https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/aa999b763fd792ffb950d28347eeb6811c83ea8e} version: 1.0.0 hookable@5.5.3: @@ -6184,9 +6209,6 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - papaparse@5.5.3: - resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} - param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -6887,6 +6909,9 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + request-light@0.5.8: resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==} @@ -10522,6 +10547,20 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.5.4) + '@tanstack/match-sorter-utils@8.19.4': + dependencies: + remove-accents: 0.5.0 + + '@tanstack/query-core@5.90.7': {} + + '@tanstack/vue-query@5.90.7(vue@3.5.13(typescript@5.5.4))': + dependencies: + '@tanstack/match-sorter-utils': 8.19.4 + '@tanstack/query-core': 5.90.7 + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.5.4) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.5.4)) + '@taplo/core@0.2.0': {} '@taplo/lib@0.5.0': @@ -10740,10 +10779,6 @@ snapshots: '@types/offscreencanvas@2019.7.3': {} - '@types/papaparse@5.3.16': - dependencies: - '@types/node': 20.14.11 - '@types/resolve@1.20.2': {} '@types/rss@0.0.32': {} @@ -13731,7 +13766,7 @@ snapshots: highlight.js@11.9.0: {} - highlightjs-mcfunction@https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/68a27ae888cfc0e8737f4f2cf1abb67e82078166: {} + highlightjs-mcfunction@https://codeload.github.com/modrinth/better-highlightjs-mcfunction/tar.gz/aa999b763fd792ffb950d28347eeb6811c83ea8e: {} hookable@5.5.3: {} @@ -15299,8 +15334,6 @@ snapshots: pako@1.0.11: {} - papaparse@5.5.3: {} - param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -16033,6 +16066,8 @@ snapshots: mdast-util-to-markdown: 2.1.0 unified: 11.0.5 + remove-accents@0.5.0: {} + request-light@0.5.8: {} request-light@0.7.0: {}