diff --git a/apps/website/package.json b/apps/website/package.json index 5f23bc353..d782af945 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -52,11 +52,11 @@ "@discordjs/ui": "workspace:^", "@microsoft/tsdoc": "^0.14.2", "@microsoft/tsdoc-config": "0.16.2", - "@planetscale/database": "^1.11.0", "@react-icons/all-files": "^4.1.0", "@vercel/analytics": "^1.1.1", "@vercel/edge-config": "^0.4.1", "@vercel/og": "^0.5.20", + "@vercel/postgres": "^0.5.1", "ariakit": "2.0.0-next.44", "bright": "^0.8.4", "class-variance-authority": "^0.7.0", diff --git a/apps/website/src/app/docAPI.ts b/apps/website/src/app/docAPI.ts index 1e496a005..863468445 100644 --- a/apps/website/src/app/docAPI.ts +++ b/apps/website/src/app/docAPI.ts @@ -1,26 +1,15 @@ import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; -import { connect } from '@planetscale/database'; - -const sql = connect({ - url: process.env.DATABASE_URL!, - async fetch(url, init) { - delete init?.cache; - return fetch(url, { ...init, next: { revalidate: 3_600 } }); - }, -}); +import { sql } from '@vercel/postgres'; export const fetchVersions = async (packageName: string): Promise => { - if (process.env.NEXT_PUBLIC_LOCAL_DEV || process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview') { + if (process.env.NEXT_PUBLIC_LOCAL_DEV === 'true' || process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview') { return ['main']; } try { - const { rows } = await sql.execute('select version from documentation where name = ? order by version desc', [ - packageName, - ]); + const { rows } = await sql`select version from documentation where name = ${packageName} order by version desc`; - // @ts-expect-error: https://github.com/planetscale/database-js/issues/71 return rows.map((row) => row.version); } catch { return []; @@ -28,7 +17,7 @@ export const fetchVersions = async (packageName: string): Promise => { }; export const fetchModelJSON = async (packageName: string, version: string) => { - if (process.env.NEXT_PUBLIC_LOCAL_DEV) { + if (process.env.NEXT_PUBLIC_LOCAL_DEV === 'true') { try { const res = await readFile( join(process.cwd(), '..', '..', 'packages', packageName, 'docs', 'docs.api.json'), @@ -43,12 +32,8 @@ export const fetchModelJSON = async (packageName: string, version: string) => { if (process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview') { try { - const { rows } = await sql.execute('select data from documentation where name = ? and version = ?', [ - packageName, - 'main', - ]); + const { rows } = await sql`select data from documentation where name = ${packageName} and version = ${'main'}`; - // @ts-expect-error: https://github.com/planetscale/database-js/issues/71 return rows[0]?.data ?? null; } catch { return null; @@ -56,12 +41,8 @@ export const fetchModelJSON = async (packageName: string, version: string) => { } try { - const { rows } = await sql.execute('select data from documentation where name = ? and version = ?', [ - packageName, - version, - ]); + const { rows } = await sql`select data from documentation where name = ${packageName} and version = ${version}`; - // @ts-expect-error: https://github.com/planetscale/database-js/issues/71 return rows[0]?.data ?? null; } catch { return null; diff --git a/apps/website/src/components/VersionSelect.tsx b/apps/website/src/components/VersionSelect.tsx index ea269f72e..2baed1686 100644 --- a/apps/website/src/components/VersionSelect.tsx +++ b/apps/website/src/components/VersionSelect.tsx @@ -7,7 +7,7 @@ import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { useMemo } from 'react'; -const isDev = process.env.NEXT_PUBLIC_LOCAL_DEV ?? process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview'; +const isDev = process.env.NEXT_PUBLIC_LOCAL_DEV === 'true' ?? process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview'; export default function VersionSelect({ versions }: { readonly versions: string[] }) { const pathname = usePathname(); diff --git a/apps/website/src/middleware.ts b/apps/website/src/middleware.ts index e5114d95f..15861aa47 100644 --- a/apps/website/src/middleware.ts +++ b/apps/website/src/middleware.ts @@ -1,26 +1,15 @@ -import { connect } from '@planetscale/database'; import { get } from '@vercel/edge-config'; +import { sql } from '@vercel/postgres'; import { NextResponse, type NextRequest } from 'next/server'; import { PACKAGES } from './util/constants'; -const sql = connect({ - url: process.env.DATABASE_URL!, - async fetch(url, init) { - delete init?.cache; - return fetch(url, { ...init, next: { revalidate: 3_600 } }); - }, -}); - async function fetchLatestVersion(packageName: string): Promise { - if (process.env.NEXT_PUBLIC_LOCAL_DEV || process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview') { + if (process.env.NEXT_PUBLIC_LOCAL_DEV === 'true' || process.env.NEXT_PUBLIC_VERCEL_ENV === 'preview') { return 'main'; } - const { rows } = await sql.execute('select version from documentation where name = ? order by version desc', [ - packageName, - ]); + const { rows } = await sql`select version from documentation where name = ${packageName} order by version desc`; - // @ts-expect-error: https://github.com/planetscale/database-js/issues/71 return rows.map((row) => row.version).at(1) ?? 'main'; } diff --git a/packages/actions/package.json b/packages/actions/package.json index 64746d92b..6bf7c027d 100644 --- a/packages/actions/package.json +++ b/packages/actions/package.json @@ -43,7 +43,7 @@ "@actions/core": "^1.10.1", "@actions/glob": "^0.4.0", "@discordjs/scripts": "workspace:^", - "@planetscale/database": "^1.11.0", + "@vercel/postgres": "^0.5.1", "meilisearch": "^0.35.0", "tslib": "^2.6.2", "undici": "5.27.2" diff --git a/packages/actions/src/uploadDocumentation/index.ts b/packages/actions/src/uploadDocumentation/index.ts index ff3475e61..d766f2750 100644 --- a/packages/actions/src/uploadDocumentation/index.ts +++ b/packages/actions/src/uploadDocumentation/index.ts @@ -2,8 +2,7 @@ import { readFile } from 'node:fs/promises'; import process from 'node:process'; import { getInput, setFailed } from '@actions/core'; import { create } from '@actions/glob'; -import { connect } from '@planetscale/database'; -import { fetch } from 'undici'; +import { createPool } from '@vercel/postgres'; if (!process.env.DATABASE_URL) { setFailed('DATABASE_URL is not set'); @@ -12,9 +11,8 @@ if (!process.env.DATABASE_URL) { const pkg = getInput('package') || '*'; const version = getInput('version') || 'main'; -const sql = connect({ - fetch, - url: process.env.DATABASE_URL!, +const pool = createPool({ + connectionString: process.env.DATABASE_URL, }); const globber = await create(`packages/${pkg}/docs/docs.api.json`); @@ -22,7 +20,7 @@ for await (const file of globber.globGenerator()) { const data = await readFile(file, 'utf8'); try { console.log(`Uploading ${file} with ${version}...`); - await sql.execute('replace into documentation (version, data) values (?, ?)', [version, data]); + await pool.sql`insert into documentation (version, data) values (${version}, ${data}) on conflict (version) do update set data = EXCLUDED.data`; } catch (error) { const err = error as Error; setFailed(err.message); diff --git a/packages/actions/src/uploadSearchIndices/index.ts b/packages/actions/src/uploadSearchIndices/index.ts index 76b0f5cbc..655441294 100644 --- a/packages/actions/src/uploadSearchIndices/index.ts +++ b/packages/actions/src/uploadSearchIndices/index.ts @@ -1,9 +1,8 @@ import process from 'node:process'; import { setFailed } from '@actions/core'; import { generateAllIndices } from '@discordjs/scripts'; -import { connect } from '@planetscale/database'; +import { createPool } from '@vercel/postgres'; import { MeiliSearch } from 'meilisearch'; -import { fetch } from 'undici'; if (!process.env.DATABASE_URL) { setFailed('DATABASE_URL is not set'); @@ -17,9 +16,8 @@ if (!process.env.SEARCH_API_KEY) { setFailed('SEARCH_API_KEY is not set'); } -const sql = connect({ - fetch, - url: process.env.DATABASE_URL!, +const pool = createPool({ + connectionString: process.env.DATABASE_URL, }); const client = new MeiliSearch({ @@ -32,20 +30,15 @@ try { const indices = await generateAllIndices({ fetchPackageVersions: async (pkg) => { console.log(`Fetching versions for ${pkg}...`); - const { rows } = await sql.execute('select version from documentation where name = ?', [pkg]); + const { rows } = await pool.sql`select version from documentation where name = ${pkg}`; - // @ts-expect-error: https://github.com/planetscale/database-js/issues/71 return rows.map((row) => row.version); }, fetchPackageVersionDocs: async (pkg, version) => { console.log(`Fetching data for ${pkg} ${version}...`); - const { rows } = await sql.execute('select data from documentation where name = ? and version = ?', [ - pkg, - version, - ]); + const { rows } = await pool.sql`select data from documentation where name = ${pkg} and version = ${version}`; - // @ts-expect-error: https://github.com/planetscale/database-js/issues/71 - return rows[0].data; + return rows[0]?.data ?? null; }, writeToFile: false, }); diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 7da2b11b4..508f36316 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -58,7 +58,7 @@ "@discordjs/api-extractor-utils": "workspace:^", "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "0.16.2", - "@planetscale/database": "^1.11.0", + "@vercel/postgres": "^0.5.1", "tslib": "^2.6.2", "undici": "5.27.2", "yaml": "2.3.4" diff --git a/packages/scripts/src/populateDevDatabaseBranch.ts b/packages/scripts/src/populateDevDatabaseBranch.ts index de48b654e..8364dc8a6 100644 --- a/packages/scripts/src/populateDevDatabaseBranch.ts +++ b/packages/scripts/src/populateDevDatabaseBranch.ts @@ -1,15 +1,14 @@ import { readFile } from 'node:fs/promises'; import process, { cwd } from 'node:process'; import { create } from '@actions/glob'; -import { connect } from '@planetscale/database'; +import { createPool } from '@vercel/postgres'; -const sql = connect({ - url: process.env.DATABASE_URL!, +const pool = createPool({ + connectionString: process.env.DATABASE_URL, }); process.chdir(`${cwd()}/../../`); const globber = await create(`packages/*/docs/*.api.json`); -// const globber2 = await create(`discord.js/*.json`); for await (const file of globber.globGenerator()) { const parsed = /(?\d+.\d+.\d+)-?.*/.exec(file); const data = await readFile(file, 'utf8'); @@ -17,14 +16,14 @@ for await (const file of globber.globGenerator()) { if (parsed?.groups) { console.log(parsed.groups.semver, file); try { - await sql.execute('replace into documentation (version, data) values (?, ?)', [parsed.groups.semver, data]); + await pool.sql`insert into documentation (version, data) values (${parsed.groups.semver}, ${data}) on conflict (name, version) do update set data = EXCLUDED.data`; } catch (error) { console.error(error); } } else { console.log('main', file); try { - await sql.execute('replace into documentation (version, data) values (?, ?)', ['main', data]); + await pool.sql`insert into documentation (version, data) values (${'main'}, ${data}) on conflict (name, version) do update set data = EXCLUDED.data`; } catch (error) { console.error(error); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3084e501f..8470b7dbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -244,9 +244,6 @@ importers: '@microsoft/tsdoc-config': specifier: 0.16.2 version: 0.16.2(patch_hash=35av6rrndvjtr2u2jso66jatbu) - '@planetscale/database': - specifier: ^1.11.0 - version: 1.11.0 '@react-icons/all-files': specifier: ^4.1.0 version: 4.1.0(react@18.2.0) @@ -259,6 +256,9 @@ importers: '@vercel/og': specifier: ^0.5.20 version: 0.5.20 + '@vercel/postgres': + specifier: ^0.5.1 + version: 0.5.1 ariakit: specifier: 2.0.0-next.44 version: 2.0.0-next.44(@types/react@18.2.37)(react-dom@18.2.0)(react@18.2.0) @@ -386,9 +386,9 @@ importers: '@discordjs/scripts': specifier: workspace:^ version: link:../scripts - '@planetscale/database': - specifier: ^1.11.0 - version: 1.11.0 + '@vercel/postgres': + specifier: ^0.5.1 + version: 0.5.1 meilisearch: specifier: ^0.35.0 version: 0.35.0 @@ -933,7 +933,7 @@ importers: version: 5.27.2 ws: specifier: 8.14.2 - version: 8.14.2 + version: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) devDependencies: '@discordjs/api-extractor': specifier: workspace:^ @@ -1340,9 +1340,9 @@ importers: '@microsoft/tsdoc-config': specifier: 0.16.2 version: 0.16.2(patch_hash=35av6rrndvjtr2u2jso66jatbu) - '@planetscale/database': - specifier: ^1.11.0 - version: 1.11.0 + '@vercel/postgres': + specifier: ^0.5.1 + version: 0.5.1 tslib: specifier: ^2.6.2 version: 2.6.2 @@ -1560,7 +1560,7 @@ importers: version: 2.6.2 ws: specifier: ^8.14.2 - version: 8.14.2 + version: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) devDependencies: '@babel/core': specifier: ^7.23.3 @@ -1651,7 +1651,7 @@ importers: version: 2.6.2 ws: specifier: ^8.14.2 - version: 8.14.2 + version: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) devDependencies: '@discordjs/api-extractor': specifier: workspace:^ @@ -4929,6 +4929,12 @@ packages: tar-fs: 2.1.1 dev: true + /@neondatabase/serverless@0.6.0: + resolution: {integrity: sha512-qXxBRYN0m2v8kVQBfMxbzNGn2xFAhTXFibzQlE++NfJ56Shz3m7+MyBBtXDlEH+3Wfa6lToDXf1MElocY4sJ3w==} + dependencies: + '@types/pg': 8.6.6 + dev: false + /@next/bundle-analyzer@14.0.3-canary.5: resolution: {integrity: sha512-PhGJFo0FDJxIlNyD8SZmVBrDmSESyS2R5snCH0sqCY4OGlJJbWsxQ1EXlL63nO6UtPqxuifcyHUQJNSm6eFWLg==} dependencies: @@ -5362,11 +5368,6 @@ packages: tslib: 2.6.2 dev: true - /@planetscale/database@1.11.0: - resolution: {integrity: sha512-aWbU+D/IRHoDE9975y+Q4c+EwwAWxCPwFId+N1AhQVFXzbeJMkj6KN2iQtoi03elcLMRdfT+V3i9Z4WRw+/oIA==} - engines: {node: '>=16'} - dev: false - /@polka/url@1.0.0-next.23: resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} dev: true @@ -7191,7 +7192,7 @@ packages: util: 0.12.5 util-deprecate: 1.0.2 watchpack: 2.4.0 - ws: 8.14.2 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) transitivePeerDependencies: - bufferutil - encoding @@ -7972,6 +7973,14 @@ packages: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: false + /@types/pg@8.6.6: + resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} + dependencies: + '@types/node': 18.18.9 + pg-protocol: 1.6.0 + pg-types: 2.2.0 + dev: false + /@types/pretty-hrtime@1.0.2: resolution: {integrity: sha512-vyv9knII8XeW8TnXDcGH7HqG6FeR56ESN6ExM34d/U8Zvs3xuG34euV6CVyB7KEYI7Ts4lQM8b4NL72e7UadnA==} dev: true @@ -8725,6 +8734,16 @@ packages: yoga-wasm-web: 0.3.3 dev: false + /@vercel/postgres@0.5.1: + resolution: {integrity: sha512-JKl8QOBIDnifhkxAhIKtY0A5Tb8oWBf2nzZhm0OH7Ffjsl0hGVnDL2w1/FCfpX8xna3JAWM034NGuhZfTFdmiw==} + engines: {node: '>=14.6'} + dependencies: + '@neondatabase/serverless': 0.6.0 + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 + ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3) + dev: false + /@vercel/python@4.1.0: resolution: {integrity: sha512-EIQXK5zL6fce0Barh74gc7xyLtRyvgmLZDIVQ8yJLtFxPlPCRY3GXkdJ7Jdcw8Pd0uuVF0vIHatv18xSLbcwtg==} dev: true @@ -9915,6 +9934,13 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 + /bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.1 + /builtin-modules@1.1.1: resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} engines: {node: '>=0.10.0'} @@ -17519,7 +17545,6 @@ packages: /node-gyp-build@4.6.1: resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true - dev: true /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -18232,6 +18257,26 @@ packages: is-reference: 3.0.2 dev: false + /pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + dev: false + + /pg-protocol@1.6.0: + resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + dev: false + + /pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -18410,6 +18455,28 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + dev: false + + /postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + dependencies: + xtend: 4.0.2 + dev: false + /prebuild-install@7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} @@ -21816,6 +21883,13 @@ packages: react: 18.2.0 tslib: 2.6.2 + /utf-8-validate@6.0.3: + resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==} + engines: {node: '>=6.14.2'} + requiresBuild: true + dependencies: + node-gyp-build: 4.6.1 + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -22541,7 +22615,7 @@ packages: optional: true dev: true - /ws@8.14.2: + /ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3): resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} peerDependencies: @@ -22552,6 +22626,9 @@ packages: optional: true utf-8-validate: optional: true + dependencies: + bufferutil: 4.0.8 + utf-8-validate: 6.0.3 /xdg-app-paths@5.1.0: resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} @@ -22579,7 +22656,6 @@ packages: /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - dev: true /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}