Feat: may setup proxy (#238)
* add https proxy * remove proxy in renderer * proxy work for openai request * use proxyAgent to enable system proxy * add proxy setting * tweak proxy setting
This commit is contained in:
@@ -114,6 +114,7 @@
|
||||
"fluent-ffmpeg": "^2.1.2",
|
||||
"fs-extra": "^11.2.0",
|
||||
"html-to-text": "^9.0.5",
|
||||
"https-proxy-agent": "^7.0.2",
|
||||
"i18next": "^23.8.1",
|
||||
"intl-tel-input": "^19.2.15",
|
||||
"js-md5": "^0.8.3",
|
||||
@@ -126,6 +127,7 @@
|
||||
"openai": "^4.26.0",
|
||||
"pitchfinder": "^2.3.2",
|
||||
"postcss": "^8.4.33",
|
||||
"proxy-agent": "^6.3.1",
|
||||
"react": "^18.2.0",
|
||||
"react-activity-calendar": "^2.2.7",
|
||||
"react-dom": "^18.2.0",
|
||||
|
||||
@@ -235,6 +235,8 @@
|
||||
"resetAllConfirmation": "It will remove all of your personal data, are you sure?",
|
||||
"resetSettings": "Reset Settings",
|
||||
"resetSettingsConfirmation": "It will reset all of your settings, are you sure? The library will not be affected.",
|
||||
"proxySettings": "Proxy Settings",
|
||||
"proxyConfigUpdated": "Proxy config updated",
|
||||
"logoutAndRemoveAllPersonalData": "Logout and remove all personal data",
|
||||
"logoutAndRemoveAllPersonalSettings": "Logout and remove all personal settings",
|
||||
"hotkeys": "Hotkeys",
|
||||
|
||||
@@ -235,6 +235,8 @@
|
||||
"resetAllConfirmation": "这将删除您的所有个人数据, 您确定要重置吗?",
|
||||
"resetSettings": "重置设置选项",
|
||||
"resetSettingsConfirmation": "您确定要重置个人设置选项吗?资料库不会受影响。",
|
||||
"proxySettings": "代理设置",
|
||||
"proxyConfigUpdated": "代理配置已更新",
|
||||
"logoutAndRemoveAllPersonalData": "退出登录并删除所有个人数据",
|
||||
"logoutAndRemoveAllPersonalSettings": "退出登录并删除所有个人设置选项",
|
||||
"hotkeys": "快捷键",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { app, BrowserWindow, globalShortcut, protocol, net } from "electron";
|
||||
import { app, BrowserWindow, protocol, net } from "electron";
|
||||
import path from "path";
|
||||
import settings from "@main/settings";
|
||||
import "@main/i18n";
|
||||
|
||||
@@ -31,6 +31,7 @@ import Ffmpeg from "@main/ffmpeg";
|
||||
import whisper from "@main/whisper";
|
||||
import { hashFile } from "@/utils";
|
||||
import { WEB_API_URL } from "@/constants";
|
||||
import proxyAgent from "@main/proxy-agent";
|
||||
|
||||
const logger = log.scope("db/models/conversation");
|
||||
@Table({
|
||||
@@ -137,36 +138,51 @@ export class Conversation extends Model<Conversation> {
|
||||
|
||||
// choose llm based on engine
|
||||
llm() {
|
||||
const { httpAgent, fetch } = proxyAgent();
|
||||
if (this.engine === "enjoyai") {
|
||||
return new ChatOpenAI({
|
||||
openAIApiKey: settings.getSync("user.accessToken") as string,
|
||||
modelName: this.model,
|
||||
configuration: {
|
||||
baseURL: `${process.env.WEB_API_URL || WEB_API_URL}/api/ai`,
|
||||
return new ChatOpenAI(
|
||||
{
|
||||
openAIApiKey: settings.getSync("user.accessToken") as string,
|
||||
modelName: this.model,
|
||||
configuration: {
|
||||
baseURL: `${process.env.WEB_API_URL || WEB_API_URL}/api/ai`,
|
||||
},
|
||||
temperature: this.configuration.temperature,
|
||||
n: this.configuration.numberOfChoices,
|
||||
maxTokens: this.configuration.maxTokens,
|
||||
frequencyPenalty: this.configuration.frequencyPenalty,
|
||||
presencePenalty: this.configuration.presencePenalty,
|
||||
},
|
||||
temperature: this.configuration.temperature,
|
||||
n: this.configuration.numberOfChoices,
|
||||
maxTokens: this.configuration.maxTokens,
|
||||
frequencyPenalty: this.configuration.frequencyPenalty,
|
||||
presencePenalty: this.configuration.presencePenalty,
|
||||
});
|
||||
{
|
||||
httpAgent,
|
||||
// @ts-ignore
|
||||
fetch,
|
||||
}
|
||||
);
|
||||
} else if (this.engine === "openai") {
|
||||
const key = settings.getSync("openai.key") as string;
|
||||
if (!key) {
|
||||
throw new Error(t("openaiKeyRequired"));
|
||||
}
|
||||
return new ChatOpenAI({
|
||||
openAIApiKey: key,
|
||||
modelName: this.model,
|
||||
configuration: {
|
||||
baseURL: this.configuration.baseUrl,
|
||||
return new ChatOpenAI(
|
||||
{
|
||||
openAIApiKey: key,
|
||||
modelName: this.model,
|
||||
configuration: {
|
||||
baseURL: this.configuration.baseUrl,
|
||||
},
|
||||
temperature: this.configuration.temperature,
|
||||
n: this.configuration.numberOfChoices,
|
||||
maxTokens: this.configuration.maxTokens,
|
||||
frequencyPenalty: this.configuration.frequencyPenalty,
|
||||
presencePenalty: this.configuration.presencePenalty,
|
||||
},
|
||||
temperature: this.configuration.temperature,
|
||||
n: this.configuration.numberOfChoices,
|
||||
maxTokens: this.configuration.maxTokens,
|
||||
frequencyPenalty: this.configuration.frequencyPenalty,
|
||||
presencePenalty: this.configuration.presencePenalty,
|
||||
});
|
||||
{
|
||||
httpAgent,
|
||||
// @ts-ignore
|
||||
fetch,
|
||||
}
|
||||
);
|
||||
} else if (this.engine === "googleGenerativeAi") {
|
||||
const key = settings.getSync("googleGenerativeAi.key") as string;
|
||||
if (!key) {
|
||||
|
||||
@@ -18,12 +18,13 @@ import mainWindow from "@main/window";
|
||||
import fs from "fs-extra";
|
||||
import path from "path";
|
||||
import settings from "@main/settings";
|
||||
import OpenAI from "openai";
|
||||
import OpenAI, { type ClientOptions } from "openai";
|
||||
import { t } from "i18next";
|
||||
import { hashFile } from "@/utils";
|
||||
import { Audio, Message } from "@main/db/models";
|
||||
import log from "electron-log/main";
|
||||
import { WEB_API_URL } from "@/constants";
|
||||
import proxyAgent from "@main/proxy-agent";
|
||||
|
||||
const logger = log.scope("db/models/speech");
|
||||
@Table({
|
||||
@@ -171,10 +172,10 @@ export class Speech extends Model<Speech> {
|
||||
const filename = `${Date.now()}${extname}`;
|
||||
const filePath = path.join(settings.userDataPath(), "speeches", filename);
|
||||
|
||||
let openaiConfig = {};
|
||||
let openaiConfig: ClientOptions = {};
|
||||
if (engine === "enjoyai") {
|
||||
openaiConfig = {
|
||||
apiKey: settings.getSync("user.accessToken"),
|
||||
apiKey: settings.getSync("user.accessToken") as string,
|
||||
baseURL: `${process.env.WEB_API_URL || WEB_API_URL}/api/ai`,
|
||||
};
|
||||
} else if (engine === "openai") {
|
||||
@@ -187,7 +188,14 @@ export class Speech extends Model<Speech> {
|
||||
baseURL: baseUrl || defaultConfig.baseUrl,
|
||||
};
|
||||
}
|
||||
const openai = new OpenAI(openaiConfig);
|
||||
|
||||
const { httpAgent, fetch } = proxyAgent();
|
||||
const openai = new OpenAI({
|
||||
...openaiConfig,
|
||||
httpAgent,
|
||||
// @ts-ignore
|
||||
fetch,
|
||||
});
|
||||
|
||||
const file = await openai.audio.speech.create({
|
||||
input: text,
|
||||
|
||||
21
enjoy/src/main/proxy-agent.ts
Normal file
21
enjoy/src/main/proxy-agent.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import settings from "@main/settings";
|
||||
import { HttpsProxyAgent } from "https-proxy-agent";
|
||||
import { ProxyAgent } from "proxy-agent";
|
||||
import fetch from "node-fetch";
|
||||
|
||||
export default function () {
|
||||
const proxyConfig = settings.getSync("proxy") as ProxyConfigType;
|
||||
let proxyAgent = new ProxyAgent();
|
||||
|
||||
if (proxyConfig.enabled && proxyConfig.url) {
|
||||
proxyAgent = new ProxyAgent({
|
||||
httpAgent: new HttpsProxyAgent(proxyConfig.url),
|
||||
httpsAgent: new HttpsProxyAgent(proxyConfig.url),
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
httpAgent: proxyAgent,
|
||||
fetch,
|
||||
};
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import os from "os";
|
||||
import commandExists from "command-exists";
|
||||
import log from "electron-log";
|
||||
import * as i18n from "i18next";
|
||||
import mainWin from "@main/window";
|
||||
|
||||
const logger = log.scope("settings");
|
||||
|
||||
|
||||
@@ -64,6 +64,49 @@ main.init = () => {
|
||||
// TedProvider
|
||||
tedProvider.registerIpcHandlers();
|
||||
|
||||
// proxy
|
||||
ipcMain.handle("system-proxy-get", (_event) => {
|
||||
let proxy = settings.getSync("proxy");
|
||||
if (!proxy) {
|
||||
proxy = {
|
||||
enabled: false,
|
||||
url: "",
|
||||
};
|
||||
settings.setSync("proxy", proxy);
|
||||
}
|
||||
|
||||
return proxy;
|
||||
});
|
||||
|
||||
ipcMain.handle("system-proxy-set", (_event, config) => {
|
||||
if (!config) {
|
||||
throw new Error("Invalid proxy config");
|
||||
}
|
||||
|
||||
if (config) {
|
||||
if (!config.url) {
|
||||
config.enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (config.enabled && config.url) {
|
||||
const uri = new URL(config.url);
|
||||
const proxyRules = `http=${uri.host};https=${uri.host}`;
|
||||
|
||||
mainWindow.webContents.session.setProxy({
|
||||
proxyRules,
|
||||
});
|
||||
mainWindow.webContents.session.closeAllConnections();
|
||||
} else {
|
||||
mainWindow.webContents.session.setProxy({
|
||||
mode: "system",
|
||||
});
|
||||
mainWindow.webContents.session.closeAllConnections();
|
||||
}
|
||||
|
||||
return settings.setSync("proxy", config);
|
||||
});
|
||||
|
||||
// BrowserView
|
||||
ipcMain.handle(
|
||||
"view-load",
|
||||
|
||||
@@ -40,6 +40,14 @@ contextBridge.exposeInMainWorld("__ENJOY_APP__", {
|
||||
return ipcRenderer.invoke("system-preferences-media-access", mediaType);
|
||||
},
|
||||
},
|
||||
proxy: {
|
||||
get: () => {
|
||||
return ipcRenderer.invoke("system-proxy-get");
|
||||
},
|
||||
set: (config: ProxyConfigType) => {
|
||||
return ipcRenderer.invoke("system-proxy-set", config);
|
||||
},
|
||||
},
|
||||
},
|
||||
providers: {
|
||||
audible: {
|
||||
|
||||
@@ -15,3 +15,5 @@ export * from "./balance-settings";
|
||||
|
||||
export * from "./reset-settings";
|
||||
export * from "./reset-all-settings";
|
||||
|
||||
export * from "./proxy-settings";
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
WhisperSettings,
|
||||
FfmpegSettings,
|
||||
OpenaiSettings,
|
||||
ProxySettings,
|
||||
GoogleGenerativeAiSettings,
|
||||
ResetSettings,
|
||||
ResetAllSettings,
|
||||
@@ -58,6 +59,8 @@ export const Preferences = () => {
|
||||
<div className="font-semibold mb-4 capitilized">
|
||||
{t("advancedSettings")}
|
||||
</div>
|
||||
<ProxySettings />
|
||||
<Separator />
|
||||
<ResetSettings />
|
||||
<Separator />
|
||||
<ResetAllSettings />
|
||||
|
||||
164
enjoy/src/renderer/components/preferences/proxy-settings.tsx
Normal file
164
enjoy/src/renderer/components/preferences/proxy-settings.tsx
Normal file
@@ -0,0 +1,164 @@
|
||||
import * as z from "zod";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { zodResolver } from "@hookform/resolvers/zod";
|
||||
import { t } from "i18next";
|
||||
import {
|
||||
Button,
|
||||
Form,
|
||||
FormField,
|
||||
FormItem,
|
||||
FormControl,
|
||||
Switch,
|
||||
Input,
|
||||
toast,
|
||||
} from "@renderer/components/ui";
|
||||
import { InfoIcon } from "lucide-react";
|
||||
import { AppSettingsProviderContext } from "@renderer/context";
|
||||
import { useContext, useState, useEffect } from "react";
|
||||
|
||||
export const ProxySettings = () => {
|
||||
const { proxy, setProxy } = useContext(AppSettingsProviderContext);
|
||||
const [ipData, setIpData] = useState(null);
|
||||
const [editing, setEditing] = useState(false);
|
||||
|
||||
const proxyConfigSchema = z.object({
|
||||
enabled: z.boolean(),
|
||||
url: z.string().url(),
|
||||
});
|
||||
const form = useForm({
|
||||
mode: "onBlur",
|
||||
resolver: zodResolver(proxyConfigSchema),
|
||||
values: {
|
||||
enabled: proxy?.enabled,
|
||||
url: proxy?.url,
|
||||
},
|
||||
});
|
||||
|
||||
const onSubmit = async (data: z.infer<typeof proxyConfigSchema>) => {
|
||||
if (!data.url) {
|
||||
data.enabled = false;
|
||||
}
|
||||
|
||||
setProxy({
|
||||
enabled: data.enabled,
|
||||
url: data.url,
|
||||
})
|
||||
.then(() => {
|
||||
toast.success(t("proxyConfigUpdated"));
|
||||
})
|
||||
.finally(() => {
|
||||
setEditing(false);
|
||||
});
|
||||
};
|
||||
|
||||
const checkIp = async () => {
|
||||
fetch("https://ipapi.co/json")
|
||||
.then((response) => response.json())
|
||||
.then((data) => {
|
||||
setIpData(data);
|
||||
})
|
||||
.catch((error) => {
|
||||
toast.error(error.message);
|
||||
setIpData(null);
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
checkIp();
|
||||
}, [proxy]);
|
||||
|
||||
return (
|
||||
<Form {...form}>
|
||||
<form onSubmit={form.handleSubmit(onSubmit)}>
|
||||
<div className="flex items-start justify-between py-4">
|
||||
<div className="">
|
||||
<div className="mb-2">{t("proxySettings")}</div>
|
||||
<div className="text-sm text-muted-foreground mb-2 ml-1">
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="url"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormControl>
|
||||
<Input
|
||||
placeholder="http://proxy:port"
|
||||
disabled={!editing}
|
||||
value={field.value || ""}
|
||||
onChange={field.onChange}
|
||||
/>
|
||||
</FormControl>
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
{form.getValues("enabled") && ipData && (
|
||||
<div className="text-sm text-muted-foreground mb-2 ml-1">
|
||||
<div className="flex items-center space-x-2">
|
||||
<div>
|
||||
IP: {ipData.ip} ({ipData.city}, {ipData.country_name})
|
||||
</div>
|
||||
<div>
|
||||
<InfoIcon size={16} className="cursor-pointer" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="flex items-center space-x-2 justify-end">
|
||||
{editing ? (
|
||||
<>
|
||||
<Button
|
||||
variant="secondary"
|
||||
onClick={(e) => {
|
||||
setEditing(!editing);
|
||||
e.preventDefault();
|
||||
}}
|
||||
size="sm"
|
||||
>
|
||||
{t("cancel")}
|
||||
</Button>
|
||||
<Button
|
||||
variant="default"
|
||||
onClick={() => setEditing(!editing)}
|
||||
size="sm"
|
||||
>
|
||||
{t("save")}
|
||||
</Button>
|
||||
</>
|
||||
) : (
|
||||
<Button
|
||||
variant="secondary"
|
||||
onClick={(e) => {
|
||||
setEditing(!editing);
|
||||
e.preventDefault();
|
||||
}}
|
||||
size="sm"
|
||||
>
|
||||
{t("edit")}
|
||||
</Button>
|
||||
)}
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="enabled"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormControl>
|
||||
<Switch
|
||||
disabled={!form.getValues("url")}
|
||||
checked={field.value}
|
||||
onCheckedChange={(e) => {
|
||||
field.onChange(e);
|
||||
onSubmit(form.getValues());
|
||||
}}
|
||||
/>
|
||||
</FormControl>
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</Form>
|
||||
);
|
||||
};
|
||||
@@ -22,6 +22,8 @@ type AppSettingsProviderState = {
|
||||
EnjoyApp?: EnjoyAppType;
|
||||
language?: "en" | "zh-CN";
|
||||
switchLanguage?: (language: "en" | "zh-CN") => void;
|
||||
proxy?: ProxyConfigType;
|
||||
setProxy?: (config: ProxyConfigType) => Promise<void>;
|
||||
};
|
||||
|
||||
const initialState: AppSettingsProviderState = {
|
||||
@@ -47,6 +49,7 @@ export const AppSettingsProvider = ({
|
||||
const [ffmpegConfig, setFfmegConfig] = useState<FfmpegConfigType>(null);
|
||||
const [ffmpeg, setFfmpeg] = useState<FFmpeg>(null);
|
||||
const [language, setLanguage] = useState<"en" | "zh-CN">();
|
||||
const [proxy, setProxy] = useState<ProxyConfigType>();
|
||||
const EnjoyApp = window.__ENJOY_APP__;
|
||||
|
||||
const ffmpegRef = useRef(new FFmpeg());
|
||||
@@ -58,6 +61,7 @@ export const AppSettingsProvider = ({
|
||||
fetchFfmpegConfig();
|
||||
fetchLanguage();
|
||||
loadFfmpegWASM();
|
||||
fetchProxyConfig();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -171,6 +175,17 @@ export const AppSettingsProvider = ({
|
||||
setLibraryPath(dir);
|
||||
};
|
||||
|
||||
const fetchProxyConfig = async () => {
|
||||
const config = await EnjoyApp.system.proxy.get();
|
||||
setProxy(config);
|
||||
};
|
||||
|
||||
const setProxyConfigHandler = async (config: ProxyConfigType) => {
|
||||
EnjoyApp.system.proxy.set(config).then(() => {
|
||||
setProxy(config);
|
||||
});
|
||||
};
|
||||
|
||||
const validate = async () => {
|
||||
setInitialized(Boolean(user && libraryPath));
|
||||
};
|
||||
@@ -192,6 +207,8 @@ export const AppSettingsProvider = ({
|
||||
ffmpegConfig,
|
||||
ffmpeg,
|
||||
setFfmegConfig,
|
||||
proxy,
|
||||
setProxy: setProxyConfigHandler,
|
||||
initialized,
|
||||
}}
|
||||
>
|
||||
|
||||
4
enjoy/src/types/enjoy-app.d.ts
vendored
4
enjoy/src/types/enjoy-app.d.ts
vendored
@@ -15,6 +15,10 @@ type EnjoyAppType = {
|
||||
preferences: {
|
||||
mediaAccess: (mediaType: "microphone") => Promise<boolean>;
|
||||
};
|
||||
proxy: {
|
||||
get: () => Promise<ProxyConfigType>;
|
||||
set: (config: ProxyConfigType) => Promise<void>;
|
||||
};
|
||||
};
|
||||
providers: {
|
||||
audible: {
|
||||
|
||||
5
enjoy/src/types/index.d.ts
vendored
5
enjoy/src/types/index.d.ts
vendored
@@ -158,3 +158,8 @@ type TedIdeaType = {
|
||||
title: string;
|
||||
description: string;
|
||||
};
|
||||
|
||||
type ProxyConfigType = {
|
||||
enabled: boolean;
|
||||
url: string;
|
||||
};
|
||||
|
||||
150
yarn.lock
150
yarn.lock
@@ -3356,6 +3356,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tootallnate/quickjs-emscripten@npm:^0.23.0":
|
||||
version: 0.23.0
|
||||
resolution: "@tootallnate/quickjs-emscripten@npm:0.23.0"
|
||||
checksum: 10c0/2a939b781826fb5fd3edd0f2ec3b321d259d760464cf20611c9877205aaca3ccc0b7304dea68416baa0d568e82cd86b17d29548d1e5139fa3155a4a86a2b4b49
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@tsconfig/node10@npm:^1.0.7":
|
||||
version: 1.0.9
|
||||
resolution: "@tsconfig/node10@npm:1.0.9"
|
||||
@@ -4391,6 +4398,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ast-types@npm:^0.13.4":
|
||||
version: 0.13.4
|
||||
resolution: "ast-types@npm:0.13.4"
|
||||
dependencies:
|
||||
tslib: "npm:^2.0.1"
|
||||
checksum: 10c0/3a1a409764faa1471601a0ad01b3aa699292991aa9c8a30c7717002cabdf5d98008e7b53ae61f6e058f757fc6ba965e147967a93c13e62692c907d79cfb245f8
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"astral-regex@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "astral-regex@npm:2.0.0"
|
||||
@@ -4497,6 +4513,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"basic-ftp@npm:^5.0.2":
|
||||
version: 5.0.4
|
||||
resolution: "basic-ftp@npm:5.0.4"
|
||||
checksum: 10c0/0bd580652a4f75d5ea8e442e27921ff7089c91764f9eab975235d0b177bb7631339cbf50fb8f4cd5c94087ac6c003a8c80e33076228fd94e23e99d42531e3ac0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"before-after-hook@npm:^2.2.0":
|
||||
version: 2.2.3
|
||||
resolution: "before-after-hook@npm:2.2.3"
|
||||
@@ -5391,6 +5414,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"data-uri-to-buffer@npm:^6.0.0":
|
||||
version: 6.0.1
|
||||
resolution: "data-uri-to-buffer@npm:6.0.1"
|
||||
checksum: 10c0/d8631b4be9c3dcac748023c0708e86abb272d346ed85979d0f5171d461f5426c013ef1313933e2ce3aa6dbdf8b53461e657f2243b14fb2483744dbb3cc4ed331
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"date-fns@npm:^3.2.0":
|
||||
version: 3.2.0
|
||||
resolution: "date-fns@npm:3.2.0"
|
||||
@@ -5538,6 +5568,17 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"degenerator@npm:^5.0.0":
|
||||
version: 5.0.1
|
||||
resolution: "degenerator@npm:5.0.1"
|
||||
dependencies:
|
||||
ast-types: "npm:^0.13.4"
|
||||
escodegen: "npm:^2.1.0"
|
||||
esprima: "npm:^4.0.1"
|
||||
checksum: 10c0/e48d8a651edeb512a648711a09afec269aac6de97d442a4bb9cf121a66877e0eec11b9727100a10252335c0666ae1c84a8bc1e3a3f47788742c975064d2c7b1c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"delayed-stream@npm:~1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "delayed-stream@npm:1.0.0"
|
||||
@@ -6022,6 +6063,7 @@ __metadata:
|
||||
fluent-ffmpeg: "npm:^2.1.2"
|
||||
fs-extra: "npm:^11.2.0"
|
||||
html-to-text: "npm:^9.0.5"
|
||||
https-proxy-agent: "npm:^7.0.2"
|
||||
i18next: "npm:^23.8.1"
|
||||
intl-tel-input: "npm:^19.2.15"
|
||||
js-md5: "npm:^0.8.3"
|
||||
@@ -6035,6 +6077,7 @@ __metadata:
|
||||
openai: "npm:^4.26.0"
|
||||
pitchfinder: "npm:^2.3.2"
|
||||
postcss: "npm:^8.4.33"
|
||||
proxy-agent: "npm:^6.3.1"
|
||||
react: "npm:^18.2.0"
|
||||
react-activity-calendar: "npm:^2.2.7"
|
||||
react-dom: "npm:^18.2.0"
|
||||
@@ -6365,6 +6408,24 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"escodegen@npm:^2.1.0":
|
||||
version: 2.1.0
|
||||
resolution: "escodegen@npm:2.1.0"
|
||||
dependencies:
|
||||
esprima: "npm:^4.0.1"
|
||||
estraverse: "npm:^5.2.0"
|
||||
esutils: "npm:^2.0.2"
|
||||
source-map: "npm:~0.6.1"
|
||||
dependenciesMeta:
|
||||
source-map:
|
||||
optional: true
|
||||
bin:
|
||||
escodegen: bin/escodegen.js
|
||||
esgenerate: bin/esgenerate.js
|
||||
checksum: 10c0/e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"eslint-import-resolver-node@npm:^0.3.9":
|
||||
version: 0.3.9
|
||||
resolution: "eslint-import-resolver-node@npm:0.3.9"
|
||||
@@ -6509,6 +6570,16 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"esprima@npm:^4.0.1":
|
||||
version: 4.0.1
|
||||
resolution: "esprima@npm:4.0.1"
|
||||
bin:
|
||||
esparse: ./bin/esparse.js
|
||||
esvalidate: ./bin/esvalidate.js
|
||||
checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"esquery@npm:^1.4.2":
|
||||
version: 1.5.0
|
||||
resolution: "esquery@npm:1.5.0"
|
||||
@@ -7272,6 +7343,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"get-uri@npm:^6.0.1":
|
||||
version: 6.0.2
|
||||
resolution: "get-uri@npm:6.0.2"
|
||||
dependencies:
|
||||
basic-ftp: "npm:^5.0.2"
|
||||
data-uri-to-buffer: "npm:^6.0.0"
|
||||
debug: "npm:^4.3.4"
|
||||
fs-extra: "npm:^8.1.0"
|
||||
checksum: 10c0/50ef3e0b76d202c41f4878e5d9f44ff125ce4ccc7a9f6a54d51bc633bf643e5e044cacdf5944a2554cdd2e10b7e92628e694b35ff2b943271afd37cde9570d5d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"github-from-package@npm:0.0.0":
|
||||
version: 0.0.0
|
||||
resolution: "github-from-package@npm:0.0.0"
|
||||
@@ -7732,7 +7815,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"https-proxy-agent@npm:^7.0.1":
|
||||
"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2":
|
||||
version: 7.0.2
|
||||
resolution: "https-proxy-agent@npm:7.0.2"
|
||||
dependencies:
|
||||
@@ -7900,6 +7983,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ip@npm:^1.1.8":
|
||||
version: 1.1.8
|
||||
resolution: "ip@npm:1.1.8"
|
||||
checksum: 10c0/ab32a5ecfa678d4c158c1381c4c6744fce89a1d793e1b6635ba79d0753c069030b672d765887b6fff55670c711dfa47475895e5d6013efbbcf04687c51cb8db9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ip@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "ip@npm:2.0.0"
|
||||
@@ -8962,7 +9052,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lru-cache@npm:^7.7.1":
|
||||
"lru-cache@npm:^7.14.1, lru-cache@npm:^7.7.1":
|
||||
version: 7.18.3
|
||||
resolution: "lru-cache@npm:7.18.3"
|
||||
checksum: 10c0/b3a452b491433db885beed95041eb104c157ef7794b9c9b4d647be503be91769d11206bb573849a16b4cc0d03cbd15ffd22df7960997788b74c1d399ac7a4fed
|
||||
@@ -9890,6 +9980,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"netmask@npm:^2.0.2":
|
||||
version: 2.0.2
|
||||
resolution: "netmask@npm:2.0.2"
|
||||
checksum: 10c0/cafd28388e698e1138ace947929f842944d0f1c0b87d3fa2601a61b38dc89397d33c0ce2c8e7b99e968584b91d15f6810b91bef3f3826adf71b1833b61d4bf4f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"next-themes@npm:^0.2.1":
|
||||
version: 0.2.1
|
||||
resolution: "next-themes@npm:0.2.1"
|
||||
@@ -10467,6 +10564,33 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"pac-proxy-agent@npm:^7.0.1":
|
||||
version: 7.0.1
|
||||
resolution: "pac-proxy-agent@npm:7.0.1"
|
||||
dependencies:
|
||||
"@tootallnate/quickjs-emscripten": "npm:^0.23.0"
|
||||
agent-base: "npm:^7.0.2"
|
||||
debug: "npm:^4.3.4"
|
||||
get-uri: "npm:^6.0.1"
|
||||
http-proxy-agent: "npm:^7.0.0"
|
||||
https-proxy-agent: "npm:^7.0.2"
|
||||
pac-resolver: "npm:^7.0.0"
|
||||
socks-proxy-agent: "npm:^8.0.2"
|
||||
checksum: 10c0/95b07e2a409511262d6e29be3d50f2e18ac387ef99664687ab4e92741d1d20fae97309722c37841583b024d1cde1790dd263a9b915d5241751b77f1e8003c418
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"pac-resolver@npm:^7.0.0":
|
||||
version: 7.0.0
|
||||
resolution: "pac-resolver@npm:7.0.0"
|
||||
dependencies:
|
||||
degenerator: "npm:^5.0.0"
|
||||
ip: "npm:^1.1.8"
|
||||
netmask: "npm:^2.0.2"
|
||||
checksum: 10c0/a5ac1bf1f33f667a1c85fd61744672d9364534a1bb68a676ef920091b735ed8a10fc2b57385909e34822a2147b10a898dd79139b07dae0dbd568561d5c40a81b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"parent-module@npm:^1.0.0":
|
||||
version: 1.0.1
|
||||
resolution: "parent-module@npm:1.0.1"
|
||||
@@ -10899,6 +11023,22 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"proxy-agent@npm:^6.3.1":
|
||||
version: 6.3.1
|
||||
resolution: "proxy-agent@npm:6.3.1"
|
||||
dependencies:
|
||||
agent-base: "npm:^7.0.2"
|
||||
debug: "npm:^4.3.4"
|
||||
http-proxy-agent: "npm:^7.0.0"
|
||||
https-proxy-agent: "npm:^7.0.2"
|
||||
lru-cache: "npm:^7.14.1"
|
||||
pac-proxy-agent: "npm:^7.0.1"
|
||||
proxy-from-env: "npm:^1.1.0"
|
||||
socks-proxy-agent: "npm:^8.0.2"
|
||||
checksum: 10c0/72532eeae5f038873232905e17272eaecae5e5891b06f0f40cce139a84a4b19f482ab3ce586050fd2c64ca9171c7828ef183eb49c615f0faa359f1213063498a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"proxy-from-env@npm:^1.1.0":
|
||||
version: 1.1.0
|
||||
resolution: "proxy-from-env@npm:1.1.0"
|
||||
@@ -11909,7 +12049,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"socks-proxy-agent@npm:^8.0.1":
|
||||
"socks-proxy-agent@npm:^8.0.1, socks-proxy-agent@npm:^8.0.2":
|
||||
version: 8.0.2
|
||||
resolution: "socks-proxy-agent@npm:8.0.2"
|
||||
dependencies:
|
||||
@@ -11957,7 +12097,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"source-map@npm:^0.6.0":
|
||||
"source-map@npm:^0.6.0, source-map@npm:~0.6.1":
|
||||
version: 0.6.1
|
||||
resolution: "source-map@npm:0.6.1"
|
||||
checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011
|
||||
@@ -12600,7 +12740,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.6.2":
|
||||
"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.6.2":
|
||||
version: 2.6.2
|
||||
resolution: "tslib@npm:2.6.2"
|
||||
checksum: 10c0/e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb
|
||||
|
||||
Reference in New Issue
Block a user