From 2d9cd62d7107eefa693f304f561b82bd7ef4b808 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 14 Jan 2024 16:12:25 +0100 Subject: [PATCH 01/77] test new repo format and add support izzys repo --- Website/package.json | 4 +- Website/src/activitys/ModuleViewActivity.tsx | 294 +++++------------- Website/src/activitys/ProfileActivity.tsx | 250 +++++++-------- .../components/LocalRepository.tsx | 178 ++++++----- .../components/RecommendedRepo.tsx | 43 --- Website/src/activitys/RepoActivity/index.tsx | 46 +-- Website/src/components/DeviceModule.tsx | 20 +- Website/src/components/ExploreModule.tsx | 31 +- Website/src/hooks/useRepos.tsx | 62 ++-- Website/src/hooks/useSettings.tsx | 2 - Website/src/locales/de.json | 1 + Website/src/locales/en.json | 1 + Website/src/typings/global.d.ts | 221 ++++++++----- 13 files changed, 494 insertions(+), 659 deletions(-) delete mode 100644 Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx diff --git a/Website/package.json b/Website/package.json index 899376ed..ef202ab1 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,8 +5,8 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "1.13.9", - "version_code": 1139 + "version_name": "2.13.9", + "version_code": 2139 }, "main": "index.tsx", "keywords": [], diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index 732f57fc..c6cb5edb 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -52,7 +52,8 @@ import TerminalIcon from "@mui/icons-material/Terminal"; import { isLiteralObject } from "@Util/util"; import { useLowQualityModule } from "@Hooks/useLowQualityModule"; import AvatarGroup from "@mui/material/AvatarGroup"; -import ProfileActivty from "./ProfileActivity"; +import FormatAlignLeftIcon from "@mui/icons-material/FormatAlignLeft"; +// import ProfileActivty from "./ProfileActivity"; import { useModConf } from "@Hooks/useModConf"; function a11yProps(index: number) { @@ -62,17 +63,17 @@ function a11yProps(index: number) { }; } -function pickFourElements(jsonArray: Array): Array { - if (jsonArray.length <= 4) { - // Return the array as is if it contains 4 or fewer elements - return jsonArray; - } else { - // Shuffle the array to randomize the selection - const shuffledArray = jsonArray.sort(() => Math.random() - 0.5); - // Return the first four elements of the shuffled array - return shuffledArray.slice(0, 4); - } -} +// function pickFourElements(jsonArray: Array): Array { +// if (jsonArray.length <= 4) { +// // Return the array as is if it contains 4 or fewer elements +// return jsonArray; +// } else { +// // Shuffle the array to randomize the selection +// const shuffledArray = jsonArray.sort(() => Math.random() - 0.5); +// // Return the first four elements of the shuffled array +// return shuffledArray.slice(0, 4); +// } +// } interface TabPanelProps { children?: React.ReactNode; @@ -98,17 +99,18 @@ const ModuleViewActivity = () => { const { context, extra } = useActivity(); const log = useLog("ModuleViewActivity"); - const { id, name, version, versionCode, description, author, readme, about, download, mmrl, fox, last_update, updateJson, verified } = - extra; + const { id, name, version, versionCode, description, author, versions, track } = extra; + + const categories = useCategories(track.categories); + // const { data } = useFetch(readme); + const data = undefined; + + const latestVersion = React.useMemo(() => versions[versions.length - 1], [versions]); - const categories = useCategories(mmrl.categories); - const { data } = useFetch(readme); - const formatLastUpdate = useFormatDate(last_update); + const formatLastUpdate = useFormatDate(latestVersion.timestamp); const { modConf, __modConf } = useModConf(); const hasInstallTools = SuFile.exist(`${modConf("MMRLINI")}/module.prop`); - - const { SupportIcon, supportText } = useSupportIconForUrl(fox.support); const search = React.useMemo(() => new URLSearchParams(window.location.search), [window.location.search]); @@ -176,7 +178,7 @@ const ModuleViewActivity = () => { color: "white", }} > - {mmrl.cover && ( + {track.cover && ( ({ background: `linear-gradient(to top,${theme.palette.primary.main} 0,rgba(0,0,0,0) 56%)`, @@ -194,7 +196,7 @@ const ModuleViewActivity = () => { }, objectFit: "cover", })} - image={mmrl.cover} + image={track.cover} alt={name} /> @@ -202,7 +204,7 @@ const ModuleViewActivity = () => { ({ - pt: mmrl.cover ? 0 : 2, + pt: track.cover ? 0 : 2, pl: 2, pr: 2, pb: 2, @@ -230,7 +232,7 @@ const ModuleViewActivity = () => { mr: 1.5, fontSize: 50, })} - src={mmrl.logo} + src={track.logo} > {name.charAt(0).toUpperCase()} @@ -240,7 +242,7 @@ const ModuleViewActivity = () => { {name} - {mmrl.author ? ( + {/* {track.author ? ( { onClick={() => { context.pushPage({ component: ProfileActivty, - key: mmrl.author?.name + "_ProfileActivty", - extra: mmrl.author, + key: track.author?.name + "_ProfileActivty", + extra: track.author, }); }} > - {mmrl.author.name} {mmrl.author.verified && } + {track.author.name} {track.author.verified && } ) : ( {author} - )} + )} */} + + + {author} + @@ -281,7 +287,7 @@ const ModuleViewActivity = () => { alignItems="flex-start" spacing={1} > - {mmrl.author && mmrl.contributors && ( + {/* {track.author && track.contributors && ( Contributors @@ -307,7 +313,7 @@ const ModuleViewActivity = () => { ))} - )} + )} */} {/* DL SECTION */} @@ -324,8 +330,8 @@ const ModuleViewActivity = () => { {version} ({versionCode}) - - {fox.support && ( + + {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools && ( )} - - {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools && ( - - )} - - - + @@ -410,29 +390,6 @@ const ModuleViewActivity = () => { - {mmrl.developerNote && ( - - Developer Note - {mmrl.developerNote.note} - - )} - {fox.minApi && os.sdk <= fox.minApi && ( - - {strings("unsupported")} - {strings("require_sdk", { sdk: parseAndroidVersion(fox.minApi) })} - - )} - {isLowQuality && ( {strings("low_quality_module")} @@ -440,7 +397,7 @@ const ModuleViewActivity = () => { )} - {mmrl.screenshots && ( + {track.screenshots && ( @@ -459,7 +416,7 @@ const ModuleViewActivity = () => { gridAutoColumns: "minmax(250px, 1fr)", }} > - {mmrl.screenshots.map((image, i) => ( + {track.screenshots.map((image, i) => ( ({ ml: 1, @@ -521,7 +478,7 @@ const ModuleViewActivity = () => { extra: { desc: data, name: name, - logo: mmrl.logo, + logo: track.logo, }, }); }} @@ -532,7 +489,7 @@ const ModuleViewActivity = () => { - {isLiteralObject(description) ? String((description as ModuleDescription)[currentLanguage]) : String(description)} + {description} {strings("updated_on")} @@ -558,7 +515,7 @@ const ModuleViewActivity = () => { ) : null} - {mmrl.require && ( + {track.require && ( { }} > - {mmrl.require.map((req) => { + {track.require.map((req) => { const findRequire = React.useMemo(() => modules.find((module) => module.id === req), [modules]); if (findRequire) { @@ -615,91 +572,11 @@ const ModuleViewActivity = () => { )} - - - - - {strings("requirements")} - - - - - {strings("access")}} - > - - - - - - - - - - - - - - {strings("minimum")}} - > - - - - - - - - - - - - - - {strings("recommended")}} - > - - - - - - - {verified && ( + {track.verified && ( @@ -708,28 +585,19 @@ const ModuleViewActivity = () => { )} - {updateJson && ( - - - - - - - )} - - {about.language && ( + {track.license && ( - + - + )} - {about.issues && ( + {track.support && ( { - os.open(about.issues, { + os.open(track.support, { target: "_blank", features: { color: theme.palette.primary.main, @@ -740,13 +608,13 @@ const ModuleViewActivity = () => { - + )} { - os.open(about.source, { + os.open(track.source, { target: "_blank", features: { color: theme.palette.primary.main, @@ -757,7 +625,7 @@ const ModuleViewActivity = () => { - + diff --git a/Website/src/activitys/ProfileActivity.tsx b/Website/src/activitys/ProfileActivity.tsx index a9792dd4..46b4cd3a 100644 --- a/Website/src/activitys/ProfileActivity.tsx +++ b/Website/src/activitys/ProfileActivity.tsx @@ -1,134 +1,134 @@ -import { useActivity } from "@Hooks/useActivity"; -import { Toolbar } from "@Components/onsenui/Toolbar"; -import { Page } from "@Components/onsenui/Page"; -import { useStrings } from "@Hooks/useStrings"; -import Stack from "@mui/material/Stack"; -import VerifiedIcon from "@mui/icons-material/Verified"; -import Grid from "@mui/material/Grid"; -import { CardMedia, Box, Typography, Card, SxProps, Theme, Paper, CardContent } from "@mui/material"; -import { colors } from "@Hooks/useSettings"; -import { useRepos } from "@Hooks/useRepos"; -import { ExploreModule } from "@Components/ExploreModule"; -import React from "react"; +// import { useActivity } from "@Hooks/useActivity"; +// import { Toolbar } from "@Components/onsenui/Toolbar"; +// import { Page } from "@Components/onsenui/Page"; +// import { useStrings } from "@Hooks/useStrings"; +// import Stack from "@mui/material/Stack"; +// import VerifiedIcon from "@mui/icons-material/Verified"; +// import Grid from "@mui/material/Grid"; +// import { CardMedia, Box, Typography, Card, SxProps, Theme, Paper, CardContent } from "@mui/material"; +// import { colors } from "@Hooks/useSettings"; +// import { useRepos } from "@Hooks/useRepos"; +// import { ExploreModule } from "@Components/ExploreModule"; +// import React from "react"; -const badgeStyle: (color: (typeof colors)["blue" | "teal" | "red" | "orange"]) => SxProps = (color) => { - return { - px: 1, - py: 0.5, - borderRadius: 1, - display: "flex", - typography: "caption", - bgcolor: (theme) => (theme.palette.mode === "dark" ? color[900] : color[50]), - color: (theme) => (theme.palette.mode === "dark" ? "#fff" : color[700]), - }; -}; +// const badgeStyle: (color: (typeof colors)["blue" | "teal" | "red" | "orange"]) => SxProps = (color) => { +// return { +// px: 1, +// py: 0.5, +// borderRadius: 1, +// display: "flex", +// typography: "caption", +// bgcolor: (theme) => (theme.palette.mode === "dark" ? color[900] : color[50]), +// color: (theme) => (theme.palette.mode === "dark" ? "#fff" : color[700]), +// }; +// }; -const ProfileActivty = React.memo(() => { - const { strings } = useStrings(); - const { modules } = useRepos(); - const { context, extra } = useActivity(); +// const ProfileActivty = React.memo(() => { +// const { strings } = useStrings(); +// const { modules } = useRepos(); +// const { context, extra } = useActivity(); - const { name, bio, avatar, verified, followers } = extra; +// const { name, bio, avatar, verified, followers } = extra; - const renderToolbar = () => { - return ( - - - - - {name} - - ); - }; +// const renderToolbar = () => { +// return ( +// +// +// +// +// {name} +// +// ); +// }; - return ( - - - - - - - - - {name} {verified && } - - {followers} followers - - - - +// return ( +// +// +// +// +// +// +// +// +// {name} {verified && } +// +// {followers} followers +// +// +// +// - {bio && ( - - - - Biography - - - {bio} - - - - )} +// {bio && ( +// +// +// +// Biography +// +// +// {bio} +// +// +// +// )} - - - - Participating - - +// +// +// +// Participating +// +// - {modules - .filter((m) => m.mmrl.author?.name.includes(name) || m.mmrl.contributors?.find((con) => name == con.name)) - .map((module) => ( - - ))} - - - - ); -}); +// {modules +// .filter((m) => m.mmrl.author?.name.includes(name) || m.mmrl.contributors?.find((con) => name == con.name)) +// .map((module) => ( +// +// ))} +// +// +// +// ); +// }); -export default ProfileActivty; +// export default ProfileActivty; diff --git a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx index a039364d..eca177fc 100644 --- a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx +++ b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx @@ -14,6 +14,10 @@ import { Android12Switch } from "@Components/Android12Switch"; import { os } from "@Native/Os"; import { useFormatDate } from "@Hooks/useFormatDate"; import { useConfirm } from "material-ui-confirm"; +import { useFetch } from "usehooks-ts"; +import { ProgressCircular } from "react-onsenui"; +import Box from "@mui/material/Box"; +import Skeleton from "@mui/material/Skeleton"; interface ListItemProps { part?: any; @@ -23,7 +27,7 @@ interface ListItemProps { } interface LocalRepositoryProps { - repo: StoredRepo; + repo: RepoConfig; } const MListItem = React.memo((props) => { @@ -43,98 +47,106 @@ export const LocalRepository = React.memo((props) => { const { settings } = useSettings(); const confirm = useConfirm(); const { actions } = useRepos(); - const [enabled, setEnabled] = React.useState(!settings.disabled_repos.includes(repo.modules)); - - const formatLastUpdate = useFormatDate(repo.last_update); + const [enabled, setEnabled] = React.useState(!settings.disabled_repos.includes(repo.base_url)); const [open, setOpen] = React.useState(false); + const { data } = useFetch(`${repo.base_url}json/modules.json`); + + const formatLastUpdate = useFormatDate(data ? data.metadata.timestamp * 1000 : 0); + + if (!data) { + return ( + + + + ); + } + const handleClick = () => { setOpen(!open); }; return ( - - - - {open ? : } - + + + {open ? : } + - , checked: boolean) => { - actions.setRepoEnabled({ - id: repo.modules, - callback(state) { - setEnabled(!state.some((elem) => elem === repo.modules)); - }, - }); + , checked: boolean) => { + actions.setRepoEnabled({ + id: repo.base_url, + callback(state) { + setEnabled(!state.some((elem) => elem === repo.base_url)); + }, + }); + }} + checked={enabled} + /> + + + + { + if (repo.website) { + os.open(repo.website); + } + }} + /> + { + if (repo.support) { + os.open(repo.support); + } }} - checked={enabled} /> - - - - { - if (repo.website) { - os.open(repo.website); - } - }} - /> - { - if (repo.support) { - os.open(repo.support); - } - }} - /> - { - if (repo.donate) { - os.open(repo.donate); - } - }} - /> - { - if (repo.submitModule) { - os.open(repo.submitModule); - } - }} - /> - { - confirm({ - title: "Delete?", - confirmationText: "Sure", - description: strings("confirm_repo_delete", { - name: repo.name, - }), - }).then(() => { - actions.removeRepo({ - id: repo.modules, - }); + { + if (repo.donate) { + os.open(repo.donate); + } + }} + /> + { + if (repo.submission) { + os.open(repo.submission); + } + }} + /> + { + confirm({ + title: "Delete?", + confirmationText: "Sure", + description: strings("confirm_repo_delete", { + name: repo.name, + }), + }).then(() => { + actions.removeRepo({ + id: repo.base_url, }); - }} - /> - - - - + }); + }} + /> + + + ); }); diff --git a/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx b/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx deleted file mode 100644 index 2d2dcf7f..00000000 --- a/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import Icon from "@Components/Icon"; -import Box from "@mui/material/Box"; -import IconButton from "@mui/material/IconButton"; -import Typography from "@mui/material/Typography"; -import AddIcon from "@mui/icons-material/Add"; -import { StyledCard } from "@Components/StyledCard"; -import { useRepos } from "@Hooks/useRepos"; -import { os } from "@Native/Os"; -import { ListItem, ListItemText } from "@mui/material"; -import { StyledListItemText } from "@Components/StyledListItemText"; - -interface RecommendedRepoProps { - name: string; - link: string; -} - -export const RecommendedRepo = (props: RecommendedRepoProps) => { - const { actions } = useRepos(); - - return ( - { - actions.addRepo({ - url: props.link, - callback: (state) => {}, - error: (error) => { - os.toast(error, Toast.LENGTH_SHORT); - }, - }); - }} - > - - - } - > - - - ); -}; diff --git a/Website/src/activitys/RepoActivity/index.tsx b/Website/src/activitys/RepoActivity/index.tsx index 998fae4a..b7dc1a82 100644 --- a/Website/src/activitys/RepoActivity/index.tsx +++ b/Website/src/activitys/RepoActivity/index.tsx @@ -22,43 +22,9 @@ import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { os } from "@Native/Os"; import { useStrings } from "@Hooks/useStrings"; import { Page } from "@Components/onsenui/Page"; -import { RecommendedRepo } from "./components/RecommendedRepo"; import { LocalRepository } from "./components/LocalRepository"; import { useNetwork } from "@Hooks/useNetwork"; -const recommended_repos = [ - { - name: "Magisk Modules Alternative Repository", - link: "https://gr.dergoogler.com/magisk/mmar.json", - }, - { - name: "Googlers Magisk Repo", - link: "https://gr.dergoogler.com/magisk/gmr.json", - }, - { - name: "Magisk Modules Repo (Official)", - link: "https://gr.dergoogler.com/magisk/mmr.json", - }, -]; - -const MemoizdRecommendedRepos = React.memo<{ filteredRepos: StoredRepo[] }>((props) => { - const { strings } = useStrings(); - return ( - <> - {props.filteredRepos.length !== 0 && } - ({ bgcolor: theme.palette.background.default })}>{strings("explore_repositories")} - } - > - {recommended_repos.map((repo, index) => ( - - ))} - - - ); -}); - const RepoActivity = () => { const { isNetworkAvailable } = useNetwork(); const { context } = useActivity(); @@ -66,7 +32,6 @@ const RepoActivity = () => { const { repos, actions } = useRepos(); const [repoLink, setRepoLink] = React.useState(""); - const [search, setSearch] = React.useState(""); const [open, setOpen] = React.useState(false); @@ -86,11 +51,6 @@ const RepoActivity = () => { setRepoLink(event.target.value); }; - const filteredRepos = React.useMemo( - () => repos.filter((item) => item.name.toLowerCase().includes(search.toLowerCase())), - [repos, search] - ); - const renderToolbar = () => { return ( @@ -109,11 +69,9 @@ const RepoActivity = () => { <> - {filteredRepos.map((repo, index) => ( + {repos.map((repo, index) => ( ))} - - {isNetworkAvailable && } @@ -144,7 +102,7 @@ const RepoActivity = () => { }, error: (error) => { setRepoLink(""); - os.toast(error, Toast.LENGTH_SHORT); + os.toast(error.message, Toast.LENGTH_SHORT); handleClose(); }, }); diff --git a/Website/src/components/DeviceModule.tsx b/Website/src/components/DeviceModule.tsx index 2ac56571..03cdd0e3 100644 --- a/Website/src/components/DeviceModule.tsx +++ b/Website/src/components/DeviceModule.tsx @@ -45,7 +45,7 @@ const DeviceModule = React.memo((props) => { const log = useLog("DeviceModule"); - const { id, name, version, versionCode, author, description, updateJson: __updateJson } = props.module; + const { id, name, version, versionCode, author, description } = props.module; const format = React.useCallback<(key: K) => ModConf[K]>((key) => modConf(key, { MODID: id }), []); @@ -67,22 +67,8 @@ const DeviceModule = React.memo((props) => { const findOnlineModule = React.useMemo(() => modules.find((module) => module.id === id), [modules]) as Module; - const [updateJson, setUpdateJson] = React.useState(null); - - if (__updateJson) { - React.useEffect(() => { - fetch(__updateJson) - .then((res) => res.json()) - .then((json: UpdateJson) => setUpdateJson(json)); - }, []); - } - const hasUpdate = React.useMemo(() => { - if (updateJson) { - return findOnlineModule && versionCode < updateJson.versionCode; - } else { - return findOnlineModule && versionCode < findOnlineModule.versionCode; - } + return findOnlineModule && versionCode < findOnlineModule.versionCode; }, [findOnlineModule]); const isLowQuality = useLowQualityModule(props.module, !settings._low_quality_module); @@ -230,7 +216,7 @@ const DeviceModule = React.memo((props) => { key: "TerminalActivity", extra: { exploreInstall: true, - path: findOnlineModule.download, + path: findOnlineModule.versions[findOnlineModule.versions.length - 1].zipUrl, }, }); }} diff --git a/Website/src/components/ExploreModule.tsx b/Website/src/components/ExploreModule.tsx index 5e734d0e..0f1eeaf1 100644 --- a/Website/src/components/ExploreModule.tsx +++ b/Website/src/components/ExploreModule.tsx @@ -25,18 +25,14 @@ export const ExploreModule = React.memo((props) => { const { settings } = useSettings(); const { theme, scheme, shade } = useTheme(); - const { id, name, version, versionCode, description, stars, author, last_update, mmrl, valid, hidden } = props.moduleProps; + const { id, name, version, versionCode, description, author, versions, track } = props.moduleProps; const isLowQuality = useLowQualityModule(props.moduleProps, !settings._low_quality_module); - const formatLastUpdate = useFormatDate(last_update); + const formatLastUpdate = useFormatDate(versions[versions.length - 1].timestamp); - if (hidden) { - return null; - } - - if (!settings._invald_module && !valid) { - return null; - } + // if (!settings._invald_module && !valid) { + // return null; + // } const handleOpen = () => { context.pushPage({ @@ -51,7 +47,7 @@ export const ExploreModule = React.memo((props) => { return null; } - if (mmrl.cover) { + if (track.cover) { return ( ((props) => { boxShadow: "0 1px 2px 0 rgba(60,64,67,.3), 0 1px 10px 1px rgba(60,64,67,.15)", width: "calc(100% - 16px)", })} - image={mmrl.cover} + image={track.cover} alt={name} /> ); @@ -97,7 +93,7 @@ export const ExploreModule = React.memo((props) => { {version} ({versionCode}) / - {mmrl.author ? ( + {/* {track.author ? ( ((props) => { }, }} > - {mmrl.author.name} {mmrl.author.verified && } + {track.author.name} {track.author.verified && } ) : ( {author} - )} + )} */} + {author} - {isLiteralObject(description) ? String((description as ModuleDescription)[currentLanguage]) : String(description)} + {description} @@ -129,7 +126,7 @@ export const ExploreModule = React.memo((props) => { })} label={formatLastUpdate} /> - + {/* ((props) => { {stars} - + */} {isLowQuality && ( diff --git a/Website/src/hooks/useRepos.tsx b/Website/src/hooks/useRepos.tsx index eaed2502..51a750d4 100644 --- a/Website/src/hooks/useRepos.tsx +++ b/Website/src/hooks/useRepos.tsx @@ -13,8 +13,8 @@ export interface RepoContextActions { } interface RepoContextInterface { - repos: StoredRepo[]; - setRepos: SetValue; + repos: RepoConfig[]; + setRepos: SetValue; modules: Module[]; actions: RepoContextActions; } @@ -32,13 +32,13 @@ export const RepoContext = React.createContext({ type AddRepoData = { url: string; - callback?: (state: StoredRepo[]) => void; - error?: (error: any) => void; + callback?: (state: RepoConfig[]) => void; + error?: (error: Error) => void; }; type RemoveRepoData = { id: string; - callback?: (state: StoredRepo[]) => void; + callback?: (state: RepoConfig[]) => void; }; type SetRepoStateData = { @@ -49,15 +49,17 @@ type SetRepoStateData = { export const RepoProvider = (props: React.PropsWithChildren) => { const TAG = "RepoProvider"; const log = useLog(TAG); - const [repos, setRepos] = useNativeStorage("repos_v2", [ + const [repos, setRepos] = useNativeStorage("repos_v3", [ { - name: "Magisk Modules Alt Repo (pre-configured)", - website: "", - support: "", - donate: "", - submitModule: "", - last_update: 1690995729000, - modules: "https://gr.dergoogler.com/magisk/mmar.json", + name: "Googlers Magisk Repo", + website: "https://mmrl.dergoogler.com", + support: "https://github.com/Googlers-Repo/repo/issues", + donate: "https://github.com/sponsors/DerGoogler", + submission: null, + base_url: "https://gr.dergoogler.com/repo/", + max_num: 3, + enable_log: true, + log_dir: "log", }, ]); @@ -65,27 +67,19 @@ export const RepoProvider = (props: React.PropsWithChildren) => { const [modules, setModules] = React.useState([]); const addRepo = (data: AddRepoData) => { - if (!repos.some((repo) => repo.modules === data.url)) { + if (!repos.some((repo) => repo.base_url === data.url)) { if (repos.length <= 4) { if (link.validURL(data.url)) { - fetch(data.url) - .then((response) => response.json()) + fetch(`${data.url}json/config.json`) .then((response) => { - setRepos( - (prev) => [ - ...prev, - { - name: response.name || "Unknown Repository", - website: response.website || null, - support: response.support || null, - donate: response.donate || null, - submitModule: response.submitModules || null, - last_update: response.last_update || 0, - modules: data.url, - }, - ], - data.callback - ); + if (response.status == 200) { + return response.json(); + } else { + data.error && data.error(Error("Cannot find given repo link or your link isn't valid")); + } + }) + .then((response) => { + setRepos((prev) => [...prev, response], data.callback); }) .catch((e) => (data.callback ? data.callback(e) : log.e(e))); } else { @@ -101,7 +95,7 @@ export const RepoProvider = (props: React.PropsWithChildren) => { const removeRepo = (data: RemoveRepoData) => { setRepos((tmp) => { - tmp = tmp.filter((remv) => remv.modules != data.id); + tmp = tmp.filter((remv) => remv.base_url != data.id); return tmp; }, data.callback); }; @@ -125,9 +119,9 @@ export const RepoProvider = (props: React.PropsWithChildren) => { setModules([]); const fetchData = async () => { for (const repo of repos) { - if (settings.disabled_repos.includes(repo.modules)) continue; + if (settings.disabled_repos.includes(repo.base_url)) continue; - fetch(repo.modules) + fetch(`${repo.base_url}json/modules.json`) .then((res) => { if (!res.ok) throw new Error(res.statusText); return res.json(); diff --git a/Website/src/hooks/useSettings.tsx b/Website/src/hooks/useSettings.tsx index 94602e7e..81c69c33 100644 --- a/Website/src/hooks/useSettings.tsx +++ b/Website/src/hooks/useSettings.tsx @@ -159,7 +159,6 @@ export interface StorageDeclaration { disabled_repos: string[]; _low_quality_module: boolean; _invald_module: boolean; - repos: StoredRepo[]; shade_value: number; term_scroll_bottom: boolean; term_scroll_behavior: { name: string; value: ScrollBehavior }; @@ -213,7 +212,6 @@ export const SettingsProvider = (props: React.PropsWithChildren) => { disabled_repos: [], _low_quality_module: true, _invald_module: false, - repos: [], shade_value: -80, term_scroll_bottom: true, term_scroll_behavior: termScrollBehaviors[0], diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json index 985f44a5..95367406 100644 --- a/Website/src/locales/de.json +++ b/Website/src/locales/de.json @@ -1,4 +1,5 @@ { + "license": "Lizenz", "search_modules": "Module durchsuchen", "settings": "Einstellungen", "repository": "Repository", diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json index 98fd3817..d44c31ed 100644 --- a/Website/src/locales/en.json +++ b/Website/src/locales/en.json @@ -1,4 +1,5 @@ { + "license": "License", "search_modules": "Search modules", "settings": "Settings", "repository": "Repository", diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index af945e3d..3048fd8b 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -119,112 +119,175 @@ declare global { const __webpack__mode__: "production" | "development"; - interface StoredRepo extends Omit { - modules: string; - } - - interface Repo { - /** - * An required filed, to disply the repository name - */ + export interface RepoConfig { name: string; - mmrlOwner?: string; - /** - * An given website link for the repository - */ website?: string; - /** - * Given support link i.g. Telegram, Xda, GitHub or something - */ support?: string; donate?: string; - submitModule?: string; - last_update: number; - modules: Module[]; + submission?: any; + base_url: string; + max_num?: number; + enable_log?: boolean; + log_dir?: string; } - export interface Root { - last_update: number; + export interface Repo { name: string; - website: any; - support: any; - donate: any; - submitModule: string; + website: string; + support: string; + donate: string; + submission: any; + metadata: Metadata; modules: Module[]; } - /** Allows developers to translate their description */ - export type ModuleDescription = Record; + export interface Metadata { + version: number; + timestamp: number; + } export interface Module { id: string; name: string; - version?: number; + version: string; versionCode: number; - author?: string; - description?: string | ModuleDescription; - valid: boolean; + author: string; + description: string; + track: Track; + versions: Version[]; + } + + export interface Track { + type: string; + added: number; + license: string; + homepage: string; + source: string; + support: string; + donate: string; verified: boolean; - hidden: boolean; - download: string; - last_update: number; - readme: string; - stars: number; - updateJson: string; - about: About; - mmrl: Mmrl; - fox: Fox; + cover?: string; + logo?: string; + require?: string[]; + screenshots?: string[]; + category?: string; + categories?: string[]; } - export interface UpdateJson { + export interface Version { + timestamp: number; version: string; versionCode: number; zipUrl: string; changelog: string; } - export interface About { - repo_source: string; - language: string; - issues?: string; - source: string; - } + // interface StoredRepo extends Omit { + // modules: string; + // } - export interface MmrlAuthor { - name: string; - avatar: string; - bio: string; - followers: number; - verified: boolean; - } + // interface Repo { + // /** + // * An required filed, to disply the repository name + // */ + // name: string; + // mmrlOwner?: string; + // /** + // * An given website link for the repository + // */ + // website?: string; + // /** + // * Given support link i.g. Telegram, Xda, GitHub or something + // */ + // support?: string; + // donate?: string; + // submitModule?: string; + // last_update: number; + // modules: Module[]; + // } - export interface Mmrl { - author?: MmrlAuthor; - contributors?: Array; - cover?: string; - logo?: string; - screenshots?: Array; - categories?: Array; - require?: Array; - developerNote?: { - severity?: AlertColor; - note?: string; - }; - minKernelSU?: number; - supportedRoots?: string - } + // export interface Root { + // last_update: number; + // name: string; + // website: any; + // support: any; + // donate: any; + // submitModule: string; + // modules: Module[]; + // } - export interface Fox { - minApi?: number; - maxApi?: number; - minMagisk?: number; - needRamdisk?: boolean; - support?: string; - donate?: string; - config?: string; - changeBoot?: boolean; - mmtReborn?: boolean; - } + // /** Allows developers to translate their description */ + // export type ModuleDescription = Record; + + // export interface Module { + // id: string; + // name: string; + // version?: number; + // versionCode: number; + // author?: string; + // description?: string | ModuleDescription; + // valid: boolean; + // verified: boolean; + // hidden: boolean; + // download: string; + // last_update: number; + // readme: string; + // stars: number; + // updateJson: string; + // about: About; + // mmrl: Mmrl; + // fox: Fox; + // } + + // export interface UpdateJson { + // version: string; + // versionCode: number; + // zipUrl: string; + // changelog: string; + // } + + // export interface About { + // repo_source: string; + // language: string; + // issues?: string; + // source: string; + // } + + // export interface MmrlAuthor { + // name: string; + // avatar: string; + // bio: string; + // followers: number; + // verified: boolean; + // } + + // export interface Mmrl { + // author?: MmrlAuthor; + // contributors?: Array; + // cover?: string; + // logo?: string; + // screenshots?: Array; + // categories?: Array; + // require?: Array; + // developerNote?: { + // severity?: AlertColor; + // note?: string; + // }; + // minKernelSU?: number; + // supportedRoots?: string + // } + + // export interface Fox { + // minApi?: number; + // maxApi?: number; + // minMagisk?: number; + // needRamdisk?: boolean; + // support?: string; + // donate?: string; + // config?: string; + // changeBoot?: boolean; + // mmtReborn?: boolean; + // } // OnsenUI Types /** From 12c4fc4c4916ba5a6ff7f82ee7be0168c8dc94e1 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 14 Jan 2024 16:55:49 +0100 Subject: [PATCH 02/77] multiply dates --- Website/src/hooks/useFormatDate.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Website/src/hooks/useFormatDate.ts b/Website/src/hooks/useFormatDate.ts index 13c5240e..fc1d341e 100644 --- a/Website/src/hooks/useFormatDate.ts +++ b/Website/src/hooks/useFormatDate.ts @@ -1,7 +1,7 @@ import { useMemo } from "react"; import { useSettings } from "./useSettings"; -export const useFormatDate = (date: int) => { +export const useFormatDate = (date: int, multiply: boolean = true) => { const { settings } = useSettings(); return useMemo( @@ -13,7 +13,7 @@ export const useFormatDate = (date: int) => { hour: "2-digit", minute: "2-digit", hour12: true, - }).format(new Date(date)), + }).format(new Date(multiply ? date * 1000 : date)), [date] ); }; From 8b1f081c25aadf54ff01f7a37f5d33c4a4ff7181 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 14 Jan 2024 17:01:05 +0100 Subject: [PATCH 03/77] some changes --- Website/src/activitys/ModuleViewActivity.tsx | 107 +++++++++---------- Website/src/components/ExploreModule.tsx | 6 +- Website/src/typings/global.d.ts | 2 + 3 files changed, 58 insertions(+), 57 deletions(-) diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index c6cb5edb..a61861d9 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -102,8 +102,7 @@ const ModuleViewActivity = () => { const { id, name, version, versionCode, description, author, versions, track } = extra; const categories = useCategories(track.categories); - // const { data } = useFetch(readme); - const data = undefined; + const { data } = useFetch(track.readme); const latestVersion = React.useMemo(() => versions[versions.length - 1], [versions]); @@ -397,58 +396,6 @@ const ModuleViewActivity = () => { )} - {track.screenshots && ( - - - - {strings("images")} - - - - - {track.screenshots.map((image, i) => ( - ({ - ml: 1, - mr: 1, - })} - > - ({ - ":hover": { - cursor: "pointer", - }, - boxShadow: "0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15)", - borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, - })} - onClick={() => { - context.pushPage({ - component: PicturePreviewActivity, - key: "PicturePreviewActivity", - extra: { - picture: image, - }, - }); - }} - /> - - ))} - - - )} - {data ? ( { )} + + {track.screenshots && ( + + + + {strings("images")} + + + + + {track.screenshots.map((image, i) => ( + ({ + ml: 1, + mr: 1, + })} + > + ({ + ":hover": { + cursor: "pointer", + }, + boxShadow: "0 1px 2px 0 rgba(60,64,67,.3), 0 1px 3px 1px rgba(60,64,67,.15)", + borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + })} + onClick={() => { + context.pushPage({ + component: PicturePreviewActivity, + key: "PicturePreviewActivity", + extra: { + picture: image, + }, + }); + }} + /> + + ))} + + + )} diff --git a/Website/src/components/ExploreModule.tsx b/Website/src/components/ExploreModule.tsx index 0f1eeaf1..e5ab0ed7 100644 --- a/Website/src/components/ExploreModule.tsx +++ b/Website/src/components/ExploreModule.tsx @@ -126,7 +126,7 @@ export const ExploreModule = React.memo((props) => { })} label={formatLastUpdate} /> - {/* + ((props) => { typography: "caption", }} > - {stars} + {track.stars} - */} + {isLowQuality && ( diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index 3048fd8b..57815ee4 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -172,6 +172,8 @@ declare global { screenshots?: string[]; category?: string; categories?: string[]; + stars?: number; + readme?: string; } export interface Version { From cfef414a298be7063ae22e1860dea19ea4fb7f5a Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 14 Jan 2024 17:10:25 +0100 Subject: [PATCH 04/77] 2.13.9_alpha-1 --- Website/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Website/package.json b/Website/package.json index ef202ab1..9b977102 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,7 +5,7 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "2.13.9", + "version_name": "2.13.9_alpha-1", "version_code": 2139 }, "main": "index.tsx", From 66d3d5a9fa937f47daffeaedb1bd3ceb4916969a Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:04:34 +0100 Subject: [PATCH 05/77] Remove dup. multiply --- .../src/activitys/RepoActivity/components/LocalRepository.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx index eca177fc..9c8911c7 100644 --- a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx +++ b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx @@ -52,7 +52,7 @@ export const LocalRepository = React.memo((props) => { const { data } = useFetch(`${repo.base_url}json/modules.json`); - const formatLastUpdate = useFormatDate(data ? data.metadata.timestamp * 1000 : 0); + const formatLastUpdate = useFormatDate(data ? data.metadata.timestamp : 0); if (!data) { return ( From ece3527cbe11d4e8fa59018eaf1515516d655db3 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:15:17 +0100 Subject: [PATCH 06/77] Update ModuleViewActivity.tsx --- Website/src/activitys/ModuleViewActivity.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index a61861d9..d19fc42d 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -345,6 +345,7 @@ const ModuleViewActivity = () => { component: TerminalActivity, key: "TerminalActivity", extra: { + id: id, exploreInstall: true, path: latestVersion.zipUrl, }, From db82e5f12464aa020db51448c68c99c573756148 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:15:52 +0100 Subject: [PATCH 07/77] Update TerminalActivity.tsx --- Website/src/activitys/TerminalActivity.tsx | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 38b4b8f1..82533b6c 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -35,26 +35,20 @@ const TerminalActivity = () => { } const install = () => { - const { exploreInstall, path } = extra; + const { exploreInstall, path, id } = extra; if (exploreInstall) { - const url = new URL(path).pathname.split("/"); - - const name = url[2]; - const branch = url[4].split(".").slice(0, -1).join("."); - const envp_explore = { MMRL: "true", MMRL_VER: BuildConfig.VERSION_CODE.toString(), - NAME: name, + NAME: id, URL: path, - BRANCH: branch, ROOTMANAGER: Shell.getRootManager(), ...__modConf, }; Terminal.exec({ - command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_explore_install_v3`, + command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_explore_install_v4`, env: envp_explore, onLine: (line) => { addLine(line); @@ -69,13 +63,14 @@ const TerminalActivity = () => { const envp_local = { MMRL: "true", MMRL_VER: BuildConfig.VERSION_CODE.toString(), + NAME: id, ZIPFILE: path, ROOTMANAGER: Shell.getRootManager(), ...__modConf, }; Terminal.exec({ - command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_local_install_v3`, + command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_local_install_v4`, env: envp_local, onLine: (line) => { addLine(line); From f1b8527f399cce06e18ee0ee0dff118bf9aad250 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:09:59 +0100 Subject: [PATCH 08/77] . --- .../app/default/release/output-metadata.json | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index b18ff3f3..7637b1f2 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "UNIVERSAL", "filters": [], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", + "versionCode": 2139, + "versionName": "2.13.9_alpha-1", "outputFile": "app-default-universal-release.apk" }, { @@ -24,8 +24,8 @@ } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", + "versionCode": 2139, + "versionName": "2.13.9_alpha-1", "outputFile": "app-default-x86-release.apk" }, { @@ -37,8 +37,8 @@ } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", + "versionCode": 2139, + "versionName": "2.13.9_alpha-1", "outputFile": "app-default-x86_64-release.apk" }, { @@ -50,8 +50,8 @@ } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", + "versionCode": 2139, + "versionName": "2.13.9_alpha-1", "outputFile": "app-default-armeabi-v7a-release.apk" }, { @@ -63,8 +63,8 @@ } ], "attributes": [], - "versionCode": 1139, - "versionName": "1.13.9", + "versionCode": 2139, + "versionName": "2.13.9_alpha-1", "outputFile": "app-default-arm64-v8a-release.apk" } ], From 9babcf914671b35101ed1552f623458e207b7127 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:38:01 +0100 Subject: [PATCH 09/77] added versions --- Website/src/activitys/ModuleViewActivity.tsx | 101 +++++++++++++++++-- Website/src/locales/de.json | 1 + Website/src/locales/en.json | 1 + 3 files changed, 94 insertions(+), 9 deletions(-) diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index d19fc42d..ca77db72 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -55,6 +55,9 @@ import AvatarGroup from "@mui/material/AvatarGroup"; import FormatAlignLeftIcon from "@mui/icons-material/FormatAlignLeft"; // import ProfileActivty from "./ProfileActivity"; import { useModConf } from "@Hooks/useModConf"; +import { useConfirm } from "material-ui-confirm"; +import InstallMobileIcon from "@mui/icons-material/InstallMobile"; +import DownloadIcon from "@mui/icons-material/Download"; function a11yProps(index: number) { return { @@ -95,6 +98,7 @@ const ModuleViewActivity = () => { const { strings, currentLanguage } = useStrings(); const { settings } = useSettings(); const { modules } = useRepos(); + const confirm = useConfirm(); const { theme, scheme, shade } = useTheme(); const { context, extra } = useActivity(); @@ -108,7 +112,7 @@ const ModuleViewActivity = () => { const formatLastUpdate = useFormatDate(latestVersion.timestamp); - const { modConf, __modConf } = useModConf(); + const { modConf } = useModConf(); const hasInstallTools = SuFile.exist(`${modConf("MMRLINI")}/module.prop`); const search = React.useMemo(() => new URLSearchParams(window.location.search), [window.location.search]); @@ -341,14 +345,19 @@ const ModuleViewActivity = () => { variant="contained" disableElevation onClick={() => { - context.pushPage({ - component: TerminalActivity, - key: "TerminalActivity", - extra: { - id: id, - exploreInstall: true, - path: latestVersion.zipUrl, - }, + confirm({ + title: `Install ${name}?`, + confirmationText: "Yes", + }).then(() => { + context.pushPage({ + component: TerminalActivity, + key: "TerminalActivity", + extra: { + id: id, + exploreInstall: true, + path: latestVersion.zipUrl, + }, + }); }); }} > @@ -383,6 +392,7 @@ const ModuleViewActivity = () => { + @@ -575,6 +585,13 @@ const ModuleViewActivity = () => { + + {versions.map((version) => ( + + ))} + + + {track.verified && ( @@ -634,6 +651,72 @@ const ModuleViewActivity = () => { ); }; +interface VersionItemProps { + id: string; + version: Version; +} + +const VersionItem = React.memo(({ id, version }) => { + const ts = useFormatDate(version.timestamp); + const { context } = useActivity(); + const confirm = useConfirm(); + const { theme } = useTheme(); + + const { modConf, __modConf } = useModConf(); + const hasInstallTools = SuFile.exist(`${modConf("MMRLINI")}/module.prop`); + + const versionName = `${version.version} (${version.versionCode})`; + + const handleInstall = () => { + confirm({ + title: `Install ${versionName}?`, + confirmationText: "Yes", + }).then(() => { + context.pushPage({ + component: TerminalActivity, + key: "TerminalActivity", + extra: { + id: id, + exploreInstall: true, + path: version.zipUrl, + }, + }); + }); + }; + + return ( + + {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools && ( + + + + )} + + { + os.open(version.zipUrl, { + target: "_blank", + features: { + color: theme.palette.primary.main, + }, + }); + }} + edge="end" + aria-label="download" + > + + + + } + > + + + ); +}); + interface State { data?: string; error?: Error; diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json index 95367406..90b89747 100644 --- a/Website/src/locales/de.json +++ b/Website/src/locales/de.json @@ -1,4 +1,5 @@ { + "versions": "Versionen", "license": "Lizenz", "search_modules": "Module durchsuchen", "settings": "Einstellungen", diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json index d44c31ed..7bf95956 100644 --- a/Website/src/locales/en.json +++ b/Website/src/locales/en.json @@ -1,4 +1,5 @@ { + "versions": "Versions", "license": "License", "search_modules": "Search modules", "settings": "Settings", From 1f504a72701c18195e4f6bf8e470d3625e8a9b22 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:44:15 +0100 Subject: [PATCH 10/77] bump --- .../app/default/release/output-metadata.json | 22 +++++++++---------- Website/package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index 7637b1f2..0af734d4 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-1", + "versionName": "2.13.9_alpha-2", "outputFile": "app-default-universal-release.apk" }, { @@ -20,39 +20,39 @@ "filters": [ { "filterType": "ABI", - "value": "x86" + "value": "armeabi-v7a" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-1", - "outputFile": "app-default-x86-release.apk" + "versionName": "2.13.9_alpha-2", + "outputFile": "app-default-armeabi-v7a-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "x86" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-1", - "outputFile": "app-default-x86_64-release.apk" + "versionName": "2.13.9_alpha-2", + "outputFile": "app-default-x86-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "x86_64" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-1", - "outputFile": "app-default-armeabi-v7a-release.apk" + "versionName": "2.13.9_alpha-2", + "outputFile": "app-default-x86_64-release.apk" }, { "type": "ONE_OF_MANY", @@ -64,7 +64,7 @@ ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-1", + "versionName": "2.13.9_alpha-2", "outputFile": "app-default-arm64-v8a-release.apk" } ], diff --git a/Website/package.json b/Website/package.json index 9b977102..289a8d7e 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,7 +5,7 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "2.13.9_alpha-1", + "version_name": "2.13.9_alpha-2", "version_code": 2139 }, "main": "index.tsx", From d7e6a0ab267672c700254c79d67a9959d4a09aa1 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 16 Jan 2024 18:59:54 +0100 Subject: [PATCH 11/77] fixed date filter --- .../components/LocalRepository.tsx | 55 ++++++++++--------- Website/src/activitys/RepoActivity/index.tsx | 8 ++- Website/src/hooks/useModulesFilter.tsx | 32 +++++------ Website/src/typings/global.d.ts | 2 + 4 files changed, 51 insertions(+), 46 deletions(-) diff --git a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx index 9c8911c7..7b2ecd96 100644 --- a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx +++ b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx @@ -6,7 +6,7 @@ import { StyledListItemText } from "@Components/StyledListItemText"; import { useRepos } from "@Hooks/useRepos"; import { useSettings } from "@Hooks/useSettings"; import { useStrings } from "@Hooks/useStrings"; -import { List, ListItem, ListItemButton, ListItemIcon, ListSubheader } from "@mui/material"; +import { IconButton, List, ListItem, ListItemButton, ListItemIcon, ListSubheader } from "@mui/material"; import { OverridableComponent } from "@mui/material/OverridableComponent"; import { SvgIconTypeMap } from "@mui/material/SvgIcon/SvgIcon"; import { DeleteRounded, LanguageRounded, SupportRounded, UploadFileRounded, VolunteerActivismRounded } from "@mui/icons-material"; @@ -15,9 +15,7 @@ import { os } from "@Native/Os"; import { useFormatDate } from "@Hooks/useFormatDate"; import { useConfirm } from "material-ui-confirm"; import { useFetch } from "usehooks-ts"; -import { ProgressCircular } from "react-onsenui"; -import Box from "@mui/material/Box"; -import Skeleton from "@mui/material/Skeleton"; +import DeleteIcon from "@mui/icons-material/Delete"; interface ListItemProps { part?: any; @@ -54,11 +52,31 @@ export const LocalRepository = React.memo((props) => { const formatLastUpdate = useFormatDate(data ? data.metadata.timestamp : 0); + const handleRepoDelete = () => { + confirm({ + title: "Delete?", + confirmationText: "Sure", + description: strings("confirm_repo_delete", { + name: repo.name, + }), + }).then(() => { + actions.removeRepo({ + id: repo.base_url, + }); + }); + }; + if (!data) { return ( - - - + + + + } + > + + ); } @@ -67,7 +85,7 @@ export const LocalRepository = React.memo((props) => { }; return ( - + <> {open ? : } @@ -127,26 +145,9 @@ export const LocalRepository = React.memo((props) => { } }} /> - { - confirm({ - title: "Delete?", - confirmationText: "Sure", - description: strings("confirm_repo_delete", { - name: repo.name, - }), - }).then(() => { - actions.removeRepo({ - id: repo.base_url, - }); - }); - }} - /> + - + ); }); diff --git a/Website/src/activitys/RepoActivity/index.tsx b/Website/src/activitys/RepoActivity/index.tsx index b7dc1a82..390afd49 100644 --- a/Website/src/activitys/RepoActivity/index.tsx +++ b/Website/src/activitys/RepoActivity/index.tsx @@ -69,9 +69,11 @@ const RepoActivity = () => { <> - {repos.map((repo, index) => ( - - ))} + + {repos.map((repo, index) => ( + + ))} + diff --git a/Website/src/hooks/useModulesFilter.tsx b/Website/src/hooks/useModulesFilter.tsx index c692b52a..049cdf90 100644 --- a/Website/src/hooks/useModulesFilter.tsx +++ b/Website/src/hooks/useModulesFilter.tsx @@ -46,18 +46,18 @@ export const filters = [ value: "alphabetically_reverse", allowedIds: ["explore", "local"], }, - { - name: "Most stars", - icon: StarIcon, - value: "most_stars", - allowedIds: ["explore"], - }, - { - name: "Least stars", - icon: StarBorderIcon, - value: "least_stars", - allowedIds: ["explore"], - }, + // { + // name: "Most stars", + // icon: StarIcon, + // value: "most_stars", + // allowedIds: ["explore"], + // }, + // { + // name: "Least stars", + // icon: StarBorderIcon, + // value: "least_stars", + // allowedIds: ["explore"], + // }, ]; export const useModuleFilter = (key: string): [Array, string, SetValue] => { @@ -66,12 +66,12 @@ export const useModuleFilter = (key: string): [Array, string, SetValue ({ none: [{}], - date_oldest: [{ key: "last_update", descending: false }], - date_newest: [{ key: "last_update", descending: true }], + date_oldest: [{ key: "timestamp", descending: false }], + date_newest: [{ key: "timestamp", descending: true }], alphabetically: [{ key: "name", descending: false }], alphabetically_reverse: [{ key: "name", descending: true }], - least_stars: [{ key: "stars", descending: false }], - most_stars: [{ key: "stars", descending: true }], + // least_stars: [{ key: "stars", descending: false }], + // most_stars: [{ key: "stars", descending: true }], }), [] ); diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index 57815ee4..9329a6b8 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -153,6 +153,8 @@ declare global { versionCode: number; author: string; description: string; + added: number; + timestamp: number; track: Track; versions: Version[]; } From 14cf9564a6eaf8633b70e4d174b2d974eec9f3b4 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:07:16 +0100 Subject: [PATCH 12/77] add Recommended repos back --- .../components/RecommendedRepo.tsx | 43 +++++++++++++++++++ Website/src/activitys/RepoActivity/index.tsx | 40 +++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx diff --git a/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx b/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx new file mode 100644 index 00000000..88c807de --- /dev/null +++ b/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx @@ -0,0 +1,43 @@ +import Icon from "@Components/Icon"; +import Box from "@mui/material/Box"; +import IconButton from "@mui/material/IconButton"; +import Typography from "@mui/material/Typography"; +import AddIcon from "@mui/icons-material/Add"; +import { StyledCard } from "@Components/StyledCard"; +import { useRepos } from "@Hooks/useRepos"; +import { os } from "@Native/Os"; +import { ListItem, ListItemText } from "@mui/material"; +import { StyledListItemText } from "@Components/StyledListItemText"; + +interface RecommendedRepoProps { + name: string; + link: string; +} + +export const RecommendedRepo = (props: RecommendedRepoProps) => { + const { actions } = useRepos(); + + return ( + { + actions.addRepo({ + url: props.link, + callback: (state) => {}, + error: (error) => { + os.toast(error.message, Toast.LENGTH_SHORT); + }, + }); + }} + > + + + } + > + + + ); +}; \ No newline at end of file diff --git a/Website/src/activitys/RepoActivity/index.tsx b/Website/src/activitys/RepoActivity/index.tsx index 390afd49..f9047cd4 100644 --- a/Website/src/activitys/RepoActivity/index.tsx +++ b/Website/src/activitys/RepoActivity/index.tsx @@ -22,9 +22,48 @@ import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { os } from "@Native/Os"; import { useStrings } from "@Hooks/useStrings"; import { Page } from "@Components/onsenui/Page"; +import { RecommendedRepo } from "./components/RecommendedRepo"; import { LocalRepository } from "./components/LocalRepository"; import { useNetwork } from "@Hooks/useNetwork"; +const recommended_repos = [ + { + name: "Magisk Modules Alternative Repository", + link: "https://gr.dergoogler.com/mmar/", + }, + { + name: "Googlers Magisk Repo", + link: "https://gr.dergoogler.com/gmr/", + }, + { + name: "IzzyOnDroid Magisk Repository", + link: "https://apt.izzysoft.de/magisk/", + }, + // { + // name: "Magisk Modules Repo (Official)", + // link: "https://gr.dergoogler.com/mmr/", + // }, +]; + +const MemoizdRecommendedRepos = React.memo((props) => { + const { strings } = useStrings(); + const { repos } = useRepos(); + return ( + <> + {repos.length !== 0 && } + ({ bgcolor: theme.palette.background.default })}>{strings("explore_repositories")} + } + > + {recommended_repos.map((repo, index) => ( + + ))} + + + ); +}); + const RepoActivity = () => { const { isNetworkAvailable } = useNetwork(); const { context } = useActivity(); @@ -74,6 +113,7 @@ const RepoActivity = () => { ))} + {isNetworkAvailable && } From 1421af55dfc3c3583e7043e4d5632f623fce507a Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:57:29 +0100 Subject: [PATCH 13/77] rename logo to icon --- Website/src/activitys/ModuleViewActivity.tsx | 4 ++-- Website/src/typings/global.d.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index ca77db72..c2198ce9 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -235,7 +235,7 @@ const ModuleViewActivity = () => { mr: 1.5, fontSize: 50, })} - src={track.logo} + src={track.icon} > {name.charAt(0).toUpperCase()} @@ -436,7 +436,7 @@ const ModuleViewActivity = () => { extra: { desc: data, name: name, - logo: track.logo, + logo: track.icon, }, }); }} diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index 9329a6b8..ced99720 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -169,7 +169,7 @@ declare global { donate: string; verified: boolean; cover?: string; - logo?: string; + icon?: string; require?: string[]; screenshots?: string[]; category?: string; From 1b9735e4ce051b19919da7597eb41b41bb743ee9 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 16 Jan 2024 20:03:35 +0100 Subject: [PATCH 14/77] fix --- Website/src/activitys/ModuleViewActivity.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index c2198ce9..ad4064ce 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -393,7 +393,7 @@ const ModuleViewActivity = () => { - + From bf131077d98f281c0d099070cde9c42bdb9d08ea Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 16 Jan 2024 20:15:54 +0100 Subject: [PATCH 15/77] add antifeatures --- README.md | 1 + Website/src/activitys/ModuleViewActivity.tsx | 31 ++++++++++++++++++++ Website/src/typings/global.d.ts | 14 +++++++++ 3 files changed, 46 insertions(+) diff --git a/README.md b/README.md index a8b6aa3a..9b1e2c73 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Introducing Magisk Module Repo Loader (MMRL) - the ultimate module manager for M - [x] Translation - [x] Dark mode - [x] Themes +- [x] Anti-features (partial, needs improvement) ## Android only diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index ad4064ce..3df406dc 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -473,6 +473,37 @@ const ModuleViewActivity = () => { ) : null} + {track.antifeatures ? ( + + + + Anti-Features + + + + {typeof track.antifeatures === "string" + ? track.antifeatures + : Array.isArray(track.antifeatures) && track.antifeatures.join("\n")} + + + + ) : null} + {track.require && ( Date: Tue, 16 Jan 2024 20:22:12 +0100 Subject: [PATCH 16/77] clean up --- Website/src/activitys/AboutActivity.tsx | 7 +- Website/src/activitys/ConfigureActivity.tsx | 6 +- .../DownloadActivity/DownloadActivity.tsx | 63 -------- .../DownloadActivity/components/Phones.tsx | 43 ------ Website/src/activitys/FetchTextActivity.tsx | 3 - Website/src/activitys/MainApplication.tsx | 1 - Website/src/activitys/PlaygroundsActivity.tsx | 1 - Website/src/activitys/ProfileActivity.tsx | 134 ----------------- .../components/LocalRepository.tsx | 2 +- .../components/RecommendedRepo.tsx | 6 +- .../activitys/fragments/DrawerFragment.tsx | 1 - Website/src/annotation/Deprecated.ts | 21 --- Website/src/builders/AlertDialog.tsx | 141 ------------------ Website/src/components/ExploreModule.tsx | 30 ---- Website/src/components/dapi/Anchor.tsx | 1 - 15 files changed, 6 insertions(+), 454 deletions(-) delete mode 100644 Website/src/activitys/DownloadActivity/DownloadActivity.tsx delete mode 100644 Website/src/activitys/DownloadActivity/components/Phones.tsx delete mode 100644 Website/src/activitys/ProfileActivity.tsx delete mode 100644 Website/src/annotation/Deprecated.ts delete mode 100644 Website/src/builders/AlertDialog.tsx diff --git a/Website/src/activitys/AboutActivity.tsx b/Website/src/activitys/AboutActivity.tsx index 21bee0fd..d7284df4 100644 --- a/Website/src/activitys/AboutActivity.tsx +++ b/Website/src/activitys/AboutActivity.tsx @@ -7,7 +7,6 @@ import { useTheme } from "@Hooks/useTheme"; import Badge from "@mui/material/Badge"; import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; -import Divider from "@mui/material/Divider"; import ListItemText from "@mui/material/ListItemText"; import Avatar from "@mui/material/Avatar"; import Typography from "@mui/material/Typography"; @@ -15,8 +14,7 @@ import Stack from "@mui/material/Stack"; import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; import { useSettings } from "@Hooks/useSettings"; import { Shell } from "@Native/Shell"; -import DeviceUnknownIcon from "@mui/icons-material/DeviceUnknown"; -import { ListSubheader, SxProps } from "@mui/material"; +import { ListSubheader } from "@mui/material"; import React from "react"; import { BuildConfig } from "@Native/BuildConfig"; import { useFormatDate } from "@Hooks/useFormatDate"; @@ -36,8 +34,7 @@ const checkRoot = (): string | undefined => { const AboutActivity = () => { const { strings } = useStrings(); const { settings } = useSettings(); - const { theme } = useTheme(); - const { context, extra } = useActivity(); + const { context } = useActivity(); const renderToolbar = () => { return ( diff --git a/Website/src/activitys/ConfigureActivity.tsx b/Website/src/activitys/ConfigureActivity.tsx index ce7f8a79..5f103a01 100644 --- a/Website/src/activitys/ConfigureActivity.tsx +++ b/Website/src/activitys/ConfigureActivity.tsx @@ -13,7 +13,7 @@ type Extra = { const ConfigureActivity = () => { const { modConf } = useModConf(); - const { context, extra } = useActivity(); + const { extra } = useActivity(); const config: string = React.useMemo(() => { if (!extra.raw_data) { @@ -29,9 +29,7 @@ const ConfigureActivity = () => { } }, []); - return ( - - ); + return ; }; export { ConfigureActivity }; diff --git a/Website/src/activitys/DownloadActivity/DownloadActivity.tsx b/Website/src/activitys/DownloadActivity/DownloadActivity.tsx deleted file mode 100644 index 26fe5bdb..00000000 --- a/Website/src/activitys/DownloadActivity/DownloadActivity.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Phones } from "./components/Phones"; -import { Toolbar } from "@Components/onsenui/Toolbar"; -import { Page } from "@Components/onsenui/Page"; -import { Carousel, CarouselItem } from "react-onsenui"; -import { useActivity } from "@Hooks/useActivity"; -import { useTheme } from "@Hooks/useTheme"; -import Paper from "@mui/material/Paper"; -import Button from "@mui/material/Button"; -import ButtonGroup from "@mui/material/ButtonGroup"; -import ArrowDropDownIcon from "@mui/icons-material/ArrowDropDown"; -import ClickAwayListener from "@mui/material/ClickAwayListener"; -import Grow from "@mui/material/Grow"; -import Popper from "@mui/material/Popper"; -import MenuItem from "@mui/material/MenuItem"; -import MenuList from "@mui/material/MenuList"; -import React from "react"; -import Typography from "@mui/material/Typography"; -import Box from "@mui/material/Box"; -import CardMedia from "@mui/material/CardMedia"; - -function DownloadActivity() { - const { context, extra } = useActivity(); - const { scheme, theme } = useTheme(); - - const { _1, _2 } = Phones({ - screenColor: scheme[500], - caseColor: scheme[600], - }); - - const renderToolbar = () => { - return ( - - Download MMRL - - ); - }; - - return ( - - - - - - - - - - ); -} - -export { DownloadActivity }; diff --git a/Website/src/activitys/DownloadActivity/components/Phones.tsx b/Website/src/activitys/DownloadActivity/components/Phones.tsx deleted file mode 100644 index 986be2e9..00000000 --- a/Website/src/activitys/DownloadActivity/components/Phones.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { styled } from "@mui/material"; - -interface Props { - caseColor: string; - screenColor: string; -} - -export const Phones = (props: Partial) => { - const C = styled("div")(({ theme }) => ({ - position: "absolute", - right: "10%", - bottom: "-30%", - width: "300px", - height: "540px", - backgroundColor: props.caseColor || "#333", - borderRadius: "21px", - transform: "rotate(25deg)", - "::before": { - position: "absolute", - top: "10%", - right: "10px", - bottom: "10%", - left: "10px", - content: '""', - backgroundColor: props.screenColor || "rgba(255, 255, 255, 0.1)", - borderRadius: "5px", - }, - })); - - const C2 = styled(C)(({ theme }) => ({ - top: "-25%", - right: "auto", - bottom: 0, - left: "5%", - backgroundColor: props.caseColor || "#e5e5e5", - transform: "rotate(14deg)", - })); - - return { - _1: C, - _2: C2, - }; -}; diff --git a/Website/src/activitys/FetchTextActivity.tsx b/Website/src/activitys/FetchTextActivity.tsx index ca9e1a41..ea3d5f22 100644 --- a/Website/src/activitys/FetchTextActivity.tsx +++ b/Website/src/activitys/FetchTextActivity.tsx @@ -4,9 +4,6 @@ import { useActivity } from "@Hooks/useActivity"; import React from "react"; import { Toolbar } from "@Components/onsenui/Toolbar"; import { Page } from "@Components/onsenui/Page"; -import Stack from "@mui/material/Stack"; -import Box from "@mui/material/Box"; -import Icon from "@Components/Icon"; import { useNetwork } from "@Hooks/useNetwork"; import { MissingInternet } from "@Components/MissingInternet"; diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index b1748a52..0649c4fc 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -17,7 +17,6 @@ import { useStrings } from "@Hooks/useStrings"; import { Tabbar, TabbarRenderTab } from "@Components/onsenui/Tabbar"; import { useRepos } from "@Hooks/useRepos"; import { SuFile } from "@Native/SuFile"; -import { Properties } from "properties-file"; import { useNativeStorage } from "@Hooks/useNativeStorage"; import { BuildConfig } from "@Native/BuildConfig"; import { useNewerVersion } from "@Hooks/useNewerVersion"; diff --git a/Website/src/activitys/PlaygroundsActivity.tsx b/Website/src/activitys/PlaygroundsActivity.tsx index 86ff6a47..581c65ad 100644 --- a/Website/src/activitys/PlaygroundsActivity.tsx +++ b/Website/src/activitys/PlaygroundsActivity.tsx @@ -1,6 +1,5 @@ import { Box, Stack, styled } from "@mui/material"; import * as React from "react"; -import Button from "@mui/material/Button"; import useMediaQuery from "@mui/material/useMediaQuery"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { Toolbar } from "@Components/onsenui/Toolbar"; diff --git a/Website/src/activitys/ProfileActivity.tsx b/Website/src/activitys/ProfileActivity.tsx deleted file mode 100644 index 46b4cd3a..00000000 --- a/Website/src/activitys/ProfileActivity.tsx +++ /dev/null @@ -1,134 +0,0 @@ -// import { useActivity } from "@Hooks/useActivity"; -// import { Toolbar } from "@Components/onsenui/Toolbar"; -// import { Page } from "@Components/onsenui/Page"; -// import { useStrings } from "@Hooks/useStrings"; -// import Stack from "@mui/material/Stack"; -// import VerifiedIcon from "@mui/icons-material/Verified"; -// import Grid from "@mui/material/Grid"; -// import { CardMedia, Box, Typography, Card, SxProps, Theme, Paper, CardContent } from "@mui/material"; -// import { colors } from "@Hooks/useSettings"; -// import { useRepos } from "@Hooks/useRepos"; -// import { ExploreModule } from "@Components/ExploreModule"; -// import React from "react"; - -// const badgeStyle: (color: (typeof colors)["blue" | "teal" | "red" | "orange"]) => SxProps = (color) => { -// return { -// px: 1, -// py: 0.5, -// borderRadius: 1, -// display: "flex", -// typography: "caption", -// bgcolor: (theme) => (theme.palette.mode === "dark" ? color[900] : color[50]), -// color: (theme) => (theme.palette.mode === "dark" ? "#fff" : color[700]), -// }; -// }; - -// const ProfileActivty = React.memo(() => { -// const { strings } = useStrings(); -// const { modules } = useRepos(); -// const { context, extra } = useActivity(); - -// const { name, bio, avatar, verified, followers } = extra; - -// const renderToolbar = () => { -// return ( -// -// -// -// -// {name} -// -// ); -// }; - -// return ( -// -// -// -// -// -// -// -// -// {name} {verified && } -// -// {followers} followers -// -// -// -// - -// {bio && ( -// -// -// -// Biography -// -// -// {bio} -// -// -// -// )} - -// -// -// -// Participating -// -// - -// {modules -// .filter((m) => m.mmrl.author?.name.includes(name) || m.mmrl.contributors?.find((con) => name == con.name)) -// .map((module) => ( -// -// ))} -// -// -// -// ); -// }); - -// export default ProfileActivty; diff --git a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx index 7b2ecd96..bcd1964d 100644 --- a/Website/src/activitys/RepoActivity/components/LocalRepository.tsx +++ b/Website/src/activitys/RepoActivity/components/LocalRepository.tsx @@ -6,7 +6,7 @@ import { StyledListItemText } from "@Components/StyledListItemText"; import { useRepos } from "@Hooks/useRepos"; import { useSettings } from "@Hooks/useSettings"; import { useStrings } from "@Hooks/useStrings"; -import { IconButton, List, ListItem, ListItemButton, ListItemIcon, ListSubheader } from "@mui/material"; +import { IconButton, List, ListItem, ListItemButton, ListItemIcon } from "@mui/material"; import { OverridableComponent } from "@mui/material/OverridableComponent"; import { SvgIconTypeMap } from "@mui/material/SvgIcon/SvgIcon"; import { DeleteRounded, LanguageRounded, SupportRounded, UploadFileRounded, VolunteerActivismRounded } from "@mui/icons-material"; diff --git a/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx b/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx index 88c807de..a632fd02 100644 --- a/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx +++ b/Website/src/activitys/RepoActivity/components/RecommendedRepo.tsx @@ -1,12 +1,8 @@ -import Icon from "@Components/Icon"; -import Box from "@mui/material/Box"; import IconButton from "@mui/material/IconButton"; -import Typography from "@mui/material/Typography"; import AddIcon from "@mui/icons-material/Add"; -import { StyledCard } from "@Components/StyledCard"; import { useRepos } from "@Hooks/useRepos"; import { os } from "@Native/Os"; -import { ListItem, ListItemText } from "@mui/material"; +import { ListItem } from "@mui/material"; import { StyledListItemText } from "@Components/StyledListItemText"; interface RecommendedRepoProps { diff --git a/Website/src/activitys/fragments/DrawerFragment.tsx b/Website/src/activitys/fragments/DrawerFragment.tsx index 9a273831..0de8b216 100644 --- a/Website/src/activitys/fragments/DrawerFragment.tsx +++ b/Website/src/activitys/fragments/DrawerFragment.tsx @@ -14,7 +14,6 @@ import { Markup } from "@Components/Markdown"; import { configureSample } from "@Util/configure-sample"; import { dapiSample } from "@Util/dapi-sample"; import ModConfActivity from "@Activitys/ModConfActivity"; -import { os } from "@Native/Os"; type Props = { renderToolbar: () => JSX.Element; diff --git a/Website/src/annotation/Deprecated.ts b/Website/src/annotation/Deprecated.ts deleted file mode 100644 index 7b36583d..00000000 --- a/Website/src/annotation/Deprecated.ts +++ /dev/null @@ -1,21 +0,0 @@ -function Deprecated(deprecationReason: string) { - return (target: any, memberName: string, propertyDescriptor: PropertyDescriptor) => { - return { - get() { - const wrapperFn = (...args: any[]) => { - console.warn(`Method ${memberName} is deprecated with reason: ${deprecationReason}`); - propertyDescriptor.value.apply(this, args); - }; - - Object.defineProperty(this, memberName, { - value: wrapperFn, - configurable: true, - writable: true, - }); - return wrapperFn; - }, - }; - }; -} - -export { Deprecated }; diff --git a/Website/src/builders/AlertDialog.tsx b/Website/src/builders/AlertDialog.tsx deleted file mode 100644 index f9f9184f..00000000 --- a/Website/src/builders/AlertDialog.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import ons from "onsenui"; -import { isValidElement } from "react"; -import { renderToStaticMarkup } from "react-dom/server"; - -interface Alert { - title: string; - messageHTML: string | JSX.Element; - cancelable: boolean; - callback: Function; - buttons: AlertButtons; -} - -interface AlertButtons { - positive: AlertButton; - negative: AlertButton; -} - -interface AlertButton { - title: string; - callback: Function | undefined; -} - -type BuilderConstructorOmit = Omit; - -interface Builder { - setTitle(value: string): BuilderConstructorOmit<"setTitle">; - setMessage(value: string | JSX.Element): BuilderConstructorOmit<"setMessage">; - setPositiveButton(title: string, callback?: Function): BuilderConstructorOmit<"setPositiveButton">; - setNegativeButtom(title: string, callback?: Function): BuilderConstructorOmit<"setNegativeButtom">; - setCancelable(cancel: boolean): BuilderConstructorOmit<"setCancelable">; - show(): void; -} - -interface AlertOptions { - message?: string; - messageHTML?: string | JSX.Element; - buttonLabel?: string; - buttonLabels?: string[]; - primaryButtonIndex?: number; - cancelable?: boolean; - animation?: string; - title?: string; - modifier?: string; - callback?: any; - id?: string; -} - -class AlertDialogClass implements Builder { - private dialog: Alert; - - public constructor() { - this.dialog = { - title: "", - messageHTML: "", - cancelable: true, - callback: () => {}, - buttons: { - positive: { - title: "", - callback: () => {}, - }, - negative: { - title: "", - callback: () => {}, - }, - }, - }; - } - - public setTitle(value: string): BuilderConstructorOmit<"setTitle"> { - this.dialog.title = value; - return this; - } - - public setMessage(value: string | JSX.Element): BuilderConstructorOmit<"setMessage"> { - if (isValidElement(value)) { - this.dialog.messageHTML = renderToStaticMarkup(value); - } else { - this.dialog.messageHTML = value; - } - return this; - } - - public setPositiveButton(title: string, callback?: Function): BuilderConstructorOmit<"setPositiveButton"> { - this.dialog.buttons.positive.title = title; - this.dialog.buttons.positive.callback = callback; - return this; - } - - public setNegativeButtom(title: string, callback?: Function): BuilderConstructorOmit<"setNegativeButtom"> { - this.dialog.buttons.negative.title = title; - this.dialog.buttons.negative.callback = callback; - return this; - } - - public setCancelable(cancel: boolean): BuilderConstructorOmit<"setCancelable"> { - this.dialog.cancelable = cancel; - return this; - } - - public show(): void { - const { positive, negative } = this.dialog.buttons; - const { title, messageHTML } = this.dialog; - const pla: AlertOptions = { - buttonLabels: [], - animation: "default", - primaryButtonIndex: 0, - cancelable: true, - callback: (index: number) => { - switch (index) { - case 0: - if (typeof positive.callback == "function") positive.callback(); - break; - case 1: - if (typeof negative.callback == "function") negative.callback(); - break; - default: - // Nothing - break; - } - }, - }; - pla.messageHTML = messageHTML; - pla.title = title; - if (positive.title) { - pla.buttonLabels?.push(positive.title); - } - if (negative.title) { - pla.buttonLabels?.push(negative.title); - } - // @ts-ignore - ons.notification.confirm(pla); - } -} - -type AlertDialog = typeof AlertDialog[keyof typeof AlertDialog]; -const AlertDialog: { readonly Builder: Builder } = { - Builder: new AlertDialogClass(), -} as const; - -export default AlertDialog; diff --git a/Website/src/components/ExploreModule.tsx b/Website/src/components/ExploreModule.tsx index e5ab0ed7..8ddb2391 100644 --- a/Website/src/components/ExploreModule.tsx +++ b/Website/src/components/ExploreModule.tsx @@ -126,36 +126,6 @@ export const ExploreModule = React.memo((props) => { })} label={formatLastUpdate} /> - - - - - {track.stars} - - - {isLowQuality && ( diff --git a/Website/src/components/dapi/Anchor.tsx b/Website/src/components/dapi/Anchor.tsx index af89a937..3725c6ff 100644 --- a/Website/src/components/dapi/Anchor.tsx +++ b/Website/src/components/dapi/Anchor.tsx @@ -12,7 +12,6 @@ import ModuleViewActivity from "@Activitys/ModuleViewActivity"; import ExtensionIcon from "@mui/icons-material/Extension"; import { useRepos } from "@Hooks/useRepos"; import FetchTextActivity from "@Activitys/FetchTextActivity"; -import { createRoot } from "react-dom/client"; import React from "react"; interface AnchorProps { From 6de8d2e5cde7a9e8c8277d7db26793cbbfde84b7 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 17 Jan 2024 12:48:53 +0100 Subject: [PATCH 17/77] change order to detect APatch --- Android/app/src/main/cpp/shell.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Android/app/src/main/cpp/shell.cpp b/Android/app/src/main/cpp/shell.cpp index e1a3104f..ea40c464 100644 --- a/Android/app/src/main/cpp/shell.cpp +++ b/Android/app/src/main/cpp/shell.cpp @@ -145,9 +145,9 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_dergoogler_core_NativeShell_isAPatchSU(JNIEnv *env, jclass clazz) { static char *mounts[] = { - "APD", - "apd", "APatch", + "apd", + "APD", "APATCH" }; static char *paths[] = { From 48c0cfee7807a71309217926167f2b56adeaca7f Mon Sep 17 00:00:00 2001 From: AOIAN Date: Sat, 20 Jan 2024 17:10:25 +0800 Subject: [PATCH 18/77] Update declaration.ts --- Website/src/locales/declaration.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Website/src/locales/declaration.ts b/Website/src/locales/declaration.ts index 18e85174..42f02f95 100644 --- a/Website/src/locales/declaration.ts +++ b/Website/src/locales/declaration.ts @@ -1,6 +1,7 @@ import { AvailableLangs, useStrings } from "@Hooks/useStrings"; import de from "./de.json"; import en from "./en.json"; +import zh from "./zh.json"; import React from "react"; /** @@ -8,7 +9,7 @@ import React from "react"; */ export type StringDeclaration = keyof typeof en; -export type AvailableStrs = "en" | "de"; +export type AvailableStrs = "en" | "de" | "zh"; export type Strs = { [code in AvailableStrs]: Partial>; }; @@ -16,6 +17,7 @@ export type Strs = { export const strs: Strs = { en: en, de: de, + zh: zh, }; export const useLanguageMap = (): arr => { From 3f00222f82999fe7a3c044cb267f4da4741cf5cf Mon Sep 17 00:00:00 2001 From: AOIAN Date: Sat, 20 Jan 2024 17:19:26 +0800 Subject: [PATCH 19/77] Create zh.json --- Website/src/locales/zh.json | 92 +++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 Website/src/locales/zh.json diff --git a/Website/src/locales/zh.json b/Website/src/locales/zh.json new file mode 100644 index 00000000..07d839d4 --- /dev/null +++ b/Website/src/locales/zh.json @@ -0,0 +1,92 @@ +{ + "search_modules": "模块搜索", + "settings": "设置", + "repository": "仓库", + "repositories": "仓库", + "appearance": "外观", + "accent_color": "强调颜色", + "language": "语言", + "dark_theme": "暗黑主题", + "bottom_navigation_text": "底部导航", + "bottom_navigation_subtext": "将选项卡移动到屏幕底部。", + "not_supported_in_web_version": "Web 版本不支持", + "source_code": "源代码", + "acknowledgements": "鸣谢", + "issues": "问题", + "download": "下载", + "install": "安装", + "update": "更新", + "explore": "浏览", + "installed": "已安装", + "remove": "移除", + "restore": "恢复", + "module_enabled_LOG": "{name} 已启用", + "module_disabled_LOG": "{name} 已禁用", + "add": "添加", + "cancel": "取消", + "confirm_repo_delete": "确定要移除 {name} 仓库吗?", + "submit_module": "提交模块", + "donate": "捐赠", + "support": "支持", + "website": "网站", + "no_root": "无 Root 权限", + "failed": "失败", + "no_root_message": "请确保您至少有一个 root 管理器,否则无法使用 MMRL。", + "open_magisk": "打开 Magisk", + "development": "开发", + "enabled": "已启用", + "comments": "评论", + "configureable": "可配置", + "change_boot": "更改引导", + "need_ramdisk": "需要 Ramdisk", + "add_repository": "添加仓库", + "add_repository_description": "添加您自己的仓库或其他来源的仓库。", + "explore_repositories": "浏览仓库", + "overview": "概览", + "about_this_module": "关于此模块", + "about": "关于", + "updated_on": "更新于", + "requirements": "要求", + "access": "访问", + "minimum": "最低要求", + "recommended": "推荐", + "source": "来源", + "require_sdk": "模块要求 {sdk}", + "unsupported": "不支持", + "images": "图片", + "unset": "未设置", + "yes": "是", + "no": "否", + "operating_sys": "操作系统", + "verified_module": "已验证模块", + "verified_module_desc": "此模块经过验证,已确认为由值得信赖的开发人员开发的受信任模块。", + "update_json": "使用自带的 update.json", + "update_json_desc": "此模块使用自带的 update.json 进行更新和安装。", + "shading": "着色", + "shading_title": "应用自定义着色", + "shading_desc": "小心使用,如果太暗可能无法看到 UI。", + "module": "模块", + "low_quality_module": "低质量模块", + "low_quality_modules": "低质量模块", + "low_quality_modules_subtitle": "如果模块质量低,则显示警报", + "low_quality_module_warn": "此 Magisk 模块缺少关键属性,如 id、version、versionCode、author 等,可能会影响其功能和来源。", + "invaild_modules": "无效模块", + "invaild_modules_subtitle": "显示无效模块", + "modconf": "ModConf", + "modconf_subtitle": "管理不同模块系统的一种方式", + "enable_install": "启用安装", + "enable_install_subtitle": "从 1.8.5 版本开始,MMRL 安装工具是必需的", + "scroll_to_bottom": "滚动到底部", + "scroll_to_bottom_subtitle": "在终端中自动滚动到底部", + "scroll_behavior": "滚动行为", + "terminal": "终端", + "eruda_console": "Eruda 控制台", + "eruda_console_subtitle": "用于开发和查找错误", + "share_device_infos": "共享设备信息", + "share_device_infos_subtilte": "设备规格、配置的 ModConf、应用信息和已安装的模块", + "storage": "存储", + "clear_repos": "清除仓库", + "patch_settings": "修补设置", + "patch_settings_subtitle": "添加丢失的设置键", + "sticky_search_bar": "禁用粘性搜索栏" +} From 22699fe70fb275e9eea99d79b1a75666ac8e8ee9 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 20 Jan 2024 12:28:16 +0100 Subject: [PATCH 20/77] . --- .../app/default/release/output-metadata.json | 18 +++++++++--------- Website/package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index 0af734d4..4b53d494 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-2", + "versionName": "2.13.9_alpha-3", "outputFile": "app-default-universal-release.apk" }, { @@ -20,13 +20,13 @@ "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "x86_64" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-2", - "outputFile": "app-default-armeabi-v7a-release.apk" + "versionName": "2.13.9_alpha-3", + "outputFile": "app-default-x86_64-release.apk" }, { "type": "ONE_OF_MANY", @@ -38,7 +38,7 @@ ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-2", + "versionName": "2.13.9_alpha-3", "outputFile": "app-default-x86-release.apk" }, { @@ -46,13 +46,13 @@ "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "armeabi-v7a" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-2", - "outputFile": "app-default-x86_64-release.apk" + "versionName": "2.13.9_alpha-3", + "outputFile": "app-default-armeabi-v7a-release.apk" }, { "type": "ONE_OF_MANY", @@ -64,7 +64,7 @@ ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-2", + "versionName": "2.13.9_alpha-3", "outputFile": "app-default-arm64-v8a-release.apk" } ], diff --git a/Website/package.json b/Website/package.json index 289a8d7e..3221f73e 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,7 +5,7 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "2.13.9_alpha-2", + "version_name": "2.13.9_alpha-3", "version_code": 2139 }, "main": "index.tsx", From 9f3c38168353ab015399960f17b783b85bd1e579 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 20 Jan 2024 12:30:51 +0100 Subject: [PATCH 21/77] add terminal ext (untested) --- Website/src/activitys/TerminalActivity.tsx | 37 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 82533b6c..7557d33a 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -22,9 +22,6 @@ const TerminalActivity = () => { const ref = React.useRef(null); const termEndRef = React.useRef(null); - const addLine = (line: string) => { - setLines((lines) => [...lines, line]); - }; if (settings.term_scroll_bottom) { const termBehavior = React.useMemo(() => settings.term_scroll_behavior, [settings]); @@ -34,6 +31,40 @@ const TerminalActivity = () => { }, [lines]); } + const processCommand = (rawCommand: string) => { + let arg: string | any[]; + let command: string; + console.log(rawCommand); + const i = rawCommand.indexOf(" "); + if (i != -1 && rawCommand.length != i + 1) { + arg = rawCommand + .substring(i + 1) + .trim() + .split(" "); + command = rawCommand.substring(0, i); + } else { + arg = ""; + command = rawCommand; + } + + switch (command) { + case "clearTerminal": + setLines([]); + break; + case "log": + console.log(arg[0]); + break; + } + }; + + const addLine = (line: string) => { + if (line.startsWith("#!mmrl:")) { + processCommand(line.substring(7)); + } else { + setLines((lines) => [...lines, line]); + } + }; + const install = () => { const { exploreInstall, path, id } = extra; From 556ba50e10df09283b3d5a23767a2a8b3a10396f Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 20 Jan 2024 12:31:32 +0100 Subject: [PATCH 22/77] fix return types of __shell__ --- .../src/main/java/com/dergoogler/core/NativeShell.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java index a1deb998..41f2e971 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java @@ -33,13 +33,13 @@ public String result(String command) { } @JavascriptInterface - public void isSuccess(String command) { - Shell.cmd(command).exec().isSuccess(); + public boolean isSuccess(String command) { + return Shell.cmd(command).exec().isSuccess(); } @JavascriptInterface - public void getCode(String command) { - Shell.cmd(command).exec().getCode(); + public int getCode(String command) { + return Shell.cmd(command).exec().getCode(); } @JavascriptInterface From 8abcb942d64e4eeb1e66d5466242c5869ab3da01 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 20 Jan 2024 13:27:06 +0100 Subject: [PATCH 23/77] added timestamps to local modules --- .../src/main/java/com/dergoogler/core/NativeSuFile.java | 6 ++++++ Website/src/hooks/useLocalModules.ts | 7 ++++++- Website/src/hooks/useModulesFilter.tsx | 4 ++-- Website/src/hooks/useRepos.tsx | 4 ++-- Website/src/native/SuFile.ts | 9 +++++++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java b/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java index 2086eb51..bff4619e 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeSuFile.java @@ -15,6 +15,7 @@ import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.util.Date; public class NativeSuFile { private final MainActivity ctx; @@ -67,6 +68,11 @@ public String list(String delimiter) { } } + @JavascriptInterface + public long lastModified() { + return file.lastModified(); + } + @JavascriptInterface public boolean create() { return file.createNewFile(); diff --git a/Website/src/hooks/useLocalModules.ts b/Website/src/hooks/useLocalModules.ts index 8bf4593e..452c2fe4 100644 --- a/Website/src/hooks/useLocalModules.ts +++ b/Website/src/hooks/useLocalModules.ts @@ -19,7 +19,12 @@ export function useLocalModules() { setLocalModules((prev) => { // Preventing duplicates const ids = new Set(prev.map((d) => d.id)); - const merged = [...prev, ...[new Properties(properties.read()).toObject() as unknown as Module].filter((d) => !ids.has(d.id))]; + const merged = [ + ...prev, + ...[{ ...(new Properties(properties.read()).toObject() as unknown as Module), timestamp: properties.lastModified() }].filter( + (d) => !ids.has(d.id) + ), + ]; return merged; }); } diff --git a/Website/src/hooks/useModulesFilter.tsx b/Website/src/hooks/useModulesFilter.tsx index 049cdf90..265ed80d 100644 --- a/Website/src/hooks/useModulesFilter.tsx +++ b/Website/src/hooks/useModulesFilter.tsx @@ -26,13 +26,13 @@ export const filters = [ name: "By date (newest)", icon: CalendarMonthIcon, value: "date_newest", - allowedIds: ["explore"], + allowedIds: ["explore", "local"], }, { name: "By date (oldest)", icon: CalendarMonthIcon, value: "date_oldest", - allowedIds: ["explore"], + allowedIds: ["explore", "local"], }, { name: "Alphabetically", diff --git a/Website/src/hooks/useRepos.tsx b/Website/src/hooks/useRepos.tsx index 51a750d4..a884ab6d 100644 --- a/Website/src/hooks/useRepos.tsx +++ b/Website/src/hooks/useRepos.tsx @@ -53,10 +53,10 @@ export const RepoProvider = (props: React.PropsWithChildren) => { { name: "Googlers Magisk Repo", website: "https://mmrl.dergoogler.com", - support: "https://github.com/Googlers-Repo/repo/issues", + support: "https://github.com/Googlers-Repo/gmr/issues", donate: "https://github.com/sponsors/DerGoogler", submission: null, - base_url: "https://gr.dergoogler.com/repo/", + base_url: "https://gr.dergoogler.com/gmr/", max_num: 3, enable_log: true, log_dir: "log", diff --git a/Website/src/native/SuFile.ts b/Website/src/native/SuFile.ts index 89d7b1fa..90216463 100644 --- a/Website/src/native/SuFile.ts +++ b/Website/src/native/SuFile.ts @@ -18,6 +18,7 @@ interface NativeSuFileV2 { write(data: string): void; read(): string; list(delimiter: string | null): string; + lastModified(): number; create(): boolean; delete(): boolean; deleteRecursive(): void; @@ -70,6 +71,14 @@ class SuFile extends Native { } } + public lastModified(): number { + if (this.isAndroid) { + return this._file.lastModified(); + } else { + return 0; + } + } + public exist(): boolean { if (this.isAndroid) { return this._file.exists(); From 5fa58ebcabb419af231406a10e2ca55753b9e6d1 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 20 Jan 2024 17:01:13 +0100 Subject: [PATCH 24/77] improve updates --- Android/app/src/main/res/xml/config.xml | 8 ++ Website/src/activitys/MainApplication.tsx | 20 ++++ .../activitys/fragments/ModuleFragment.tsx | 4 +- Website/src/components/DeviceModule.tsx | 44 +++++-- Website/src/hooks/useModConf.tsx | 51 +------- Website/src/locales/de.json | 3 +- Website/src/locales/en.json | 5 +- Website/src/typings/global.d.ts | 113 ++---------------- Website/src/util/stringFormat.ts | 49 ++++++++ 9 files changed, 130 insertions(+), 167 deletions(-) create mode 100644 Website/src/util/stringFormat.ts diff --git a/Android/app/src/main/res/xml/config.xml b/Android/app/src/main/res/xml/config.xml index 25724c8d..0a72bf77 100644 --- a/Android/app/src/main/res/xml/config.xml +++ b/Android/app/src/main/res/xml/config.xml @@ -8,11 +8,19 @@ Der_Googler + + + + + + + + diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 0649c4fc..0240e72f 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -31,6 +31,7 @@ import { useModConf } from "@Hooks/useModConf"; import Fab from "@Components/onsenui/Fab"; import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; +import Divider from "@mui/material/Divider"; interface SearchbarRef { clear(): void; @@ -170,6 +171,25 @@ const MainApplication = () => { ); } }} + group={{ + by: (grpMod) => { + const onlineModule = modules.find((module) => module.id === grpMod.id); + return onlineModule ? (grpMod.versionCode < onlineModule.versionCode ? "0" : "1") : "2"; + }, + separator: (group, idx, groupLabel) => { + switch (groupLabel) { + case "0": + return Updateable; + case "1": + return ; + case "2": + return <>; + default: + return <>; + } + }, + separatorAtTheBottom: false, + }} /> ), tab: , diff --git a/Website/src/activitys/fragments/ModuleFragment.tsx b/Website/src/activitys/fragments/ModuleFragment.tsx index 677bd57d..aebe5687 100644 --- a/Website/src/activitys/fragments/ModuleFragment.tsx +++ b/Website/src/activitys/fragments/ModuleFragment.tsx @@ -1,7 +1,7 @@ import React from "react"; import Stack from "@mui/material/Stack"; import Box from "@mui/material/Box"; -import FlatList from "flatlist-react"; +import FlatList, { FlatListProps } from "flatlist-react"; import { useTheme } from "@Hooks/useTheme"; import { Page, RenderFunction } from "@Components/onsenui/Page"; import { MissingInternet } from "@Components/MissingInternet"; @@ -39,6 +39,7 @@ export interface ModuleFragmentProps { search: string; id: "explore" | "update" | "local"; modules: Array; + group?: FlatListProps["group"]; renderItem: renderFunc; renderFixed?: RenderFunction; } @@ -168,6 +169,7 @@ const ModuleFragment = React.memo((props) => { row: true, rowGap: "8px", }} + group={props.group} /> diff --git a/Website/src/components/DeviceModule.tsx b/Website/src/components/DeviceModule.tsx index 03cdd0e3..5dd79335 100644 --- a/Website/src/components/DeviceModule.tsx +++ b/Website/src/components/DeviceModule.tsx @@ -9,7 +9,7 @@ import { useActivity } from "@Hooks/useActivity"; import { ConfigureActivity } from "@Activitys/ConfigureActivity"; import { StyledIconButton } from "./StyledIconButton"; import { useLog } from "@Hooks/native/useLog"; -import { Properties } from "properties-file"; +import { link } from "googlers-tools"; import { colors, useSettings } from "@Hooks/useSettings"; import { useTheme } from "@Hooks/useTheme"; import TerminalActivity from "@Activitys/TerminalActivity"; @@ -39,13 +39,13 @@ const DeviceModule = React.memo((props) => { const { modConf } = useModConf(); const { theme } = useTheme(); const { context, extra } = useActivity(); - const { modules } = useRepos(); + const { modules, repos } = useRepos(); const [isEnabled, setIsEnabled] = React.useState(true); const [isSwitchDisabled, setIsSwitchDisabled] = React.useState(false); const log = useLog("DeviceModule"); - const { id, name, version, versionCode, author, description } = props.module; + const { id, name, version, versionCode, author, description, updateJson: __updateJson } = props.module; const format = React.useCallback<(key: K) => ModConf[K]>((key) => modConf(key, { MODID: id }), []); @@ -65,11 +65,41 @@ const DeviceModule = React.memo((props) => { const boot_complete = SuFile.exist(format("BOOTCOMP")); const module_config_file = SuFile.exist(format("CONFINDEX")); - const findOnlineModule = React.useMemo(() => modules.find((module) => module.id === id), [modules]) as Module; + const [updateJson, setUpdateJson] = React.useState(null); + + if (__updateJson && link.validURL(__updateJson)) { + React.useEffect(() => { + fetch(__updateJson) + .then((res) => { + if (res.status == 200) { + return res.json(); + } else { + log.e(res.statusText); + } + }) + .then((json: UpdateJson) => setUpdateJson(json)); + }, [repos]); + } else { + log.w(strings("dm_update_json_fetch_warn", { id: id })); + } const hasUpdate = React.useMemo(() => { - return findOnlineModule && versionCode < findOnlineModule.versionCode; - }, [findOnlineModule]); + const onlineModule = modules.find((module) => module.id === id); + if (__updateJson && updateJson) { + return versionCode < updateJson.versionCode; + } else { + return onlineModule && versionCode < onlineModule.versionCode; + } + }, [modules]); + + const getDownload = React.useMemo(() => { + const onlineModule = modules.find((module) => module.id === id); + if (__updateJson && updateJson) { + return updateJson.zipUrl; + } else { + return onlineModule && onlineModule.versions[onlineModule.versions.length - 1].zipUrl; + } + }, [modules]); const isLowQuality = useLowQualityModule(props.module, !settings._low_quality_module); @@ -216,7 +246,7 @@ const DeviceModule = React.memo((props) => { key: "TerminalActivity", extra: { exploreInstall: true, - path: findOnlineModule.versions[findOnlineModule.versions.length - 1].zipUrl, + path: getDownload, }, }); }} diff --git a/Website/src/hooks/useModConf.tsx b/Website/src/hooks/useModConf.tsx index 0423a288..f8defc31 100644 --- a/Website/src/hooks/useModConf.tsx +++ b/Website/src/hooks/useModConf.tsx @@ -2,6 +2,7 @@ import React, { createContext, useContext } from "react"; import { defaultComposer } from "default-composer"; import { useNativeStorage } from "./useNativeStorage"; import { SetStateAction } from "./useStateCallback"; +import { formatObjectEntries, formatString } from "@Util/stringFormat"; export interface ModConf { //cli @@ -101,56 +102,6 @@ export const useModConf = () => { return useContext(ModConfContext); }; -export function formatString(template: string, object: object): string { - return template.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => { - const keys = key.split("."); - let value = object; - for (const k of keys) { - if (k in value) { - value = value[k]; - } else { - return match; - } - } - return formatString(String(value), object); - }); -} - -export function formatObjectEntries(object: O): O { - const formatValue = (value: any): any => { - if (typeof value === "string") { - return value.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => { - const keys = key.split("."); - let tempValue = object; - for (const k of keys) { - if (k in tempValue) { - tempValue = tempValue[k]; - } else { - return match; - } - } - return formatValue(tempValue); - }); - } else if (Array.isArray(value)) { - return value.map((item: any) => formatValue(item)); - } else if (typeof value === "object" && value !== null) { - const formattedObject: any = {}; - for (const prop in value) { - formattedObject[prop] = formatValue(value[prop]); - } - return formattedObject; - } - return value; - }; - - const formattedObject: any = {}; - for (const key in object) { - const formattedValue = formatValue(object[key]); - formattedObject[key] = formattedValue; - } - return formattedObject; -} - export const ModConfProvider = (props: React.PropsWithChildren) => { const [modConf, setModConf] = useNativeStorage("modconf_v4", INITIAL_MOD_CONF); diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json index 90b89747..33bb5b9c 100644 --- a/Website/src/locales/de.json +++ b/Website/src/locales/de.json @@ -88,5 +88,6 @@ "storage": "Speicher", "clear_repos": "Repositorys löschen", "patch_settings": "Einstellungen patchen", - "patch_settings_subtitle": "Fehlende Einstellungsschlüssel hinzufügen" + "patch_settings_subtitle": "Fehlende Einstellungsschlüssel hinzufügen", + "dm_update_json_fetch_warn": "{id} hat eine leere Eigenschaft „updateJson“ oder der Link ist ungültig" } diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json index 7bf95956..1dc4fea8 100644 --- a/Website/src/locales/en.json +++ b/Website/src/locales/en.json @@ -90,5 +90,6 @@ "clear_repos": "Clear repositories", "patch_settings": "Patch settings", "patch_settings_subtitle": "Add missing settings keys", - "sticky_search_bar": "Disable sticky search bar" -} \ No newline at end of file + "sticky_search_bar": "Disable sticky search bar", + "dm_update_json_fetch_warn": "{id} has empty „updateJson“ property or the link isn't valid" +} diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index 1c06cc74..f5e08050 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -153,6 +153,7 @@ declare global { versionCode: number; author: string; description: string; + updateJson?: string; added: number; timestamp: number; track: Track; @@ -200,112 +201,12 @@ declare global { changelog: string; } - // interface StoredRepo extends Omit { - // modules: string; - // } - - // interface Repo { - // /** - // * An required filed, to disply the repository name - // */ - // name: string; - // mmrlOwner?: string; - // /** - // * An given website link for the repository - // */ - // website?: string; - // /** - // * Given support link i.g. Telegram, Xda, GitHub or something - // */ - // support?: string; - // donate?: string; - // submitModule?: string; - // last_update: number; - // modules: Module[]; - // } - - // export interface Root { - // last_update: number; - // name: string; - // website: any; - // support: any; - // donate: any; - // submitModule: string; - // modules: Module[]; - // } - - // /** Allows developers to translate their description */ - // export type ModuleDescription = Record; - - // export interface Module { - // id: string; - // name: string; - // version?: number; - // versionCode: number; - // author?: string; - // description?: string | ModuleDescription; - // valid: boolean; - // verified: boolean; - // hidden: boolean; - // download: string; - // last_update: number; - // readme: string; - // stars: number; - // updateJson: string; - // about: About; - // mmrl: Mmrl; - // fox: Fox; - // } - - // export interface UpdateJson { - // version: string; - // versionCode: number; - // zipUrl: string; - // changelog: string; - // } - - // export interface About { - // repo_source: string; - // language: string; - // issues?: string; - // source: string; - // } - - // export interface MmrlAuthor { - // name: string; - // avatar: string; - // bio: string; - // followers: number; - // verified: boolean; - // } - - // export interface Mmrl { - // author?: MmrlAuthor; - // contributors?: Array; - // cover?: string; - // logo?: string; - // screenshots?: Array; - // categories?: Array; - // require?: Array; - // developerNote?: { - // severity?: AlertColor; - // note?: string; - // }; - // minKernelSU?: number; - // supportedRoots?: string - // } - - // export interface Fox { - // minApi?: number; - // maxApi?: number; - // minMagisk?: number; - // needRamdisk?: boolean; - // support?: string; - // donate?: string; - // config?: string; - // changeBoot?: boolean; - // mmtReborn?: boolean; - // } + export interface UpdateJson { + version: string; + versionCode: number; + zipUrl: string; + changelog: string; + } // OnsenUI Types /** diff --git a/Website/src/util/stringFormat.ts b/Website/src/util/stringFormat.ts new file mode 100644 index 00000000..a73d100e --- /dev/null +++ b/Website/src/util/stringFormat.ts @@ -0,0 +1,49 @@ +export function formatString(template: string, object: object): string { + return template.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => { + const keys = key.split("."); + let value = object; + for (const k of keys) { + if (k in value) { + value = value[k]; + } else { + return match; + } + } + return formatString(String(value), object); + }); + } + + export function formatObjectEntries(object: O): O { + const formatValue = (value: any): any => { + if (typeof value === "string") { + return value.replace(/\<(\w+(\.\w+)*)\>/gi, (match, key) => { + const keys = key.split("."); + let tempValue = object; + for (const k of keys) { + if (k in tempValue) { + tempValue = tempValue[k]; + } else { + return match; + } + } + return formatValue(tempValue); + }); + } else if (Array.isArray(value)) { + return value.map((item: any) => formatValue(item)); + } else if (typeof value === "object" && value !== null) { + const formattedObject: any = {}; + for (const prop in value) { + formattedObject[prop] = formatValue(value[prop]); + } + return formattedObject; + } + return value; + }; + + const formattedObject: any = {}; + for (const key in object) { + const formattedValue = formatValue(object[key]); + formattedObject[key] = formattedValue; + } + return formattedObject; + } \ No newline at end of file From 59091bdee0f2e19ad93b68b86a43cc98bc0f61e7 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 20 Jan 2024 23:18:10 +0100 Subject: [PATCH 25/77] improve module updates --- Android/app/build.gradle | 1 + .../app/default/release/output-metadata.json | 26 +- .../com/dergoogler/plugin/FetchPlugin.java | 170 ++++++++ Android/app/src/main/res/xml/config.xml | 12 +- Website/package.json | 2 +- Website/src/activitys/MainApplication.tsx | 31 +- Website/src/components/DeviceModule.tsx | 63 +-- Website/src/components/UpdateModule.tsx | 138 +++++++ Website/src/locales/de.json | 1 + Website/src/locales/en.json | 1 + www/cordova_plugins.js | 15 +- .../com.dergoogler.plugin/www/fetch.js | 377 ++++++++++++++++++ 12 files changed, 733 insertions(+), 104 deletions(-) create mode 100644 Android/app/src/main/java/com/dergoogler/plugin/FetchPlugin.java create mode 100644 Website/src/components/UpdateModule.tsx create mode 100644 www/plugins/com.dergoogler.plugin/www/fetch.js diff --git a/Android/app/build.gradle b/Android/app/build.gradle index 1977aee7..4c780d38 100755 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -94,6 +94,7 @@ dependencies { implementation "androidx.appcompat:appcompat:1.6.1" implementation 'org.apache.cordova:framework:12.0.1' implementation 'androidx.webkit:webkit:1.9.0' + implementation 'com.squareup.okhttp3:okhttp:4.9.0' } configurations.implementation.setCanBeResolved(true) diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index 4b53d494..ce1e211f 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-3", + "versionName": "2.13.9_alpha-4", "outputFile": "app-default-universal-release.apk" }, { @@ -20,52 +20,52 @@ "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "x86" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-3", - "outputFile": "app-default-x86_64-release.apk" + "versionName": "2.13.9_alpha-4", + "outputFile": "app-default-x86-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86" + "value": "armeabi-v7a" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-3", - "outputFile": "app-default-x86-release.apk" + "versionName": "2.13.9_alpha-4", + "outputFile": "app-default-armeabi-v7a-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "arm64-v8a" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-3", - "outputFile": "app-default-armeabi-v7a-release.apk" + "versionName": "2.13.9_alpha-4", + "outputFile": "app-default-arm64-v8a-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "arm64-v8a" + "value": "x86_64" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-3", - "outputFile": "app-default-arm64-v8a-release.apk" + "versionName": "2.13.9_alpha-4", + "outputFile": "app-default-x86_64-release.apk" } ], "elementType": "File" diff --git a/Android/app/src/main/java/com/dergoogler/plugin/FetchPlugin.java b/Android/app/src/main/java/com/dergoogler/plugin/FetchPlugin.java new file mode 100644 index 00000000..76922a79 --- /dev/null +++ b/Android/app/src/main/java/com/dergoogler/plugin/FetchPlugin.java @@ -0,0 +1,170 @@ +package com.dergoogler.plugin; + +import android.util.Base64; +import android.util.Log; + +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.Call; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +public class FetchPlugin extends CordovaPlugin { + + public static final String LOG_TAG = "FetchPlugin"; + private static CallbackContext callbackContext; + + private OkHttpClient mClient = new OkHttpClient(); + public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"); + + private static final long DEFAULT_TIMEOUT = 10; + + @Override + public boolean execute(final String action, final JSONArray data, final CallbackContext callbackContext) { + + if (action.equals("fetch")) { + + try { + String method = data.getString(0); + Log.v(LOG_TAG, "execute: method = " + method.toString()); + + String urlString = data.getString(1); + Log.v(LOG_TAG, "execute: urlString = " + urlString.toString()); + + String postBody = data.getString(2); + Log.v(LOG_TAG, "execute: postBody = " + postBody.toString()); + + JSONObject headers = data.getJSONObject(3); + if (headers.has("map") && headers.getJSONObject("map") != null) { + headers = headers.getJSONObject("map"); + } + + Log.v(LOG_TAG, "execute: headers = " + headers.toString()); + + Request.Builder requestBuilder = new Request.Builder(); + + // method + postBody + if (postBody != null && !postBody.equals("null")) { + // requestBuilder.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody.toString())); + String contentType; + if (headers.has("content-type")) { + JSONArray contentTypeHeaders = headers.getJSONArray("content-type"); + contentType = contentTypeHeaders.getString(0); + } else { + contentType = "application/json"; + } + requestBuilder.post(RequestBody.create(MediaType.parse(contentType), postBody.toString())); + } else { + requestBuilder.method(method, null); + } + + // url + requestBuilder.url(urlString); + + // headers + if (headers != null && headers.names() != null && headers.names().length() > 0) { + for (int i = 0; i < headers.names().length(); i++) { + + String headerName = headers.names().getString(i); + JSONArray headerValues = headers.getJSONArray(headers.names().getString(i)); + + if (headerValues.length() > 0) { + String headerValue = headerValues.getString(0); + Log.v(LOG_TAG, "key = " + headerName + " value = " + headerValue); + requestBuilder.addHeader(headerName, headerValue); + } + } + } + + Request request = requestBuilder.build(); + + mClient.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException throwable) { + throwable.printStackTrace(); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, throwable.getMessage())); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + + JSONObject result = new JSONObject(); + try { + Headers responseHeaders = response.headers(); + + JSONObject allHeaders = new JSONObject(); + + if (responseHeaders != null) { + for (int i = 0; i < responseHeaders.size(); i++) { + if (responseHeaders.name(i).compareToIgnoreCase("set-cookie") == 0 && + allHeaders.has(responseHeaders.name(i))) { + allHeaders.put(responseHeaders.name(i), allHeaders.get(responseHeaders.name(i)) + ",\n" + responseHeaders.value(i)); + continue; + } + allHeaders.put(responseHeaders.name(i), responseHeaders.value(i)); + } + } + + result.put("headers", allHeaders); + + if (response.body().contentType().type().equals("image")) { + result.put("isBlob", true); + result.put("body", Base64.encodeToString(response.body().bytes(), Base64.DEFAULT)); + } else { + result.put("body", response.body().string()); + } + + result.put("statusText", response.message()); + result.put("status", response.code()); + result.put("url", response.request().url().toString()); + + } catch (Exception e) { + e.printStackTrace(); + } + + Log.v(LOG_TAG, "HTTP code: " + response.code()); + Log.v(LOG_TAG, "returning: " + result.toString()); + + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result)); + } + }); + + } catch (JSONException e) { + Log.e(LOG_TAG, "execute: Got JSON Exception " + e.getMessage()); + callbackContext.error(e.getMessage()); + } + + } else if (action.equals("setTimeout")) { + this.setTimeout(data.optLong(0, DEFAULT_TIMEOUT)); + } else { + Log.e(LOG_TAG, "Invalid action : " + action); + callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.INVALID_ACTION)); + return false; + } + + return true; + } + + private void setTimeout(long seconds) { + Log.v(LOG_TAG, "setTimeout: " + seconds); + + mClient = mClient.newBuilder() + .connectTimeout(seconds, TimeUnit.SECONDS) + .readTimeout(seconds, TimeUnit.SECONDS) + .writeTimeout(seconds, TimeUnit.SECONDS) + .build(); + } +} \ No newline at end of file diff --git a/Android/app/src/main/res/xml/config.xml b/Android/app/src/main/res/xml/config.xml index 0a72bf77..a478b11d 100644 --- a/Android/app/src/main/res/xml/config.xml +++ b/Android/app/src/main/res/xml/config.xml @@ -22,11 +22,15 @@ - - - - + + + + + + + + \ No newline at end of file diff --git a/Website/package.json b/Website/package.json index 3221f73e..36007cb2 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,7 +5,7 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "2.13.9_alpha-3", + "version_name": "2.13.9_alpha-4", "version_code": 2139 }, "main": "index.tsx", diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 0240e72f..ad6bda3f 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -32,6 +32,7 @@ import Fab from "@Components/onsenui/Fab"; import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; import Divider from "@mui/material/Divider"; +import UpdateModule from "@Components/UpdateModule"; interface SearchbarRef { clear(): void; @@ -171,29 +172,21 @@ const MainApplication = () => { ); } }} - group={{ - by: (grpMod) => { - const onlineModule = modules.find((module) => module.id === grpMod.id); - return onlineModule ? (grpMod.versionCode < onlineModule.versionCode ? "0" : "1") : "2"; - }, - separator: (group, idx, groupLabel) => { - switch (groupLabel) { - case "0": - return Updateable; - case "1": - return ; - case "2": - return <>; - default: - return <>; - } - }, - separatorAtTheBottom: false, - }} /> ), tab: , }, + { + content: ( + } + /> + ), + tab: , + }, ] : []), ]; diff --git a/Website/src/components/DeviceModule.tsx b/Website/src/components/DeviceModule.tsx index 5dd79335..c3223039 100644 --- a/Website/src/components/DeviceModule.tsx +++ b/Website/src/components/DeviceModule.tsx @@ -65,42 +65,6 @@ const DeviceModule = React.memo((props) => { const boot_complete = SuFile.exist(format("BOOTCOMP")); const module_config_file = SuFile.exist(format("CONFINDEX")); - const [updateJson, setUpdateJson] = React.useState(null); - - if (__updateJson && link.validURL(__updateJson)) { - React.useEffect(() => { - fetch(__updateJson) - .then((res) => { - if (res.status == 200) { - return res.json(); - } else { - log.e(res.statusText); - } - }) - .then((json: UpdateJson) => setUpdateJson(json)); - }, [repos]); - } else { - log.w(strings("dm_update_json_fetch_warn", { id: id })); - } - - const hasUpdate = React.useMemo(() => { - const onlineModule = modules.find((module) => module.id === id); - if (__updateJson && updateJson) { - return versionCode < updateJson.versionCode; - } else { - return onlineModule && versionCode < onlineModule.versionCode; - } - }, [modules]); - - const getDownload = React.useMemo(() => { - const onlineModule = modules.find((module) => module.id === id); - if (__updateJson && updateJson) { - return updateJson.zipUrl; - } else { - return onlineModule && onlineModule.versions[onlineModule.versions.length - 1].zipUrl; - } - }, [modules]); - const isLowQuality = useLowQualityModule(props.module, !settings._low_quality_module); return ( @@ -224,36 +188,11 @@ const DeviceModule = React.memo((props) => { {isLowQuality && ( - + {strings("low_quality_module")} {strings("low_quality_module_warn")} )} - {hasUpdate && ( - - )} ); diff --git a/Website/src/components/UpdateModule.tsx b/Website/src/components/UpdateModule.tsx new file mode 100644 index 00000000..4d4debc1 --- /dev/null +++ b/Website/src/components/UpdateModule.tsx @@ -0,0 +1,138 @@ +import { SuFile } from "@Native/SuFile"; +import { DeleteRounded, RefreshRounded } from "@mui/icons-material"; +import React from "react"; +import { useStrings } from "@Hooks/useStrings"; +import { Android12Switch } from "./Android12Switch"; +import { Alert, AlertTitle, Box, Button, Card, Chip, Divider, Stack, SxProps, Theme, Typography } from "@mui/material"; +import SettingsIcon from "@mui/icons-material/Settings"; +import { useActivity } from "@Hooks/useActivity"; +import { ConfigureActivity } from "@Activitys/ConfigureActivity"; +import { StyledIconButton } from "./StyledIconButton"; +import { useLog } from "@Hooks/native/useLog"; +import { link } from "googlers-tools"; +import { colors, useSettings } from "@Hooks/useSettings"; +import { useTheme } from "@Hooks/useTheme"; +import TerminalActivity from "@Activitys/TerminalActivity"; +import { useRepos } from "@Hooks/useRepos"; +import { ModConf, useModConf } from "@Hooks/useModConf"; +import { useLowQualityModule } from "@Hooks/useLowQualityModule"; + +export const badgeStyle: (color: (typeof colors)["blue" | "teal" | "red" | "orange"]) => SxProps = (color) => { + return { + px: 1, + py: 0.5, + borderRadius: 1, + display: "flex", + typography: "caption", + bgcolor: (theme) => (theme.palette.mode === "dark" ? color[900] : color[50]), + color: (theme) => (theme.palette.mode === "dark" ? "#fff" : color[700]), + }; +}; + +interface Props { + module: Module; +} + +const UpdateModule = React.memo((props) => { + const { strings } = useStrings(); + const { theme } = useTheme(); + const { context } = useActivity(); + const { modules, repos } = useRepos(); + + const log = useLog("UpdateModule"); + + const { id, name, version, versionCode, description, updateJson: __updateJson } = props.module; + + const [updateJson, setUpdateJson] = React.useState(null); + + if (__updateJson && link.validURL(__updateJson)) { + React.useEffect(() => { + fetch(__updateJson) + .then((res) => res.json()) + .then((json: UpdateJson) => setUpdateJson(json)); + }, [repos]); + } else { + log.d(strings("dm_update_json_fetch_warn", { id: id })); + } + + const hasUpdate = React.useMemo(() => { + const onlineModule = modules.find((module) => module.id === id); + if (__updateJson && updateJson) { + return versionCode < Number(updateJson.versionCode); + } else { + return onlineModule && versionCode < onlineModule.versionCode; + } + }, [updateJson, modules, repos]); + + + const updatedModule = React.useMemo(() => { + const onlineModule = modules.find((module) => module.id === id); + if (__updateJson && updateJson) { + return updateJson; + } else { + return onlineModule && onlineModule.versions[onlineModule.versions.length - 1]; + } + }, [updateJson, modules, repos]); + + if (!hasUpdate) return null; + + return ( + <> + + + + + {name} + {" "} + + {version} ({versionCode}) {"=>"} {updatedModule?.version} ({updatedModule?.versionCode}) + + + {description as string} + + + + + {/* + + + ({ + bgcolor: `${settings.darkmode ? shade(scheme[200], -24.5) : shade(scheme[300], 49)}46`, + })} + label={formatLastUpdate} + /> + */} + + + + + ); +}); + +export default UpdateModule; diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json index 33bb5b9c..30277a53 100644 --- a/Website/src/locales/de.json +++ b/Website/src/locales/de.json @@ -1,4 +1,5 @@ { + "updates": "Updates", "versions": "Versionen", "license": "Lizenz", "search_modules": "Module durchsuchen", diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json index 1dc4fea8..aa5edb0c 100644 --- a/Website/src/locales/en.json +++ b/Website/src/locales/en.json @@ -1,4 +1,5 @@ { + "updates": "Updates", "versions": "Versions", "license": "License", "search_modules": "Search modules", diff --git a/www/cordova_plugins.js b/www/cordova_plugins.js index ae395f73..fb5e32e2 100644 --- a/www/cordova_plugins.js +++ b/www/cordova_plugins.js @@ -1,14 +1,19 @@ cordova.define("cordova/plugin_list", function (require, exports, module) { module.exports = [ - { - file: "plugins/com.dergoogler.plugin/www/terminal.js", - id: "com.dergoogler.plugin.terminal", - clobbers: ["Terminal"], - }, { file: "plugins/com.dergoogler.plugin/www/chooser.js", id: "com.dergoogler.plugin.chooser", clobbers: ["Chooser"], }, + { + file: "plugins/com.dergoogler.plugin/www/fetch.js", + id: "com.dergoogler.plugin.fetch", + clobbers: ["fetch"], + }, + { + file: "plugins/com.dergoogler.plugin/www/terminal.js", + id: "com.dergoogler.plugin.terminal", + clobbers: ["Terminal"], + }, ]; }); diff --git a/www/plugins/com.dergoogler.plugin/www/fetch.js b/www/plugins/com.dergoogler.plugin/www/fetch.js new file mode 100644 index 00000000..eda2b247 --- /dev/null +++ b/www/plugins/com.dergoogler.plugin/www/fetch.js @@ -0,0 +1,377 @@ +/* global cordova:false */ + +cordova.define( + "com.dergoogler.plugin.fetch", + function (require, exports, module) { + /*! + * Module dependencies. + */ + var exec = require("cordova/exec"); + + function normalizeName(name) { + if (typeof name !== "string") { + name = String(name); + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError("Invalid character in header field name"); + } + return name.toLowerCase(); + } + + function normalizeValue(value) { + if (typeof value !== "string") { + value = String(value); + } + return value; + } + + function Headers(headers) { + this.map = {}; + + if (headers instanceof Headers || headers instanceof window.Headers) { + headers.forEach(function (value, name) { + this.append(name, value); + }, this); + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function (name) { + this.append(name, headers[name]); + }, this); + } + } + + Headers.prototype.append = function (name, value) { + name = normalizeName(name); + value = normalizeValue(value); + var list = this.map[name]; + if (!list) { + list = []; + this.map[name] = list; + } + list.push(value); + }; + + Headers.prototype["delete"] = function (name) { + delete this.map[normalizeName(name)]; + }; + + Headers.prototype.get = function (name) { + var values = this.map[normalizeName(name)]; + return values ? values[0] : null; + }; + + Headers.prototype.getAll = function (name) { + return this.map[normalizeName(name)] || []; + }; + + Headers.prototype.has = function (name) { + return this.map.hasOwnProperty(normalizeName(name)); + }; + + Headers.prototype.set = function (name, value) { + this.map[normalizeName(name)] = [normalizeValue(value)]; + }; + + Headers.prototype.forEach = function (callback, thisArg) { + Object.getOwnPropertyNames(this.map).forEach(function (name) { + this.map[name].forEach(function (value) { + callback.call(thisArg, value, name, this); + }, this); + }, this); + }; + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError("Already read")); + } + body.bodyUsed = true; + } + + function fileReaderReady(reader) { + return new Promise(function (resolve, reject) { + reader.onload = function () { + resolve(reader.result); + }; + reader.onerror = function () { + reject(reader.error); + }; + }); + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader(); + reader.readAsArrayBuffer(blob); + return fileReaderReady(reader); + } + + function readBlobAsText(blob) { + var reader = new FileReader(); + reader.readAsText(blob); + return fileReaderReady(reader); + } + + function b64toBlob(b64Data, contentType, sliceSize) { + contentType = contentType || ""; + sliceSize = sliceSize || 512; + + var byteCharacters = atob(b64Data); + var byteArrays = []; + + for ( + var offset = 0; + offset < byteCharacters.length; + offset += sliceSize + ) { + var slice = byteCharacters.slice(offset, offset + sliceSize); + + var byteNumbers = new Array(slice.length); + for (var i = 0; i < slice.length; i++) { + byteNumbers[i] = slice.charCodeAt(i); + } + + var byteArray = new Uint8Array(byteNumbers); + + byteArrays.push(byteArray); + } + + var blob = new Blob(byteArrays, { type: contentType }); + return blob; + } + + var support = { + blob: + "FileReader" in self && + "Blob" in self && + (function () { + try { + new Blob(); + return true; + } catch (e) { + return false; + } + })(), + formData: "FormData" in self, + }; + + function Body() { + this.bodyUsed = false; + + this._initBody = function (body) { + this._bodyInit = body; + if (typeof body === "string") { + this._bodyText = body; + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body; + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body; + } else if (!body) { + this._bodyText = ""; + } else { + throw new Error("unsupported BodyInit type"); + } + }; + + if (support.blob) { + this.blob = function () { + var rejected = consumed(this); + if (rejected) { + return rejected; + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob); + } else if (this._bodyFormData) { + throw new Error("could not read FormData body as blob"); + } else { + return Promise.resolve(new Blob([this._bodyText])); + } + }; + + this.arrayBuffer = function () { + return this.blob().then(readBlobAsArrayBuffer); + }; + + this.text = function () { + var rejected = consumed(this); + if (rejected) { + return rejected; + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob); + } else if (this._bodyFormData) { + throw new Error("could not read FormData body as text"); + } else { + return Promise.resolve(this._bodyText); + } + }; + } else { + this.text = function () { + var rejected = consumed(this); + return rejected ? rejected : Promise.resolve(this._bodyText); + }; + } + + if (support.formData) { + this.formData = function () { + return this.text().then(decode); + }; + } + + this.json = function () { + return this.text().then(JSON.parse); + }; + + return this; + } + + // HTTP methods whose capitalization should be normalized + var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"]; + + function normalizeMethod(method) { + var upcased = method.toUpperCase(); + return methods.indexOf(upcased) > -1 ? upcased : method; + } + + function Request(input, options) { + options = options || {}; + var body = options.body; + if (Request.prototype.isPrototypeOf(input)) { + if (input.bodyUsed) { + throw new TypeError("Already read"); + } + this.url = input.url; + this.credentials = input.credentials; + if (!options.headers) { + this.headers = new Headers(input.headers); + } + this.method = input.method; + this.mode = input.mode; + if (!body) { + body = input._bodyInit; + input.bodyUsed = true; + } + } else { + this.url = input; + } + + this.credentials = options.credentials || this.credentials || "omit"; + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers); + } + this.method = normalizeMethod(options.method || this.method || "GET"); + this.mode = options.mode || this.mode || null; + this.referrer = null; + + if ((this.method === "GET" || this.method === "HEAD") && body) { + throw new TypeError("Body not allowed for GET or HEAD requests"); + } + this._initBody(body); + } + + function decode(body) { + var form = new FormData(); + body + .trim() + .split("&") + .forEach(function (bytes) { + if (bytes) { + var split = bytes.split("="); + var name = split.shift().replace(/\+/g, " "); + var value = split.join("=").replace(/\+/g, " "); + form.append(decodeURIComponent(name), decodeURIComponent(value)); + } + }); + return form; + } + + function headers(xhr) { + var head = new Headers(); + var pairs = xhr.getAllResponseHeaders().trim().split("\n"); + pairs.forEach(function (header) { + var split = header.trim().split(":"); + var key = split.shift().trim(); + var value = split.join(":").trim(); + head.append(key, value); + }); + return head; + } + + Body.call(Request.prototype); + + function Response(bodyInit, options) { + if (!options) { + options = {}; + } + + this._initBody(bodyInit); + this.type = "default"; + this.status = options.status; + this.ok = this.status >= 200 && this.status < 300; + this.statusText = options.statusText; + this.headers = + options.headers instanceof Headers + ? options.headers + : new Headers(options.headers); + this.url = options.url || ""; + } + + Body.call(Response.prototype); + + var cordovaFetch = {}; + + cordovaFetch.Headers = Headers; + cordovaFetch.Request = Request; + cordovaFetch.Response = Response; + + cordovaFetch.fetch = function (input, init) { + var request; + if (Request.prototype.isPrototypeOf(input) && !init) { + request = input; + } else { + request = new Request(input, init); + } + + return new Promise(function (resolve, reject) { + exec( + function (response) { + var options = { + status: response.status, + statusText: response.statusText, + headers: response.headers, + url: response.url, + }; + + var body = response.isBlob + ? b64toBlob(response.body) + : response.body; + var fetchResponse = new Response(body, options); + resolve(fetchResponse); + }, + function (response) { + reject(new TypeError(response.toString())); + }, + "Fetch", + "fetch", + [ + request.method, + request.url, + typeof request._bodyInit === "undefined" ? null : request._bodyInit, + request.headers, + ] + ); + }); + }; + + /** + * Set timeout of the underlying http request + * @param timeout in seconds + */ + cordovaFetch.fetch.setTimeout = function (timeout) { + exec(null, null, "FetchPlugin", "setTimeout", [timeout]); + }; + + cordovaFetch.fetch.polyfill = true; + + module.exports = cordovaFetch.fetch; + } +); From d45e1fb13c796a740e3239300152a3c0b68fd634 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:23:02 +0100 Subject: [PATCH 26/77] module search improvement --- Website/src/activitys/MainApplication.tsx | 263 +++++++----------- Website/src/activitys/SearchActivity.tsx | 138 +++++++++ .../activitys/fragments/ModuleFragment.tsx | 24 +- Website/src/hooks/useLocalModules.ts | 10 +- Website/src/hooks/useTheme.tsx | 4 + Website/src/locales/de.json | 1 + Website/src/locales/en.json | 1 + Website/src/native/Os.ts | 2 +- Website/src/styles/light_theme.tsx | 2 +- Website/src/typings/global.d.ts | 5 + 10 files changed, 265 insertions(+), 185 deletions(-) create mode 100644 Website/src/activitys/SearchActivity.tsx diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index ad6bda3f..c93252b2 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -1,14 +1,13 @@ import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; import React from "react"; import Typography from "@mui/material/Typography"; -import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import MenuIcon from "@mui/icons-material/Menu"; import FetchTextActivity from "./FetchTextActivity"; import ModuleFragment from "./fragments/ModuleFragment"; import TerminalActivity from "./TerminalActivity"; import DeviceModule from "@Components/DeviceModule"; import ModuleViewActivity from "./ModuleViewActivity"; import CreateNewFolderIcon from "@mui/icons-material/CreateNewFolder"; -import { Menu } from "@mui/icons-material"; import { useActivity } from "@Hooks/useActivity"; import { Toolbar } from "@Components/onsenui/Toolbar"; import { os } from "@Native/Os"; @@ -33,79 +32,23 @@ import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; import Divider from "@mui/material/Divider"; import UpdateModule from "@Components/UpdateModule"; - -interface SearchbarRef { - clear(): void; -} - -interface SearchbarProps { - value: string; - onSearch(term: string): void; - placeholder: string; -} - -const Clear = motion(ClearIcon); -const Search = motion(SearchIcon); -const MotionTypography = motion(Typography); -const MotionInputBase = motion(InputBase); -const SearchBar = React.forwardRef((props, ref) => { - const { onSearch, placeholder, value } = props; - const [term, setTerm] = React.useState(value); - - const handleTermChange = (e) => { - setTerm(e.target.value); - }; - - React.useImperativeHandle( - ref, - () => ({ - clear() { - setTerm(""); - }, - }), - [] - ); - - return ( - - ); -}); +import { SearchActivity } from "./SearchActivity"; +import ListItemButton from "@mui/material/ListItemButton"; +import { StyledListItemText } from "@Components/StyledListItemText"; +import VerifiedIcon from "@mui/icons-material/Verified"; +import ListItemAvatar from "@mui/material/ListItemAvatar"; +import Avatar from "@mui/material/Avatar"; +import Stack from "@mui/material/Stack"; +import Chip from "@mui/material/Chip"; const MainApplication = () => { const { strings } = useStrings(); - const { settings } = useSettings(); const { modConf } = useModConf(); const { context } = useActivity(); - const { theme } = useTheme(); const { modules } = useRepos(); const [index, setIndex] = React.useState(0); const localModules = useLocalModules(); - const searchRef = React.useRef(null); - - const [isVisible, setVisible] = React.useState(false); - const [search, setSearch] = React.useState(""); - React.useEffect(() => { const urlParams = new URLSearchParams(window.location.search); const id = urlParams.get("module"); @@ -125,12 +68,7 @@ const MainApplication = () => { return [ { content: ( - } - /> + } /> ), tab: , }, @@ -139,7 +77,6 @@ const MainApplication = () => { { content: ( } @@ -179,7 +116,6 @@ const MainApplication = () => { { content: ( } @@ -210,48 +146,80 @@ const MainApplication = () => { }, []); const handleOpenSearch = () => { - if (isVisible) { - if (searchRef.current) { - setSearch(""); - searchRef.current.clear(); - } - } else { - setVisible((prev) => !prev); - } - }; + context.pushPage({ + component: SearchActivity, + key: "SearchActivity", + props: { + list: modules, + search: { + by: ["id", "name", "author", "description"], + caseInsensitive: true, + }, - const handleSearch = () => { - if (isVisible) { - setVisible((prev) => { - if (prev && searchRef.current) { - setSearch(""); - searchRef.current.clear(); - } - return !prev; - }); - } else { - context.splitter.show(); - } + renderList(item: Module, index) { + return ( + { + context.pushPage({ + component: ModuleViewActivity, + key: "ModuleViewActivity", + extra: item, + }); + }} + > + + ({ + bgcolor: theme.palette.primary.light, + boxShadow: "0 -1px 5px rgba(0,0,0,.09), 0 3px 5px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.3), 0 1px 3px rgba(0,0,0,.15)", + borderRadius: "20%", + mr: 1.5, + })} + src={item.track.icon} + > + {item.name.charAt(0).toUpperCase()} + + + + {item.name} + {item.track.verified && } + + } + secondary={ + + {item.version} + + {SuFile.exist(modConf("PROPS", { MODID: item.id })) && } + + + } + /> + + ); + }, + }, + }); }; const renderToolbar = () => { return ( - - - - - + + + + { alignItems: "center", }} > - {!isVisible ? ( - - - - MMRL - - - ) : ( - setSearch(term)} - placeholder={strings("search_modules")} - /> - )} - - - - + - - + > + MMRL + + + + + + ); }; diff --git a/Website/src/activitys/SearchActivity.tsx b/Website/src/activitys/SearchActivity.tsx new file mode 100644 index 00000000..cfb6dde0 --- /dev/null +++ b/Website/src/activitys/SearchActivity.tsx @@ -0,0 +1,138 @@ +import React from "react"; +import FlatList, { SearchOptionsInterface, FlatListProps } from "flatlist-react"; +import { useActivity } from "@Hooks/useActivity"; +import { Toolbar } from "@Components/onsenui/Toolbar"; +import { Page } from "@Components/onsenui/Page"; +import { useStrings } from "@Hooks/useStrings"; +import InputBase from "@mui/material/InputBase"; +import ClearIcon from "@mui/icons-material/Clear"; +import { Box, List } from "@mui/material"; +import { renderFunc } from "flatlist-react/lib/___subComponents/uiFunctions"; +import { useTheme } from "@Hooks/useTheme"; +import { useSettings } from "@Hooks/useSettings"; +import { os } from "@Native/Os"; + +const RenderWhenEmpty = React.memo(() => { + const { theme } = useTheme(); + return ( + + What you looking for? + + ); +}); + +interface SearchActivityProps { + list: any[]; + placeholder?: string; + search?: SearchOptionsInterface; + group?: FlatListProps["group"]; + renderList: renderFunc; +} + +function SearchActivity(props: SearchActivityProps) { + const { strings } = useStrings(); + const { settings } = useSettings(); + const { context } = useActivity(); + const { theme } = useTheme(); + + const { placeholder, list, renderList } = props; + const __placeholder = placeholder ? placeholder : strings("search"); + + const [search, setSearch] = React.useState(undefined); + + React.useEffect(() => { + os.setStatusBarColor(theme.palette.background.default); + + return function () { + os.setStatusBarColor(theme.palette.primary.main); + }; + }, []); + + const renderToolbar = () => { + return ( + + + + + + setSearch(e.target.value)} + placeholder={__placeholder} + /> + + + + { + setSearch(undefined); + }} + /> + + + ); + }; + + const __list = React.useMemo(() => (search ? list : []), [search]); + + return ( + + + + } + renderOnScroll + search={{ term: search, ...props.search }} + group={props.group} + /> + + + + ); +} + +export { SearchActivity, SearchActivityProps }; diff --git a/Website/src/activitys/fragments/ModuleFragment.tsx b/Website/src/activitys/fragments/ModuleFragment.tsx index aebe5687..0077fcf4 100644 --- a/Website/src/activitys/fragments/ModuleFragment.tsx +++ b/Website/src/activitys/fragments/ModuleFragment.tsx @@ -17,26 +17,23 @@ import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; const RenderWhenEmpty = React.memo(() => { const { theme } = useTheme(); return ( - - No modules were found - + No modules were found + ); }); export interface ModuleFragmentProps { - search: string; id: "explore" | "update" | "local"; modules: Array; group?: FlatListProps["group"]; @@ -159,11 +156,6 @@ const ModuleFragment = React.memo((props) => { renderItem={renderItem} renderOnScroll renderWhenEmpty={() => } - search={{ - by: ["id", "name", "author", "description"], - term: props.search, - caseInsensitive: true, - }} sortBy={filter} display={{ row: true, diff --git a/Website/src/hooks/useLocalModules.ts b/Website/src/hooks/useLocalModules.ts index 452c2fe4..51c89fab 100644 --- a/Website/src/hooks/useLocalModules.ts +++ b/Website/src/hooks/useLocalModules.ts @@ -21,9 +21,13 @@ export function useLocalModules() { const ids = new Set(prev.map((d) => d.id)); const merged = [ ...prev, - ...[{ ...(new Properties(properties.read()).toObject() as unknown as Module), timestamp: properties.lastModified() }].filter( - (d) => !ids.has(d.id) - ), + ...[ + { + ...(new Properties(properties.read()).toObject() as unknown as Module), + timestamp: properties.lastModified(), + __mmrl__local__module__: true, + }, + ].filter((d) => !ids.has(d.id)), ]; return merged; }); diff --git a/Website/src/hooks/useTheme.tsx b/Website/src/hooks/useTheme.tsx index 4602f17d..61f72aff 100644 --- a/Website/src/hooks/useTheme.tsx +++ b/Website/src/hooks/useTheme.tsx @@ -88,6 +88,10 @@ export const ThemeProvider = (props: React.PropsWithChildren) => { paper: shade(colors[settings.accent_scheme.value][600], settings.shade_value), default: shade(colors[settings.accent_scheme.value][700], settings.shade_value), }, + text: { + primary: "#f9f9f9", + secondary: "#b7b7b7" + }, divider: shade(colors[settings.accent_scheme.value][900], settings.shade_value), secondary: { main: colors[settings.accent_scheme.value][600], diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json index 30277a53..ad593b9b 100644 --- a/Website/src/locales/de.json +++ b/Website/src/locales/de.json @@ -1,4 +1,5 @@ { + "search": "Suche", "updates": "Updates", "versions": "Versionen", "license": "Lizenz", diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json index aa5edb0c..6283952d 100644 --- a/Website/src/locales/en.json +++ b/Website/src/locales/en.json @@ -1,4 +1,5 @@ { + "search": "Search", "updates": "Updates", "versions": "Versions", "license": "License", diff --git a/Website/src/native/Os.ts b/Website/src/native/Os.ts index 42995685..e458954e 100644 --- a/Website/src/native/Os.ts +++ b/Website/src/native/Os.ts @@ -118,7 +118,7 @@ class OsClass extends Native { * @param color Your color * @param white `true` makes the status bar white */ - public setStatusBarColor(color: string, white: boolean): void { + public setStatusBarColor(color: string, white: boolean = false): void { this.isAndroid ? this.interface.setStatusBarColor(color, white) : null; } diff --git a/Website/src/styles/light_theme.tsx b/Website/src/styles/light_theme.tsx index 96bd8f88..fb99a0bc 100644 --- a/Website/src/styles/light_theme.tsx +++ b/Website/src/styles/light_theme.tsx @@ -80,7 +80,7 @@ export const LightTheme = () => { bottom: "0", overflowX: "visible", overflowY: "hidden", - color: "#1f1f21", + // color: "#1f1f21", msOverflowStyle: "none", }, ".page::-webkit-scrollbar": { diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index f5e08050..70a93ed7 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -158,6 +158,11 @@ declare global { timestamp: number; track: Track; versions: Version[]; + + /** + * Local modules only + */ + __mmrl__local__module__?: boolean } export interface Track { From 26c9467f49321adb7ca90cf291e494f09b24ca6a Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:32:15 +0100 Subject: [PATCH 27/77] fix search state --- Website/src/activitys/SearchActivity.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Website/src/activitys/SearchActivity.tsx b/Website/src/activitys/SearchActivity.tsx index cfb6dde0..594961ab 100644 --- a/Website/src/activitys/SearchActivity.tsx +++ b/Website/src/activitys/SearchActivity.tsx @@ -48,7 +48,7 @@ function SearchActivity(props: SearchActivityProps) { const { placeholder, list, renderList } = props; const __placeholder = placeholder ? placeholder : strings("search"); - const [search, setSearch] = React.useState(undefined); + const [search, setSearch] = React.useState(""); React.useEffect(() => { os.setStatusBarColor(theme.palette.background.default); @@ -107,7 +107,7 @@ function SearchActivity(props: SearchActivityProps) { : {}, }} onClick={() => { - setSearch(undefined); + setSearch(""); }} /> From b0119c8c0fb98b0770ceac486e1889ffa4ff1a95 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:45:10 +0100 Subject: [PATCH 28/77] show changelog if update is available --- Website/src/activitys/MainApplication.tsx | 28 ++++++++++++----------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index c93252b2..0b9fba43 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -40,6 +40,7 @@ import ListItemAvatar from "@mui/material/ListItemAvatar"; import Avatar from "@mui/material/Avatar"; import Stack from "@mui/material/Stack"; import Chip from "@mui/material/Chip"; +import { ConfigureView } from "@Components/ConfigureView"; const MainApplication = () => { const { strings } = useStrings(); @@ -128,21 +129,22 @@ const MainApplication = () => { ]; }; - const [storedCurrentVersion, setStoredCurrentVersion] = useNativeStorage("current_version", "0.0.0"); - const isNewVersion = useNewerVersion(storedCurrentVersion); - React.useEffect(() => { - if (isNewVersion) { - setStoredCurrentVersion(BuildConfig.VERSION_NAME); - context.pushPage({ - component: FetchTextActivity, - key: "FetchTextActivity", - extra: { - url: "https://raw.githubusercontent.com/wiki/DerGoogler/MMRL/Changelog.md", - title: "Changelog", - }, + fetch("https://raw.githubusercontent.com/DerGoogler/MMRL/master/Website/package.json") + .then((res) => res.json()) + .then((json) => { + if (json.config.version_code > BuildConfig.VERSION_CODE) { + context.pushPage({ + component: FetchTextActivity, + key: "changelog", + extra: { + rendering: ConfigureView, + url: "https://raw.githubusercontent.com/wiki/DerGoogler/MMRL/JSX-Changelog.md", + modulename: "Update available!", + }, + }); + } }); - } }, []); const handleOpenSearch = () => { From f2357f0d28121471e58c1e1308d38350fa60a34d Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:18:15 +0100 Subject: [PATCH 29/77] rework modules --- Website/package-lock.json | 8843 +---------------- Website/package.json | 2 +- Website/src/activitys/MainApplication.tsx | 10 +- Website/src/components/DeviceModule.tsx | 201 - Website/src/components/ExploreModule.tsx | 138 - Website/src/components/UpdateModule.tsx | 138 - .../src/components/module/DeviceModule.tsx | 216 + .../src/components/module/ExploreModule.tsx | 97 + .../src/components/module/UpdateModule.tsx | 141 + Website/src/hooks/useModulesFilter.tsx | 18 +- Website/src/locales/de.json | 2 + Website/src/locales/en.json | 2 + 12 files changed, 582 insertions(+), 9226 deletions(-) delete mode 100644 Website/src/components/DeviceModule.tsx delete mode 100644 Website/src/components/ExploreModule.tsx delete mode 100644 Website/src/components/UpdateModule.tsx create mode 100644 Website/src/components/module/DeviceModule.tsx create mode 100644 Website/src/components/module/ExploreModule.tsx create mode 100644 Website/src/components/module/UpdateModule.tsx diff --git a/Website/package-lock.json b/Website/package-lock.json index 5eb2c582..c8aca9e1 100644 --- a/Website/package-lock.json +++ b/Website/package-lock.json @@ -37,7 +37,7 @@ "markdown-to-jsx": "^7.4.0", "marked-react": "^1.1.2", "material-icons": "^1.10.8", - "material-ui-confirm": "^3.0.9", + "material-ui-confirm": "^3.0.10", "monaco-editor": "^0.45.0", "monaco-editor-core": "^0.43.0", "monaco-languageclient": "^6.5.0", @@ -1885,15 +1885,6 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-editor-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-editor-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -1926,15 +1917,6 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-environment-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-environment-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -1969,15 +1951,6 @@ "vscode-semver": "npm:semver@=5.5.0" } }, - "node_modules/@codingame/monaco-vscode-extensions-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-extensions-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -2010,15 +1983,6 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-files-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { - "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", - "dependencies": { - "monaco-editor": "0.44.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" - } - }, "node_modules/@codingame/monaco-vscode-files-service-override/node_modules/monaco-editor": { "version": "0.44.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", @@ -2052,21 +2016,44 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { + "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, + "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/vscode": { + "name": "@codingame/monaco-vscode-api", "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", - "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", + "integrity": "sha512-8+jBcXKkvqfx5mVfaUQ+TeORIw2zGRASoKCavZCO/BSpnTCrPVTFyT2HN35+Hwun8eGqoWaNaKYunupLiBZRWg==", + "dependencies": { + "@codingame/monaco-vscode-environment-service-override": "1.83.16", + "@codingame/monaco-vscode-extensions-service-override": "1.83.16", + "@codingame/monaco-vscode-files-service-override": "1.83.16", + "@codingame/monaco-vscode-layout-service-override": "1.83.16", + "@codingame/monaco-vscode-quickaccess-service-override": "1.83.16", + "monaco-editor": "0.44.0", + "vscode-semver": "npm:semver@=5.5.0" + }, + "bin": { + "monaco-treemending": "monaco-treemending.js" + } + }, + "node_modules/@codingame/monaco-vscode-layout-service-override": { + "version": "1.83.16", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-1.83.16.tgz", + "integrity": "sha512-DOHpZVqLP8RVDwQYPP3hDd+LPjxSyBbgPL3Ixd1X9LZSmY37bi95ILOPESqG306h2wQZhPzwNC+E7UNY3P/Ing==", "dependencies": { "monaco-editor": "0.44.0", "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/monaco-editor": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.43.0.tgz", - "integrity": "sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q==" + "node_modules/@codingame/monaco-vscode-layout-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" }, - "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/vscode": { + "node_modules/@codingame/monaco-vscode-layout-service-override/node_modules/vscode": { "name": "@codingame/monaco-vscode-api", "version": "1.83.16", "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", @@ -2084,16 +2071,39 @@ "monaco-treemending": "monaco-treemending.js" } }, - "node_modules/@codingame/monaco-vscode-layout-service-override": { + "node_modules/@codingame/monaco-vscode-model-service-override": { "version": "1.83.16", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-1.83.16.tgz", - "integrity": "sha512-DOHpZVqLP8RVDwQYPP3hDd+LPjxSyBbgPL3Ixd1X9LZSmY37bi95ILOPESqG306h2wQZhPzwNC+E7UNY3P/Ing==", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-1.83.16.tgz", + "integrity": "sha512-uvFxzSdxD+PlJ1B9+qCF4gum/bSaMtzmX7YKenGX27CUviOX3JuQlUeMPHgxFn7VlwUxOgxHR99fCieW6h7Y3w==", "dependencies": { "monaco-editor": "0.44.0", "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-layout-service-override/node_modules/@codingame/monaco-vscode-quickaccess-service-override": { + "node_modules/@codingame/monaco-vscode-model-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, + "node_modules/@codingame/monaco-vscode-model-service-override/node_modules/vscode": { + "name": "@codingame/monaco-vscode-api", + "version": "1.83.16", + "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", + "integrity": "sha512-8+jBcXKkvqfx5mVfaUQ+TeORIw2zGRASoKCavZCO/BSpnTCrPVTFyT2HN35+Hwun8eGqoWaNaKYunupLiBZRWg==", + "dependencies": { + "@codingame/monaco-vscode-environment-service-override": "1.83.16", + "@codingame/monaco-vscode-extensions-service-override": "1.83.16", + "@codingame/monaco-vscode-files-service-override": "1.83.16", + "@codingame/monaco-vscode-layout-service-override": "1.83.16", + "@codingame/monaco-vscode-quickaccess-service-override": "1.83.16", + "monaco-editor": "0.44.0", + "vscode-semver": "npm:semver@=5.5.0" + }, + "bin": { + "monaco-treemending": "monaco-treemending.js" + } + }, + "node_modules/@codingame/monaco-vscode-quickaccess-service-override": { "version": "1.83.16", "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-1.83.16.tgz", "integrity": "sha512-uO1xJKkoI7wvyOT+WvopA3Sehy9yLk5bUi+QAESZbXLhvVMutbl2mO1T0stgC7O3cPOJnNh9xIi/kexW2TswOQ==", @@ -2102,7 +2112,12 @@ "vscode": "npm:@codingame/monaco-vscode-api@1.83.16" } }, - "node_modules/@codingame/monaco-vscode-model-service-override/node_modules/vscode": { + "node_modules/@codingame/monaco-vscode-quickaccess-service-override/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, + "node_modules/@codingame/monaco-vscode-quickaccess-service-override/node_modules/vscode": { "name": "@codingame/monaco-vscode-api", "version": "1.83.16", "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.83.16.tgz", @@ -3628,7 +3643,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -4042,6 +4058,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4275,6 +4292,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -4421,7 +4439,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", @@ -5358,6 +5377,7 @@ "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, "engines": { "node": ">= 4.9.1" } @@ -5678,7 +5698,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -5750,6 +5771,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5816,7 +5838,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/growl": { "version": "1.10.5", @@ -5946,7 +5969,8 @@ "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -6273,6 +6297,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6487,7 +6512,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isobject": { "version": "3.0.1", @@ -7014,9 +7040,9 @@ "integrity": "sha512-/2YoaB79IjUK2B2JB+vIXXYGtBfHb/XG66LvoKVM5ykHW7yfrV5SP6d7KLX6iijY6/G9GqwgtPQ/sbhFnOURVA==" }, "node_modules/material-ui-confirm": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/material-ui-confirm/-/material-ui-confirm-3.0.9.tgz", - "integrity": "sha512-WEAEG9z4MfwojoUyQiAjrjl8378tYbGKfiwOKz3zHaQKyXcHnFktUmV7b+F+G0yVo8kYrEMk9Bw+HxhA/2Enlw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/material-ui-confirm/-/material-ui-confirm-3.0.10.tgz", + "integrity": "sha512-+o/9Q1n8YmqG/9pzJvGwbNw4dU1+WABVxaPJsHPmcO5SgK4Ci8WdgYbOIUD4cO4+X5HaPlzr1DhxD8+UTXqstw==", "peerDependencies": { "@mui/material": ">= 5.0.0", "react": "^17.0.0 || ^18.0.0", @@ -7155,6 +7181,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7348,6 +7375,11 @@ } } }, + "node_modules/monaco-languageclient/node_modules/monaco-editor": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.44.0.tgz", + "integrity": "sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==" + }, "node_modules/monaco-languageclient/node_modules/vscode": { "name": "@codingame/monaco-vscode-api", "version": "1.83.16", @@ -7374,7 +7406,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -7440,6 +7473,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, "dependencies": { "abbrev": "1", "osenv": "^0.1.4" @@ -7452,6 +7486,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -7463,6 +7498,7 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "bin": { "semver": "bin/semver" } @@ -10511,6 +10547,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10519,6 +10556,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -10527,6 +10565,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -10656,6 +10695,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12163,6 +12203,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -12477,6 +12518,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -12485,12 +12527,14 @@ "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -12499,7 +12543,8 @@ "node_modules/spdx-license-ids": { "version": "3.0.16", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true }, "node_modules/spdx-ranges": { "version": "2.1.1", @@ -13378,6 +13423,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -13901,6 +13947,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -14000,8677 +14047,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" - }, - "@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "requires": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "requires": { - "@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" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", - "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", - "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", - "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", - "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", - "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", - "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/standalone": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.23.6.tgz", - "integrity": "sha512-+AzS6BZwZdSosrgS/TiGDYLxtlefARKClWgJ4ql//XfmV9KbPWbkEekvbvDRJ8a6qog8E9j3CziHLz5dbIEMyw==" - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@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.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@codingame/monaco-vscode-languages-service-override": { - "version": "1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-1.82.3.tgz", - "integrity": "sha512-iw5lb6f9ZY2jo0T6hwKeYKwOzU+ARcsTU5iDWkHnVYoaUfogSDfBBWOV/K1CmFBoNwSbvbMIv3lm0DE93/wKVw==", - "requires": { - "monaco-editor": "0.43.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.82.3" - }, - "dependencies": { - "vscode": { - "version": "npm:@codingame/monaco-vscode-api@1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.82.3.tgz", - "integrity": "sha512-3Z4GQ1A9nnZX1MRiMn1U5jXF1YKqmvHnLsW2zKaeEjS7bW7ZU8yyeOAX5J+KbLiMobTaPlzvZ1h6tuQkWGYMWA==", - "requires": { - "monaco-editor": "0.43.0" - } - } - } - }, - "@codingame/monaco-vscode-model-service-override": { - "version": "1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-1.82.3.tgz", - "integrity": "sha512-PJ+8Yv3cT4Re2jbaPtBuKxY5JQnkorAsJO9nqPOfw6qN7l4F/2t5wP9oLJDrPimzRerfauYwLBlQZ4hLmXIZaw==", - "requires": { - "monaco-editor": "0.43.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.82.3" - }, - "dependencies": { - "vscode": { - "version": "npm:@codingame/monaco-vscode-api@1.82.3", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.82.3.tgz", - "integrity": "sha512-3Z4GQ1A9nnZX1MRiMn1U5jXF1YKqmvHnLsW2zKaeEjS7bW7ZU8yyeOAX5J+KbLiMobTaPlzvZ1h6tuQkWGYMWA==", - "requires": { - "monaco-editor": "0.43.0" - } - } - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "dev": true - }, - "@emotion/babel-plugin": { - "version": "11.9.2", - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/runtime": "^7.13.10", - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.5", - "@emotion/serialize": "^1.0.2", - "babel-plugin-macros": "^2.6.1", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0" - }, - "source-map": { - "version": "0.5.7" - } - } - }, - "@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "requires": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - }, - "dependencies": { - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - } - } - }, - "@emotion/hash": { - "version": "0.8.0" - }, - "@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", - "requires": { - "@emotion/memoize": "^0.8.1" - }, - "dependencies": { - "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - } - } - }, - "@emotion/memoize": { - "version": "0.7.5" - }, - "@emotion/react": { - "version": "11.9.3", - "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/cache": "^11.9.3", - "@emotion/serialize": "^1.0.4", - "@emotion/utils": "^1.1.0", - "@emotion/weak-memoize": "^0.2.5", - "hoist-non-react-statics": "^3.3.1" - } - }, - "@emotion/serialize": { - "version": "1.0.4", - "requires": { - "@emotion/hash": "^0.8.0", - "@emotion/memoize": "^0.7.4", - "@emotion/unitless": "^0.7.5", - "@emotion/utils": "^1.0.0", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "@emotion/styled": { - "version": "11.9.3", - "requires": { - "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.7.1", - "@emotion/is-prop-valid": "^1.1.3", - "@emotion/serialize": "^1.0.4", - "@emotion/utils": "^1.1.0" - } - }, - "@emotion/unitless": { - "version": "0.7.5" - }, - "@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5" - }, - "@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", - "requires": { - "@floating-ui/utils": "^0.1.3" - } - }, - "@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", - "requires": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" - } - }, - "@floating-ui/react-dom": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", - "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", - "requires": { - "@floating-ui/dom": "^1.5.1" - } - }, - "@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" - }, - "@giscus/react": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@giscus/react/-/react-2.4.0.tgz", - "integrity": "sha512-y8d8qiZ2sBuaXRcgn/ZWfMlRs9bx26p62BU/HEKQQ+IfHo3B/kglgPjX/IqudwlX+DOlHUl1NvtFo9C8Eqo0eQ==", - "requires": { - "giscus": "^1.4.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0" - }, - "@jridgewell/set-array": { - "version": "1.1.2" - }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "@lit-labs/ssr-dom-shim": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz", - "integrity": "sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g==" - }, - "@lit/reactive-element": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.2.tgz", - "integrity": "sha512-SVOwLAWUQg3Ji1egtOt1UiFe4zdDpnWHyc5qctSceJ5XIu0Uc76YmGpIjZgx9YJ0XtdW0Jm507sDvjOu+HnB8w==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.2" - } - }, - "@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "requires": { - "state-local": "^1.0.6" - } - }, - "@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "requires": { - "@monaco-editor/loader": "^1.4.0" - } - }, - "@mui/base": { - "version": "5.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.29.tgz", - "integrity": "sha512-OXfUssYrB6ch/xpBVHMKAjThPlI9VyGGKdvQLMXef2j39wXfcxPlUVQlwia/lmE3rxWIGvbwkZsDtNYzLMsDUg==", - "requires": { - "@babel/runtime": "^7.23.6", - "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.11", - "@mui/utils": "^5.15.2", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - } - }, - "@mui/core-downloads-tracker": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.2.tgz", - "integrity": "sha512-0vk4ckS2w1F5PmkSXSd7F/QuRlNcPqWTJ8CPl+HQRLTIhJVS/VKEI+3dQufOdKfn2wS+ecnvlvXerbugs+xZ8Q==" - }, - "@mui/icons-material": { - "version": "5.8.4", - "requires": { - "@babel/runtime": "^7.17.2" - } - }, - "@mui/lab": { - "version": "5.0.0-alpha.146", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.146.tgz", - "integrity": "sha512-azkSNz/F4VAzXdXG1Yu/pdWiMQY8dRpwHycLCQCK7oql5AOVh1pVEmw5+nMT161oc5bOzxBkIsNGPCBwXIZ7Ww==", - "requires": { - "@babel/runtime": "^7.22.15", - "@mui/base": "5.0.0-beta.17", - "@mui/system": "^5.14.11", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", - "@mui/x-tree-view": "6.0.0-alpha.1", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - }, - "dependencies": { - "@mui/base": { - "version": "5.0.0-beta.17", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz", - "integrity": "sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==", - "requires": { - "@babel/runtime": "^7.22.15", - "@floating-ui/react-dom": "^2.0.2", - "@mui/types": "^7.2.4", - "@mui/utils": "^5.14.11", - "@popperjs/core": "^2.11.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1" - } - } - } - }, - "@mui/material": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.2.tgz", - "integrity": "sha512-JnoIrpNmEHG5uC1IyEdgsnDiaiuCZnUIh7f9oeAr87AvBmNiEJPbo7XrD7kBTFWwp+b97rQ12QdSs9CLhT2n/A==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/base": "5.0.0-beta.29", - "@mui/core-downloads-tracker": "^5.15.2", - "@mui/system": "^5.15.2", - "@mui/types": "^7.2.11", - "@mui/utils": "^5.15.2", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" - } - }, - "@mui/private-theming": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.2.tgz", - "integrity": "sha512-KlXx5TH1Mw9omSY+Q6rz5TA/P71meSYaAOeopiW8s6o433+fnOxS17rZbmd1RnDZGCo+j24TfCavQuCMBAZnQA==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/utils": "^5.15.2", - "prop-types": "^15.8.1" - } - }, - "@mui/styled-engine": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.2.tgz", - "integrity": "sha512-fYEN3IZzbebeHwAmQHhxwruiOIi8W74709qXg/7tgtHV4byQSmPgnnKsZkg0hFlzjEbcJIRZyZI0qEecgpR2cg==", - "requires": { - "@babel/runtime": "^7.23.6", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - } - }, - "@mui/system": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.2.tgz", - "integrity": "sha512-I7CzLiHDtU/BTobJgSk+wPGGWG95K8lYfdFEnq//wOgSrLDAdOVvl2gleDxJWO+yAbGz4RKEOnR9KuD+xQZH4A==", - "requires": { - "@babel/runtime": "^7.23.6", - "@mui/private-theming": "^5.15.2", - "@mui/styled-engine": "^5.15.2", - "@mui/types": "^7.2.11", - "@mui/utils": "^5.15.2", - "clsx": "^2.0.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - } - }, - "@mui/types": { - "version": "7.2.11", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.11.tgz", - "integrity": "sha512-KWe/QTEsFFlFSH+qRYf3zoFEj3z67s+qAuSnMMg+gFwbxG7P96Hm6g300inQL1Wy///gSRb8juX7Wafvp93m3w==", - "requires": {} - }, - "@mui/utils": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.2.tgz", - "integrity": "sha512-6dGM9/guFKBlFRHA7/mbM+E7wE7CYDy9Ny4JLtD3J+NTyhi8nd8YxlzgAgTaTVqY0BpdQ2zdfB/q6+p2EdGM0w==", - "requires": { - "@babel/runtime": "^7.23.6", - "@types/prop-types": "^15.7.11", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" - } - }, - "@mui/x-tree-view": { - "version": "6.0.0-alpha.1", - "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-6.0.0-alpha.1.tgz", - "integrity": "sha512-JUG3HmBrmGEALbCFg1b+i7h726e1dWYZs4db3syO1j+Q++E3nbvE4Lehp5yGTFm+8esH0Tny50tuJaa4WX6VSA==", - "requires": { - "@babel/runtime": "^7.22.6", - "@mui/utils": "^5.14.3", - "@types/react-transition-group": "^4.4.6", - "clsx": "^2.0.0", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - } - }, - "@nyariv/sandboxjs": { - "version": "0.8.23", - "resolved": "https://registry.npmjs.org/@nyariv/sandboxjs/-/sandboxjs-0.8.23.tgz", - "integrity": "sha512-OaD3i0czFTZzQFQdwgFVEqNyZVK19N6Jzmx/LjmDc+kiV751FQ2h3xscYkAeY4jfau2vZTZau+xR8fpkKrv/Ng==" - }, - "@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" - }, - "@primer/octicons-react": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/@primer/octicons-react/-/octicons-react-19.4.0.tgz", - "integrity": "sha512-6zFbvbQYQdGd9cIgNscnofSe0LkV28PvcL4mWPoKFV1u7Mdn3MlOjgawzuA2oXB18LLkMadTJ4Ky77FybUlrBg==", - "requires": {} - }, - "@remix-run/router": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", - "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==" - }, - "@tootallnate/once": { - "version": "1.1.2", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__standalone": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/@types/babel__standalone/-/babel__standalone-7.1.7.tgz", - "integrity": "sha512-4RUJX9nWrP/emaZDzxo/+RYW8zzLJTXWJyp2k78HufG459HCz754hhmSymt3VFOU6/Wy+IZqfPvToHfLuGOr7w==", - "dev": true, - "requires": { - "@types/babel__core": "^7.1.0" - } - }, - "@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.5", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "dev": true, - "requires": { - "@types/jsonfile": "*", - "@types/node": "*" - } - }, - "@types/hast": { - "version": "2.3.4", - "requires": { - "@types/unist": "*" - } - }, - "@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ini": { - "version": "1.3.33", - "resolved": "https://registry.npmjs.org/@types/ini/-/ini-1.3.33.tgz", - "integrity": "sha512-YZDzdPTDxy084i5eVxUKfAHLenhAMVHupzCIg1dzFJNs6xp/UGyWk+8Lp1YxoZH+Hvv7C9OcHEDPndSMwaPVsQ==", - "dev": true - }, - "@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "requires": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "dev": true - }, - "@types/jsonfile": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", - "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "@types/node": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", - "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==" - }, - "@types/object-assign": { - "version": "4.0.30", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0" - }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" - }, - "@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/react": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", - "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.6", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-onsenui": { - "version": "2.9.18", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-syntax-highlighter": { - "version": "15.5.8", - "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.8.tgz", - "integrity": "sha512-GT1PLGzhF3ilGaQiCHFDShxDBb014s01MQi0nWfXJ23efjWfUrZ2i0g4tH1JGdfnIGBtQDge/k3ON3fLoAuU/w==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", - "requires": { - "@types/react": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/scheduler": { - "version": "0.16.2" - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/source-list-map": { - "version": "0.1.2", - "dev": true - }, - "@types/tapable": { - "version": "1.0.8", - "dev": true - }, - "@types/tough-cookie": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==" - }, - "@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "@types/uglify-js": { - "version": "3.16.0", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "@types/uglifyjs-webpack-plugin": { - "version": "1.1.2", - "dev": true, - "requires": { - "@types/webpack": "^4" - }, - "dependencies": { - "@types/webpack": { - "version": "4.41.32", - "dev": true, - "requires": { - "@types/node": "*", - "@types/tapable": "^1", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "anymatch": "^3.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "@types/underscore": { - "version": "1.11.15", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.15.tgz", - "integrity": "sha512-HP38xE+GuWGlbSRq9WrZkousaQ7dragtZCruBVMi0oX1migFZavZ3OROKHSkNp/9ouq82zrWtZpg18jFnVN96g==", - "dev": true - }, - "@types/unist": { - "version": "2.0.6" - }, - "@types/webpack": { - "version": "5.28.5", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", - "integrity": "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==", - "dev": true, - "requires": { - "@types/node": "*", - "tapable": "^2.2.0", - "webpack": "^5" - } - }, - "@types/webpack-sources": { - "version": "3.2.0", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "dev": true - } - } - }, - "@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@wasmer/wasmfs": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@wasmer/wasmfs/-/wasmfs-0.12.0.tgz", - "integrity": "sha512-m1ftchyQ1DfSenm5XbbdGIpb6KJHH5z0gODo3IZr6lATkj4WXfX/UeBTZ0aG9YVShBp+kHLdUHvOkqjy6p/GWw==", - "requires": { - "memfs": "3.0.4", - "pako": "^1.0.11", - "tar-stream": "^2.1.0" - } - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "ace-builds": { - "version": "1.32.2", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.2.tgz", - "integrity": "sha512-mnJAc803p+7eeDt07r6XI7ufV7VdkpPq4gJZT8Jb3QsowkaBTVy4tdBgPrVT0WbXLm0toyEQXURKSVNj/7dfJQ==" - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==" - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "requires": { - "color-convert": "^1.9.0" - } - }, - "ansi-to-react": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-6.1.6.tgz", - "integrity": "sha512-+HWn72GKydtupxX9TORBedqOMsJRiKTqaLUKW8txSBZw9iBpzPKLI8KOu4WzwD4R7hSv1zEspobY6LwlWvwZ6Q==", - "requires": { - "anser": "^1.4.1", - "escape-carriage": "^1.3.0" - } - }, - "anymatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-find-index": { - "version": "1.0.2", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "dev": true - }, - "asynckit": { - "version": "0.4.0" - }, - "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "dev": true, - "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - } - }, - "babel-plugin-macros": { - "version": "2.8.0", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "yaml": { - "version": "1.10.2" - } - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - } - }, - "balanced-match": { - "version": "1.0.2" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "dev": true - }, - "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0" - }, - "caniuse-api": { - "version": "3.0.0", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001568", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", - "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==" - }, - "chalk": { - "version": "2.4.2", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0" - }, - "supports-color": { - "version": "5.5.0", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "character-entities": { - "version": "1.2.4" - }, - "character-entities-legacy": { - "version": "1.1.4" - }, - "character-reference-invalid": { - "version": "1.1.4" - }, - "chokidar": { - "version": "3.5.3", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" - }, - "color-convert": { - "version": "1.9.3", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3" - }, - "colord": { - "version": "2.9.2", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "comma-separated-tokens": { - "version": "1.0.8" - }, - "commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "dev": true - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "core-js": { - "version": "3.32.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", - "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==" - }, - "core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", - "dev": true, - "requires": { - "browserslist": "^4.22.1" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "create-require": { - "version": "1.1.1", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-declaration-sorter": { - "version": "6.3.0", - "dev": true, - "requires": {} - }, - "css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "css-minimizer-webpack-plugin": { - "version": "4.0.0", - "dev": true, - "requires": { - "cssnano": "^5.1.8", - "jest-worker": "^27.5.1", - "postcss": "^8.4.13", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - } - }, - "css-select": { - "version": "4.3.0", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "dev": true - }, - "cssnano": { - "version": "5.1.12", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "dependencies": { - "yaml": { - "version": "1.10.2", - "dev": true - } - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "debug": { - "version": "4.3.4", - "requires": { - "ms": "2.1.2" - } - }, - "debuglog": { - "version": "1.0.1", - "dev": true - }, - "default-composer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/default-composer/-/default-composer-0.6.0.tgz", - "integrity": "sha512-icLwAqlLJUAhLCPN9jBntg3B70VWWisLoayrPQThriuKCUmdj0k/UdUXmjzfHs9YT4j61EroqYsYG9nqeiGc8Q==" - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0" - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "dezalgo": { - "version": "1.0.4", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "4.0.2", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==" - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "dom-serializer": { - "version": "1.4.1", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.610", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", - "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==" - }, - "emojis-list": { - "version": "3.0.0", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "eruda": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eruda/-/eruda-3.0.0.tgz", - "integrity": "sha512-6L8A8aBHOQv0rqeBlNdJEl/hl6OAdLVRtJlVmBIlIJ6Fe1a92HFXO58jHLC0vFyuKV0deTjYjRaWwLo9lJ9K9A==" - }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "es6-promise": { - "version": "4.2.8", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-carriage": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/escape-carriage/-/escape-carriage-1.3.1.tgz", - "integrity": "sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5" - }, - "eslint-scope": { - "version": "5.1.1", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esprima": { - "version": "4.0.1", - "dev": true - }, - "esrecurse": { - "version": "4.3.0", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3" - }, - "fast-extend": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fast-extend/-/fast-extend-1.0.2.tgz", - "integrity": "sha512-XXA9RmlPatkFKUzqVZAFth18R4Wo+Xug/S+C7YlYA3xrXwfPlW3dqNwOb4hvQo7wZJ2cNDYhrYuPzVOfHy5/uQ==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "dev": true - }, - "fault": { - "version": "1.0.4", - "requires": { - "format": "^0.2.0" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "file-loader": { - "version": "6.2.0", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "dependencies": { - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "requires": { - "find-up": "^6.3.0" - } - } - } - }, - "find-root": { - "version": "1.1.0" - }, - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flatlist-react": { - "version": "1.5.14", - "resolved": "https://registry.npmjs.org/flatlist-react/-/flatlist-react-1.5.14.tgz", - "integrity": "sha512-TxwnFJk06Ic637L6GexiFFJrqxcBxZL5nnZTI/yDZZ5mYN6ysLiiz9Lz6ksEmF8e63DuDrR5l/cGrz/JuUh/MA==", - "requires": {} - }, - "follow-redirects": { - "version": "1.15.1" - }, - "form-data": { - "version": "4.0.0", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "format": { - "version": "0.2.2" - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "framer-motion": { - "version": "10.16.4", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz", - "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==", - "requires": { - "@emotion/is-prop-valid": "^0.8.2", - "tslib": "^2.4.0" - }, - "dependencies": { - "@emotion/is-prop-valid": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", - "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", - "optional": true, - "requires": { - "@emotion/memoize": "0.7.4" - } - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", - "optional": true - } - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" - }, - "fs.realpath": { - "version": "1.0.0", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1" - }, - "gensync": { - "version": "1.0.0-beta.2" - }, - "get-intrinsic": { - "version": "1.1.2", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "giscus": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/giscus/-/giscus-1.4.0.tgz", - "integrity": "sha512-Pll+pcclTx47NcFDw8nuka2Ja85Gc4XWpzSgL0rszOQaMQRQIV8UMR+zP4a+/N3tV2TXc1SZ537kWlsN6EsAaw==", - "requires": { - "lit": "^3.1.0" - } - }, - "glob": { - "version": "7.2.3", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "dev": true - }, - "globals": { - "version": "11.12.0" - }, - "googlers-tools": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/googlers-tools/-/googlers-tools-1.4.5.tgz", - "integrity": "sha512-8mlIAb/X7zA4TD/s30au+Urb8iJpieKUoGpJ8tBorJDFEYhWd1F4AcLkiB6Rk+z9ji/8CMh0kiTP6Uose9yywA==", - "requires": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "dev": true - }, - "growl": { - "version": "1.10.5", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "dev": true - }, - "hast-util-parse-selector": { - "version": "2.2.5" - }, - "hastscript": { - "version": "6.0.0", - "requires": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" - } - }, - "he": { - "version": "1.1.1", - "dev": true - }, - "highlight.js": { - "version": "11.6.0" - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1" - } - } - }, - "hosted-git-info": { - "version": "2.8.9", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "immutable": { - "version": "4.1.0", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" - }, - "install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==" - }, - "interpret": { - "version": "2.2.0", - "dev": true - }, - "ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true - }, - "is-alphabetical": { - "version": "1.0.4" - }, - "is-alphanumerical": { - "version": "1.0.4", - "requires": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1" - }, - "is-binary-path": { - "version": "2.1.0", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.9.0", - "requires": { - "has": "^1.0.3" - } - }, - "is-decimal": { - "version": "1.0.4" - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hexadecimal": { - "version": "1.0.4" - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "dev": true - }, - "javascript-stringify": { - "version": "2.1.0", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0" - }, - "js-yaml": { - "version": "3.14.1", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "js-yaml-loader": { - "version": "1.2.2", - "dev": true, - "requires": { - "js-yaml": "^3.13.1", - "loader-utils": "^1.2.3", - "un-eval": "^1.2.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "jsesc": { - "version": "2.5.2" - }, - "json-parse-even-better-errors": { - "version": "2.3.1" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "dev": true - }, - "klona": { - "version": "2.0.5", - "dev": true - }, - "launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "license-checker": { - "version": "25.0.1", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "read-installed": "~4.0.3", - "semver": "^5.5.0", - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-satisfies": "^4.0.0", - "treeify": "^1.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "dev": true - }, - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "requires": { - "immediate": "~3.0.5" - } - }, - "lilconfig": { - "version": "2.0.5", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4" - }, - "lit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.0.tgz", - "integrity": "sha512-rzo/hmUqX8zmOdamDAeydfjsGXbbdtAFqMhmocnh2j9aDYqbu0fjXygjCa0T99Od9VQ/2itwaGrjZz/ZELVl7w==", - "requires": { - "@lit/reactive-element": "^2.0.0", - "lit-element": "^4.0.0", - "lit-html": "^3.1.0" - } - }, - "lit-element": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.2.tgz", - "integrity": "sha512-/W6WQZUa5VEXwC7H9tbtDMdSs9aWil3Ou8hU6z2cOKWbsm/tXPAcsoaHVEtrDo0zcOIE5GF6QgU55tlGL2Nihg==", - "requires": { - "@lit-labs/ssr-dom-shim": "^1.1.2", - "@lit/reactive-element": "^2.0.0", - "lit-html": "^3.1.0" - } - }, - "lit-html": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.0.tgz", - "integrity": "sha512-FwAjq3iNsaO6SOZXEIpeROlJLUlrbyMkn4iuv4f4u1H40Jw8wkeR/OUXZUHUoiYabGk8Y4Y0F/rgq+R4MrOLmA==", - "requires": { - "@types/trusted-types": "^2.0.2" - } - }, - "loader-runner": { - "version": "4.3.0", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "requires": { - "lie": "3.1.1" - } - }, - "localized-strings": { - "version": "0.2.4" - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.memoize": { - "version": "4.1.2", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowlight": { - "version": "1.20.0", - "requires": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "dependencies": { - "highlight.js": { - "version": "10.7.3" - } - } - }, - "lru-cache": { - "version": "6.0.0", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "dev": true - }, - "markdown-to-jsx": { - "version": "7.1.7", - "requires": {} - }, - "marked": { - "version": "4.0.17" - }, - "marked-react": { - "version": "1.1.2", - "requires": { - "marked": "^4.0.12" - } - }, - "material-icons": { - "version": "1.11.4" - }, - "material-ui-confirm": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/material-ui-confirm/-/material-ui-confirm-3.0.9.tgz", - "integrity": "sha512-WEAEG9z4MfwojoUyQiAjrjl8378tYbGKfiwOKz3zHaQKyXcHnFktUmV7b+F+G0yVo8kYrEMk9Bw+HxhA/2Enlw==", - "requires": {} - }, - "mdn-data": { - "version": "2.0.14", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.0.4.tgz", - "integrity": "sha512-OcZEzwX9E5AoY8SXjuAvw0DbIAYwUzV/I236I8Pqvrlv7sL/Y0E9aRCon05DhaV8pg1b32uxj76RgW0s5xjHBA==", - "requires": { - "fast-extend": "1.0.2", - "fs-monkey": "0.3.3" - }, - "dependencies": { - "fs-monkey": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-0.3.3.tgz", - "integrity": "sha512-FNUvuTAJ3CqCQb5ELn+qCbGR/Zllhf2HtwsdAtBi59s1WeCjKMT81fHcSu7dwIskqGVK+MmOrb7VOBlq3/SItw==" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0" - }, - "mime-types": { - "version": "2.1.35", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "2.6.1", - "dev": true, - "requires": { - "schema-utils": "^4.0.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "5.2.0", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "dev": true - }, - "debug": { - "version": "3.1.0", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "diff": { - "version": "3.5.0", - "dev": true - }, - "glob": { - "version": "7.1.2", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.0.8", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "has-flag": { - "version": "3.0.0", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "monaco-editor": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.43.0.tgz", - "integrity": "sha512-cnoqwQi/9fml2Szamv1XbSJieGJ1Dc8tENVMD26Kcfl7xGQWp7OBKMjlwKVGYFJ3/AXJjSOGvcqK7Ry/j9BM1Q==" - }, - "monaco-editor-core": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/monaco-editor-core/-/monaco-editor-core-0.43.0.tgz", - "integrity": "sha512-u+JeEanDWs9gc2+dfV/nVyerpc4r8uzoCqrUd9s1iKLAzoD0myMsWjkZaPufZd8HcGhCxRVsS7w30bSa2GVWmA==" - }, - "monaco-languageclient": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-6.5.0.tgz", - "integrity": "sha512-YMH2zjWmXMSPVy/gA4z/DxYgNY9yHqjAtYwmdtIGV+TIYlGwoVrpYTLtsgOgxLsNNNwkUb/MN5TQptRaP6qcDg==", - "requires": { - "@codingame/monaco-vscode-languages-service-override": "~1.82.2", - "@codingame/monaco-vscode-model-service-override": "~1.82.2", - "monaco-editor": "~0.43.0", - "vscode": "npm:@codingame/monaco-vscode-api@1.82.2", - "vscode-jsonrpc": "~8.1.0", - "vscode-languageclient": "~8.1.0" - }, - "dependencies": { - "vscode": { - "version": "npm:@codingame/monaco-vscode-api@1.82.2", - "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.82.2.tgz", - "integrity": "sha512-DbNeOw3VbTKgHUqtnS3xP2/qo43mnNfnadntJT5kAf3EpRsI9r76cQ7+d3fE4SXag89yANm4T48S1nJ5yjU8iA==", - "requires": { - "monaco-editor": "0.43.0" - } - } - } - }, - "mousetrap": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", - "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" - }, - "ms": { - "version": "2.1.2" - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "dev": true - }, - "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "nopt": { - "version": "4.0.3", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "dev": true - }, - "npm": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.8.0.tgz", - "integrity": "sha512-AXeiBAdfM5K2jvBwA7EGLKeYyt0VnhmJRnlq4k2+M0Ao9v7yKJBqF8xFPzQL8kAybzwlfpTPCZwM4uTIszb3xA==", - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.3.0", - "@npmcli/config": "^6.2.1", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^4.0.0", - "@npmcli/run-script": "^6.0.2", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.1.3", - "chalk": "^5.2.0", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.2", - "glob": "^10.2.7", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.1", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.19", - "libnpmexec": "^6.0.2", - "libnpmfund": "^4.0.19", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.4", - "libnpmpack": "^5.0.19", - "libnpmpublish": "^7.5.0", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.4.0", - "nopt": "^7.2.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.5", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.2.0", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.5.2", - "sigstore": "^1.7.0", - "ssri": "^10.0.4", - "supports-color": "^9.3.1", - "tar": "^6.1.15", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.1", - "write-file-atomic": "^5.0.1" - }, - "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "bundled": true, - "optional": true - }, - "@isaacs/cliui": { - "version": "8.0.2", - "bundled": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "bundled": true - }, - "emoji-regex": { - "version": "9.2.2", - "bundled": true - }, - "string-width": { - "version": "5.1.2", - "bundled": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "bundled": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true - }, - "@npmcli/arborist": { - "version": "6.3.0", - "bundled": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/config": { - "version": "6.2.1", - "bundled": true, - "requires": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^3.8.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - } - }, - "@npmcli/disparity-colors": { - "version": "3.0.0", - "bundled": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "3.1.0", - "bundled": true, - "requires": { - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "4.1.0", - "bundled": true, - "requires": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - } - }, - "@npmcli/installed-package-contents": { - "version": "2.0.2", - "bundled": true, - "requires": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "@npmcli/map-workspaces": { - "version": "3.0.4", - "bundled": true, - "requires": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - } - }, - "@npmcli/metavuln-calculator": { - "version": "5.0.1", - "bundled": true, - "requires": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - } - }, - "@npmcli/name-from-folder": { - "version": "2.0.0", - "bundled": true - }, - "@npmcli/node-gyp": { - "version": "3.0.0", - "bundled": true - }, - "@npmcli/package-json": { - "version": "4.0.0", - "bundled": true, - "requires": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.1", - "proc-log": "^3.0.0" - } - }, - "@npmcli/promise-spawn": { - "version": "6.0.2", - "bundled": true, - "requires": { - "which": "^3.0.0" - } - }, - "@npmcli/query": { - "version": "3.0.0", - "bundled": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "@npmcli/run-script": { - "version": "6.0.2", - "bundled": true, - "requires": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "bundled": true, - "optional": true - }, - "@sigstore/protobuf-specs": { - "version": "0.1.0", - "bundled": true - }, - "@sigstore/tuf": { - "version": "1.0.2", - "bundled": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "tuf-js": "^1.1.7" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "bundled": true - }, - "@tufjs/canonical-json": { - "version": "1.0.0", - "bundled": true - }, - "@tufjs/models": { - "version": "1.0.4", - "bundled": true, - "requires": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - } - }, - "abbrev": { - "version": "2.0.0", - "bundled": true - }, - "abort-controller": { - "version": "3.0.0", - "bundled": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.3.0", - "bundled": true, - "requires": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "bundled": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "aproba": { - "version": "2.0.0", - "bundled": true - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "4.0.0", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true - }, - "base64-js": { - "version": "1.5.1", - "bundled": true - }, - "bin-links": { - "version": "4.0.1", - "bundled": true, - "requires": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true - }, - "brace-expansion": { - "version": "2.0.1", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "buffer": { - "version": "6.0.3", - "bundled": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "builtins": { - "version": "5.0.1", - "bundled": true, - "requires": { - "semver": "^7.0.0" - } - }, - "cacache": { - "version": "17.1.3", - "bundled": true, - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - } - }, - "chalk": { - "version": "5.2.0", - "bundled": true - }, - "chownr": { - "version": "2.0.0", - "bundled": true - }, - "ci-info": { - "version": "3.8.0", - "bundled": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true - }, - "cli-columns": { - "version": "4.0.0", - "bundled": true, - "requires": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - } - }, - "cli-table3": { - "version": "0.6.3", - "bundled": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "clone": { - "version": "1.0.4", - "bundled": true - }, - "cmd-shim": { - "version": "6.0.1", - "bundled": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true - }, - "columnify": { - "version": "1.6.0", - "bundled": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "cross-spawn": { - "version": "7.0.3", - "bundled": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "cssesc": { - "version": "3.0.0", - "bundled": true - }, - "debug": { - "version": "4.3.4", - "bundled": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true - } - } - }, - "defaults": { - "version": "1.0.4", - "bundled": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "depd": { - "version": "2.0.0", - "bundled": true - }, - "diff": { - "version": "5.1.0", - "bundled": true - }, - "eastasianwidth": { - "version": "0.2.0", - "bundled": true - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true - }, - "event-target-shim": { - "version": "5.0.1", - "bundled": true - }, - "events": { - "version": "3.3.0", - "bundled": true - }, - "exponential-backoff": { - "version": "3.1.1", - "bundled": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "bundled": true - }, - "foreground-child": { - "version": "3.1.1", - "bundled": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - } - }, - "fs-minipass": { - "version": "3.0.2", - "bundled": true, - "requires": { - "minipass": "^5.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true - }, - "gauge": { - "version": "5.0.1", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "10.2.7", - "bundled": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "bundled": true - }, - "has": { - "version": "1.0.3", - "bundled": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "hosted-git-info": { - "version": "6.1.1", - "bundled": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "bundled": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "bundled": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ieee754": { - "version": "1.2.1", - "bundled": true - }, - "ignore-walk": { - "version": "6.0.3", - "bundled": true, - "requires": { - "minimatch": "^9.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true - }, - "ini": { - "version": "4.1.1", - "bundled": true - }, - "init-package-json": { - "version": "5.0.0", - "bundled": true, - "requires": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - } - }, - "ip": { - "version": "2.0.0", - "bundled": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.12.1", - "bundled": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "jackspeak": { - "version": "2.2.1", - "bundled": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "json-parse-even-better-errors": { - "version": "3.0.0", - "bundled": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true - }, - "just-diff": { - "version": "6.0.2", - "bundled": true - }, - "just-diff-apply": { - "version": "5.5.0", - "bundled": true - }, - "libnpmaccess": { - "version": "7.0.2", - "bundled": true, - "requires": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmdiff": { - "version": "5.0.19", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - } - }, - "libnpmexec": { - "version": "6.0.2", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/run-script": "^6.0.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - } - }, - "libnpmfund": { - "version": "4.0.19", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0" - } - }, - "libnpmhook": { - "version": "9.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmorg": { - "version": "5.0.4", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmpack": { - "version": "5.0.19", - "bundled": true, - "requires": { - "@npmcli/arborist": "^6.3.0", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - } - }, - "libnpmpublish": { - "version": "7.5.0", - "bundled": true, - "requires": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.4.0", - "ssri": "^10.0.1" - } - }, - "libnpmsearch": { - "version": "6.0.2", - "bundled": true, - "requires": { - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmteam": { - "version": "5.0.3", - "bundled": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - } - }, - "libnpmversion": { - "version": "4.0.2", - "bundled": true, - "requires": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - } - }, - "lru-cache": { - "version": "7.18.3", - "bundled": true - }, - "make-fetch-happen": { - "version": "11.1.1", - "bundled": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - } - }, - "minimatch": { - "version": "9.0.1", - "bundled": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "5.0.0", - "bundled": true - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-fetch": { - "version": "3.0.3", - "bundled": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true - }, - "ms": { - "version": "2.1.3", - "bundled": true - }, - "mute-stream": { - "version": "1.0.0", - "bundled": true - }, - "negotiator": { - "version": "0.6.3", - "bundled": true - }, - "node-gyp": { - "version": "9.4.0", - "bundled": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "gauge": { - "version": "4.0.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "nopt": { - "version": "6.0.0", - "bundled": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "bundled": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "bundled": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "bundled": true - }, - "which": { - "version": "2.0.2", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "nopt": { - "version": "7.2.0", - "bundled": true, - "requires": { - "abbrev": "^2.0.0" - } - }, - "normalize-package-data": { - "version": "5.0.0", - "bundled": true, - "requires": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-audit-report": { - "version": "5.0.0", - "bundled": true - }, - "npm-bundled": { - "version": "3.0.0", - "bundled": true, - "requires": { - "npm-normalize-package-bin": "^3.0.0" - } - }, - "npm-install-checks": { - "version": "6.1.1", - "bundled": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "3.0.1", - "bundled": true - }, - "npm-package-arg": { - "version": "10.1.0", - "bundled": true, - "requires": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - } - }, - "npm-packlist": { - "version": "7.0.4", - "bundled": true, - "requires": { - "ignore-walk": "^6.0.0" - } - }, - "npm-pick-manifest": { - "version": "8.0.1", - "bundled": true, - "requires": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - } - }, - "npm-profile": { - "version": "7.0.1", - "bundled": true, - "requires": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-registry-fetch": { - "version": "14.0.5", - "bundled": true, - "requires": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - } - }, - "npm-user-validate": { - "version": "2.0.0", - "bundled": true - }, - "npmlog": { - "version": "7.0.1", - "bundled": true, - "requires": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "15.2.0", - "bundled": true, - "requires": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - } - }, - "parse-conflict-json": { - "version": "3.0.1", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "path-key": { - "version": "3.1.1", - "bundled": true - }, - "path-scurry": { - "version": "1.9.2", - "bundled": true, - "requires": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "9.1.1", - "bundled": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "bundled": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "proc-log": { - "version": "3.0.0", - "bundled": true - }, - "process": { - "version": "0.11.10", - "bundled": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true - }, - "promise-call-limit": { - "version": "1.0.2", - "bundled": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "1.0.0", - "bundled": true, - "requires": { - "read": "^2.0.0" - } - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true - }, - "read": { - "version": "2.1.0", - "bundled": true, - "requires": { - "mute-stream": "~1.0.0" - } - }, - "read-cmd-shim": { - "version": "4.0.0", - "bundled": true - }, - "read-package-json": { - "version": "6.0.4", - "bundled": true, - "requires": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "read-package-json-fast": { - "version": "3.0.2", - "bundled": true, - "requires": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - } - }, - "readable-stream": { - "version": "4.4.0", - "bundled": true, - "requires": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - } - }, - "retry": { - "version": "0.12.0", - "bundled": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "glob": { - "version": "7.2.3", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "semver": { - "version": "7.5.2", - "bundled": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "shebang-command": { - "version": "2.0.0", - "bundled": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "bundled": true - }, - "signal-exit": { - "version": "4.0.2", - "bundled": true - }, - "sigstore": { - "version": "1.7.0", - "bundled": true, - "requires": { - "@sigstore/protobuf-specs": "^0.1.0", - "@sigstore/tuf": "^1.0.1", - "make-fetch-happen": "^11.0.1" - } - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true - }, - "socks": { - "version": "2.7.1", - "bundled": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "bundled": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "spdx-correct": { - "version": "3.2.0", - "bundled": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "bundled": true - }, - "ssri": { - "version": "10.0.4", - "bundled": true, - "requires": { - "minipass": "^5.0.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "bundled": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "bundled": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "supports-color": { - "version": "9.3.1", - "bundled": true - }, - "tar": { - "version": "6.1.15", - "bundled": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "bundled": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - } - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true - }, - "treeverse": { - "version": "3.0.0", - "bundled": true - }, - "tuf-js": { - "version": "1.1.7", - "bundled": true, - "requires": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - } - }, - "unique-filename": { - "version": "3.0.0", - "bundled": true, - "requires": { - "unique-slug": "^4.0.0" - } - }, - "unique-slug": { - "version": "4.0.0", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "5.0.0", - "bundled": true, - "requires": { - "builtins": "^5.0.0" - } - }, - "walk-up-path": { - "version": "3.0.1", - "bundled": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "3.0.1", - "bundled": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "bundled": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "bundled": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "bundled": true - }, - "ansi-styles": { - "version": "6.2.1", - "bundled": true - }, - "emoji-regex": { - "version": "9.2.2", - "bundled": true - }, - "string-width": { - "version": "5.1.2", - "bundled": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "bundled": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "bundled": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "5.0.1", - "bundled": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1" - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "onsenui": { - "version": "2.12.8", - "resolved": "https://registry.npmjs.org/onsenui/-/onsenui-2.12.8.tgz", - "integrity": "sha512-ju5c2nP/pW7ZIOALqG2yVmjlIa2S6Men2winRKB8E7qtMkjSpMcHD6aRLMZZ4bGRLIiubpT7psdXWLWOc/lEyA==" - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } - } - }, - "os-homedir": { - "version": "1.0.2", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "p-try": { - "version": "2.2.0", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parent-module": { - "version": "1.0.1", - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-entities": { - "version": "2.0.0", - "requires": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-parse": { - "version": "1.0.7" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0" - }, - "picocolors": { - "version": "1.0.0" - }, - "picomatch": { - "version": "2.3.1", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", - "dev": true, - "requires": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "dev": true - }, - "prismjs": { - "version": "1.28.0" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1" - } - } - }, - "properties-file": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/properties-file/-/properties-file-3.2.10.tgz", - "integrity": "sha512-yCTkv7clfUR4PGtwTJlK35cmzYVfjD9O4xSaHJe+VQrS2yEEe22s7zx5Ohuory40PzZfATgSZS852TqNufNh9Q==" - }, - "property-information": { - "version": "5.6.0", - "requires": { - "xtend": "^4.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "punycode": { - "version": "2.1.1" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "randombytes": { - "version": "2.1.0", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "dev": true - } - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "react": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-ace": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-ace/-/react-ace-10.1.0.tgz", - "integrity": "sha512-VkvUjZNhdYTuKOKQpMIZi7uzZZVgzCjM7cLYu6F64V0mejY8a2XTyPUIMszC6A4trbeMIHbK5fYFcT/wkP/8VA==", - "requires": { - "ace-builds": "^1.4.14", - "diff-match-patch": "^1.0.5", - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "prop-types": "^15.7.2" - } - }, - "react-device-detect": { - "version": "2.2.2", - "requires": { - "ua-parser-js": "^1.0.2" - } - }, - "react-disappear": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/react-disappear/-/react-disappear-1.1.3.tgz", - "integrity": "sha512-GkcndrJeg7wBIzCxYGzvudQAYQ5gJLa/B7nf0WvZbj58JX5RdQeQZNswg18vJkgEUgoHN1iK9GcYBLRiRGAp0w==", - "requires": { - "react": "^18.2.0" - } - }, - "react-dom": { - "version": "18.2.0", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "react-fast-marquee": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/react-fast-marquee/-/react-fast-marquee-1.6.1.tgz", - "integrity": "sha512-SFY+FQectFXsuCrcJuIxrh34YzJ+TKH0Lp6BqZaalVhjdmu6Sx11rKKGQiC6vvC/q9ySXYVn9sozoOvPXFSMoQ==", - "requires": {} - }, - "react-from-json": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/react-from-json/-/react-from-json-0.7.2.tgz", - "integrity": "sha512-of/jhr45fs4S+GefkRsj4T5wGp+T9o8ddaxni6nAUyel/VrLFS6ogDbnzaSX/UFfBT5Xah59OVKtQtdrYsBWPw==", - "requires": {} - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "react-jsx-parser": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/react-jsx-parser/-/react-jsx-parser-1.29.0.tgz", - "integrity": "sha512-u0svZd0UsPffRrIK0sTbox54jhEbTmg6ED9ob5FQahp1DeOpd2Rq+KiSTIFNYkZUL+WZi4Ntia/Oj5T4lDJafQ==", - "requires": { - "@types/jsdom": "^16.2.6", - "@types/react": "^17.0.1", - "@types/react-dom": "^17.0.0", - "acorn": "^8.0.5", - "acorn-jsx": "^5.3.1", - "browserslist": "^4.14.5", - "core-js": "^3.8.3" - }, - "dependencies": { - "@types/react": { - "version": "17.0.65", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz", - "integrity": "sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ==", - "optional": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "optional": true, - "requires": { - "@types/react": "^17" - } - } - } - }, - "react-onsenui": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/react-onsenui/-/react-onsenui-1.13.2.tgz", - "integrity": "sha512-rBHcopZ5JIjBbz5h1wDOdF1cV8FTH9G+kTFlxzRJwAyE0wD2+oBIPXOk3j0uB5LeZezFUBBk1rD0YF3PLrYtPw==", - "requires": { - "prop-types": "^15.6.0" - } - }, - "react-render-tools": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-render-tools/-/react-render-tools-1.0.1.tgz", - "integrity": "sha512-K3Z735EVqT41oFjnMQl2XF+2/qT7wDmPO/pz+vj+Ve7kUNF6sUluXW3Bfr3SXoXx6i4U9R62H5thamS6EaOYXQ==", - "requires": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - } - }, - "react-router": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", - "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", - "requires": { - "@remix-run/router": "1.8.0" - } - }, - "react-router-dom": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", - "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", - "requires": { - "@remix-run/router": "1.8.0", - "react-router": "6.15.0" - } - }, - "react-syntax-highlighter": { - "version": "15.5.0", - "requires": { - "@babel/runtime": "^7.3.1", - "highlight.js": "^10.4.1", - "lowlight": "^1.17.0", - "prismjs": "^1.27.0", - "refractor": "^3.6.0" - }, - "dependencies": { - "highlight.js": { - "version": "10.7.3" - } - } - }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "react-zoom-pan-pinch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.3.0.tgz", - "integrity": "sha512-vy1h8aenDzXye+HRqANZaSA8IPHoqOiuDPFBkswoyPUH8uMfsmbeH6gFI4r4BhEJa0xIlcA+FbvhidRWKGUrOg==", - "requires": {} - }, - "read-installed": { - "version": "4.0.3", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "read-package-json": { - "version": "2.1.2", - "dev": true, - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "refractor": { - "version": "3.6.0", - "requires": { - "hastscript": "^6.0.0", - "parse-entities": "^2.0.0", - "prismjs": "~1.27.0" - }, - "dependencies": { - "prismjs": { - "version": "1.27.0" - } - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-from-string": { - "version": "2.0.2" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0" - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.53.0", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.0.2", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "scheduler": { - "version": "0.23.0", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slide": { - "version": "1.1.6", - "dev": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "source-map": { - "version": "0.6.1", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "space-separated-tokens": { - "version": "1.1.5" - }, - "spdx-compare": { - "version": "1.0.0", - "dev": true, - "requires": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "dev": true - }, - "spdx-ranges": { - "version": "2.1.1", - "dev": true - }, - "spdx-satisfies": { - "version": "4.0.1", - "dev": true, - "requires": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "sprintf-js": { - "version": "1.0.3", - "dev": true - }, - "stable": { - "version": "0.1.8", - "dev": true - }, - "state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", - "dev": true, - "requires": {} - }, - "stylehacks": { - "version": "5.1.0", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylis": { - "version": "4.0.13" - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0" - }, - "svgo": { - "version": "2.8.0", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "tapable": { - "version": "2.2.1", - "dev": true - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "terser": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz", - "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "textarea-markdown-editor": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/textarea-markdown-editor/-/textarea-markdown-editor-1.0.4.tgz", - "integrity": "sha512-4uA8EZ0FkIL0dq89+xiA0BEo832/rKdtoi2T4Wab0wLZfHys82JE1i5YJf8BKAr/IQELF2NxQ5LITYkb8BGIFA==", - "requires": { - "mousetrap": "^1.6.5" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0" - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "treeify": { - "version": "1.1.0", - "dev": true - }, - "ts-loader": { - "version": "9.3.1", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "semver": { - "version": "7.3.7", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true - }, - "ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==" - }, - "un-eval": { - "version": "1.2.0", - "dev": true - }, - "underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "uninstall": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/uninstall/-/uninstall-0.0.0.tgz", - "integrity": "sha512-pjP/0+A4gsbDVa8XH/S2GZdT9NPJW8NFMy3GI7HnsWG+NAmFSSj3QidNosXBI9cPtxxNExEDdhKFO6sli8K3mA==" - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-loader": { - "version": "4.1.1", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "usehooks-ts": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.9.1.tgz", - "integrity": "sha512-2FAuSIGHlY+apM9FVlj8/oNhd+1y+Uwv5QNkMQz1oSfdHk4PXo1qoCw9I5M7j0vpH8CSWFJwXbVPeYDjLCx9PA==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2" - }, - "util-extend": { - "version": "1.0.3", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "vscode": { - "version": "1.1.37", - "dev": true, - "requires": { - "glob": "^7.1.2", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "mocha": "^5.2.0", - "semver": "^5.4.1", - "source-map-support": "^0.5.0", - "vscode-test": "^0.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "dev": true - } - } - }, - "vscode-jsonrpc": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", - "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==" - }, - "vscode-languageclient": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", - "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", - "requires": { - "minimatch": "^5.1.0", - "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.3" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "vscode-languageserver-protocol": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", - "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", - "requires": { - "vscode-jsonrpc": "8.1.0", - "vscode-languageserver-types": "3.17.3" - } - }, - "vscode-languageserver-types": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", - "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" - }, - "vscode-test": { - "version": "0.4.3", - "dev": true, - "requires": { - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.1.0", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-proxy-agent": { - "version": "2.1.0", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "dev": true - } - } - }, - "watchpack": { - "version": "2.4.0", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "webpack-sources": { - "version": "3.2.3", - "dev": true - } - } - }, - "webpack-cli": { - "version": "4.10.0", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.4" - } - } - } - }, - "webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "requires": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - } - }, - "webpack-merge": { - "version": "5.8.0", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "dev": true - }, - "wrappy": { - "version": "1.0.2" - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "requires": {} - }, - "xtend": { - "version": "4.0.2" - }, - "yallist": { - "version": "4.0.0" - }, - "yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==" - }, - "yaml-loader": { - "version": "0.8.0", - "dev": true, - "requires": { - "javascript-stringify": "^2.0.1", - "loader-utils": "^2.0.0", - "yaml": "^2.0.0" - } - }, - "yn": { - "version": "3.1.1", - "dev": true - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } } } diff --git a/Website/package.json b/Website/package.json index 36007cb2..781f667d 100644 --- a/Website/package.json +++ b/Website/package.json @@ -60,7 +60,7 @@ "markdown-to-jsx": "^7.4.0", "marked-react": "^1.1.2", "material-icons": "^1.10.8", - "material-ui-confirm": "^3.0.9", + "material-ui-confirm": "^3.0.10", "monaco-editor": "^0.45.0", "monaco-editor-core": "^0.43.0", "monaco-languageclient": "^6.5.0", diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 0b9fba43..12c9461a 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -5,7 +5,9 @@ import MenuIcon from "@mui/icons-material/Menu"; import FetchTextActivity from "./FetchTextActivity"; import ModuleFragment from "./fragments/ModuleFragment"; import TerminalActivity from "./TerminalActivity"; -import DeviceModule from "@Components/DeviceModule"; +import DeviceModule from "@Components/module/DeviceModule"; +import ExploreModule from "@Components/module/ExploreModule"; +import UpdateModule from "@Components/module/UpdateModule"; import ModuleViewActivity from "./ModuleViewActivity"; import CreateNewFolderIcon from "@mui/icons-material/CreateNewFolder"; import { useActivity } from "@Hooks/useActivity"; @@ -19,7 +21,6 @@ import { SuFile } from "@Native/SuFile"; import { useNativeStorage } from "@Hooks/useNativeStorage"; import { BuildConfig } from "@Native/BuildConfig"; import { useNewerVersion } from "@Hooks/useNewerVersion"; -import { ExploreModule } from "@Components/ExploreModule"; import { useSettings } from "@Hooks/useSettings"; import { useTheme } from "@Hooks/useTheme"; import { AnimatePresence, motion } from "framer-motion"; @@ -31,7 +32,6 @@ import Fab from "@Components/onsenui/Fab"; import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; import Divider from "@mui/material/Divider"; -import UpdateModule from "@Components/UpdateModule"; import { SearchActivity } from "./SearchActivity"; import ListItemButton from "@mui/material/ListItemButton"; import { StyledListItemText } from "@Components/StyledListItemText"; @@ -69,7 +69,7 @@ const MainApplication = () => { return [ { content: ( - } /> + } /> ), tab: , }, @@ -117,7 +117,7 @@ const MainApplication = () => { { content: ( } /> diff --git a/Website/src/components/DeviceModule.tsx b/Website/src/components/DeviceModule.tsx deleted file mode 100644 index c3223039..00000000 --- a/Website/src/components/DeviceModule.tsx +++ /dev/null @@ -1,201 +0,0 @@ -import { SuFile } from "@Native/SuFile"; -import { DeleteRounded, RefreshRounded } from "@mui/icons-material"; -import React from "react"; -import { useStrings } from "@Hooks/useStrings"; -import { Android12Switch } from "./Android12Switch"; -import { Alert, AlertTitle, Box, Button, Card, Divider, Stack, SxProps, Theme, Typography } from "@mui/material"; -import SettingsIcon from "@mui/icons-material/Settings"; -import { useActivity } from "@Hooks/useActivity"; -import { ConfigureActivity } from "@Activitys/ConfigureActivity"; -import { StyledIconButton } from "./StyledIconButton"; -import { useLog } from "@Hooks/native/useLog"; -import { link } from "googlers-tools"; -import { colors, useSettings } from "@Hooks/useSettings"; -import { useTheme } from "@Hooks/useTheme"; -import TerminalActivity from "@Activitys/TerminalActivity"; -import { useRepos } from "@Hooks/useRepos"; -import { ModConf, useModConf } from "@Hooks/useModConf"; -import { useLowQualityModule } from "@Hooks/useLowQualityModule"; - -export const badgeStyle: (color: (typeof colors)["blue" | "teal" | "red" | "orange"]) => SxProps = (color) => { - return { - px: 1, - py: 0.5, - borderRadius: 1, - display: "flex", - typography: "caption", - bgcolor: (theme) => (theme.palette.mode === "dark" ? color[900] : color[50]), - color: (theme) => (theme.palette.mode === "dark" ? "#fff" : color[700]), - }; -}; - -interface Props { - module: Module; -} - -const DeviceModule = React.memo((props) => { - const { strings, currentLanguage } = useStrings(); - const { settings } = useSettings(); - const { modConf } = useModConf(); - const { theme } = useTheme(); - const { context, extra } = useActivity(); - const { modules, repos } = useRepos(); - const [isEnabled, setIsEnabled] = React.useState(true); - const [isSwitchDisabled, setIsSwitchDisabled] = React.useState(false); - - const log = useLog("DeviceModule"); - - const { id, name, version, versionCode, author, description, updateJson: __updateJson } = props.module; - - const format = React.useCallback<(key: K) => ModConf[K]>((key) => modConf(key, { MODID: id }), []); - - const remove = new SuFile(format("REMOVE")); - React.useEffect(() => { - setIsSwitchDisabled(remove.exist()); - }, [isSwitchDisabled]); - - const disable = new SuFile(format("DISABLE")); - React.useEffect(() => { - setIsEnabled(!disable.exist()); - }, [isEnabled]); - - const post_service = SuFile.exist(format("POSTSERVICE")); - const late_service = SuFile.exist(format("LATESERVICE")); - const post_mount = SuFile.exist(format("POSTMOUNT")); - const boot_complete = SuFile.exist(format("BOOTCOMP")); - const module_config_file = SuFile.exist(format("CONFINDEX")); - - const isLowQuality = useLowQualityModule(props.module, !settings._low_quality_module); - - return ( - <> - - - - - {name} - {" "} - - {version} ({versionCode}) / {author} - - - {description as string} - - - - - - {post_service && Post service} - {late_service && Late service} - {post_mount && Post mount} - {boot_complete && On boot completed} - - - - - - { - const checked = e.target.checked; - const disable = new SuFile(format("DISABLE")); - - if (checked) { - if (disable.exist()) { - if (disable.delete()) { - log.i( - strings("module_enabled_LOG", { - name: module, - }) - ); - } - } - } else { - if (!disable.exist()) { - if (disable.create()) { - log.i( - strings("module_disabled_LOG", { - name: module, - }) - ); - } - } - } - setIsEnabled(checked); - }} - inputProps={{ "aria-label": "controlled" }} - /> - - - {module_config_file && ( - { - context.pushPage({ - component: ConfigureActivity, - key: `${id}_configure`, - extra: { - modulename: name, - moduleid: id, - }, - }); - }} - > - - - )} - - {isSwitchDisabled ? ( - { - const remove = new SuFile(format("REMOVE")); - if (remove.exist()) { - if (remove.delete()) { - setIsSwitchDisabled(false); - log.i(`${module} has been recovered`); - } else { - log.e(`Failed to restore ${module}`); - } - } else { - log.e(`This remove file don't exists for ${module}`); - } - }} - > - - - ) : ( - { - const file = new SuFile(format("REMOVE")); - if (file.create()) { - setIsSwitchDisabled(true); - } else { - setIsSwitchDisabled(false); - } - }} - > - - - )} - - - {isLowQuality && ( - - {strings("low_quality_module")} - {strings("low_quality_module_warn")} - - )} - - - ); -}); - -export default DeviceModule; diff --git a/Website/src/components/ExploreModule.tsx b/Website/src/components/ExploreModule.tsx deleted file mode 100644 index 8ddb2391..00000000 --- a/Website/src/components/ExploreModule.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { Alert, AlertTitle, Box, Card, CardMedia, Chip, Stack, SxProps, Typography } from "@mui/material"; -import { useActivity } from "@Hooks/useActivity"; -import { useStrings } from "@Hooks/useStrings"; -import { useLowQualityModule } from "@Hooks/useLowQualityModule"; -import { colors, useSettings } from "@Hooks/useSettings"; -import { useFormatDate } from "@Hooks/useFormatDate"; -import { GestureDetector } from "./onsenui/GestureDetector"; -import { useTheme } from "@Hooks/useTheme"; -import ModuleViewActivity from "@Activitys/ModuleViewActivity"; -import StarBorderRoundedIcon from "@mui/icons-material/StarBorderRounded"; -import VerifiedIcon from "@mui/icons-material/Verified"; -import React from "react"; -import { isLiteralObject } from "@Util/util"; - -interface Props { - moduleProps: Module; - disableLowQuality?: boolean; - disableCovers?: boolean; - sx?: SxProps; -} - -export const ExploreModule = React.memo((props) => { - const { context } = useActivity(); - const { strings, currentLanguage } = useStrings(); - const { settings } = useSettings(); - const { theme, scheme, shade } = useTheme(); - - const { id, name, version, versionCode, description, author, versions, track } = props.moduleProps; - - const isLowQuality = useLowQualityModule(props.moduleProps, !settings._low_quality_module); - const formatLastUpdate = useFormatDate(versions[versions.length - 1].timestamp); - - // if (!settings._invald_module && !valid) { - // return null; - // } - - const handleOpen = () => { - context.pushPage({ - component: ModuleViewActivity, - key: "ModuleViewActivity", - extra: props.moduleProps, - }); - }; - - const CoverHandler = () => { - if (props.disableCovers) { - return null; - } - - if (track.cover) { - return ( - ({ - height: "100%", - objectFit: "cover", - m: 1, - borderRadius: theme.shape.borderRadius / 8, - boxShadow: "0 1px 2px 0 rgba(60,64,67,.3), 0 1px 10px 1px rgba(60,64,67,.15)", - width: "calc(100% - 16px)", - })} - image={track.cover} - alt={name} - /> - ); - } - - return null; - }; - - return ( - - - - - - {name} - - - - - {version} ({versionCode}) / - - {/* {track.author ? ( - - {track.author.name} {track.author.verified && } - - ) : ( - {author} - )} */} - {author} - - - - {description} - - - - - ({ - bgcolor: `${settings.darkmode ? shade(scheme[200], -24.5) : shade(scheme[300], 49)}46`, - })} - label={formatLastUpdate} - /> - - {isLowQuality && ( - - {strings("low_quality_module")} - {strings("low_quality_module_warn")} - - )} - - ); -}); diff --git a/Website/src/components/UpdateModule.tsx b/Website/src/components/UpdateModule.tsx deleted file mode 100644 index 4d4debc1..00000000 --- a/Website/src/components/UpdateModule.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { SuFile } from "@Native/SuFile"; -import { DeleteRounded, RefreshRounded } from "@mui/icons-material"; -import React from "react"; -import { useStrings } from "@Hooks/useStrings"; -import { Android12Switch } from "./Android12Switch"; -import { Alert, AlertTitle, Box, Button, Card, Chip, Divider, Stack, SxProps, Theme, Typography } from "@mui/material"; -import SettingsIcon from "@mui/icons-material/Settings"; -import { useActivity } from "@Hooks/useActivity"; -import { ConfigureActivity } from "@Activitys/ConfigureActivity"; -import { StyledIconButton } from "./StyledIconButton"; -import { useLog } from "@Hooks/native/useLog"; -import { link } from "googlers-tools"; -import { colors, useSettings } from "@Hooks/useSettings"; -import { useTheme } from "@Hooks/useTheme"; -import TerminalActivity from "@Activitys/TerminalActivity"; -import { useRepos } from "@Hooks/useRepos"; -import { ModConf, useModConf } from "@Hooks/useModConf"; -import { useLowQualityModule } from "@Hooks/useLowQualityModule"; - -export const badgeStyle: (color: (typeof colors)["blue" | "teal" | "red" | "orange"]) => SxProps = (color) => { - return { - px: 1, - py: 0.5, - borderRadius: 1, - display: "flex", - typography: "caption", - bgcolor: (theme) => (theme.palette.mode === "dark" ? color[900] : color[50]), - color: (theme) => (theme.palette.mode === "dark" ? "#fff" : color[700]), - }; -}; - -interface Props { - module: Module; -} - -const UpdateModule = React.memo((props) => { - const { strings } = useStrings(); - const { theme } = useTheme(); - const { context } = useActivity(); - const { modules, repos } = useRepos(); - - const log = useLog("UpdateModule"); - - const { id, name, version, versionCode, description, updateJson: __updateJson } = props.module; - - const [updateJson, setUpdateJson] = React.useState(null); - - if (__updateJson && link.validURL(__updateJson)) { - React.useEffect(() => { - fetch(__updateJson) - .then((res) => res.json()) - .then((json: UpdateJson) => setUpdateJson(json)); - }, [repos]); - } else { - log.d(strings("dm_update_json_fetch_warn", { id: id })); - } - - const hasUpdate = React.useMemo(() => { - const onlineModule = modules.find((module) => module.id === id); - if (__updateJson && updateJson) { - return versionCode < Number(updateJson.versionCode); - } else { - return onlineModule && versionCode < onlineModule.versionCode; - } - }, [updateJson, modules, repos]); - - - const updatedModule = React.useMemo(() => { - const onlineModule = modules.find((module) => module.id === id); - if (__updateJson && updateJson) { - return updateJson; - } else { - return onlineModule && onlineModule.versions[onlineModule.versions.length - 1]; - } - }, [updateJson, modules, repos]); - - if (!hasUpdate) return null; - - return ( - <> - - - - - {name} - {" "} - - {version} ({versionCode}) {"=>"} {updatedModule?.version} ({updatedModule?.versionCode}) - - - {description as string} - - - - - {/* - - - ({ - bgcolor: `${settings.darkmode ? shade(scheme[200], -24.5) : shade(scheme[300], 49)}46`, - })} - label={formatLastUpdate} - /> - */} - - - - - ); -}); - -export default UpdateModule; diff --git a/Website/src/components/module/DeviceModule.tsx b/Website/src/components/module/DeviceModule.tsx new file mode 100644 index 00000000..9f956397 --- /dev/null +++ b/Website/src/components/module/DeviceModule.tsx @@ -0,0 +1,216 @@ +import React from "react"; +import Typography from "@mui/material/Typography"; +import Card from "@mui/material/Card"; +import Stack from "@mui/material/Stack"; +import Chip from "@mui/material/Chip"; +import Divider from "@mui/material/Divider"; +import Button from "@mui/material/Button"; + +import { ConfigureActivity } from "@Activitys/ConfigureActivity"; + +import { Android12Switch } from "@Components/Android12Switch"; + +import { Delete, Settings, RefreshRounded } from "@mui/icons-material"; + +import { useTheme } from "@Hooks/useTheme"; +import { useSettings } from "@Hooks/useSettings"; +import { useLowQualityModule } from "@Hooks/useLowQualityModule"; +import { useStrings } from "@Hooks/useStrings"; +import { useActivity } from "@Hooks/useActivity"; +import { useLog } from "@Hooks/native/useLog"; +import { ModConf, useModConf } from "@Hooks/useModConf"; + +import { SuFile } from "@Native/SuFile"; +// @ts-ignore +import { useConfirm } from "material-ui-confirm"; + +interface Props { + module: Module; +} + +const DeviceModule = React.memo((props) => { + const { theme } = useTheme(); + const { modConf } = useModConf(); + const { strings } = useStrings(); + const { settings } = useSettings(); + const { context } = useActivity(); + + const log = useLog("DeviceModule"); + const confirm = useConfirm(); + + const { id, name, author, version, versionCode, timestamp, description } = props.module; + + const format = React.useCallback<(key: K) => ModConf[K]>((key) => modConf(key, { MODID: id }), []); + + const remove = new SuFile(format("REMOVE")); + const disable = new SuFile(format("DISABLE")); + + const [isEnabled, setIsEnabled] = React.useState(!disable.exist()); + const [isSwitchDisabled, setIsSwitchDisabled] = React.useState(remove.exist()); + + const isLowQuality = useLowQualityModule(props.module, !settings._low_quality_module); + const isNew = React.useMemo(() => new Date().getTime() - timestamp < 60 * 60 * 1000, [timestamp]); + const isDisabledStyle = React.useMemo(() => (isSwitchDisabled ? { textDecoration: "line-through" } : {}), [isSwitchDisabled]); + + const post_service = SuFile.exist(format("POSTSERVICE")); + const late_service = SuFile.exist(format("LATESERVICE")); + const post_mount = SuFile.exist(format("POSTMOUNT")); + const boot_complete = SuFile.exist(format("BOOTCOMP")); + const module_config_file = SuFile.exist(format("CONFINDEX")); + + return ( + + + + {isLowQuality && ( + { + confirm({ title: strings("low_quality_module"), description: strings("low_quality_module_warn") }).then(() => {}); + }} + label={{strings("low_quality_module")}} + size="small" + sx={{ borderRadius: theme.shape.borderRadius / theme.shape.borderRadius }} + /> + )} + {isNew && ( + {strings("new")}} + size="small" + sx={{ borderRadius: theme.shape.borderRadius / theme.shape.borderRadius }} + /> + )} + + + + + {name} + + + {version} ({versionCode}) / {author} + + + + { + const checked = e.target.checked; + + if (checked) { + if (disable.exist()) { + if (disable.delete()) { + log.d( + strings("module_enabled_LOG", { + name: module, + }) + ); + } + } + } else { + if (!disable.exist()) { + if (disable.create()) { + log.d( + strings("module_disabled_LOG", { + name: module, + }) + ); + } + } + } + setIsEnabled(checked); + }} + sx={{ + right: -8, + }} + /> + + + + {description} + + + + {post_service && } + {late_service && } + {post_mount && } + {boot_complete && } + + + + + + {isSwitchDisabled ? ( + + ) : ( + + )} + + + + + ); +}); + +export default DeviceModule; diff --git a/Website/src/components/module/ExploreModule.tsx b/Website/src/components/module/ExploreModule.tsx new file mode 100644 index 00000000..6456392b --- /dev/null +++ b/Website/src/components/module/ExploreModule.tsx @@ -0,0 +1,97 @@ +import React from "react"; + +import Typography from "@mui/material/Typography"; +import Card from "@mui/material/Card"; +import Stack from "@mui/material/Stack"; +import Chip from "@mui/material/Chip"; +import Divider from "@mui/material/Divider"; +import CardMedia from "@mui/material/CardMedia"; + +import { Verified } from "@mui/icons-material"; + +import ModuleViewActivity from "@Activitys/ModuleViewActivity"; + +import { useFormatDate } from "@Hooks/useFormatDate"; +import { useActivity } from "@Hooks/useActivity"; +import Tooltip from "@mui/material/Tooltip"; +import { useStrings } from "@Hooks/useStrings"; +import { GestureDetector } from "@Components/onsenui/GestureDetector"; +import { useSettings } from "@Hooks/useSettings"; + +interface Props { + module: Module; +} + +const ExploreModule = React.memo((props) => { + const { id, name, author, description, track, timestamp, version, versions, versionCode } = props.module; + + const { context } = useActivity(); + const { strings } = useStrings(); + + const formatLastUpdate = useFormatDate(timestamp ? timestamp : versions[versions.length - 1].timestamp); + + const handleOpenModule = () => { + context.pushPage({ + component: ModuleViewActivity, + key: "ModuleViewActivity", + extra: props.module, + }); + }; + + return ( + + + {track.cover && ( + ({ + height: "100%", + objectFit: "cover", + borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + boxShadow: "0 0px 1px 0 rgba(60,64,67,.3), 0 1px 10px 1px rgba(60,64,67,.15)", + width: "100%", + })} + image={track.cover} + alt={name} + /> + )} + + + + {name} + {track.verified && ( + + + + )} + + + + {version} ({versionCode}) / {author} + + + + {description} + + + + + + + + + + ); +}); + +export default ExploreModule; diff --git a/Website/src/components/module/UpdateModule.tsx b/Website/src/components/module/UpdateModule.tsx new file mode 100644 index 00000000..51976096 --- /dev/null +++ b/Website/src/components/module/UpdateModule.tsx @@ -0,0 +1,141 @@ +import React from "react"; + +import { ArrowRightAlt } from "@mui/icons-material"; + +import ButtonGroup from "@mui/material/ButtonGroup"; +import Button from "@mui/material/Button"; +import Typography from "@mui/material/Typography"; +import Card from "@mui/material/Card"; +import Stack from "@mui/material/Stack"; +import Chip from "@mui/material/Chip"; +import Divider from "@mui/material/Divider"; + +import { useTheme } from "@Hooks/useTheme"; +import { useLog } from "@Hooks/native/useLog"; +import { useStrings } from "@Hooks/useStrings"; +import { useActivity } from "@Hooks/useActivity"; +import { useRepos } from "@Hooks/useRepos"; + +import TerminalActivity from "@Activitys/TerminalActivity"; +import FetchTextActivity from "@Activitys/FetchTextActivity"; + +import { link } from "googlers-tools"; + +interface Props { + module: Module; +} + +const UpdateModule = React.memo((props) => { + const { theme } = useTheme(); + const { strings } = useStrings(); + const { context } = useActivity(); + const { modules, repos } = useRepos(); + + const { id, name, author, version, versionCode, updateJson: __updateJson } = props.module; + + const log = useLog("UpdateModule"); + + const [updateJson, setUpdateJson] = React.useState(null); + + if (__updateJson && link.validURL(__updateJson)) { + React.useEffect(() => { + fetch(__updateJson) + .then((res) => res.json()) + .then((json: UpdateJson) => setUpdateJson(json)); + }, [repos]); + } else { + log.d(strings("dm_update_json_fetch_warn", { id: id })); + } + + const hasUpdate = React.useMemo(() => { + const onlineModule = modules.find((module) => module.id === id); + if (__updateJson && updateJson) { + return versionCode < Number(updateJson.versionCode); + } else { + return onlineModule && versionCode < onlineModule.versionCode; + } + }, [updateJson, modules, repos]); + + const updatedModule = React.useMemo(() => { + const onlineModule = modules.find((module) => module.id === id); + if (__updateJson && updateJson) { + return updateJson; + } else { + return onlineModule && onlineModule.versions[onlineModule.versions.length - 1]; + } + }, [updateJson, modules, repos]); + + if (!hasUpdate) return null; + + return ( + + + + {name} + {author} + + + + + + Version: + + + + + + + + + Version code: + + + + + + + + + + + + + + + + + ); +}); + +export default UpdateModule; diff --git a/Website/src/hooks/useModulesFilter.tsx b/Website/src/hooks/useModulesFilter.tsx index 265ed80d..d18a4161 100644 --- a/Website/src/hooks/useModulesFilter.tsx +++ b/Website/src/hooks/useModulesFilter.tsx @@ -20,31 +20,31 @@ export const filters = [ name: "No filter", icon: UpdateDisabledIcon, value: "none", - allowedIds: ["explore", "local"], + allowedIds: ["explore", "local", "update"], }, { - name: "By date (newest)", + name: "Newest date first", icon: CalendarMonthIcon, value: "date_newest", - allowedIds: ["explore", "local"], + allowedIds: ["explore", "local", "update"], }, { - name: "By date (oldest)", + name: "Oldest date first", icon: CalendarMonthIcon, value: "date_oldest", - allowedIds: ["explore", "local"], + allowedIds: ["explore", "local", "update"], }, { - name: "Alphabetically", + name: "Name (A to Z)", icon: AbcIcon, value: "alphabetically", - allowedIds: ["explore", "local"], + allowedIds: ["explore", "local", "update"], }, { - name: "Alphabetically (reverse)", + name: "Name (Z to A)", icon: AbcIcon, value: "alphabetically_reverse", - allowedIds: ["explore", "local"], + allowedIds: ["explore", "local", "update"], }, // { // name: "Most stars", diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json index ad593b9b..f86eb92b 100644 --- a/Website/src/locales/de.json +++ b/Website/src/locales/de.json @@ -1,4 +1,6 @@ { + "changelog": "Changelog", + "new": "Neu", "search": "Suche", "updates": "Updates", "versions": "Versionen", diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json index 6283952d..51010f9e 100644 --- a/Website/src/locales/en.json +++ b/Website/src/locales/en.json @@ -1,4 +1,6 @@ { + "changelog": "Changelog", + "new": "New", "search": "Search", "updates": "Updates", "versions": "Versions", From 271c17af1205fde215f1240efdcf7c2db162e148 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:39:28 +0100 Subject: [PATCH 30/77] improve anchor --- Website/src/components/dapi/Anchor.tsx | 42 +++++++++++++++----------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/Website/src/components/dapi/Anchor.tsx b/Website/src/components/dapi/Anchor.tsx index 3725c6ff..b51e8631 100644 --- a/Website/src/components/dapi/Anchor.tsx +++ b/Website/src/components/dapi/Anchor.tsx @@ -1,5 +1,5 @@ import { useTheme } from "@Hooks/useTheme"; -import { Box, Typography, styled } from "@mui/material"; +import { Box, Stack, Typography, styled } from "@mui/material"; import { useActivity } from "../../hooks/useActivity"; import Icon from "@Components/Icon"; import NorthEastRoundedIcon from "@mui/icons-material/NorthEastRounded"; @@ -72,12 +72,14 @@ function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { - { if (module && findModule) { @@ -99,23 +101,27 @@ function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { }} color={_color} > - + {children} {!noIcon && ( - <> - - + )} - + ); } From 953d9c90fd20fa84441e0c43335e40a6c47426ea Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:42:56 +0100 Subject: [PATCH 31/77] improve search --- Website/src/activitys/SearchActivity.tsx | 33 ++---------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/Website/src/activitys/SearchActivity.tsx b/Website/src/activitys/SearchActivity.tsx index 594961ab..22869496 100644 --- a/Website/src/activitys/SearchActivity.tsx +++ b/Website/src/activitys/SearchActivity.tsx @@ -10,7 +10,6 @@ import { Box, List } from "@mui/material"; import { renderFunc } from "flatlist-react/lib/___subComponents/uiFunctions"; import { useTheme } from "@Hooks/useTheme"; import { useSettings } from "@Hooks/useSettings"; -import { os } from "@Native/Os"; const RenderWhenEmpty = React.memo(() => { const { theme } = useTheme(); @@ -41,7 +40,6 @@ interface SearchActivityProps { function SearchActivity(props: SearchActivityProps) { const { strings } = useStrings(); - const { settings } = useSettings(); const { context } = useActivity(); const { theme } = useTheme(); @@ -50,31 +48,11 @@ function SearchActivity(props: SearchActivityProps) { const [search, setSearch] = React.useState(""); - React.useEffect(() => { - os.setStatusBarColor(theme.palette.background.default); - - return function () { - os.setStatusBarColor(theme.palette.primary.main); - }; - }, []); - const renderToolbar = () => { return ( - + - + { setSearch(""); }} From cd71ec22652167c9552b30b16f5ac939a1145951 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:20:55 +0100 Subject: [PATCH 32/77] improve imports of module configure --- Website/package.json | 2 +- .../src/components/ConfigureView/index.tsx | 24 ++++ docs/ModuleConfigure.md | 126 ++++++++++++++++++ 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 docs/ModuleConfigure.md diff --git a/Website/package.json b/Website/package.json index 781f667d..85edd90f 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,7 +5,7 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "2.13.9_alpha-4", + "version_name": "2.13.9_alpha-5", "version_code": 2139 }, "main": "index.tsx", diff --git a/Website/src/components/ConfigureView/index.tsx b/Website/src/components/ConfigureView/index.tsx index 04565698..49ef81e6 100644 --- a/Website/src/components/ConfigureView/index.tsx +++ b/Website/src/components/ConfigureView/index.tsx @@ -15,6 +15,9 @@ import { globals, libraries } from "./libs"; import { DialogEditListItem, StyledListSubheader } from "./components"; import { SuFile, wasmFs } from "@Native/SuFile"; import { ModConf, useModConf } from "@Hooks/useModConf"; +import ini from "ini"; +import yaml from "yaml"; +import { useLog } from "@Hooks/native/useLog"; function plugin({ types: t }): PluginObj { return { @@ -70,6 +73,7 @@ const scope = { export const ConfigureView = React.memo((props) => { const { theme } = useTheme(); const { modConf } = useModConf(); + const log = useLog(`Config-${props.modid}`); const format = React.useCallback<(key: K) => ModConf[K]>((key) => modConf(key, { MODID: props.modid }), []); @@ -90,6 +94,7 @@ export const ConfigureView = React.memo((props) => parseCode(code), true )({ + log: log, modid: props.modid, modpath: (path: string) => `${format("MODULECWD")}/${path}`, confpath: (path: string) => `${format("CONFCWD")}/${path}`, @@ -116,6 +121,25 @@ export const ConfigureView = React.memo((props) => return libraries.find((lib) => id === lib.name)?.__esModule; } }, + import(file: string, opt?: { ignoreCwd: boolean }) { + const __raw__filename = !opt?.ignoreCwd ? `${format("CONFCWD")}/${file}` : file; + const __file = new SuFile(__raw__filename); + if (__file.exist()) { + if (__raw__filename.endsWith(".jsx") || __raw__filename.endsWith(".js")) { + return box(__file.read()); + } else if (__raw__filename.endsWith(".yaml") || __raw__filename.endsWith(".yml")) { + return yaml.parse(__file.read()); + } else if (__raw__filename.endsWith(".json")) { + return JSON.parse(__file.read()); + } else if (__raw__filename.endsWith(".prop") || __raw__filename.endsWith(".properties") || __raw__filename.endsWith(".ini")) { + return ini.parse(__file.read()); + } else { + return __file.read(); + } + } else { + throw new Error(__raw__filename + " not found"); + } + }, ...scope, }) .run(), diff --git a/docs/ModuleConfigure.md b/docs/ModuleConfigure.md new file mode 100644 index 00000000..9bb3748d --- /dev/null +++ b/docs/ModuleConfigure.md @@ -0,0 +1,126 @@ +# Module Configure + +- TODO + +## Available libaries + +- `@mmrl/ui` +- `@mmrl/hooks` +- `@mmrl/sufile` +- `@mmrl/terminal` +- `@mmrl/shell` +- `@mmrl/buildconfig` +- `@mmrl/os` +- `@mmrl/providers` +- `@mui/material` +- `@mui/icons-material` +- `react` + +## Diff. between `require` and `import` + +With `require` you only can import predefined libaries, you can't includes files with this method anymore. + +```js +const React = require("react"); +// or +import React from "react"; +``` + +old way to import files + +```js +const { Component } = require("!conf/Component.jsx"); +// or +import { Component } from "!conf/Component.jsx"; +``` + +> Please do not use this, use `import` instead. + +--- + +Using `import` way more stable and supports more including types like + +- `*.js` +- `*.jsx` +- `*.json` +- `*.ini` +- `*.prop` +- `*.properties` + +```js +const { Component } = import("Component.jsx"); + +// to ignore cwd restrictions +const properties = import(`/data/adb/modules/${modid}/module.prop`, { + ignoreCwd: true, +}); + +const { id, name, author } = properties; +``` + +## Defaut functions and variables + +There are some default functions and variables that makes the development easier.. + +> These functions make also usage of the ModConf services. + +### `modid` + +Types + +```ts +declare const modid: string; +``` + +Usage + +```js +console.log(modid); +``` + +### `modpath` + +Types + +```ts +declare function modpath(path: string): string; +``` + +Usage + +```js +const properties = import(modpath("module.prop"), { ignoreCwd: true }); + +const { id, name, author } = properties; +``` + +Will print + +``` +/data/adb/modules//module.prop +``` + +> Depends how ModConf is configured + +### `confpath` + +Types + +```ts +declare function confpath(path: string): string; +``` + +Usage + +```js +const properties = import(confpath("Component.jsx"), { ignoreCwd: true }); + +const { id, name, author } = properties; +``` + +Will print + +``` +/data/adb/modules//system/share/mmrl/config//Component.jsx +``` + From 899ba318defa758de9fdc10e7127d7c0b22d42fe Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:33:35 +0100 Subject: [PATCH 33/77] fix docs --- docs/ModuleConfigure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ModuleConfigure.md b/docs/ModuleConfigure.md index 9bb3748d..53d9a3e9 100644 --- a/docs/ModuleConfigure.md +++ b/docs/ModuleConfigure.md @@ -75,7 +75,7 @@ declare const modid: string; Usage ```js -console.log(modid); +log.i(modid); ``` ### `modpath` From 1e9f2de6f62017131f4c86e53863c19d14ff9821 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:47:24 +0100 Subject: [PATCH 34/77] fix fab icon --- Website/src/activitys/MainApplication.tsx | 59 ++++++++++++----------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 12c9461a..934a00d4 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -1,46 +1,44 @@ -import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; import React from "react"; -import Typography from "@mui/material/Typography"; -import MenuIcon from "@mui/icons-material/Menu"; -import FetchTextActivity from "./FetchTextActivity"; -import ModuleFragment from "./fragments/ModuleFragment"; -import TerminalActivity from "./TerminalActivity"; + import DeviceModule from "@Components/module/DeviceModule"; import ExploreModule from "@Components/module/ExploreModule"; import UpdateModule from "@Components/module/UpdateModule"; -import ModuleViewActivity from "./ModuleViewActivity"; -import CreateNewFolderIcon from "@mui/icons-material/CreateNewFolder"; -import { useActivity } from "@Hooks/useActivity"; +import Fab from "@Components/onsenui/Fab"; +import { ConfigureView } from "@Components/ConfigureView"; import { Toolbar } from "@Components/onsenui/Toolbar"; -import { os } from "@Native/Os"; -import { Page } from "@Components/onsenui/Page"; -import { useStrings } from "@Hooks/useStrings"; import { Tabbar, TabbarRenderTab } from "@Components/onsenui/Tabbar"; -import { useRepos } from "@Hooks/useRepos"; +import { Page } from "@Components/onsenui/Page"; +import { StyledListItemText } from "@Components/StyledListItemText"; + +import { os } from "@Native/Os"; import { SuFile } from "@Native/SuFile"; -import { useNativeStorage } from "@Hooks/useNativeStorage"; import { BuildConfig } from "@Native/BuildConfig"; -import { useNewerVersion } from "@Hooks/useNewerVersion"; -import { useSettings } from "@Hooks/useSettings"; -import { useTheme } from "@Hooks/useTheme"; -import { AnimatePresence, motion } from "framer-motion"; -import InputBase from "@mui/material/InputBase"; -import SearchIcon from "@mui/icons-material/Search"; -import ClearIcon from "@mui/icons-material/Clear"; -import { useModConf } from "@Hooks/useModConf"; -import Fab from "@Components/onsenui/Fab"; -import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; -import Divider from "@mui/material/Divider"; + +import FetchTextActivity from "./FetchTextActivity"; +import ModuleFragment from "./fragments/ModuleFragment"; +import TerminalActivity from "./TerminalActivity"; +import ModuleViewActivity from "./ModuleViewActivity"; import { SearchActivity } from "./SearchActivity"; + +import Typography from "@mui/material/Typography"; import ListItemButton from "@mui/material/ListItemButton"; -import { StyledListItemText } from "@Components/StyledListItemText"; import VerifiedIcon from "@mui/icons-material/Verified"; import ListItemAvatar from "@mui/material/ListItemAvatar"; import Avatar from "@mui/material/Avatar"; import Stack from "@mui/material/Stack"; import Chip from "@mui/material/Chip"; -import { ConfigureView } from "@Components/ConfigureView"; + +import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; +import MenuIcon from "@mui/icons-material/Menu"; +import SearchIcon from "@mui/icons-material/Search"; +import AddIcon from "@mui/icons-material/Add"; + +import { useLocalModules } from "@Hooks/useLocalModules"; +import { useActivity } from "@Hooks/useActivity"; +import { useStrings } from "@Hooks/useStrings"; +import { useRepos } from "@Hooks/useRepos"; +import { useModConf } from "@Hooks/useModConf"; const MainApplication = () => { const { strings } = useStrings(); @@ -85,6 +83,11 @@ const MainApplication = () => { if (os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools) { return ( { Chooser.getFile( "application/zip", @@ -105,7 +108,7 @@ const MainApplication = () => { }} position="bottom right" > - + ); } From b1e97beeccf1507cdbd2f65f7c7e23825d582eaa Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Tue, 23 Jan 2024 20:59:10 +0100 Subject: [PATCH 35/77] revert --- .../app/default/release/output-metadata.json | 26 +++++------ Website/src/activitys/MainApplication.tsx | 46 ++++++++----------- 2 files changed, 33 insertions(+), 39 deletions(-) diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index ce1e211f..cab5f7fc 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-4", + "versionName": "2.13.9_alpha-5", "outputFile": "app-default-universal-release.apk" }, { @@ -20,52 +20,52 @@ "filters": [ { "filterType": "ABI", - "value": "x86" + "value": "x86_64" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-4", - "outputFile": "app-default-x86-release.apk" + "versionName": "2.13.9_alpha-5", + "outputFile": "app-default-x86_64-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "arm64-v8a" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-4", - "outputFile": "app-default-armeabi-v7a-release.apk" + "versionName": "2.13.9_alpha-5", + "outputFile": "app-default-arm64-v8a-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "arm64-v8a" + "value": "x86" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-4", - "outputFile": "app-default-arm64-v8a-release.apk" + "versionName": "2.13.9_alpha-5", + "outputFile": "app-default-x86-release.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "armeabi-v7a" } ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-4", - "outputFile": "app-default-x86_64-release.apk" + "versionName": "2.13.9_alpha-5", + "outputFile": "app-default-armeabi-v7a-release.apk" } ], "elementType": "File" diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 934a00d4..521c3e27 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -1,44 +1,38 @@ +import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; import React from "react"; - +import Typography from "@mui/material/Typography"; +import MenuIcon from "@mui/icons-material/Menu"; +import FetchTextActivity from "./FetchTextActivity"; +import ModuleFragment from "./fragments/ModuleFragment"; +import TerminalActivity from "./TerminalActivity"; import DeviceModule from "@Components/module/DeviceModule"; import ExploreModule from "@Components/module/ExploreModule"; import UpdateModule from "@Components/module/UpdateModule"; -import Fab from "@Components/onsenui/Fab"; -import { ConfigureView } from "@Components/ConfigureView"; +import ModuleViewActivity from "./ModuleViewActivity"; +import CreateNewFolderIcon from "@mui/icons-material/CreateNewFolder"; +import { useActivity } from "@Hooks/useActivity"; import { Toolbar } from "@Components/onsenui/Toolbar"; -import { Tabbar, TabbarRenderTab } from "@Components/onsenui/Tabbar"; -import { Page } from "@Components/onsenui/Page"; -import { StyledListItemText } from "@Components/StyledListItemText"; - import { os } from "@Native/Os"; +import { Page } from "@Components/onsenui/Page"; +import { useStrings } from "@Hooks/useStrings"; +import { Tabbar, TabbarRenderTab } from "@Components/onsenui/Tabbar"; +import { useRepos } from "@Hooks/useRepos"; import { SuFile } from "@Native/SuFile"; import { BuildConfig } from "@Native/BuildConfig"; +import SearchIcon from "@mui/icons-material/Search"; +import { useModConf } from "@Hooks/useModConf"; +import Fab from "@Components/onsenui/Fab"; +import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; - -import FetchTextActivity from "./FetchTextActivity"; -import ModuleFragment from "./fragments/ModuleFragment"; -import TerminalActivity from "./TerminalActivity"; -import ModuleViewActivity from "./ModuleViewActivity"; import { SearchActivity } from "./SearchActivity"; - -import Typography from "@mui/material/Typography"; import ListItemButton from "@mui/material/ListItemButton"; +import { StyledListItemText } from "@Components/StyledListItemText"; import VerifiedIcon from "@mui/icons-material/Verified"; import ListItemAvatar from "@mui/material/ListItemAvatar"; import Avatar from "@mui/material/Avatar"; import Stack from "@mui/material/Stack"; import Chip from "@mui/material/Chip"; - -import CodeRoundedIcon from "@mui/icons-material/CodeRounded"; -import MenuIcon from "@mui/icons-material/Menu"; -import SearchIcon from "@mui/icons-material/Search"; -import AddIcon from "@mui/icons-material/Add"; - -import { useLocalModules } from "@Hooks/useLocalModules"; -import { useActivity } from "@Hooks/useActivity"; -import { useStrings } from "@Hooks/useStrings"; -import { useRepos } from "@Hooks/useRepos"; -import { useModConf } from "@Hooks/useModConf"; +import { ConfigureView } from "@Components/ConfigureView"; const MainApplication = () => { const { strings } = useStrings(); @@ -108,7 +102,7 @@ const MainApplication = () => { }} position="bottom right" > - + ); } From ec1eaa83e610ed2ffd5e9312c291685371380d85 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 08:28:17 +0100 Subject: [PATCH 36/77] rename import to include --- Website/src/components/ConfigureView/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Website/src/components/ConfigureView/index.tsx b/Website/src/components/ConfigureView/index.tsx index 49ef81e6..46c5e8fc 100644 --- a/Website/src/components/ConfigureView/index.tsx +++ b/Website/src/components/ConfigureView/index.tsx @@ -121,7 +121,7 @@ export const ConfigureView = React.memo((props) => return libraries.find((lib) => id === lib.name)?.__esModule; } }, - import(file: string, opt?: { ignoreCwd: boolean }) { + include(file: string, opt?: { ignoreCwd: boolean }) { const __raw__filename = !opt?.ignoreCwd ? `${format("CONFCWD")}/${file}` : file; const __file = new SuFile(__raw__filename); if (__file.exist()) { @@ -137,7 +137,8 @@ export const ConfigureView = React.memo((props) => return __file.read(); } } else { - throw new Error(__raw__filename + " not found"); + log.e(__raw__filename + " not found"); + return undefined; } }, ...scope, From 9c987d4698ce76cab64bf8603aed54fed704be5c Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 08:29:58 +0100 Subject: [PATCH 37/77] Update ModuleConfigure.md --- docs/ModuleConfigure.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/ModuleConfigure.md b/docs/ModuleConfigure.md index 53d9a3e9..5cfff24c 100644 --- a/docs/ModuleConfigure.md +++ b/docs/ModuleConfigure.md @@ -34,11 +34,11 @@ const { Component } = require("!conf/Component.jsx"); import { Component } from "!conf/Component.jsx"; ``` -> Please do not use this, use `import` instead. +> Please do not use this, use `include` instead. --- -Using `import` way more stable and supports more including types like +Using `include` way more stable and supports more including types like - `*.js` - `*.jsx` @@ -48,10 +48,10 @@ Using `import` way more stable and supports more including types like - `*.properties` ```js -const { Component } = import("Component.jsx"); +const { Component } = include("Component.jsx"); // to ignore cwd restrictions -const properties = import(`/data/adb/modules/${modid}/module.prop`, { +const properties = include(`/data/adb/modules/${modid}/module.prop`, { ignoreCwd: true, }); @@ -89,7 +89,7 @@ declare function modpath(path: string): string; Usage ```js -const properties = import(modpath("module.prop"), { ignoreCwd: true }); +const properties = include(modpath("module.prop"), { ignoreCwd: true }); const { id, name, author } = properties; ``` @@ -113,7 +113,7 @@ declare function confpath(path: string): string; Usage ```js -const properties = import(confpath("Component.jsx"), { ignoreCwd: true }); +const properties = include(confpath("Component.jsx"), { ignoreCwd: true }); const { id, name, author } = properties; ``` From ba9721ca79d28c3d01bd4e294a3dcf5c0b2c8781 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:41:15 +0100 Subject: [PATCH 38/77] Update PlaygroundsActivity.tsx --- Website/src/activitys/PlaygroundsActivity.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Website/src/activitys/PlaygroundsActivity.tsx b/Website/src/activitys/PlaygroundsActivity.tsx index 581c65ad..d12705e2 100644 --- a/Website/src/activitys/PlaygroundsActivity.tsx +++ b/Website/src/activitys/PlaygroundsActivity.tsx @@ -46,7 +46,7 @@ export class PreviewErrorBoundary extends React.Component{this.state.error?.message}; + return
{this.state.error?.message}
; } return ; From 94ddf230a7051d961525171333b4eed6d8527a02 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:53:39 +0100 Subject: [PATCH 39/77] Update index.tsx --- Website/src/components/ConfigureView/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Website/src/components/ConfigureView/index.tsx b/Website/src/components/ConfigureView/index.tsx index 46c5e8fc..5df6cc38 100644 --- a/Website/src/components/ConfigureView/index.tsx +++ b/Website/src/components/ConfigureView/index.tsx @@ -7,6 +7,7 @@ import { Android12Switch } from "@Components/Android12Switch"; import { PreviewErrorBoundaryChildren } from "@Activitys/PlaygroundsActivity"; import { useTheme } from "@Hooks/useTheme"; import { os } from "@Native/Os"; +import { Page } from "@Components/onsenui/Page"; import Sandbox from "@nyariv/sandboxjs"; import { transform, registerPlugin } from "@babel/standalone"; import * as React from "react"; @@ -151,6 +152,6 @@ export const ConfigureView = React.memo((props) => if (Component) { return ; } else { - return
export is undefined
; + return
export is undefined
; } }); From 7c2c953d2715a4f1ae3f7c7cac53d757a14205e8 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:12:48 +0100 Subject: [PATCH 40/77] store playground value --- Website/src/activitys/PlaygroundsActivity.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Website/src/activitys/PlaygroundsActivity.tsx b/Website/src/activitys/PlaygroundsActivity.tsx index d12705e2..4144bd07 100644 --- a/Website/src/activitys/PlaygroundsActivity.tsx +++ b/Website/src/activitys/PlaygroundsActivity.tsx @@ -9,7 +9,8 @@ import PreviewIcon from "@mui/icons-material/Preview"; import * as monacoEditor from "monaco-editor/esm/vs/editor/editor.api"; import Editor, { Monaco } from "@monaco-editor/react"; import { ErrorBoundaryProps, ErrorBoundaryState, errorBoundaryInitialState } from "@Components/ErrorBoundary"; -import editorTheme from "@Util/editorTheme"; +import editorTheme from "@Util/editorTheme"; +import { useNativeStorage } from "@Hooks/useNativeStorage"; export interface PlaygroundExtra { title: string; @@ -46,7 +47,11 @@ export class PreviewErrorBoundary extends React.Component
{this.state.error?.message}
; + return ( + +
{this.state.error?.message}
+
+ ); } return ; @@ -112,7 +117,7 @@ const editorDidMount = (editor: monacoEditor.editor.IStandaloneCodeEditor, monac const PlaygroundsActivity = () => { const { context, extra } = useActivity(); - const [description, setDescription] = React.useState(extra.defaultText || ""); + const [description, setDescription] = useNativeStorage("playground_" + extra.title, extra.defaultText || ""); const [errBoundKey, setErrBoundKey] = React.useState(0); const isLargeScreen = useMediaQuery("(min-width:600px)"); From 99bad000e797ea4a0cbb1029da836d2e83af26ec Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:24:37 +0100 Subject: [PATCH 41/77] update anchor --- Website/src/components/dapi/Anchor.tsx | 96 ++++++++++++++------------ 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/Website/src/components/dapi/Anchor.tsx b/Website/src/components/dapi/Anchor.tsx index b51e8631..426bc1e9 100644 --- a/Website/src/components/dapi/Anchor.tsx +++ b/Website/src/components/dapi/Anchor.tsx @@ -1,5 +1,5 @@ import { useTheme } from "@Hooks/useTheme"; -import { Box, Stack, Typography, styled } from "@mui/material"; +import { Box, Stack, Tooltip, Typography, styled } from "@mui/material"; import { useActivity } from "../../hooks/useActivity"; import Icon from "@Components/Icon"; import NorthEastRoundedIcon from "@mui/icons-material/NorthEastRounded"; @@ -68,61 +68,65 @@ function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { const findModule = React.useMemo(() => modules.find((m) => m.id === module), [module]); + const __href = !(module && findModule) ? href : module; + return ( - - { - if (module && findModule) { - context.pushPage({ - component: ModuleViewActivity, - key: "ModuleViewActivity", - extra: findModule, - }); - } else { - if (href) { - os.open(href, { - target: "_blank", - features: { - color: theme.palette.primary.main, - }, - }); - } - } + + - { + if (module && findModule) { + context.pushPage({ + component: ModuleViewActivity, + key: "ModuleViewActivity", + extra: findModule, + }); + } else { + if (__href) { + os.open(__href, { + target: "_blank", + features: { + color: theme.palette.primary.main, + }, + }); + } + } }} color={_color} > - {children} - - {!noIcon && ( - )} - - + color={_color} + > + {children} + + {!noIcon && ( + + )} + + + ); } From 238bb0c536339d16115cfe842b2bf9486447e14b Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:39:17 +0100 Subject: [PATCH 42/77] make code context openable --- Website/src/components/Markdown/index.tsx | 9 +++++++- Website/src/components/dapi/Code.tsx | 27 +++++++++++++++++++++++ Website/src/components/dapi/Pre.tsx | 27 +++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 Website/src/components/dapi/Code.tsx create mode 100644 Website/src/components/dapi/Pre.tsx diff --git a/Website/src/components/Markdown/index.tsx b/Website/src/components/Markdown/index.tsx index b4674e00..0619055f 100644 --- a/Website/src/components/Markdown/index.tsx +++ b/Website/src/components/Markdown/index.tsx @@ -9,6 +9,8 @@ import { Image } from "@Components/dapi/Image"; import { StyledMarkdown } from "./StyledMarkdown"; import { DiscordWidget } from "@Components/dapi/DiscordWidget"; import { AlertIcon, BugIcon, CheckIcon, IssueClosedIcon, IssueOpenedIcon, IssueReopenedIcon, XIcon } from "@primer/octicons-react"; +import Code from "@Components/dapi/Code"; +import Pre from "@Components/dapi/Pre"; type Props = { children: string; @@ -75,7 +77,12 @@ export const MarkdownOverrides: MarkdownToJSX.Overrides | undefined = { stack: { component: Stack, }, - + code: { + component: Code, + }, + pre: { + component: Pre, + }, discordwidget: { component: DiscordWidget, }, diff --git a/Website/src/components/dapi/Code.tsx b/Website/src/components/dapi/Code.tsx new file mode 100644 index 00000000..ba9f7653 --- /dev/null +++ b/Website/src/components/dapi/Code.tsx @@ -0,0 +1,27 @@ +import React, { useRef } from "react"; + +const Code = React.forwardRef((props, _ref) => { + const ref = (_ref as React.MutableRefObject) || useRef(null); + + React.useEffect(() => { + if (ref.current) { + ref.current.addEventListener( + "contextmenu", + function (event) { + event.returnValue = true; + if (typeof event.stopPropagation === "function") { + event.stopPropagation(); + } + if (typeof event.cancelBubble === "function") { + (event as any).cancelBubble(); + } + }, + true + ); + } + }, []); + + return ; +}); + +export default Code; diff --git a/Website/src/components/dapi/Pre.tsx b/Website/src/components/dapi/Pre.tsx new file mode 100644 index 00000000..8d9cca30 --- /dev/null +++ b/Website/src/components/dapi/Pre.tsx @@ -0,0 +1,27 @@ +import React, { useRef } from "react"; + +const Pre = React.forwardRef((props, _ref) => { + const ref = (_ref as React.MutableRefObject) || useRef(null); + + React.useEffect(() => { + if (ref.current) { + ref.current.addEventListener( + "contextmenu", + function (event) { + event.returnValue = true; + if (typeof event.stopPropagation === "function") { + event.stopPropagation(); + } + if (typeof event.cancelBubble === "function") { + (event as any).cancelBubble(); + } + }, + true + ); + } + }, []); + + return
;
+});
+
+export default Pre;

From 07eaec466810f20df62f4614c89c3ac6232929b2 Mon Sep 17 00:00:00 2001
From: Der_Googler <54764558+DerGoogler@users.noreply.github.com>
Date: Wed, 24 Jan 2024 21:19:01 +0100
Subject: [PATCH 43/77] improve module configure

---
 Website/src/activitys/ConfigureActivity.tsx   |  14 +-
 .../activitys/ConfigurePlaygroundActivity.tsx | 238 ++++++++++++++++++
 .../activitys/fragments/DrawerFragment.tsx    |  38 ++-
 .../src/components/ConfigureView/index.tsx    |  24 +-
 4 files changed, 274 insertions(+), 40 deletions(-)
 create mode 100644 Website/src/activitys/ConfigurePlaygroundActivity.tsx

diff --git a/Website/src/activitys/ConfigureActivity.tsx b/Website/src/activitys/ConfigureActivity.tsx
index 5f103a01..c8ab092a 100644
--- a/Website/src/activitys/ConfigureActivity.tsx
+++ b/Website/src/activitys/ConfigureActivity.tsx
@@ -2,11 +2,11 @@ import { useActivity } from "@Hooks/useActivity";
 import React from "react";
 import { SuFile } from "@Native/SuFile";
 import { ConfigureView } from "@Components/ConfigureView";
-import { PreviewErrorBoundary } from "./PlaygroundsActivity";
 import { useModConf } from "@Hooks/useModConf";
+import { PreviewErrorBoundary } from "./ConfigurePlaygroundActivity";
 
 type Extra = {
-  raw_data?: string;
+  code?: string;
   modulename: string;
   moduleid: string;
 };
@@ -16,7 +16,7 @@ const ConfigureActivity = () => {
   const { extra } = useActivity();
 
   const config: string = React.useMemo(() => {
-    if (!extra.raw_data) {
+    if (!extra.code) {
       const file = new SuFile(modConf("CONFINDEX", { MODID: extra.moduleid }));
 
       if (file.exist()) {
@@ -25,11 +25,15 @@ const ConfigureActivity = () => {
         return `

Config file not found

`; } } else { - return extra.raw_data; + return extra.code; } }, []); - return ; + return ( + + + + ); }; export { ConfigureActivity }; diff --git a/Website/src/activitys/ConfigurePlaygroundActivity.tsx b/Website/src/activitys/ConfigurePlaygroundActivity.tsx new file mode 100644 index 00000000..12e78f09 --- /dev/null +++ b/Website/src/activitys/ConfigurePlaygroundActivity.tsx @@ -0,0 +1,238 @@ +import { Box, Stack, styled } from "@mui/material"; +import * as React from "react"; +import useMediaQuery from "@mui/material/useMediaQuery"; +import { Toolbar } from "@Components/onsenui/Toolbar"; +import { Page } from "@Components/onsenui/Page"; +import { IntentPusher, useActivity } from "@Hooks/useActivity"; +import PreviewIcon from "@mui/icons-material/Preview"; +import * as monacoEditor from "monaco-editor/esm/vs/editor/editor.api"; +import Editor, { Monaco } from "@monaco-editor/react"; +import { ErrorBoundaryProps, ErrorBoundaryState, errorBoundaryInitialState } from "@Components/ErrorBoundary"; +import editorTheme from "@Util/editorTheme"; +import { ConfigureView } from "@Components/ConfigureView"; + +export interface PlaygroundExtra { + title: string; + editorMode?: string; + defaultText?: string; + previewPage: IntentPusher["component"]; + preview: React.FunctionComponent | React.ComponentType; +} + +export interface PreviewErrorBoundaryChildren extends React.PropsWithChildren { + hasError: boolean; +} + +interface PreviewErrorBoundaryProps extends Omit {} +interface PreviewErrorBoundaryState extends ErrorBoundaryState {} + +export class PreviewErrorBoundary extends React.Component { + public constructor(props: PreviewErrorBoundaryProps) { + super(props); + this.state = errorBoundaryInitialState; + } + + public static getDerivedStateFromError(error: any) { + return { hasError: true }; + } + + public componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + this.setState({ error, errorInfo }); + } + + public render() { + if (this.state.hasError) { + return ( + +
{this.state.error?.message}
+
+ ); + } + + return this.props.children; + } +} + +const createDependencyProposals = (monaco: typeof monacoEditor, range: any): any => { + // returning a static list of proposals, not even looking at the prefix (filtering is done by the Monaco editor), + // here you could do a server side lookup + return [ + { + label: "native", + kind: monaco.languages.CompletionItemKind.Function, + documentation: "", + insertText: "native", + range: range, + }, + { + label: "ignore", + kind: monaco.languages.CompletionItemKind.Function, + documentation: "", + insertText: "// @ts-ignore", + range: range, + }, + ]; +}; + +const editorDidMount = (editor: monacoEditor.editor.IStandaloneCodeEditor, monaco: Monaco) => { + monaco.editor.defineTheme("editorTheme", editorTheme); + monaco.editor.setTheme("editorTheme"); + + monaco.languages.typescript.javascriptDefaults.setDiagnosticsOptions({ + noSemanticValidation: true, + noSyntaxValidation: true, + }); + + monaco.languages.typescript.javascriptDefaults.setCompilerOptions({ + jsx: monaco.languages.typescript.JsxEmit.React, + jsxFactory: "React.createElement", + reactNamespace: "React", + allowNonTsExtensions: true, + allowJs: true, + target: monaco.languages.typescript.ScriptTarget.ES2015, + }); + + monaco.languages.registerCompletionItemProvider("javascript", { + provideCompletionItems: (model, position) => { + const word = model.getWordUntilPosition(position); + const range = { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn, + endColumn: word.endColumn, + }; + return { + suggestions: createDependencyProposals(monaco, range), + }; + }, + }); + editor.focus(); +}; + +const ConfigurePlaygroundActivity = () => { + const { context, extra } = useActivity(); + + const [description, setDescription] = React.useState(extra.defaultText || ""); + const [errBoundKey, setErrBoundKey] = React.useState(0); + + const isLargeScreen = useMediaQuery("(min-width:600px)"); + + const handlePreview = () => { + context.pushPage({ + component: ConfigureView, + key: extra.title, + extra: { + modulename: "Preview", + }, + props: { + modid: "preview", + code: description, + }, + }); + }; + + const renderToolbar = () => { + return ( + + + + + Module Configure Playground + {!isLargeScreen && } + + ); + }; + + return ( + +
+ + + + { + if (value) { + setErrBoundKey((prev) => prev + 1); + setDescription(value); + } + }} + onMount={editorDidMount} + options={{ + autoIndent: "full", + contextmenu: true, + fontFamily: "monospace", + fontSize: 13, + lineHeight: 24, + hideCursorInOverviewRuler: true, + matchBrackets: "always", + minimap: { + enabled: false, + }, + scrollbar: { + horizontalSliderSize: 4, + verticalSliderSize: 18, + }, + selectOnLineNumbers: true, + roundedSelection: false, + readOnly: false, + cursorStyle: "line", + automaticLayout: true, + }} + /> + + + {isLargeScreen && ( + + + + + + + + )} + + +
+
+ ); +}; + +const Preview = styled("div")(({ theme }) => ({ + flex: 1, + flexBasis: "50%", + height: "100%", + width: "100%", + minHeight: "100%", + position: "relative", + borderRadius: theme.shape.borderRadius, + borderStyle: "solid", + borderWidth: "1px", + minWidth: "0%", + overflow: "auto", + borderColor: "rgba(0, 0, 0, 0.23)", + section: { + position: "absolute", + overflowY: "scroll", + }, + ".monaco-editor": { + borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + }, + ".overflow-guard": { + borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + }, +})); + +export default ConfigurePlaygroundActivity; diff --git a/Website/src/activitys/fragments/DrawerFragment.tsx b/Website/src/activitys/fragments/DrawerFragment.tsx index 0de8b216..64ad452b 100644 --- a/Website/src/activitys/fragments/DrawerFragment.tsx +++ b/Website/src/activitys/fragments/DrawerFragment.tsx @@ -14,6 +14,7 @@ import { Markup } from "@Components/Markdown"; import { configureSample } from "@Util/configure-sample"; import { dapiSample } from "@Util/dapi-sample"; import ModConfActivity from "@Activitys/ModConfActivity"; +import ConfigurePlaygroundActivity from "@Activitys/ConfigurePlaygroundActivity"; type Props = { renderToolbar: () => JSX.Element; @@ -53,20 +54,20 @@ export const DrawerFragment = (props: Props) => { {/* {os.isAndroid && ( */} - <> - { - pushPage({ - component: ModConfActivity, - key: "ModConfActivity", - extra: {}, - }); - hide(); - }} - > - - - + <> + { + pushPage({ + component: ModConfActivity, + key: "ModConfActivity", + extra: {}, + }); + hide(); + }} + > + + + {/* )} */} @@ -93,21 +94,18 @@ export const DrawerFragment = (props: Props) => { { - pushPage({ - component: PlaygroundsActivity, + pushPage({ + component: ConfigurePlaygroundActivity, key: "configure_playground", extra: { - title: "Configure playground", editorMode: "javascript", defaultText: configureSample, - previewPage: ConfigureActivity, - preview: ConfigureView, }, }); hide(); }} > - + diff --git a/Website/src/components/ConfigureView/index.tsx b/Website/src/components/ConfigureView/index.tsx index 5df6cc38..22405f2e 100644 --- a/Website/src/components/ConfigureView/index.tsx +++ b/Website/src/components/ConfigureView/index.tsx @@ -4,7 +4,6 @@ import ListItemButton from "@mui/material/ListItemButton"; import Divider from "@mui/material/Divider"; import { StyledListItemText } from "@Components/StyledListItemText"; import { Android12Switch } from "@Components/Android12Switch"; -import { PreviewErrorBoundaryChildren } from "@Activitys/PlaygroundsActivity"; import { useTheme } from "@Hooks/useTheme"; import { os } from "@Native/Os"; import { Page } from "@Components/onsenui/Page"; @@ -19,6 +18,7 @@ import { ModConf, useModConf } from "@Hooks/useModConf"; import ini from "ini"; import yaml from "yaml"; import { useLog } from "@Hooks/native/useLog"; +import { useActivity } from "@Hooks/useActivity"; function plugin({ types: t }): PluginObj { return { @@ -71,23 +71,13 @@ const scope = { Divider: Divider, }; -export const ConfigureView = React.memo((props) => { +export const ConfigureView = React.memo<{ code: string; modid: string }>((props) => { const { theme } = useTheme(); const { modConf } = useModConf(); - const log = useLog(`Config-${props.modid}`); + const log = useLog(`Config-${props.modid}`); const format = React.useCallback<(key: K) => ModConf[K]>((key) => modConf(key, { MODID: props.modid }), []); - React.useEffect(() => { - wasmFs.volume.fromJSON( - { - [format("PROPS")]: `id=${props.modid}`, - [format("CONFINDEX")]: 'export default "DO NOT USE THIS FILE OR IMPORT IT!"', - }, - format("CONFCWD") - ); - }, [props.modid]); - const box = React.useCallback( (code: string) => sandbox @@ -147,11 +137,15 @@ export const ConfigureView = React.memo((props) => .run(), [] ); - const Component = box(props.children as string); + const Component = box(props.code as string); if (Component) { return ; } else { - return
export is undefined
; + return ( + +
export is undefined
+
+ ); } }); From c1487b6e933a821742aee7c2190e48681d7d2839 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:43:08 +0100 Subject: [PATCH 44/77] . --- Website/src/activitys/ConfigurePlaygroundActivity.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Website/src/activitys/ConfigurePlaygroundActivity.tsx b/Website/src/activitys/ConfigurePlaygroundActivity.tsx index 12e78f09..a8502b2e 100644 --- a/Website/src/activitys/ConfigurePlaygroundActivity.tsx +++ b/Website/src/activitys/ConfigurePlaygroundActivity.tsx @@ -10,6 +10,7 @@ import Editor, { Monaco } from "@monaco-editor/react"; import { ErrorBoundaryProps, ErrorBoundaryState, errorBoundaryInitialState } from "@Components/ErrorBoundary"; import editorTheme from "@Util/editorTheme"; import { ConfigureView } from "@Components/ConfigureView"; +import { useNativeStorage } from "@Hooks/useNativeStorage"; export interface PlaygroundExtra { title: string; @@ -112,7 +113,7 @@ const editorDidMount = (editor: monacoEditor.editor.IStandaloneCodeEditor, monac const ConfigurePlaygroundActivity = () => { const { context, extra } = useActivity(); - const [description, setDescription] = React.useState(extra.defaultText || ""); + const [description, setDescription] = useNativeStorage("module-configure-playground", extra.defaultText || ""); const [errBoundKey, setErrBoundKey] = React.useState(0); const isLargeScreen = useMediaQuery("(min-width:600px)"); From 76a73289d3b8bb835f9f78a26c6be75efb13108a Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:45:30 +0100 Subject: [PATCH 45/77] update docs --- docs/ModuleConfigure.md | 80 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/docs/ModuleConfigure.md b/docs/ModuleConfigure.md index 5cfff24c..26eece6c 100644 --- a/docs/ModuleConfigure.md +++ b/docs/ModuleConfigure.md @@ -124,3 +124,83 @@ Will print /data/adb/modules//system/share/mmrl/config//Component.jsx ``` +# Setup a page + +Small sample to setup a page + +```jsx +import React from "react"; + +import { Page, Toolbar } from "@mmrl/ui"; +import { useActivity } from "@mmrl/hooks"; + +import { Stack } from "@mui/material"; +import { + Timeline, + TimelineItem, + TimelineSeparator, + TimelineConnector, + TimelineContent, + TimelineDot, +} from "@mui/lab"; + +const Config = () => { + const { context } = useActivity(); + + const renderToolbar = () => { + return ( + + + {/* Pressing this here will close the editor */} + + + My config + + ); + }; + + return ( + + + + + + + + + Eat + + + + + + + Code + + + + + + + Sleep + + + + + + Repeat + + + + + ); +}; + +export default Config; +``` From 6a6adcbaeb7d0ee8316edd060cfcad4d64da946f Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:16:08 +0100 Subject: [PATCH 46/77] show desc, even without readme --- Website/src/activitys/ModuleViewActivity.tsx | 152 ++++++------------- 1 file changed, 47 insertions(+), 105 deletions(-) diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index 3df406dc..4514b711 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -244,35 +244,6 @@ const ModuleViewActivity = () => { setIsNameVisible(!visible)}> {name} - - {/* {track.author ? ( - { - context.pushPage({ - component: ProfileActivty, - key: track.author?.name + "_ProfileActivty", - extra: track.author, - }); - }} - > - {track.author.name} {track.author.verified && } - - ) : ( - - {author} - - )} */} - {author} @@ -290,36 +261,7 @@ const ModuleViewActivity = () => { alignItems="flex-start" spacing={1} > - {/* {track.author && track.contributors && ( - - - Contributors - - - {pickFourElements(mmrl.contributors).map((contributor) => ( - { - context.pushPage({ - component: ProfileActivty, - key: contributor.name + "_ProfileActivty", - extra: contributor, - }); - }} - /> - ))} - - - )} */} - {/* DL SECTION */} - { )} - {data ? ( - - - - - {strings("about_this_module")} - + + + + + {strings("about_this_module")} + + {data && ( { context.pushPage({ @@ -444,34 +386,34 @@ const ModuleViewActivity = () => { > - + )} + - - {description} - - - {strings("updated_on")} - - {formatLastUpdate} - + + {description} + + + {strings("updated_on")} + + {formatLastUpdate} - {categories.length !== 0 && ( - - {categories.map((category) => ( - - ))} - - )} - - - ) : null} + + {categories.length !== 0 && ( + + {categories.map((category) => ( + + ))} + + )} + + {track.antifeatures ? ( Date: Thu, 25 Jan 2024 17:18:50 +0100 Subject: [PATCH 47/77] . --- Website/src/activitys/SearchActivity.tsx | 1 - Website/src/components/ConfigureView/libs.ts | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Website/src/activitys/SearchActivity.tsx b/Website/src/activitys/SearchActivity.tsx index 22869496..fce4eb0c 100644 --- a/Website/src/activitys/SearchActivity.tsx +++ b/Website/src/activitys/SearchActivity.tsx @@ -9,7 +9,6 @@ import ClearIcon from "@mui/icons-material/Clear"; import { Box, List } from "@mui/material"; import { renderFunc } from "flatlist-react/lib/___subComponents/uiFunctions"; import { useTheme } from "@Hooks/useTheme"; -import { useSettings } from "@Hooks/useSettings"; const RenderWhenEmpty = React.memo(() => { const { theme } = useTheme(); diff --git a/Website/src/components/ConfigureView/libs.ts b/Website/src/components/ConfigureView/libs.ts index 1ac5836d..2164fb8a 100644 --- a/Website/src/components/ConfigureView/libs.ts +++ b/Website/src/components/ConfigureView/libs.ts @@ -40,6 +40,10 @@ export const libraries = [ name: "@mmrl/terminal", __esModule: os.isAndroid ? Terminal : {}, }, + { + name: "flatlist-react", + __esModule: require("flatlist-react"), + }, { name: "@mmrl/ui", __esModule: { From 9c2b0964003bf3cec6e7717b9e92179a4a1ba7d0 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Fri, 26 Jan 2024 11:09:08 +0100 Subject: [PATCH 48/77] . --- .../src/components/ConfigureView/index.tsx | 111 ++++++++++++++---- 1 file changed, 91 insertions(+), 20 deletions(-) diff --git a/Website/src/components/ConfigureView/index.tsx b/Website/src/components/ConfigureView/index.tsx index 22405f2e..6f39053a 100644 --- a/Website/src/components/ConfigureView/index.tsx +++ b/Website/src/components/ConfigureView/index.tsx @@ -18,7 +18,6 @@ import { ModConf, useModConf } from "@Hooks/useModConf"; import ini from "ini"; import yaml from "yaml"; import { useLog } from "@Hooks/native/useLog"; -import { useActivity } from "@Hooks/useActivity"; function plugin({ types: t }): PluginObj { return { @@ -50,7 +49,6 @@ function parseCode(data: string): string { }); return code as string; } catch (err) { - console.error("Error parsing code: ", err); return ""; } } @@ -71,16 +69,38 @@ const scope = { Divider: Divider, }; -export const ConfigureView = React.memo<{ code: string; modid: string }>((props) => { +export const ConfigureView = React.forwardRef((props, ref) => { const { theme } = useTheme(); const { modConf } = useModConf(); const log = useLog(`Config-${props.modid}`); const format = React.useCallback<(key: K) => ModConf[K]>((key) => modConf(key, { MODID: props.modid }), []); + const customRequire = React.useCallback((file: string, opt?: any) => { + const isLocalFile = /^[./]/.test(file); + const absolutePath = file; + + if (SuFile.exist(absolutePath)) { + const fileExt = opt && opt.ignoreExt ? extname(absolutePath) : ""; + + if (fileExt === ".json") { + return JSON.parse(SuFile.read(absolutePath)); + } else if (fileExt === ".yaml" || fileExt === ".yml") { + return yaml.parse(SuFile.read(absolutePath)); + } else if (fileExt === ".ini" || fileExt === ".props") { + return ini.parse(SuFile.read(absolutePath)); + } else { + const code = SuFile.read(absolutePath); + return box(code); + } + } else { + return libraries.find((lib) => absolutePath === lib.name)?.__esModule; + } + }, []); + const box = React.useCallback( - (code: string) => - sandbox + (code: string) => { + return sandbox .compile | undefined>( parseCode(code), true @@ -99,19 +119,8 @@ export const ConfigureView = React.memo<{ code: string; modid: string }>((props) }); }, }, - require(id: string) { - if (id.startsWith("!conf/")) { - const filename = id.replace(/!conf\/(.+)/gm, `${format("CONFCWD")}/$1`); - const file = new SuFile(filename); - if (file.exist()) { - return box(file.read()); - } else { - return `Imported \"${filename}\" file not found`; - } - } else { - return libraries.find((lib) => id === lib.name)?.__esModule; - } - }, + document: document, + require: customRequire, include(file: string, opt?: { ignoreCwd: boolean }) { const __raw__filename = !opt?.ignoreCwd ? `${format("CONFCWD")}/${file}` : file; const __file = new SuFile(__raw__filename); @@ -134,18 +143,80 @@ export const ConfigureView = React.memo<{ code: string; modid: string }>((props) }, ...scope, }) - .run(), + .run(); + }, + [] ); const Component = box(props.code as string); + const container = React.useRef(null); if (Component) { return ; } else { return ( -
export is undefined
+
An error occurred, either there is a syntax mistake or something
); } }); + +const CHAR_FORWARD_SLASH = 47; /* / */ +const CHAR_DOT = 46; /* . */ + +function extname(path: string) { + if (typeof path !== "string") { + throw new TypeError(`The "path" argument must be of type string. Received type ${typeof path}`); + } + + let startDot = -1; + let startPart = 0; + let end = -1; + let matchedSlash = true; + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + let preDotState = 0; + for (let i = path.length - 1; i >= 0; --i) { + let code = path.charCodeAt(i); + if (code === CHAR_FORWARD_SLASH) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === CHAR_DOT) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) { + startDot = i; + } else if (preDotState !== 1) { + preDotState = 1; + } + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if ( + startDot === -1 || + end === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + (preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) + ) { + return ""; + } + return path.slice(startDot, end); +} From 2cc6fa9ff34aa1de8f7df31d54ece10163009e13 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:29:13 +0100 Subject: [PATCH 49/77] added licenses back --- Website/licensefix.js | 40 ++ Website/package.json | 11 +- Website/src/activitys/LicensesActivity.tsx | 125 ++++ .../activitys/fragments/DrawerFragment.tsx | 11 +- Website/src/locales/de.json | 1 + Website/src/locales/en.json | 1 + Website/src/typings/global.d.ts | 24 + Website/src/util/licenses.json | 631 +++++++++++++----- 8 files changed, 647 insertions(+), 197 deletions(-) create mode 100644 Website/licensefix.js create mode 100644 Website/src/activitys/LicensesActivity.tsx diff --git a/Website/licensefix.js b/Website/licensefix.js new file mode 100644 index 00000000..38ce641a --- /dev/null +++ b/Website/licensefix.js @@ -0,0 +1,40 @@ +const fs = require("fs"); +const path = require("path"); +const package = require(path.resolve(__dirname, "package.json")); + +const NODE_MODULES_PATH = path.resolve(__dirname, "node_modules"); +const OUTPUT = path.resolve(__dirname, "src", "util", "licenses.json"); +const allDependencies = []; + +Object.keys(package.dependencies).forEach((dependency) => { + const depPackage = require(path.resolve(__dirname, NODE_MODULES_PATH, dependency, "package.json")); + + if (depPackage) { + function getSource() { + if (depPackage.repository) { + return depPackage.repository.url ? depPackage.repository.url : null; + } else { + return null; + } + } + + function getAuthor() { + if (depPackage.author) { + return depPackage.author.name ? depPackage.author.name : null; + } else { + return null; + } + } + + allDependencies.push({ + name: depPackage.name, + author: getAuthor(), + license: depPackage.license, + description: depPackage.description, + version: depPackage.version, + source: `https://www.npmjs.com/package/${depPackage.name}`, + }); + } +}); + +fs.writeFileSync(OUTPUT, JSON.stringify(allDependencies, null, 2)); diff --git a/Website/package.json b/Website/package.json index 85edd90f..fe754aa9 100644 --- a/Website/package.json +++ b/Website/package.json @@ -13,16 +13,17 @@ "author": "Der_Googler", "license": "GPL-3.0", "scripts": { - "start:dev": "webpack-dev-server --open --config webpack.dev.ts", - "start:prod": "webpack-dev-server --open --config webpack.prod.ts", + "start:dev": "npm run licensefix && webpack-dev-server --open --config webpack.dev.ts", + "start:prod": "npm run licensefix && webpack-dev-server --open --config webpack.prod.ts", "web:dev": "webpack --config webpack.dev.ts", "web:prod": "webpack --config webpack.prod.ts", - "web:dev-app": "npm run web:dev && npm run assetfix:android-clean && npm run assetfix:android-build", - "web:prod-app": "npm run web:prod && npm run assetfix:android-clean && npm run assetfix:android-build", + "web:dev-app": "npm run licensefix && npm run web:dev && npm run assetfix:android-clean && npm run assetfix:android-build", + "web:prod-app": "npm run licensefix && npm run web:prod && npm run assetfix:android-clean && npm run assetfix:android-build", "assetfix:android-build": "node assetfix.js android --build", "assetfix:android-clean": "node assetfix.js android --clean", "assetfix:web-build": "node assetfix.js web --build", - "assetfix:web-clean": "node assetfix.js web --clean" + "assetfix:web-clean": "node assetfix.js web --clean", + "licensefix": "node licensefix.js" }, "resolutions": { "react": "^18.2.0", diff --git a/Website/src/activitys/LicensesActivity.tsx b/Website/src/activitys/LicensesActivity.tsx new file mode 100644 index 00000000..aa868f0b --- /dev/null +++ b/Website/src/activitys/LicensesActivity.tsx @@ -0,0 +1,125 @@ +import { Page } from "@Components/onsenui/Page"; +import { Toolbar } from "@Components/onsenui/Toolbar"; +import { useActivity } from "@Hooks/useActivity"; +import { useStrings } from "@Hooks/useStrings"; +import Typography from "@mui/material/Typography"; +import Button from "@mui/material/Button"; +import Card from "@mui/material/Card"; +import Stack from "@mui/material/Stack"; +import { useSettings } from "@Hooks/useSettings"; +import FlatList from "flatlist-react"; + +import li from "@Util/licenses.json"; +import { os } from "@Native/Os"; +import { useTheme } from "@Hooks/useTheme"; +import FetchTextActivity from "./FetchTextActivity"; + +const DepCard = (props: { dep: (typeof li)[0] }) => { + const { theme } = useTheme(); + const { strings } = useStrings(); + const { context } = useActivity(); + const dep = props.dep; + + const handleOpenSource = () => { + os.open(dep.source, { + target: "_blank", + features: { + color: theme.palette.primary.main, + }, + }); + }; + + const handleOpenLicense = () => { + fetch(`https://spdx.org/licenses/${dep.license}.json`) + .then((res) => { + if (res.status === 200) { + return res.json(); + } else { + throw new Error("Fetching license failed"); + } + }) + .then((json: LicenseSPX) => { + context.pushPage({ + component: FetchTextActivity, + key: "license_" + dep.license, + extra: { + raw_data: json.licenseText, + modulename: json.name, + }, + }); + }) + .catch((err) => { + os.toast(err, Toast.LENGTH_SHORT); + }); + }; + + return ( + + + + + {dep.author} + + + {dep.license} + + + + + {dep.name} + + + {dep.version} + + + {dep.description} + + + + + + + + + ); +}; + +const LicensesActivity = () => { + const { strings } = useStrings(); + const { settings } = useSettings(); + const { context } = useActivity(); + const { theme } = useTheme(); + + const renderToolbar = () => { + return ( + + + + + {strings("licenses")} + + ); + }; + + return ( + + + } + renderOnScroll + display={{ + row: true, + rowGap: "8px", + }} + /> + + + ); +}; + +export default LicensesActivity; diff --git a/Website/src/activitys/fragments/DrawerFragment.tsx b/Website/src/activitys/fragments/DrawerFragment.tsx index 64ad452b..512f68b2 100644 --- a/Website/src/activitys/fragments/DrawerFragment.tsx +++ b/Website/src/activitys/fragments/DrawerFragment.tsx @@ -15,6 +15,7 @@ import { configureSample } from "@Util/configure-sample"; import { dapiSample } from "@Util/dapi-sample"; import ModConfActivity from "@Activitys/ModConfActivity"; import ConfigurePlaygroundActivity from "@Activitys/ConfigurePlaygroundActivity"; +import LicensesActivity from "@Activitys/LicensesActivity"; type Props = { renderToolbar: () => JSX.Element; @@ -122,22 +123,18 @@ export const DrawerFragment = (props: Props) => { hide(); }} > - + { pushPage({ - component: FetchTextActivity, + component: LicensesActivity, key: "license", - extra: { - title: "License", - url: "https://raw.githubusercontent.com/wiki/DerGoogler/MMRL/License.md", - }, }); hide(); }} > - + { diff --git a/Website/src/locales/de.json b/Website/src/locales/de.json index f86eb92b..b4730e5c 100644 --- a/Website/src/locales/de.json +++ b/Website/src/locales/de.json @@ -4,6 +4,7 @@ "search": "Suche", "updates": "Updates", "versions": "Versionen", + "licenses": "Lizenzen", "license": "Lizenz", "search_modules": "Module durchsuchen", "settings": "Einstellungen", diff --git a/Website/src/locales/en.json b/Website/src/locales/en.json index 51010f9e..a9f2bc48 100644 --- a/Website/src/locales/en.json +++ b/Website/src/locales/en.json @@ -4,6 +4,7 @@ "search": "Search", "updates": "Updates", "versions": "Versions", + "licenses": "Licenses", "license": "License", "search_modules": "Search modules", "settings": "Settings", diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index 70a93ed7..d9b41f3d 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -213,6 +213,30 @@ declare global { changelog: string; } + export interface LicenseSPX { + isDeprecatedLicenseId: boolean + isFsfLibre: boolean + licenseText: string + standardLicenseTemplate: string + name: string + licenseId: string + crossRef: CrossRef[] + seeAlso: string[] + isOsiApproved: boolean + licenseTextHtml: string + } + + export interface CrossRef { + match: string + url: string + isValid: boolean + isLive: boolean + timestamp: string + isWayBackLink: boolean + order: number + } + + // OnsenUI Types /** * @extends {Event} diff --git a/Website/src/util/licenses.json b/Website/src/util/licenses.json index ce21ba69..5c2ae0ee 100644 --- a/Website/src/util/licenses.json +++ b/Website/src/util/licenses.json @@ -1,186 +1,447 @@ [ - { - "name": "@emotion/react", - "description": "There is no description", - "author": "Emotion Contributors", - "version": "11.9.3", - "license": "MIT", - "repository": "https://www.npmjs.com/package/@emotion/react" - }, - { - "name": "@emotion/styled", - "description": "styled API for emotion", - "author": "null", - "version": "11.9.3", - "license": "MIT", - "repository": "https://www.npmjs.com/package/@emotion/styled" - }, - { - "name": "@js.properties/properties", - "description": "JavaScript .properties parser and stringifier", - "author": "pallxk ", - "version": "0.5.4", - "license": "MIT", - "repository": "https://www.npmjs.com/package/@js.properties/properties" - }, - { - "name": "@mui/icons-material", - "description": "Material Design icons distributed as SVG React components.", - "author": "MUI Team", - "version": "5.8.4", - "license": "MIT", - "repository": "https://www.npmjs.com/package/@mui/icons-material" - }, - { - "name": "@mui/material", - "description": "React components that implement Google's Material Design.", - "author": "MUI Team", - "version": "5.8.7", - "license": "MIT", - "repository": "https://www.npmjs.com/package/@mui/material" - }, - { - "name": "axios", - "description": "Promise based HTTP client for the browser and node.js", - "author": "Matt Zabriskie", - "version": "0.27.2", - "license": "MIT", - "repository": "https://www.npmjs.com/package/axios" - }, - { - "name": "bota64", - "description": "It's my first custom encoding :(", - "author": "Der_Googler ", - "version": "1.0.7", - "license": "MIT", - "repository": "https://www.npmjs.com/package/bota64" - }, - { - "name": "googlers-tools", - "description": "My own tools / scripts that i use.", - "author": "Der_Googler ", - "version": "1.2.8", - "license": "GPL-3.0", - "repository": "https://www.npmjs.com/package/googlers-tools" - }, - { - "name": "highlight.js", - "description": "Syntax highlighting with language autodetection.", - "author": "Josh Goebel ", - "version": "11.6.0", - "license": "BSD-3-Clause", - "repository": "https://www.npmjs.com/package/highlight.js" - }, - { - "name": "jss", - "description": "A lib for generating Style Sheets with JavaScript.", - "author": "JSS Team", - "version": "10.9.0", - "license": "MIT", - "repository": "https://www.npmjs.com/package/jss" - }, - { - "name": "jss-preset-default", - "description": "Default preset for JSS with selected plugins.", - "author": "JSS Team", - "version": "10.9.0", - "license": "MIT", - "repository": "https://www.npmjs.com/package/jss-preset-default" - }, - { - "name": "localized-strings", - "description": "Simple module to localize the strings of any JS based program using the same syntax used in the ReactLocalization and ReactNativeLocalization module, use 'npm run build' before publishing", - "author": "Stefano Falda (http://www.babisoft.com)", - "version": "0.2.4", - "license": "MIT", - "repository": "https://www.npmjs.com/package/localized-strings" - }, - { - "name": "markdown-to-jsx", - "description": "Convert markdown to JSX with ease for React and React-like projects. Super lightweight and highly configurable.", - "author": "Evan Jacobs ", - "version": "7.1.7", - "license": "MIT", - "repository": "https://www.npmjs.com/package/markdown-to-jsx" - }, - { - "name": "marked-react", - "description": "Render Markdown as React components", - "author": "sibiraj-s", - "version": "1.1.2", - "license": "MIT", - "repository": "https://www.npmjs.com/package/marked-react" - }, - { - "name": "material-icons", - "description": "Latest icon fonts and CSS for self-hosting material design icons.", - "author": "null", - "version": "1.11.4", - "license": "Apache-2.0", - "repository": "https://www.npmjs.com/package/material-icons" - }, - { - "name": "object-assign", - "description": "ES2015 `Object.assign()` ponyfill", - "author": "Sindre Sorhus", - "version": "4.1.1", - "license": "MIT", - "repository": "https://www.npmjs.com/package/object-assign" - }, - { - "name": "onsenui", - "description": "HTML5 Mobile Framework & UI Components", - "author": "null", - "version": "2.12.1", - "license": "Apache-2.0", - "repository": "https://www.npmjs.com/package/onsenui" - }, - { - "name": "react", - "description": "React is a JavaScript library for building user interfaces.", - "author": "null", - "version": "18.2.0", - "license": "MIT", - "repository": "https://www.npmjs.com/package/react" - }, - { - "name": "react-device-detect", - "description": "Detect device type and render your component according to it", - "author": "Michael Laktionov", - "version": "2.2.2", - "license": "MIT", - "repository": "https://www.npmjs.com/package/react-device-detect" - }, - { - "name": "react-disappear", - "description": "Detects if the inner children are visible", - "author": "Der_Googler", - "version": "1.0.0", - "license": "null", - "repository": "https://www.npmjs.com/package/react-disappear" - }, - { - "name": "react-dom", - "description": "React package for working with the DOM.", - "author": "null", - "version": "18.2.0", - "license": "MIT", - "repository": "https://www.npmjs.com/package/react-dom" - }, - { - "name": "react-onsenui", - "description": "Onsen UI - React Components for Hybrid Cordova/PhoneGap Apps with Material Design and iOS UI components", - "author": "Onsen UI Team ", - "version": "1.12.0", - "license": "Apache-2.0", - "repository": "https://www.npmjs.com/package/react-onsenui" - }, - { - "name": "react-syntax-highlighter", - "description": "syntax highlighting component for react with prismjs or highlightjs ast using inline styles", - "author": "Conor Hastings", - "version": "15.5.0", - "license": "MIT", - "repository": "https://www.npmjs.com/package/react-syntax-highlighter" - } -] + { + "name": "@babel/runtime", + "author": null, + "license": "MIT", + "description": "babel's modular runtime helpers", + "version": "7.23.8", + "source": "https://www.npmjs.com/package/@babel/runtime" + }, + { + "name": "@babel/standalone", + "author": null, + "license": "MIT", + "description": "Standalone build of Babel for use in non-Node.js environments.", + "version": "7.23.8", + "source": "https://www.npmjs.com/package/@babel/standalone" + }, + { + "name": "@emotion/react", + "author": null, + "license": "MIT", + "version": "11.11.3", + "source": "https://www.npmjs.com/package/@emotion/react" + }, + { + "name": "@emotion/styled", + "author": null, + "license": "MIT", + "description": "styled API for emotion", + "version": "11.11.0", + "source": "https://www.npmjs.com/package/@emotion/styled" + }, + { + "name": "@giscus/react", + "author": null, + "version": "2.4.0", + "source": "https://www.npmjs.com/package/@giscus/react" + }, + { + "name": "@monaco-editor/react", + "author": null, + "license": "MIT", + "description": "Monaco Editor for React - use the monaco-editor in any React application without needing to use webpack (or rollup/parcel/etc) configuration files / plugins", + "version": "4.6.0", + "source": "https://www.npmjs.com/package/@monaco-editor/react" + }, + { + "name": "@mui/icons-material", + "author": null, + "license": "MIT", + "description": "Material Design icons distributed as SVG React components.", + "version": "5.15.4", + "source": "https://www.npmjs.com/package/@mui/icons-material" + }, + { + "name": "@mui/lab", + "author": null, + "license": "MIT", + "description": "Laboratory for new MUI modules.", + "version": "5.0.0-alpha.160", + "source": "https://www.npmjs.com/package/@mui/lab" + }, + { + "name": "@mui/material", + "author": null, + "license": "MIT", + "description": "Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.", + "version": "5.15.4", + "source": "https://www.npmjs.com/package/@mui/material" + }, + { + "name": "@nyariv/sandboxjs", + "author": null, + "license": "MIT", + "description": "Javascript sandboxing library.", + "version": "0.8.23", + "source": "https://www.npmjs.com/package/@nyariv/sandboxjs" + }, + { + "name": "@primer/octicons-react", + "author": null, + "license": "MIT", + "description": "A scalable set of icons handcrafted with <3 by GitHub.", + "version": "19.8.0", + "source": "https://www.npmjs.com/package/@primer/octicons-react" + }, + { + "name": "@wasmer/wasmfs", + "author": null, + "license": "MIT", + "description": "Isomorphic library to provide a sandboxed node fs implementation for Node and Browsers. 📂", + "version": "0.12.0", + "source": "https://www.npmjs.com/package/@wasmer/wasmfs" + }, + { + "name": "ace-builds", + "author": null, + "license": "BSD-3-Clause", + "description": "Ace (Ajax.org Cloud9 Editor)", + "version": "1.32.3", + "source": "https://www.npmjs.com/package/ace-builds" + }, + { + "name": "ajv", + "author": null, + "license": "MIT", + "description": "Another JSON Schema Validator", + "version": "8.12.0", + "source": "https://www.npmjs.com/package/ajv" + }, + { + "name": "ansi-to-react", + "author": null, + "license": "BSD-3-Clause", + "description": "ANSI to React Elements", + "version": "6.1.6", + "source": "https://www.npmjs.com/package/ansi-to-react" + }, + { + "name": "axios", + "author": null, + "license": "MIT", + "description": "Promise based HTTP client for the browser and node.js", + "version": "1.6.5", + "source": "https://www.npmjs.com/package/axios" + }, + { + "name": "default-composer", + "author": null, + "license": "MIT", + "description": "A JavaScript library that allows you to set default values for nested objects", + "version": "0.6.0", + "source": "https://www.npmjs.com/package/default-composer" + }, + { + "name": "eruda", + "author": null, + "license": "MIT", + "description": "Console for Mobile Browsers", + "version": "3.0.1", + "source": "https://www.npmjs.com/package/eruda" + }, + { + "name": "flatlist-react", + "author": null, + "license": "MIT", + "description": "A helpful utility component to handle lists in react like a champ", + "version": "1.5.14", + "source": "https://www.npmjs.com/package/flatlist-react" + }, + { + "name": "framer-motion", + "author": null, + "license": "MIT", + "description": "A simple and powerful JavaScript animation library", + "version": "10.18.0", + "source": "https://www.npmjs.com/package/framer-motion" + }, + { + "name": "fs-monkey", + "author": null, + "license": "Unlicense", + "description": "Monkey patches for file system related things.", + "version": "1.0.5", + "source": "https://www.npmjs.com/package/fs-monkey" + }, + { + "name": "googlers-tools", + "author": null, + "license": "GPL-3.0", + "description": "My own tools / scripts that I use.", + "version": "1.4.5", + "source": "https://www.npmjs.com/package/googlers-tools" + }, + { + "name": "highlight.js", + "author": null, + "license": "BSD-3-Clause", + "description": "Syntax highlighting with language autodetection.", + "version": "11.9.0", + "source": "https://www.npmjs.com/package/highlight.js" + }, + { + "name": "ini", + "author": null, + "license": "ISC", + "description": "An ini encoder/decoder for node", + "version": "4.1.1", + "source": "https://www.npmjs.com/package/ini" + }, + { + "name": "install", + "author": "Ben Newman", + "license": "MIT", + "description": "Minimal JavaScript module loader", + "version": "0.13.0", + "source": "https://www.npmjs.com/package/install" + }, + { + "name": "localforage", + "author": null, + "license": "Apache-2.0", + "description": "Offline storage, improved.", + "version": "1.10.0", + "source": "https://www.npmjs.com/package/localforage" + }, + { + "name": "localized-strings", + "author": null, + "license": "MIT", + "description": "Simple module to localize the strings of any JS based program using the same syntax used in the ReactLocalization and ReactNativeLocalization module, use 'npm run build' before publishing", + "version": "0.2.4", + "source": "https://www.npmjs.com/package/localized-strings" + }, + { + "name": "markdown-to-jsx", + "author": null, + "license": "MIT", + "description": "Convert markdown to JSX with ease for React and React-like projects. Super lightweight and highly configurable.", + "version": "7.4.0", + "source": "https://www.npmjs.com/package/markdown-to-jsx" + }, + { + "name": "marked-react", + "author": null, + "license": "MIT", + "description": "Render Markdown as React components", + "version": "1.4.0", + "source": "https://www.npmjs.com/package/marked-react" + }, + { + "name": "material-icons", + "author": null, + "license": "Apache-2.0", + "description": "Latest icon fonts and CSS for self-hosting material design icons.", + "version": "1.13.12", + "source": "https://www.npmjs.com/package/material-icons" + }, + { + "name": "material-ui-confirm", + "author": null, + "license": "MIT", + "description": "Higher order component for straightforward use of @material-ui/core confirmation dialogs.", + "version": "3.0.10", + "source": "https://www.npmjs.com/package/material-ui-confirm" + }, + { + "name": "monaco-editor", + "author": null, + "license": "MIT", + "description": "A browser based code editor", + "version": "0.45.0", + "source": "https://www.npmjs.com/package/monaco-editor" + }, + { + "name": "monaco-editor-core", + "author": null, + "license": "MIT", + "description": "A browser based code editor", + "version": "0.43.0", + "source": "https://www.npmjs.com/package/monaco-editor-core" + }, + { + "name": "monaco-languageclient", + "author": "TypeFox GmbH", + "license": "MIT", + "description": "Monaco Language client implementation", + "version": "6.6.1", + "source": "https://www.npmjs.com/package/monaco-languageclient" + }, + { + "name": "npm", + "author": null, + "license": "Artistic-2.0", + "description": "a package manager for JavaScript", + "version": "9.9.2", + "source": "https://www.npmjs.com/package/npm" + }, + { + "name": "object-assign", + "author": "Sindre Sorhus", + "license": "MIT", + "description": "ES2015 `Object.assign()` ponyfill", + "version": "4.1.1", + "source": "https://www.npmjs.com/package/object-assign" + }, + { + "name": "onsenui", + "author": null, + "license": "Apache-2.0", + "description": "HTML5 Mobile Framework & UI Components", + "version": "2.12.8", + "source": "https://www.npmjs.com/package/onsenui" + }, + { + "name": "properties-file", + "author": null, + "license": "MIT", + "description": ".properties file parser, editor, formatter and Webpack loader.", + "version": "3.3.16", + "source": "https://www.npmjs.com/package/properties-file" + }, + { + "name": "react", + "author": null, + "license": "MIT", + "description": "React is a JavaScript library for building user interfaces.", + "version": "18.2.0", + "source": "https://www.npmjs.com/package/react" + }, + { + "name": "react-ace", + "author": null, + "license": "MIT", + "description": "A react component for Ace Editor", + "version": "10.1.0", + "source": "https://www.npmjs.com/package/react-ace" + }, + { + "name": "react-device-detect", + "author": "Michael Laktionov", + "license": "MIT", + "description": "Detect device type and render your component according to it", + "version": "2.2.3", + "source": "https://www.npmjs.com/package/react-device-detect" + }, + { + "name": "react-disappear", + "author": null, + "license": "MIT", + "description": "Detects if the inner children are visible", + "version": "1.1.3", + "source": "https://www.npmjs.com/package/react-disappear" + }, + { + "name": "react-dom", + "author": null, + "license": "MIT", + "description": "React package for working with the DOM.", + "version": "18.2.0", + "source": "https://www.npmjs.com/package/react-dom" + }, + { + "name": "react-fast-marquee", + "author": null, + "license": "MIT", + "description": "A lightweight React component that utilizes the power of CSS animations to create silky smooth marquees.", + "version": "1.6.2", + "source": "https://www.npmjs.com/package/react-fast-marquee" + }, + { + "name": "react-from-json", + "author": null, + "license": "MIT", + "description": "Declare your React component tree in JSON", + "version": "0.7.2", + "source": "https://www.npmjs.com/package/react-from-json" + }, + { + "name": "react-jsx-parser", + "author": null, + "license": "MIT", + "description": "A React component which can parse JSX and output rendered React Components", + "version": "1.29.0", + "source": "https://www.npmjs.com/package/react-jsx-parser" + }, + { + "name": "react-onsenui", + "author": null, + "license": "Apache-2.0", + "description": "Onsen UI - React Components for Hybrid Cordova/PhoneGap Apps with Material Design and iOS UI components", + "version": "1.13.3", + "source": "https://www.npmjs.com/package/react-onsenui" + }, + { + "name": "react-render-tools", + "author": null, + "license": "GPL-3.0", + "description": "Simple tools to make react render easier to use", + "version": "1.0.1", + "source": "https://www.npmjs.com/package/react-render-tools" + }, + { + "name": "react-router-dom", + "author": null, + "license": "MIT", + "description": "Declarative routing for React web applications", + "version": "6.21.2", + "source": "https://www.npmjs.com/package/react-router-dom" + }, + { + "name": "react-syntax-highlighter", + "author": null, + "license": "MIT", + "description": "syntax highlighting component for react with prismjs or highlightjs ast using inline styles", + "version": "15.5.0", + "source": "https://www.npmjs.com/package/react-syntax-highlighter" + }, + { + "name": "react-zoom-pan-pinch", + "author": null, + "license": "MIT", + "description": "Zoom and pan html elements in easy way", + "version": "3.3.0", + "source": "https://www.npmjs.com/package/react-zoom-pan-pinch" + }, + { + "name": "textarea-markdown-editor", + "author": null, + "license": "MIT", + "description": "UI headless React markdown editor using only textarea", + "version": "1.0.4", + "source": "https://www.npmjs.com/package/textarea-markdown-editor" + }, + { + "name": "underscore", + "author": null, + "license": "MIT", + "description": "JavaScript's functional programming helper library.", + "version": "1.13.6", + "source": "https://www.npmjs.com/package/underscore" + }, + { + "name": "uninstall", + "author": null, + "license": "MIT", + "description": "", + "version": "0.0.0", + "source": "https://www.npmjs.com/package/uninstall" + }, + { + "name": "usehooks-ts", + "author": null, + "license": "MIT", + "description": "React hook library, ready to use, written in Typescript.", + "version": "2.9.2", + "source": "https://www.npmjs.com/package/usehooks-ts" + }, + { + "name": "yaml", + "author": null, + "license": "ISC", + "description": "JavaScript parser and stringifier for YAML", + "version": "2.3.4", + "source": "https://www.npmjs.com/package/yaml" + } +] \ No newline at end of file From 22c1adf03878b888e025f46db1f2aeced10960e8 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:05:55 +0100 Subject: [PATCH 50/77] . --- Android/app/build.gradle | 6 ++++++ .../app/default/release/output-metadata.json | 18 +++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Android/app/build.gradle b/Android/app/build.gradle index 4c780d38..68682438 100755 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -37,6 +37,12 @@ android { } } + applicationVariants.configureEach { variant -> + variant.outputs.configureEach { output -> + outputFileName = outputFileName.replace(".apk", "-${variant.versionName}-${variant.versionCode}.apk").replace("-unsigned", "") + } + } + buildTypes { release { resValue "string", "app_name", "${app_name}" diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index cab5f7fc..5d391330 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -13,59 +13,59 @@ "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-universal-release.apk" + "outputFile": "app-default-universal-release-2.13.9_alpha-5-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "arm64-v8a" } ], "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-x86_64-release.apk" + "outputFile": "app-default-arm64-v8a-release-2.13.9_alpha-5-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "arm64-v8a" + "value": "x86" } ], "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-arm64-v8a-release.apk" + "outputFile": "app-default-x86-release-2.13.9_alpha-5-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86" + "value": "armeabi-v7a" } ], "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-x86-release.apk" + "outputFile": "app-default-armeabi-v7a-release-2.13.9_alpha-5-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "x86_64" } ], "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-armeabi-v7a-release.apk" + "outputFile": "app-default-x86_64-release-2.13.9_alpha-5-2139.apk" } ], "elementType": "File" From f8388468709682fe963789ae558524a681bcbd7c Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 12:07:52 +0100 Subject: [PATCH 51/77] Update build.gradle --- Android/app/build.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Android/app/build.gradle b/Android/app/build.gradle index 68682438..44ff7e37 100755 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -95,11 +95,15 @@ repositories { dependencies { implementation "androidx.browser:browser:1.7.0" + implementation "androidx.appcompat:appcompat:1.6.1" + implementation "androidx.core:core:1.12.0" + implementation 'androidx.webkit:webkit:1.9.0' + implementation "com.github.topjohnwu.libsu:core:5.2.1" implementation "com.github.topjohnwu.libsu:io:5.2.1" - implementation "androidx.appcompat:appcompat:1.6.1" + implementation 'org.apache.cordova:framework:12.0.1' - implementation 'androidx.webkit:webkit:1.9.0' + implementation 'com.squareup.okhttp3:okhttp:4.9.0' } From 4b7f958d805f2c3659222ffb808252681cc5b523 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 15:11:09 +0100 Subject: [PATCH 52/77] added window insets --- Android/app/build.gradle | 4 +- .../java/com/dergoogler/core/NativeOS.java | 48 +------ .../java/com/dergoogler/core/NativeView.java | 111 +++++++++++++++ .../com/dergoogler/mmrl/MainActivity.java | 5 + Android/app/src/main/res/values/styles.xml | 9 +- Android/build.gradle | 1 - .../gradle/wrapper/gradle-wrapper.properties | 6 +- Website/src/hooks/useTheme.tsx | 2 - Website/src/native/Os.ts | 5 + Website/src/native/View.ts | 134 ++++++++++++++++++ Website/src/styles/light_theme.tsx | 12 +- Website/src/typings/global.d.ts | 4 + 12 files changed, 276 insertions(+), 65 deletions(-) create mode 100644 Android/app/src/main/java/com/dergoogler/core/NativeView.java create mode 100644 Website/src/native/View.ts diff --git a/Android/app/build.gradle b/Android/app/build.gradle index 44ff7e37..ce3f6e84 100755 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -96,7 +96,7 @@ repositories { dependencies { implementation "androidx.browser:browser:1.7.0" implementation "androidx.appcompat:appcompat:1.6.1" - implementation "androidx.core:core:1.12.0" + implementation 'androidx.core:core:1.13.0-alpha04' implementation 'androidx.webkit:webkit:1.9.0' implementation "com.github.topjohnwu.libsu:core:5.2.1" @@ -104,7 +104,7 @@ dependencies { implementation 'org.apache.cordova:framework:12.0.1' - implementation 'com.squareup.okhttp3:okhttp:4.9.0' + implementation 'com.squareup.okhttp3:okhttp:4.12.0' } configurations.implementation.setCanBeResolved(true) diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeOS.java b/Android/app/src/main/java/com/dergoogler/core/NativeOS.java index 325fb1c8..631ffb28 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeOS.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeOS.java @@ -143,52 +143,7 @@ public String getMonetColor(String id) { } } - @JavascriptInterface - public int getStatusBarHeight() { - Resources res = ctx.getApplicationContext().getResources(); - int statusBarHeight; - int resourceId = res.getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - statusBarHeight = res.getDimensionPixelSize(resourceId); - return (int) (statusBarHeight / res.getDisplayMetrics().density); - } else { - return 0; - } - } - - @JavascriptInterface - public int getSafeAreaInsets(String type) { - float leftInset = 0, rightInset = 0, topInset = 0, bottomInset = 0; - Resources res = ctx.getApplicationContext().getResources(); - WindowInsets windowInsets = ctx.getWindow().getDecorView().getRootWindowInsets(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - if (windowInsets != null) { - final DisplayCutout cutout = windowInsets.getDisplayCutout(); - - leftInset = cutout != null ? cutout.getSafeInsetLeft() : 0; - rightInset = cutout != null ? cutout.getSafeInsetRight() : 0; - topInset = cutout != null ? cutout.getSafeInsetTop() : 0; - bottomInset = cutout != null ? cutout.getSafeInsetBottom() : 0; - - @SuppressLint("RestrictedApi") Insets insets = Insets.wrap(windowInsets.getSystemWindowInsets()); - leftInset = Math.max(leftInset, insets.left) / res.getDisplayMetrics().density; - rightInset = Math.max(rightInset, insets.right) / res.getDisplayMetrics().density; - topInset = Math.max(topInset, insets.top) / res.getDisplayMetrics().density; - bottomInset = Math.max(bottomInset, insets.bottom) / res.getDisplayMetrics().density; - } - } - - - if (type.equals("top")) { - return (int) topInset; - } else { - - return (int) bottomInset; - } - } - - + @Deprecated @JavascriptInterface public void setStatusBarColor(String color, boolean white) { if (white) { @@ -205,6 +160,7 @@ public void setStatusBarColor(String color, boolean white) { } } + @Deprecated @JavascriptInterface public void setNavigationBarColor(String color) { try { diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeView.java b/Android/app/src/main/java/com/dergoogler/core/NativeView.java new file mode 100644 index 00000000..d4ef2dee --- /dev/null +++ b/Android/app/src/main/java/com/dergoogler/core/NativeView.java @@ -0,0 +1,111 @@ +package com.dergoogler.core; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.res.Resources; +import android.graphics.Color; +import android.os.Build; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.DisplayCutout; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowInsets; +import android.webkit.JavascriptInterface; +import android.webkit.WebView; + +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; + +import com.dergoogler.mmrl.MainActivity; + +import java.util.ArrayList; + +public class NativeView { + + private final MainActivity ctx; + private Insets insets; + private final WindowInsetsControllerCompat windowInsetsController; + + public NativeView(MainActivity ctx, WebView wv) { + this.ctx = ctx; + ViewCompat.setOnApplyWindowInsetsListener(wv, (v, windowInsets) -> { + this.insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()); + return WindowInsetsCompat.CONSUMED; + }); + this.windowInsetsController = WindowCompat.getInsetsController(this.ctx.getWindow(), wv); + } + + private int dpToPx(int dp) { + float scale = this.ctx.getResources().getDisplayMetrics().density; + return (int) (dp / scale); + } + + @JavascriptInterface + public int getWindowTopInsets() { + return dpToPx(this.insets.top); + } + + @JavascriptInterface + public int getWindowRightInsets() { + return dpToPx(this.insets.right); + } + + @JavascriptInterface + public int getWindowBottomInsets() { + return dpToPx(this.insets.bottom); + } + + @JavascriptInterface + public int getWindowLeftInsets() { + return dpToPx(this.insets.left); + } + + @JavascriptInterface + public boolean isAppearanceLightNavigationBars() { + return windowInsetsController.isAppearanceLightNavigationBars(); + } + + @JavascriptInterface + public void setAppearanceLightNavigationBars(boolean isLight) { + windowInsetsController.setAppearanceLightNavigationBars(isLight); + } + + @JavascriptInterface + public boolean isAppearanceLightStatusBars() { + return windowInsetsController.isAppearanceLightStatusBars(); + } + + @JavascriptInterface + public void setAppearanceLightStatusBars(boolean isLight) { + windowInsetsController.setAppearanceLightStatusBars(isLight); + } + + @JavascriptInterface + public void setStatusBarColor(String color, boolean white) { + if (white) { + try { + ((Activity) this.ctx).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } catch (Exception e) { + e.printStackTrace(); + } + } + try { + ((Activity) this.ctx).getWindow().setStatusBarColor(Color.parseColor(color)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @JavascriptInterface + public void setNavigationBarColor(String color) { + try { + ((Activity) this.ctx).getWindow().setNavigationBarColor(Color.parseColor(color)); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java index 44d76713..970190df 100755 --- a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java +++ b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java @@ -9,6 +9,8 @@ import android.webkit.WebSettings; import android.webkit.WebView; +import androidx.core.view.WindowCompat; + import com.dergoogler.core.NativeEnvironment; import com.dergoogler.core.NativeSuFile; import com.dergoogler.core.NativeLog; @@ -17,6 +19,7 @@ import com.dergoogler.core.NativeStorage; import com.dergoogler.core.NativeShell; import com.dergoogler.core.NativeBuildConfig; +import com.dergoogler.core.NativeView; import com.topjohnwu.superuser.Shell; import com.topjohnwu.superuser.ShellUtils; @@ -29,6 +32,7 @@ public class MainActivity extends CordovaActivity { @SuppressLint("SetJavaScriptEnabled") public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); appView = findViewById(R.id.mmrl_view); super.init(); @@ -73,6 +77,7 @@ public void onCreate(Bundle savedInstanceState) { wv.addJavascriptInterface(new NativeShell(wv), "__shell__"); wv.addJavascriptInterface(new NativeBuildConfig(), "__buildconfig__"); wv.addJavascriptInterface(os, "__os__"); + wv.addJavascriptInterface(new NativeView(this, wv), "__view__"); wv.addJavascriptInterface(ns, "__nativeStorage__"); wv.addJavascriptInterface(new NativeProperties(), "__properties__"); wv.addJavascriptInterface(new NativeLog(), "__log__"); diff --git a/Android/app/src/main/res/values/styles.xml b/Android/app/src/main/res/values/styles.xml index f49b58f7..876d04ba 100755 --- a/Android/app/src/main/res/values/styles.xml +++ b/Android/app/src/main/res/values/styles.xml @@ -3,11 +3,8 @@ diff --git a/Android/build.gradle b/Android/build.gradle index 679b7406..0b4c0f48 100755 --- a/Android/build.gradle +++ b/Android/build.gradle @@ -8,7 +8,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' - classpath "com.github.node-gradle:gradle-node-plugin:3.3.0" } } diff --git a/Android/gradle/wrapper/gradle-wrapper.properties b/Android/gradle/wrapper/gradle-wrapper.properties index 50d6c282..ecb8b44e 100755 --- a/Android/gradle/wrapper/gradle-wrapper.properties +++ b/Android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jul 18 21:46:42 CEST 2022 +#Sat Jan 27 14:48:14 CET 2024 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/Website/src/hooks/useTheme.tsx b/Website/src/hooks/useTheme.tsx index 61f72aff..579ad80d 100644 --- a/Website/src/hooks/useTheme.tsx +++ b/Website/src/hooks/useTheme.tsx @@ -99,8 +99,6 @@ export const ThemeProvider = (props: React.PropsWithChildren) => { }, }); - os.setStatusBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.primary.main, false); - os.setNavigationBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.background.default); setBackgroundColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.background.default); setStatusBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.primary.main); return THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP; diff --git a/Website/src/native/Os.ts b/Website/src/native/Os.ts index e458954e..d85b8385 100644 --- a/Website/src/native/Os.ts +++ b/Website/src/native/Os.ts @@ -115,6 +115,7 @@ class OsClass extends Native { /** * Changes the status bar color + * @deprecated * @param color Your color * @param white `true` makes the status bar white */ @@ -122,6 +123,10 @@ class OsClass extends Native { this.isAndroid ? this.interface.setStatusBarColor(color, white) : null; } + /** + * @deprecated + * @param color + */ public setNavigationBarColor(color: string): void { this.isAndroid ? this.interface.setNavigationBarColor(color) : null; } diff --git a/Website/src/native/View.ts b/Website/src/native/View.ts new file mode 100644 index 00000000..6e23f43f --- /dev/null +++ b/Website/src/native/View.ts @@ -0,0 +1,134 @@ +import { Native } from "./Native"; + +interface NativeView { + getWindowTopInsets(): number; + getWindowRightInsets(): number; + getWindowBottomInsets(): number; + getWindowLeftInsets(): number; + setStatusBarColor(color: string, white: boolean): void; + setNavigationBarColor(color: string): void; + isAppearanceLightNavigationBars(): boolean; + setAppearanceLightNavigationBars(isLight: boolean): void; + isAppearanceLightStatusBars(): boolean; + setAppearanceLightStatusBars(isLight: boolean): void; +} + +class View extends Native { + public constructor() { + super(window.__view__); + } + + public getWindowTopInsets(): number { + if (this.isAndroid) { + return this.interface.getWindowTopInsets(); + } else { + return 0; + } + } + + public getWindowRightInsets(): number { + if (this.isAndroid) { + return this.interface.getWindowRightInsets(); + } else { + return 0; + } + } + + public getWindowBottomInsets(): number { + if (this.isAndroid) { + return this.interface.getWindowBottomInsets(); + } else { + return 0; + } + } + + public getWindowLeftInsets(): number { + if (this.isAndroid) { + return this.interface.getWindowLeftInsets(); + } else { + return 0; + } + } + + /** + * Checks if the foreground of the navigation bar is set to light. + * ``` + * ``` + * This method always returns false on API < 26. + * + * @return true if the foreground is light + */ + public isAppearanceLightNavigationBars(): boolean { + if (this.isAndroid) { + return this.interface.isAppearanceLightNavigationBars(); + } else { + return false; + } + } + + /** + * If true, changes the foreground color of the navigation bars to light so that the items on + * the bar can be read clearly. If false, reverts to the default appearance. + * ``` + * ``` + * This method has no effect on API < 26. + */ + public setAppearanceLightNavigationBars(isLight: boolean = false): void { + if (this.isAndroid) { + this.interface.setAppearanceLightNavigationBars(isLight); + } + } + + /** + * Checks if the foreground of the status bar is set to light. + * ``` + * ``` + * This method always returns false on API < 23. + * + * @return true if the foreground is light + */ + public isAppearanceLightStatusBars(): boolean { + if (this.isAndroid) { + return this.interface.isAppearanceLightStatusBars(); + } else { + return false; + } + } + + /** + * If true, changes the foreground color of the status bars to light so that the items on the + * bar can be read clearly. If false, reverts to the default appearance. + * ``` + * ``` + * This method has no effect on API < 23. + */ + + public setAppearanceLightStatusBars(isLight: boolean = true): void { + if (this.isAndroid) { + this.interface.setAppearanceLightStatusBars(isLight); + } + } + + /** + * Changes the status bar color + * @param color Your color + * @param white `true` makes the status bar white + */ + public setStatusBarColor(color: string, white: boolean = false): void { + if (this.isAndroid) { + this.interface.setStatusBarColor(color, white); + } + } + + /** + * + * @param color + */ + public setNavigationBarColor(color: string): void { + if (this.isAndroid) { + this.interface.setNavigationBarColor(color); + } + } +} + +export const view: View = new View(); diff --git a/Website/src/styles/light_theme.tsx b/Website/src/styles/light_theme.tsx index fb99a0bc..216e58a6 100644 --- a/Website/src/styles/light_theme.tsx +++ b/Website/src/styles/light_theme.tsx @@ -1,4 +1,5 @@ import { os } from "@Native/Os"; +import { view } from "@Native/View"; import { GlobalStyles, Theme } from "@mui/material"; // export const LightTheme = (theme: Theme): any => ({ @@ -873,16 +874,15 @@ export const LightTheme = () => { }, ".toolbar--material": { display: "flex", - webkitFlexWrap: "nowrap", flexWrap: "nowrap", webkitBoxPack: "justify", webkitJustifyContent: "space-between", justifyContent: "space-between", - height: "56px", + paddingTop: view.getWindowTopInsets(), + height: `calc(56px + ${view.getWindowTopInsets()}px)`, borderBottom: "0", boxShadow: "0 1px 5px rgba(0, 0, 0, 0.3)", - padding: "0", backgroundColor: theme.palette.primary.main, backgroundSize: "0", }, @@ -4505,10 +4505,12 @@ export const LightTheme = () => { bottom: "44px", }, ".toolbar.toolbar--material + .page__background": { - top: "56px", + top: `calc(56px + ${view.getWindowTopInsets()}px)`, + paddingBottom: `${view.getWindowBottomInsets()}px`, }, ".toolbar.toolbar--material + .page__background + .page__content": { - top: "56px", + top: `calc(56px + ${view.getWindowTopInsets()}px)`, + paddingBottom: `${view.getWindowBottomInsets()}px`, paddingTop: "0", }, ".toolbar.toolbar--transparent + .page__background": { diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index d9b41f3d..adcd712c 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -72,6 +72,10 @@ declare global { * This is an Android only window object */ readonly __os__: I; + /** + * TODO + */ + readonly __view__: I; readonly __log__: I; readonly __properties__: I; /** From b6b33511376708f0a57b1ee61cb46474cf49a832 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 15:32:20 +0100 Subject: [PATCH 53/77] add new detection --- Android/app/src/main/cpp/shell.cpp | 170 ------------------ .../java/com/dergoogler/core/NativeShell.java | 11 +- Website/src/native/Shell.ts | 35 ++-- 3 files changed, 22 insertions(+), 194 deletions(-) diff --git a/Android/app/src/main/cpp/shell.cpp b/Android/app/src/main/cpp/shell.cpp index ea40c464..550d9026 100644 --- a/Android/app/src/main/cpp/shell.cpp +++ b/Android/app/src/main/cpp/shell.cpp @@ -10,176 +10,6 @@ #include #include - -bool path_detection(char **paths) { - int len = sizeof(paths) / sizeof(paths[0]); - - bool bRet = false; - for (int i = 0; i < len; i++) { - if (open(paths[i], O_RDONLY) >= 0) { - bRet = true; - break; - } - if (0 == access(paths[i], R_OK)) { - bRet = true; - break; - } - } - - return bRet; -} - -bool mount_detection(char **searchable_mounts) { - int len = sizeof(searchable_mounts) / sizeof(searchable_mounts[0]); - - bool bRet = false; - - FILE *fp = fopen("/proc/self/mounts", "r"); - if (fp == nullptr) { - return false; - } - - fseek(fp, 0L, SEEK_END); - long size = ftell(fp); - /* For some reason size comes as zero */ - if (size == 0) - size = 20000; /*This will differ for different devices */ - char *buffer = (char *) calloc(size, sizeof(char)); - if (buffer == nullptr) { - return false; - } - - size_t read = fread(buffer, 1, size, fp); - int count = 0; - for (int i = 0; i < len; i++) { - char *rem = strstr(buffer, searchable_mounts[i]); - if (rem != nullptr) { - count++; - break; - } - } - if (count > 0) - bRet = true; - - exit: - - free(buffer); - fclose(fp); - - return bRet; -} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_dergoogler_core_NativeShell_isMagiskSU(JNIEnv *env, jclass clazz) { - static char *mounts[] = { - "magisk", - "core/mirror", - "core/img" - }; - static char *paths[] = { - "/system/bin/magisk", - "/sbin/magisk", - "/sbin/.magisk", - "/data/adb/magisk.db", - "/data/adb/magisk/busybox", - "/data/adb/magisk/magisk64", - "/data/adb/magisk/magiskboot", - "/data/adb/magisk/magiskinit", - "/data/adb/magisk/magiskpolicy" - }; - - bool bRet = false; - do { - bRet = path_detection(paths); - if (bRet) - break; - bRet = mount_detection(mounts); - if (bRet) - break; - } while (false); - - if (bRet) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } -} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_dergoogler_core_NativeShell_isKernelSU(JNIEnv *env, jclass clazz) { - static char *mounts[] = { - "KSU", - "ksu", - "KERNELSU", - "kernelsu" - }; - static char *paths[] = { - // syslink - "/data/adb/ksud", - "/data/adb/ksu/modules.img", - "/data/adb/ksu/bin/busybox", - "/data/adb/ksu/bin/ksud", - "/data/adb/ksu/bin/resetprop" - }; - - bool bRet = false; - do { - bRet = path_detection(paths); - if (bRet) - break; - bRet = mount_detection(mounts); - if (bRet) - break; - } while (false); - - if (bRet) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } -} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_dergoogler_core_NativeShell_isAPatchSU(JNIEnv *env, jclass clazz) { - static char *mounts[] = { - "APatch", - "apd", - "APD", - "APATCH" - }; - static char *paths[] = { - "/data/adb/ap", - "/data/adb/apd", - "/data/adb/kpatch", - "/data/adb/ap/modules.img", - "/data/adb/ap/package_config", - "/data/adb/ap/version", - "/data/adb/ap/su_path", - "/data/adb/ap/bin/busybox", - "/data/adb/ap/bin/apd", - "/data/adb/ap/bin/resetprop" - }; - - bool bRet = false; - do { - bRet = path_detection(paths); - if (bRet) - break; - bRet = mount_detection(mounts); - if (bRet) - break; - } while (false); - - if (bRet) { - return JNI_TRUE; - } else { - return JNI_FALSE; - } -} - extern "C" JNIEXPORT jstring JNICALL Java_com_dergoogler_core_NativeShell_getenv(JNIEnv *env, jclass clazz, jstring key) { diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java index 41f2e971..afac9efa 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java @@ -52,16 +52,7 @@ public boolean isSuAvailable() { return false; } } - - @JavascriptInterface - public static native boolean isMagiskSU(); - - @JavascriptInterface - public static native boolean isKernelSU(); - - @JavascriptInterface - public static native boolean isAPatchSU(); - + @JavascriptInterface public static native String getenv(String key); diff --git a/Website/src/native/Shell.ts b/Website/src/native/Shell.ts index a1d852bf..0d3ea955 100644 --- a/Website/src/native/Shell.ts +++ b/Website/src/native/Shell.ts @@ -1,4 +1,5 @@ import { Native } from "./Native"; +import { SuFile } from "./SuFile"; interface NativeShell { /** @@ -127,36 +128,42 @@ class ShellClass extends Native { } /** - * Determine if MMRL runs with KernelSU + * Use regex for better detection + * @param searcher + * @returns */ - public isKernelSU(): boolean { - if (this.isAndroid) { - return this.interface.isKernelSU(); + private _mountDetect(searcher: { [Symbol.search](string: string): number }): boolean { + const proc = new SuFile("/proc/self/mounts"); + + if (proc.exist()) { + return proc.read().search(searcher) !== -1; } else { return false; } } + /** + * Determine if MMRL runs with KernelSU + */ + public isKernelSU(): boolean { + // `proc.exist()` is always `false` on browsers + return this._mountDetect(/(KSU|KernelSU)/i); + } + /** * Determine if MMRL runs with Magisk */ public isMagiskSU(): boolean { - if (this.isAndroid) { - return this.interface.isMagiskSU(); - } else { - return false; - } + // `proc.exist()` is always `false` on browsers + return this._mountDetect(/(magisk|core\/mirror|core\/img)/i); } /** * Determine if MMRL runs with APatch */ public isAPatchSU(): boolean { - if (this.isAndroid) { - return this.interface.isAPatchSU(); - } else { - return false; - } + // `proc.exist()` is always `false` on browsers + return this._mountDetect(/(APD|APatch)/i); } public getenv(key: string): string { From e5c0c057f32ef5b7f81b005dd8b4ae06899ca224 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 15:41:39 +0100 Subject: [PATCH 54/77] . --- Android/app/src/main/java/com/dergoogler/core/NativeShell.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java index afac9efa..23cad872 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java @@ -52,7 +52,7 @@ public boolean isSuAvailable() { return false; } } - + @JavascriptInterface public static native String getenv(String key); From d2d6db8c050704b57986c4bead4e13d08e3e9688 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 16:19:30 +0100 Subject: [PATCH 55/77] get rid of cpp --- Android/app/build.gradle | 19 ------ Android/app/src/main/cpp/CMakeLists.txt | 22 ------- Android/app/src/main/cpp/log.cpp | 14 ----- Android/app/src/main/cpp/properties.cpp | 34 ----------- Android/app/src/main/cpp/shell.cpp | 61 ------------------- .../java/com/dergoogler/core/NativeLog.java | 10 ++- .../com/dergoogler/core/NativeProperties.java | 16 ----- .../java/com/dergoogler/core/NativeShell.java | 10 --- .../com/dergoogler/core/NativeStorage.java | 2 +- .../com/dergoogler/mmrl/MainActivity.java | 7 --- Website/src/native/Properties.ts | 4 +- Website/src/native/Shell.ts | 34 +++-------- 12 files changed, 17 insertions(+), 216 deletions(-) delete mode 100644 Android/app/src/main/cpp/CMakeLists.txt delete mode 100644 Android/app/src/main/cpp/log.cpp delete mode 100644 Android/app/src/main/cpp/properties.cpp delete mode 100644 Android/app/src/main/cpp/shell.cpp delete mode 100644 Android/app/src/main/java/com/dergoogler/core/NativeProperties.java diff --git a/Android/app/build.gradle b/Android/app/build.gradle index ce3f6e84..780431b8 100755 --- a/Android/app/build.gradle +++ b/Android/app/build.gradle @@ -17,15 +17,6 @@ android { targetSdk pkg.config.target_sdk versionName pkg.config.version_name versionCode pkg.config.version_code - externalNativeBuild { - cmake { - cppFlags "-llog" - arguments "-DANDROID_STL=c++_shared" - } - } - ndk { - abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64" - } } splits { @@ -49,7 +40,6 @@ android { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' multiDexEnabled true - // project.tasks.preBuild.dependsOn("webProd") } debug { resValue "string", "app_name", "${app_name} Debug" @@ -58,12 +48,6 @@ android { minifyEnabled false multiDexEnabled false applicationIdSuffix '.debug' - // project.tasks.preBuild.dependsOn("webDev") - } - } - externalNativeBuild { - cmake { - path = file("src/main/cpp/CMakeLists.txt") } } compileOptions { @@ -71,9 +55,6 @@ android { targetCompatibility JavaVersion.VERSION_1_8 } packagingOptions { - jniLibs { - keepDebugSymbols += ['*/armeabi/*.so', '*/armeabi-v7a/*.so', '*/arm64-v8a/*.so', '*/mips/*.so', '*/mips64/*.so', '*/x86/*.so', '*/x86_64/*.so'] - } resources { excludes += ['META-INF/DEPENDENCIES.txt', 'META-INF/DEPENDENCIES', 'META-INF/LICENSE', 'META-INF/LICENSE.txt', 'META-INF/MANIFEST.MF', 'META-INF/NOTICE', 'META-INF/NOTICE.txt', 'META-INF/ASL2.0'] } diff --git a/Android/app/src/main/cpp/CMakeLists.txt b/Android/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index 1732d38c..00000000 --- a/Android/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# Sets the minimum version of CMake required to build your native library. -# This ensures that a certain set of CMake features is available to -# your build. - - -cmake_minimum_required(VERSION 3.4.1) - -# Specifies a library name, specifies whether the library is STATIC or -# SHARED, and provides relative paths to the source code. You can -# define multiple libraries by adding multiple add_library() commands, -# and CMake builds them for you. When you build your app, Gradle -# automatically packages shared libraries with your APK. - - -add_library(native-log-lib SHARED - log.cpp) - -add_library(native-properties-lib SHARED - properties.cpp) - -add_library(native-shell-lib SHARED - shell.cpp) \ No newline at end of file diff --git a/Android/app/src/main/cpp/log.cpp b/Android/app/src/main/cpp/log.cpp deleted file mode 100644 index c6c839c7..00000000 --- a/Android/app/src/main/cpp/log.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - - -extern "C" -JNIEXPORT void JNICALL -Java_com_dergoogler_core_NativeLog_native_1log(JNIEnv *env, jclass clazz, jint prio, jstring tag, - jstring msg) { -// unsigned int myPrio = (unsigned int)prio; - - const char *myTag = env->GetStringUTFChars(tag, 0); - const char *myMsg = env->GetStringUTFChars(msg, 0); - __android_log_write(prio, myTag, myMsg); -} \ No newline at end of file diff --git a/Android/app/src/main/cpp/properties.cpp b/Android/app/src/main/cpp/properties.cpp deleted file mode 100644 index c37ccb1d..00000000 --- a/Android/app/src/main/cpp/properties.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -//#include - -extern "C" -JNIEXPORT jstring JNICALL -Java_com_dergoogler_core_NativeProperties_get(JNIEnv *env, jclass clazz, jstring key, - jstring def) { - const char *myKey = env->GetStringUTFChars(key, 0); - const char *myDef = env->GetStringUTFChars(def, 0); - - char value[PROP_VALUE_MAX] = {0}; - - int iReturn = __system_property_get(myKey, value); - if (!iReturn) strcpy(value, myDef); - - return env->NewStringUTF(value); -} - -extern "C" -JNIEXPORT int JNICALL -Java_com_dergoogler_core_NativeProperties_set(JNIEnv *env, jclass clazz, jstring key, - jstring value) { - const char *myKey = env->GetStringUTFChars(key, 0); - const char *myValue = env->GetStringUTFChars(value, 0); - - int rc = __system_property_set(myKey, myValue); - if (rc == -1) { - return 0; - } - - return 1; -} \ No newline at end of file diff --git a/Android/app/src/main/cpp/shell.cpp b/Android/app/src/main/cpp/shell.cpp deleted file mode 100644 index 550d9026..00000000 --- a/Android/app/src/main/cpp/shell.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" -JNIEXPORT jstring JNICALL -Java_com_dergoogler_core_NativeShell_getenv(JNIEnv *env, jclass clazz, jstring key) { - const char *name = env->GetStringUTFChars(key, nullptr); - return env->NewStringUTF(getenv(name)); -} - -extern "C" -JNIEXPORT void JNICALL -Java_com_dergoogler_core_NativeShell_setenv(JNIEnv *env, jclass clazz, jstring key, jstring value, - jint override) { - const char *_key = env->GetStringUTFChars(key, nullptr); - const char *_value = env->GetStringUTFChars(value, nullptr); - setenv(_key,_value,(int)override); -} - -extern "C" -JNIEXPORT jint JNICALL -Java_com_dergoogler_core_NativeShell_pw_1uid(JNIEnv *env, jclass clazz) { - struct passwd *p; - if ((p = getpwuid(geteuid())) == nullptr) - return -1; - else { - return (jint) p->pw_uid; - } -} - -extern "C" -JNIEXPORT jint JNICALL -Java_com_dergoogler_core_NativeShell_pw_1gid(JNIEnv *env, jclass clazz) { - struct passwd *p; - if ((p = getpwuid(geteuid())) == nullptr) - return -1; - else { - return (jint) p->pw_gid; - } -} - -extern "C" -JNIEXPORT jstring JNICALL -Java_com_dergoogler_core_NativeShell_pw_1name(JNIEnv *env, jclass clazz) { - struct passwd *p; - if ((p = getpwuid(geteuid())) == nullptr) - return env->NewStringUTF("null"); - else { - return env->NewStringUTF(p->pw_name); - } -} - diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeLog.java b/Android/app/src/main/java/com/dergoogler/core/NativeLog.java index f19eac00..66528c83 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeLog.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeLog.java @@ -1,14 +1,12 @@ package com.dergoogler.core; +import android.util.Log; import android.webkit.JavascriptInterface; public class NativeLog { - - static { - System.loadLibrary("native-log-lib"); - } - @JavascriptInterface - public static native void native_log(int prio, String tag, String msg); + public void native_log(int prio, String tag, String msg) { + Log.println(prio, tag, msg); + } } diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeProperties.java b/Android/app/src/main/java/com/dergoogler/core/NativeProperties.java deleted file mode 100644 index 7e3d195b..00000000 --- a/Android/app/src/main/java/com/dergoogler/core/NativeProperties.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dergoogler.core; - -import android.webkit.JavascriptInterface; - -public class NativeProperties { - - static { - System.loadLibrary("native-properties-lib"); - } - - @JavascriptInterface - public static native String get(String key, String def); - - @JavascriptInterface - public static native int set(String key, String value); -} diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java index 23cad872..a65d841c 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeShell.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeShell.java @@ -18,10 +18,6 @@ public NativeShell(WebView wv) { this.wv = wv; } - static { - System.loadLibrary("native-shell-lib"); - } - @JavascriptInterface public void exec(String command) { Shell.cmd(command).exec(); @@ -53,12 +49,6 @@ public boolean isSuAvailable() { } } - @JavascriptInterface - public static native String getenv(String key); - - @JavascriptInterface - public static native void setenv(String key, String value, int override); - @JavascriptInterface public boolean isAppGrantedRoot() { return Shell.cmd("if grep ' / ' /proc/mounts | grep -q '/dev/root' &> /dev/null; " + diff --git a/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java b/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java index 77790fc9..1864a4ed 100644 --- a/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java +++ b/Android/app/src/main/java/com/dergoogler/core/NativeStorage.java @@ -12,7 +12,7 @@ public class NativeStorage { private final SharedPreferences localStorage; private String localStorageName; - public NativeStorage(@NonNull Context ctx) { + public NativeStorage(Context ctx) { this.localStorage = ctx.getSharedPreferences("localstorage_v2", Activity.MODE_PRIVATE); } diff --git a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java index 970190df..239a7e20 100755 --- a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java +++ b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java @@ -5,7 +5,6 @@ import android.os.Build; import android.os.Bundle; import android.os.StrictMode; -import android.util.Log; import android.webkit.WebSettings; import android.webkit.WebView; @@ -15,17 +14,12 @@ import com.dergoogler.core.NativeSuFile; import com.dergoogler.core.NativeLog; import com.dergoogler.core.NativeOS; -import com.dergoogler.core.NativeProperties; import com.dergoogler.core.NativeStorage; import com.dergoogler.core.NativeShell; import com.dergoogler.core.NativeBuildConfig; import com.dergoogler.core.NativeView; -import com.topjohnwu.superuser.Shell; -import com.topjohnwu.superuser.ShellUtils; import org.apache.cordova.*; -import org.json.JSONException; -import org.json.JSONObject; public class MainActivity extends CordovaActivity { @Override @@ -79,7 +73,6 @@ public void onCreate(Bundle savedInstanceState) { wv.addJavascriptInterface(os, "__os__"); wv.addJavascriptInterface(new NativeView(this, wv), "__view__"); wv.addJavascriptInterface(ns, "__nativeStorage__"); - wv.addJavascriptInterface(new NativeProperties(), "__properties__"); wv.addJavascriptInterface(new NativeLog(), "__log__"); } diff --git a/Website/src/native/Properties.ts b/Website/src/native/Properties.ts index 82f3bcfc..be233383 100644 --- a/Website/src/native/Properties.ts +++ b/Website/src/native/Properties.ts @@ -8,12 +8,12 @@ interface IProperties { class PropertiesClass extends Native { public constructor() { - super(window.__properties__); + super(null as any); } public get(key: string, def: string): string { if (this.isAndroid) { - return this.interface.get(key, def); + return Shell.cmd(`getprop "${key}" "${def}"`).result(); } else { return window.localStorage.getItem(key) || def; } diff --git a/Website/src/native/Shell.ts b/Website/src/native/Shell.ts index 0d3ea955..ed4e3a60 100644 --- a/Website/src/native/Shell.ts +++ b/Website/src/native/Shell.ts @@ -166,41 +166,27 @@ class ShellClass extends Native { return this._mountDetect(/(APD|APatch)/i); } - public getenv(key: string): string { - if (this.isAndroid) { - return this.interface.getenv(key); - } else { - return ""; - } - } - - public setenv(key: string, value: string, override = 1): void { - if (this.isAndroid) { - this.interface.setenv(key, value, override); - } - } - /** * Returns the current user id - * @returns {number} User ID + * @returns {strign} User ID */ - public pw_uid(): number { + public pw_uid(): string { if (this.isAndroid) { - return this.interface.pw_uid(); + return this.interface.result("id -u"); } else { - return -1; + return "Unknown"; } } /** * Returns the current group id - * @returns {number} Group ID + * @returns {string} Group ID */ - public pw_gid(): number { + public pw_gid(): string { if (this.isAndroid) { - return this.interface.pw_gid(); + return this.interface.result("id -g"); } else { - return -1; + return "Unknown"; } } @@ -210,9 +196,9 @@ class ShellClass extends Native { */ public pw_name(): string { if (this.isAndroid) { - return this.interface.pw_name(); + return this.interface.result("id -un"); } else { - return "null"; + return "Unknown"; } } } From 74358895047e9894590ba01503d01f1810e1a9a3 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 18:25:34 +0100 Subject: [PATCH 56/77] improve modconf --- Website/src/activitys/ModConfActivity.tsx | 101 ++++++++++++++---- Website/src/activitys/TerminalActivity.tsx | 9 +- .../src/components/DialogEditTextListItem.tsx | 4 +- Website/src/hooks/useModConf.tsx | 4 + docs/ModConf.md | 33 ++++++ 5 files changed, 128 insertions(+), 23 deletions(-) create mode 100644 docs/ModConf.md diff --git a/Website/src/activitys/ModConfActivity.tsx b/Website/src/activitys/ModConfActivity.tsx index ed5e1fb2..4a8d1514 100644 --- a/Website/src/activitys/ModConfActivity.tsx +++ b/Website/src/activitys/ModConfActivity.tsx @@ -1,4 +1,4 @@ -import { Alert, Box, Divider, List, ListSubheader } from "@mui/material"; +import { Alert, Box, Divider, List, ListSubheader, Stack, Typography } from "@mui/material"; import AvatarGroup from "@mui/material/AvatarGroup"; import Avatar from "@mui/material/Avatar"; import { Toolbar } from "@Components/onsenui/Toolbar"; @@ -9,6 +9,7 @@ import { StyledListItemText } from "@Components/StyledListItemText"; import { Shell } from "@Native/Shell"; import { DialogEditTextListItem } from "@Components/DialogEditTextListItem"; import React from "react"; +import Anchor from "@Components/dapi/Anchor"; interface ModConfSections { sectionText: string; @@ -18,6 +19,7 @@ interface ModConfSections { interface ModConfListItem { confKey: K; text: string; + dialogDesc?: React.ReactNode; /** * Used for the config requirement */ @@ -177,14 +179,68 @@ function ModConfActivity() { }, ], }, + { + sectionText: "Others", + items: [ + { + text: "MMRL Install Tools", + confKey: "MMRLINI", + }, + { + text: "Config working directory", + confKey: "CONFCWD", + }, + { + text: "Config index file", + confKey: "CONFINDEX", + }, + { + text: "Explore install script", + dialogDesc: ( + <> + + Check the{" "} + + documentations + {" "} + for possible workarounds!
{" and can also be used, "} shell supported. +
+ + ), + confKey: "EXPLORE_INSTALL", + }, + { + text: "Local install script", + dialogDesc: ( + <> + + Check the{" "} + + documentations + {" "} + for possible workarounds!
{" can also be used, "} shell supported. +
+ + ), + confKey: "LOCAL_INSTALL", + }, + ], + }, ], [] ); return ( - - + + I am not responsible for anything that may happen to your phone by changing these informations. You do it at your own risk and take the responsibility upon yourself and you are not to blame us or MMRL and its respected developers @@ -202,6 +258,7 @@ function ModConfActivity() { type="text" title={item.text} disabled={item.disabled} + description={item.dialogDesc} initialValue={_modConf[item.confKey]} onSuccess={(value) => { if (value) { @@ -211,22 +268,28 @@ function ModConfActivity() { > - {item.logoText && Array.isArray(item.logoText) ? ( - <> - - {item.logoText.map((logo) => ( - - ))} - - - ) : ( - item.logoText && ( - - ) - )} - [{item.confKey}]: {item.text} - + + {`<${item.confKey}>`} + + {" "} + + {item.logoText && Array.isArray(item.logoText) ? ( + <> + + {item.logoText.map((logo) => ( + + ))} + + + ) : ( + item.logoText && ( + + ) + )} + {item.text} + + + } secondary={_modConf[item.confKey]} /> diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 7557d33a..5d8abfca 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -79,7 +79,9 @@ const TerminalActivity = () => { }; Terminal.exec({ - command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_explore_install_v4`, + command: modConf("EXPLORE_INSTALL", { + URL: path, + }), env: envp_explore, onLine: (line) => { addLine(line); @@ -101,7 +103,10 @@ const TerminalActivity = () => { }; Terminal.exec({ - command: `${modConf("MMRLINI")}/system/usr/share/mmrl/bin/mmrl_local_install_v4`, + command: modConf("LOCAL_INSTALL", { + ZIPFILE: path, + MODID: id, + }), env: envp_local, onLine: (line) => { addLine(line); diff --git a/Website/src/components/DialogEditTextListItem.tsx b/Website/src/components/DialogEditTextListItem.tsx index 1e966998..b290ef81 100644 --- a/Website/src/components/DialogEditTextListItem.tsx +++ b/Website/src/components/DialogEditTextListItem.tsx @@ -17,7 +17,7 @@ export interface DialogEditTextListItemProps extends React.PropsWithChildren { title: string; disabled?: boolean; initialValue: string; - description?: string; + description?: React.ReactNode; type?: React.HTMLInputTypeAttribute; onSuccess: (value: string) => void; InputProps?: Partial; @@ -50,7 +50,7 @@ export const DialogEditTextListItem = (props: DialogEditTextListItemProps) => { {props.children} - + {props.title} {props.description && {props.description}} diff --git a/Website/src/hooks/useModConf.tsx b/Website/src/hooks/useModConf.tsx index f8defc31..8192d684 100644 --- a/Website/src/hooks/useModConf.tsx +++ b/Website/src/hooks/useModConf.tsx @@ -39,6 +39,8 @@ export interface ModConf { // others MMRLINI: string; + EXPLORE_INSTALL: string; + LOCAL_INSTALL: string; CONFCWD: string; CONFINDEX: string; } @@ -79,6 +81,8 @@ export const INITIAL_MOD_CONF: ModConf = { // others MMRLINI: "/mmrl_install_tools", CONFCWD: "/system/usr/share/mmrl/config/", + EXPLORE_INSTALL: "/system/usr/share/mmrl/bin/mmrl_explore_install_v5", + LOCAL_INSTALL: "/system/usr/share/mmrl/bin/mmrl_local_install_v5", CONFINDEX: "/index.jsx", }; diff --git a/docs/ModConf.md b/docs/ModConf.md new file mode 100644 index 00000000..dcb51a68 --- /dev/null +++ b/docs/ModConf.md @@ -0,0 +1,33 @@ +# ModConf + +TODO + +## Workarounds + +Here are some samples to avoid some configs + +## Avoid MMRL Install Tools + +This workaroud is for people who don't wanna install a extra module for installing other modules + +Based on your selected root method + +| Root method | CLI | Busybox | +| ----------- | ---------- | ---------- | +| Magisk | `` | `` | +| KernelSU | `` | `` | +| APatch | `` | `` | + +### Local install script + +```shell + --install-module "" +``` + +> We use magisk as example. KernelSU or APatch is ` module install ""` + +### Explore install script + +```shell +FILE="/data/local/tmp/.zip"; wget "" -O $FILE; --install-module $FILE; +``` From fdca6e0e00dc570cae1c8bfe6c6b2a150d2adcb0 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 18:34:29 +0100 Subject: [PATCH 57/77] wrong place --- Website/src/activitys/TerminalActivity.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 5d8abfca..8f66ef7c 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -81,6 +81,7 @@ const TerminalActivity = () => { Terminal.exec({ command: modConf("EXPLORE_INSTALL", { URL: path, + MODID: id, }), env: envp_explore, onLine: (line) => { @@ -105,7 +106,6 @@ const TerminalActivity = () => { Terminal.exec({ command: modConf("LOCAL_INSTALL", { ZIPFILE: path, - MODID: id, }), env: envp_local, onLine: (line) => { From 4726474dec83b48300b7b80ab0bd681c5605f51e Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 20:01:25 +0100 Subject: [PATCH 58/77] fix debug --- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- .github/workflows/build-debug.yml | 10 +++++----- Android/app/default/release/output-metadata.json | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 57a61e99..48f80353 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,8 +26,8 @@ If applicable, add screenshots to help explain your problem. **Device info(please complete the following information):** - Device: [e.g. iPhone6] - OS: [ROM and version, ie Havoc-OS 4.12] - - App Version [e.g. 22] - - User Agent [e.g. Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36] + - App Version: [e.g. 22] + - User Agent: [e.g. Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36] **Additional context** Add any other context about the problem here. \ No newline at end of file diff --git a/.github/workflows/build-debug.yml b/.github/workflows/build-debug.yml index 6de23fed..99203191 100644 --- a/.github/workflows/build-debug.yml +++ b/.github/workflows/build-debug.yml @@ -76,28 +76,28 @@ jobs: uses: actions/upload-artifact@v3 with: name: MMRL-default-arm64-v8a-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-arm64-v8a-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-arm64-v8a-debug-*-*.apk - name: Upload MMRL-default-armeabi-v7a-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-armeabi-v7a-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-armeabi-v7a-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-armeabi-v7a-debug-*-*.apk - name: Upload MMRL-default-universal-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-universal-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-universal-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-universal-debug-*-*.apk - name: Upload MMRL-default-x86-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-x86-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86-debug-*-*.apk - name: Upload MMRL-default-x86_64-debug uses: actions/upload-artifact@v3 with: name: MMRL-default-x86_64-debug - path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86_64-debug.apk + path: ${{ github.workspace }}/Android/app/build/outputs/apk/default/debug/*-default-x86_64-debug-*-*.apk diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index 5d391330..f0c99032 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -20,26 +20,26 @@ "filters": [ { "filterType": "ABI", - "value": "arm64-v8a" + "value": "x86_64" } ], "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-arm64-v8a-release-2.13.9_alpha-5-2139.apk" + "outputFile": "app-default-x86_64-release-2.13.9_alpha-5-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86" + "value": "arm64-v8a" } ], "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-x86-release-2.13.9_alpha-5-2139.apk" + "outputFile": "app-default-arm64-v8a-release-2.13.9_alpha-5-2139.apk" }, { "type": "ONE_OF_MANY", @@ -59,13 +59,13 @@ "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "x86" } ], "attributes": [], "versionCode": 2139, "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-x86_64-release-2.13.9_alpha-5-2139.apk" + "outputFile": "app-default-x86-release-2.13.9_alpha-5-2139.apk" } ], "elementType": "File" From 00ce8f5b884fe77f2db67575f51a5f2cfeabf6a4 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 27 Jan 2024 20:03:02 +0100 Subject: [PATCH 59/77] prevent build date from multiplying --- Website/src/activitys/AboutActivity.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Website/src/activitys/AboutActivity.tsx b/Website/src/activitys/AboutActivity.tsx index d7284df4..b122ebe5 100644 --- a/Website/src/activitys/AboutActivity.tsx +++ b/Website/src/activitys/AboutActivity.tsx @@ -47,7 +47,8 @@ const AboutActivity = () => { ); }; - const date = useFormatDate(BuildConfig.BUILD_DATE); + // false to ignore multiplying + const date = useFormatDate(BuildConfig.BUILD_DATE, false); type ListRender = { title: string; From b0fff97c89a9bdd81b312f3060ed5bbf15e27b92 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 28 Jan 2024 11:56:26 +0100 Subject: [PATCH 60/77] some wip --- .../app/default/release/output-metadata.json | 20 +- Website/package.json | 2 +- Website/src/activitys/ConfigureActivity.tsx | 8 +- Website/src/activitys/MainApplication.tsx | 10 +- ...vity.tsx => ModConfPlaygroundActivity.tsx} | 8 +- ...{ModConfActivity.tsx => ModFSActivity.tsx} | 34 +-- Website/src/activitys/ModuleViewActivity.tsx | 29 +-- Website/src/activitys/SettingsActivity.tsx | 6 +- Website/src/activitys/TerminalActivity.tsx | 12 +- .../activitys/fragments/DrawerFragment.tsx | 39 ++-- .../src/components/ConfigureView/index.tsx | 6 +- .../src/components/module/DeviceModule.tsx | 6 +- Website/src/hooks/useLocalModules.ts | 8 +- .../hooks/{useModConf.tsx => useModFS.tsx} | 55 ++--- Website/src/index.tsx | 6 +- Website/src/locales/de.json | 98 -------- Website/src/locales/de.ts | 99 ++++++++ Website/src/locales/declaration.ts | 6 +- Website/src/locales/en.json | 100 --------- Website/src/locales/en.ts | 105 +++++++++ Website/src/locales/zh.json | 92 -------- Website/src/locales/zh.ts | 90 ++++++++ docs/ModConf.md | 211 ++++++++++++++++-- docs/ModFS.md | 33 +++ docs/ModuleConfigure.md | 206 ----------------- 25 files changed, 628 insertions(+), 661 deletions(-) rename Website/src/activitys/{ConfigurePlaygroundActivity.tsx => ModConfPlaygroundActivity.tsx} (96%) rename Website/src/activitys/{ModConfActivity.tsx => ModFSActivity.tsx} (90%) rename Website/src/hooks/{useModConf.tsx => useModFS.tsx} (66%) delete mode 100644 Website/src/locales/de.json create mode 100644 Website/src/locales/de.ts delete mode 100644 Website/src/locales/en.json create mode 100644 Website/src/locales/en.ts delete mode 100644 Website/src/locales/zh.json create mode 100644 Website/src/locales/zh.ts create mode 100644 docs/ModFS.md delete mode 100644 docs/ModuleConfigure.md diff --git a/Android/app/default/release/output-metadata.json b/Android/app/default/release/output-metadata.json index f0c99032..e81c6973 100644 --- a/Android/app/default/release/output-metadata.json +++ b/Android/app/default/release/output-metadata.json @@ -12,8 +12,8 @@ "filters": [], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-universal-release-2.13.9_alpha-5-2139.apk" + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-universal-release-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", @@ -25,8 +25,8 @@ ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-x86_64-release-2.13.9_alpha-5-2139.apk" + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-x86_64-release-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", @@ -38,8 +38,8 @@ ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-arm64-v8a-release-2.13.9_alpha-5-2139.apk" + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-arm64-v8a-release-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", @@ -51,8 +51,8 @@ ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-armeabi-v7a-release-2.13.9_alpha-5-2139.apk" + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-armeabi-v7a-release-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", @@ -64,8 +64,8 @@ ], "attributes": [], "versionCode": 2139, - "versionName": "2.13.9_alpha-5", - "outputFile": "app-default-x86-release-2.13.9_alpha-5-2139.apk" + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-x86-release-2.13.9_alpha-6-2139.apk" } ], "elementType": "File" diff --git a/Website/package.json b/Website/package.json index fe754aa9..3fb0ba3d 100644 --- a/Website/package.json +++ b/Website/package.json @@ -5,7 +5,7 @@ "application_id": "com.dergoogler.mmrl", "min_sdk": 26, "target_sdk": 34, - "version_name": "2.13.9_alpha-5", + "version_name": "2.13.9_alpha-6", "version_code": 2139 }, "main": "index.tsx", diff --git a/Website/src/activitys/ConfigureActivity.tsx b/Website/src/activitys/ConfigureActivity.tsx index c8ab092a..41c6110e 100644 --- a/Website/src/activitys/ConfigureActivity.tsx +++ b/Website/src/activitys/ConfigureActivity.tsx @@ -2,8 +2,8 @@ import { useActivity } from "@Hooks/useActivity"; import React from "react"; import { SuFile } from "@Native/SuFile"; import { ConfigureView } from "@Components/ConfigureView"; -import { useModConf } from "@Hooks/useModConf"; -import { PreviewErrorBoundary } from "./ConfigurePlaygroundActivity"; +import { useModFS } from "@Hooks/useModFS"; +import { PreviewErrorBoundary } from "./ModConfPlaygroundActivity"; type Extra = { code?: string; @@ -12,12 +12,12 @@ type Extra = { }; const ConfigureActivity = () => { - const { modConf } = useModConf(); + const { modFS } = useModFS(); const { extra } = useActivity(); const config: string = React.useMemo(() => { if (!extra.code) { - const file = new SuFile(modConf("CONFINDEX", { MODID: extra.moduleid })); + const file = new SuFile(modFS("CONFINDEX", { MODID: extra.moduleid })); if (file.exist()) { return file.read(); diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 521c3e27..971affc6 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -20,7 +20,7 @@ import { useRepos } from "@Hooks/useRepos"; import { SuFile } from "@Native/SuFile"; import { BuildConfig } from "@Native/BuildConfig"; import SearchIcon from "@mui/icons-material/Search"; -import { useModConf } from "@Hooks/useModConf"; +import { useModFS } from "@Hooks/useModFS"; import Fab from "@Components/onsenui/Fab"; import { useLocalModules } from "@Hooks/useLocalModules"; import { Shell } from "@Native/Shell"; @@ -36,7 +36,7 @@ import { ConfigureView } from "@Components/ConfigureView"; const MainApplication = () => { const { strings } = useStrings(); - const { modConf } = useModConf(); + const { modFS } = useModFS(); const { context } = useActivity(); const { modules } = useRepos(); const [index, setIndex] = React.useState(0); @@ -55,8 +55,6 @@ const MainApplication = () => { } }, [modules]); - const hasInstallTools = SuFile.exist(`${modConf("MMRLINI")}/module.prop`); - const renderTabs = (): TabbarRenderTab[] => { return [ { @@ -74,7 +72,7 @@ const MainApplication = () => { modules={localModules} renderItem={(module, key) => } renderFixed={() => { - if (os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools) { + if (os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU())) { return ( { {item.version} - {SuFile.exist(modConf("PROPS", { MODID: item.id })) && } + {SuFile.exist(modFS("PROPS", { MODID: item.id })) && } } diff --git a/Website/src/activitys/ConfigurePlaygroundActivity.tsx b/Website/src/activitys/ModConfPlaygroundActivity.tsx similarity index 96% rename from Website/src/activitys/ConfigurePlaygroundActivity.tsx rename to Website/src/activitys/ModConfPlaygroundActivity.tsx index a8502b2e..1a4476be 100644 --- a/Website/src/activitys/ConfigurePlaygroundActivity.tsx +++ b/Website/src/activitys/ModConfPlaygroundActivity.tsx @@ -11,6 +11,7 @@ import { ErrorBoundaryProps, ErrorBoundaryState, errorBoundaryInitialState } fro import editorTheme from "@Util/editorTheme"; import { ConfigureView } from "@Components/ConfigureView"; import { useNativeStorage } from "@Hooks/useNativeStorage"; +import { useStrings } from "@Hooks/useStrings"; export interface PlaygroundExtra { title: string; @@ -110,8 +111,9 @@ const editorDidMount = (editor: monacoEditor.editor.IStandaloneCodeEditor, monac editor.focus(); }; -const ConfigurePlaygroundActivity = () => { +const ModConfPlaygroundActivity = () => { const { context, extra } = useActivity(); + const { strings } = useStrings(); const [description, setDescription] = useNativeStorage("module-configure-playground", extra.defaultText || ""); const [errBoundKey, setErrBoundKey] = React.useState(0); @@ -138,7 +140,7 @@ const ConfigurePlaygroundActivity = () => { - Module Configure Playground + {strings("modconf_playground")} {!isLargeScreen && } ); @@ -236,4 +238,4 @@ const Preview = styled("div")(({ theme }) => ({ }, })); -export default ConfigurePlaygroundActivity; +export default ModConfPlaygroundActivity; diff --git a/Website/src/activitys/ModConfActivity.tsx b/Website/src/activitys/ModFSActivity.tsx similarity index 90% rename from Website/src/activitys/ModConfActivity.tsx rename to Website/src/activitys/ModFSActivity.tsx index 4a8d1514..8faa5f43 100644 --- a/Website/src/activitys/ModConfActivity.tsx +++ b/Website/src/activitys/ModFSActivity.tsx @@ -4,19 +4,20 @@ import Avatar from "@mui/material/Avatar"; import { Toolbar } from "@Components/onsenui/Toolbar"; import { Page } from "@Components/onsenui/Page"; import { useActivity } from "@Hooks/useActivity"; -import { ModConf, useModConf } from "@Hooks/useModConf"; +import { ModFS, useModFS } from "@Hooks/useModFS"; import { StyledListItemText } from "@Components/StyledListItemText"; import { Shell } from "@Native/Shell"; import { DialogEditTextListItem } from "@Components/DialogEditTextListItem"; import React from "react"; import Anchor from "@Components/dapi/Anchor"; +import { useStrings } from "@Hooks/useStrings"; -interface ModConfSections { +interface ModFSSections { sectionText: string; - items: ModConfListItem[]; + items: ModFSListItem[]; } -interface ModConfListItem { +interface ModFSListItem { confKey: K; text: string; dialogDesc?: React.ReactNode; @@ -27,10 +28,11 @@ interface ModConfListItem { disabled?: boolean; } -function ModConfActivity() { +function ModFSActivity() { const { context } = useActivity(); + const { strings } = useStrings(); - const { _modConf, setModConf } = useModConf(); + const { _modFS, setModFS } = useModFS(); const renderToolbar = () => { return ( @@ -38,12 +40,12 @@ function ModConfActivity() { - ModConf + {strings("modfs")} ); }; - const items: ModConfSections[] = React.useMemo( + const items: ModFSSections[] = React.useMemo( () => [ { sectionText: "Command line interfaces", @@ -203,7 +205,9 @@ function ModConfActivity() { documentations {" "} - for possible workarounds!
{" and can also be used, "} shell supported. + for possible workarounds! +
+ {" and can also be used, "} shell supported. ), @@ -218,7 +222,9 @@ function ModConfActivity() { documentations {" "} - for possible workarounds!
{" can also be used, "} shell supported. + for possible workarounds! +
+ {" can also be used, "} shell supported. ), @@ -259,10 +265,10 @@ function ModConfActivity() { title={item.text} disabled={item.disabled} description={item.dialogDesc} - initialValue={_modConf[item.confKey]} + initialValue={_modFS[item.confKey]} onSuccess={(value) => { if (value) { - setModConf(item.confKey, value); + setModFS(item.confKey, value); } }} > @@ -291,7 +297,7 @@ function ModConfActivity() {
} - secondary={_modConf[item.confKey]} + secondary={_modFS[item.confKey]} /> ))} @@ -304,4 +310,4 @@ function ModConfActivity() { ); } -export default ModConfActivity; +export default ModFSActivity; diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index 4514b711..4867d9ea 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -28,7 +28,6 @@ import { useCategories } from "@Hooks/useCategories"; import { useFormatDate } from "@Hooks/useFormatDate"; import Chip from "@mui/material/Chip"; import CardMedia from "@mui/material/CardMedia"; -import { useSupportIconForUrl } from "@Hooks/useSupportIconForUrl"; import { useLog } from "@Hooks/native/useLog"; import { SuFile } from "@Native/SuFile"; import DescriptonActivity from "./DescriptonActivity"; @@ -43,18 +42,12 @@ import ListItemIcon from "@mui/material/ListItemIcon"; import { Disappear } from "react-disappear"; import Fade from "@mui/material/Fade"; import TelegramIcon from "@mui/icons-material/Telegram"; -import SecurityUpdateGoodIcon from "@mui/icons-material/SecurityUpdateGood"; import VerifiedIcon from "@mui/icons-material/Verified"; import { useRepos } from "@Hooks/useRepos"; import PicturePreviewActivity from "./PicturePreviewActivity"; import GitHubIcon from "@mui/icons-material/GitHub"; -import TerminalIcon from "@mui/icons-material/Terminal"; -import { isLiteralObject } from "@Util/util"; import { useLowQualityModule } from "@Hooks/useLowQualityModule"; -import AvatarGroup from "@mui/material/AvatarGroup"; import FormatAlignLeftIcon from "@mui/icons-material/FormatAlignLeft"; -// import ProfileActivty from "./ProfileActivity"; -import { useModConf } from "@Hooks/useModConf"; import { useConfirm } from "material-ui-confirm"; import InstallMobileIcon from "@mui/icons-material/InstallMobile"; import DownloadIcon from "@mui/icons-material/Download"; @@ -66,18 +59,6 @@ function a11yProps(index: number) { }; } -// function pickFourElements(jsonArray: Array): Array { -// if (jsonArray.length <= 4) { -// // Return the array as is if it contains 4 or fewer elements -// return jsonArray; -// } else { -// // Shuffle the array to randomize the selection -// const shuffledArray = jsonArray.sort(() => Math.random() - 0.5); -// // Return the first four elements of the shuffled array -// return shuffledArray.slice(0, 4); -// } -// } - interface TabPanelProps { children?: React.ReactNode; index: number; @@ -112,9 +93,6 @@ const ModuleViewActivity = () => { const formatLastUpdate = useFormatDate(latestVersion.timestamp); - const { modConf } = useModConf(); - const hasInstallTools = SuFile.exist(`${modConf("MMRLINI")}/module.prop`); - const search = React.useMemo(() => new URLSearchParams(window.location.search), [window.location.search]); const isLowQuality = useLowQualityModule(extra, !settings._low_quality_module); @@ -276,7 +254,7 @@ const ModuleViewActivity = () => { - {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && hasInstallTools && ( + {os.isAndroid && (Shell.isMagiskSU() || Shell.isKernelSU() || Shell.isAPatchSU()) && ( ), @@ -231,6 +258,10 @@ function ModFSActivity() { for more informations!
{""} can also be used, shell supported. +
+ ), diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 6dea2fa0..b8db0cde 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -10,6 +10,7 @@ import { Shell } from "@Native/Shell"; import { useSettings } from "@Hooks/useSettings"; import { BuildConfig } from "@Native/BuildConfig"; import { useModFS } from "@Hooks/useModFS"; +import { INCLUDE_CORE } from "@Util/INCLUDE_CORE"; const TerminalActivity = () => { const { context, extra } = useActivity(); @@ -80,6 +81,7 @@ const TerminalActivity = () => { Terminal.exec({ command: modFS("EXPLORE_INSTALL", { + INCLUDECORE: INCLUDE_CORE, URL: path, MODID: id, }), @@ -105,6 +107,7 @@ const TerminalActivity = () => { Terminal.exec({ command: modFS("LOCAL_INSTALL", { + INCLUDECORE: INCLUDE_CORE, ZIPFILE: path, }), env: envp_local, diff --git a/Website/src/activitys/TextEditorActivity.tsx b/Website/src/activitys/TextEditorActivity.tsx new file mode 100644 index 00000000..e4b45c58 --- /dev/null +++ b/Website/src/activitys/TextEditorActivity.tsx @@ -0,0 +1,86 @@ +import * as React from "react"; +import { Toolbar } from "@Components/onsenui/Toolbar"; +import { Page } from "@Components/onsenui/Page"; +import { ActivityContext, useActivity } from "@Hooks/useActivity"; +import AceEditor from "react-ace"; +import ReactAce from "react-ace/lib/ace"; +import SaveIcon from "@mui/icons-material/Save"; + +export interface TextEditorActivityExtra { + title: string; + initialValue: string; + /** + * @param value Entered code value + * @param context Shared TextEditorActivity context + */ + onSaveClick(value: string, context: ActivityContext): void; + mode?: string | object; +} + +const TextEditorActivity = () => { + const { context, extra } = useActivity(); + const { title, mode, initialValue, onSaveClick } = extra; + + const aceRef = React.useRef(null); + + const [code, setCode] = React.useState(initialValue); + + const handleSaveText = React.useCallback(() => { + if (typeof onSaveClick !== "function") throw new TypeError("onSaveClick is not a function"); + onSaveClick(code, context); + }, [code]); + + React.useEffect(() => { + if (aceRef.current && aceRef.current.refEditor) { + aceRef.current.refEditor.addEventListener( + "contextmenu", + function (event) { + event.returnValue = true; + if (typeof event.stopPropagation === "function") { + event.stopPropagation(); + } + if (typeof event.cancelBubble === "function") { + (event as any).cancelBubble(); + } + }, + true + ); + } + }, []); + + const renderToolbar = () => { + return ( + + + + + {title} + + + + + ); + }; + + return ( + + setCode(_value)} + name="UNIQUE_ID_OF_DIV" + showPrintMargin={false} + fontSize="unset" + editorProps={{ + $blockScrolling: true, + }} + /> + + ); +}; + +export default TextEditorActivity; diff --git a/Website/src/components/ConfigureView/libs.ts b/Website/src/components/ConfigureView/libs.ts index 3dc599eb..0a6d3ea5 100644 --- a/Website/src/components/ConfigureView/libs.ts +++ b/Website/src/components/ConfigureView/libs.ts @@ -19,6 +19,7 @@ import { os } from "@Native/Os"; import { BuildConfig } from "@Native/BuildConfig"; import { useSettings } from "@Hooks/useSettings"; import { useNativeFileStorage } from "@Hooks/useNativeFileStorage"; +import TextEditorActivity from "@Activitys/TextEditorActivity"; export const libraries = [ { @@ -45,6 +46,16 @@ export const libraries = [ name: "flatlist-react", __esModule: require("flatlist-react"), }, + { + name: "onsenui", + __esModule: require("onsenui"), + }, + { + name: "@mmrl/activity", + __esModule: { + TextEditorActivity: TextEditorActivity, + }, + }, { name: "@mmrl/ui", __esModule: { diff --git a/Website/src/components/DialogEditTextListItem.tsx b/Website/src/components/DialogEditTextListItem.tsx index d02eeb3b..5f43b921 100644 --- a/Website/src/components/DialogEditTextListItem.tsx +++ b/Website/src/components/DialogEditTextListItem.tsx @@ -14,7 +14,7 @@ import { CustomTextField } from "./TextField"; export interface DialogEditTextListItemProps extends React.PropsWithChildren { inputLabel: React.ReactNode; - title: string; + title: React.ReactNode; disabled?: boolean; initialValue: string; description?: React.ReactNode; diff --git a/Website/src/hooks/useModFS.tsx b/Website/src/hooks/useModFS.tsx index 460d066b..5488f7e1 100644 --- a/Website/src/hooks/useModFS.tsx +++ b/Website/src/hooks/useModFS.tsx @@ -82,8 +82,8 @@ export const INITIAL_MOD_CONF: ModFS = { // others MMRLINI: "/mmrl_install_tools", CONFCWD: "/system/usr/share/mmrl/config/", - EXPLORE_INSTALL: "/system/usr/share/mmrl/bin/mmrl_explore_install_v5", - LOCAL_INSTALL: "/system/usr/share/mmrl/bin/mmrl_local_install_v5", + EXPLORE_INSTALL: "; FILE=\"/data/local/tmp/$NAME-$RANDOM.zip\"; download_file \"$FILE\"; install_cli \"$ZIPFILE\";", + LOCAL_INSTALL: "; install_cli \"$ZIPFILE\";", CONFINDEX: "/index.jsx", }; diff --git a/Website/src/util/INCLUDE_CORE.ts b/Website/src/util/INCLUDE_CORE.ts new file mode 100644 index 00000000..0f2a2826 --- /dev/null +++ b/Website/src/util/INCLUDE_CORE.ts @@ -0,0 +1,81 @@ +export const INCLUDE_CORE= `GREEN="\\x1b[32m" +RED="\\x1b[31m" +CYAN="\\x1b[96m" +YELLOW="\\x1b[93m" +UNDERLINE="\\x1b[4m" +RESET="\\x1b[0m" + +function ui_info { echo "$GREEN- $RESET$1"; } +function ui_error { echo "RED! $RESET$2"; exit $1; } +function ui_warn { echo "$YELLOW! $RESET$1"; } +function mmrl { echo "#!mmrl:$@"; } + +echo "$GREEN __ _____ _______ __ $RESET" +echo "$GREEN / |/ / |/ / __ \\/ / $RESET" +echo "$GREEN / /|_/ / /|_/ / /_/ / / $RESET" +echo "$GREEN / / / / / / / _, _/ /___$RESET" +echo "$GREEN/_/ /_/_/ /_/_/ |_/_____/$RESET" +echo "" +ui_info "Using version $CYAN$MMRL_VER$RESET" + +ui_info "Initialize BusyBox" +bb() { + case "$ROOTMANAGER" in + "Magisk") + ui_info "Found$CYAN Magisk's$RESET BusyBox" + exec $MSUBSU $@ + ;; + "KernelSU") + ui_info "Found$CYAN KernelSU's$RESET BusyBox" + exec $KSUBSU $@ + ;; + "APatchSU") + ui_info "Found$CYAN APatch's$RESET BusyBox" + exec $ASUBSU $@ + ;; + "Unknown") + ui_error 1 "Unable to find BusyBox" + ;; + *) + ui_error 1 "BusyBox error" + ;; + esac +} + +ui_info "Initialize downloader" +download_file() { + bb wget $URL -O "$1" + if [ $(echo $?) -eq 0 ]; then + ui_info "Successful downloaded $GREEN$NAME$RESET" + if [ "$CLEAR_TERMINAL_AFTER_DL" = "true" ]; then + mmrl clearTerminal + fi + else + ui_error 1 "Something went wrong" + fi +} + +ui_info "Initialize install CLI" +install_cli() { + case "$ROOTMANAGER" in + "Magisk") + ui_info "Found$CYAN Magisk's$RESET CLI" + exec $MSUCLI --install-module "$1" + ;; + "KernelSU") + ui_info "Found$CYAN KernelSU's$RESET CLI" + exec $KSUCLI module install "$1" + ;; + "APatchSU") + ui_info "Found$CYAN APatch's$RESET CLI" + exec $ASUCLI module install "$1" + ;; + "Unknown") + ui_error 1 "Unable to find root manager" + exit 1 + ;; + *) + ui_error 1 "Install error" + ;; + esac +}` \ No newline at end of file From 2cbd3830a28749f7dd0f9d5ebf14b49dae02e72f Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 28 Jan 2024 14:40:55 +0100 Subject: [PATCH 63/77] fix mis config --- Website/src/components/module/UpdateModule.tsx | 1 + Website/src/hooks/useModFS.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Website/src/components/module/UpdateModule.tsx b/Website/src/components/module/UpdateModule.tsx index 51976096..fed03381 100644 --- a/Website/src/components/module/UpdateModule.tsx +++ b/Website/src/components/module/UpdateModule.tsx @@ -108,6 +108,7 @@ const UpdateModule = React.memo((props) => { component: TerminalActivity, key: "TerminalActivity", extra: { + id: id, exploreInstall: true, path: updatedModule?.zipUrl, }, diff --git a/Website/src/hooks/useModFS.tsx b/Website/src/hooks/useModFS.tsx index 5488f7e1..137cdd0c 100644 --- a/Website/src/hooks/useModFS.tsx +++ b/Website/src/hooks/useModFS.tsx @@ -82,7 +82,7 @@ export const INITIAL_MOD_CONF: ModFS = { // others MMRLINI: "/mmrl_install_tools", CONFCWD: "/system/usr/share/mmrl/config/", - EXPLORE_INSTALL: "; FILE=\"/data/local/tmp/$NAME-$RANDOM.zip\"; download_file \"$FILE\"; install_cli \"$ZIPFILE\";", + EXPLORE_INSTALL: "; FILE=\"/data/local/tmp/$NAME-$RANDOM.zip\"; download_file \"$FILE\"; install_cli \"$FILE\";", LOCAL_INSTALL: "; install_cli \"$ZIPFILE\";", CONFINDEX: "/index.jsx", }; From 607a6fe146dc5a540e83948faa1bf2b4a7ce77d4 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sun, 28 Jan 2024 19:06:30 +0100 Subject: [PATCH 64/77] update terminal --- .../com/dergoogler/plugin/TerminalPlugin.java | 8 +++- Website/src/activitys/TerminalActivity.tsx | 2 + Website/src/hooks/useModFS.tsx | 4 +- Website/src/typings/global.d.ts | 46 +++++++++---------- Website/src/util/INCLUDE_CORE.ts | 8 +--- .../com.dergoogler.plugin/www/terminal.js | 3 +- 6 files changed, 37 insertions(+), 34 deletions(-) diff --git a/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java b/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java index 40818140..081257e4 100644 --- a/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java +++ b/Android/app/src/main/java/com/dergoogler/plugin/TerminalPlugin.java @@ -2,6 +2,8 @@ import android.util.Log; +import com.topjohnwu.superuser.io.SuFile; + import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.PluginResult; @@ -28,13 +30,14 @@ public boolean execute(String action, JSONArray data, CallbackContext callbackCo case "exec": String cmd = data.getString(0); JSONObject envp = data.getJSONObject(1); + String cwd = data.getString(2); this.terminalCallbackContext = callbackContext; String[] commands = {"su", "-p", "-c", cmd}; cordova.getThreadPool().execute(() -> { try { - run(envp, commands); + run(envp, cwd, commands); callbackContext.error(1); } catch (IOException | JSONException e) { callbackContext.error(0); @@ -53,12 +56,13 @@ public boolean execute(String action, JSONArray data, CallbackContext callbackCo } - public void run(JSONObject envp, String... command) throws IOException, JSONException { + public void run(JSONObject envp, String cwd, String... command) throws IOException, JSONException { ProcessBuilder pb = new ProcessBuilder(command).redirectErrorStream(true); if (envp != null) { Map m = pb.environment(); m.putAll(toMap(envp)); } + pb.directory(new SuFile(cwd)); Process process = pb.start(); try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()))) { while (true) { diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index b8db0cde..1769c6a2 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -85,6 +85,7 @@ const TerminalActivity = () => { URL: path, MODID: id, }), + cwd: "/data/local/tmp", env: envp_explore, onLine: (line) => { addLine(line); @@ -111,6 +112,7 @@ const TerminalActivity = () => { ZIPFILE: path, }), env: envp_local, + cwd: "/data/local/tmp", onLine: (line) => { addLine(line); }, diff --git a/Website/src/hooks/useModFS.tsx b/Website/src/hooks/useModFS.tsx index 137cdd0c..c51343c4 100644 --- a/Website/src/hooks/useModFS.tsx +++ b/Website/src/hooks/useModFS.tsx @@ -82,8 +82,8 @@ export const INITIAL_MOD_CONF: ModFS = { // others MMRLINI: "/mmrl_install_tools", CONFCWD: "/system/usr/share/mmrl/config/", - EXPLORE_INSTALL: "; FILE=\"/data/local/tmp/$NAME-$RANDOM.zip\"; download_file \"$FILE\"; install_cli \"$FILE\";", - LOCAL_INSTALL: "; install_cli \"$ZIPFILE\";", + EXPLORE_INSTALL: "; mmrl_exec clearTerminal && bb wget -O $NAME.zip $URL -nc && install_cli \"$NAME.zip\"", + LOCAL_INSTALL: "; mmrl_exec clearTerminal && install_cli \"$ZIPFILE\";", CONFINDEX: "/index.jsx", }; diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index adcd712c..22c306ea 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -89,7 +89,8 @@ declare global { namespace Terminal { export type Exec = { command: string; - env: Record; + env?: Record; + cwd?: string; onLine: (line: string) => void; onExit: (code: number) => void; }; @@ -166,7 +167,7 @@ declare global { /** * Local modules only */ - __mmrl__local__module__?: boolean + __mmrl__local__module__?: boolean; } export interface Track { @@ -218,28 +219,27 @@ declare global { } export interface LicenseSPX { - isDeprecatedLicenseId: boolean - isFsfLibre: boolean - licenseText: string - standardLicenseTemplate: string - name: string - licenseId: string - crossRef: CrossRef[] - seeAlso: string[] - isOsiApproved: boolean - licenseTextHtml: string - } - + isDeprecatedLicenseId: boolean; + isFsfLibre: boolean; + licenseText: string; + standardLicenseTemplate: string; + name: string; + licenseId: string; + crossRef: CrossRef[]; + seeAlso: string[]; + isOsiApproved: boolean; + licenseTextHtml: string; + } + export interface CrossRef { - match: string - url: string - isValid: boolean - isLive: boolean - timestamp: string - isWayBackLink: boolean - order: number - } - + match: string; + url: string; + isValid: boolean; + isLive: boolean; + timestamp: string; + isWayBackLink: boolean; + order: number; + } // OnsenUI Types /** diff --git a/Website/src/util/INCLUDE_CORE.ts b/Website/src/util/INCLUDE_CORE.ts index 0f2a2826..b394582b 100644 --- a/Website/src/util/INCLUDE_CORE.ts +++ b/Website/src/util/INCLUDE_CORE.ts @@ -7,8 +7,8 @@ RESET="\\x1b[0m" function ui_info { echo "$GREEN- $RESET$1"; } function ui_error { echo "RED! $RESET$2"; exit $1; } -function ui_warn { echo "$YELLOW! $RESET$1"; } -function mmrl { echo "#!mmrl:$@"; } +function ui_warn { echo "$YELLOW? $RESET$1"; } +function mmrl_exec { echo "#!mmrl:$@"; } echo "$GREEN __ _____ _______ __ $RESET" echo "$GREEN / |/ / |/ / __ \\/ / $RESET" @@ -47,9 +47,6 @@ download_file() { bb wget $URL -O "$1" if [ $(echo $?) -eq 0 ]; then ui_info "Successful downloaded $GREEN$NAME$RESET" - if [ "$CLEAR_TERMINAL_AFTER_DL" = "true" ]; then - mmrl clearTerminal - fi else ui_error 1 "Something went wrong" fi @@ -72,7 +69,6 @@ install_cli() { ;; "Unknown") ui_error 1 "Unable to find root manager" - exit 1 ;; *) ui_error 1 "Install error" diff --git a/www/plugins/com.dergoogler.plugin/www/terminal.js b/www/plugins/com.dergoogler.plugin/www/terminal.js index 4ab071c4..a62ea9d6 100644 --- a/www/plugins/com.dergoogler.plugin/www/terminal.js +++ b/www/plugins/com.dergoogler.plugin/www/terminal.js @@ -7,7 +7,8 @@ cordova.define( exec: function (opt) { exec(opt.onLine, opt.onExit, "Terminal", "exec", [ opt.command, - opt.env, + opt.env || { HOME: "/" }, + opt.cwd || "/", ]); }, test: function (msg, successCallback, errorCallback) { From e7b42a0e10a0ed97d25ff856476f14e04afcd34e Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:51:27 +0100 Subject: [PATCH 65/77] . --- .../app/default/debug/output-metadata.json | 36 +++++++++---------- .../com/dergoogler/mmrl/MainActivity.java | 3 -- Website/src/activitys/TerminalActivity.tsx | 3 +- Website/src/hooks/useModFS.tsx | 4 +-- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/Android/app/default/debug/output-metadata.json b/Android/app/default/debug/output-metadata.json index fd7848eb..e64c0490 100644 --- a/Android/app/default/debug/output-metadata.json +++ b/Android/app/default/debug/output-metadata.json @@ -11,35 +11,35 @@ "type": "UNIVERSAL", "filters": [], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-universal-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-universal-debug-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "armeabi-v7a" + "value": "x86_64" } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-armeabi-v7a-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-x86_64-debug-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86" + "value": "armeabi-v7a" } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-x86-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-armeabi-v7a-debug-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", @@ -50,22 +50,22 @@ } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-arm64-v8a-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-arm64-v8a-debug-2.13.9_alpha-6-2139.apk" }, { "type": "ONE_OF_MANY", "filters": [ { "filterType": "ABI", - "value": "x86_64" + "value": "x86" } ], "attributes": [], - "versionCode": 171, - "versionName": "1.7.1", - "outputFile": "app-default-x86_64-debug.apk" + "versionCode": 2139, + "versionName": "2.13.9_alpha-6", + "outputFile": "app-default-x86-debug-2.13.9_alpha-6-2139.apk" } ], "elementType": "File" diff --git a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java index 239a7e20..769cc611 100755 --- a/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java +++ b/Android/app/src/main/java/com/dergoogler/mmrl/MainActivity.java @@ -84,9 +84,6 @@ private String mmrlUserAgent() { private void applyTheme(WebView wv, NativeStorage ns, NativeOS os) { String defColor = "#ce93d8"; String bg = ns.getItem("background_color", defColor); - String sbg = ns.getItem("statusbar_color", defColor); - os.setStatusBarColor(sbg.replace("\"", ""),false); - os.setNavigationBarColor(bg.replace("\"", "")); wv.setBackgroundColor(Color.parseColor(bg.replace("\"", ""))); } diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 1769c6a2..0be4c3f1 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -11,6 +11,7 @@ import { useSettings } from "@Hooks/useSettings"; import { BuildConfig } from "@Native/BuildConfig"; import { useModFS } from "@Hooks/useModFS"; import { INCLUDE_CORE } from "@Util/INCLUDE_CORE"; +import { view } from "@Native/View"; const TerminalActivity = () => { const { context, extra } = useActivity(); @@ -171,7 +172,7 @@ const TerminalActivity = () => { ))}
-
+
); }; diff --git a/Website/src/hooks/useModFS.tsx b/Website/src/hooks/useModFS.tsx index c51343c4..0fc4f219 100644 --- a/Website/src/hooks/useModFS.tsx +++ b/Website/src/hooks/useModFS.tsx @@ -82,8 +82,8 @@ export const INITIAL_MOD_CONF: ModFS = { // others MMRLINI: "/mmrl_install_tools", CONFCWD: "/system/usr/share/mmrl/config/", - EXPLORE_INSTALL: "; mmrl_exec clearTerminal && bb wget -O $NAME.zip $URL -nc && install_cli \"$NAME.zip\"", - LOCAL_INSTALL: "; mmrl_exec clearTerminal && install_cli \"$ZIPFILE\";", + EXPLORE_INSTALL: "; bb wget -O $NAME.zip $URL -nc && install_cli \"$NAME.zip\"", + LOCAL_INSTALL: "; install_cli \"$ZIPFILE\";", CONFINDEX: "/index.jsx", }; From 086de647f3a572f61c2cc3376a37a5458bb6f769 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:16:20 +0100 Subject: [PATCH 66/77] dising change --- Android/app/src/main/res/values/styles.xml | 2 +- Website/src/activitys/DescriptonActivity.tsx | 2 +- Website/src/activitys/MainApplication.tsx | 4 +- Website/src/activitys/ModFSActivity.tsx | 31 ------- Website/src/activitys/ModuleViewActivity.tsx | 24 ++++-- .../src/activitys/PicturePreviewActivity.tsx | 6 +- Website/src/activitys/SettingsActivity.tsx | 4 +- Website/src/activitys/TerminalActivity.tsx | 1 - Website/src/activitys/TextEditorActivity.tsx | 86 ------------------- Website/src/components/Android12Switch.tsx | 14 +-- Website/src/components/ConfigureView/libs.ts | 5 +- .../components/Markdown/StyledMarkdown.tsx | 20 +++-- Website/src/components/dapi/Anchor.tsx | 25 +++--- Website/src/components/dapi/Image.tsx | 1 + .../src/components/module/DeviceModule.tsx | 12 +-- .../src/components/module/ExploreModule.tsx | 16 ++-- .../src/components/module/UpdateModule.tsx | 2 +- Website/src/hooks/useTheme.tsx | 79 +++++++---------- Website/src/styles/light_theme.tsx | 11 ++- Website/src/typings/global.d.ts | 9 ++ 20 files changed, 122 insertions(+), 232 deletions(-) delete mode 100644 Website/src/activitys/TextEditorActivity.tsx diff --git a/Android/app/src/main/res/values/styles.xml b/Android/app/src/main/res/values/styles.xml index 876d04ba..4e58a5d9 100755 --- a/Android/app/src/main/res/values/styles.xml +++ b/Android/app/src/main/res/values/styles.xml @@ -5,6 +5,6 @@ false @android:color/transparent @android:color/transparent - true + false diff --git a/Website/src/activitys/DescriptonActivity.tsx b/Website/src/activitys/DescriptonActivity.tsx index 733472d9..9f3ecf10 100644 --- a/Website/src/activitys/DescriptonActivity.tsx +++ b/Website/src/activitys/DescriptonActivity.tsx @@ -40,7 +40,7 @@ function DescriptonActivity() { ({ - bgcolor: theme.palette.primary.light, + bgcolor: theme.palette.primary.dark, width: 40, height: 40, boxShadow: "0 -1px 5px rgba(0,0,0,.09), 0 3px 5px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.3), 0 1px 3px rgba(0,0,0,.15)", diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 971affc6..5ea386d9 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -169,7 +169,7 @@ const MainApplication = () => { ({ - bgcolor: theme.palette.primary.light, + bgcolor: theme.palette.primary.dark, boxShadow: "0 -1px 5px rgba(0,0,0,.09), 0 3px 5px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.3), 0 1px 3px rgba(0,0,0,.15)", borderRadius: "20%", mr: 1.5, @@ -204,7 +204,7 @@ const MainApplication = () => { const renderToolbar = () => { return ( - + diff --git a/Website/src/activitys/ModFSActivity.tsx b/Website/src/activitys/ModFSActivity.tsx index 78e41fdc..7777147c 100644 --- a/Website/src/activitys/ModFSActivity.tsx +++ b/Website/src/activitys/ModFSActivity.tsx @@ -11,7 +11,6 @@ import { DialogEditTextListItem } from "@Components/DialogEditTextListItem"; import React from "react"; import Anchor from "@Components/dapi/Anchor"; import { useStrings } from "@Hooks/useStrings"; -import TextEditorActivity, { TextEditorActivityExtra } from "./TextEditorActivity"; interface ModFSSections { sectionText: string; @@ -48,28 +47,6 @@ function ModFSActivity() { ); }; - const openInEditor = React.useCallback<(key: K) => () => void>( - (key) => { - return () => { - context.pushPage({ - component: TextEditorActivity, - key: "any", - extra: { - title: "Shell script editor", - initialValue: _modFS[key], - onSaveClick(_value, _context) { - if (_value) { - setModFS(key, _value); - _context.popPage(); - } - }, - }, - }); - }; - }, - [_modFS] - ); - const items: ModFSSections[] = React.useMemo( () => [ { @@ -235,10 +212,6 @@ function ModFSActivity() { for more informations!
{""} and {""} can also be used, shell supported. -
- ), @@ -258,10 +231,6 @@ function ModFSActivity() { for more informations!
{""} can also be used, shell supported. -
- ), diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index 4867d9ea..7f18850b 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -14,7 +14,7 @@ import Card from "@mui/material/Card"; import CardContent from "@mui/material/CardContent"; import ImageList from "@mui/material/ImageList"; import ImageListItem from "@mui/material/ImageListItem"; -import ListSubheader from "@mui/material/ListSubheader"; +import { Verified } from "@mui/icons-material"; import Stack from "@mui/material/Stack"; import { useActivity } from "@Hooks/useActivity"; import { StyledListItemText } from "@Components/StyledListItemText"; @@ -51,6 +51,7 @@ import FormatAlignLeftIcon from "@mui/icons-material/FormatAlignLeft"; import { useConfirm } from "material-ui-confirm"; import InstallMobileIcon from "@mui/icons-material/InstallMobile"; import DownloadIcon from "@mui/icons-material/Download"; +import Tooltip from "@mui/material/Tooltip"; function a11yProps(index: number) { return { @@ -155,14 +156,14 @@ const ModuleViewActivity = () => { sx={{ position: "relative", zIndex: 9, - backgroundColor: theme.palette.primary.main, + backgroundColor: theme.palette.background.default, color: "white", }} > {track.cover && ( ({ - background: `linear-gradient(to top,${theme.palette.primary.main} 0,rgba(0,0,0,0) 56%)`, + background: `linear-gradient(to top,${theme.palette.background.default} 0,rgba(0,0,0,0) 56%)`, })} > { pl: 2, pr: 2, pb: 2, - backgroundColor: theme.palette.primary.main, + backgroundColor: theme.palette.background.default, color: "white", display: "flex", flexDirection: "column", @@ -205,7 +206,7 @@ const ModuleViewActivity = () => { ({ - bgcolor: theme.palette.primary.light, + bgcolor: theme.palette.primary.dark, width: 100, height: 100, boxShadow: "0 -1px 5px rgba(0,0,0,.09), 0 3px 5px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.3), 0 1px 3px rgba(0,0,0,.15)", @@ -219,9 +220,16 @@ const ModuleViewActivity = () => { - setIsNameVisible(!visible)}> - {name} - + + setIsNameVisible(!visible)}> + {name} + + {track.verified && ( + + + + )} + {author} diff --git a/Website/src/activitys/PicturePreviewActivity.tsx b/Website/src/activitys/PicturePreviewActivity.tsx index 02244e56..71a6d596 100644 --- a/Website/src/activitys/PicturePreviewActivity.tsx +++ b/Website/src/activitys/PicturePreviewActivity.tsx @@ -19,11 +19,7 @@ const PicturePreviewActivity = () => { }; return ( - + ({ bgcolor: theme.palette.background.default })}>{strings("appearance")}} > - + {/* )} - + */} diff --git a/Website/src/activitys/TerminalActivity.tsx b/Website/src/activitys/TerminalActivity.tsx index 0be4c3f1..b1f5e344 100644 --- a/Website/src/activitys/TerminalActivity.tsx +++ b/Website/src/activitys/TerminalActivity.tsx @@ -145,7 +145,6 @@ const TerminalActivity = () => { onShow={install} modifier="noshadow" renderToolbar={renderToolbar} - backgroundStyle="#000000" >
{ - const { context, extra } = useActivity(); - const { title, mode, initialValue, onSaveClick } = extra; - - const aceRef = React.useRef(null); - - const [code, setCode] = React.useState(initialValue); - - const handleSaveText = React.useCallback(() => { - if (typeof onSaveClick !== "function") throw new TypeError("onSaveClick is not a function"); - onSaveClick(code, context); - }, [code]); - - React.useEffect(() => { - if (aceRef.current && aceRef.current.refEditor) { - aceRef.current.refEditor.addEventListener( - "contextmenu", - function (event) { - event.returnValue = true; - if (typeof event.stopPropagation === "function") { - event.stopPropagation(); - } - if (typeof event.cancelBubble === "function") { - (event as any).cancelBubble(); - } - }, - true - ); - } - }, []); - - const renderToolbar = () => { - return ( - - - - - {title} - - - - - ); - }; - - return ( - - setCode(_value)} - name="UNIQUE_ID_OF_DIV" - showPrintMargin={false} - fontSize="unset" - editorProps={{ - $blockScrolling: true, - }} - /> - - ); -}; - -export default TextEditorActivity; diff --git a/Website/src/components/Android12Switch.tsx b/Website/src/components/Android12Switch.tsx index 9315e5fd..c8cb2e84 100644 --- a/Website/src/components/Android12Switch.tsx +++ b/Website/src/components/Android12Switch.tsx @@ -6,14 +6,18 @@ export const Android12Switch = styled(Switch)(() => { const { scheme, theme } = useTheme(); return { + "& .MuiSwitch-switchBase": { + color: theme.palette.background.default, + }, "& .MuiSwitch-switchBase.Mui-checked": { - color: scheme[500], - "&:hover": { - backgroundColor: alpha(scheme[500], theme.palette.action.hoverOpacity), - }, + color: theme.palette.background.default, }, "& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track": { - backgroundColor: scheme[500], + opacity: "unset", + backgroundColor: theme.palette.primary.main, + }, + "& .MuiSwitch-switchBase + .MuiSwitch-track": { + backgroundColor: theme.palette.text.secondary, }, padding: 8, diff --git a/Website/src/components/ConfigureView/libs.ts b/Website/src/components/ConfigureView/libs.ts index 0a6d3ea5..6c31a5ae 100644 --- a/Website/src/components/ConfigureView/libs.ts +++ b/Website/src/components/ConfigureView/libs.ts @@ -19,7 +19,6 @@ import { os } from "@Native/Os"; import { BuildConfig } from "@Native/BuildConfig"; import { useSettings } from "@Hooks/useSettings"; import { useNativeFileStorage } from "@Hooks/useNativeFileStorage"; -import TextEditorActivity from "@Activitys/TextEditorActivity"; export const libraries = [ { @@ -52,9 +51,7 @@ export const libraries = [ }, { name: "@mmrl/activity", - __esModule: { - TextEditorActivity: TextEditorActivity, - }, + __esModule: {}, }, { name: "@mmrl/ui", diff --git a/Website/src/components/Markdown/StyledMarkdown.tsx b/Website/src/components/Markdown/StyledMarkdown.tsx index aceb30bc..8603abf5 100644 --- a/Website/src/components/Markdown/StyledMarkdown.tsx +++ b/Website/src/components/Markdown/StyledMarkdown.tsx @@ -154,7 +154,7 @@ export const StyledMarkdown = styled("article")(() => { backgroundColor: theme.palette.background.default, borderTop: `thin solid ${theme.palette.divider}`, "&:nth-child(2n)": { - backgroundColor: settings.darkmode ? shade(scheme[900], -85) : "#f6f8fa", + backgroundColor: theme.palette.background.paper, }, }, img: { backgroundColor: "transparent" }, @@ -215,8 +215,8 @@ export const StyledMarkdown = styled("article")(() => { blockquote: { margin: "0", padding: "0 1em", - color: settings.darkmode ? shade(scheme[200], -9.2) : "#57606a", - borderLeft: `0.25em solid ${settings.darkmode ? shade(scheme[200], -9.2) : "#57606a"}`, + color: theme.palette.text.secondary, + borderLeft: `5px solid ${theme.palette.text.secondary}`, }, ul: { marginTop: "0", @@ -261,7 +261,8 @@ export const StyledMarkdown = styled("article")(() => { padding: "16px", overflow: "auto", lineHeight: 1.45, - backgroundColor: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, borderRadius: theme.shape.borderRadius, "code,\n tt": { display: "inline", @@ -448,8 +449,8 @@ export const StyledMarkdown = styled("article")(() => { padding: "0.2em 0.4em", margin: "0", fontSize: "85%", - color: "#cdd9e5", - backgroundColor: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, borderRadius: "6px", }, "code br,\n tt br": { display: "none" }, @@ -463,7 +464,8 @@ export const StyledMarkdown = styled("article")(() => { overflow: "auto", fontSize: "85%", lineHeight: 1.45, - backgroundColor: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, borderRadius: "6px", }, }, @@ -529,8 +531,8 @@ export const StyledMarkdown = styled("article")(() => { display: "block", overflowX: "auto", padding: "0.5em", - color: "#cdd9e5", - background: "#22272e", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.paper, }, ".hljs-comment,\n.hljs-punctuation": { color: "#768390" }, ".hljs-attr,\n.hljs-attribute,\n.hljs-meta,\n.hljs-selector-attr,\n.hljs-selector-class,\n.hljs-selector-id": { diff --git a/Website/src/components/dapi/Anchor.tsx b/Website/src/components/dapi/Anchor.tsx index 426bc1e9..b5477641 100644 --- a/Website/src/components/dapi/Anchor.tsx +++ b/Website/src/components/dapi/Anchor.tsx @@ -19,17 +19,15 @@ interface AnchorProps { module?: string; } -const StyledAnchor = styled("div")(({ theme }) => { +const StyledAnchor = styled("div")(({ theme }: { theme: MMRLTheme }) => { const { scheme } = useTheme(); const { settings } = useSettings(); const s = { cursor: "pointer", - color: settings.darkmode ? scheme[200] : scheme[700], - // color: !settings.darkmode ? "rgb(66, 66, 66)" : scheme[700], + color: theme.palette.text.link, display: "flex", alignItems: "center", - ":hover": { textDecoration: "underline", }, @@ -45,21 +43,18 @@ const StyledAnchor = styled("div")(({ theme }) => { function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { const { href, children, noIcon, module, color } = props; - const { theme, scheme } = useTheme(); - const { settings } = useSettings(); + const { theme } = useTheme(); const { modules } = useRepos(); const { context } = useActivity(); - const _color = !color ? (settings.darkmode ? scheme[200] : scheme[700]) : color; - const s = React.useMemo( () => ({ cursor: "pointer", - color: _color, + color: theme.palette.text.link, display: "flex", alignItems: "center", ":hover": { - textDecorationColor: _color, + textDecorationColor: theme.palette.text.link, textDecoration: "underline", }, }), @@ -96,20 +91,20 @@ function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { os.open(__href, { target: "_blank", features: { - color: theme.palette.primary.main, + color: theme.palette.background.default, }, }); } } }} - color={_color} + color={theme.palette.text.link} > {children} @@ -118,8 +113,8 @@ function Anchor(props: JSX.IntrinsicElements["a"] & AnchorProps) { component={Icon} icon={!(module && findModule) ? LaunchRoundedIcon : ExtensionIcon} sx={{ - color: _color, - fill: _color, + color: theme.palette.text.link, + fill: theme.palette.text.link, fontSize: "unset", }} /> diff --git a/Website/src/components/dapi/Image.tsx b/Website/src/components/dapi/Image.tsx index 4579920d..ef440d34 100644 --- a/Website/src/components/dapi/Image.tsx +++ b/Website/src/components/dapi/Image.tsx @@ -24,6 +24,7 @@ function Image(props: Props) { cursor: !noOpen ? "pointer" : "unset", }, borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider} !important`, boxShadow: theme.shadows[shadow || 0], }} src={src} diff --git a/Website/src/components/module/DeviceModule.tsx b/Website/src/components/module/DeviceModule.tsx index dfe7b2d1..cf09ae23 100644 --- a/Website/src/components/module/DeviceModule.tsx +++ b/Website/src/components/module/DeviceModule.tsx @@ -88,7 +88,7 @@ const DeviceModule = React.memo((props) => { {name} - + {version} ({versionCode}) / {author} @@ -128,7 +128,7 @@ const DeviceModule = React.memo((props) => { /> - + {description} @@ -141,10 +141,10 @@ const DeviceModule = React.memo((props) => { overflowY: "auto", }} > - {post_service && } - {late_service && } - {post_mount && } - {boot_complete && } + {post_service && } + {late_service && } + {post_mount && } + {boot_complete && } diff --git a/Website/src/components/module/ExploreModule.tsx b/Website/src/components/module/ExploreModule.tsx index 6456392b..46adf029 100644 --- a/Website/src/components/module/ExploreModule.tsx +++ b/Website/src/components/module/ExploreModule.tsx @@ -16,7 +16,7 @@ import { useActivity } from "@Hooks/useActivity"; import Tooltip from "@mui/material/Tooltip"; import { useStrings } from "@Hooks/useStrings"; import { GestureDetector } from "@Components/onsenui/GestureDetector"; -import { useSettings } from "@Hooks/useSettings"; +import { useTheme } from "@Hooks/useTheme"; interface Props { module: Module; @@ -27,6 +27,7 @@ const ExploreModule = React.memo((props) => { const { context } = useActivity(); const { strings } = useStrings(); + const { theme } = useTheme(); const formatLastUpdate = useFormatDate(timestamp ? timestamp : versions[versions.length - 1].timestamp); @@ -71,22 +72,27 @@ const ExploreModule = React.memo((props) => { {name} {track.verified && ( - + )} - + {version} ({versionCode}) / {author} - + {description} - + diff --git a/Website/src/components/module/UpdateModule.tsx b/Website/src/components/module/UpdateModule.tsx index fed03381..8a8c2b4a 100644 --- a/Website/src/components/module/UpdateModule.tsx +++ b/Website/src/components/module/UpdateModule.tsx @@ -72,7 +72,7 @@ const UpdateModule = React.memo((props) => { {name} - {author} + {author} diff --git a/Website/src/hooks/useTheme.tsx b/Website/src/hooks/useTheme.tsx index 579ad80d..542d0c02 100644 --- a/Website/src/hooks/useTheme.tsx +++ b/Website/src/hooks/useTheme.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { useTheme as useMom, createTheme, ThemeProvider as MumProvider } from "@mui/material"; +import { useTheme as useMom, createTheme, ThemeProvider as MumProvider, Theme } from "@mui/material"; import useShadeColor from "./useShadeColor"; import { colors, useSettings } from "./useSettings"; import { os } from "@Native/Os"; @@ -11,7 +11,7 @@ export const useTheme = () => { return { scheme: colors[settings.accent_scheme.value], - theme: theme, + theme: theme as MMRLTheme, shade: (color: string, percent: number) => { // Ignore shading if monet is enabled. if (settings.accent_scheme.value === "monet") { @@ -49,55 +49,40 @@ export const ThemeProvider = (props: React.PropsWithChildren) => { const [, setBackgroundColor] = useNativeStorage("background_color", colors[settings.accent_scheme.value][200]); const [, setStatusBarColor] = useNativeStorage("statusbar_color", colors[settings.accent_scheme.value][500]); - const theme = React.useMemo(() => { + const theme = React.useMemo(() => { const THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP = createTheme({ + components: { + MuiCard: { + defaultProps: { + elevation: 0, + }, + }, + }, shape: { borderRadius: 8, }, - palette: !settings.darkmode - ? { - mode: "light", - primary: { - light: colors[settings.accent_scheme.value][300], - main: colors[settings.accent_scheme.value][500], - dark: colors[settings.accent_scheme.value][700], - - // light: colors[settings.accent_scheme.value][300], - // main: colors[settings.accent_scheme.value][900], - // dark: colors[settings.accent_scheme.value][800], - }, - background: { - default: colors[settings.accent_scheme.value][200], - paper: shade(colors[settings.accent_scheme.value][200], 14.5 * 2), - }, - divider: colors[settings.accent_scheme.value][300], - secondary: { - main: colors[settings.accent_scheme.value][600], - }, - } - : { - mode: "dark", - primary: { - main: shade(colors[settings.accent_scheme.value][200], settings.shade_value), - light: shade(colors[settings.accent_scheme.value][100], settings.shade_value), - dark: shade(colors[settings.accent_scheme.value][400], settings.shade_value), - // light: shade(colors[settings.accent_scheme.value][300], -10), - // main: shade(colors[settings.accent_scheme.value][500], -29), - }, - background: { - paper: shade(colors[settings.accent_scheme.value][600], settings.shade_value), - default: shade(colors[settings.accent_scheme.value][700], settings.shade_value), - }, - text: { - primary: "#f9f9f9", - secondary: "#b7b7b7" - }, - divider: shade(colors[settings.accent_scheme.value][900], settings.shade_value), - secondary: { - main: colors[settings.accent_scheme.value][600], - }, - }, - }); + palette: { + mode: "dark", + primary: { + main: "#ffffff", + dark: "#353535", + }, + secondary: { + main: "#ffffff", + dark: "#0a0a0a", + }, + background: { + paper: "#181818", + default: "#101010", + }, + text: { + link: "#0095F6", + primary: "#f3f5f7", + secondary: "#777777", + }, + divider: "#333638", + }, + } as MMRLTheme); setBackgroundColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.background.default); setStatusBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.primary.main); diff --git a/Website/src/styles/light_theme.tsx b/Website/src/styles/light_theme.tsx index 8513815e..6b8f41a2 100644 --- a/Website/src/styles/light_theme.tsx +++ b/Website/src/styles/light_theme.tsx @@ -12,6 +12,11 @@ export const LightTheme = () => { return ( ({ + // eruda tools + "eruda-dev-tools": { + paddingBottom: `${view.getWindowBottomInsets()}px !important`, + }, + html: { height: "100%", width: "100%", @@ -882,9 +887,9 @@ export const LightTheme = () => { justifyContent: "space-between", paddingTop: view.getWindowTopInsets(), height: `calc(56px + ${view.getWindowTopInsets()}px)`, - borderBottom: "0", boxShadow: "0 1px 5px rgba(0, 0, 0, 0.3)", - backgroundColor: theme.palette.primary.main, + backgroundColor: theme.palette.background.default, + borderBottom: `1px solid ${theme.palette.divider} !important`, backgroundSize: "0", }, ".toolbar--noshadow": { @@ -1792,7 +1797,7 @@ export const LightTheme = () => { }, ".tabbar--material": { background: "none", - backgroundColor: theme.palette.primary.main, + backgroundColor: theme.palette.background.default, borderBottomWidth: "0", // boxShadow: "0 4px 2px -2px rgba(0, 0, 0, 0.14), 0 3px 5px -2px rgba(0, 0, 0, 0.12),\r\n 0 5px 1px -4px rgba(0, 0, 0, 0.2)", }, diff --git a/Website/src/typings/global.d.ts b/Website/src/typings/global.d.ts index 22c306ea..a7c3e905 100644 --- a/Website/src/typings/global.d.ts +++ b/Website/src/typings/global.d.ts @@ -1,5 +1,6 @@ import { AlertColor } from "@mui/material/Alert"; import { AvailableStrs, strs } from "./../locales/declaration"; +import { Theme } from "@mui/material"; export {}; @@ -86,6 +87,14 @@ declare global { readonly __nativeStorage__: NativeStorage; } + export type MMRLTheme = Theme & { + palette?: { + text?: { + link?: string; + }; + }; + }; + namespace Terminal { export type Exec = { command: string; From bcb5587aa9c90edc82bfb4b5ff5c5cae185c0fa0 Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 3 Feb 2024 11:02:47 +0100 Subject: [PATCH 67/77] design improvements --- Website/src/activitys/MainApplication.tsx | 4 +- Website/src/activitys/ModuleViewActivity.tsx | 2 - Website/src/activitys/SearchActivity.tsx | 2 +- .../activitys/fragments/ModuleFragment.tsx | 3 +- .../src/components/DialogEditTextListItem.tsx | 18 +-- .../src/components/module/ExploreModule.tsx | 3 +- Website/src/components/onsenui/Page.tsx | 13 +-- Website/src/components/onsenui/Toolbar.tsx | 12 +- Website/src/hooks/useTheme.tsx | 103 ++++++++++++------ Website/src/styles/light_theme.tsx | 1 - 10 files changed, 84 insertions(+), 77 deletions(-) diff --git a/Website/src/activitys/MainApplication.tsx b/Website/src/activitys/MainApplication.tsx index 5ea386d9..df97d7e4 100644 --- a/Website/src/activitys/MainApplication.tsx +++ b/Website/src/activitys/MainApplication.tsx @@ -183,7 +183,9 @@ const MainApplication = () => { primary={ {item.name} - {item.track.verified && } + {item.track.verified && ( + ({ color: theme.palette.text.link, fontSize: "unset" })} /> + )} } secondary={ diff --git a/Website/src/activitys/ModuleViewActivity.tsx b/Website/src/activitys/ModuleViewActivity.tsx index 7f18850b..2f2dd324 100644 --- a/Website/src/activitys/ModuleViewActivity.tsx +++ b/Website/src/activitys/ModuleViewActivity.tsx @@ -271,7 +271,6 @@ const ModuleViewActivity = () => { alignSelf: "flex-end", }} variant="contained" - disableElevation onClick={() => { confirm({ title: `Install ${name}?`, @@ -310,7 +309,6 @@ const ModuleViewActivity = () => { alignSelf: "flex-end", }} variant="contained" - disableElevation > {strings("download")} diff --git a/Website/src/activitys/SearchActivity.tsx b/Website/src/activitys/SearchActivity.tsx index fce4eb0c..a7b717f5 100644 --- a/Website/src/activitys/SearchActivity.tsx +++ b/Website/src/activitys/SearchActivity.tsx @@ -16,7 +16,7 @@ const RenderWhenEmpty = React.memo(() => { { ((props) => { aria-haspopup="true" aria-expanded={open ? "true" : undefined} variant="contained" - disableElevation onClick={handleClick} endIcon={} > diff --git a/Website/src/components/DialogEditTextListItem.tsx b/Website/src/components/DialogEditTextListItem.tsx index 5f43b921..882743e3 100644 --- a/Website/src/components/DialogEditTextListItem.tsx +++ b/Website/src/components/DialogEditTextListItem.tsx @@ -75,22 +75,8 @@ export const DialogEditTextListItem = (props: DialogEditTextListItemProps) => { /> - - + +
diff --git a/Website/src/components/module/ExploreModule.tsx b/Website/src/components/module/ExploreModule.tsx index 46adf029..0cf98140 100644 --- a/Website/src/components/module/ExploreModule.tsx +++ b/Website/src/components/module/ExploreModule.tsx @@ -46,6 +46,7 @@ const ExploreModule = React.memo((props) => { sx={{ p: 2, ":hover": { + opacity: ".8", cursor: "pointer", }, width: "100%", @@ -59,7 +60,7 @@ const ExploreModule = React.memo((props) => { height: "100%", objectFit: "cover", borderRadius: theme.shape.borderRadius / theme.shape.borderRadius, - boxShadow: "0 0px 1px 0 rgba(60,64,67,.3), 0 1px 10px 1px rgba(60,64,67,.15)", + border: `1px solid ${theme.palette.divider} !important`, width: "100%", })} image={track.cover} diff --git a/Website/src/components/onsenui/Page.tsx b/Website/src/components/onsenui/Page.tsx index a9b34029..97a011f0 100644 --- a/Website/src/components/onsenui/Page.tsx +++ b/Website/src/components/onsenui/Page.tsx @@ -42,21 +42,12 @@ const HTMLPage = onsCustomElement("ons-page", { const _Page = React.forwardRef((props, ref) => { const { theme } = useTheme(); const { context } = useActivity(); - const { renderToolbar, renderBottomToolbar, renderModal, renderFixed, sx, compSx, children, ...rest } = props; - - React.useEffect(() => { - if (props.backgroundStyle) { - os.setNavigationBarColor(props.backgroundStyle); - return () => { - os.setNavigationBarColor(theme.palette.background.default); - }; - } - }, [props.backgroundStyle]); + const { renderToolbar, renderBottomToolbar, renderModal, renderFixed, sx, compSx, children, backgroundStyle, ...rest } = props; return ( {renderToolbar && renderToolbar(ref, context)} - + {children} diff --git a/Website/src/components/onsenui/Toolbar.tsx b/Website/src/components/onsenui/Toolbar.tsx index 06e26b1c..f7c7cb80 100644 --- a/Website/src/components/onsenui/Toolbar.tsx +++ b/Website/src/components/onsenui/Toolbar.tsx @@ -4,6 +4,7 @@ import Icon from "@Components/Icon"; import React from "react"; import { OverridableComponent } from "@mui/material/OverridableComponent"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import Button from "@mui/material/Button"; import { SvgIconTypeMap } from "@mui/material/SvgIcon"; import { SxProps, Theme } from "@mui/material/styles"; import Box from "@mui/material/Box"; @@ -32,13 +33,10 @@ const HTMLToolbar = onsCustomElement("ons-toolbar", { const HTMLToolbarButton = onsCustomElement("ons-toolbar-button")({}); const ToolbarButton = React.forwardRef((props: HTMLToolbarButton, ref: React.Ref) => { - return ( - - {props.icon ? ( - - ) : ( - <>{props.children} - )} + const { icon, iconProps, keepLight, children, ...rest } = props; + return ( + + {icon ? : <>{children}} ); }); diff --git a/Website/src/hooks/useTheme.tsx b/Website/src/hooks/useTheme.tsx index 542d0c02..9099b8ce 100644 --- a/Website/src/hooks/useTheme.tsx +++ b/Website/src/hooks/useTheme.tsx @@ -42,48 +42,81 @@ export const useTheme = () => { }; }; -export const ThemeProvider = (props: React.PropsWithChildren) => { - const { settings } = useSettings(); - const shade = useShadeColor(); - - const [, setBackgroundColor] = useNativeStorage("background_color", colors[settings.accent_scheme.value][200]); - const [, setStatusBarColor] = useNativeStorage("statusbar_color", colors[settings.accent_scheme.value][500]); - - const theme = React.useMemo(() => { - const THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP = createTheme({ - components: { - MuiCard: { - defaultProps: { - elevation: 0, +const THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP = createTheme({ + components: { + MuiDialog: { + styleOverrides: { + root: { + "& .MuiDialog-paper": { + backgroundColor: "#101010", + border: `1px solid #333638`, + backgroundImage: "none", + }, + "& .MuiDialogContent-root": { + borderTop: "none", + borderBottom: "none", + }, + "& .MuiButtonBase-root": { + color: "#f3f5f7", }, }, }, - shape: { - borderRadius: 8, + }, + MuiCard: { + defaultProps: { + elevation: 0, }, - palette: { - mode: "dark", - primary: { - main: "#ffffff", - dark: "#353535", - }, - secondary: { - main: "#ffffff", - dark: "#0a0a0a", - }, - background: { - paper: "#181818", - default: "#101010", - }, - text: { - link: "#0095F6", - primary: "#f3f5f7", - secondary: "#777777", + }, + MuiButton: { + styleOverrides: { + root: { + color: "black", + ":disabled": { + cursor: "not-allowed", + color: "black", + opacity: ".3", + backgroundColor: "#ffffff", + }, }, - divider: "#333638", }, - } as MMRLTheme); + defaultProps: { + disableElevation: true, + }, + }, + }, + shape: { + borderRadius: 8, + }, + palette: { + mode: "dark", + primary: { + main: "#ffffff", + dark: "#353535", + }, + secondary: { + main: "#ffffff", + dark: "#0a0a0a", + }, + background: { + paper: "#181818", + default: "#101010", + }, + text: { + link: "#0095F6", + primary: "#f3f5f7", + secondary: "#777777", + }, + divider: "#333638", + }, +} as unknown as MMRLTheme); +export const ThemeProvider = (props: React.PropsWithChildren) => { + const { settings } = useSettings(); + + const [, setBackgroundColor] = useNativeStorage("background_color", colors[settings.accent_scheme.value][200]); + const [, setStatusBarColor] = useNativeStorage("statusbar_color", colors[settings.accent_scheme.value][500]); + + const theme = React.useMemo(() => { setBackgroundColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.background.default); setStatusBarColor(THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP.palette.primary.main); return THIS_IS_THE_THEME_OBJECT_OF_THIS_F_APP; diff --git a/Website/src/styles/light_theme.tsx b/Website/src/styles/light_theme.tsx index 6b8f41a2..d04f3c85 100644 --- a/Website/src/styles/light_theme.tsx +++ b/Website/src/styles/light_theme.tsx @@ -889,7 +889,6 @@ export const LightTheme = () => { height: `calc(56px + ${view.getWindowTopInsets()}px)`, boxShadow: "0 1px 5px rgba(0, 0, 0, 0.3)", backgroundColor: theme.palette.background.default, - borderBottom: `1px solid ${theme.palette.divider} !important`, backgroundSize: "0", }, ".toolbar--noshadow": { From 56b0bec6dfc11276a7c807de16b453994f3c059e Mon Sep 17 00:00:00 2001 From: Der_Googler <54764558+DerGoogler@users.noreply.github.com> Date: Sat, 3 Feb 2024 11:55:15 +0100 Subject: [PATCH 68/77] pos. splash screen fix and more --- .../main/res/drawable/ic_cdv_splashscreen.xml | 5 +++ Android/app/src/main/res/values/styles.xml | 5 +++ Website/src/activitys/ModuleViewActivity.tsx | 33 ++++++++++++++++--- Website/src/components/onsenui/Page.tsx | 4 +-- 4 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 Android/app/src/main/res/drawable/ic_cdv_splashscreen.xml diff --git a/Android/app/src/main/res/drawable/ic_cdv_splashscreen.xml b/Android/app/src/main/res/drawable/ic_cdv_splashscreen.xml new file mode 100644 index 00000000..7bc4107d --- /dev/null +++ b/Android/app/src/main/res/drawable/ic_cdv_splashscreen.xml @@ -0,0 +1,5 @@ + + + diff --git a/Android/app/src/main/res/values/styles.xml b/Android/app/src/main/res/values/styles.xml index 4e58a5d9..c4928865 100755 --- a/Android/app/src/main/res/values/styles.xml +++ b/Android/app/src/main/res/values/styles.xml @@ -1,4 +1,9 @@ +