diff --git a/.eslintignore b/.eslintignore index de4d1f007..00e83f596 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,3 @@ dist node_modules +tailwind.config.js diff --git a/.github/workflows/build-zip.yml b/.github/workflows/build-zip.yml index 52b291ef7..b0eff9b78 100644 --- a/.github/workflows/build-zip.yml +++ b/.github/workflows/build-zip.yml @@ -21,9 +21,11 @@ jobs: - uses: actions/cache@v3 with: path: node_modules - key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }} + key: ${{ runner.OS }}-build-${{ hashFiles('**/pnpm-lock.yaml') }} - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v3 + with: + version: 8 - run: pnpm install --frozen-lockfile diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index b69328051..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Test - -on: - push: - branches: [ main ] - pull_request: - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version-file: ".nvmrc" - - - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }} - - - uses: pnpm/action-setup@v2 - - - run: pnpm install --frozen-lockfile - - - run: pnpm test diff --git a/.gitignore b/.gitignore index 3e03940cf..8a24994d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,21 @@ # dependencies -/node_modules +**/node_modules # testing -/coverage +**/coverage # build -/dist +**/dist +**/build + +# env +**/.env.local +**/.env # etc .DS_Store -.env.local .idea +**/.turbo # compiled -utils/reload/*.js -utils/reload/injections/*.js -public/manifest.json +apps/chrome-extension/public/manifest.json diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index 9ef2ef0b2..000000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -pnpm run commitlint ${1} diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index f1e568560..000000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" - -pnpm dlx lint-staged diff --git a/README.md b/README.md index 820e5cd7a..eae4c5b3e 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-logo +logo

Chrome Extension Boilerplate with
React + Vite + TypeScript

![](https://img.shields.io/badge/React-61DAFB?style=flat-square&logo=react&logoColor=black) @@ -10,6 +10,8 @@ > This project is listed in the [Awesome Vite](https://github.com/vitejs/awesome-vite) +--- +> **This boilerplate has [Legacy version](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/tree/legacy)**
@@ -17,49 +19,42 @@ - [Intro](#intro) - [Features](#features) -- [Installation](#installation) +- [Structure](#structure) + - [Apps](#apps) + - [Packages](#packages) + - [Pages](#pages) +- [Install](#install) - [Procedures](#procedures) - [Chrome](#chrome) - [Firefox](#firefox) -- [Add Style Library](#add-style-library) - - [Twind](#twind) - - [Chakra UI](#chakra-ui) -- [Pages](#pages) -- [Screenshots](#screenshots) - - [NewTab](#newtab) - - [Popup](#popup) - - [Devtools](#devtools) -- [Examples](#examples) -- [Documents](#documents) +- [Preview](#preview) +- [Reference](#reference) +- [Star History](#starhistory) +- [Contributors](#contributors) ## Intro This boilerplate is made for creating chrome extensions using React and Typescript. -> The focus was on improving the build speed and development experience with Vite. +> The focus was on improving the build speed and development experience with Vite(Rollup) & Turborepo. ## Features -- [React 18](https://reactjs.org/) +- [React18](https://reactjs.org/) - [TypeScript](https://www.typescriptlang.org/) -- [Vitest](https://vitest.dev/) -- [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/) - [Vite](https://vitejs.dev/) -- [SASS](https://sass-lang.com/) +- [Turborepo](https://turbo.build/repo) - [Prettier](https://prettier.io/) - [ESLint](https://eslint.org/) -- [Husky](https://typicode.github.io/husky/get-started.html#automatic-recommended) -- [Commitlint](https://commitlint.js.org/#/guides-local-setup?id=install-commitlint) -- [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) - [Chrome Extension Manifest Version 3](https://developer.chrome.com/docs/extensions/mv3/intro/) -- HRR(Hot Rebuild & Refresh/Reload) +- Custom HMR(Hot Module Rebuild) Plugin -## Installation +## Install ## Procedures: 1. Clone this repository. -2. Change `extensionDescription` and `extensionName` in messages.json -3. Install pnpm globally: `npm install -g pnpm` (check your node version >= 16.6, recommended >= 18) +2. Change `extensionDescription` and `extensionName` in `messages.json` file. +3. Install pnpm globally: `npm install -g pnpm` (check your node version >= 18.12.0) 4. Run `pnpm install` ## And next, depending on the needs: @@ -67,452 +62,88 @@ This boilerplate is made for creating chrome extensions using React and Typescri ### For Chrome: 1. Run: - - Dev: `pnpm dev` or `npm run dev` - - Prod: `pnpm build` or `npm run build` + - Dev: `pnpm dev-server` & `pnpm dev` (parallel run) + - Prod: `pnpm build` 2. Open in browser - `chrome://extensions` 3. Check - `Developer mode` 4. Find and Click - `Load unpacked extension` -5. Select - `dist` folder +5. Select - `dist` folder at root ### For Firefox: 1. Run: - - Dev: `pnpm dev:firefox` or `npm run dev:firefox` - - Prod: `pnpm build:firefox` or `npm run build:firefox` + - Dev: `pnpm dev-server` & `pnpm dev:firefox` (parallel run) + - Prod: `pnpm build:firefox` 2. Open in browser - `about:debugging#/runtime/this-firefox` 3. Find and Click - `Load Temporary Add-on...` -4. Select - `manifest.json` from `dist` folder +4. Select - `manifest.json` from `dist` folder at root ### Remember in firefox you add plugin in temporary mode, that's mean it's disappear after close browser, you must do it again, on next launch. -## Add Style Library - -> IMPORTANT: If you DO NOT want to use css file in the content script, you need to delete the css file in your -> manifest.js - -```js -content_scripts: [ - { - // YOU NEED TO DELETE THIS - css: ["assets/css/contentStyle.chunk.css"] - } -]; -``` - -### Twind - -> The smallest, fastest, most feature complete Tailwind-in-JS solution in existence - -**1. Install the library:** - -```bash -$ pnpm install -D @twind/core @twind/preset-autoprefix @twind/preset-tailwind -``` - -**2. Create twind.config.ts in the root folder** - -
-twind.config.ts - -```ts -import { defineConfig } from '@twind/core'; -import presetTailwind from '@twind/preset-tailwind'; -import presetAutoprefix from '@twind/preset-autoprefix'; - -export default defineConfig({ - presets: [presetAutoprefix(), presetTailwind()], -}); -``` - -
- -**3. Create src/shared/style/twind.ts for importing** - -
-src/shared/style/twind.ts - -```ts -import { twind, cssom, observe } from '@twind/core'; -import 'construct-style-sheets-polyfill'; -import config from '@root/twind.config'; - -export function attachTwindStyle( - observedElement: Element, - documentOrShadowRoot: T, -) { - const sheet = cssom(new CSSStyleSheet()); - const tw = twind(config, sheet); - observe(tw, observedElement); - documentOrShadowRoot.adoptedStyleSheets = [sheet.target]; -} -``` - -
- -**4. You can use Tailwind in your project:** - -
-src/pages/popup/index.tsx - -```tsx -import { attachTwindStyle } from '@src/shared/style/twind'; -... -attachTwindStyle(appContainer, document); -const root = createRoot(appContainer); -root.render(); -``` +## Structure -
+### Apps -**5. If you want to use Twind in the content script, you need to add the following code:** - -
-src/pages/content/ui/root.tsx - -```tsx -import { attachTwindStyle } from '@src/shared/style/twind'; - -... -attachTwindStyle(rootIntoShadow, shadowRoot); -createRoot(rootIntoShadow).render(); -``` - -
- -[See more examples](https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/pull/244/) - -### Chakra UI - -**1. Install the library:** - -```bash -$ pnpm install @chakra-ui/react @emotion/cache @emotion/react -``` - -**2. You should add the code to `vite.config.ts` -for [Ignore unnecessary warnings](https://github.com/TanStack/query/pull/5161#issuecomment-1506683450)** - -
-vite.config.ts - -```ts -export default defineConfig({ - build: { - rollupOptions: { - // Add below code ~~~~~ - onwarn(warning, warn) { - if ( - warning.code === "MODULE_LEVEL_DIRECTIVE" && - warning.message.includes(`"use client"`) - ) { - return; - } - warn(warning); - }, - // Add above code ~~~~ - }, - }, -}); -``` - -
- -**3. You can use Chakra UI in your project:** - -
-src/pages/popup/Popup.tsx - -```tsx -import { Button } from "@chakra-ui/react"; - -export default function Popup() { - return ( - - ; - - ); -} -``` - -
- ---- +- `chrome-extension` - Main app for chrome extension + - `manifest.js` - manifest for chrome extension + - `lib/background` - [background script](https://developer.chrome.com/docs/extensions/mv3/background_pages/) for chrome extension (`background.service_worker` in + manifest.json) + - `public/content.css` - content css for user's page injection -> if you don't want to use Chakra UI in the content script, you can skip 4,5 step. - -**4. If you want to use Chakra UI in the content script, you need to add the following code:** - -
-src/pages/content/ui/CustomChakraProvider.tsx - -```tsx -import { ReactNode, useCallback, useEffect, useState } from "react"; -import { - ColorMode, - ColorModeContext, - ColorModeScript, - CSSReset, - extendTheme, - GlobalStyle, - ThemeProvider -} from "@chakra-ui/react"; - -const theme = extendTheme(); - -const getCurrentTheme = () => { - const isDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - return isDark ? "dark" : "light"; -}; - -type CustomChakraProviderProps = { - shadowRootId: string; - children: ReactNode; -}; -export default function CustomChakraProvider({ children, shadowRootId }: CustomChakraProviderProps) { - const [colorMode, setColorMode] = useState(getCurrentTheme()); - - useEffect(() => { - const darkThemeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); - const onChangeColorSchema = (event: MediaQueryListEvent) => { - const isDark = event.matches; - setColorMode(isDark ? "dark" : "light"); - }; +### Packages - darkThemeMediaQuery.addEventListener("change", onChangeColorSchema); +- `dev-utils` - utils for chrome extension development (manifest-parser, logger) +- `hmr` - custom HMR plugin for vite, injection script for reload/refresh, hmr dev-server +- `shared` - shared code for entire project. (types, constants, custom hooks, components, etc.) +- `tsconfig` - shared tsconfig for entire project. - return () => { - darkThemeMediaQuery.removeEventListener("change", onChangeColorSchema); - }; - }, []); +### Pages - const toggleColorMode = useCallback(() => { - setColorMode(prev => (prev === "dark" ? "light" : "dark")); - }, []); +- `content` - [content script](https://developer.chrome.com/docs/extensions/mv3/content_scripts/) for chrome extension (`content_scripts` in manifest.json) +- `content-ui` - [content script](https://developer.chrome.com/docs/extensions/mv3/content_scripts/) for render UI in user's page (`content_scripts` in manifest.json) +- `devtools` - [devtools](https://developer.chrome.com/docs/extensions/mv3/devtools/#creating) for chrome extension (`devtools_page` in manifest.json) +- `devtools-panel` - devtools panel for [devtools](pages/devtools/src/index.ts) +- `newtab` - [new tab](https://developer.chrome.com/docs/extensions/mv3/override/) for chrome extension (`chrome_url_overrides.newtab` in + manifest.json) +- `options` - [options](https://developer.chrome.com/docs/extensions/mv3/options/) for chrome extension (`options_page` in manifest.json) +- `popup` - [popup](https://developer.chrome.com/docs/extensions/reference/browserAction/) for chrome extension (`action.default_popup` in + manifest.json) +- `sidepanel` - [sidepanel(Chrome 114+)](https://developer.chrome.com/docs/extensions/reference/sidePanel/) for chrome extension (`side_panel.default_path` in manifest.json) - return ( - - - - - - {children} - - - ); -} -``` +### Preview -
-
-src/pages/content/ui/EmotionCacheProvider.tsx +> share storage state between every page -```tsx -import createCache from '@emotion/cache'; -import { CacheProvider, type EmotionCache } from '@emotion/react'; -import { ReactNode, useEffect, useState } from 'react'; +https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/assets/53500778/1992e46c-032a-4743-bbd2-c421757517d7 -export default function EmotionCacheProvider({ children, rootId }: { rootId: string; children: ReactNode }) { - const [emotionCache, setEmotionCache] = useState(null); - - useEffect(() => { - function setEmotionStyles(shadowRoot: ShadowRoot) { - setEmotionCache( - createCache({ - key: rootId, - container: shadowRoot, - }), - ); - } - - const root = document.getElementById(rootId); - if (root && root.shadowRoot) { - setEmotionStyles(root.shadowRoot); - } - }, []); - - return emotionCache ? {children} : null; -} -``` - -
- -**5. Fix the `src/pages/content/ui/root.tsx` file:** - -
-src/pages/content/ui/root.tsx - -```tsx -import CustomChakraProvider from '@pages/content/ui/CustomChakraProvider'; -import EmotionCacheProvider from '@pages/content/ui/EmotionCacheProvider'; - -// ... - -createRoot(rootIntoShadow).render( - // Add Providers - - - - - , -); - -``` - -
- -## Pages - -### New Tab - -[Override Chrome pages](https://developer.chrome.com/docs/extensions/mv3/override/)
`chrome_url_overrides.newtab` in -manifest.json - -### Popup - -[Browser actions](https://developer.chrome.com/docs/extensions/reference/browserAction/)
`action.default_popup` in -manifest.json - -### Devtools - -[Devtools](https://developer.chrome.com/docs/extensions/mv3/devtools/#creating)
`devtools_page` in manifest.json - -### Background - -[Background](https://developer.chrome.com/docs/extensions/mv3/background_pages/)
`background.service_worker` in -manifest.json - -### ContentScript - -[Content Script (contentInjected/contentUI)](https://developer.chrome.com/docs/extensions/mv3/content_scripts/)
`content_scripts` -in -manifest.json - -### Options - -[Options](https://developer.chrome.com/docs/extensions/mv3/options/)
`options_page` in manifest.json - -### SidePanel (Chrome 114+) - -[SidePanel](https://developer.chrome.com/docs/extensions/reference/sidePanel/)
`side_panel.default_path` in -manifest.json - -## Screenshots - -### New Tab - -newtab - -### Popup - -| Black | White | -|----------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------| -| black | white | - -### Devtools - -devtools - -## Examples - -- https://github.com/Jonghakseo/react-code-finder-extension -- https://github.com/Jonghakseo/drag-gpt-extension -- https://github.com/Jonghakseo/pr-commit-noti -- https://github.com/ariburaco/chatgpt-file-uploader-extended - -## Documents +## Reference - [Vite Plugin](https://vitejs.dev/guide/api-plugin.html) - [ChromeExtension](https://developer.chrome.com/docs/extensions/mv3/) - [Rollup](https://rollupjs.org/guide/en/) +- [Turborepo](https://turbo.build/repo/docs) - [Rollup-plugin-chrome-extension](https://www.extend-chrome.dev/rollup-plugin) -## Star History +## Star History [![Star History Chart](https://api.star-history.com/svg?repos=Jonghakseo/chrome-extension-boilerplate-react-vite&type=Date)](https://star-history.com/#Jonghakseo/chrome-extension-boilerplate-react-vite&Date) -## Contributors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
JunyWuuuu91
JunyWuuuu91

πŸ’»
dim0147
dim0147

πŸ›
jon lepage
jon lepage

πŸ›
LironH
LironH

πŸ€”
Spencer Chang
Spencer Chang

πŸ›
deld123
deld123

πŸ›
Michal Hantl
Michal Hantl

πŸ€” πŸ›
Jordan Burgess
Jordan Burgess

πŸ€”
NAMEUN CHO
NAMEUN CHO

πŸ›
Andrew Mudrov
Andrew Mudrov

πŸ’¬
Shubham Lad
Shubham Lad

πŸ›
hanrong
hanrong

πŸ›
Florian KΓΆnig
Florian KΓΆnig

πŸ’¬
Tran Phong
Tran Phong

πŸ›
tonychandesign
tonychandesign

πŸ›
Ihor Makarchuk
Ihor Makarchuk

πŸ›
hugoobauer
hugoobauer

πŸ›
Karan Singh
Karan Singh

πŸ€”
remusris
remusris

πŸ€”
hegel_dark
hegel_dark

πŸ€”
Jingsi
Jingsi

πŸ› πŸ’»
Chris Ozgo
Chris Ozgo

πŸ›
Cong
Cong

πŸ›
PatrykKuniczak
PatrykKuniczak

πŸ€” πŸ’» πŸ“–
Hector Parra
Hector Parra

πŸ›
JeongHyeon Kim
JeongHyeon Kim

πŸš‡
Terminels
Terminels

πŸ’»
WonkyDD
WonkyDD

πŸ’» πŸ›
wangxy
wangxy

πŸ›
Rasul
Rasul

πŸ“–
gavinhow
gavinhow

πŸ›
Anand D.
Anand D.

πŸ“–
Romain Dequidt
Romain Dequidt

πŸ“–
Jakob Guddas
Jakob Guddas

πŸ“– πŸ›
Dino Scheidt
Dino Scheidt

πŸ’»
秋ηŸ₯
秋ηŸ₯

πŸ’»
Hiverse
Hiverse

πŸ›
rosendolu
rosendolu

πŸ’»
Egor Stronhin
Egor Stronhin

πŸ“–
webLiang
webLiang

πŸ’»
Adam Spiers
Adam Spiers

πŸ›
Ofir Zeitoun
Ofir Zeitoun

πŸ’»
Dmitri Yourchev
Dmitri Yourchev

πŸ’» πŸ›
Gaishi Hirota
Gaishi Hirota

πŸ’»
pipizhu
pipizhu

πŸ’»
- - - - - +## Contributors + +This Boilerplate is made possible thanks to all of its contributors. + + + + --- -## Thanks To +## Special Thanks To -| [Jetbrains](https://jb.gg/OpenSourceSupport) | [Jackson Hong](https://www.linkedin.com/in/j-acks0n/) | -|--------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------| -| JetBrains Logo (Main) logo. | Jackson Hong | +| JetBrains Logo (Main) logo. | Jackson Hong | +|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------| --- -[Jonghakseo](https://nookpi.tistory.com/) +Made by [Jonghakseo](https://nookpi.tistory.com/) diff --git a/apps/chrome-extension/lib/background/index.ts b/apps/chrome-extension/lib/background/index.ts new file mode 100644 index 000000000..50c483ab4 --- /dev/null +++ b/apps/chrome-extension/lib/background/index.ts @@ -0,0 +1,4 @@ +import 'webextension-polyfill'; + +console.log('background loaded'); +console.log("Edit 'apps/chrome-extension/lib/background/index.ts' and save to reload."); diff --git a/manifest.js b/apps/chrome-extension/manifest.js similarity index 65% rename from manifest.js rename to apps/chrome-extension/manifest.js index 333eaef4f..98a881350 100755 --- a/manifest.js +++ b/apps/chrome-extension/manifest.js @@ -17,19 +17,19 @@ const manifest = { description: '__MSG_extensionDescription__', permissions: ['storage', 'sidePanel'], side_panel: { - default_path: 'src/pages/sidepanel/index.html', + default_path: 'sidepanel/index.html', }, - options_page: 'src/pages/options/index.html', + options_page: 'options/index.html', background: { - service_worker: 'src/pages/background/index.js', + service_worker: 'background.iife.js', type: 'module', }, action: { - default_popup: 'src/pages/popup/index.html', + default_popup: 'popup/index.html', default_icon: 'icon-34.png', }, chrome_url_overrides: { - newtab: 'src/pages/newtab/index.html', + newtab: 'newtab/index.html', }, icons: { 128: 'icon-128.png', @@ -37,19 +37,21 @@ const manifest = { content_scripts: [ { matches: ['http://*/*', 'https://*/*', ''], - js: ['src/pages/contentInjected/index.js'], - // KEY for cache invalidation - css: ['assets/css/contentStyle.chunk.css'], + js: ['content/index.iife.js'], }, { matches: ['http://*/*', 'https://*/*', ''], - js: ['src/pages/contentUI/index.js'], + js: ['content-ui/index.iife.js'], + }, + { + matches: ['http://*/*', 'https://*/*', ''], + css: ['content.css'], // public folder }, ], - devtools_page: 'src/pages/devtools/index.html', + devtools_page: 'devtools/index.html', web_accessible_resources: [ { - resources: ['assets/js/*.js', 'assets/css/*.css', 'icon-128.png', 'icon-34.png'], + resources: ['*.js', '*.css', '*.svg', 'icon-128.png', 'icon-34.png'], matches: ['*://*/*'], }, ], diff --git a/apps/chrome-extension/package.json b/apps/chrome-extension/package.json new file mode 100644 index 000000000..0c6c33c1f --- /dev/null +++ b/apps/chrome-extension/package.json @@ -0,0 +1,34 @@ +{ + "name": "chrome-extension", + "version": "0.0.1", + "description": "chrome extension", + "scripts": { + "clean": "rimraf ../../dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:firefox": "tsc --noEmit && cross-env __FIREFOX__=true vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "build:firefox:watch": "cross-env __DEV__=true __FIREFOX__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "dev:firefox": "pnpm build:firefox:watch", + "test": "vitest run", + "lint": "eslint src --ext .ts,.js,.tsx,.jsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "type": "module", + "dependencies": { + "webextension-polyfill": "0.10.0" + }, + "devDependencies": { + "@chrome-extension-boilerplate/dev-utils": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*", + "@chrome-extension-boilerplate/shared": "workspace:*", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@laynezh/vite-plugin-lib-assets": "^0.5.21", + "@types/ws": "8.5.8", + "magic-string": "^0.30.6", + "npm-run-all": "4.1.5", + "ts-loader": "9.5.0" + } +} diff --git a/public/_locales/en/messages.json b/apps/chrome-extension/public/_locales/en/messages.json similarity index 96% rename from public/_locales/en/messages.json rename to apps/chrome-extension/public/_locales/en/messages.json index 060e8dfef..1935cf34a 100644 --- a/public/_locales/en/messages.json +++ b/apps/chrome-extension/public/_locales/en/messages.json @@ -1,10 +1,10 @@ -{ - "extensionDescription": { - "description": "Extension description", - "message": "Chrome extension boilerplate developed with Vite, React and Typescript" - }, - "extensionName": { - "description": "Extension name", - "message": "Chrome extension boilerplate" - } -} \ No newline at end of file +{ + "extensionDescription": { + "description": "Extension description", + "message": "Chrome extension boilerplate developed with Vite, React and Typescript" + }, + "extensionName": { + "description": "Extension name", + "message": "Chrome extension boilerplate" + } +} diff --git a/apps/chrome-extension/public/content.css b/apps/chrome-extension/public/content.css new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/chrome-extension/public/content.css @@ -0,0 +1 @@ + diff --git a/public/icon-128.png b/apps/chrome-extension/public/icon-128.png similarity index 100% rename from public/icon-128.png rename to apps/chrome-extension/public/icon-128.png diff --git a/public/icon-34.png b/apps/chrome-extension/public/icon-34.png similarity index 100% rename from public/icon-34.png rename to apps/chrome-extension/public/icon-34.png diff --git a/apps/chrome-extension/tsconfig.json b/apps/chrome-extension/tsconfig.json new file mode 100644 index 000000000..16da20dec --- /dev/null +++ b/apps/chrome-extension/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/app.json", + "compilerOptions": { + "baseUrl": "./", + "types": ["vite/client", "node", "chrome"], + "paths": { + "@root/*": ["./*"], + "@lib/*": ["lib/*"], + } + }, + "include": ["src", "utils", "vite.config.ts", "node_modules/@types"] +} diff --git a/utils/plugins/make-manifest.ts b/apps/chrome-extension/utils/plugins/make-manifest-plugin.ts similarity index 61% rename from utils/plugins/make-manifest.ts rename to apps/chrome-extension/utils/plugins/make-manifest-plugin.ts index b7ee8dcd1..608f9ebdf 100644 --- a/utils/plugins/make-manifest.ts +++ b/apps/chrome-extension/utils/plugins/make-manifest-plugin.ts @@ -1,15 +1,13 @@ import * as fs from 'fs'; import * as path from 'path'; -import colorLog from '../log'; -import ManifestParser from '../manifest-parser'; +import { ManifestParser, colorLog } from '@chrome-extension-boilerplate/dev-utils'; import type { PluginOption } from 'vite'; -import url from 'url'; +import { pathToFileURL } from 'url'; import * as process from 'process'; const { resolve } = path; const rootDir = resolve(__dirname, '..', '..'); -const distDir = resolve(rootDir, 'dist'); const manifestFile = resolve(rootDir, 'manifest.js'); const getManifestWithCacheBurst = (): Promise<{ default: chrome.runtime.ManifestV3 }> => { @@ -19,25 +17,20 @@ const getManifestWithCacheBurst = (): Promise<{ default: chrome.runtime.Manifest * So, we need to convert path to file:// protocol. (url.pathToFileURL) */ if (process.platform === 'win32') { - return import(withCacheBurst(url.pathToFileURL(manifestFile).href)); + return import(withCacheBurst(pathToFileURL(manifestFile).href)); } return import(withCacheBurst(manifestFile)); }; -export default function makeManifest(config?: { getCacheInvalidationKey?: () => string }): PluginOption { - function makeManifest(manifest: chrome.runtime.ManifestV3, to: string, cacheKey?: string) { +export default function makeManifestPlugin(config: { outDir: string }): PluginOption { + function makeManifest(manifest: chrome.runtime.ManifestV3, to: string) { if (!fs.existsSync(to)) { fs.mkdirSync(to); } const manifestPath = resolve(to, 'manifest.json'); - if (cacheKey && manifest.content_scripts) { - // Naming change for cache invalidation - manifest.content_scripts.forEach(script => { - script.css &&= script.css.map(css => css.replace('', cacheKey)); - }); - } - fs.writeFileSync(manifestPath, ManifestParser.convertManifestToString(manifest)); + const isFirefox = process.env.__FIREFOX__; + fs.writeFileSync(manifestPath, ManifestParser.convertManifestToString(manifest, isFirefox ? 'firefox' : 'chrome')); colorLog(`Manifest file copy complete: ${manifestPath}`, 'success'); } @@ -48,9 +41,9 @@ export default function makeManifest(config?: { getCacheInvalidationKey?: () => this.addWatchFile(manifestFile); }, async writeBundle() { - const invalidationKey = config.getCacheInvalidationKey?.(); + const outDir = config.outDir; const manifest = await getManifestWithCacheBurst(); - makeManifest(manifest.default, distDir, invalidationKey); + makeManifest(manifest.default, outDir); }, }; } diff --git a/apps/chrome-extension/vite.config.ts b/apps/chrome-extension/vite.config.ts new file mode 100644 index 000000000..fc0d9aacf --- /dev/null +++ b/apps/chrome-extension/vite.config.ts @@ -0,0 +1,47 @@ +import { defineConfig } from 'vite'; +import { resolve } from 'path'; +import libAssetsPlugin from '@laynezh/vite-plugin-lib-assets'; +import makeManifestPlugin from './utils/plugins/make-manifest-plugin'; +import { watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const libDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +const outDir = resolve(rootDir, '..', '..', 'dist'); +export default defineConfig({ + resolve: { + alias: { + '@root': rootDir, + '@lib': libDir, + '@assets': resolve(libDir, 'assets'), + }, + }, + plugins: [ + libAssetsPlugin({ + outputPath: outDir, + }), + makeManifestPlugin({ outDir }), + isDev && watchRebuildPlugin({ reload: true }), + ], + publicDir: resolve(rootDir, 'public'), + build: { + lib: { + formats: ['iife'], + entry: resolve(__dirname, 'lib/background/index.ts'), + name: 'BackgroundScript', + fileName: 'background', + }, + outDir, + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + modulePreload: true, + rollupOptions: { + external: ['chrome'], + }, + }, +}); diff --git a/commitlint.config.js b/commitlint.config.js deleted file mode 100644 index 3f5e287f9..000000000 --- a/commitlint.config.js +++ /dev/null @@ -1 +0,0 @@ -export default { extends: ['@commitlint/config-conventional'] }; diff --git a/package.json b/package.json index aa05c5770..dbb32a032 100644 --- a/package.json +++ b/package.json @@ -8,43 +8,32 @@ "url": "https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite.git" }, "scripts": { - "build": "tsc --noEmit && vite build", - "build:firefox": "tsc --noEmit && cross-env __FIREFOX__=true vite build", - "build:watch": "cross-env __DEV__=true vite build -w --mode development", - "build:firefox:watch": "cross-env __DEV__=true __FIREFOX__=true vite build -w --mode development", - "build:hmr": "rollup --config utils/reload/rollup.config.mjs", - "wss": "node utils/reload/initReloadServer.js", - "dev": "pnpm build:hmr && (run-p wss build:watch)", - "dev:firefox": "pnpm build:hmr && (run-p wss build:firefox:watch)", - "test": "vitest", - "commitlint": "commitlint --edit", - "lint": "eslint src --ext .ts,.js,.tsx,.jsx", - "lint:fix": "pnpm lint --fix", - "prettier": "prettier . --write", - "prepare": "husky install" + "clean": "rimraf dist && rimraf .turbo && turbo clean", + "build": "turbo build", + "build:firefox": "cross-env __FIREFOX__=true turbo build", + "dev-server": "pnpm -F hmr build && pnpm -F hmr dev-server", + "dev": "cross-env __DEV__=true turbo dev --concurrency 20", + "dev:firefox": "cross-env __DEV__=true __FIREFOX__=true turbo dev --concurrency 20", + "test": "turbo test", + "type-check": "turbo type-check", + "lint": "turbo lint", + "lint:fix": "turbo lint:fix", + "prettier": "turbo prettier" }, "type": "module", "dependencies": { - "construct-style-sheets-polyfill": "3.1.0", "react": "18.2.0", - "react-dom": "18.2.0", - "webextension-polyfill": "0.10.0" + "react-dom": "18.2.0" }, "devDependencies": { - "@commitlint/cli": "18.4.4", - "@commitlint/config-conventional": "18.1.0", - "@rollup/plugin-sucrase": "^5.0.2", - "@rollup/plugin-typescript": "11.1.6", - "@testing-library/react": "14.0.0", "@types/chrome": "0.0.263", "@types/node": "20.8.10", "@types/react": "18.2.37", "@types/react-dom": "18.2.18", - "@types/ws": "8.5.8", "@typescript-eslint/eslint-plugin": "6.10.0", "@typescript-eslint/parser": "6.18.1", - "@vitejs/plugin-react": "4.2.0", - "chokidar": "3.5.3", + "@vitejs/plugin-react-swc": "^3.6.0", + "autoprefixer": "^10.4.19", "cross-env": "7.0.3", "eslint": "8.56.0", "eslint-config-airbnb-typescript": "17.1.0", @@ -54,27 +43,17 @@ "eslint-plugin-prettier": "5.1.3", "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "4.6.0", - "fs-extra": "11.1.1", - "husky": "8.0.3", - "jsdom": "^22.1.0", - "lint-staged": "15.2.0", - "magic-string": "^0.30.6", - "npm-run-all": "4.1.5", + "postcss": "^8.4.38", "prettier": "3.2.5", - "rollup": "4.3.0", - "sass": "1.72.0", - "ts-loader": "9.5.0", + "rimraf": "^5.0.5", + "tailwindcss": "^3.4.3", "tslib": "2.6.2", + "turbo": "^1.12.4", "typescript": "5.2.2", - "vite": "5.0.12", - "vitest": "^1.2.2", - "ws": "8.14.2" + "vite": "^5.2.11" }, - "lint-staged": { - "*.{js,jsx,ts,tsx}": [ - "prettier --write", - "eslint --fix" - ] - }, - "packageManager": "pnpm@8.9.2" + "packageManager": "pnpm@8.9.2", + "engines": { + "node": ">=18.12.0" + } } diff --git a/packages/dev-utils/index.ts b/packages/dev-utils/index.ts new file mode 100644 index 000000000..6e936dfe6 --- /dev/null +++ b/packages/dev-utils/index.ts @@ -0,0 +1,2 @@ +export * from './lib/manifest-parser'; +export * from './lib/logger'; diff --git a/utils/log.ts b/packages/dev-utils/lib/logger.ts similarity index 93% rename from utils/log.ts rename to packages/dev-utils/lib/logger.ts index b945e02f7..dfdf66471 100644 --- a/utils/log.ts +++ b/packages/dev-utils/lib/logger.ts @@ -1,7 +1,7 @@ type ColorType = 'success' | 'info' | 'error' | 'warning' | keyof typeof COLORS; type ValueOf = T[keyof T]; -export default function colorLog(message: string, type: ColorType) { +export function colorLog(message: string, type: ColorType) { let color: ValueOf; switch (type) { diff --git a/packages/dev-utils/lib/manifest-parser/impl.ts b/packages/dev-utils/lib/manifest-parser/impl.ts new file mode 100644 index 000000000..39046a5f7 --- /dev/null +++ b/packages/dev-utils/lib/manifest-parser/impl.ts @@ -0,0 +1,30 @@ +import { ManifestParserInterface, Manifest } from './type'; + +export const ManifestParserImpl: ManifestParserInterface = { + convertManifestToString: (manifest, env) => { + if (env === 'firefox') { + manifest = convertToFirefoxCompatibleManifest(manifest); + } + return JSON.stringify(manifest, null, 2); + }, +}; + +function convertToFirefoxCompatibleManifest(manifest: Manifest) { + const manifestCopy = { + ...manifest, + } as { [key: string]: unknown }; + + manifestCopy.background = { + scripts: [manifest.background?.service_worker], + type: 'module', + }; + manifestCopy.options_ui = { + page: manifest.options_page, + browser_style: false, + }; + manifestCopy.content_security_policy = { + extension_pages: "script-src 'self'; object-src 'self'", + }; + delete manifestCopy.options_page; + return manifestCopy as Manifest; +} diff --git a/packages/dev-utils/lib/manifest-parser/index.ts b/packages/dev-utils/lib/manifest-parser/index.ts new file mode 100644 index 000000000..eba411567 --- /dev/null +++ b/packages/dev-utils/lib/manifest-parser/index.ts @@ -0,0 +1,2 @@ +import { ManifestParserImpl } from './impl'; +export const ManifestParser = ManifestParserImpl; diff --git a/packages/dev-utils/lib/manifest-parser/type.ts b/packages/dev-utils/lib/manifest-parser/type.ts new file mode 100644 index 000000000..d00982ca7 --- /dev/null +++ b/packages/dev-utils/lib/manifest-parser/type.ts @@ -0,0 +1,5 @@ +export type Manifest = chrome.runtime.ManifestV3; + +export interface ManifestParserInterface { + convertManifestToString: (manifest: Manifest, env: 'chrome' | 'firefox') => string; +} diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json new file mode 100644 index 000000000..831fd8be0 --- /dev/null +++ b/packages/dev-utils/package.json @@ -0,0 +1,25 @@ +{ + "name": "@chrome-extension-boilerplate/dev-utils", + "version": "0.0.1", + "description": "chrome extension dev utils", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "clean": "rimraf ./dist && rimraf ./build && rimraf .turbo", + "build": "pnpm run clean && tsc", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": {}, + "devDependencies": { + "@chrome-extension-boilerplate/tsconfig": "workspace:*" + } +} diff --git a/packages/dev-utils/tsconfig.json b/packages/dev-utils/tsconfig.json new file mode 100644 index 000000000..bb166666c --- /dev/null +++ b/packages/dev-utils/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/utils", + "compilerOptions": { + "outDir": "dist", + "types": ["chrome"] + }, + "include": ["index.ts", "lib"] +} diff --git a/packages/hmr/index.ts b/packages/hmr/index.ts new file mode 100644 index 000000000..9d821d7ad --- /dev/null +++ b/packages/hmr/index.ts @@ -0,0 +1 @@ +export * from './lib/plugins'; diff --git a/utils/reload/constant.ts b/packages/hmr/lib/constant.ts similarity index 100% rename from utils/reload/constant.ts rename to packages/hmr/lib/constant.ts diff --git a/utils/reload/utils.ts b/packages/hmr/lib/debounce.ts similarity index 85% rename from utils/reload/utils.ts rename to packages/hmr/lib/debounce.ts index 3bcf12fd3..bda69f260 100644 --- a/utils/reload/utils.ts +++ b/packages/hmr/lib/debounce.ts @@ -1,5 +1,3 @@ -import { clearTimeout } from 'timers'; - export function debounce(callback: (...args: A) => void, delay: number) { let timer: NodeJS.Timeout; return function (...args: A) { diff --git a/packages/hmr/lib/initClient.ts b/packages/hmr/lib/initClient.ts new file mode 100644 index 000000000..7cde4ada4 --- /dev/null +++ b/packages/hmr/lib/initClient.ts @@ -0,0 +1,39 @@ +import { LOCAL_RELOAD_SOCKET_URL } from './constant'; +import MessageInterpreter from './interpreter'; + +export default function initReloadClient({ id, onUpdate }: { id: string; onUpdate: () => void }) { + let ws: WebSocket | null = null; + try { + ws = new WebSocket(LOCAL_RELOAD_SOCKET_URL); + ws.onopen = () => { + ws?.addEventListener('message', event => { + const message = MessageInterpreter.receive(String(event.data)); + if (message.type === 'ping') { + console.log('[HMR] Client OK'); + } + if (message.type === 'do_update' && message.id === id) { + sendUpdateCompleteMessage(); + onUpdate(); + return; + } + }); + }; + + ws.onclose = () => { + console.log( + `Reload server disconnected.\nPlease check if the WebSocket server is running properly on ${LOCAL_RELOAD_SOCKET_URL}. This feature detects changes in the code and helps the browser to reload the extension or refresh the current tab.`, + ); + setTimeout(() => { + initReloadClient({ onUpdate, id }); + }, 1000); + }; + } catch (e) { + setTimeout(() => { + initReloadClient({ onUpdate, id }); + }, 1000); + } + + function sendUpdateCompleteMessage() { + ws?.send(MessageInterpreter.send({ type: 'done_update' })); + } +} diff --git a/packages/hmr/lib/initReloadServer.ts b/packages/hmr/lib/initReloadServer.ts new file mode 100644 index 000000000..e61081ea3 --- /dev/null +++ b/packages/hmr/lib/initReloadServer.ts @@ -0,0 +1,49 @@ +#!/usr/bin/env node + +import { WebSocket, WebSocketServer } from 'ws'; +import { LOCAL_RELOAD_SOCKET_PORT, LOCAL_RELOAD_SOCKET_URL } from './constant'; +import MessageInterpreter from './interpreter'; + +const clientsThatNeedToUpdate: Set = new Set(); + +function initReloadServer() { + try { + const wss = new WebSocketServer({ port: LOCAL_RELOAD_SOCKET_PORT }); + + wss.on('listening', () => console.log(`[HMR] Server listening at ${LOCAL_RELOAD_SOCKET_URL}`)); + + wss.on('connection', ws => { + clientsThatNeedToUpdate.add(ws); + + ws.addEventListener('close', () => clientsThatNeedToUpdate.delete(ws)); + ws.addEventListener('message', event => { + if (typeof event.data !== 'string') return; + + const message = MessageInterpreter.receive(event.data); + + if (message.type === 'done_update') { + ws.close(); + } + if (message.type === 'build_complete') { + clientsThatNeedToUpdate.forEach((ws: WebSocket) => + ws.send(MessageInterpreter.send({ type: 'do_update', id: message.id })), + ); + } + }); + }); + + ping(); + } catch { + console.error(`[HMR] Failed to start server at ${LOCAL_RELOAD_SOCKET_URL}`); + console.error('PLEASE MAKE SURE YOU ARE RUNNING `pnpm dev-server`'); + } +} + +initReloadServer(); + +function ping() { + clientsThatNeedToUpdate.forEach(ws => ws.send(MessageInterpreter.send({ type: 'ping' }))); + setTimeout(() => { + ping(); + }, 15_000); +} diff --git a/utils/reload/injections/view.ts b/packages/hmr/lib/injections/refresh.ts similarity index 76% rename from utils/reload/injections/view.ts rename to packages/hmr/lib/injections/refresh.ts index f67356225..13ef56cfc 100644 --- a/utils/reload/injections/view.ts +++ b/packages/hmr/lib/injections/refresh.ts @@ -1,10 +1,12 @@ -import initReloadClient from '../initReloadClient'; +import initClient from '../initClient'; -export default function addHmrIntoView(watchPath: string) { +function addRefresh() { let pendingReload = false; - initReloadClient({ - watchPath, + initClient({ + // eslint-disable-next-line + // @ts-ignore + id: __HMR_ID, onUpdate: () => { // disable reload when tab is hidden if (document.hidden) { @@ -27,3 +29,5 @@ export default function addHmrIntoView(watchPath: string) { } document.addEventListener('visibilitychange', reloadWhenTabIsVisible); } + +addRefresh(); diff --git a/packages/hmr/lib/injections/reload.ts b/packages/hmr/lib/injections/reload.ts new file mode 100644 index 000000000..25a94c4e9 --- /dev/null +++ b/packages/hmr/lib/injections/reload.ts @@ -0,0 +1,18 @@ +import initClient from '../initClient'; + +function addReload() { + const reload = () => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + chrome.runtime.reload(); + }; + + initClient({ + // eslint-disable-next-line + // @ts-ignore + id: __HMR_ID, + onUpdate: reload, + }); +} + +addReload(); diff --git a/utils/reload/interpreter/index.ts b/packages/hmr/lib/interpreter/index.ts similarity index 100% rename from utils/reload/interpreter/index.ts rename to packages/hmr/lib/interpreter/index.ts diff --git a/packages/hmr/lib/interpreter/types.ts b/packages/hmr/lib/interpreter/types.ts new file mode 100644 index 000000000..465b6ed5c --- /dev/null +++ b/packages/hmr/lib/interpreter/types.ts @@ -0,0 +1,11 @@ +type UpdateRequestMessage = { + type: 'do_update'; + id: string; +}; +type UpdateCompleteMessage = { type: 'done_update' }; +type PingMessage = { type: 'ping' }; +type BuildCompletionMessage = { type: 'build_complete'; id: string }; + +export type SerializedMessage = string; + +export type WebSocketMessage = UpdateCompleteMessage | UpdateRequestMessage | BuildCompletionMessage | PingMessage; diff --git a/packages/hmr/lib/plugins/index.ts b/packages/hmr/lib/plugins/index.ts new file mode 100644 index 000000000..dc3b37066 --- /dev/null +++ b/packages/hmr/lib/plugins/index.ts @@ -0,0 +1,2 @@ +export * from './watch-rebuild-plugin'; +export * from './make-entry-point-plugin'; diff --git a/packages/hmr/lib/plugins/make-entry-point-plugin.ts b/packages/hmr/lib/plugins/make-entry-point-plugin.ts new file mode 100644 index 000000000..989c8381f --- /dev/null +++ b/packages/hmr/lib/plugins/make-entry-point-plugin.ts @@ -0,0 +1,47 @@ +import * as fs from 'fs'; +import path from 'path'; +import type { PluginOption } from 'vite'; + +/** + * make entry point file for content script cache busting + */ + +export function makeEntryPointPlugin(): PluginOption { + const cleanupTargets = new Set(); + return { + name: 'make-entry-point-plugin', + generateBundle(options, bundle) { + const outputDir = options.dir; + if (!outputDir) { + throw new Error('Output directory not found'); + } + for (const module of Object.values(bundle)) { + const fileName = path.basename(module.fileName); + const newFileName = fileName.replace('.js', '_dev.js'); + switch (module.type) { + case 'asset': + // map file + if (fileName.endsWith('.map')) { + cleanupTargets.add(path.resolve(outputDir, fileName)); + const originalFileName = fileName.replace('.map', ''); + const replacedSource = String(module.source).replaceAll(originalFileName, newFileName); + module.source = ''; + fs.writeFileSync(path.resolve(outputDir, newFileName), replacedSource); + break; + } + break; + case 'chunk': { + fs.writeFileSync(path.resolve(outputDir, newFileName), module.code); + module.code = `import('./${newFileName}');`; + break; + } + } + } + }, + closeBundle() { + cleanupTargets.forEach(target => { + fs.unlinkSync(target); + }); + }, + }; +} diff --git a/packages/hmr/lib/plugins/watch-rebuild-plugin.ts b/packages/hmr/lib/plugins/watch-rebuild-plugin.ts new file mode 100644 index 000000000..07a636173 --- /dev/null +++ b/packages/hmr/lib/plugins/watch-rebuild-plugin.ts @@ -0,0 +1,67 @@ +import type { PluginOption } from 'vite'; +import { WebSocket } from 'ws'; +import MessageInterpreter from '../interpreter'; +import { LOCAL_RELOAD_SOCKET_URL } from '../constant'; +import * as fs from 'fs'; +import path from 'path'; + +type PluginConfig = { + onStart?: () => void; + reload?: boolean; + refresh?: boolean; +}; + +const injectionsPath = path.resolve(__dirname, '..', '..', '..', 'build', 'injections'); + +const refreshCode = fs.readFileSync(path.resolve(injectionsPath, 'refresh.js'), 'utf-8'); +const reloadCode = fs.readFileSync(path.resolve(injectionsPath, 'reload.js'), 'utf-8'); + +export function watchRebuildPlugin(config: PluginConfig): PluginOption { + let ws: WebSocket | null = null; + const id = Math.random().toString(36); + const { refresh, reload } = config; + + const hmrCode = (refresh ? refreshCode : '') + (reload ? reloadCode : ''); + + function initializeWebSocket() { + if (!ws) { + ws = new WebSocket(LOCAL_RELOAD_SOCKET_URL); + ws.onopen = () => { + console.log(`[HMR] Connected to dev-server at ${LOCAL_RELOAD_SOCKET_URL}`); + }; + ws.onerror = () => { + console.error(`[HMR] Failed to start server at ${LOCAL_RELOAD_SOCKET_URL}`); + console.error('PLEASE MAKE SURE YOU ARE RUNNING `pnpm dev-server`'); + console.warn('Retrying in 5 seconds...'); + ws = null; + setTimeout(() => initializeWebSocket(), 5_000); + }; + } + } + + return { + name: 'watch-rebuild', + writeBundle() { + config.onStart?.(); + if (!ws) { + initializeWebSocket(); + return; + } + /** + * When the build is complete, send a message to the reload server. + * The reload server will send a message to the client to reload or refresh the extension. + */ + if (!ws) { + throw new Error('WebSocket is not initialized'); + } + ws.send(MessageInterpreter.send({ type: 'build_complete', id })); + }, + generateBundle(_options, bundle) { + for (const module of Object.values(bundle)) { + if (module.type === 'chunk') { + module.code = `(function() {let __HMR_ID = "${id}";\n` + hmrCode + '\n' + module.code + '})();'; + } + } + }, + }; +} diff --git a/packages/hmr/package.json b/packages/hmr/package.json new file mode 100644 index 000000000..d9f6c555a --- /dev/null +++ b/packages/hmr/package.json @@ -0,0 +1,36 @@ +{ + "name": "@chrome-extension-boilerplate/hmr", + "version": "0.0.1", + "description": "chrome extension hot module reload or refresh", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "clean": "rimraf ./dist && rimraf ./build && rimraf .turbo", + "build:tsc": "tsc -b tsconfig.build.json", + "build:rollup": "rollup --config rollup.config.mjs", + "build": "pnpm run build:tsc && pnpm run build:rollup", + "dev-server": "ts-node-esm lib/initReloadServer.ts", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "ws": "8.14.2" + }, + "devDependencies": { + + "esm": "^3.2.25", + "rollup": "4.3.0", + "ts-node": "^10.9.2", + "@rollup/plugin-sucrase": "^5.0.2", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@types/ws": "8.5.8" + } +} diff --git a/packages/hmr/rollup.config.mjs b/packages/hmr/rollup.config.mjs new file mode 100644 index 000000000..61771d421 --- /dev/null +++ b/packages/hmr/rollup.config.mjs @@ -0,0 +1,30 @@ +import sucrase from "@rollup/plugin-sucrase"; + +const plugins = [ + sucrase({ + exclude: ["node_modules/**"], + transforms: ["typescript"] + }), +]; + +/** + * @type {import("rollup").RollupOptions[]} + */ +export default [ + { + plugins, + input: "lib/injections/reload.ts", + output: { + format: "iife", + file: "build/injections/reload.js" + } + }, + { + plugins, + input: "lib/injections/refresh.ts", + output: { + format: "iife", + file: "build/injections/refresh.js" + } + } +]; diff --git a/packages/hmr/tsconfig.build.json b/packages/hmr/tsconfig.build.json new file mode 100644 index 000000000..efd7d4a2c --- /dev/null +++ b/packages/hmr/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/utils", + "compilerOptions": { + "outDir": "dist" + }, + "exclude": ["lib/initReloadServer.ts", "lib/injections/**/*"], + "include": ["lib", "index.ts"] +} diff --git a/packages/hmr/tsconfig.json b/packages/hmr/tsconfig.json new file mode 100644 index 000000000..34b2928cb --- /dev/null +++ b/packages/hmr/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/utils", + "compilerOptions": { + "outDir": "dist", + }, + "include": ["lib", "index.ts", "rollup.config.mjs"] +} diff --git a/packages/shared/index.ts b/packages/shared/index.ts new file mode 100644 index 000000000..13530a3a7 --- /dev/null +++ b/packages/shared/index.ts @@ -0,0 +1,3 @@ +export * from './lib/storages'; +export * from './lib/hooks'; +export * from './lib/hoc'; diff --git a/packages/shared/lib/hoc/index.ts b/packages/shared/lib/hoc/index.ts new file mode 100644 index 000000000..0ea60db89 --- /dev/null +++ b/packages/shared/lib/hoc/index.ts @@ -0,0 +1,4 @@ +import { withSuspense } from './withSuspense'; +import { withErrorBoundary } from './withErrorBoundary'; + +export { withSuspense, withErrorBoundary }; diff --git a/src/shared/hoc/withErrorBoundary.tsx b/packages/shared/lib/hoc/withErrorBoundary.tsx similarity index 73% rename from src/shared/hoc/withErrorBoundary.tsx rename to packages/shared/lib/hoc/withErrorBoundary.tsx index 06a08dd36..4b6f950b3 100644 --- a/src/shared/hoc/withErrorBoundary.tsx +++ b/packages/shared/lib/hoc/withErrorBoundary.tsx @@ -1,4 +1,5 @@ -import { Component, ComponentType, ReactElement } from 'react'; +import type { ComponentType, ErrorInfo, ReactElement } from 'react'; +import { Component } from 'react'; class ErrorBoundary extends Component< { @@ -15,7 +16,7 @@ class ErrorBoundary extends Component< return { hasError: true }; } - componentDidCatch(error, errorInfo) { + componentDidCatch(error: Error, errorInfo: ErrorInfo) { console.error(error, errorInfo); } @@ -28,7 +29,7 @@ class ErrorBoundary extends Component< } } -export default function withErrorBoundary>( +export function withErrorBoundary>( Component: ComponentType, ErrorComponent: ReactElement, ) { diff --git a/src/shared/hoc/withSuspense.tsx b/packages/shared/lib/hoc/withSuspense.tsx similarity index 80% rename from src/shared/hoc/withSuspense.tsx rename to packages/shared/lib/hoc/withSuspense.tsx index 1002dc31b..e46e50aaf 100644 --- a/src/shared/hoc/withSuspense.tsx +++ b/packages/shared/lib/hoc/withSuspense.tsx @@ -1,6 +1,6 @@ import { ComponentType, ReactElement, Suspense } from 'react'; -export default function withSuspense>( +export function withSuspense>( Component: ComponentType, SuspenseComponent: ReactElement, ) { diff --git a/packages/shared/lib/hooks/index.ts b/packages/shared/lib/hooks/index.ts new file mode 100644 index 000000000..f30a3f7ab --- /dev/null +++ b/packages/shared/lib/hooks/index.ts @@ -0,0 +1,3 @@ +import { useStorageSuspense } from './useStorageSuspense'; + +export { useStorageSuspense }; diff --git a/src/shared/hooks/useStorage.tsx b/packages/shared/lib/hooks/useStorageSuspense.tsx similarity index 69% rename from src/shared/hooks/useStorage.tsx rename to packages/shared/lib/hooks/useStorageSuspense.tsx index 0dde06863..d91d12e94 100644 --- a/src/shared/hooks/useStorage.tsx +++ b/packages/shared/lib/hooks/useStorageSuspense.tsx @@ -1,10 +1,11 @@ import { useSyncExternalStore } from 'react'; -import { BaseStorage } from '@src/shared/storages/base'; +import { BaseStorage } from '@lib/storages/base'; type WrappedPromise = ReturnType; -const storageMap: Map, WrappedPromise> = new Map(); +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const storageMap: Map, WrappedPromise> = new Map(); -export default function useStorage< +export function useStorageSuspense< Storage extends BaseStorage, Data = Storage extends BaseStorage ? Data : unknown, >(storage: Storage) { @@ -36,12 +37,13 @@ function wrapPromise(promise: Promise) { return { read() { - if (status === 'pending') { - throw suspender; - } else if (status === 'error') { - throw result; - } else if (status === 'success') { - return result; + switch (status) { + case 'pending': + throw suspender; + case 'error': + throw result; + default: + return result; } }, }; diff --git a/src/shared/storages/base.ts b/packages/shared/lib/storages/base.ts similarity index 98% rename from src/shared/storages/base.ts rename to packages/shared/lib/storages/base.ts index f5c1d50e6..df7c8022b 100644 --- a/src/shared/storages/base.ts +++ b/packages/shared/lib/storages/base.ts @@ -103,9 +103,9 @@ async function updateCache(valueOrUpdate: ValueOrUpdate, cache: D | null): if (isFunction(valueOrUpdate)) { // Check if the function returns a Promise if (returnsPromise(valueOrUpdate)) { - return await valueOrUpdate(cache); + return await valueOrUpdate(cache as D); } else { - return valueOrUpdate(cache); + return valueOrUpdate(cache as D); } } else { return valueOrUpdate; diff --git a/src/shared/storages/exampleThemeStorage.ts b/packages/shared/lib/storages/exampleThemeStorage.ts similarity index 72% rename from src/shared/storages/exampleThemeStorage.ts rename to packages/shared/lib/storages/exampleThemeStorage.ts index 832340c0b..662b031cb 100644 --- a/src/shared/storages/exampleThemeStorage.ts +++ b/packages/shared/lib/storages/exampleThemeStorage.ts @@ -1,4 +1,4 @@ -import { BaseStorage, createStorage, StorageType } from '@src/shared/storages/base'; +import { BaseStorage, createStorage, StorageType } from '@lib/storages/base'; type Theme = 'light' | 'dark'; @@ -11,7 +11,7 @@ const storage = createStorage('theme-storage-key', 'light', { liveUpdate: true, }); -const exampleThemeStorage: ThemeStorage = { +export const exampleThemeStorage: ThemeStorage = { ...storage, // TODO: extends your own methods toggle: async () => { @@ -20,5 +20,3 @@ const exampleThemeStorage: ThemeStorage = { }); }, }; - -export default exampleThemeStorage; diff --git a/packages/shared/lib/storages/index.ts b/packages/shared/lib/storages/index.ts new file mode 100644 index 000000000..876279099 --- /dev/null +++ b/packages/shared/lib/storages/index.ts @@ -0,0 +1,4 @@ +import { createStorage, StorageType, type BaseStorage, SessionAccessLevel } from './base'; +import { exampleThemeStorage } from './exampleThemeStorage'; + +export { exampleThemeStorage, createStorage, StorageType, SessionAccessLevel, BaseStorage }; diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 000000000..ea78c571b --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,27 @@ +{ + "name": "@chrome-extension-boilerplate/shared", + "version": "0.0.1", + "description": "chrome extension shared code", + "private": true, + "sideEffects": false, + "files": [ + "dist/**" + ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "tsup index.ts --format esm,cjs --dts --external react,chrome", + "dev": "tsc -w", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": {}, + "devDependencies": { + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "tsup": "8.0.2" + } +} diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 000000000..94ec0bcd4 --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/utils", + "compilerOptions": { + "outDir": "dist", + "jsx": "react-jsx", + "baseUrl": ".", + "paths": { + "@lib/*": [ + "lib/*" + ] + }, + "types": ["chrome"] + }, + "include": [ + "index.ts", + "lib" + ] +} diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts new file mode 100644 index 000000000..e7f198cf4 --- /dev/null +++ b/packages/shared/tsup.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + treeshake: true, + format: ['cjs', 'esm'], + dts: true, + external: ['chrome', 'react'], +}); diff --git a/packages/tailwind-config/package.json b/packages/tailwind-config/package.json new file mode 100644 index 000000000..a25989de6 --- /dev/null +++ b/packages/tailwind-config/package.json @@ -0,0 +1,7 @@ +{ + "name": "@chrome-extension-boilerplate/tailwindcss-config", + "version": "1.0.0", + "description": "Tailwind CSS configuration for boilerplate", + "main": "./tailwind.config.js", + "private": true +} diff --git a/packages/tailwind-config/tailwind.config.js b/packages/tailwind-config/tailwind.config.js new file mode 100644 index 000000000..ed08a2c9e --- /dev/null +++ b/packages/tailwind-config/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + /** shared theme configuration */ + theme: { + extend: {}, + }, + /** shared plugins configuration */ + plugins: [], +}; diff --git a/packages/tsconfig/app.json b/packages/tsconfig/app.json new file mode 100644 index 000000000..aa9d24d7e --- /dev/null +++ b/packages/tsconfig/app.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Chrome Extension App", + "extends": "./base.json" +} diff --git a/packages/tsconfig/base.json b/packages/tsconfig/base.json new file mode 100644 index 000000000..39ba59a9f --- /dev/null +++ b/packages/tsconfig/base.json @@ -0,0 +1,27 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Base", + "compilerOptions": { + "outDir": "dist", + "allowJs": true, + "noEmit": true, + "downlevelIteration": true, + "isolatedModules": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "noImplicitReturns": true, + "jsx": "react-jsx", + "lib": [ + "DOM", + "ESNext" + ] + } +} + diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json new file mode 100644 index 000000000..f0a4fe1e7 --- /dev/null +++ b/packages/tsconfig/package.json @@ -0,0 +1,6 @@ +{ + "name": "@chrome-extension-boilerplate/tsconfig", + "version": "1.0.0", + "description": "tsconfig for chrome extension", + "private": true +} diff --git a/packages/tsconfig/utils.json b/packages/tsconfig/utils.json new file mode 100644 index 000000000..fd59646cc --- /dev/null +++ b/packages/tsconfig/utils.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Chrome Extension Utils", + "extends": "./base.json", + "compilerOptions": { + "noEmit": false, + "declaration": true, + "module": "CommonJS", + "moduleResolution": "Node", + "target": "ES6", + "types": ["node"] + } +} diff --git a/pages/content-ui/package.json b/pages/content-ui/package.json new file mode 100644 index 000000000..ad20e7aeb --- /dev/null +++ b/pages/content-ui/package.json @@ -0,0 +1,30 @@ +{ + "name": "@chrome-extension-boilerplate/content-ui", + "version": "0.0.1", + "description": "chrome extension content ui", + "type": "module", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build:tailwindcss": "tailwindcss -i src/tailwind-input.css -o src/tailwind-output.css", + "build": "pnpm build:tailwindcss && pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tailwindcss-config": "workspace:*", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*" + } +} diff --git a/src/assets/img/logo.svg b/pages/content-ui/public/logo.svg similarity index 100% rename from src/assets/img/logo.svg rename to pages/content-ui/public/logo.svg diff --git a/pages/content-ui/src/app.tsx b/pages/content-ui/src/app.tsx new file mode 100644 index 000000000..4f783103a --- /dev/null +++ b/pages/content-ui/src/app.tsx @@ -0,0 +1,13 @@ +import { useEffect } from 'react'; + +export default function App() { + useEffect(() => { + console.log('content ui loaded'); + }, []); + + return ( +
+ Edit pages/content-ui/src/app.tsx and save to reload. +
+ ); +} diff --git a/pages/content-ui/src/index.tsx b/pages/content-ui/src/index.tsx new file mode 100644 index 000000000..dd7c409b0 --- /dev/null +++ b/pages/content-ui/src/index.tsx @@ -0,0 +1,23 @@ +import { createRoot } from 'react-dom/client'; +import App from '@src/app'; +// eslint-disable-next-line +// @ts-ignore +import tailwindcssOutput from '@src/tailwind-output.css?inline'; + +const root = document.createElement('div'); +root.id = 'chrome-extension-boilerplate-react-vite-content-view-root'; + +document.body.append(root); + +const rootIntoShadow = document.createElement('div'); +rootIntoShadow.id = 'shadow-root'; + +const shadowRoot = root.attachShadow({ mode: 'open' }); +shadowRoot.appendChild(rootIntoShadow); + +/** Inject styles into shadow dom */ +const styleElement = document.createElement('style'); +styleElement.innerHTML = tailwindcssOutput; +shadowRoot.appendChild(styleElement); + +createRoot(rootIntoShadow).render(); diff --git a/pages/content-ui/src/tailwind-input.css b/pages/content-ui/src/tailwind-input.css new file mode 100644 index 000000000..b5c61c956 --- /dev/null +++ b/pages/content-ui/src/tailwind-input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/pages/content-ui/src/tailwind-output.css b/pages/content-ui/src/tailwind-output.css new file mode 100644 index 000000000..235324524 --- /dev/null +++ b/pages/content-ui/src/tailwind-output.css @@ -0,0 +1,574 @@ +/* +! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +.flex { + display: flex; +} + +.gap-1 { + gap: 0.25rem; +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} diff --git a/pages/content-ui/tailwind.config.js b/pages/content-ui/tailwind.config.js new file mode 100644 index 000000000..b072d842b --- /dev/null +++ b/pages/content-ui/tailwind.config.js @@ -0,0 +1,7 @@ +const baseConfig = require('@chrome-extension-boilerplate/tailwindcss-config'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + ...baseConfig, + content: ['src/**/*.{ts,tsx}'], +}; diff --git a/pages/content-ui/tsconfig.json b/pages/content-ui/tsconfig.json new file mode 100644 index 000000000..0fe0821ef --- /dev/null +++ b/pages/content-ui/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": [ + "src/*" + ] + }, + "jsx": "react-jsx", + "types": [ + "chrome" + ] + }, + "include": [ + "src" + ] +} diff --git a/pages/content-ui/vite.config.ts b/pages/content-ui/vite.config.ts new file mode 100644 index 000000000..ab9502885 --- /dev/null +++ b/pages/content-ui/vite.config.ts @@ -0,0 +1,49 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import { resolve } from 'path'; +import { makeEntryPointPlugin, watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; +import * as child_process from 'child_process'; + +const rootDir = resolve(__dirname); +const srcDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +function buildTailwindCss() { + child_process.execSync('pnpm build:tailwindcss', { stdio: 'inherit' }); +} + +export default defineConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + base: '', + plugins: [ + react(), + isDev && watchRebuildPlugin({ refresh: true, onStart: buildTailwindCss }), + isDev && makeEntryPointPlugin(), + ], + publicDir: resolve(rootDir, 'public'), + build: { + lib: { + entry: resolve(srcDir, 'index.tsx'), + name: 'contentUI', + formats: ['iife'], + fileName: 'index', + }, + outDir: resolve(rootDir, '..', '..', 'dist', 'content-ui'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/pages/content/lib/index.ts b/pages/content/lib/index.ts new file mode 100644 index 000000000..ea9b12b05 --- /dev/null +++ b/pages/content/lib/index.ts @@ -0,0 +1,5 @@ +/** + * HMR is not working here. Browser use cached version of the file. + * So we need to import the injected file dynamically. + */ +import '@lib/injected'; diff --git a/pages/content/lib/injected.ts b/pages/content/lib/injected.ts new file mode 100644 index 000000000..596a91705 --- /dev/null +++ b/pages/content/lib/injected.ts @@ -0,0 +1,5 @@ +import { toggleTheme } from '@lib/toggleTheme'; + +console.log('content script loaded'); + +void toggleTheme(); diff --git a/pages/content/lib/toggleTheme.ts b/pages/content/lib/toggleTheme.ts new file mode 100644 index 000000000..d582eda8b --- /dev/null +++ b/pages/content/lib/toggleTheme.ts @@ -0,0 +1,7 @@ +import { exampleThemeStorage } from '@chrome-extension-boilerplate/shared'; + +export async function toggleTheme() { + console.log('initial theme:', await exampleThemeStorage.get()); + await exampleThemeStorage.toggle(); + console.log('toggled theme:', await exampleThemeStorage.get()); +} diff --git a/pages/content/package.json b/pages/content/package.json new file mode 100644 index 000000000..477ddeb68 --- /dev/null +++ b/pages/content/package.json @@ -0,0 +1,27 @@ +{ + "name": "@chrome-extension-boilerplate/content-script", + "version": "0.0.1", + "description": "chrome extension content script", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*" + } +} diff --git a/pages/content/public/logo.svg b/pages/content/public/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/content/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pages/content/tsconfig.json b/pages/content/tsconfig.json new file mode 100644 index 000000000..5c62c2483 --- /dev/null +++ b/pages/content/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@lib/*": [ + "lib/*" + ] + }, + "types": [ + "chrome" + ] + }, + "include": [ + "lib" + ] +} diff --git a/pages/content/vite.config.ts b/pages/content/vite.config.ts new file mode 100644 index 000000000..f968e2394 --- /dev/null +++ b/pages/content/vite.config.ts @@ -0,0 +1,39 @@ +import { defineConfig } from 'vite'; +import { resolve } from 'path'; +import { makeEntryPointPlugin, watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const libDir = resolve(rootDir, 'lib'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +export default defineConfig({ + resolve: { + alias: { + '@lib': libDir, + }, + }, + plugins: [isDev && watchRebuildPlugin({ refresh: true }), isDev && makeEntryPointPlugin()], + publicDir: resolve(rootDir, 'public'), + build: { + lib: { + formats: ['iife'], + entry: resolve(__dirname, 'lib/index.ts'), + name: 'ContentScript', + fileName: 'index', + }, + outDir: resolve(rootDir, '..', '..', 'dist', 'content'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + modulePreload: true, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/src/pages/panel/index.html b/pages/devtools-panel/index.html similarity index 68% rename from src/pages/panel/index.html rename to pages/devtools-panel/index.html index 1ac424756..8402fc103 100644 --- a/src/pages/panel/index.html +++ b/pages/devtools-panel/index.html @@ -1,4 +1,4 @@ - + @@ -7,6 +7,6 @@
- + diff --git a/pages/devtools-panel/package.json b/pages/devtools-panel/package.json new file mode 100644 index 000000000..82eed325c --- /dev/null +++ b/pages/devtools-panel/package.json @@ -0,0 +1,28 @@ +{ + "name": "@chrome-extension-boilerplate/devtools-panel", + "version": "0.0.1", + "description": "chrome extension devtools panel", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tailwindcss-config": "workspace:*", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*" + } +} diff --git a/pages/devtools-panel/postcss.config.js b/pages/devtools-panel/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/pages/devtools-panel/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/pages/devtools-panel/public/logo.svg b/pages/devtools-panel/public/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/devtools-panel/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pages/devtools-panel/src/Panel.css b/pages/devtools-panel/src/Panel.css new file mode 100644 index 000000000..a0c035b81 --- /dev/null +++ b/pages/devtools-panel/src/Panel.css @@ -0,0 +1,42 @@ +.App { + text-align: center; + height: 100vh; + width: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.App-logo { + height: 30vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/pages/devtools-panel/src/Panel.tsx b/pages/devtools-panel/src/Panel.tsx new file mode 100644 index 000000000..e74822389 --- /dev/null +++ b/pages/devtools-panel/src/Panel.tsx @@ -0,0 +1,54 @@ +import '@src/Panel.css'; +import { + exampleThemeStorage, + useStorageSuspense, + withErrorBoundary, + withSuspense, +} from '@chrome-extension-boilerplate/shared'; +import { ComponentPropsWithoutRef } from 'react'; + +const Panel = () => { + const theme = useStorageSuspense(exampleThemeStorage); + + return ( +
+ ); +}; + +const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { + const theme = useStorageSuspense(exampleThemeStorage); + return ( + + ); +}; + +export default withErrorBoundary(withSuspense(Panel,
Loading ...
),
Error Occur
); diff --git a/src/pages/sidepanel/index.css b/pages/devtools-panel/src/index.css similarity index 86% rename from src/pages/sidepanel/index.css rename to pages/devtools-panel/src/index.css index da17592d1..392b3d261 100644 --- a/src/pages/sidepanel/index.css +++ b/pages/devtools-panel/src/index.css @@ -1,6 +1,8 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + body { - width: 100dvw; - height: 100dvh; margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; diff --git a/src/pages/panel/index.tsx b/pages/devtools-panel/src/index.tsx similarity index 59% rename from src/pages/panel/index.tsx rename to pages/devtools-panel/src/index.tsx index c94f90aef..065021dbf 100644 --- a/src/pages/panel/index.tsx +++ b/pages/devtools-panel/src/index.tsx @@ -1,10 +1,6 @@ -import React from 'react'; import { createRoot } from 'react-dom/client'; -import Panel from '@pages/panel/Panel'; -import '@pages/panel/index.css'; -import refreshOnUpdate from 'virtual:reload-on-update-in-view'; - -refreshOnUpdate('pages/panel'); +import '@src/index.css'; +import Panel from '@src/Panel'; function init() { const appContainer = document.querySelector('#app-container'); @@ -12,6 +8,7 @@ function init() { throw new Error('Can not find #app-container'); } const root = createRoot(appContainer); + root.render(); } diff --git a/pages/devtools-panel/src/logo.svg b/pages/devtools-panel/src/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/devtools-panel/src/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pages/devtools-panel/tailwind.config.js b/pages/devtools-panel/tailwind.config.js new file mode 100644 index 000000000..a8d71f62f --- /dev/null +++ b/pages/devtools-panel/tailwind.config.js @@ -0,0 +1,7 @@ +const baseConfig = require('@chrome-extension-boilerplate/tailwindcss-config'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + ...baseConfig, + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], +}; diff --git a/pages/devtools-panel/tsconfig.json b/pages/devtools-panel/tsconfig.json new file mode 100644 index 000000000..0fe0821ef --- /dev/null +++ b/pages/devtools-panel/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": [ + "src/*" + ] + }, + "jsx": "react-jsx", + "types": [ + "chrome" + ] + }, + "include": [ + "src" + ] +} diff --git a/pages/devtools-panel/vite.config.ts b/pages/devtools-panel/vite.config.ts new file mode 100644 index 000000000..96c245237 --- /dev/null +++ b/pages/devtools-panel/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import { resolve } from 'path'; +import { watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const srcDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +export default defineConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + base: '', + plugins: [react(), isDev && watchRebuildPlugin({ refresh: true })], + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'devtools-panel'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/src/pages/devtools/index.html b/pages/devtools/index.html similarity index 61% rename from src/pages/devtools/index.html rename to pages/devtools/index.html index 7463c2830..80ebceaeb 100644 --- a/src/pages/devtools/index.html +++ b/pages/devtools/index.html @@ -1,10 +1,11 @@ - + Devtools + - + diff --git a/pages/devtools/package.json b/pages/devtools/package.json new file mode 100644 index 000000000..bf4023e77 --- /dev/null +++ b/pages/devtools/package.json @@ -0,0 +1,27 @@ +{ + "name": "@chrome-extension-boilerplate/devtools", + "version": "0.0.1", + "description": "chrome extension devtools", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*" + } +} diff --git a/pages/devtools/public/logo.svg b/pages/devtools/public/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/devtools/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pages/devtools/src/index.ts b/pages/devtools/src/index.ts new file mode 100644 index 000000000..043063f6d --- /dev/null +++ b/pages/devtools/src/index.ts @@ -0,0 +1,6 @@ +try { + console.log("Edit 'pages/devtools/src/index.ts' and save to reload."); + chrome.devtools.panels.create('Dev Tools', 'icon-34.png', 'devtools-panel/index.html'); +} catch (e) { + console.error(e); +} diff --git a/pages/devtools/tsconfig.json b/pages/devtools/tsconfig.json new file mode 100644 index 000000000..0fe0821ef --- /dev/null +++ b/pages/devtools/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": [ + "src/*" + ] + }, + "jsx": "react-jsx", + "types": [ + "chrome" + ] + }, + "include": [ + "src" + ] +} diff --git a/pages/devtools/vite.config.ts b/pages/devtools/vite.config.ts new file mode 100644 index 000000000..aafda0c70 --- /dev/null +++ b/pages/devtools/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import { resolve } from 'path'; +import { watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const srcDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +export default defineConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + base: '', + plugins: [react(), isDev && watchRebuildPlugin({ refresh: true })], + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'devtools'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/src/pages/newtab/index.html b/pages/newtab/index.html similarity index 67% rename from src/pages/newtab/index.html rename to pages/newtab/index.html index d01915b2e..1c75c34d1 100644 --- a/src/pages/newtab/index.html +++ b/pages/newtab/index.html @@ -1,4 +1,4 @@ - + @@ -7,6 +7,6 @@
- + diff --git a/pages/newtab/package.json b/pages/newtab/package.json new file mode 100644 index 000000000..4b70a8c98 --- /dev/null +++ b/pages/newtab/package.json @@ -0,0 +1,29 @@ +{ + "name": "@chrome-extension-boilerplate/new-tab", + "version": "0.0.1", + "description": "chrome extension new tab", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tailwindcss-config": "workspace:*", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*", + "sass": "1.74.1" + } +} diff --git a/pages/newtab/postcss.config.js b/pages/newtab/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/pages/newtab/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/pages/newtab/public/logo.svg b/pages/newtab/public/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/newtab/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pages/newtab/src/Newtab.css b/pages/newtab/src/Newtab.css new file mode 100644 index 000000000..614b3dea3 --- /dev/null +++ b/pages/newtab/src/Newtab.css @@ -0,0 +1,37 @@ +.App { + text-align: center; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/src/pages/newtab/Newtab.scss b/pages/newtab/src/Newtab.scss similarity index 100% rename from src/pages/newtab/Newtab.scss rename to pages/newtab/src/Newtab.scss diff --git a/pages/newtab/src/Newtab.tsx b/pages/newtab/src/Newtab.tsx new file mode 100644 index 000000000..a12db1509 --- /dev/null +++ b/pages/newtab/src/Newtab.tsx @@ -0,0 +1,52 @@ +import '@src/Newtab.css'; +import '@src/Newtab.scss'; +import { + exampleThemeStorage, + useStorageSuspense, + withErrorBoundary, + withSuspense, +} from '@chrome-extension-boilerplate/shared'; +import { ComponentPropsWithoutRef } from 'react'; + +const Newtab = () => { + const theme = useStorageSuspense(exampleThemeStorage); + + return ( +
+
+ logo +

+ Edit pages/newtab/src/Newtab.tsx and save to reload. +

+ + Learn React + +
The color of this paragraph is defined using SASS.
+ Toggle theme (tailwind) +
+
+ ); +}; + +const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { + const theme = useStorageSuspense(exampleThemeStorage); + return ( + + ); +}; + +export default withErrorBoundary(withSuspense(Newtab,
Loading ...
),
Error Occur
); diff --git a/src/pages/newtab/index.css b/pages/newtab/src/index.css similarity index 85% rename from src/pages/newtab/index.css rename to pages/newtab/src/index.css index 7323ae85c..5138222b0 100644 --- a/src/pages/newtab/index.css +++ b/pages/newtab/src/index.css @@ -1,3 +1,7 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', diff --git a/src/pages/newtab/index.tsx b/pages/newtab/src/index.tsx similarity index 58% rename from src/pages/newtab/index.tsx rename to pages/newtab/src/index.tsx index 40bc00b5f..90734e493 100644 --- a/src/pages/newtab/index.tsx +++ b/pages/newtab/src/index.tsx @@ -1,10 +1,6 @@ -import React from 'react'; import { createRoot } from 'react-dom/client'; -import Newtab from '@pages/newtab/Newtab'; -import '@pages/newtab/index.css'; -import refreshOnUpdate from 'virtual:reload-on-update-in-view'; - -refreshOnUpdate('pages/newtab'); +import '@src/index.css'; +import Newtab from '@src/Newtab'; function init() { const appContainer = document.querySelector('#app-container'); diff --git a/pages/newtab/tailwind.config.js b/pages/newtab/tailwind.config.js new file mode 100644 index 000000000..a8d71f62f --- /dev/null +++ b/pages/newtab/tailwind.config.js @@ -0,0 +1,7 @@ +const baseConfig = require('@chrome-extension-boilerplate/tailwindcss-config'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + ...baseConfig, + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], +}; diff --git a/pages/newtab/tsconfig.json b/pages/newtab/tsconfig.json new file mode 100644 index 000000000..0fe0821ef --- /dev/null +++ b/pages/newtab/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": [ + "src/*" + ] + }, + "jsx": "react-jsx", + "types": [ + "chrome" + ] + }, + "include": [ + "src" + ] +} diff --git a/pages/newtab/vite.config.ts b/pages/newtab/vite.config.ts new file mode 100644 index 000000000..3f456ef56 --- /dev/null +++ b/pages/newtab/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import { resolve } from 'path'; +import { watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const srcDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +export default defineConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + base: '', + plugins: [react(), isDev && watchRebuildPlugin({ refresh: true })], + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'newtab'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/pages/options/index.html b/pages/options/index.html new file mode 100644 index 000000000..65e1fdde6 --- /dev/null +++ b/pages/options/index.html @@ -0,0 +1,12 @@ + + + + + Options + + + +
+ + + diff --git a/pages/options/package.json b/pages/options/package.json new file mode 100644 index 000000000..ed9d64bef --- /dev/null +++ b/pages/options/package.json @@ -0,0 +1,28 @@ +{ + "name": "@chrome-extension-boilerplate/options", + "version": "0.0.1", + "description": "chrome extension options", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tailwindcss-config": "workspace:*", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*" + } +} diff --git a/pages/options/postcss.config.js b/pages/options/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/pages/options/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/pages/options/public/logo.svg b/pages/options/public/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/options/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pages/options/src/Options.css b/pages/options/src/Options.css new file mode 100644 index 000000000..38f36070c --- /dev/null +++ b/pages/options/src/Options.css @@ -0,0 +1,39 @@ +#app-container { + width: 100vw; + height: 100vh; +} + +.App { + text-align: center; +} + +.App-logo { + height: 20vmin; + pointer-events: none; +} + +.App-container { + width: 100vw; + height: 100vh; + font-size: 2rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/pages/options/src/Options.tsx b/pages/options/src/Options.tsx new file mode 100644 index 000000000..a9d56e0cc --- /dev/null +++ b/pages/options/src/Options.tsx @@ -0,0 +1,43 @@ +import '@src/Options.css'; +import { + exampleThemeStorage, + useStorageSuspense, + withErrorBoundary, + withSuspense, +} from '@chrome-extension-boilerplate/shared'; +import { ComponentPropsWithoutRef } from 'react'; + +const Options = () => { + const theme = useStorageSuspense(exampleThemeStorage); + + return ( +
+ logo + Options + Edit pages/options/src/Options.tsx and save to reload. + Toggle theme (tailwind) +
+ ); +}; + +const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { + const theme = useStorageSuspense(exampleThemeStorage); + return ( + + ); +}; + +export default withErrorBoundary(withSuspense(Options,
Loading ...
),
Error Occur
); diff --git a/pages/options/src/index.css b/pages/options/src/index.css new file mode 100644 index 000000000..d46c89761 --- /dev/null +++ b/pages/options/src/index.css @@ -0,0 +1,11 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', + 'Droid Sans', 'Helvetica Neue', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/src/pages/options/index.html b/pages/options/src/index.html similarity index 100% rename from src/pages/options/index.html rename to pages/options/src/index.html diff --git a/src/pages/options/index.tsx b/pages/options/src/index.tsx similarity index 58% rename from src/pages/options/index.tsx rename to pages/options/src/index.tsx index add056bb6..1c47b761b 100644 --- a/src/pages/options/index.tsx +++ b/pages/options/src/index.tsx @@ -1,10 +1,6 @@ -import React from 'react'; import { createRoot } from 'react-dom/client'; -import Options from '@pages/options/Options'; -import '@pages/options/index.css'; -import refreshOnUpdate from 'virtual:reload-on-update-in-view'; - -refreshOnUpdate('pages/options'); +import '@src/index.css'; +import Options from '@src/Options'; function init() { const appContainer = document.querySelector('#app-container'); diff --git a/pages/options/tailwind.config.js b/pages/options/tailwind.config.js new file mode 100644 index 000000000..a8d71f62f --- /dev/null +++ b/pages/options/tailwind.config.js @@ -0,0 +1,7 @@ +const baseConfig = require('@chrome-extension-boilerplate/tailwindcss-config'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + ...baseConfig, + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], +}; diff --git a/pages/options/tsconfig.json b/pages/options/tsconfig.json new file mode 100644 index 000000000..0fe0821ef --- /dev/null +++ b/pages/options/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": [ + "src/*" + ] + }, + "jsx": "react-jsx", + "types": [ + "chrome" + ] + }, + "include": [ + "src" + ] +} diff --git a/pages/options/vite.config.ts b/pages/options/vite.config.ts new file mode 100644 index 000000000..2ab58707d --- /dev/null +++ b/pages/options/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import { resolve } from 'path'; +import { watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const srcDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +export default defineConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + base: '', + plugins: [react(), isDev && watchRebuildPlugin({ refresh: true })], + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'options'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/src/pages/sidepanel/index.html b/pages/popup/index.html similarity index 56% rename from src/pages/sidepanel/index.html rename to pages/popup/index.html index 0fb38bc2f..f75fabfa8 100644 --- a/src/pages/sidepanel/index.html +++ b/pages/popup/index.html @@ -1,12 +1,12 @@ - + - Side Panel + Popup
- + diff --git a/pages/popup/package.json b/pages/popup/package.json new file mode 100644 index 000000000..a3265c399 --- /dev/null +++ b/pages/popup/package.json @@ -0,0 +1,28 @@ +{ + "name": "@chrome-extension-boilerplate/popup", + "version": "0.0.1", + "description": "chrome extension popup", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tailwindcss-config": "workspace:*", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*" + } +} diff --git a/pages/popup/postcss.config.js b/pages/popup/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/pages/popup/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/pages/popup/public/logo.svg b/pages/popup/public/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/popup/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/pages/popup/Popup.css b/pages/popup/src/Popup.css similarity index 100% rename from src/pages/popup/Popup.css rename to pages/popup/src/Popup.css diff --git a/pages/popup/src/Popup.tsx b/pages/popup/src/Popup.tsx new file mode 100644 index 000000000..e62f2c133 --- /dev/null +++ b/pages/popup/src/Popup.tsx @@ -0,0 +1,55 @@ +import '@src/Popup.css'; +import { + exampleThemeStorage, + useStorageSuspense, + withErrorBoundary, + withSuspense, +} from '@chrome-extension-boilerplate/shared'; +import { ComponentPropsWithoutRef } from 'react'; + +const Popup = () => { + const theme = useStorageSuspense(exampleThemeStorage); + + return ( +
+
+ logo + +

+ Edit pages/popup/src/Popup.tsx and save to reload. +

+ + Learn React! + + Toggle theme (tailwind) +
+
+ ); +}; + +const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { + const theme = useStorageSuspense(exampleThemeStorage); + return ( + + ); +}; + +export default withErrorBoundary(withSuspense(Popup,
Loading ...
),
Error Occur
); diff --git a/src/pages/popup/index.css b/pages/popup/src/index.css similarity index 87% rename from src/pages/popup/index.css rename to pages/popup/src/index.css index c2edc2e8a..11e8d16cf 100644 --- a/src/pages/popup/index.css +++ b/pages/popup/src/index.css @@ -1,3 +1,7 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + body { width: 300px; height: 260px; diff --git a/src/pages/popup/index.tsx b/pages/popup/src/index.tsx similarity index 59% rename from src/pages/popup/index.tsx rename to pages/popup/src/index.tsx index 31d7cf34a..7859d2b38 100644 --- a/src/pages/popup/index.tsx +++ b/pages/popup/src/index.tsx @@ -1,10 +1,6 @@ -import React from 'react'; import { createRoot } from 'react-dom/client'; -import '@pages/popup/index.css'; -import Popup from '@pages/popup/Popup'; -import refreshOnUpdate from 'virtual:reload-on-update-in-view'; - -refreshOnUpdate('pages/popup'); +import '@src/index.css'; +import Popup from '@src/Popup'; function init() { const appContainer = document.querySelector('#app-container'); @@ -12,6 +8,7 @@ function init() { throw new Error('Can not find #app-container'); } const root = createRoot(appContainer); + root.render(); } diff --git a/pages/popup/tailwind.config.js b/pages/popup/tailwind.config.js new file mode 100644 index 000000000..a8d71f62f --- /dev/null +++ b/pages/popup/tailwind.config.js @@ -0,0 +1,7 @@ +const baseConfig = require('@chrome-extension-boilerplate/tailwindcss-config'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + ...baseConfig, + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], +}; diff --git a/pages/popup/tsconfig.json b/pages/popup/tsconfig.json new file mode 100644 index 000000000..0fe0821ef --- /dev/null +++ b/pages/popup/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": [ + "src/*" + ] + }, + "jsx": "react-jsx", + "types": [ + "chrome" + ] + }, + "include": [ + "src" + ] +} diff --git a/pages/popup/vite.config.ts b/pages/popup/vite.config.ts new file mode 100644 index 000000000..28779e70d --- /dev/null +++ b/pages/popup/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import { resolve } from 'path'; +import { watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const srcDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +export default defineConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + base: '', + plugins: [react(), isDev && watchRebuildPlugin({ refresh: true })], + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'popup'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/pages/sidepanel/index.html b/pages/sidepanel/index.html new file mode 100644 index 000000000..38db15435 --- /dev/null +++ b/pages/sidepanel/index.html @@ -0,0 +1,12 @@ + + + + + SidePanel + + + +
+ + + diff --git a/pages/sidepanel/package.json b/pages/sidepanel/package.json new file mode 100644 index 000000000..b3445f9f0 --- /dev/null +++ b/pages/sidepanel/package.json @@ -0,0 +1,28 @@ +{ + "name": "@chrome-extension-boilerplate/sidepanel", + "version": "0.0.1", + "description": "chrome extension sidepanel", + "private": true, + "sideEffects": true, + "files": [ + "dist/**" + ], + "scripts": { + "clean": "rimraf ./dist && rimraf .turbo", + "build": "pnpm run clean && tsc --noEmit && vite build", + "build:watch": "cross-env __DEV__=true vite build -w --mode development", + "dev": "pnpm build:watch", + "lint": "eslint . --ext .ts,.tsx", + "lint:fix": "pnpm lint --fix", + "prettier": "prettier . --write", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@chrome-extension-boilerplate/shared": "workspace:*" + }, + "devDependencies": { + "@chrome-extension-boilerplate/tailwindcss-config": "workspace:*", + "@chrome-extension-boilerplate/tsconfig": "workspace:*", + "@chrome-extension-boilerplate/hmr": "workspace:*" + } +} diff --git a/pages/sidepanel/postcss.config.js b/pages/sidepanel/postcss.config.js new file mode 100644 index 000000000..33ad091d2 --- /dev/null +++ b/pages/sidepanel/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/pages/sidepanel/public/logo.svg b/pages/sidepanel/public/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/pages/sidepanel/public/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/pages/sidepanel/SidePanel.css b/pages/sidepanel/src/SidePanel.css similarity index 100% rename from src/pages/sidepanel/SidePanel.css rename to pages/sidepanel/src/SidePanel.css diff --git a/pages/sidepanel/src/SidePanel.tsx b/pages/sidepanel/src/SidePanel.tsx new file mode 100644 index 000000000..10196f0fb --- /dev/null +++ b/pages/sidepanel/src/SidePanel.tsx @@ -0,0 +1,55 @@ +import '@src/SidePanel.css'; +import { + exampleThemeStorage, + useStorageSuspense, + withErrorBoundary, + withSuspense, +} from '@chrome-extension-boilerplate/shared'; +import { ComponentPropsWithoutRef } from 'react'; + +const SidePanel = () => { + const theme = useStorageSuspense(exampleThemeStorage); + + return ( +
+
+ logo +

+ Edit pages/sidepanel/src/SidePanel.tsx and save to reload. +

+ + Learn React + +
The color of this paragraph is defined using SASS.
+ Toggle theme (tailwind) +
+
+ ); +}; + +const ToggleButton = (props: ComponentPropsWithoutRef<'button'>) => { + const theme = useStorageSuspense(exampleThemeStorage); + return ( + + ); +}; + +export default withErrorBoundary(withSuspense(SidePanel,
Loading ...
),
Error Occur
); diff --git a/pages/sidepanel/src/index.css b/pages/sidepanel/src/index.css new file mode 100644 index 000000000..b5c61c956 --- /dev/null +++ b/pages/sidepanel/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/pages/popup/index.html b/pages/sidepanel/src/index.html similarity index 88% rename from src/pages/popup/index.html rename to pages/sidepanel/src/index.html index 1130bcb8e..f2c7d4d58 100644 --- a/src/pages/popup/index.html +++ b/pages/sidepanel/src/index.html @@ -2,7 +2,7 @@ - Popup + Options diff --git a/src/pages/sidepanel/index.tsx b/pages/sidepanel/src/index.tsx similarity index 57% rename from src/pages/sidepanel/index.tsx rename to pages/sidepanel/src/index.tsx index 9dcbe35e6..992622dd0 100644 --- a/src/pages/sidepanel/index.tsx +++ b/pages/sidepanel/src/index.tsx @@ -1,10 +1,6 @@ -import React from 'react'; import { createRoot } from 'react-dom/client'; -import '@pages/sidepanel/index.css'; -import refreshOnUpdate from 'virtual:reload-on-update-in-view'; -import SidePanel from '@pages/sidepanel/SidePanel'; - -refreshOnUpdate('pages/sidepanel'); +import '@src/index.css'; +import SidePanel from '@src/SidePanel'; function init() { const appContainer = document.querySelector('#app-container'); diff --git a/pages/sidepanel/tailwind.config.js b/pages/sidepanel/tailwind.config.js new file mode 100644 index 000000000..a8d71f62f --- /dev/null +++ b/pages/sidepanel/tailwind.config.js @@ -0,0 +1,7 @@ +const baseConfig = require('@chrome-extension-boilerplate/tailwindcss-config'); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + ...baseConfig, + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], +}; diff --git a/pages/sidepanel/tsconfig.json b/pages/sidepanel/tsconfig.json new file mode 100644 index 000000000..0fe0821ef --- /dev/null +++ b/pages/sidepanel/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@chrome-extension-boilerplate/tsconfig/base", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": [ + "src/*" + ] + }, + "jsx": "react-jsx", + "types": [ + "chrome" + ] + }, + "include": [ + "src" + ] +} diff --git a/pages/sidepanel/vite.config.ts b/pages/sidepanel/vite.config.ts new file mode 100644 index 000000000..769227a1d --- /dev/null +++ b/pages/sidepanel/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; +import { resolve } from 'path'; +import { watchRebuildPlugin } from '@chrome-extension-boilerplate/hmr'; + +const rootDir = resolve(__dirname); +const srcDir = resolve(rootDir, 'src'); + +const isDev = process.env.__DEV__ === 'true'; +const isProduction = !isDev; + +export default defineConfig({ + resolve: { + alias: { + '@src': srcDir, + }, + }, + base: '', + plugins: [react(), isDev && watchRebuildPlugin({ refresh: true })], + publicDir: resolve(rootDir, 'public'), + build: { + outDir: resolve(rootDir, '..', '..', 'dist', 'sidepanel'), + sourcemap: isDev, + minify: isProduction, + reportCompressedSize: isProduction, + emptyOutDir: !isDev, + rollupOptions: { + external: ['chrome'], + }, + }, + define: { + 'process.env.NODE_ENV': isDev ? `"development"` : `"production"`, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a85cfc08..c4328dae0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,135 +4,295 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - construct-style-sheets-polyfill: - specifier: 3.1.0 - version: 3.1.0 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - webextension-polyfill: - specifier: 0.10.0 - version: 0.10.0 - -devDependencies: - '@commitlint/cli': - specifier: 18.4.4 - version: 18.4.4(@types/node@20.8.10)(typescript@5.2.2) - '@commitlint/config-conventional': - specifier: 18.1.0 - version: 18.1.0 - '@rollup/plugin-sucrase': - specifier: ^5.0.2 - version: 5.0.2(rollup@4.3.0) - '@rollup/plugin-typescript': - specifier: 11.1.6 - version: 11.1.6(rollup@4.3.0)(tslib@2.6.2)(typescript@5.2.2) - '@testing-library/react': - specifier: 14.0.0 - version: 14.0.0(react-dom@18.2.0)(react@18.2.0) - '@types/chrome': - specifier: 0.0.263 - version: 0.0.263 - '@types/node': - specifier: 20.8.10 - version: 20.8.10 - '@types/react': - specifier: 18.2.37 - version: 18.2.37 - '@types/react-dom': - specifier: 18.2.18 - version: 18.2.18 - '@types/ws': - specifier: 8.5.8 - version: 8.5.8 - '@typescript-eslint/eslint-plugin': - specifier: 6.10.0 - version: 6.10.0(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.2.2) - '@typescript-eslint/parser': - specifier: 6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.2.2) - '@vitejs/plugin-react': - specifier: 4.2.0 - version: 4.2.0(vite@5.0.12) - chokidar: - specifier: 3.5.3 - version: 3.5.3 - cross-env: - specifier: 7.0.3 - version: 7.0.3 - eslint: - specifier: 8.56.0 - version: 8.56.0 - eslint-config-airbnb-typescript: - specifier: 17.1.0 - version: 17.1.0(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.18.1)(eslint-plugin-import@2.29.1)(eslint@8.56.0) - eslint-config-prettier: - specifier: 9.0.0 - version: 9.0.0(eslint@8.56.0) - eslint-plugin-import: - specifier: 2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0) - eslint-plugin-jsx-a11y: - specifier: 6.8.0 - version: 6.8.0(eslint@8.56.0) - eslint-plugin-prettier: - specifier: 5.1.3 - version: 5.1.3(eslint-config-prettier@9.0.0)(eslint@8.56.0)(prettier@3.2.5) - eslint-plugin-react: - specifier: 7.33.2 - version: 7.33.2(eslint@8.56.0) - eslint-plugin-react-hooks: - specifier: 4.6.0 - version: 4.6.0(eslint@8.56.0) - fs-extra: - specifier: 11.1.1 - version: 11.1.1 - husky: - specifier: 8.0.3 - version: 8.0.3 - jsdom: - specifier: ^22.1.0 - version: 22.1.0 - lint-staged: - specifier: 15.2.0 - version: 15.2.0 - magic-string: - specifier: ^0.30.6 - version: 0.30.6 - npm-run-all: - specifier: 4.1.5 - version: 4.1.5 - prettier: - specifier: 3.2.5 - version: 3.2.5 - rollup: - specifier: 4.3.0 - version: 4.3.0 - sass: - specifier: 1.72.0 - version: 1.72.0 - ts-loader: - specifier: 9.5.0 - version: 9.5.0(typescript@5.2.2)(webpack@5.89.0) - tslib: - specifier: 2.6.2 - version: 2.6.2 - typescript: - specifier: 5.2.2 - version: 5.2.2 - vite: - specifier: 5.0.12 - version: 5.0.12(@types/node@20.8.10)(sass@1.72.0) - vitest: - specifier: ^1.2.2 - version: 1.2.2(@types/node@20.8.10)(jsdom@22.1.0)(sass@1.72.0) - ws: - specifier: 8.14.2 - version: 8.14.2 +importers: + + .: + dependencies: + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + devDependencies: + '@types/chrome': + specifier: 0.0.263 + version: 0.0.263 + '@types/node': + specifier: 20.8.10 + version: 20.8.10 + '@types/react': + specifier: 18.2.37 + version: 18.2.37 + '@types/react-dom': + specifier: 18.2.18 + version: 18.2.18 + '@typescript-eslint/eslint-plugin': + specifier: 6.10.0 + version: 6.10.0(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.2.2) + '@typescript-eslint/parser': + specifier: 6.18.1 + version: 6.18.1(eslint@8.56.0)(typescript@5.2.2) + '@vitejs/plugin-react-swc': + specifier: ^3.6.0 + version: 3.6.0(vite@5.2.11) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.38) + cross-env: + specifier: 7.0.3 + version: 7.0.3 + eslint: + specifier: 8.56.0 + version: 8.56.0 + eslint-config-airbnb-typescript: + specifier: 17.1.0 + version: 17.1.0(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.18.1)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-config-prettier: + specifier: 9.0.0 + version: 9.0.0(eslint@8.56.0) + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0) + eslint-plugin-jsx-a11y: + specifier: 6.8.0 + version: 6.8.0(eslint@8.56.0) + eslint-plugin-prettier: + specifier: 5.1.3 + version: 5.1.3(eslint-config-prettier@9.0.0)(eslint@8.56.0)(prettier@3.2.5) + eslint-plugin-react: + specifier: 7.33.2 + version: 7.33.2(eslint@8.56.0) + eslint-plugin-react-hooks: + specifier: 4.6.0 + version: 4.6.0(eslint@8.56.0) + postcss: + specifier: ^8.4.38 + version: 8.4.38 + prettier: + specifier: 3.2.5 + version: 3.2.5 + rimraf: + specifier: ^5.0.5 + version: 5.0.5 + tailwindcss: + specifier: ^3.4.3 + version: 3.4.3 + tslib: + specifier: 2.6.2 + version: 2.6.2 + turbo: + specifier: ^1.12.4 + version: 1.12.4 + typescript: + specifier: 5.2.2 + version: 5.2.2 + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.8.10) + + apps/chrome-extension: + dependencies: + webextension-polyfill: + specifier: 0.10.0 + version: 0.10.0 + devDependencies: + '@chrome-extension-boilerplate/dev-utils': + specifier: workspace:* + version: link:../../packages/dev-utils + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + '@laynezh/vite-plugin-lib-assets': + specifier: ^0.5.21 + version: 0.5.21 + '@types/ws': + specifier: 8.5.8 + version: 8.5.8 + magic-string: + specifier: ^0.30.6 + version: 0.30.7 + npm-run-all: + specifier: 4.1.5 + version: 4.1.5 + ts-loader: + specifier: 9.5.0 + version: 9.5.0(typescript@5.2.2)(webpack@5.90.3) + + packages/dev-utils: + devDependencies: + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../tsconfig + + packages/hmr: + dependencies: + ws: + specifier: 8.14.2 + version: 8.14.2 + devDependencies: + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@rollup/plugin-sucrase': + specifier: ^5.0.2 + version: 5.0.2(rollup@4.3.0) + '@types/ws': + specifier: 8.5.8 + version: 8.5.8 + esm: + specifier: ^3.2.25 + version: 3.2.25 + rollup: + specifier: 4.3.0 + version: 4.3.0 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.8.10)(typescript@5.2.2) + + packages/shared: + devDependencies: + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../tsconfig + tsup: + specifier: 8.0.2 + version: 8.0.2(postcss@8.4.38)(typescript@5.2.2) + + packages/tailwind-config: {} + + packages/tsconfig: {} + + pages/content: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + + pages/content-ui: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwind-config + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + + pages/devtools: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + + pages/devtools-panel: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwind-config + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + + pages/newtab: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwind-config + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + sass: + specifier: 1.74.1 + version: 1.74.1 + + pages/options: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwind-config + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + + pages/popup: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwind-config + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig + + pages/sidepanel: + dependencies: + '@chrome-extension-boilerplate/shared': + specifier: workspace:* + version: link:../../packages/shared + devDependencies: + '@chrome-extension-boilerplate/hmr': + specifier: workspace:* + version: link:../../packages/hmr + '@chrome-extension-boilerplate/tailwindcss-config': + specifier: workspace:* + version: link:../../packages/tailwind-config + '@chrome-extension-boilerplate/tsconfig': + specifier: workspace:* + version: link:../../packages/tsconfig packages: @@ -141,200 +301,9 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.23.2: - resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.3: - resolution: {integrity: sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.3 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) - '@babel/helpers': 7.23.2 - '@babel/parser': 7.23.3 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.3 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.23.3: - resolution: {integrity: sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.3 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.2 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.3 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.3 - dev: true - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.3 - dev: true - - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.3 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.3 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.23.2: - resolution: {integrity: sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.3 - '@babel/types': 7.23.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/parser@7.23.3: - resolution: {integrity: sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.3 - dev: true - - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.3 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.3): - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.3 - '@babel/helper-plugin-utils': 7.22.5 + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} dev: true /@babel/runtime@7.23.2: @@ -344,379 +313,366 @@ packages: regenerator-runtime: 0.14.0 dev: true - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.3 - '@babel/types': 7.23.3 + '@jridgewell/trace-mapping': 0.3.9 dev: true - /@babel/traverse@7.23.3: - resolution: {integrity: sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.3 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.3 - '@babel/types': 7.23.3 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true dev: true + optional: true - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true dev: true + optional: true - /@babel/types@7.23.3: - resolution: {integrity: sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true dev: true + optional: true - /@commitlint/cli@18.4.4(@types/node@20.8.10)(typescript@5.2.2): - resolution: {integrity: sha512-Ro3wIo//fV3XiV1EkdpHog6huaEyNcUAVrSmtgKqYM5g982wOWmP4FXvEDFwRMVgz878CNBvvCc33dMZ5AQJ/g==} - engines: {node: '>=v18'} - hasBin: true - dependencies: - '@commitlint/format': 18.4.4 - '@commitlint/lint': 18.4.4 - '@commitlint/load': 18.4.4(@types/node@20.8.10)(typescript@5.2.2) - '@commitlint/read': 18.4.4 - '@commitlint/types': 18.4.4 - execa: 5.1.1 - lodash.isfunction: 3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - typescript + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true dev: true + optional: true - /@commitlint/config-conventional@18.1.0: - resolution: {integrity: sha512-8vvvtV3GOLEMHeKc8PjRL1lfP1Y4B6BG0WroFd9PJeRiOc3nFX1J0wlJenLURzl9Qus6YXVGWf+a/ZlbCKT3AA==} - engines: {node: '>=v18'} - dependencies: - conventional-changelog-conventionalcommits: 7.0.2 + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true dev: true + optional: true - /@commitlint/config-validator@18.4.4: - resolution: {integrity: sha512-/QI8KIg/h7O0Eus36fPcEcO3QPBcdXuGfZeCF5m15k0EB2bcU8s6pHNTNEa6xz9PrAefHCL+yzRJj7w20T6Mow==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.4.4 - ajv: 8.12.0 + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true dev: true + optional: true - /@commitlint/ensure@18.4.4: - resolution: {integrity: sha512-KjD19p6julB5WrQL+Cd8p+AePwpl1XzGAjB0jnuFMKWtji9L7ucCZUKDstGjlkBZGGzH/nvdB8K+bh5K27EVUg==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.4.4 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true dev: true + optional: true - /@commitlint/execute-rule@18.4.4: - resolution: {integrity: sha512-a37Nd3bDQydtg9PCLLWM9ZC+GO7X5i4zJvrggJv5jBhaHsXeQ9ZWdO6ODYR+f0LxBXXNYK3geYXJrCWUCP8JEg==} - engines: {node: '>=v18'} + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true dev: true + optional: true - /@commitlint/format@18.4.4: - resolution: {integrity: sha512-2v3V5hVlv0R3pe7p66IX5F7cjeVvGM5JqITRIbBCFvGHPJ/CG74rjTkAu0RBEiIhlk3eOaLjVGq3d5falPkLBA==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.4.4 - chalk: 4.1.2 + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@commitlint/is-ignored@18.4.4: - resolution: {integrity: sha512-rXWes9owKBTjfTr6Od7YlflRg4N+ngkOH+dUZhk0qL/XQb26mHz0EgVgdixMVBac1OsohRwJaLmVHX+5F6vfmg==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.4.4 - semver: 7.5.4 + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@commitlint/lint@18.4.4: - resolution: {integrity: sha512-SoyQstVxMY5Z4GnFRtRzy+NWYb+yVseXgir+7BxnpB59oH05C9XztRrhDw6OnkNeXhjINTpi1HLnuY7So+CaAQ==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/is-ignored': 18.4.4 - '@commitlint/parse': 18.4.4 - '@commitlint/rules': 18.4.4 - '@commitlint/types': 18.4.4 + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@commitlint/load@18.4.4(@types/node@20.8.10)(typescript@5.2.2): - resolution: {integrity: sha512-RaDIa9qwOw2xRJ3Jr2DBXd14rmnHJIX2XdZF4kmoF1rgsg/+7cvrExLSUNAkQUNimyjCn1b/bKX2Omm+GdY0XQ==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/config-validator': 18.4.4 - '@commitlint/execute-rule': 18.4.4 - '@commitlint/resolve-extends': 18.4.4 - '@commitlint/types': 18.4.4 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.2.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.8.10)(cosmiconfig@8.3.6)(typescript@5.2.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - transitivePeerDependencies: - - '@types/node' - - typescript + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@commitlint/message@18.4.4: - resolution: {integrity: sha512-lHF95mMDYgAI1LBXveJUyg4eLaMXyOqJccCK3v55ZOEUsMPrDi8upqDjd/NmzWmESYihaOMBTAnxm+6oD1WoDQ==} - engines: {node: '>=v18'} + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@commitlint/parse@18.4.4: - resolution: {integrity: sha512-99G7dyn/OoyNWXJni0Ki0K3aJd01pEb/Im/Id6y4X7PN+kGOahjz2z/cXYYHn7xDdooqFVdiVrVLeChfgpWZ2g==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/types': 18.4.4 - conventional-changelog-angular: 7.0.0 - conventional-commits-parser: 5.0.0 + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@commitlint/read@18.4.4: - resolution: {integrity: sha512-r58JbWky4gAFPea/CZmvlqP9Ehbs+8gSEUqhIJOojKzTc3xlxFnZUDVPcEnnaqzQEEoV6C69VW7xuzdcBlu/FQ==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/top-level': 18.4.4 - '@commitlint/types': 18.4.4 - git-raw-commits: 2.0.11 - minimist: 1.2.8 + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@commitlint/resolve-extends@18.4.4: - resolution: {integrity: sha512-RRpIHSbRnFvmGifVk21Gqazf1QF/yeP+Kkg/e3PlkegcOKd/FGOXp/Kx9cvSO2K7ucSn4GD/oBvgasFoy+NCAw==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/config-validator': 18.4.4 - '@commitlint/types': 18.4.4 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@commitlint/rules@18.4.4: - resolution: {integrity: sha512-6Uzlsnl/GljEI+80NWjf4ThOfR8NIsbm18IfXYuCEchlwMHSxiuYG4rHSK5DNmG/+MIo8eR5VdQ0gQyt7kWzAA==} - engines: {node: '>=v18'} - dependencies: - '@commitlint/ensure': 18.4.4 - '@commitlint/message': 18.4.4 - '@commitlint/to-lines': 18.4.4 - '@commitlint/types': 18.4.4 - execa: 5.1.1 + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@commitlint/to-lines@18.4.4: - resolution: {integrity: sha512-mwe2Roa59NCz/krniAdCygFabg7+fQCkIhXqBHw00XQ8Y7lw4poZLLxeGI3p3bLpcEOXdqIDrEGLwHmG5lBdwQ==} - engines: {node: '>=v18'} + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@commitlint/top-level@18.4.4: - resolution: {integrity: sha512-PBwW1drgeavl9CadB7IPRUk6rkUP/O8jEkxjlC+ofuh3pw0bzJdAT+Kw7M1Yc9KtTb9xTaqUB8uvRtaybHa/tQ==} - engines: {node: '>=v18'} - dependencies: - find-up: 5.0.0 + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true dev: true + optional: true - /@commitlint/types@18.4.4: - resolution: {integrity: sha512-/FykLtodD8gKs3+VNkAUwofu4LBHankclj+I8fB2jTRvG6PV7k/OUt4P+VbM7ip853qS4F0g7Z6hLNa6JeMcAQ==} - engines: {node: '>=v18'} - dependencies: - chalk: 4.1.2 + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true dev: true + optional: true - /@esbuild/android-arm64@0.19.5: - resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} - cpu: [arm64] - os: [android] + cpu: [ia32] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/android-arm@0.19.5: - resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} - cpu: [arm] - os: [android] + cpu: [ia32] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/android-x64@0.19.5: - resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} - cpu: [x64] - os: [android] + cpu: [loong64] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/darwin-arm64@0.19.5: - resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + cpu: [loong64] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/darwin-x64@0.19.5: - resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} - cpu: [x64] - os: [darwin] + cpu: [mips64el] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/freebsd-arm64@0.19.5: - resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/freebsd-x64@0.19.5: - resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] + cpu: [ppc64] + os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64@0.19.5: - resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm@0.19.5: - resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32@0.19.5: - resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-loong64@0.19.5: - resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-mips64el@0.19.5: - resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ppc64@0.19.5: - resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-riscv64@0.19.5: - resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] + cpu: [x64] + os: [netbsd] requiresBuild: true dev: true optional: true - /@esbuild/linux-s390x@0.19.5: - resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} - cpu: [s390x] - os: [linux] + cpu: [x64] + os: [netbsd] requiresBuild: true dev: true optional: true - /@esbuild/linux-x64@0.19.5: - resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] - os: [linux] + os: [openbsd] requiresBuild: true dev: true optional: true - /@esbuild/netbsd-x64@0.19.5: - resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] - os: [netbsd] + os: [openbsd] requiresBuild: true dev: true optional: true - /@esbuild/openbsd-x64@0.19.5: - resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] - os: [openbsd] + os: [sunos] requiresBuild: true dev: true optional: true - /@esbuild/sunos-x64@0.19.5: - resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -724,8 +680,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.5: - resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -733,8 +689,26 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.5: - resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -742,8 +716,17 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.5: - resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -820,50 +803,59 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} dev: true /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@laynezh/vite-plugin-lib-assets@0.5.21: + resolution: {integrity: sha512-XeOSCwzh0JqMNPchPRX2U/aAcO7S13LAK3GDuBn8T5AuKF5lbeJoUd7iqdlcYfUJjhPwqXoK8UwM1NCoAj1eaA==} + dependencies: + escape-string-regexp: 4.0.0 + loader-utils: 3.2.1 + mrmime: 1.0.1 + semver: 7.6.0 + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -905,45 +897,10 @@ packages: peerDependenciesMeta: rollup: optional: true - dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.3.0) - rollup: 4.3.0 - sucrase: 3.35.0 - dev: true - - /@rollup/plugin-typescript@11.1.6(rollup@4.3.0)(tslib@2.6.2)(typescript@5.2.2): - resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.14.0||^3.0.0||^4.0.0 - tslib: '*' - typescript: '>=3.7.0' - peerDependenciesMeta: - rollup: - optional: true - tslib: - optional: true dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.3.0) - resolve: 1.22.8 - rollup: 4.3.0 - tslib: 2.6.2 - typescript: 5.2.2 - dev: true - - /@rollup/pluginutils@5.0.5(rollup@4.3.0): - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@types/estree': 1.0.3 - estree-walker: 2.0.2 - picomatch: 2.3.1 rollup: 4.3.0 + sucrase: 3.35.0 dev: true /@rollup/pluginutils@5.1.0(rollup@4.3.0): @@ -955,180 +912,375 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 4.3.0 dev: true - /@rollup/rollup-android-arm-eabi@4.3.0: - resolution: {integrity: sha512-/4pns6BYi8MXdwnXM44yoGAcFYVHL/BYlB2q1HXZ6AzH++LaiEVWFpBWQ/glXhbMbv3E3o09igrHFbP/snhAvA==} - cpu: [arm] - os: [android] + /@rollup/rollup-android-arm-eabi@4.17.2: + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm-eabi@4.3.0: + resolution: {integrity: sha512-/4pns6BYi8MXdwnXM44yoGAcFYVHL/BYlB2q1HXZ6AzH++LaiEVWFpBWQ/glXhbMbv3E3o09igrHFbP/snhAvA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.17.2: + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.3.0: + resolution: {integrity: sha512-nLO/JsL9idr416vzi3lHm3Xm+QZh4qHij8k3Er13kZr5YhL7/+kBAx84kDmPc7HMexLmwisjDCeDIKNFp8mDlQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.17.2: + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.3.0: + resolution: {integrity: sha512-dGhVBlllt4iHwTGy21IEoMOTN5wZoid19zEIxsdY29xcEiOEHqzDa7Sqrkh5OE7LKCowL61eFJXxYe/+pYa7ZQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.17.2: + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.3.0: + resolution: {integrity: sha512-h8wRfHeLEbU3NzaP1Oku7BYXCJQiTRr+8U0lklyOQXxXiEpHLL8tk1hFl+tezoRKLcPJD7joKaK74ASsqt3Ekg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.17.2: + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.3.0: + resolution: {integrity: sha512-wP4VgR/gfV18sylTuym3sxRTkAgUR2vh6YLeX/GEznk5jCYcYSlx585XlcUcl0c8UffIZlRJ09raWSX3JDb4GA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.17.2: + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.17.2: + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.3.0: + resolution: {integrity: sha512-v/14JCYVkqRSJeQbxFx4oUkwVQQw6lFMN7bd4vuARBc3X2lmomkxBsc+BFiIDL/BK+CTx5AOh/k9XmqDnKWRVg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.17.2: + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.3.0: + resolution: {integrity: sha512-tNhfYqFH5OxtRzfkTOKdgFYlPSZnlDLNW4+leNEvQZhwTJxoTwsZAAhR97l3qVry/kkLyJPBK+Q8EAJLPinDIg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.17.2: + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.17.2: + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.17.2: + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.3.0: + resolution: {integrity: sha512-pw77m8QywdsoFdFOgmc8roF1inBI0rciqzO8ffRUgLoq7+ee9o5eFqtEcS6hHOOplgifAUUisP8cAnwl9nUYPw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.17.2: + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.3.0: + resolution: {integrity: sha512-tJs7v2MnV2F8w6X1UpPHl/43OfxjUy9SuJ2ZPoxn79v9vYteChVYO/ueLHCpRMmyTUIVML3N9z4azl9ENH8Xxg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.17.2: + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.3.0: + resolution: {integrity: sha512-OKGxp6kATQdTyI2DF+e9s+hB3/QZB45b6e+dzcfW1SUqiF6CviWyevhmT4USsMEdP3mlpC9zxLz3Oh+WaTMOSw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.17.2: + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.3.0: + resolution: {integrity: sha512-DDZ5AH68JJ2ClQFEA1aNnfA7Ybqyeh0644rGbrLOdNehTmzfICHiWSn0OprzYi9HAshTPQvlwrM+bi2kuaIOjQ==} + cpu: [ia32] + os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.3.0: - resolution: {integrity: sha512-nLO/JsL9idr416vzi3lHm3Xm+QZh4qHij8k3Er13kZr5YhL7/+kBAx84kDmPc7HMexLmwisjDCeDIKNFp8mDlQ==} - cpu: [arm64] - os: [android] + /@rollup/rollup-win32-x64-msvc@4.17.2: + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + cpu: [x64] + os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.3.0: - resolution: {integrity: sha512-dGhVBlllt4iHwTGy21IEoMOTN5wZoid19zEIxsdY29xcEiOEHqzDa7Sqrkh5OE7LKCowL61eFJXxYe/+pYa7ZQ==} + /@rollup/rollup-win32-x64-msvc@4.3.0: + resolution: {integrity: sha512-dMvGV8p92GQ8jhNlGIKpyhVZPzJlT258pPrM5q2F8lKcc9Iv9BbfdnhX1OfinYWnb9ms5zLw6MlaMnqLfUkKnQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-arm64@1.5.5: + resolution: {integrity: sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==} + engines: {node: '>=10'} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.3.0: - resolution: {integrity: sha512-h8wRfHeLEbU3NzaP1Oku7BYXCJQiTRr+8U0lklyOQXxXiEpHLL8tk1hFl+tezoRKLcPJD7joKaK74ASsqt3Ekg==} + /@swc/core-darwin-x64@1.5.5: + resolution: {integrity: sha512-XHWpKBIPKYLgh5/lV2PYjO84lkzf5JR51kjiloyz2Pa9HIV8tHoAP8bYdJwm4nUp2I7KcEh3pPH0AVu5LpxMKw==} + engines: {node: '>=10'} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.3.0: - resolution: {integrity: sha512-wP4VgR/gfV18sylTuym3sxRTkAgUR2vh6YLeX/GEznk5jCYcYSlx585XlcUcl0c8UffIZlRJ09raWSX3JDb4GA==} + /@swc/core-linux-arm-gnueabihf@1.5.5: + resolution: {integrity: sha512-vtoWNCWAe+CNSqtqIwFnIH48qgPPlUZKoQ4EVFeMM+7/kDi6SeNxoh5TierJs5bKAWxD49VkPvRoWFCk6V62mA==} + engines: {node: '>=10'} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.3.0: - resolution: {integrity: sha512-v/14JCYVkqRSJeQbxFx4oUkwVQQw6lFMN7bd4vuARBc3X2lmomkxBsc+BFiIDL/BK+CTx5AOh/k9XmqDnKWRVg==} + /@swc/core-linux-arm64-gnu@1.5.5: + resolution: {integrity: sha512-L4l7M78U6h/rCAxId+y5Vu+1KfDRF6dJZtitFcaT293guiUQFwJv8gLxI4Jh5wFtZ0fYd0QaCuvh2Ip79CzGMg==} + engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.3.0: - resolution: {integrity: sha512-tNhfYqFH5OxtRzfkTOKdgFYlPSZnlDLNW4+leNEvQZhwTJxoTwsZAAhR97l3qVry/kkLyJPBK+Q8EAJLPinDIg==} + /@swc/core-linux-arm64-musl@1.5.5: + resolution: {integrity: sha512-DkzJc13ukXa7oJpyn24BjIgsiOybYrc+IxjsQyfNlDrrs1QXP4elStcpkD02SsIuSyHjZV8Hw2HFBMQB3OHPrA==} + engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.3.0: - resolution: {integrity: sha512-pw77m8QywdsoFdFOgmc8roF1inBI0rciqzO8ffRUgLoq7+ee9o5eFqtEcS6hHOOplgifAUUisP8cAnwl9nUYPw==} + /@swc/core-linux-x64-gnu@1.5.5: + resolution: {integrity: sha512-kj4ZwWJGeBEUzHrRQP2VudN+kkkYH7OI1dPVDc6kWQx5X4329JeKOas4qY0l7gDVjBbRwN9IbbPI6TIn2KfAug==} + engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.3.0: - resolution: {integrity: sha512-tJs7v2MnV2F8w6X1UpPHl/43OfxjUy9SuJ2ZPoxn79v9vYteChVYO/ueLHCpRMmyTUIVML3N9z4azl9ENH8Xxg==} + /@swc/core-linux-x64-musl@1.5.5: + resolution: {integrity: sha512-6pTorCs4mYhPhYtC4jNOnhGgjNd3DZcRoZ9P0tzXXP69aCbYjvlgNH/NRvAROp9AaVFeZ7a7PmCWb6+Rbe7NKg==} + engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.3.0: - resolution: {integrity: sha512-OKGxp6kATQdTyI2DF+e9s+hB3/QZB45b6e+dzcfW1SUqiF6CviWyevhmT4USsMEdP3mlpC9zxLz3Oh+WaTMOSw==} + /@swc/core-win32-arm64-msvc@1.5.5: + resolution: {integrity: sha512-o0/9pstmEjwZyrY/bA+mymF0zH7E+GT/XCVqdKeWW9Wn3gTTyWa5MZnrFgI2THQ+AXwdglMB/Zo76ARQPaz/+A==} + engines: {node: '>=10'} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.3.0: - resolution: {integrity: sha512-DDZ5AH68JJ2ClQFEA1aNnfA7Ybqyeh0644rGbrLOdNehTmzfICHiWSn0OprzYi9HAshTPQvlwrM+bi2kuaIOjQ==} + /@swc/core-win32-ia32-msvc@1.5.5: + resolution: {integrity: sha512-B+nypUwsmCuaH6RtKWgiPCb+ENjxstJPPJeMJvBqlJqyCaIkZzN4M07Ozi3xVv1VG21SRkd6G3xIqRoalrNc0Q==} + engines: {node: '>=10'} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.3.0: - resolution: {integrity: sha512-dMvGV8p92GQ8jhNlGIKpyhVZPzJlT258pPrM5q2F8lKcc9Iv9BbfdnhX1OfinYWnb9ms5zLw6MlaMnqLfUkKnQ==} + /@swc/core-win32-x64-msvc@1.5.5: + resolution: {integrity: sha512-ry83ki9ZX0Q+GWGnqc2J618Z+FvKE8Ajn42F8EYi8Wj0q6Jz3mj+pJzgzakk2INm2ldEZ+FaRPipn4ozsZDcBg==} + engines: {node: '>=10'} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@testing-library/dom@9.3.3: - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} - engines: {node: '>=14'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/runtime': 7.23.2 - '@types/aria-query': 5.0.3 - aria-query: 5.1.3 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true - - /@testing-library/react@14.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==} - engines: {node: '>=14'} + /@swc/core@1.5.5: + resolution: {integrity: sha512-M8O22EEgdSONLd+7KRrXj8pn+RdAZZ7ISnPjE9KCQQlI0kkFNEquWR+uFdlFxQfwlyCe/Zb6uGXGDvtcov4IMg==} + engines: {node: '>=10'} + requiresBuild: true peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true dependencies: - '@babel/runtime': 7.23.2 - '@testing-library/dom': 9.3.3 - '@types/react-dom': 18.2.18 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + '@swc/counter': 0.1.3 + '@swc/types': 0.1.6 + optionalDependencies: + '@swc/core-darwin-arm64': 1.5.5 + '@swc/core-darwin-x64': 1.5.5 + '@swc/core-linux-arm-gnueabihf': 1.5.5 + '@swc/core-linux-arm64-gnu': 1.5.5 + '@swc/core-linux-arm64-musl': 1.5.5 + '@swc/core-linux-x64-gnu': 1.5.5 + '@swc/core-linux-x64-musl': 1.5.5 + '@swc/core-win32-arm64-msvc': 1.5.5 + '@swc/core-win32-ia32-msvc': 1.5.5 + '@swc/core-win32-x64-msvc': 1.5.5 dev: true - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} dev: true - /@types/aria-query@5.0.3: - resolution: {integrity: sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA==} + /@swc/types@0.1.6: + resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} + dependencies: + '@swc/counter': 0.1.3 dev: true - /@types/babel__core@7.20.4: - resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - '@types/babel__generator': 7.6.6 - '@types/babel__template': 7.4.3 - '@types/babel__traverse': 7.20.3 + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@types/babel__generator@7.6.6: - resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} - dependencies: - '@babel/types': 7.23.0 + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@types/babel__template@7.4.3: - resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@types/babel__traverse@7.20.3: - resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} - dependencies: - '@babel/types': 7.23.0 + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true /@types/chrome@0.0.263: @@ -1138,22 +1290,22 @@ packages: '@types/har-format': 1.2.14 dev: true - /@types/eslint-scope@3.7.6: - resolution: {integrity: sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==} + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.44.5 - '@types/estree': 1.0.3 + '@types/eslint': 8.56.5 + '@types/estree': 1.0.5 dev: true - /@types/eslint@8.44.5: - resolution: {integrity: sha512-Ol2eio8LtD/tGM4Ga7Jb83NuFwEv3NqvssSlifXL9xuFpSyQZw0ecmm2Kux6iU0KxQmp95hlPmGCzGJ0TCFeRA==} + /@types/eslint@8.56.5: + resolution: {integrity: sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==} dependencies: - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 '@types/json-schema': 7.0.14 dev: true - /@types/estree@1.0.3: - resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true /@types/filesystem@0.0.34: @@ -1178,20 +1330,12 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/minimist@1.2.4: - resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==} - dev: true - /@types/node@20.8.10: resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} dependencies: undici-types: 5.26.5 dev: true - /@types/normalize-package-data@2.4.3: - resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} - dev: true - /@types/prop-types@15.7.9: resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} dev: true @@ -1402,59 +1546,15 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-react@4.2.0(vite@5.0.12): - resolution: {integrity: sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==} - engines: {node: ^14.18.0 || >=16.0.0} + /@vitejs/plugin-react-swc@3.6.0(vite@5.2.11): + resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} peerDependencies: - vite: ^4.2.0 || ^5.0.0 - dependencies: - '@babel/core': 7.23.3 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.3) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.3) - '@types/babel__core': 7.20.4 - react-refresh: 0.14.0 - vite: 5.0.12(@types/node@20.8.10)(sass@1.72.0) - transitivePeerDependencies: - - supports-color - dev: true - - /@vitest/expect@1.2.2: - resolution: {integrity: sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==} - dependencies: - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - chai: 4.3.10 - dev: true - - /@vitest/runner@1.2.2: - resolution: {integrity: sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==} - dependencies: - '@vitest/utils': 1.2.2 - p-limit: 5.0.0 - pathe: 1.1.1 - dev: true - - /@vitest/snapshot@1.2.2: - resolution: {integrity: sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==} - dependencies: - magic-string: 0.30.6 - pathe: 1.1.1 - pretty-format: 29.7.0 - dev: true - - /@vitest/spy@1.2.2: - resolution: {integrity: sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==} - dependencies: - tinyspy: 2.2.0 - dev: true - - /@vitest/utils@1.2.2: - resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} + vite: ^4 || ^5 dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@swc/core': 1.5.5 + vite: 5.2.11(@types/node@20.8.10) + transitivePeerDependencies: + - '@swc/helpers' dev: true /@webassemblyjs/ast@1.11.6: @@ -1571,24 +1671,12 @@ packages: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} dev: true - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true - - /acorn-import-assertions@1.9.0(acorn@8.10.0): + /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.10.0 + acorn: 8.11.3 dev: true /acorn-jsx@5.3.2(acorn@8.10.0): @@ -1610,13 +1698,10 @@ packages: hasBin: true dev: true - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true dev: true /ajv-keywords@3.5.2(ajv@6.12.6): @@ -1636,22 +1721,6 @@ packages: uri-js: 4.4.1 dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} - dependencies: - type-fest: 3.13.1 - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1676,18 +1745,13 @@ packages: color-convert: 2.0.1 dev: true - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} dev: true /any-promise@1.3.0: - resolution: {integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8=} + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: true /anymatch@3.1.3: @@ -1698,14 +1762,16 @@ packages: picomatch: 2.3.1 dev: true - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.2 + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true /aria-query@5.3.0: @@ -1721,10 +1787,6 @@ packages: is-array-buffer: 3.0.2 dev: true - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true - /array-includes@3.1.7: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} @@ -1795,15 +1857,6 @@ packages: is-shared-array-buffer: 1.0.2 dev: true - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true @@ -1814,8 +1867,20 @@ packages: has-symbols: 1.0.3 dev: true - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001617 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 dev: true /available-typed-arrays@1.0.5: @@ -1863,21 +1928,31 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001550 - electron-to-chromium: 1.4.557 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + caniuse-lite: 1.0.30001617 + electron-to-chromium: 1.4.690 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true + /bundle-require@4.0.2(esbuild@0.19.12): + resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + dependencies: + esbuild: 0.19.12 + load-tsconfig: 0.2.5 + dev: true + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1895,35 +1970,13 @@ packages: engines: {node: '>=6'} dev: true - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /caniuse-lite@1.0.30001550: - resolution: {integrity: sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ==} + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} dev: true - /chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + /caniuse-lite@1.0.30001617: + resolution: {integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==} dev: true /chalk@2.4.2: @@ -1943,17 +1996,6 @@ packages: supports-color: 7.2.0 dev: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -1974,30 +2016,6 @@ packages: engines: {node: '>=6.0'} dev: true - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - restore-cursor: 4.0.0 - dev: true - - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} - dependencies: - slice-ansi: 5.0.0 - string-width: 7.0.0 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -2019,22 +2037,6 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: true - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: true - /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -2044,13 +2046,6 @@ packages: engines: {node: '>= 6'} dev: true - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -2059,67 +2054,8 @@ packages: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: true - /construct-style-sheets-polyfill@3.1.0: - resolution: {integrity: sha512-HBLKP0chz8BAY6rBdzda11c3wAZeCZ+kIG4weVC2NM3AXzxx09nhe8t0SQNdloAvg5GLuHwq/0SPOOSPvtCcKw==} - dev: false - - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} - dependencies: - compare-func: 2.0.0 - dev: true - - /conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} - dependencies: - compare-func: 2.0.0 - dev: true - - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 2.0.0 - meow: 12.1.1 - split2: 4.2.0 - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.8.10)(cosmiconfig@8.3.6)(typescript@5.2.2): - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' - dependencies: - '@types/node': 20.8.10 - cosmiconfig: 8.3.6(typescript@5.2.2) - jiti: 1.21.0 - typescript: 5.2.2 - dev: true - - /cosmiconfig@8.3.6(typescript@5.2.2): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - typescript: 5.2.2 + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true /cross-env@7.0.3: @@ -2150,11 +2086,10 @@ packages: which: 2.0.2 dev: true - /cssstyle@3.0.0: - resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} - engines: {node: '>=14'} - dependencies: - rrweb-cssom: 0.6.0 + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true dev: true /csstype@3.1.2: @@ -2165,20 +2100,6 @@ packages: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true - - /data-urls@4.0.0: - resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} - engines: {node: '>=14'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - dev: true - /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2190,63 +2111,16 @@ packages: ms: 2.1.3 dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-equal@2.2.2: - resolution: {integrity: sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==} + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.1 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 + ms: 2.1.2 dev: true /deep-is@0.1.4: @@ -2271,19 +2145,18 @@ packages: object-keys: 1.1.1 dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} dev: true /dir-glob@3.0.1: @@ -2293,6 +2166,10 @@ packages: path-type: 4.0.0 dev: true + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2307,34 +2184,12 @@ packages: esutils: 2.0.3 dev: true - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true - - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - dependencies: - webidl-conversions: 7.0.0 - dev: true - - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.557: - resolution: {integrity: sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw==} - dev: true - - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + /electron-to-chromium@1.4.690: + resolution: {integrity: sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==} dev: true /emoji-regex@8.0.0: @@ -2345,19 +2200,14 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + /enhanced-resolve@5.15.1: + resolution: {integrity: sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 dev: true - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -2409,20 +2259,6 @@ packages: which-typed-array: 1.1.11 dev: true - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - /es-iterator-helpers@1.0.15: resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} dependencies: @@ -2442,8 +2278,8 @@ packages: safe-array-concat: 1.0.1 dev: true - /es-module-lexer@1.3.1: - resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} dev: true /es-set-tostringtag@2.0.1: @@ -2470,34 +2306,66 @@ packages: is-symbol: 1.0.4 dev: true - /esbuild@0.19.5: - resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.5 - '@esbuild/android-arm64': 0.19.5 - '@esbuild/android-x64': 0.19.5 - '@esbuild/darwin-arm64': 0.19.5 - '@esbuild/darwin-x64': 0.19.5 - '@esbuild/freebsd-arm64': 0.19.5 - '@esbuild/freebsd-x64': 0.19.5 - '@esbuild/linux-arm': 0.19.5 - '@esbuild/linux-arm64': 0.19.5 - '@esbuild/linux-ia32': 0.19.5 - '@esbuild/linux-loong64': 0.19.5 - '@esbuild/linux-mips64el': 0.19.5 - '@esbuild/linux-ppc64': 0.19.5 - '@esbuild/linux-riscv64': 0.19.5 - '@esbuild/linux-s390x': 0.19.5 - '@esbuild/linux-x64': 0.19.5 - '@esbuild/netbsd-x64': 0.19.5 - '@esbuild/openbsd-x64': 0.19.5 - '@esbuild/sunos-x64': 0.19.5 - '@esbuild/win32-arm64': 0.19.5 - '@esbuild/win32-ia32': 0.19.5 - '@esbuild/win32-x64': 0.19.5 + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 dev: true /escalade@3.1.1: @@ -2776,6 +2644,11 @@ packages: - supports-color dev: true + /esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2813,21 +2686,11 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.3 - dev: true - /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: true - /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -2848,21 +2711,6 @@ packages: strip-final-newline: 2.0.0 dev: true - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -2910,14 +2758,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2953,22 +2793,8 @@ packages: signal-exit: 4.1.0 dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true /fs.realpath@1.0.0: @@ -3001,25 +2827,6 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: true - - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true - /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -3034,11 +2841,6 @@ packages: engines: {node: '>=10'} dev: true - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -3047,18 +2849,6 @@ packages: get-intrinsic: 1.2.1 dev: true - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3100,18 +2890,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - dependencies: - ini: 1.3.8 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - /globals@13.23.0: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} @@ -3152,11 +2930,6 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true - /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true @@ -3210,71 +2983,18 @@ packages: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - dependencies: - whatwg-encoding: 2.0.0 - dev: true - - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: true - /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + /immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} dev: true /import-fresh@3.3.0: @@ -3290,11 +3010,6 @@ packages: engines: {node: '>=0.8.19'} dev: true - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -3306,10 +3021,6 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -3319,14 +3030,6 @@ packages: side-channel: 1.0.4 dev: true - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -3401,18 +3104,6 @@ packages: engines: {node: '>=8'} dev: true - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} - dependencies: - get-east-asian-width: 1.2.0 - dev: true - /is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -3448,25 +3139,11 @@ packages: engines: {node: '>=0.12.0'} dev: true - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} dev: true - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3490,11 +3167,6 @@ packages: engines: {node: '>=8'} dev: true - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} @@ -3509,13 +3181,6 @@ packages: has-symbols: 1.0.3 dev: true - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} - dependencies: - text-extensions: 2.4.0 - dev: true - /is-typed-array@1.1.12: resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} engines: {node: '>= 0.4'} @@ -3581,6 +3246,11 @@ packages: hasBin: true dev: true + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3591,50 +3261,6 @@ packages: argparse: 2.0.1 dev: true - /jsdom@22.1.0: - resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} - engines: {node: '>=16'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - cssstyle: 3.0.0 - data-urls: 4.0.0 - decimal.js: 10.4.3 - domexception: 4.0.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - ws: 8.14.2 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true @@ -3651,10 +3277,6 @@ packages: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true @@ -3666,29 +3288,6 @@ packages: minimist: 1.2.8 dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true - /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -3705,11 +3304,6 @@ packages: json-buffer: 3.0.1 dev: true - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: true @@ -3729,6 +3323,11 @@ packages: type-check: 0.4.0 dev: true + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + /lilconfig@3.0.0: resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} engines: {node: '>=14'} @@ -3738,37 +3337,6 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged@15.2.0: - resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} - engines: {node: '>=18.12.0'} - hasBin: true - dependencies: - chalk: 5.3.0 - commander: 11.1.0 - debug: 4.3.4 - execa: 8.0.1 - lilconfig: 3.0.0 - listr2: 8.0.0 - micromatch: 4.0.5 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /listr2@8.0.0: - resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} - engines: {node: '>=18.0.0'} - dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.0.0 - rfdc: 1.3.0 - wrap-ansi: 9.0.0 - dev: true - /load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -3779,24 +3347,19 @@ packages: strip-bom: 3.0.0 dev: true + /load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} dev: true - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.4.2 - pkg-types: 1.0.3 - dev: true - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 + /loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} dev: true /locate-path@6.0.0: @@ -3806,59 +3369,12 @@ packages: p-locate: 5.0.0 dev: true - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true - - /lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - dev: true - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: true - - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true - /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: true - - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true - - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true - - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true - - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} - dependencies: - ansi-escapes: 6.2.0 - cli-cursor: 4.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} dev: true /loose-envify@1.4.0: @@ -3867,23 +3383,11 @@ packages: dependencies: js-tokens: 4.0.0 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true - /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -3891,26 +3395,15 @@ packages: yallist: 4.0.0 dev: true - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true - - /magic-string@0.30.6: - resolution: {integrity: sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==} + /magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true - - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true /memorystream@0.3.1: @@ -3918,28 +3411,6 @@ packages: engines: {node: '>= 0.10.0'} dev: true - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true - - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.4 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -3974,16 +3445,6 @@ packages: engines: {node: '>=6'} dev: true - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -3997,15 +3458,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true @@ -4015,13 +3467,9 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dev: true - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} - dependencies: - acorn: 8.10.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.3.2 + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} dev: true /ms@2.1.2: @@ -4058,8 +3506,8 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: true /normalize-package-data@2.5.0: @@ -4071,21 +3519,16 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.13.1 - semver: 7.5.4 - validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + /npm-run-all@4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} engines: {node: '>= 4'} @@ -4109,32 +3552,18 @@ packages: path-key: 3.1.1 dev: true - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: true - /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} dev: true - /object-inspect@1.13.0: - resolution: {integrity: sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==} + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} dev: true - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.1 + /object-inspect@1.13.0: + resolution: {integrity: sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==} dev: true /object-keys@1.1.1: @@ -4208,13 +3637,6 @@ packages: mimic-fn: 2.1.0 dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -4227,13 +3649,6 @@ packages: type-check: 0.4.0 dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -4241,20 +3656,6 @@ packages: yocto-queue: 0.1.0 dev: true - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -4262,11 +3663,6 @@ packages: p-limit: 3.1.0 dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4282,22 +3678,6 @@ packages: json-parse-better-errors: 1.0.2 dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.13 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4318,11 +3698,6 @@ packages: engines: {node: '>=8'} dev: true - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -4347,14 +3722,6 @@ packages: engines: {node: '>=8'} dev: true - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -4370,10 +3737,9 @@ packages: hasBin: true dev: true - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} dev: true /pify@3.0.0: @@ -4386,21 +3752,74 @@ packages: engines: {node: '>= 6'} dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + dev: true + + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.38 + yaml: 2.3.4 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: true + + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /prelude-ls@1.2.1: @@ -4421,24 +3840,6 @@ packages: hasBin: true dev: true - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - /prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -4447,28 +3848,15 @@ packages: react-is: 16.13.1 dev: true - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true - /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -4483,37 +3871,23 @@ packages: loose-envify: 1.4.0 react: 18.2.0 scheduler: 0.23.0 + dev: false /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true - /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: false - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 + pify: 2.3.0 dev: true /read-pkg@3.0.0: @@ -4525,25 +3899,6 @@ packages: path-type: 3.0.0 dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.3 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4551,14 +3906,6 @@ packages: picomatch: 2.3.1 dev: true - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - /reflect.getprototypeof@1.0.4: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} @@ -4584,20 +3931,6 @@ packages: set-function-name: 2.0.1 dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -4608,13 +3941,6 @@ packages: engines: {node: '>=8'} dev: true - /resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - dependencies: - global-dirs: 0.1.1 - dev: true - /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -4633,23 +3959,11 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -4657,6 +3971,40 @@ packages: glob: 7.2.3 dev: true + /rimraf@5.0.5: + resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + glob: 10.3.10 + dev: true + + /rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + dev: true + /rollup@4.3.0: resolution: {integrity: sha512-scIi1NrKLDIYSPK66jjECtII7vIgdAMFmFo8h6qm++I6nN9qDSV35Ku6erzGVqYjx+lj+j5wkusRMr++8SyDZg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4677,10 +4025,6 @@ packages: fsevents: 2.3.3 dev: true - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true - /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -4709,31 +4053,21 @@ packages: is-regex: 1.1.4 dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true - - /sass@1.72.0: - resolution: {integrity: sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==} + /sass@1.74.1: + resolution: {integrity: sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.3.4 + immutable: 4.3.5 source-map-js: 1.0.2 dev: true - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - dependencies: - xmlchars: 2.2.0 - dev: true - /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + dev: false /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -4762,8 +4096,16 @@ packages: lru-cache: 6.0.0 dev: true - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 dev: true @@ -4813,10 +4155,6 @@ packages: object-inspect: 1.13.0 dev: true - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true @@ -4831,27 +4169,16 @@ packages: engines: {node: '>=8'} dev: true - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true - - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 - dev: true - /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} dev: true + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -4869,57 +4196,33 @@ packages: engines: {node: '>= 8'} dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 - dev: true - - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 - dev: true - - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + whatwg-url: 7.1.0 dev: true - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: - readable-stream: 3.6.2 - dev: true - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.16 dev: true - /std-env@3.5.0: - resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: - internal-slot: 1.0.5 + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.16 dev: true - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} + /spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true /string-width@4.2.3: @@ -4940,15 +4243,6 @@ packages: strip-ansi: 7.1.0 dev: true - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} - engines: {node: '>=18'} - dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - dev: true - /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: @@ -4997,12 +4291,6 @@ packages: es-abstract: 1.22.2 dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5027,35 +4315,17 @@ packages: engines: {node: '>=6'} dev: true - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - dependencies: - acorn: 8.10.0 - dev: true - /sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 glob: 10.3.10 lines-and-columns: 1.2.4 @@ -5090,10 +4360,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - /synckit@0.8.8: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5102,13 +4368,44 @@ packages: tslib: 2.6.2 dev: true + /tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: true + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} dev: true - /terser-webpack-plugin@5.3.9(webpack@5.89.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + /terser-webpack-plugin@5.3.10(webpack@5.90.3): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -5123,36 +4420,31 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.22.0 - webpack: 5.89.0 + serialize-javascript: 6.0.2 + terser: 5.28.1 + webpack: 5.90.3 dev: true - /terser@5.22.0: - resolution: {integrity: sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==} + /terser@5.28.1: + resolution: {integrity: sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: true - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: true - /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true /thenify-all@1.6.0: - resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=} + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 @@ -5164,35 +4456,6 @@ packages: any-promise: 1.3.0 dev: true - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - dependencies: - readable-stream: 3.6.2 - dev: true - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} - dev: true - - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.2.0: - resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} - engines: {node: '>=14.0.0'} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5200,26 +4463,15 @@ packages: is-number: 7.0.0 dev: true - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true - - /tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: punycode: 2.3.0 dev: true - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true dev: true /ts-api-utils@1.0.3(typescript@5.2.2): @@ -5235,7 +4487,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-loader@9.5.0(typescript@5.2.2)(webpack@5.89.0): + /ts-loader@9.5.0(typescript@5.2.2)(webpack@5.90.3): resolution: {integrity: sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==} engines: {node: '>=12.0.0'} peerDependencies: @@ -5243,12 +4495,43 @@ packages: webpack: ^5.0.0 dependencies: chalk: 4.1.2 - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.15.1 micromatch: 4.0.5 semver: 7.5.4 source-map: 0.7.4 typescript: 5.2.2 - webpack: 5.89.0 + webpack: 5.90.3 + dev: true + + /ts-node@10.9.2(@types/node@20.8.10)(typescript@5.2.2): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.8.10 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.2.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 dev: true /tsconfig-paths@3.15.0: @@ -5264,41 +4547,116 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + /tsup@8.0.2(postcss@8.4.38)(typescript@5.2.2): + resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true dependencies: - prelude-ls: 1.2.1 + bundle-require: 4.0.2(esbuild@0.19.12) + cac: 6.7.14 + chokidar: 3.5.3 + debug: 4.3.4 + esbuild: 0.19.12 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss: 8.4.38 + postcss-load-config: 4.0.2(postcss@8.4.38) + resolve-from: 5.0.0 + rollup: 4.3.0 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + - ts-node dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + /turbo-darwin-64@1.12.4: + resolution: {integrity: sha512-dBwFxhp9isTa9RS/fz2gDVk5wWhKQsPQMozYhjM7TT4jTrnYn0ZJMzr7V3B/M/T8QF65TbniW7w1gtgxQgX5Zg==} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} + /turbo-darwin-arm64@1.12.4: + resolution: {integrity: sha512-1Uo5iI6xsJ1j9ObsqxYRsa3W26mEbUe6fnj4rQYV6kDaqYD54oAMJ6hM53q9rB8JvFxwdrUXGp3PwTw9A0qqkA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + /turbo-linux-64@1.12.4: + resolution: {integrity: sha512-ONg2aSqKP7LAQOg7ysmU5WpEQp4DGNxSlAiR7um+LKtbmC/UxogbR5+T+Uuq6zGuQ5kJyKjWJ4NhtvUswOqBsA==} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + /turbo-linux-arm64@1.12.4: + resolution: {integrity: sha512-9FPufkwdgfIKg/9jj87Cdtftw8o36y27/S2vLN7FTR2pp9c0MQiTBOLVYadUr1FlShupddmaMbTkXEhyt9SdrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + /turbo-windows-64@1.12.4: + resolution: {integrity: sha512-2mOtxHW5Vjh/5rDVu/aFwsMzI+chs8XcEuJHlY1sYOpEymYTz+u6AXbnzRvwZFMrLKr7J7fQOGl+v96sLKbNdA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo-windows-arm64@1.12.4: + resolution: {integrity: sha512-nOY5wae9qnxPOpT1fRuYO0ks6dTwpKMPV6++VkDkamFDLFHUDVM/9kmD2UTeh1yyrKnrZksbb9zmShhmfj1wog==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /turbo@1.12.4: + resolution: {integrity: sha512-yUJ7elEUSToiGwFZogXpYKJpQ0BvaMbkEuQECIWtkBLcmWzlMOt6bActsIm29oN83mRU0WbzGt4e8H1KHWedhg==} + hasBin: true + optionalDependencies: + turbo-darwin-64: 1.12.4 + turbo-darwin-arm64: 1.12.4 + turbo-linux-64: 1.12.4 + turbo-linux-arm64: 1.12.4 + turbo-windows-64: 1.12.4 + turbo-windows-arm64: 1.12.4 dev: true - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} dev: true /typed-array-buffer@1.0.0: @@ -5345,10 +4703,6 @@ packages: hasBin: true dev: true - /ufo@1.3.2: - resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} - dev: true - /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -5362,23 +4716,13 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /update-browserslist-db@1.0.13(browserslist@4.22.1): + /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.22.1 + browserslist: 4.23.0 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -5389,17 +4733,14 @@ packages: punycode: 2.3.0 dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -5407,29 +4748,8 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-node@1.2.2(@types/node@20.8.10)(sass@1.72.0): - resolution: {integrity: sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.1 - picocolors: 1.0.0 - vite: 5.0.12(@types/node@20.8.10)(sass@1.72.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@5.0.12(@types/node@20.8.10)(sass@1.72.0): - resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} + /vite@5.2.11(@types/node@20.8.10): + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5457,79 +4777,13 @@ packages: optional: true dependencies: '@types/node': 20.8.10 - esbuild: 0.19.5 - postcss: 8.4.32 - rollup: 4.3.0 - sass: 1.72.0 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.2.2(@types/node@20.8.10)(jsdom@22.1.0)(sass@1.72.0): - resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': ^1.0.0 - '@vitest/ui': ^1.0.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - dependencies: - '@types/node': 20.8.10 - '@vitest/expect': 1.2.2 - '@vitest/runner': 1.2.2 - '@vitest/snapshot': 1.2.2 - '@vitest/spy': 1.2.2 - '@vitest/utils': 1.2.2 - acorn-walk: 8.3.2 - cac: 6.7.14 - chai: 4.3.10 - debug: 4.3.4 - execa: 8.0.1 - jsdom: 22.1.0 - local-pkg: 0.5.0 - magic-string: 0.30.6 - pathe: 1.1.1 - picocolors: 1.0.0 - std-env: 3.5.0 - strip-literal: 1.3.0 - tinybench: 2.5.1 - tinypool: 0.8.2 - vite: 5.0.12(@types/node@20.8.10)(sass@1.72.0) - vite-node: 1.2.2(@types/node@20.8.10)(sass@1.72.0) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - dependencies: - xml-name-validator: 4.0.0 - dev: true - /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -5542,9 +4796,8 @@ packages: resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} dev: false - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true /webpack-sources@3.2.3: @@ -5552,8 +4805,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.89.0: - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + /webpack@5.90.3: + resolution: {integrity: sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -5562,17 +4815,17 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.6 - '@types/estree': 1.0.3 + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.10.0 - acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.22.1 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.3.1 + enhanced-resolve: 5.15.1 + es-module-lexer: 1.4.1 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -5583,7 +4836,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.89.0) + terser-webpack-plugin: 5.3.10(webpack@5.90.3) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -5592,24 +4845,12 @@ packages: - uglify-js dev: true - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - dependencies: - iconv-lite: 0.6.3 - dev: true - - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - dev: true - - /whatwg-url@12.0.1: - resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} - engines: {node: '>=14'} + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} dependencies: - tr46: 4.1.1 - webidl-conversions: 7.0.0 + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 dev: true /which-boxed-primitive@1.0.2: @@ -5675,15 +4916,6 @@ packages: isexe: 2.0.0 dev: true - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - dev: true - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -5702,15 +4934,6 @@ packages: strip-ansi: 7.1.0 dev: true - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} - dependencies: - ansi-styles: 6.2.1 - string-width: 7.0.0 - strip-ansi: 7.1.0 - dev: true - /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true @@ -5726,25 +4949,7 @@ packages: optional: true utf-8-validate: optional: true - dev: true - - /xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true - - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + dev: false /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -5755,35 +4960,12 @@ packages: engines: {node: '>= 14'} dev: true - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} dev: true /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..9285d8260 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - "apps/*" + - "pages/*" + - "packages/*" diff --git a/src/assets/style/theme.scss b/src/assets/style/theme.scss deleted file mode 100644 index 78c1a2359..000000000 --- a/src/assets/style/theme.scss +++ /dev/null @@ -1,3 +0,0 @@ -.crx-class { - color: pink; -} diff --git a/src/environment.d.ts b/src/environment.d.ts deleted file mode 100644 index bedafd85c..000000000 --- a/src/environment.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare global { - namespace NodeJS { - interface ProcessEnv { - __DEV__: string; - __FIREFOX__: string; - } - } -} - -export {}; diff --git a/src/global.d.ts b/src/global.d.ts deleted file mode 100644 index 4ac64dc9c..000000000 --- a/src/global.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -declare module 'virtual:reload-on-update-in-background-script' { - export const reloadOnUpdate: (watchPath: string) => void; - export default reloadOnUpdate; -} - -declare module 'virtual:reload-on-update-in-view' { - const refreshOnUpdate: (watchPath: string) => void; - export default refreshOnUpdate; -} - -declare module '*.svg' { - import React = require('react'); - export const ReactComponent: React.SFC>; - const src: string; - export default src; -} - -declare module '*.jpg' { - const content: string; - export default content; -} - -declare module '*.png' { - const content: string; - export default content; -} - -declare module '*.json' { - const content: string; - export default content; -} diff --git a/src/pages/background/index.ts b/src/pages/background/index.ts deleted file mode 100644 index e72d56185..000000000 --- a/src/pages/background/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import reloadOnUpdate from 'virtual:reload-on-update-in-background-script'; -import 'webextension-polyfill'; - -reloadOnUpdate('pages/background'); - -/** - * Extension reloading is necessary because the browser automatically caches the css. - * If you do not use the css of the content script, please delete it. - */ -reloadOnUpdate('pages/content/style.scss'); - -console.log('background loaded'); diff --git a/src/pages/content/injected/index.ts b/src/pages/content/injected/index.ts deleted file mode 100644 index c569ea2b4..000000000 --- a/src/pages/content/injected/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * DO NOT USE import someModule from '...'; - * - * @issue-url https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/160 - * - * Chrome extensions don't support modules in content scripts. - * If you want to use other modules in content scripts, you need to import them via these files. - * - */ -import('@pages/content/injected/toggleTheme'); diff --git a/src/pages/content/injected/toggleTheme.ts b/src/pages/content/injected/toggleTheme.ts deleted file mode 100644 index b6981757c..000000000 --- a/src/pages/content/injected/toggleTheme.ts +++ /dev/null @@ -1,12 +0,0 @@ -import exampleThemeStorage from '@src/shared/storages/exampleThemeStorage'; -import refreshOnUpdate from 'virtual:reload-on-update-in-view'; - -refreshOnUpdate('pages/content/injected/toggleTheme'); - -async function toggleTheme() { - console.log('initial theme!', await exampleThemeStorage.get()); - await exampleThemeStorage.toggle(); - console.log('toggled theme', await exampleThemeStorage.get()); -} - -void toggleTheme(); diff --git a/src/pages/content/style.scss b/src/pages/content/style.scss deleted file mode 100644 index b504779dd..000000000 --- a/src/pages/content/style.scss +++ /dev/null @@ -1,7 +0,0 @@ -@import '@assets/style/theme.scss'; - -// CSS that can pollute global styles. Use it with caution. -// If you use ShodowRoot for style pollution, this style will not be applied inside the content script. -.content-view-style-may-be-not-working { - font-size: 30px; -} diff --git a/src/pages/content/ui/app.test.tsx b/src/pages/content/ui/app.test.tsx deleted file mode 100644 index 2a6c5abb9..000000000 --- a/src/pages/content/ui/app.test.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { describe, test } from 'vitest'; -import { render, screen } from '@testing-library/react'; -import App from '@pages/content/ui/app'; - -describe('appTest', () => { - test('render text', () => { - // given - const text = 'content view'; - - // when - render(); - - // then - screen.getByText(text); - }); -}); diff --git a/src/pages/content/ui/app.tsx b/src/pages/content/ui/app.tsx deleted file mode 100644 index f732ea4ae..000000000 --- a/src/pages/content/ui/app.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { useEffect } from 'react'; - -export default function App() { - useEffect(() => { - console.log('content view loaded'); - }, []); - - return
content view
; -} diff --git a/src/pages/content/ui/index.ts b/src/pages/content/ui/index.ts deleted file mode 100644 index 8e1d99ce6..000000000 --- a/src/pages/content/ui/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * DO NOT USE import someModule from '...'; - * - * @issue-url https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/160 - * - * Chrome extensions don't support modules in content scripts. - * If you want to use other modules in content scripts, you need to import them via these files. - * - */ -import('@pages/content/ui/root'); diff --git a/src/pages/content/ui/injected.css b/src/pages/content/ui/injected.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/pages/content/ui/root.tsx b/src/pages/content/ui/root.tsx deleted file mode 100644 index 90898f6fa..000000000 --- a/src/pages/content/ui/root.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { createRoot } from 'react-dom/client'; -import App from '@pages/content/ui/app'; -import refreshOnUpdate from 'virtual:reload-on-update-in-view'; -import injectedStyle from './injected.css?inline'; - -refreshOnUpdate('pages/content'); - -const root = document.createElement('div'); -root.id = 'chrome-extension-boilerplate-react-vite-content-view-root'; - -document.body.append(root); - -const rootIntoShadow = document.createElement('div'); -rootIntoShadow.id = 'shadow-root'; - -const shadowRoot = root.attachShadow({ mode: 'open' }); -shadowRoot.appendChild(rootIntoShadow); - -/** Inject styles into shadow dom */ -const styleElement = document.createElement('style'); -styleElement.innerHTML = injectedStyle; -shadowRoot.appendChild(styleElement); - -/** - * https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/pull/174 - * - * In the firefox environment, the adoptedStyleSheets bug may prevent contentStyle from being applied properly. - * Please refer to the PR link above and go back to the contentStyle.css implementation, or raise a PR if you have a better way to improve it. - */ - -createRoot(rootIntoShadow).render(); diff --git a/src/pages/devtools/index.ts b/src/pages/devtools/index.ts deleted file mode 100644 index 7709c9158..000000000 --- a/src/pages/devtools/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -try { - chrome.devtools.panels.create('Dev Tools', 'icon-34.png', 'src/pages/panel/index.html'); -} catch (e) { - console.error(e); -} diff --git a/src/pages/newtab/Newtab.css b/src/pages/newtab/Newtab.css deleted file mode 100644 index 9edbccf45..000000000 --- a/src/pages/newtab/Newtab.css +++ /dev/null @@ -1,37 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/pages/newtab/Newtab.tsx b/src/pages/newtab/Newtab.tsx deleted file mode 100644 index 7ea35cac0..000000000 --- a/src/pages/newtab/Newtab.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; -import logo from '@assets/img/logo.svg'; -import '@pages/newtab/Newtab.css'; -import '@pages/newtab/Newtab.scss'; -import useStorage from '@src/shared/hooks/useStorage'; -import exampleThemeStorage from '@src/shared/storages/exampleThemeStorage'; -import withSuspense from '@src/shared/hoc/withSuspense'; -import withErrorBoundary from '@src/shared/hoc/withErrorBoundary'; - -const Newtab = () => { - const theme = useStorage(exampleThemeStorage); - - return ( -
-
- logo -

- Edit src/pages/newtab/Newtab.tsx and save to reload. -

- - Learn React! - -
The color of this paragraph is defined using SASS.
- -
-
- ); -}; - -export default withErrorBoundary(withSuspense(Newtab,
Loading ...
),
Error Occur
); diff --git a/src/pages/options/Options.css b/src/pages/options/Options.css deleted file mode 100644 index 1ea51cba6..000000000 --- a/src/pages/options/Options.css +++ /dev/null @@ -1,8 +0,0 @@ -.container { - width: 100%; - height: 50vh; - font-size: 2rem; - display: flex; - align-items: center; - justify-content: center; -} diff --git a/src/pages/options/Options.tsx b/src/pages/options/Options.tsx deleted file mode 100644 index 648ffc11f..000000000 --- a/src/pages/options/Options.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; -import '@pages/options/Options.css'; - -const Options: React.FC = () => { - return
Options
; -}; - -export default Options; diff --git a/src/pages/options/index.css b/src/pages/options/index.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/pages/panel/Panel.css b/src/pages/panel/Panel.css deleted file mode 100644 index 8a50bc802..000000000 --- a/src/pages/panel/Panel.css +++ /dev/null @@ -1,7 +0,0 @@ -body { - background-color: #242424; -} - -.container { - color: #ffffff; -} diff --git a/src/pages/panel/Panel.tsx b/src/pages/panel/Panel.tsx deleted file mode 100644 index 2bdfa374d..000000000 --- a/src/pages/panel/Panel.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; -import '@pages/panel/Panel.css'; - -const Panel: React.FC = () => { - return ( -
-

Dev Tools Panel

-
- ); -}; - -export default Panel; diff --git a/src/pages/panel/index.css b/src/pages/panel/index.css deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/pages/popup/Popup.tsx b/src/pages/popup/Popup.tsx deleted file mode 100644 index 83a8e364e..000000000 --- a/src/pages/popup/Popup.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import logo from '@assets/img/logo.svg'; -import '@pages/popup/Popup.css'; -import useStorage from '@src/shared/hooks/useStorage'; -import exampleThemeStorage from '@src/shared/storages/exampleThemeStorage'; -import withSuspense from '@src/shared/hoc/withSuspense'; -import withErrorBoundary from '@src/shared/hoc/withErrorBoundary'; - -const Popup = () => { - const theme = useStorage(exampleThemeStorage); - - return ( -
-
- logo -

- Edit src/pages/popup/Popup.tsx and save to reload. -

- - Learn React! - - -
-
- ); -}; - -export default withErrorBoundary(withSuspense(Popup,
Loading ...
),
Error Occur
); diff --git a/src/pages/sidepanel/SidePanel.tsx b/src/pages/sidepanel/SidePanel.tsx deleted file mode 100644 index 3a7e7d20a..000000000 --- a/src/pages/sidepanel/SidePanel.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import logo from '@assets/img/logo.svg'; -import '@pages/sidepanel/SidePanel.css'; -import useStorage from '@src/shared/hooks/useStorage'; -import exampleThemeStorage from '@src/shared/storages/exampleThemeStorage'; -import withSuspense from '@src/shared/hoc/withSuspense'; -import withErrorBoundary from '@src/shared/hoc/withErrorBoundary'; - -const SidePanel = () => { - const theme = useStorage(exampleThemeStorage); - - return ( -
-
- logo -

- Edit src/pages/sidepanel/SidePanel.tsx and save to reload. -

- - Learn React! - - -
-
- ); -}; - -export default withErrorBoundary(withSuspense(SidePanel,
Loading ...
),
Error Occur
); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2a..000000000 --- a/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/test-utils/vitest.setup.js b/test-utils/vitest.setup.js deleted file mode 100644 index 43c1d8520..000000000 --- a/test-utils/vitest.setup.js +++ /dev/null @@ -1,2 +0,0 @@ -// Do what you need to set up your test -console.log('setup test: vitest.setup.js'); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 25d970e35..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "compilerOptions": { - "noEmit": true, - "baseUrl": ".", - "allowJs": false, - "target": "esnext", - "module": "esnext", - "jsx": "react-jsx", - "skipLibCheck": true, - "esModuleInterop": true, - "resolveJsonModule": true, - "moduleResolution": "node", - "types": ["vite/client", "node"], - "noFallthroughCasesInSwitch": true, - "allowSyntheticDefaultImports": true, - "lib": ["dom", "dom.iterable", "esnext"], - "forceConsistentCasingInFileNames": true, - "typeRoots": ["./src/global.d.ts", "node_modules/@types"], - "paths": { - "@root/*": ["./*"], - "@src/*": ["src/*"], - "@assets/*": ["src/assets/*"], - "@pages/*": ["src/pages/*"], - "virtual:reload-on-update-in-background-script": ["./src/global.d.ts"], - "virtual:reload-on-update-in-view": ["./src/global.d.ts"] - } - }, - "include": ["src", "utils", "vite.config.ts", "node_modules/@types"] -} diff --git a/turbo.json b/turbo.json new file mode 100644 index 000000000..143307984 --- /dev/null +++ b/turbo.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://turbo.build/schema.json", + "pipeline": { + "dev": { + "dependsOn": ["^build"], + "outputs": ["dist/**", "build/**"], + "persistent": true + }, + "build": { + "dependsOn": ["clean", "^clean", "^build"], + "outputs": ["../../dist/**", "dist/**", "build/**"] + }, + "type-check": { + "cache": false + }, + "lint": { + "cache": false + }, + "lint:fix": { + "cache": false + }, + "prettier": { + "cache": false + }, + "test": { + "dependsOn": [ + "^test", "^build" + ], + "cache": false + }, + "clean": { + "cache": false + } + } +} diff --git a/utils/manifest-parser/index.ts b/utils/manifest-parser/index.ts deleted file mode 100644 index cd7594d43..000000000 --- a/utils/manifest-parser/index.ts +++ /dev/null @@ -1,35 +0,0 @@ -type Manifest = chrome.runtime.ManifestV3; - -class ManifestParser { - // eslint-disable-next-line @typescript-eslint/no-empty-function - private constructor() {} - - static convertManifestToString(manifest: Manifest): string { - if (process.env.__FIREFOX__) { - manifest = this.convertToFirefoxCompatibleManifest(manifest); - } - return JSON.stringify(manifest, null, 2); - } - - static convertToFirefoxCompatibleManifest(manifest: Manifest) { - const manifestCopy = { - ...manifest, - } as { [key: string]: unknown }; - - manifestCopy.background = { - scripts: [manifest.background?.service_worker], - type: 'module', - }; - manifestCopy.options_ui = { - page: manifest.options_page, - browser_style: false, - }; - manifestCopy.content_security_policy = { - extension_pages: "script-src 'self'; object-src 'self'", - }; - delete manifestCopy.options_page; - return manifestCopy as Manifest; - } -} - -export default ManifestParser; diff --git a/utils/plugins/add-hmr.ts b/utils/plugins/add-hmr.ts deleted file mode 100644 index eb058cd85..000000000 --- a/utils/plugins/add-hmr.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as path from 'path'; -import { readFileSync } from 'fs'; -import type { PluginOption } from 'vite'; - -const DUMMY_CODE = `export default function(){};`; - -function getInjectionCode(fileName: string): string { - return readFileSync(path.resolve(__dirname, '..', 'reload', 'injections', fileName), { encoding: 'utf8' }); -} - -type Config = { - isDev: boolean; - background: boolean; - view: boolean; -}; - -export default function addHmr(config: Config): PluginOption { - const { background, view, isDev } = config; - const idInBackgroundScript = 'virtual:reload-on-update-in-background-script'; - const idInView = 'virtual:reload-on-update-in-view'; - - const scriptHmrCode = isDev ? getInjectionCode('script.js') : DUMMY_CODE; - const viewHmrCode = isDev ? getInjectionCode('view.js') : DUMMY_CODE; - - return { - name: 'add-hmr', - resolveId(id) { - if (id === idInBackgroundScript || id === idInView) { - return getResolvedId(id); - } - }, - load(id) { - if (id === getResolvedId(idInBackgroundScript)) { - return background ? scriptHmrCode : DUMMY_CODE; - } - - if (id === getResolvedId(idInView)) { - return view ? viewHmrCode : DUMMY_CODE; - } - }, - }; -} - -function getResolvedId(id: string) { - return '\0' + id; -} diff --git a/utils/plugins/custom-dynamic-import.ts b/utils/plugins/custom-dynamic-import.ts deleted file mode 100644 index 52090076a..000000000 --- a/utils/plugins/custom-dynamic-import.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { PluginOption } from 'vite'; - -export default function customDynamicImport(): PluginOption { - return { - name: 'custom-dynamic-import', - renderDynamicImport({ moduleId }) { - if (!moduleId.includes('node_modules') && process.env.__FIREFOX__) { - return { - left: ` - { - const dynamicImport = (path) => import(path); - dynamicImport(browser.runtime.getURL('./') + - `, - right: ".split('../').join(''))}", - }; - } - return { - left: 'import(', - right: ')', - }; - }, - }; -} diff --git a/utils/plugins/inline-vite-preload-script.ts b/utils/plugins/inline-vite-preload-script.ts deleted file mode 100644 index 2b9d9b703..000000000 --- a/utils/plugins/inline-vite-preload-script.ts +++ /dev/null @@ -1,31 +0,0 @@ -import type { PluginOption } from 'vite'; -import MagicString from 'magic-string'; - -/** - * solution for multiple content scripts - * https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/177#issuecomment-1784112536 - */ -export default function inlineVitePreloadScript(): PluginOption { - let __vitePreload = ''; - return { - name: 'replace-vite-preload-script-plugin', - async renderChunk(code, chunk, options, meta) { - if (!/content/.test(chunk.fileName)) { - return null; - } - if (!__vitePreload) { - const chunkName: string | undefined = Object.keys(meta.chunks).find(key => /preload/.test(key)); - const modules = meta.chunks?.[chunkName]?.modules; - __vitePreload = modules?.[Object.keys(modules)?.[0]]?.code; - __vitePreload = __vitePreload?.replaceAll('const ', 'var '); - if (!__vitePreload) { - return null; - } - } - return { - code: `(function () {${__vitePreload + code.split(`\n`).slice(1).join(`\n`)}})()`, - map: new MagicString(code).generateMap({ hires: true }), - }; - }, - }; -} diff --git a/utils/plugins/watch-rebuild.ts b/utils/plugins/watch-rebuild.ts deleted file mode 100644 index d3f6d694d..000000000 --- a/utils/plugins/watch-rebuild.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { PluginOption } from 'vite'; -import { WebSocket } from 'ws'; -import MessageInterpreter from '../reload/interpreter'; -import { LOCAL_RELOAD_SOCKET_URL } from '../reload/constant'; - -export default function watchRebuild(config: { afterWriteBundle: () => void }): PluginOption { - const ws = new WebSocket(LOCAL_RELOAD_SOCKET_URL); - return { - name: 'watch-rebuild', - writeBundle() { - /** - * When the build is complete, send a message to the reload server. - * The reload server will send a message to the client to reload or refresh the extension. - */ - ws.send(MessageInterpreter.send({ type: 'build_complete' })); - - sendNextQueue(() => { - config.afterWriteBundle(); - }); - }, - }; -} - -function sendNextQueue(callback: () => void) { - setTimeout(() => { - callback(); - }, 0); -} diff --git a/utils/reload/initReloadClient.ts b/utils/reload/initReloadClient.ts deleted file mode 100644 index 1cd3fb04e..000000000 --- a/utils/reload/initReloadClient.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { LOCAL_RELOAD_SOCKET_URL } from './constant'; -import MessageInterpreter from './interpreter'; - -let needToUpdate = false; - -export default function initReloadClient({ - watchPath, - onUpdate, - onForceReload, -}: { - watchPath: string; - onUpdate: () => void; - onForceReload?: () => void; -}): WebSocket { - const socket = new WebSocket(LOCAL_RELOAD_SOCKET_URL); - - function sendUpdateCompleteMessage() { - socket.send(MessageInterpreter.send({ type: 'done_update' })); - } - - socket.addEventListener('message', event => { - const message = MessageInterpreter.receive(String(event.data)); - - switch (message.type) { - case 'do_update': { - if (needToUpdate) { - sendUpdateCompleteMessage(); - needToUpdate = false; - onUpdate(); - } - return; - } - case 'wait_update': { - if (!needToUpdate) { - needToUpdate = message.path.includes(watchPath); - } - return; - } - case 'force_reload': { - onForceReload?.(); - return; - } - } - }); - - socket.onclose = () => { - console.log( - `Reload server disconnected.\nPlease check if the WebSocket server is running properly on ${LOCAL_RELOAD_SOCKET_URL}. This feature detects changes in the code and helps the browser to reload the extension or refresh the current tab.`, - ); - setTimeout(() => { - initReloadClient({ watchPath, onUpdate }); - }, 1000); - }; - - return socket; -} diff --git a/utils/reload/initReloadServer.ts b/utils/reload/initReloadServer.ts deleted file mode 100644 index d2b89755d..000000000 --- a/utils/reload/initReloadServer.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { WebSocket, WebSocketServer } from 'ws'; -import chokidar from 'chokidar'; -import { LOCAL_RELOAD_SOCKET_PORT, LOCAL_RELOAD_SOCKET_URL } from './constant'; -import MessageInterpreter from './interpreter'; -import { debounce } from './utils'; - -const clientsThatNeedToUpdate: Set = new Set(); -let needToForceReload = false; - -function initReloadServer() { - const wss = new WebSocketServer({ port: LOCAL_RELOAD_SOCKET_PORT }); - - wss.on('listening', () => console.log(`[HRS] Server listening at ${LOCAL_RELOAD_SOCKET_URL}`)); - - wss.on('connection', ws => { - clientsThatNeedToUpdate.add(ws); - - ws.addEventListener('close', () => clientsThatNeedToUpdate.delete(ws)); - ws.addEventListener('message', event => { - if (typeof event.data !== 'string') return; - - const message = MessageInterpreter.receive(event.data); - - if (message.type === 'done_update') { - ws.close(); - } - if (message.type === 'build_complete') { - clientsThatNeedToUpdate.forEach((ws: WebSocket) => ws.send(MessageInterpreter.send({ type: 'do_update' }))); - if (needToForceReload) { - needToForceReload = false; - clientsThatNeedToUpdate.forEach((ws: WebSocket) => - ws.send(MessageInterpreter.send({ type: 'force_reload' })), - ); - } - } - }); - }); -} - -/** CHECK:: src file was updated **/ -const debounceSrc = debounce(function (path: string) { - // Normalize path on Windows - const pathConverted = path.replace(/\\/g, '/'); - clientsThatNeedToUpdate.forEach((ws: WebSocket) => - ws.send(MessageInterpreter.send({ type: 'wait_update', path: pathConverted })), - ); -}, 100); -chokidar.watch('src', { ignorePermissionErrors: true }).on('all', (_, path) => debounceSrc(path)); - -/** CHECK:: manifest.js was updated **/ -chokidar.watch('manifest.js', { ignorePermissionErrors: true }).on('all', () => { - needToForceReload = true; -}); - -initReloadServer(); diff --git a/utils/reload/injections/script.ts b/utils/reload/injections/script.ts deleted file mode 100644 index 01dee5692..000000000 --- a/utils/reload/injections/script.ts +++ /dev/null @@ -1,13 +0,0 @@ -import initReloadClient from '../initReloadClient'; - -export default function addHmrIntoScript(watchPath: string) { - const reload = () => { - chrome.runtime.reload(); - }; - - initReloadClient({ - watchPath, - onUpdate: reload, - onForceReload: reload, - }); -} diff --git a/utils/reload/interpreter/types.ts b/utils/reload/interpreter/types.ts deleted file mode 100644 index b73762c40..000000000 --- a/utils/reload/interpreter/types.ts +++ /dev/null @@ -1,18 +0,0 @@ -type UpdatePendingMessage = { - type: 'wait_update'; - path: string; -}; -type UpdateRequestMessage = { - type: 'do_update'; -}; -type UpdateCompleteMessage = { type: 'done_update' }; -type BuildCompletionMessage = { type: 'build_complete' }; -type ForceReloadMessage = { type: 'force_reload' }; - -export type SerializedMessage = string; -export type WebSocketMessage = - | UpdateCompleteMessage - | UpdateRequestMessage - | UpdatePendingMessage - | BuildCompletionMessage - | ForceReloadMessage; diff --git a/utils/reload/rollup.config.mjs b/utils/reload/rollup.config.mjs deleted file mode 100644 index a2ef89dce..000000000 --- a/utils/reload/rollup.config.mjs +++ /dev/null @@ -1,33 +0,0 @@ -import sucrase from '@rollup/plugin-sucrase'; - -const plugins = [ - sucrase({ - exclude: ['node_modules/**'], - transforms: ['typescript'], - }), -]; - -export default [ - { - plugins, - input: 'utils/reload/initReloadServer.ts', - output: { - file: 'utils/reload/initReloadServer.js', - }, - external: ['ws', 'chokidar', 'timers'], - }, - { - plugins, - input: 'utils/reload/injections/script.ts', - output: { - file: 'utils/reload/injections/script.js', - }, - }, - { - plugins, - input: 'utils/reload/injections/view.ts', - output: { - file: 'utils/reload/injections/view.js', - }, - }, -]; diff --git a/utils/vite.ts b/utils/vite.ts deleted file mode 100644 index 16bbc7b79..000000000 --- a/utils/vite.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { type PluginOption } from 'vite'; -import makeManifest from './plugins/make-manifest'; -import customDynamicImport from './plugins/custom-dynamic-import'; -import addHmr from './plugins/add-hmr'; -import watchRebuild from './plugins/watch-rebuild'; -import inlineVitePreloadScript from './plugins/inline-vite-preload-script'; - -export const getPlugins = (isDev: boolean): PluginOption[] => [ - makeManifest({ getCacheInvalidationKey }), - customDynamicImport(), - // You can toggle enable HMR in background script or view - addHmr({ background: true, view: true, isDev }), - isDev && watchRebuild({ afterWriteBundle: regenerateCacheInvalidationKey }), - // For fix issue#177 (https://github.com/Jonghakseo/chrome-extension-boilerplate-react-vite/issues/177) - inlineVitePreloadScript(), -]; - -const cacheInvalidationKeyRef = { current: generateKey() }; - -export function getCacheInvalidationKey() { - return cacheInvalidationKeyRef.current; -} - -function regenerateCacheInvalidationKey() { - cacheInvalidationKeyRef.current = generateKey(); - return cacheInvalidationKeyRef; -} - -function generateKey(): string { - return `${Date.now().toFixed()}`; -} diff --git a/vite.config.ts b/vite.config.ts deleted file mode 100644 index e663f8ea0..000000000 --- a/vite.config.ts +++ /dev/null @@ -1,63 +0,0 @@ -/// -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; -import path, { resolve } from 'path'; -import { getCacheInvalidationKey, getPlugins } from './utils/vite'; - -const rootDir = resolve(__dirname); -const srcDir = resolve(rootDir, 'src'); -const pagesDir = resolve(srcDir, 'pages'); - -const isDev = process.env.__DEV__ === 'true'; -const isProduction = !isDev; - -export default defineConfig({ - resolve: { - alias: { - '@root': rootDir, - '@src': srcDir, - '@assets': resolve(srcDir, 'assets'), - '@pages': pagesDir, - }, - }, - plugins: [...getPlugins(isDev), react()], - publicDir: resolve(rootDir, 'public'), - build: { - outDir: resolve(rootDir, 'dist'), - /** Can slow down build speed. */ - // sourcemap: isDev, - minify: isProduction, - modulePreload: false, - reportCompressedSize: isProduction, - emptyOutDir: !isDev, - rollupOptions: { - input: { - devtools: resolve(pagesDir, 'devtools', 'index.html'), - panel: resolve(pagesDir, 'panel', 'index.html'), - contentInjected: resolve(pagesDir, 'content', 'injected', 'index.ts'), - contentUI: resolve(pagesDir, 'content', 'ui', 'index.ts'), - background: resolve(pagesDir, 'background', 'index.ts'), - contentStyle: resolve(pagesDir, 'content', 'style.scss'), - popup: resolve(pagesDir, 'popup', 'index.html'), - newtab: resolve(pagesDir, 'newtab', 'index.html'), - options: resolve(pagesDir, 'options', 'index.html'), - sidepanel: resolve(pagesDir, 'sidepanel', 'index.html'), - }, - output: { - entryFileNames: 'src/pages/[name]/index.js', - chunkFileNames: isDev ? 'assets/js/[name].js' : 'assets/js/[name].[hash].js', - assetFileNames: assetInfo => { - const { name } = path.parse(assetInfo.name); - const assetFileName = name === 'contentStyle' ? `${name}${getCacheInvalidationKey()}` : name; - return `assets/[ext]/${assetFileName}.chunk.[ext]`; - }, - }, - }, - }, - test: { - globals: true, - environment: 'jsdom', - include: ['**/*.test.ts', '**/*.test.tsx'], - setupFiles: './test-utils/vitest.setup.js', - }, -});