From 1965a2bd9cb6ca8c3c89d7de75feefd1b87ffdea Mon Sep 17 00:00:00 2001 From: Gabriel Logan Date: Tue, 29 Oct 2024 22:27:15 -0300 Subject: [PATCH] refactor: improving code, cleaner code, improving type safety and changing axios to fetch --- docs/package.json | 3 +- docs/src/actions/index.ts | 154 ++++------------- docs/src/app/not-found.tsx | 2 +- docs/src/app/sitemap.ts | 32 +--- .../components/FormTransLiveText/index.tsx | 8 +- .../components/FormTransMultiText/index.tsx | 8 +- .../FormTransUnicJson/ResultDiv.tsx | 14 +- .../components/FormTransUnicJson/Textarea.tsx | 6 +- docs/src/components/Header/index.tsx | 6 +- docs/src/lib/localesCode.ts | 31 ++++ docs/src/lib/translate.ts | 162 ++++++++++++++++++ docs/src/lib/translateText.ts | 33 ++++ docs/src/middleware.ts | 32 +--- docs/src/types/locales/index.ts | 4 +- docs/src/types/translations/index.ts | 48 ++++++ docs/yarn.lock | 101 +---------- 16 files changed, 347 insertions(+), 297 deletions(-) create mode 100644 docs/src/lib/localesCode.ts create mode 100644 docs/src/lib/translate.ts create mode 100644 docs/src/lib/translateText.ts create mode 100644 docs/src/types/translations/index.ts diff --git a/docs/package.json b/docs/package.json index 68030a5..3044c22 100644 --- a/docs/package.json +++ b/docs/package.json @@ -11,7 +11,6 @@ "dependencies": { "@vercel/analytics": "^1.3.1", "ace-builds": "^1.34.2", - "azure-translator-code": "^1.1.16", "next": "14.2.3", "next-international": "^1.2.4", "react": "^18", @@ -20,7 +19,7 @@ "react-icons": "^5.2.1", "react-syntax-highlighter": "^15.5.0", "sharp": "^0.33.4", - "uuid": "^10.0.0" + "uuid": "^11.0.2" }, "devDependencies": { "@types/node": "^20", diff --git a/docs/src/actions/index.ts b/docs/src/actions/index.ts index 53553df..449820b 100644 --- a/docs/src/actions/index.ts +++ b/docs/src/actions/index.ts @@ -1,13 +1,13 @@ "use server"; -import { translate, TranslationType } from "azure-translator-code"; -import { v4 as uuidv4 } from "uuid"; - +import localesCodes from "@/lib/localesCode"; +import translate from "@/lib/translate"; +import { translateText } from "@/lib/translateText"; import { getScopedI18n } from "@/locales/server"; -import { Langs } from "@/types/locales"; -// Cache to store translations -const translationCache: { [key: string]: TranslationType } = {}; +const key = process.env.AZURE_API_KEY ?? ""; +const endpoint = process.env.AZURE_ENDPOINT ?? ""; +const location = process.env.AZURE_LOCATION ?? ""; export async function makeTranslation(prevState: any, formData: FormData) { const scopedT = await getScopedI18n("Actions"); @@ -18,16 +18,6 @@ export async function makeTranslation(prevState: any, formData: FormData) { jsonFileText: formData.get("jsonfile"), }; - // Cache key - const cacheKey = `${data.fromLang}-${data.toLang}-${data.jsonFileText}`; - - // Check if the translation is in the cache - if (translationCache[cacheKey]) { - return { - message: translationCache[cacheKey], - }; - } - if (!data) { return { message: scopedT("MakeTranslations.Invalid or missing request body"), @@ -54,20 +44,13 @@ export async function makeTranslation(prevState: any, formData: FormData) { }; } - const key = process.env.AZURE_API_KEY ?? ""; // REPLACE WITH YOUR OWN KEY HERE - const endpoint = process.env.AZURE_ENDPOINT ?? ""; - const location = process.env.AZURE_LOCATION ?? ""; const fromLang = data.fromLang as string; const toLang = data.toLang as string; - - let translatedValues: TranslationType; - - const valuesToTranslate = data.jsonFileText; - const toLangs = [toLang]; + const valuesToTranslate = data.jsonFileText; try { - translatedValues = await translate( + const translatedValues = await translate( key, endpoint, location, @@ -75,18 +58,15 @@ export async function makeTranslation(prevState: any, formData: FormData) { toLangs, JSON.parse(valuesToTranslate as string), ); + + return { + message: translatedValues, + }; } catch { return { message: scopedT("MakeTranslations.Invalid json text passed"), }; } - - // Save the translation in the cache - translationCache[cacheKey] = translatedValues; - - return { - message: translatedValues, - }; } export async function makeTranslationMultilang( @@ -95,10 +75,6 @@ export async function makeTranslationMultilang( ) { const scopedT = await getScopedI18n("Actions"); - const key = process.env.AZURE_API_KEY ?? ""; - const endpoint = process.env.AZURE_ENDPOINT ?? ""; - const location = process.env.AZURE_LOCATION ?? ""; - const toTranslate = formData.get("toTranslate") as string; if (!toTranslate) { @@ -116,36 +92,7 @@ export async function makeTranslationMultilang( } const fromLang = formData.get("fromLang") as string; - - const languageCodes: Langs[] = [ - "en", - "pt", - "es", - "de", - "fr", - "it", - "ja", - "ko", - "ru", - "zh", - "ar", - "tr", - "vi", - "th", - "sv", - "pl", - "nl", - "da", - "fi", - "no", - "cs", - "hu", - "el", - "id", - "ms", - ]; - - const toLangs = languageCodes.filter((code) => formData.get(code) === "on"); + const toLangs = localesCodes.filter((code) => formData.get(code) === "on"); if (!toLangs.length) { return { @@ -153,30 +100,19 @@ export async function makeTranslationMultilang( }; } - let url = `/translate?api-version=3.0&from=${fromLang ?? "en"}`; - for (const lang of toLangs) { - url += `&to=${lang}`; - } - - let data: any; - try { - const pega = await fetch(endpoint + url, { - method: "POST", - headers: { - "Ocp-Apim-Subscription-Key": key, - "Ocp-Apim-Subscription-Region": location, - "Content-type": "application/json", - "X-ClientTraceId": uuidv4().toString(), - }, - body: JSON.stringify([ - { - text: toTranslate, - }, - ]), - }); + const data = await translateText( + toTranslate, + fromLang, + toLangs, + endpoint, + key, + location, + ); - data = await pega.json(); + return { + message: data[0].translations, + }; } catch { return { message: scopedT( @@ -184,10 +120,6 @@ export async function makeTranslationMultilang( ), }; } - - return { - message: data[0].translations, - }; } export async function makeLiveTranslation(prevState: any, formData: FormData) { @@ -225,37 +157,21 @@ export async function makeLiveTranslation(prevState: any, formData: FormData) { }; } - const key = process.env.AZURE_API_KEY ?? ""; // REPLACE WITH YOUR OWN KEY HERE - const endpoint = process.env.AZURE_ENDPOINT ?? ""; - const location = process.env.AZURE_LOCATION ?? ""; - const fromLang = data.fromLang; - const toLang = data.toLang; - const text = data.text; - - let translatedText: string; + const fromLang = data.fromLang as string; + const toLang = data.toLang as string; + const text = data.text as string; try { - const pega = await fetch( - `${endpoint}/translate?api-version=3.0&from=${String(fromLang)}&to=${String(toLang)}`, - { - method: "POST", - headers: { - "Ocp-Apim-Subscription-Key": key, - "Ocp-Apim-Subscription-Region": location, - "Content-type": "application/json", - "X-ClientTraceId": uuidv4().toString(), - }, - body: JSON.stringify([ - { - text, - }, - ]), - }, + const data = await translateText( + text, + fromLang, + [toLang], + endpoint, + key, + location, ); - const data = await pega.json(); - - translatedText = data[0].translations[0].text; + const translatedText = data[0].translations[0].text; return { message: translatedText, diff --git a/docs/src/app/not-found.tsx b/docs/src/app/not-found.tsx index 8449416..4af7063 100644 --- a/docs/src/app/not-found.tsx +++ b/docs/src/app/not-found.tsx @@ -41,7 +41,7 @@ export default async function NotFound() { alignSelf: "center", margin: "auto", }} - > + /> diff --git a/docs/src/app/sitemap.ts b/docs/src/app/sitemap.ts index e5d5291..1c21b91 100644 --- a/docs/src/app/sitemap.ts +++ b/docs/src/app/sitemap.ts @@ -1,36 +1,8 @@ import { MetadataRoute } from "next"; -import { Langs } from "@/types/locales"; +import languageCodes from "@/lib/localesCode"; -const langs: Langs[] = [ - "en", - "pt", - "es", - "de", - "fr", - "it", - "ja", - "ko", - "ru", - "zh", - "ar", - "tr", - "vi", - "th", - "sv", - "pl", - "nl", - "da", - "fi", - "no", - "cs", - "hu", - "el", - "id", - "ms", -]; - -const routes: MetadataRoute.Sitemap = langs.map((lang) => ({ +const routes: MetadataRoute.Sitemap = languageCodes.map((lang) => ({ url: `${process.env.NEXT_PUBLIC_WEBSITE_URL}/${lang}`, lastModified: new Date(), changeFrequency: "monthly", diff --git a/docs/src/components/FormTransLiveText/index.tsx b/docs/src/components/FormTransLiveText/index.tsx index ccff178..fb5323a 100644 --- a/docs/src/components/FormTransLiveText/index.tsx +++ b/docs/src/components/FormTransLiveText/index.tsx @@ -5,7 +5,8 @@ import { useFormState } from "react-dom"; import { makeLiveTranslation } from "@/actions"; import { useScopedI18n } from "@/locales/client"; -import { Locale } from "@/types/locales"; +import type { Locale } from "@/types/locales"; +import type { LanguagesCode } from "@/types/translations"; import InputResult from "./InputResult"; @@ -25,7 +26,10 @@ export default function FormTransLiveText({ locale }: Readonly) { const [response, action] = useFormState(makeLiveTranslation, initialState); - const languages = [ + const languages: { + id: LanguagesCode; + name: string; + }[] = [ { id: "en", name: scopedT("Langs.English") }, { id: "pt", name: scopedT("Langs.Portuguese") }, { id: "es", name: scopedT("Langs.Spanish") }, diff --git a/docs/src/components/FormTransMultiText/index.tsx b/docs/src/components/FormTransMultiText/index.tsx index d4acad7..40b03a1 100644 --- a/docs/src/components/FormTransMultiText/index.tsx +++ b/docs/src/components/FormTransMultiText/index.tsx @@ -5,7 +5,8 @@ import { useFormState } from "react-dom"; import { makeTranslationMultilang } from "@/actions"; import { useScopedI18n } from "@/locales/client"; -import { Locale } from "@/types/locales"; +import type { Locale } from "@/types/locales"; +import type { LanguagesCode } from "@/types/translations"; import { ButtonCopyUnicText } from "../ButtonCopy"; import ButtonSubmit from "../ButtonSubmit"; @@ -25,7 +26,10 @@ export default function FormTransMultiText({ locale }: Readonly) { const [textToTranslate, setTextToTranslate] = useState(""); - const languages = [ + const languages: { + id: LanguagesCode; + name: string; + }[] = [ { id: "en", name: scopedT("Langs.English") }, { id: "pt", name: scopedT("Langs.Portuguese") }, { id: "es", name: scopedT("Langs.Spanish") }, diff --git a/docs/src/components/FormTransUnicJson/ResultDiv.tsx b/docs/src/components/FormTransUnicJson/ResultDiv.tsx index 3bdcd2a..57e1e8b 100644 --- a/docs/src/components/FormTransUnicJson/ResultDiv.tsx +++ b/docs/src/components/FormTransUnicJson/ResultDiv.tsx @@ -23,13 +23,13 @@ export default function ResultDiv({ {pending ? (
-
-
-
-
-
-
-
+
+
+
+
+
+
+
) : (
diff --git a/docs/src/components/FormTransUnicJson/Textarea.tsx b/docs/src/components/FormTransUnicJson/Textarea.tsx
index 8b7f053..639cb89 100644
--- a/docs/src/components/FormTransUnicJson/Textarea.tsx
+++ b/docs/src/components/FormTransUnicJson/Textarea.tsx
@@ -39,10 +39,10 @@ export default function Textarea() {
 				name="jsonfileAce"
 				fontSize={14}
 				lineHeight={19}
-				showPrintMargin={true}
-				showGutter={true}
+				showPrintMargin
+				showGutter
 				width="100%"
-				highlightActiveLine={true}
+				highlightActiveLine
 				value={jsonFileText}
 				onChange={(value) => {
 					setJsonFileText(value);
diff --git a/docs/src/components/Header/index.tsx b/docs/src/components/Header/index.tsx
index 7f902bd..d2d9dcf 100644
--- a/docs/src/components/Header/index.tsx
+++ b/docs/src/components/Header/index.tsx
@@ -10,7 +10,7 @@ export default async function Header() {
 		
logo README.md{" "} diff --git a/docs/src/lib/localesCode.ts b/docs/src/lib/localesCode.ts new file mode 100644 index 0000000..333d1eb --- /dev/null +++ b/docs/src/lib/localesCode.ts @@ -0,0 +1,31 @@ +import type { LocalesCodes } from "@/types/locales"; + +const localesCodes: LocalesCodes[] = [ + "en", + "pt", + "es", + "de", + "fr", + "it", + "ja", + "ko", + "ru", + "zh", + "ar", + "tr", + "vi", + "th", + "sv", + "pl", + "nl", + "da", + "fi", + "no", + "cs", + "hu", + "el", + "id", + "ms", +]; + +export default localesCodes; diff --git a/docs/src/lib/translate.ts b/docs/src/lib/translate.ts new file mode 100644 index 0000000..4ed8ab8 --- /dev/null +++ b/docs/src/lib/translate.ts @@ -0,0 +1,162 @@ +import type { JSONValue, TranslationType } from "@/types/translations"; + +import { translateText } from "./translateText"; + +export default async function translate( + key: string, + endpoint: string, + location: string, + fromLang: string, + toLangs: string[], + jsonFile: TranslationType, +) { + const translatedJson: TranslationType = {}; + const isArrayBigerThanOne = toLangs.length > 1; + + for (const [jsonKey, jsonValue] of Object.entries(jsonFile)) { + translatedJson[jsonKey] = await translateValue( + jsonValue, + key, + endpoint, + location, + fromLang, + toLangs, + isArrayBigerThanOne, + ); + } + + return translatedJson; +} + +async function translateValue( + value: JSONValue, + key: string, + endpoint: string, + location: string, + fromLang: string, + toLangs: string[], + isArrayBigerThanOne: boolean, +): Promise { + if (isInvalidJSONValue(value)) { + throw new Error("Invalid JSON value"); + } + + if (isNotNeedToTranslate(value)) { + return value; + } else if (isString(value)) { + return await translateString( + value, + key, + endpoint, + location, + fromLang, + toLangs, + isArrayBigerThanOne, + ); + } else if (isArray(value)) { + return await translateArray( + value, + key, + endpoint, + location, + fromLang, + toLangs, + isArrayBigerThanOne, + ); + } else if (isObjectNotNull(value)) { + return await translate( + key, + endpoint, + location, + fromLang, + toLangs, + value as TranslationType, + ); + } else { + return null; + } +} + +async function translateString( + value: string, + key: string, + endpoint: string, + location: string, + fromLang: string, + toLangs: string[], + isArrayBigerThanOne: boolean, +): Promise { + const response = await translateText( + value, + fromLang, + toLangs, + endpoint, + key, + location, + ); + + const translations = response[0].translations; + + const translatedValues = translations.map((translation: any) => { + return translation.text; + }); + + return isArrayBigerThanOne ? translatedValues : translatedValues[0]; +} + +async function translateArray( + array: JSONValue[], + key: string, + endpoint: string, + location: string, + fromLang: string, + toLangs: string[], + isArrayBigerThanOne: boolean, +): Promise { + const translatedArray: (TranslationType | TranslationType[])[] = []; + for (const item of array) { + if (typeof item === "string") { + const translatedItem = await translateString( + item, + key, + endpoint, + location, + fromLang, + toLangs, + isArrayBigerThanOne, + ); + if (translatedItem !== null) { + translatedArray.push( + translatedItem as TranslationType | TranslationType[], + ); + } + } else { + translatedArray.push(item as TranslationType); + } + } + return translatedArray; +} + +function isObjectNotNull(value: JSONValue): value is Record { + return typeof value === "object" && value !== null; +} + +function isString(value: JSONValue): value is string { + return typeof value === "string"; +} + +function isArray(value: JSONValue): value is JSONValue[] { + return Array.isArray(value); +} + +function isNotNeedToTranslate(value: JSONValue): boolean { + const types = ["number", "boolean"]; + + return types.includes(typeof value); +} + +function isInvalidJSONValue(value: JSONValue): value is never { + const invalidTypes = ["function", "symbol", "undefined"]; + + return invalidTypes.includes(typeof value); +} diff --git a/docs/src/lib/translateText.ts b/docs/src/lib/translateText.ts new file mode 100644 index 0000000..ff95c11 --- /dev/null +++ b/docs/src/lib/translateText.ts @@ -0,0 +1,33 @@ +import { v4 as uuidv4 } from "uuid"; + +import type { TranslationTextFetch } from "@/types/translations"; + +export async function translateText( + text: string, + from: string, + to: string[], + endpoint: string, + key: string, + location: string, +): Promise { + const filteredEndpoint = endpoint.replace(/\/$/, ""); + + const toDestructured = to.map((lang) => `to=${lang}`).join("&"); + + const url = `${filteredEndpoint}/translate?api-version=3.0&from=${from}&${toDestructured}`; + + const response = await fetch(url, { + method: "POST", + body: JSON.stringify([{ text }]), + headers: { + "Ocp-Apim-Subscription-Key": key, + "Ocp-Apim-Subscription-Region": location, + "Content-type": "application/json", + "X-ClientTraceId": uuidv4().toString(), + }, + }); + + const data = await response.json(); + + return data; +} diff --git a/docs/src/middleware.ts b/docs/src/middleware.ts index 8c1fb9f..d77c537 100644 --- a/docs/src/middleware.ts +++ b/docs/src/middleware.ts @@ -2,38 +2,10 @@ import { NextRequest } from "next/server"; import { createI18nMiddleware } from "next-international/middleware"; -import { Langs } from "./types/locales"; - -const langs: Langs[] = [ - "en", - "pt", - "es", - "de", - "fr", - "it", - "ja", - "ko", - "ru", - "zh", - "ar", - "tr", - "vi", - "th", - "sv", - "pl", - "nl", - "da", - "fi", - "no", - "cs", - "hu", - "el", - "id", - "ms", -]; +import localesCodes from "./lib/localesCode"; const I18nMiddleware = createI18nMiddleware({ - locales: langs, + locales: localesCodes, defaultLocale: "en", urlMappingStrategy: "rewriteDefault", }); diff --git a/docs/src/types/locales/index.ts b/docs/src/types/locales/index.ts index 284173d..cc813d3 100644 --- a/docs/src/types/locales/index.ts +++ b/docs/src/types/locales/index.ts @@ -1,4 +1,4 @@ -export type Langs = +export type LocalesCodes = | "en" | "pt" | "es" @@ -26,5 +26,5 @@ export type Langs = | "ms"; export interface Locale { - locale: Readonly; + locale: Readonly; } diff --git a/docs/src/types/translations/index.ts b/docs/src/types/translations/index.ts new file mode 100644 index 0000000..691db9c --- /dev/null +++ b/docs/src/types/translations/index.ts @@ -0,0 +1,48 @@ +/** + * Represents the type of a translation object. + */ +export interface TranslationType { + [key: string]: JSONValue; +} + +export type JSONValue = + | string + | number + | boolean + | null + | JSONArray + | TranslationType + | object; +export interface JSONArray extends Array {} + +export type TranslationTextFetch = { + translations: { text: string; to: string }[]; +}[]; + +export type LanguagesCode = + | "en" + | "pt" + | "es" + | "de" + | "fr" + | "it" + | "ja" + | "ko" + | "ru" + | "zh-Hans" + | "zh-Hant" + | "ar" + | "tr" + | "vi" + | "th" + | "sv" + | "pl" + | "nl" + | "da" + | "fi" + | "no" + | "cs" + | "hu" + | "el" + | "id" + | "ms"; diff --git a/docs/yarn.lock b/docs/yarn.lock index 36e2ad9..a4f127a 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -1068,13 +1068,6 @@ __metadata: languageName: node linkType: hard -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d - languageName: node - linkType: hard - "available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" @@ -1091,17 +1084,6 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.7.7": - version: 1.7.7 - resolution: "axios@npm:1.7.7" - dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/4499efc89e86b0b49ffddc018798de05fab26e3bf57913818266be73279a6418c3ce8f9e934c7d2d707ab8c095e837fc6c90608fb7715b94d357720b5f568af7 - languageName: node - linkType: hard - "axobject-query@npm:^4.1.0": version: 4.1.0 resolution: "axobject-query@npm:4.1.0" @@ -1109,16 +1091,6 @@ __metadata: languageName: node linkType: hard -"azure-translator-code@npm:^1.1.16": - version: 1.1.16 - resolution: "azure-translator-code@npm:1.1.16" - dependencies: - axios: "npm:^1.7.7" - uuid: "npm:^10.0.0" - checksum: 10c0/3abb3f4aba4ca8a5299267a0d02162228c2a1342f5bd1542a40e9182eadebcf05f8bf5aed198c80ac067af4b0d96dbb7e80888bb7c4a7b79007fab202f19be3c - languageName: node - linkType: hard - "azure-translator-code@workspace:.": version: 0.0.0-use.local resolution: "azure-translator-code@workspace:." @@ -1130,7 +1102,6 @@ __metadata: "@types/uuid": "npm:^9.0.8" "@vercel/analytics": "npm:^1.3.1" ace-builds: "npm:^1.34.2" - azure-translator-code: "npm:^1.1.16" eslint: "npm:^8.57.0" eslint-config-next: "npm:14.2.3" eslint-config-universe: "npm:^12.1.0" @@ -1148,7 +1119,7 @@ __metadata: sharp: "npm:^0.33.4" tailwindcss: "npm:^3.4.1" typescript: "npm:^5" - uuid: "npm:^10.0.0" + uuid: "npm:^11.0.2" languageName: unknown linkType: soft @@ -1371,15 +1342,6 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - "comma-separated-tokens@npm:^1.0.0": version: 1.0.8 resolution: "comma-separated-tokens@npm:1.0.8" @@ -1544,13 +1506,6 @@ __metadata: languageName: node linkType: hard -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - "detect-libc@npm:^2.0.3": version: 2.0.3 resolution: "detect-libc@npm:2.0.3" @@ -2324,16 +2279,6 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.15.6": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f - languageName: node - linkType: hard - "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -2353,17 +2298,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.1 - resolution: "form-data@npm:4.0.1" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: 10c0/bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 - languageName: node - linkType: hard - "format@npm:^0.2.0": version: 0.2.2 resolution: "format@npm:0.2.2" @@ -3398,22 +3332,6 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - "minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -4167,13 +4085,6 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b - languageName: node - linkType: hard - "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -5173,12 +5084,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^10.0.0": - version: 10.0.0 - resolution: "uuid@npm:10.0.0" +"uuid@npm:^11.0.2": + version: 11.0.2 + resolution: "uuid@npm:11.0.2" bin: - uuid: dist/bin/uuid - checksum: 10c0/eab18c27fe4ab9fb9709a5d5f40119b45f2ec8314f8d4cf12ce27e4c6f4ffa4a6321dc7db6c515068fa373c075b49691ba969f0010bf37f44c37ca40cd6bf7fe + uuid: dist/esm/bin/uuid + checksum: 10c0/bd0670a0d6f77f1932da7544c51c32ceb467f3835382df2265f3275c4981d32c136a08a4369fb027ecfffd0b2ae48f19a28266ef636c7347264d5720e85d5ba0 languageName: node linkType: hard