From a3da33d8244066adecf4276b38a16f41c2d19674 Mon Sep 17 00:00:00 2001 From: ZauberNerd Date: Fri, 7 Jul 2023 13:36:32 +0200 Subject: [PATCH] Replace create-react-app with vite create-react-app seems to struggle a bit [1] and many folks are recommending vite as an alternative, as that project is more active. For me the reason to switch to vite is to reduce dependencies and speed up the build process. Replacing create-react-app with vite reduce the number of dependencies from 1762 to 444. I was also quite surprised, by how small the actual diff in this commit is. From that perspective there is almost no discernible difference between the two tools. [1]: https://github.com/reactjs/react.dev/pull/5487#issuecomment-1409720741 --- Dockerfile | 3 +- app/craco.config.js | 43 -------------------------- app/{public => }/index.html | 12 ++++---- app/package.json | 33 +++++++------------- app/public/lang/en-us.json | 50 +++++++++---------------------- app/src/core/tokenizer/wrapper.ts | 29 +++++++----------- app/src/{index.scss => index.css} | 0 app/src/index.tsx | 2 +- app/src/react-app-env.d.ts | 1 - app/src/vite-env.d.ts | 1 + app/vite.config.js | 35 ++++++++++++++++++++++ 11 files changed, 79 insertions(+), 130 deletions(-) delete mode 100644 app/craco.config.js rename app/{public => }/index.html (92%) rename app/src/{index.scss => index.css} (100%) delete mode 100644 app/src/react-app-env.d.ts create mode 100644 app/src/vite-env.d.ts create mode 100644 app/vite.config.js diff --git a/Dockerfile b/Dockerfile index dc071ea..de9cb55 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,8 +14,7 @@ COPY ./app/tsconfig.json ./ # Install Node.js dependencies RUN npm install -# Copy craco.config.js, public, and src directories -COPY ./app/craco.config.js ./craco.config.js +# Copy public, and src directories COPY ./app/public ./public COPY ./app/src ./src diff --git a/app/craco.config.js b/app/craco.config.js deleted file mode 100644 index 2e6c13c..0000000 --- a/app/craco.config.js +++ /dev/null @@ -1,43 +0,0 @@ -const cracoWasm = require("craco-wasm"); -const webpack = require("webpack"); -const path = require("path"); - -module.exports = { - plugins: [ - cracoWasm(), - ], - eslint: { - enable: false - }, - babel: { - plugins: [ - [ - 'formatjs', - { - removeDefaultMessage: false, - idInterpolationPattern: '[sha512:contenthash:base64:6]', - ast: true - } - ] - ] - }, - webpack: { - configure: { - resolve: { - fallback: { - buffer: require.resolve("buffer"), - }, - alias: { - '@ffmpeg/ffmpeg': path.resolve(__dirname, 'src/stub.js') - }, - }, - plugins: [ - new webpack.ProvidePlugin({ - Buffer: ["buffer", "Buffer"], - }), - ], - ignoreWarnings: [/Failed to parse source map/], - cache: false, - }, - }, -} \ No newline at end of file diff --git a/app/public/index.html b/app/index.html similarity index 92% rename from app/public/index.html rename to app/index.html index bcbbbba..ec20b03 100644 --- a/app/public/index.html +++ b/app/index.html @@ -3,23 +3,23 @@ - + - + - + @@ -86,6 +86,8 @@ To begin the development, run `npm start` or `yarn start`. To create a production bundle, use `npm run build` or `yarn build`. --> + + \ No newline at end of file diff --git a/app/package.json b/app/package.json index c279503..66721a1 100644 --- a/app/package.json +++ b/app/package.json @@ -3,7 +3,6 @@ "version": "0.2.3", "dependencies": { "@chengsokdara/use-whisper": "^0.2.0", - "@emotion/css": "^11.10.6", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@mantine/core": "^5.10.5", @@ -13,9 +12,9 @@ "@mantine/spotlight": "^5.10.5", "@msgpack/msgpack": "^3.0.0-beta2", "@reduxjs/toolkit": "^1.9.3", - "@svgr/webpack": "^6.5.1", "broadcast-channel": "^4.20.2", "buffer": "^6.0.3", + "comlink": "^4.4.1", "events": "^3.3.0", "idb-keyval": "^6.2.0", "jshashes": "^1.0.8", @@ -30,6 +29,7 @@ "react-redux": "^8.0.5", "react-router-dom": "^6.8.2", "react-syntax-highlighter": "^15.5.0", + "redux": "4.2.1", "redux-persist": "^6.0.0", "rehype-katex": "^6.0.2", "remark-gfm": "^3.0.1", @@ -37,27 +37,16 @@ "sentence-splitter": "^4.2.0", "slugify": "^1.6.5", "uuid": "^9.0.0", - "workerize-loader": "^2.0.2", "y-indexeddb": "^9.0.9", "y-protocols": "^1.0.5", "yjs": "^13.5.50" }, - "overrides": { - "@svgr/webpack": "$@svgr/webpack" - }, "scripts": { - "start": "craco start", - "build": "craco build", - "test": "craco test", - "eject": "craco eject", + "start": "vite", + "build": "vite build", + "serve": "vite preview", "extract": "formatjs extract 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file public/lang/en-us.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'" }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, "browserslist": { "production": [ ">0.2%", @@ -71,20 +60,18 @@ ] }, "devDependencies": { - "@craco/craco": "^7.1.0", "@formatjs/cli": "^6.0.4", - "@types/jest": "^27.5.2", "@types/node": "^16.18.13", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-helmet": "^6.1.6", "@types/react-syntax-highlighter": "^15.5.6", "@types/uuid": "^9.0.1", - "babel-plugin-formatjs": "^10.4.0", - "craco-wasm": "^0.0.1", + "@vitejs/plugin-react": "^4.0.2", + "babel-plugin-formatjs": "^10.5.3", "http-proxy-middleware": "^2.0.6", - "react-scripts": "^5.0.1", - "sass": "^1.58.3", - "typescript": "^4.9.5" + "typescript": "^4.9.5", + "vite": "^4.4.1", + "vite-plugin-comlink": "^3.0.5" } } diff --git a/app/public/lang/en-us.json b/app/public/lang/en-us.json index 3596ef8..7c0d436 100644 --- a/app/public/lang/en-us.json +++ b/app/public/lang/en-us.json @@ -2,9 +2,6 @@ "+G35mR": { "defaultMessage": "Open sidebar" }, - "+H2Qtw": { - "defaultMessage": "Show quick settings below message input" - }, "+LMWDJ": { "defaultMessage": "Chat History", "description": "Heading for the chat history screen" @@ -56,8 +53,8 @@ "defaultMessage": "Save changes", "description": "Label for a button that appears when the user is editing the text of one of their messages, to save the changes" }, - "E4+fv5": { - "defaultMessage": "Auto-scroll to the bottom of the page when opening a chat" + "CIe3Dt": { + "defaultMessage": "Note: This model will only work if your OpenAI account has been granted you have been given access to it. Request access here." }, "FEzBCd": { "defaultMessage": "Untitled", @@ -73,12 +70,12 @@ "KKa5Br": { "defaultMessage": "Give ChatGPT a realisic human voice by connecting your ElevenLabs account (preview the available voices below). Click here to sign up." }, + "KbUcBc": { + "defaultMessage": "Your ElevenLabs API Key" + }, "L5s+z7": { "defaultMessage": "OpenAI API key usage is billed at a pay-as-you-go rate, separate from your ChatGPT subscription." }, - "LHOuNA": { - "defaultMessage": "Auto-scroll while generating a response" - }, "MI5gZ+": { "defaultMessage": "Download SVG" }, @@ -86,9 +83,6 @@ "defaultMessage": "Chat with GPT", "description": "app name" }, - "NRJ4IQ": { - "defaultMessage": "Note: GPT-4 will only work if your OpenAI account has been granted access to the new model. Request access here." - }, "NgCT/u": { "defaultMessage": "Enter your email address" }, @@ -105,10 +99,6 @@ "SQJto2": { "defaultMessage": "Sign in" }, - "SQh9En": { - "defaultMessage": "Sign in to sync", - "description": "Label for sign in button, indicating the purpose of signing in is to sync your data between devices" - }, "T8gKkC": { "defaultMessage": "Delete this chat" }, @@ -116,6 +106,10 @@ "defaultMessage": "Edit", "description": "Label for the button the user can click to edit the text of one of their messages" }, + "UbN3HK": { + "defaultMessage": "Sign in to sync", + "description": "Label for sign in button, which indicates that the purpose of signing in is to sync your data between devices. Less important text inside tags is hidden on small screens." + }, "VL24Xt": { "defaultMessage": "Search your chats" }, @@ -126,10 +120,6 @@ "defaultMessage": "Or sign in to an existing account", "description": "Label for a button on the Create Account page that lets the user sign into their existing account instead" }, - "aR9WsJ": { - "defaultMessage": "UI Settings", - "description": "Heading for the setting that lets users customize various UI elements" - }, "bIacvz": { "defaultMessage": "Chat with GPT - Unofficial ChatGPT app", "description": "HTML title tag" @@ -138,9 +128,6 @@ "defaultMessage": "Hello, how can I help you today?", "description": "A friendly message that appears at the start of new chat sessions" }, - "gNu/AE": { - "defaultMessage": "Show microphone button in message input" - }, "gzJlXS": { "defaultMessage": "Share", "description": "Label for a button which shares the text of a chat message using the user device's share functionality" @@ -155,6 +142,9 @@ "defaultMessage": "Save and Close", "description": "Label for the button that closes the Settings screen, saving any changes" }, + "jU4MQH": { + "defaultMessage": "Rename this chat" + }, "jtu3jt": { "defaultMessage": "You can find your API key by clicking your avatar or initials in the top right of the ElevenLabs website, then clicking Profile. Your API key is stored only on this device and never transmitted to anyone except ElevenLabs." }, @@ -162,9 +152,8 @@ "defaultMessage": "Copied", "description": "Label for copy-to-clipboard button after a successful copy" }, - "pv41j8": { - "defaultMessage": "Temperature: {temperature, number, ::.0}", - "description": "Label for the button that opens a modal for setting the 'temperature' (randomness) of AI responses" + "mL4Q28": { + "defaultMessage": "Custom Voice ID" }, "raQMIg": { "defaultMessage": "Cancel", @@ -196,20 +185,9 @@ "defaultMessage": "Copy", "description": "Label for copy-to-clipboard button" }, - "w5Dmuu": { - "defaultMessage": "Customize system prompt", - "description": "Label for the button that opens a modal for customizing the 'system prompt', a message used to customize and influence how the AI responds." - }, "xXbJso": { "defaultMessage": "Sign out" }, - "xqpqZE": { - "defaultMessage": "Your Elevenlabs API Key" - }, - "y1F8Hs": { - "defaultMessage": "Your OpenAI API Key", - "description": "Heading for the OpenAI API key setting on the settings screen" - }, "zBmup+": { "defaultMessage": "Regenerate", "description": "Label for the button used to ask the AI to regenerate one of its messages. Since message generations are stochastic, the resulting message will be different." diff --git a/app/src/core/tokenizer/wrapper.ts b/app/src/core/tokenizer/wrapper.ts index 2dfa636..0e4ca96 100644 --- a/app/src/core/tokenizer/wrapper.ts +++ b/app/src/core/tokenizer/wrapper.ts @@ -1,28 +1,19 @@ import { OpenAIMessage } from "../chat/types"; import type { ChatHistoryTrimmerOptions } from "./chat-history-trimmer"; // @ts-ignore -import tokenizer from 'workerize-loader!./worker'; +import tokenizer from "./worker?worker&url"; -let worker: any; +const worker = new ComlinkWorker( + new URL(tokenizer, import.meta.url) +); -async function getWorker() { - if (!worker) { - worker = await tokenizer(); - } - return worker; -} - -export async function runChatTrimmer(messages: OpenAIMessage[], options: ChatHistoryTrimmerOptions): Promise { - const worker = await getWorker(); - return worker.runChatTrimmer(messages, options); +export async function runChatTrimmer( + messages: OpenAIMessage[], + options: ChatHistoryTrimmerOptions +): Promise { + return worker.runChatTrimmer(messages, options); } export async function countTokens(messages: OpenAIMessage[]) { - const worker = await getWorker(); - return await worker.countTokensForMessages(messages); + return await worker.countTokensForMessages(messages); } - -// preload the worker -getWorker().then(w => { - (window as any).worker = w; -}) \ No newline at end of file diff --git a/app/src/index.scss b/app/src/index.css similarity index 100% rename from app/src/index.scss rename to app/src/index.css diff --git a/app/src/index.tsx b/app/src/index.tsx index 9c1f60b..97326ba 100644 --- a/app/src/index.tsx +++ b/app/src/index.tsx @@ -12,7 +12,7 @@ import store, { persistor } from './store'; import ChatPage from './components/pages/chat'; import LandingPage from './components/pages/landing'; -import './index.scss'; +import "./index.css"; const router = createBrowserRouter([ { diff --git a/app/src/react-app-env.d.ts b/app/src/react-app-env.d.ts deleted file mode 100644 index 6431bc5..0000000 --- a/app/src/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/app/src/vite-env.d.ts b/app/src/vite-env.d.ts new file mode 100644 index 0000000..eb0cdc4 --- /dev/null +++ b/app/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/app/vite.config.js b/app/vite.config.js new file mode 100644 index 0000000..5bcc743 --- /dev/null +++ b/app/vite.config.js @@ -0,0 +1,35 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import { comlink } from "vite-plugin-comlink"; + +export default defineConfig(() => { + return { + build: { + outDir: "build", + }, + resolve: { + alias: { + "@ffmpeg/ffmpeg": "./src/stub.js", + }, + }, + plugins: [ + react({ + babel: { + plugins: [ + [ + "formatjs", + { + idInterpolationPattern: "[sha512:contenthash:base64:6]", + ast: true, + }, + ], + ], + }, + }), + comlink(), + ], + worker: { + plugins: [comlink()], + }, + }; +});