diff --git a/app/api/suggestion/route.ts b/app/api/suggestion/route.ts index addc4a6..0c4101e 100644 --- a/app/api/suggestion/route.ts +++ b/app/api/suggestion/route.ts @@ -1,9 +1,12 @@ import { completeGoogle } from "search-engine-autocomplete"; import { NextRequest } from "next/server" +import { suggestionsResponse } from "@/global"; export async function GET(request: NextRequest) { const query = request.nextUrl.searchParams.get('q')!; - const language = "ja-JP"; + const t = parseInt(request.nextUrl.searchParams.get('t') || "0") || null; + let language = request.nextUrl.searchParams.get('l'); + if (language === null) language = 'en-US'; const data = await completeGoogle(query, language); - return new Response(JSON.stringify(data)); + return new Response(JSON.stringify({...data, time: t} as suggestionsResponse)); } diff --git a/components/search/onesearch/onesearch.tsx b/components/search/onesearch/onesearch.tsx index f8d1730..db0b885 100644 --- a/components/search/onesearch/onesearch.tsx +++ b/components/search/onesearch/onesearch.tsx @@ -3,20 +3,31 @@ import SuggestionBox from "./suggestionBox"; import Suggestion from "./suggestion"; import { useRecoilValue } from "recoil"; import { queryState } from "@/components/state/query"; +import { Suggestion as SuggestionType, Suggestions } from "search-engine-autocomplete"; +import { useLocale } from "next-intl"; +import { suggestionsResponse } from "@/global"; export default function () { - const [suggestion, setSuggetsion] = useState([]); + const [suggestion, setSuggetsion] = useState([] as string[]); + const [lastUpdate, setLastUpdate] = useState(0); const query = useRecoilValue(queryState); + const lang = useLocale(); useEffect(() => { - fetch(`/api/suggestion?q=${query}`) + const time = new Date().getTime().toString(); + fetch(`/api/suggestion?q=${query}&l=${lang}&t=${time}`) .then((res) => res.json()) - .then((data) => { - setSuggetsion(data); + .then((data: suggestionsResponse) => { + const suggestions = data.suggestions; + if (data.time < lastUpdate) return; + setSuggetsion((_) => { + return suggestions.map((s: SuggestionType) => s.suggestion); + }); + setLastUpdate(new Date().getTime()); }); }, [query]); return ( - {suggestion.map((s: string) => { + {suggestion.slice(0, 10).map((s: string) => { return {s}; })} diff --git a/components/search/onesearch/suggestionBox.tsx b/components/search/onesearch/suggestionBox.tsx index b1d4fd9..bd40c52 100644 --- a/components/search/onesearch/suggestionBox.tsx +++ b/components/search/onesearch/suggestionBox.tsx @@ -1,7 +1,7 @@ export default function(props: { children: React.ReactNode }) { return ( -
+
{props.children}
); diff --git a/global.d.ts b/global.d.ts index 66fa85b..0dc44c4 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1,3 +1,5 @@ +import { Suggestion } from "search-engine-autocomplete"; + type settings = { version: number; elementBackdrop: boolean; @@ -8,3 +10,10 @@ type settings = { [key: string]: string, }; }; + +type suggestionsResponse = { + suggestions: Suggestion[], + query: string, + verbatimRelevance: number, + time: number +} \ No newline at end of file diff --git a/i18n.ts b/i18n.ts index 756b407..223f1f4 100644 --- a/i18n.ts +++ b/i18n.ts @@ -1,14 +1,14 @@ -import {notFound} from 'next/navigation'; -import {getRequestConfig} from 'next-intl/server'; - +import { notFound } from "next/navigation"; +import { getRequestConfig } from "next-intl/server"; + // Can be imported from a shared config -const locales = ['en', 'zh']; - -export default getRequestConfig(async ({locale}) => { - // Validate that the incoming `locale` parameter is valid - if (!locales.includes(locale as any)) notFound(); - - return { - messages: (await import(`/messages/${locale}.json`)).default - }; -}); \ No newline at end of file +const locales = ["en-US", "zh-CN"]; + +export default getRequestConfig(async ({ locale }) => { + // Validate that the incoming `locale` parameter is valid + if (!locales.includes(locale as any)) notFound(); + + return { + messages: (await import(`/messages/${locale}.json`)).default + }; +}); diff --git a/messages/en.json b/messages/en-US.json similarity index 100% rename from messages/en.json rename to messages/en-US.json diff --git a/messages/zh.json b/messages/zh-CN.json similarity index 100% rename from messages/zh.json rename to messages/zh-CN.json diff --git a/middleware.ts b/middleware.ts index 2eeb5b8..cd43491 100644 --- a/middleware.ts +++ b/middleware.ts @@ -2,13 +2,13 @@ import createMiddleware from 'next-intl/middleware'; export default createMiddleware({ // A list of all locales that are supported - locales: ['en', 'zh'], + locales: ['en-US', 'zh-CN'], // Used when no locale matches - defaultLocale: 'en' + defaultLocale: 'en-US' }); export const config = { // Match only internationalized pathnames - matcher: ['/', '/(zh|en)/:path*'] + matcher: ['/', '/(zh-CN|en-US)/:path*'] }; \ No newline at end of file diff --git a/package.json b/package.json index f6f02cc..4640652 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "recoil": "^0.7.7", - "search-engine-autocomplete": "^0.4.2", + "search-engine-autocomplete": "^0.4.3", "tailwind-merge": "^2.2.2", "ts-node": "^10.9.2", "valid-url": "^1.0.9", @@ -31,7 +31,7 @@ "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.3.0", "@types/jest": "^29.5.12", - "@types/node": "^20.12.6", + "@types/node": "^20.12.7", "@types/punycode": "^2.1.4", "@types/react": "^18.2.75", "@types/react-dom": "^18.2.24", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b691ee6..06f9563 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,14 +36,14 @@ dependencies: specifier: ^0.7.7 version: 0.7.7(react-dom@18.2.0)(react@18.2.0) search-engine-autocomplete: - specifier: ^0.4.2 - version: 0.4.2 + specifier: ^0.4.3 + version: 0.4.3 tailwind-merge: specifier: ^2.2.2 version: 2.2.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.6)(typescript@5.4.4) + version: 10.9.2(@types/node@20.12.7)(typescript@5.4.4) valid-url: specifier: ^1.0.9 version: 1.0.9 @@ -65,8 +65,8 @@ devDependencies: specifier: ^29.5.12 version: 29.5.12 '@types/node': - specifier: ^20.12.6 - version: 20.12.6 + specifier: ^20.12.7 + version: 20.12.7 '@types/punycode': specifier: ^2.1.4 version: 2.1.4 @@ -84,7 +84,7 @@ devDependencies: version: 10.4.19(postcss@8.4.38) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + version: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -570,7 +570,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -591,14 +591,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -626,7 +626,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 jest-mock: 29.7.0 dev: true @@ -653,7 +653,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.12.6 + '@types/node': 20.12.7 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -686,7 +686,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.12.6 + '@types/node': 20.12.7 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -774,7 +774,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.12.6 + '@types/node': 20.12.7 '@types/yargs': 17.0.32 chalk: 4.1.2 dev: true @@ -3194,7 +3194,7 @@ packages: chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - jest: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) lodash: 4.17.21 redent: 3.0.0 dev: true @@ -3266,7 +3266,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.12.6 + '@types/node': 20.12.7 dev: true /@types/istanbul-lib-coverage@2.0.6: @@ -3295,13 +3295,13 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 20.12.6 + '@types/node': 20.12.7 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true - /@types/node@20.12.6: - resolution: {integrity: sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 @@ -3466,7 +3466,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.23.0 - caniuse-lite: 1.0.30001607 + caniuse-lite: 1.0.30001608 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -3583,8 +3583,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001607 - electron-to-chromium: 1.4.730 + caniuse-lite: 1.0.30001608 + electron-to-chromium: 1.4.731 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -3642,8 +3642,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001607: - resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==} + /caniuse-lite@1.0.30001608: + resolution: {integrity: sha512-cjUJTQkk9fQlJR2s4HMuPMvTiRggl0rAVMtthQuyOlDWuqHXqN8azLq+pi8B2TjwKJ32diHjUqRIKeFX4z1FoA==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3787,7 +3787,7 @@ packages: /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /create-jest@29.7.0(@types/node@20.12.6)(ts-node@10.9.2): + /create-jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3796,7 +3796,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3976,8 +3976,8 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /electron-to-chromium@1.4.730: - resolution: {integrity: sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==} + /electron-to-chromium@1.4.731: + resolution: {integrity: sha512-+TqVfZjpRz2V/5SPpmJxq9qK620SC5SqCnxQIOi7i/U08ZDcTpKbT7Xjj9FU5CbXTMUb4fywbIr8C7cGv4hcjw==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -4684,7 +4684,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -4705,7 +4705,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@20.12.6)(ts-node@10.9.2): + /jest-cli@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4719,10 +4719,10 @@ packages: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -4733,7 +4733,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@20.12.6)(ts-node@10.9.2): + /jest-config@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -4748,7 +4748,7 @@ packages: '@babel/core': 7.24.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 babel-jest: 29.7.0(@babel/core@7.24.4) chalk: 4.1.2 ci-info: 3.9.0 @@ -4768,7 +4768,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@20.12.6)(typescript@5.4.4) + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.4) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -4815,7 +4815,7 @@ packages: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.12.6 + '@types/node': 20.12.7 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -4832,7 +4832,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 jest-mock: 29.7.0 jest-util: 29.7.0 dev: true @@ -4848,7 +4848,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.12.6 + '@types/node': 20.12.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -4899,7 +4899,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 jest-util: 29.7.0 dev: true @@ -4954,7 +4954,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -4985,7 +4985,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -5037,7 +5037,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -5062,7 +5062,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.12.6 + '@types/node': 20.12.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -5074,13 +5074,13 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.12.6 + '@types/node': 20.12.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@20.12.6)(ts-node@10.9.2): + /jest@29.7.0(@types/node@20.12.7)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -5093,7 +5093,7 @@ packages: '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -5388,7 +5388,7 @@ packages: '@next/env': 14.1.4 '@swc/helpers': 0.5.2 busboy: 1.6.0 - caniuse-lite: 1.0.30001607 + caniuse-lite: 1.0.30001608 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 @@ -5611,7 +5611,7 @@ packages: dependencies: lilconfig: 3.1.1 postcss: 8.4.38 - ts-node: 10.9.2(@types/node@20.12.6)(typescript@5.4.4) + ts-node: 10.9.2(@types/node@20.12.7)(typescript@5.4.4) yaml: 2.4.1 /postcss-nested@6.0.1(postcss@8.4.38): @@ -5898,8 +5898,8 @@ packages: compute-scroll-into-view: 3.1.0 dev: false - /search-engine-autocomplete@0.4.2: - resolution: {integrity: sha512-/aVUK+SEmU3IbAhLSh4j/b33gdOUkk5asQY0Qf9xDAhsuCcwScEQ2BBTaURox3OP/7LnRaAMnmi/hsMgWRo85A==} + /search-engine-autocomplete@0.4.3: + resolution: {integrity: sha512-AqtfGrE+xFh89iNqRXxZ/H88fIzkTuftmcjMxRMTpbmLkSsGM4fJkx8N/xoe3OJYcWzjwj7cD2mdEMwBbxYcoQ==} dev: false /semver@6.3.1: @@ -6273,7 +6273,7 @@ packages: '@babel/core': 7.24.4 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.12.6)(ts-node@10.9.2) + jest: 29.7.0(@types/node@20.12.7)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -6283,7 +6283,7 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-node@10.9.2(@types/node@20.12.6)(typescript@5.4.4): + /ts-node@10.9.2(@types/node@20.12.7)(typescript@5.4.4): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -6302,7 +6302,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.12.6 + '@types/node': 20.12.7 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3