diff --git a/.gitignore b/.gitignore index 46e71c67..367ba710 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,10 @@ result* repl-result-out* .direnv +# auto-generated files +apps/frontend/src/bindings.ts +apps/frontend/ipc + # Prisma crates/prisma/src/prisma.rs dev.db diff --git a/Cargo.toml b/Cargo.toml index bf15816b..98200c07 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,10 +21,16 @@ authors = [ version = "1.0.0-alpha.1" [workspace.dependencies] +# best practice to define all workspace crates in the root +# even if they are not use, with no features enabled. onelauncher = { path = "./packages/core" } onelauncher_macros = { path = "./packages/macros" } +onelauncher_gui = { path = "./apps/desktop" } +onelauncher_test = { path = "./apps/testing" } -# tauri uses latest crates.io beta channel (temporarily can use v2 and main branches if necessary) +# tauri uses latest crates.io beta channel +# (temporarily can use v2 and main branches if necessary) +# TODO: release candidate update is blocked by tauri-specta. tauri = { version = "=2.0.0-beta.25", features = [ "rustls-tls", "tracing", @@ -32,6 +38,8 @@ tauri = { version = "=2.0.0-beta.25", features = [ "uuid", "protocol-asset" ] } + +# TODO: remove locked tauri-* deps once we update to the release candidate. tauri-utils = { version = "=2.0.0-beta.19" } tauri-build = { version = "=2.0.0-beta.19" } tauri-codegen = { version = "=2.0.0-beta.19" } @@ -39,15 +47,39 @@ tauri-macros = { version = "=2.0.0-beta.19" } tauri-plugin = { version = "=2.0.0-beta.19" } tauri-runtime = { version = "=2.0.0-beta.21" } -tauri-plugin-authenticator = { version = "=2.0.0-beta.10" } +# tauri-plugin-shell adds a bridge for opening urls and paths in the frontend. tauri-plugin-shell = { version = "=2.0.0-beta.10" } +# tauri-plugin-window-state saves the window position and size to be restored. tauri-plugin-window-state = { version = "=2.0.0-beta.12" } +# tauri-plugin-single-instance ensures that only one instance of the app is running. tauri-plugin-single-instance = { version = "=2.0.0-beta.12" } +# tauri-plugin-clipboard-manager adds a bridge for reading/writing to the clipboard. tauri-plugin-clipboard-manager = { version = "=2.1.0-beta.7" } -tauri-plugin-updater = { version = "=2.0.0-beta.12", features = [ "rustls-tls" ] } +# tauri-plugin-updater allows for us to use it's functionality for in-app updates. +tauri-plugin-updater = { version = "=2.0.0-beta.12" } +# tauri-plugin-dialog adds a bridge for opening file manager and message dialogs. tauri-plugin-dialog = { version = "=2.0.0-beta.12" } -rspc = { version = "=0.2.0", features = [ "specta2" ] } +# rspc is used as a faster and more intuitive replacement for tauri-specta +# commands/apis that don't depend on tauri. rather than using the tauri +# event and invoke apis for handling api calling, it creates a router which +# we can easily use with tanstack solid query apis. +# this means we don't have to redefine all our core apis as tauri commands. +# features: "specta2" is for using the latest v2 rc of specta. +# TODO: the api migration is blocked until rspc updates to a newer version of tauri v2. +rspc = { version = "=0.2.0", features = [ + "specta2", + "tracing" +] } + +# specta is used as a peer dependency for tauri-specta and rspc. +# it generates rust code into other languages, in our case, typescript. +# v2 is the latest/only version, and it is updated as a release candidate +# on crates.io almost after every commit, so a git dep isn't necessary. +# features: "derive" and "function" are core apis of specta we rely on. +# the remaining features implements the specta::Type trait for their +# respective dependencies of the same name. if we add a new dependency +# and run into specta errors, adding the dependency as a feature will usually solve this. specta = { version = "=2.0.0-rc.19", features = [ "chrono", "uuid", @@ -57,15 +89,22 @@ specta = { version = "=2.0.0-rc.19", features = [ "derive", "time" ] } + +# tauri-specta tauri-specta = { version = "=2.0.0-rc.13", features = [ "javascript", "typescript", "derive" ] } + +# specta-typescript is the typescript adapter for specta. specta-typescript = { version = "=0.0.6" } + +# rspc-specta2 is the specta v2 (rc) adapter for rspc. rspc-tauri2 = { version = "=0.0.1" } # all other dependencies are updated to latest crates.io release channel + interpulse = { version = "1", features = [ "specta" ] } tracing = { version = "0.1" } @@ -175,7 +214,7 @@ features = [ ] default-features = false -[patch.crates-io] +[patch.crates-io] # we hack to the high heavens # rspc = { git = "https://github.com/oscartbeaumont/rspc", rev = "9f26d6400affdb501837cb023678268ad72feb9b" } # rspc-tauri2 = { git = "https://github.com/specta-rs/tauri2", rev = "6b9419566e2a826fb2a62538c7647f4524ab0fea" } @@ -202,16 +241,16 @@ lto = "off" codegen-units = 256 incremental = true -# Set the settings for build scripts and proc-macros. +# set the settings for build scripts and proc-macros. [profile.dev.build-override] opt-level = 3 -# Set the default for dependencies, except workspace members. +# set the default for dependencies, except workspace members. [profile.dev.package."*"] opt-level = 3 incremental = false -# sets the default for dependencies, except workspace members. +# set the default for dependencies, except workspace members. [profile.dev-debug.package."*"] inherits = "dev" opt-level = 3 diff --git a/apps/desktop/Cargo.toml b/apps/desktop/Cargo.toml index 8f5eab87..f6c31075 100644 --- a/apps/desktop/Cargo.toml +++ b/apps/desktop/Cargo.toml @@ -24,13 +24,6 @@ tauri-build = { workspace = true, features = [ "isolation" ] } [dependencies] onelauncher = { workspace = true, features = [ "tauri" ] } -tauri = { workspace = true, features = [ - "isolation", - "macos-private-api", - "image-ico", - "image-png", - "protocol-asset" -] } tauri-utils = { workspace = true } tauri-build = { workspace = true } tauri-codegen = { workspace = true } @@ -42,7 +35,6 @@ tauri-plugin-shell = { workspace = true } tauri-plugin-window-state = { workspace = true } tauri-plugin-single-instance = { workspace = true } tauri-plugin-updater = { workspace = true } -tauri-plugin-authenticator = { workspace = true } tauri-plugin-clipboard-manager = { workspace = true } tauri-plugin-dialog = { workspace = true } @@ -63,6 +55,20 @@ uuid = { workspace = true } tracing = { workspace = true } tracing-error = { workspace = true } +[dependencies.tauri] +workspace = true +features = [ + "isolation", + "macos-private-api", + "image-ico", + "image-png", + "protocol-asset" +] + +[dev-dependencies.tauri] +workspace = true +features = [ "test" ] + [target.'cfg(target_os = "macos")'.dependencies] cocoa.workspace = true objc.workspace = true diff --git a/apps/desktop/src/lib.rs b/apps/desktop/src/lib.rs index e38f54cd..e8f01ac0 100644 --- a/apps/desktop/src/lib.rs +++ b/apps/desktop/src/lib.rs @@ -6,17 +6,16 @@ pub mod error; pub mod ext; #[derive(Clone, serde::Serialize)] -struct SingleInstancePayload { +pub struct SingleInstancePayload { args: Vec, cwd: String, } #[tracing::instrument(skip_all)] -async fn initialize_state(app: tauri::AppHandle) -> api::Result<()> { - onelauncher::ProxyState::initialize(app).await?; +async fn initialize_state(handle: &tauri::AppHandle) -> api::Result<()> { + onelauncher::ProxyState::initialize(handle).await?; let s = onelauncher::State::get().await?; onelauncher::State::update(); - s.processor.write().await.restore().await?; Ok(()) } @@ -26,9 +25,9 @@ pub async fn run() { // we panic because nothing else can be debugged once the logger fails. // the only thing that can fail before the logger should be our `tokio::main` loop. let _log_guard = onelauncher::start_logger(); - tracing::info!("initialized tracing subscriber. loading onelauncher..."); + tracing::info!("initialized logger. loading onelauncher/tauri..."); - run_app(|app| { + run_app(tauri::Builder::default(), |app| { if let Err(err) = setup(app) { tracing::error!("failed to setup app: {:?}", err); } @@ -36,7 +35,10 @@ pub async fn run() { .await; } -pub async fn run_app(setup: F) { +pub async fn run_app) + Send + 'static>( + builder: tauri::Builder, + setup: F, +) { let prebuild = tauri_specta::Builder::::new() .commands(collect_commands!()) .events(collect_events!()) @@ -51,7 +53,7 @@ pub async fn run_app(setup: F) { ) .expect("failed to export debug bindings!"); - let builder = tauri::Builder::default() + let builder = builder .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| { println!("{}, {argv:?}, {cwd}", app.package_info().name); @@ -70,7 +72,7 @@ pub async fn run_app(setup: F) { .invoke_handler(prebuild.invoke_handler()) .setup(move |app| { prebuild.mount_events(app.handle()); - setup(app); + setup(app.handle()); Ok(()) }); @@ -78,15 +80,15 @@ pub async fn run_app(setup: F) { .build(tauri::generate_context!()) .expect("failed to build tauri application"); - if let Err(err) = initialize_state(app.app_handle().clone()).await { + if let Err(err) = initialize_state(app.handle()).await { tracing::error!("{err}"); }; app.run(|_, _| {}) } -fn setup(app: &mut tauri::App) -> Result<(), Box> { - let win = app.get_webview_window("main").unwrap(); +fn setup(handle: &tauri::AppHandle) -> Result<(), Box> { + let win = handle.get_webview_window("main").unwrap(); win.show().unwrap(); Ok(()) diff --git a/apps/desktop/tauri.conf.json b/apps/desktop/tauri.conf.json index 496add4b..51727ad9 100644 --- a/apps/desktop/tauri.conf.json +++ b/apps/desktop/tauri.conf.json @@ -7,17 +7,51 @@ "macOSPrivateApi": true, "security": { "csp": { - "default-src": ["'self'", "customprotocol:", "asset:"], - "connect-src": ["https://modrinth.com", "https://api.modrinth.com", "https://polyfrost.org", "https://*.polyfrost.org", "https://*.cloudflare.com", "https://api.mclo.gs"], - "img-src": ["'self'", "tauri:", "https:", "data:", "blob:", "'unsafe-inline'", "asset:", "https://asset.localhost"], - "script-src": ["'self'", "https://*.cloudflare.com", "https://*.polyfrost.org"], - "frame-src": ["https://*.cloudflare.com", "https://www.youtube.com", "https://www.youtube-nocookie.com", "https://discord.com", "https://*.githubusercontent.com", "'self'"], - "style-src": ["unsafe-inline", "'self'"] + "default-src": [ + "'self'", + "customprotocol:", + "asset:" + ], + "connect-src": [ + "https://modrinth.com", + "https://api.modrinth.com", + "https://polyfrost.org", + "https://*.polyfrost.org", + "https://*.cloudflare.com", + "https://api.mclo.gs" + ], + "img-src": [ + "'self'", + "tauri:", + "https:", + "data:", + "blob:", + "'unsafe-inline'", + "asset:", + "https://asset.localhost" + ], + "script-src": [ + "'self'", + "https://*.cloudflare.com", + "https://*.polyfrost.org" + ], + "frame-src": [ + "https://*.cloudflare.com", + "https://www.youtube.com", + "https://www.youtube-nocookie.com", + "https://discord.com", + "https://*.githubusercontent.com", + "'self'" + ], + "style-src": [ + "unsafe-inline", + "'self'" + ] }, "pattern": { "use": "isolation", "options": { - "dir": "../frontend/src-isolation/" + "dir": "../frontend/isolation/" } }, "assetProtocol": { diff --git a/apps/frontend/.gitignore b/apps/frontend/.gitignore deleted file mode 100644 index 8d939d16..00000000 --- a/apps/frontend/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/dist-isolation -/coverage -/src/bindings.ts diff --git a/apps/frontend/index.html b/apps/frontend/index.html index 1a24ec29..c19c6f84 100644 --- a/apps/frontend/index.html +++ b/apps/frontend/index.html @@ -1,17 +1,15 @@ - - - - - - OneLauncher - + + + + + + OneLauncher + - - -
- - - + +
+ + diff --git a/apps/frontend/isolation/index.html b/apps/frontend/isolation/index.html new file mode 100644 index 00000000..c0e64e9c --- /dev/null +++ b/apps/frontend/isolation/index.html @@ -0,0 +1,10 @@ + + + + + Isolation Secure Script + + + + + diff --git a/apps/frontend/src-isolation/index.js b/apps/frontend/isolation/index.js similarity index 82% rename from apps/frontend/src-isolation/index.js rename to apps/frontend/isolation/index.js index 84a4327b..1eb85f22 100644 --- a/apps/frontend/src-isolation/index.js +++ b/apps/frontend/isolation/index.js @@ -1,4 +1,3 @@ -// @ts-nocheck window.__TAURI_ISOLATION_HOOK__ = (payload) => { return payload; }; diff --git a/apps/frontend/package.json b/apps/frontend/package.json index dd918db4..85c392bd 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -24,10 +24,10 @@ "@rspc/tauri": "^0.2.0", "@solid-primitives/refs": "^1.0.8", "@solidjs/router": "^0.14.1", - "@tanstack/solid-query": "^5.51.16", + "@tanstack/solid-query": "^5.51.21", "@tauri-apps/api": "2.0.0-beta.16", "@tauri-apps/plugin-clipboard-manager": "github:tauri-apps/tauri-plugin-clipboard-manager#v2", - "@tauri-apps/plugin-dialog": "2.0.0-beta.8", + "@tauri-apps/plugin-dialog": "github:tauri-apps/tauri-plugin-dialog#v2", "@tauri-apps/plugin-shell": "github:tauri-apps/tauri-plugin-shell#v2", "@thisbeyond/solid-dnd": "^0.7.5", "@thisbeyond/solid-select": "^0.15.0", @@ -35,6 +35,7 @@ "@untitled-theme/icons-solid": "^0.10.5", "overlayscrollbars": "^2.10.0", "overlayscrollbars-solid": "^0.5.5", + "pathe": "^1.1.2", "solid-js": "^1.8.19", "solid-transition-group": "^0.2.3", "uuid": "^10.0.0" diff --git a/apps/frontend/src-isolation/index.html b/apps/frontend/src-isolation/index.html deleted file mode 100644 index 27c8d3f3..00000000 --- a/apps/frontend/src-isolation/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Isolation Secure Script - - - - - diff --git a/apps/frontend/src/shims.d.ts b/apps/frontend/src/shims.d.ts deleted file mode 100644 index e1a36aaf..00000000 --- a/apps/frontend/src/shims.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { AttributifyAttributes } from 'unocss/preset-attributify'; - -declare module 'solid-js' { - namespace JSX { - interface HTMLAttributes extends AttributifyAttributes { } - } -} diff --git a/apps/frontend/src/types.ts b/apps/frontend/src/types.ts new file mode 100644 index 00000000..b21371c4 --- /dev/null +++ b/apps/frontend/src/types.ts @@ -0,0 +1,13 @@ +export type WithIndex = T & { index: number }; +export type MakeOptional = Omit & Partial>; + +type GrowToSize = A['length'] extends N ? A : GrowToSize; +export type FixedArray = GrowToSize; + +// Get size of enum as a type - https://stackoverflow.com/a/68317984/23592613 +type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; +type UnionToOvlds = UnionToIntersection void : never>; +type PopUnion = UnionToOvlds extends (a: infer A) => void ? A : never; + +export type IsUnion = [T] extends [UnionToIntersection] ? false : true; +export type UnionToArray = IsUnion extends true ? UnionToArray>, [PopUnion, ...A]> : [T, ...A]; diff --git a/apps/frontend/src/types/global.d.ts b/apps/frontend/src/types/global.d.ts deleted file mode 100644 index 75f8eba6..00000000 --- a/apps/frontend/src/types/global.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -declare namespace globalThis { - export type WithIndex = T & { index: number } - export type MakeOptional = Omit & Partial> - - type GrowToSize = A['length'] extends N ? A : GrowToSize; - export type FixedArray = GrowToSize; - - // Get size of enum as a type - https://stackoverflow.com/a/68317984/23592613 - type UnionToIntersection = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never; - type UnionToOvlds = UnionToIntersection void : never>; - type PopUnion = UnionToOvlds extends (a: infer A) => void ? A : never; - export type IsUnion = [T] extends [UnionToIntersection] ? false : true; - export type UnionToArray = IsUnion extends true ? UnionToArray>, [PopUnion, ...A]> : [T, ...A]; - - // enum Example { - // how = "how", - // to = "to", - // count = "count", - // enum = "enum", - // entries = "entries" - // } - - // type Result = UnionToArray['length'] // = 5 -} \ No newline at end of file diff --git a/apps/frontend/src/ui/App.tsx b/apps/frontend/src/ui/App.tsx index d9f15baf..5fd5fed3 100644 --- a/apps/frontend/src/ui/App.tsx +++ b/apps/frontend/src/ui/App.tsx @@ -13,9 +13,7 @@ import { PROGRAM_INFO } from '~bindings'; function App(props: ParentProps) { if (PROGRAM_INFO.dev_build !== true) - document.addEventListener('contextmenu', (event) => { - event.preventDefault(); - }); + document.addEventListener('contextmenu', e => e.preventDefault()); return ( diff --git a/apps/frontend/src/ui/components/content/ModCard.tsx b/apps/frontend/src/ui/components/content/ModCard.tsx index 06cc1e2a..5fe7f9d1 100644 --- a/apps/frontend/src/ui/components/content/ModCard.tsx +++ b/apps/frontend/src/ui/components/content/ModCard.tsx @@ -1,6 +1,6 @@ import { Download01Icon, HeartIcon } from '@untitled-theme/icons-solid'; import { useNavigate } from '@solidjs/router'; -import { abbreviateNumber } from '../../../utils/primitives'; +import { abbreviateNumber } from '~utils'; import BrowserMod from '~ui/pages/browser/BrowserMod'; import type { ManagedPackage } from '~bindings'; diff --git a/apps/frontend/src/ui/components/overlay/Modal.tsx b/apps/frontend/src/ui/components/overlay/Modal.tsx index ef9fa801..e400be64 100644 --- a/apps/frontend/src/ui/components/overlay/Modal.tsx +++ b/apps/frontend/src/ui/components/overlay/Modal.tsx @@ -9,6 +9,7 @@ import { For, createEffect, createSignal, on } from 'solid-js'; import { mergeRefs } from '@solid-primitives/refs'; import Button from '../base/Button'; import FullscreenOverlay from './FullscreenOverlay'; +import type { MakeOptional } from '~types.ts'; export type ModalProps = { visible: Accessor; diff --git a/apps/frontend/src/ui/components/overlay/cluster/ClusterCreationModal.tsx b/apps/frontend/src/ui/components/overlay/cluster/ClusterCreationModal.tsx index f4e0657e..a0bec933 100644 --- a/apps/frontend/src/ui/components/overlay/cluster/ClusterCreationModal.tsx +++ b/apps/frontend/src/ui/components/overlay/cluster/ClusterCreationModal.tsx @@ -7,6 +7,7 @@ import { ClusterStepTwo } from './ClusterStepTwo'; import Button from '~ui/components/base/Button'; import type { CreateCluster } from '~bindings'; import { bridge } from '~imports'; +import type { FixedArray, UnionToArray } from '~types.ts'; type PartialCluster = Partial; type PartialClusterUpdateFunc = (key: K, value: PartialCluster[K]) => any; diff --git a/apps/frontend/src/ui/components/overlay/cluster/ClusterStepTwo.tsx b/apps/frontend/src/ui/components/overlay/cluster/ClusterStepTwo.tsx index b3ffc8a7..ed6b94ef 100644 --- a/apps/frontend/src/ui/components/overlay/cluster/ClusterStepTwo.tsx +++ b/apps/frontend/src/ui/components/overlay/cluster/ClusterStepTwo.tsx @@ -12,7 +12,7 @@ import { bridge } from '~imports'; import SelectList from '~ui/components/base/SelectList'; import Checkbox from '~ui/components/base/Checkbox'; import type { Loader, VersionType } from '~bindings'; -import { formatVersionRelease } from '~utils/helpers'; +import { formatVersionRelease } from '~utils'; const loaders: { name: string; diff --git a/apps/frontend/src/ui/components/overlay/notifications/NotificationComponent.tsx b/apps/frontend/src/ui/components/overlay/notifications/NotificationComponent.tsx index 75ec0577..5f837e42 100644 --- a/apps/frontend/src/ui/components/overlay/notifications/NotificationComponent.tsx +++ b/apps/frontend/src/ui/components/overlay/notifications/NotificationComponent.tsx @@ -1,7 +1,7 @@ import { type JSX, Match, Show, Switch, createEffect, createSignal } from 'solid-js'; import { InfoCircleIcon } from '@untitled-theme/icons-solid'; import TimeAgo from '../../TimeAgo'; -import { PausableTimer } from '~utils/PausableTimer'; +import { PausableTimer } from '~utils'; type NotificationComponentProps = Core.Notification & { overlay: boolean; diff --git a/apps/frontend/src/ui/pages/Home.tsx b/apps/frontend/src/ui/pages/Home.tsx index 2596bc06..684cef6e 100644 --- a/apps/frontend/src/ui/pages/Home.tsx +++ b/apps/frontend/src/ui/pages/Home.tsx @@ -20,7 +20,7 @@ import ClusterCover from '~ui/components/game/ClusterCover'; import type { Cluster } from '~bindings'; import useCommand from '~ui/hooks/useCommand'; import { bridge } from '~imports'; -import { secondsToWords, upperFirst } from '~utils/primitives'; +import { secondsToWords, upperFirst } from '~utils'; import { useClusterModalController } from '~ui/components/overlay/cluster/ClusterCreationModal'; type GroupedClusters = Record; diff --git a/apps/frontend/src/ui/pages/browser/BrowserMain.tsx b/apps/frontend/src/ui/pages/browser/BrowserMain.tsx index f1bb01f4..b99d7a48 100644 --- a/apps/frontend/src/ui/pages/browser/BrowserMain.tsx +++ b/apps/frontend/src/ui/pages/browser/BrowserMain.tsx @@ -8,7 +8,7 @@ import Dropdown from '~ui/components/base/Dropdown'; import TextField from '~ui/components/base/TextField'; import ModCard, { Provider } from '~ui/components/content/ModCard'; import { tryResult } from '~ui/hooks/useCommand'; -import createSortable from '~utils/sorting'; +import { createSortable } from '~utils'; interface CardProps { id: string; @@ -35,21 +35,21 @@ function BrowserMain() { tryResult(bridge.commands.getMod, 'oneconfig'), tryResult(bridge.commands.getMod, 'chatting'), tryResult(bridge.commands.getMod, 'patcher'), - ]).then((res: ManagedPackage[]) => { + ]).then((pkgs) => { const list: ModsRowProps[] = [ { header: 'Polyfrost', category: 'polyfrost', packages: [ - res[1], - res[2], - res[3], + pkgs[1], + pkgs[2], + pkgs[3], ], }, { header: 'Random Mods', category: 'random', - packages: res[0], + packages: pkgs[0], }, ]; diff --git a/apps/frontend/src/ui/pages/cluster/ClusterLogs.tsx b/apps/frontend/src/ui/pages/cluster/ClusterLogs.tsx index eafdedcb..ffdc42b8 100644 --- a/apps/frontend/src/ui/pages/cluster/ClusterLogs.tsx +++ b/apps/frontend/src/ui/pages/cluster/ClusterLogs.tsx @@ -2,13 +2,13 @@ import { For, Show, createEffect, createSignal, untrack } from 'solid-js'; import { OverlayScrollbarsComponent } from 'overlayscrollbars-solid'; import { LinkExternal01Icon, Upload01Icon } from '@untitled-theme/icons-solid'; import { open } from '@tauri-apps/plugin-shell'; +import { join } from 'pathe'; import useCommand, { tryResult } from '~ui/hooks/useCommand'; import { bridge } from '~imports'; import useClusterContext from '~ui/hooks/useCluster'; import Dropdown from '~ui/components/base/Dropdown'; import Button from '~ui/components/base/Button'; import useSettingsContext from '~ui/hooks/useSettings'; -import joinPath from '~utils/helpers'; import FormattedLog from '~ui/components/content/FormattedLog'; function ClusterLogs() { @@ -37,9 +37,8 @@ function ClusterLogs() { if (root === null || root === undefined || path === null || path === undefined) return; - const dir = joinPath(root, 'clusters', path); - - open(joinPath(dir, 'logs')); + const dir = join(root, 'clusters', path); + open(join(dir, 'logs')); } async function uploadAndOpenLog() { diff --git a/apps/frontend/src/ui/pages/cluster/ClusterOverview.tsx b/apps/frontend/src/ui/pages/cluster/ClusterOverview.tsx index d8e1f4ba..7f100641 100644 --- a/apps/frontend/src/ui/pages/cluster/ClusterOverview.tsx +++ b/apps/frontend/src/ui/pages/cluster/ClusterOverview.tsx @@ -8,7 +8,7 @@ import Button from '../../components/base/Button'; import ScrollableContainer from '~ui/components/ScrollableContainer'; import Sidebar from '~ui/components/Sidebar'; import type { Cluster } from '~bindings'; -import { upperFirst } from '~utils/primitives'; +import { upperFirst } from '~utils'; import useClusterContext from '~ui/hooks/useCluster'; import Modal from '~ui/components/overlay/Modal'; import { bridge } from '~imports'; diff --git a/apps/frontend/src/utils/helpers.ts b/apps/frontend/src/utils/helpers.ts deleted file mode 100644 index 7e49ab2b..00000000 --- a/apps/frontend/src/utils/helpers.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { VersionType } from '~bindings'; - -export function formatVersionRelease(release: VersionType): string { - const mapping: { [key in VersionType]: string } = { - old_alpha: 'Alpha', - old_beta: 'Beta', - release: 'Release', - snapshot: 'Snapshot', - }; - - return mapping[release]; -} - -/** - * A simple analog of Node.js's `path.join(...)`. - * https://gist.github.com/creationix/7435851#gistcomment-3698888 - */ -export default function joinPath(...segments: string[]) { - const parts = segments.reduce((parts, segment) => { - // Remove leading slashes from non-first part. - if (parts.length > 0) - segment = segment.replace(/^\//, ''); - - // Remove trailing slashes. - segment = segment.replace(/\/$/, ''); - return parts.concat(segment.split('/')); - }, []); - - const resultParts: string[] = []; - for (const part of parts) { - if (part === '.') - continue; - - if (part === '..') { - resultParts.pop(); - continue; - } - resultParts.push(part); - } - return resultParts.join('/'); -} diff --git a/apps/frontend/src/utils/primitives.ts b/apps/frontend/src/utils/index.ts similarity index 77% rename from apps/frontend/src/utils/primitives.ts rename to apps/frontend/src/utils/index.ts index 26bb416f..24b0f403 100644 --- a/apps/frontend/src/utils/primitives.ts +++ b/apps/frontend/src/utils/index.ts @@ -1,3 +1,19 @@ +import type { VersionType } from '~bindings'; + +export * from './PausableTimer'; +export * from './sorting'; + +export function formatVersionRelease(release: VersionType): string { + const mapping: { [key in VersionType]: string } = { + old_alpha: 'Alpha', + old_beta: 'Beta', + release: 'Release', + snapshot: 'Snapshot', + }; + + return mapping[release]; +} + export function upperFirst(object: any): string { const str = object.toString(); return str.charAt(0).toUpperCase() + str.slice(1); @@ -17,12 +33,6 @@ export function abbreviateNumber(n: number) { return `${n}`; }; -export function getEnumMembers(obj: any): string[] { - return Object.keys(obj).filter((item) => { - return Number.isNaN(Number(item)); - }); -} - export function secondsToWords(seconds: number | bigint): string { const n = Number(seconds); @@ -43,8 +53,3 @@ export function secondsToWords(seconds: number | bigint): string { return `${n} seconds`; // Hmmmmmm } - -export default { - upperFirst, - abbreviateNumber, -}; diff --git a/apps/frontend/src/vite-env.d.ts b/apps/frontend/src/vite-env.d.ts index 11f02fe2..d2640c6c 100644 --- a/apps/frontend/src/vite-env.d.ts +++ b/apps/frontend/src/vite-env.d.ts @@ -1 +1,9 @@ /// + +import type { AttributifyAttributes } from 'unocss/preset-attributify'; + +declare module 'solid-js' { + namespace JSX { + interface HTMLAttributes extends AttributifyAttributes { } + } +} diff --git a/apps/frontend/tsconfig.json b/apps/frontend/tsconfig.json index 1f21bea5..6fe2122e 100644 --- a/apps/frontend/tsconfig.json +++ b/apps/frontend/tsconfig.json @@ -35,8 +35,6 @@ "include": [ "./src/**/*.ts", "./src/**/*.d.ts", - "./src/**/*.tsx", - "./src-isolation/**/*.ts", - "./*.ts" + "./src/**/*.tsx" ] } diff --git a/apps/frontend/vite.config.ts b/apps/frontend/vite.config.ts index 3840b435..310ad0eb 100644 --- a/apps/frontend/vite.config.ts +++ b/apps/frontend/vite.config.ts @@ -1,5 +1,3 @@ -/// - import process from 'node:process'; import type { UserConfig } from 'vite'; import { defineConfig, loadEnv } from 'vite'; @@ -41,11 +39,6 @@ export default defineConfig(async ({ mode }) => { ignored: ['**/src-tauri/**'], }, }, - - test: { - globals: true, - reporters: ['dot'], - }, }; return config; diff --git a/apps/frontend/vitest.config.ts b/apps/frontend/vitest.config.ts new file mode 100644 index 00000000..ae577334 --- /dev/null +++ b/apps/frontend/vitest.config.ts @@ -0,0 +1,3 @@ +import shared from '../../shared.config'; + +export default shared`frontend`.vitest; diff --git a/changelogithub.config.ts b/changelogithub.config.ts new file mode 100644 index 00000000..290c5a89 --- /dev/null +++ b/changelogithub.config.ts @@ -0,0 +1,18 @@ +// define the `changelogithub` configuration so we can automatically generate +// changelogs with github actions upon each `pnpm release`. +export default { + types: { + chore: { title: '🔨 Chores' }, + feature: { title: '✨ Features' }, + fix: { title: '🐞 Bug Fixes' }, + perf: { title: '🏎 Performance' }, + refactor: { title: '♻️ Refactors' }, + test: { title: '✅ Tests' }, + style: { title: '🎨 Stylistic' }, + doc: { title: '📝 Docs' }, + deps: { title: '📦 Dependencies' }, + deploy: { title: '🚀 Deployments' }, + wip: { title: '🚧 Experiments' }, + }, + capitalize: false, +}; diff --git a/eslint.config.js b/eslint.config.js index dca9294f..9b8c6185 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -10,6 +10,7 @@ export default petal({ 'toml/padding-line-between-pairs': 'off', }, }, + gitignore: true, ignores: [ '**/target', '**/dist', diff --git a/package.json b/package.json index 871e1e8d..8689b1ac 100644 --- a/package.json +++ b/package.json @@ -3,16 +3,18 @@ "type": "module", "version": "1.0.0-alpha.1", "private": true, + "engineStrict": true, "packageManager": "pnpm@9.6.0", "description": "Next-generation open source Minecraft launcher and tools for interacting with Polyfrost", "license": "GPL-3.0-only", + "homepage": "https://polyfrost.org", "repository": { "type": "git", - "url": "git@github.com:polyfrost/onelauncher" - }, - "bugs": { - "url": "https://github.com/polyfrost/onelauncher/issues" + "url": "git@github.com:polyfrost/onelauncher", + "directory": "/" }, + "bugs": "https://github.com/polyfrost/onelauncher/issues", + "sideEffects": false, "engines": { "pnpm": "9.6.0", "npm": "pnpm", @@ -20,29 +22,44 @@ "node": ">=18" }, "scripts": { + "build": "pnpm --filter=./* run build", + "dev": "pnpm --filter=./* run dev", + "start": "pnpm --filter=./* run start", + "test": "pnpm test:vi && pnpm --filter=./* run test", + "format": "pnpm format:es && pnpm format:rs", + "lint": "pnpm lint:es && pnpm lint:rs", + "frontend": "pnpm --filter @onelauncher/frontend -- ", "client": "pnpm --filter @onelauncher/client -- ", "desktop": "pnpm --filter @onelauncher/desktop -- ", "core": "cd packages/core && cargo", "testing": "cd apps/testing && cargo", "tauri": "cd apps/desktop && cargo", - "format": "pnpm format:es && pnpm format:rs", - "lint": "pnpm lint:es && pnpm lint:rs", + + "test:vi": "pnpm vitest run", + "test:update": "pnpm vitest -u", + "test:ui": "pnpm vitest --ui", "lint:es": "eslint . --cache", "format:es": "pnpm lint:es --fix", "lint:rs": "cargo +nightly fmt --check && cargo clippy -- -D warnings", "format:rs": "cargo +nightly fmt && cargo clippy --fix", "release:node": "bumpp -r" }, + "workspaces": { + "packages": [ + "packages/*", + "apps/*" + ] + }, "devDependencies": { "@flowr/eslint-config": "^3.10.2", - "@types/node": "^22.0.2", + "@types/node": "^22.1.0", "@vitest/ui": "^2.0.5", - "bumpp": "^9.4.1", + "bumpp": "^9.4.2", "eslint": "^9.8.0", "eslint-plugin-solid": "^0.14.1", "ts-node": "^10.9.2", - "tsx": "^4.16.4", + "tsx": "~4.16.5", "typescript": "^5.5.4", "vite": "^5.3.5", "vitest": "^2.0.5" diff --git a/packages/client/package.json b/packages/client/package.json index f160091a..ac134ed9 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -19,7 +19,7 @@ "@rspc/solid-query": "^0.2.3", "@rspc/tauri": "^0.2.0", "@solid-primitives/deep": "^0.2.9", - "@tanstack/solid-query": "^5.51.16", + "@tanstack/solid-query": "^5.51.21", "fast-equals": "^5.0.1", "plausible-tracker": "^0.3.9", "solid-js": "^1.8.19", diff --git a/packages/client/vitest.config.ts b/packages/client/vitest.config.ts new file mode 100644 index 00000000..5cadef5b --- /dev/null +++ b/packages/client/vitest.config.ts @@ -0,0 +1,3 @@ +import shared from '../../shared.config'; + +export default shared`client`.vitest; diff --git a/packages/core/src/api/proxy/mod.rs b/packages/core/src/api/proxy/mod.rs index 2dbb5c81..09877df4 100644 --- a/packages/core/src/api/proxy/mod.rs +++ b/packages/core/src/api/proxy/mod.rs @@ -15,7 +15,7 @@ pub use utils::*; static PROXY_STATE: OnceCell> = OnceCell::const_new(); pub struct ProxyState { #[cfg(feature = "tauri")] - pub app: tauri::AppHandle, + pub app: tauri::AppHandle, pub ingress_feeds: RwLock>, } @@ -88,11 +88,11 @@ impl Drop for IngressId { impl ProxyState { #[cfg(feature = "tauri")] - pub async fn initialize(app: tauri::AppHandle) -> crate::Result> { + pub async fn initialize(handle: &tauri::AppHandle) -> crate::Result> { PROXY_STATE .get_or_try_init(|| async { Ok(Arc::new(Self { - app, + app: handle.clone(), ingress_feeds: RwLock::new(HashMap::new()), })) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18e6512d..27d02e30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,16 +10,16 @@ importers: devDependencies: '@flowr/eslint-config': specifier: ^3.10.2 - version: 3.10.2(@unocss/eslint-plugin@0.61.9(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-solid@0.14.1(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-vue@9.27.0(eslint@9.8.0))(eslint-processor-vue-blocks@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8))(vue-eslint-parser@9.4.3(eslint@9.8.0)) + version: 3.10.2(@unocss/eslint-plugin@0.61.9(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-solid@0.14.1(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-vue@9.27.0(eslint@9.8.0))(eslint-processor-vue-blocks@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8))(vue-eslint-parser@9.4.3(eslint@9.8.0)) '@types/node': - specifier: ^22.0.2 - version: 22.0.2 + specifier: ^22.1.0 + version: 22.1.0 '@vitest/ui': specifier: ^2.0.5 version: 2.0.5(vitest@2.0.5) bumpp: - specifier: ^9.4.1 - version: 9.4.1 + specifier: ^9.4.2 + version: 9.4.2 eslint: specifier: ^9.8.0 version: 9.8.0 @@ -28,19 +28,19 @@ importers: version: 0.14.1(eslint@9.8.0)(typescript@5.5.4) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.0.2)(typescript@5.5.4) + version: 10.9.2(@types/node@22.1.0)(typescript@5.5.4) tsx: - specifier: ^4.16.4 - version: 4.16.4 + specifier: ~4.16.5 + version: 4.16.5 typescript: specifier: ^5.5.4 version: 5.5.4 vite: specifier: ^5.3.5 - version: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + version: 5.3.5(@types/node@22.1.0)(sass@1.77.8) vitest: specifier: ^2.0.5 - version: 2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8) + version: 2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8) apps/desktop: dependencies: @@ -77,7 +77,7 @@ importers: version: 0.2.3 '@rspc/solid-query': specifier: ^0.2.3 - version: 0.2.3(@tanstack/solid-query@5.51.16(solid-js@1.8.19))(solid-js@1.8.19) + version: 0.2.3(@tanstack/solid-query@5.51.21(solid-js@1.8.19))(solid-js@1.8.19) '@rspc/tauri': specifier: ^0.2.0 version: 0.2.0(@tauri-apps/api@2.0.0-beta.16) @@ -88,8 +88,8 @@ importers: specifier: ^0.14.1 version: 0.14.1(solid-js@1.8.19) '@tanstack/solid-query': - specifier: ^5.51.16 - version: 5.51.16(solid-js@1.8.19) + specifier: ^5.51.21 + version: 5.51.21(solid-js@1.8.19) '@tauri-apps/api': specifier: 2.0.0-beta.16 version: 2.0.0-beta.16 @@ -97,8 +97,8 @@ importers: specifier: github:tauri-apps/tauri-plugin-clipboard-manager#v2 version: https://codeload.github.com/tauri-apps/tauri-plugin-clipboard-manager/tar.gz/20e84cfbdebcd86bb1854846feb0aaff4481fbd0 '@tauri-apps/plugin-dialog': - specifier: 2.0.0-beta.8 - version: 2.0.0-beta.8 + specifier: github:tauri-apps/tauri-plugin-dialog#v2 + version: https://codeload.github.com/tauri-apps/tauri-plugin-dialog/tar.gz/f83833c5445948c1b2f022e3c530ca48be9f8768 '@tauri-apps/plugin-shell': specifier: github:tauri-apps/tauri-plugin-shell#v2 version: https://codeload.github.com/tauri-apps/tauri-plugin-shell/tar.gz/5cc36dadeaad0520111c6f5e32ecdbbae7cb1311 @@ -120,6 +120,9 @@ importers: overlayscrollbars-solid: specifier: ^0.5.5 version: 0.5.5(overlayscrollbars@2.10.0)(solid-js@1.8.19) + pathe: + specifier: ^1.1.2 + version: 1.1.2 solid-js: specifier: ^1.8.19 version: 1.8.19 @@ -150,16 +153,16 @@ importers: version: 1.77.8 unocss: specifier: ^0.61.9 - version: 0.61.9(postcss@8.4.40)(rollup@4.19.2)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + version: 0.61.9(postcss@8.4.40)(rollup@4.19.2)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) vite-plugin-solid: specifier: ^2.10.2 - version: 2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.19)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + version: 2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.19)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) vite-plugin-solid-svg: specifier: ^0.8.1 - version: 0.8.1(solid-js@1.8.19)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + version: 0.8.1(solid-js@1.8.19)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.4)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + version: 4.3.2(typescript@5.5.4)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) apps/testing: {} @@ -170,16 +173,16 @@ importers: version: 0.2.3 '@rspc/solid-query': specifier: ^0.2.3 - version: 0.2.3(@tanstack/solid-query@5.51.16(solid-js@1.8.19))(solid-js@1.8.19) + version: 0.2.3(@tanstack/solid-query@5.51.21(solid-js@1.8.19))(solid-js@1.8.19) '@rspc/tauri': specifier: ^0.2.0 - version: 0.2.0(@tauri-apps/api@2.0.0-beta.16) + version: 0.2.0(@tauri-apps/api@2.0.0-rc.0) '@solid-primitives/deep': specifier: ^0.2.9 version: 0.2.9(solid-js@1.8.19) '@tanstack/solid-query': - specifier: ^5.51.16 - version: 5.51.16(solid-js@1.8.19) + specifier: ^5.51.21 + version: 5.51.21(solid-js@1.8.19) fast-equals: specifier: ^5.0.1 version: 5.0.1 @@ -1187,22 +1190,22 @@ packages: '@tanstack/query-core@5.51.1': resolution: {integrity: sha512-fJBMQMpo8/KSsWW5ratJR5+IFr7YNJ3K2kfP9l5XObYHsgfVy1w3FJUWU4FT2fj7+JMaEg33zOcNDBo0LMwHnw==} - '@tanstack/query-core@5.51.16': - resolution: {integrity: sha512-zfV+WAtBGm1dUIbL0w/x8qTqVLKU1/Bo1p19J9LF02MmIc4FxzMImMXhFzYJQl5Hx8Wit6RiQ4tB/DvN8y9zaQ==} + '@tanstack/query-core@5.51.21': + resolution: {integrity: sha512-POQxm42IUp6n89kKWF4IZi18v3fxQWFRolvBA6phNVmA8psdfB1MvDnGacCJdS+EOX12w/CyHM62z//rHmYmvw==} - '@tanstack/solid-query@5.51.16': - resolution: {integrity: sha512-jQpTqNzmtMuNM1hgJRZoPitsGRbh0d254rRRlpK60zUb0avQpY4n+BdHRRnLWi/PrJ/HPYj4WId1C/5ZkxDztg==} + '@tanstack/solid-query@5.51.21': + resolution: {integrity: sha512-ZwiTMpownN5qwEZE7UB7ccfGkbzSECkZOv/P1+SQ+dKchNtkF9sA0Zz8IVnr6lgqumkCwS8M65ciBdzI0JfTAQ==} peerDependencies: solid-js: ^1.6.0 - '@tauri-apps/api@2.0.0-beta.15': - resolution: {integrity: sha512-H9w6iISmR+NvH4XuyCZB4zDN10tf9RFt6i/9JHEjaRhAowdAaJ+oiXq/3kedizNClHMtbTQ5j0oqDVPkZDAI8g==} - engines: {node: '>= 18.18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - '@tauri-apps/api@2.0.0-beta.16': resolution: {integrity: sha512-YGjkR9HxS/YyIoqoXDkk8o9Yy5NW6u9YxzeqEodwwOUoeS0nac6mzLTW3VYIuSelHmyUQCgbyENVY6e5CJXA4Q==} engines: {node: '>= 18.18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + '@tauri-apps/api@2.0.0-rc.0': + resolution: {integrity: sha512-v454Qs3REHc3Za59U+/eSmBsdmF+3NE5+76+lFDaitVqN4ZglDHENDaMARYKGJVZuxiSkzyqG0SeG7lLQjVkPA==} + engines: {node: '>= 18.18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + '@tauri-apps/cli-darwin-arm64@2.0.0-beta.23': resolution: {integrity: sha512-Ppt76xF2SeXdkzgYdIo/UZwkvj76G33MCX9ouqqIlTVqj1FUWYLnHqUh9iCbav98NI3WzhMpNtxzRJq++7/qmw==} engines: {node: '>= 10'} @@ -1272,8 +1275,9 @@ packages: resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-clipboard-manager/tar.gz/20e84cfbdebcd86bb1854846feb0aaff4481fbd0} version: 2.1.0-beta.6 - '@tauri-apps/plugin-dialog@2.0.0-beta.8': - resolution: {integrity: sha512-6iVhEBceWYLUgX6ygBc4/yJ1o/D4YwgoAGt7ebFUTjEyIhp79PeFtE8OTjdyJbtVOc6bAcDeAn4+pbWtSw9/4w==} + '@tauri-apps/plugin-dialog@https://codeload.github.com/tauri-apps/tauri-plugin-dialog/tar.gz/f83833c5445948c1b2f022e3c530ca48be9f8768': + resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-dialog/tar.gz/f83833c5445948c1b2f022e3c530ca48be9f8768} + version: 2.0.0-rc.0 '@tauri-apps/plugin-shell@https://codeload.github.com/tauri-apps/tauri-plugin-shell/tar.gz/5cc36dadeaad0520111c6f5e32ecdbbae7cb1311': resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-shell/tar.gz/5cc36dadeaad0520111c6f5e32ecdbbae7cb1311} @@ -1351,8 +1355,8 @@ packages: '@types/node@20.14.10': resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} - '@types/node@22.0.2': - resolution: {integrity: sha512-yPL6DyFwY5PiMVEwymNeqUTKsDczQBJ/5T7W/46RwLU/VH+AA8aT5TZkvBviLKLbbm0hlfftEkGrNzfRk/fofQ==} + '@types/node@22.1.0': + resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1762,8 +1766,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - bumpp@9.4.1: - resolution: {integrity: sha512-kzhp/LpNX0HkUpEyLd7sU2LTN/mbAVgcxJ1Zi2cAJTE/tul6rypSKGpH8UywDpzKWItL8LVdKsIFnwmylw0+7g==} + bumpp@9.4.2: + resolution: {integrity: sha512-D0Cb5Mgxei7PObv4FkKQ19v1qSRhA3buQqCEQW6EU4+iort7JxL06DC6bZG5E0x/euZkaBuAQqOtFd2zIJKPjA==} engines: {node: '>=10'} hasBin: true @@ -1773,8 +1777,13 @@ packages: peerDependencies: esbuild: '>=0.18' - c12@1.10.0: - resolution: {integrity: sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==} + c12@1.11.1: + resolution: {integrity: sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg==} + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -2562,10 +2571,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true @@ -2772,12 +2777,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} - - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} - mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} @@ -2829,8 +2828,8 @@ packages: nwsapi@2.2.12: resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} - nypm@0.3.8: - resolution: {integrity: sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==} + nypm@0.3.9: + resolution: {integrity: sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -2959,9 +2958,6 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pkg-types@1.1.0: - resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} - pkg-types@1.1.3: resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} @@ -3343,8 +3339,8 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tsx@4.16.4: - resolution: {integrity: sha512-E0EDobc7FtOxdNtG0ZQWztLa9PK/TqC5QvdV0heyIMJySwcJ8vyvziOznzO1MIM2IDfacLGBgfiCUmba6mvI7Q==} + tsx@4.16.5: + resolution: {integrity: sha512-ArsiAQHEW2iGaqZ8fTA1nX0a+lN5mNTyuGRRO6OW3H/Yno1y9/t1f9YOI1Cfoqz63VAthn++ZYcbDP7jPflc+A==} engines: {node: '>=18.0.0'} hasBin: true @@ -3373,9 +3369,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -3385,8 +3378,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.11.1: - resolution: {integrity: sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==} + undici-types@6.13.0: + resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} undici@6.19.5: resolution: {integrity: sha512-LryC15SWzqQsREHIOUybavaIHF5IoL0dJ9aWWxL/PgT1KfqAW5225FZpDUFlt9xiDMS2/S7DOKhFWA7RLksWdg==} @@ -4173,7 +4166,7 @@ snapshots: '@eslint/object-schema@2.1.4': {} - '@flowr/eslint-config@3.10.2(@unocss/eslint-plugin@0.61.9(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-solid@0.14.1(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-vue@9.27.0(eslint@9.8.0))(eslint-processor-vue-blocks@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8))(vue-eslint-parser@9.4.3(eslint@9.8.0))': + '@flowr/eslint-config@3.10.2(@unocss/eslint-plugin@0.61.9(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-solid@0.14.1(eslint@9.8.0)(typescript@5.5.4))(eslint-plugin-vue@9.27.0(eslint@9.8.0))(eslint-processor-vue-blocks@0.1.2(eslint@9.8.0))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8))(vue-eslint-parser@9.4.3(eslint@9.8.0))': dependencies: '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 @@ -4196,7 +4189,7 @@ snapshots: eslint-plugin-toml: 0.11.1(eslint@9.8.0) eslint-plugin-unicorn: 55.0.0(eslint@9.8.0) eslint-plugin-unused-imports: 4.0.1(@typescript-eslint/eslint-plugin@8.0.0-alpha.41(@typescript-eslint/parser@8.0.0-alpha.41(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.41(@typescript-eslint/parser@8.0.0-alpha.41(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.41(@typescript-eslint/parser@8.0.0-alpha.41(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)) eslint-plugin-yml: 1.14.0(eslint@9.8.0) find-up: 7.0.0 globals: 15.8.0 @@ -4407,11 +4400,11 @@ snapshots: '@rspc/client': 0.2.3 '@tanstack/query-core': 5.51.1 - '@rspc/solid-query@0.2.3(@tanstack/solid-query@5.51.16(solid-js@1.8.19))(solid-js@1.8.19)': + '@rspc/solid-query@0.2.3(@tanstack/solid-query@5.51.21(solid-js@1.8.19))(solid-js@1.8.19)': dependencies: '@rspc/client': 0.2.3 '@rspc/query-core': 0.2.3(@rspc/client@0.2.3) - '@tanstack/solid-query': 5.51.16(solid-js@1.8.19) + '@tanstack/solid-query': 5.51.21(solid-js@1.8.19) solid-js: 1.8.19 '@rspc/tauri@0.2.0(@tauri-apps/api@2.0.0-beta.16)': @@ -4419,6 +4412,11 @@ snapshots: '@rspc/client': 0.2.0 '@tauri-apps/api': 2.0.0-beta.16 + '@rspc/tauri@0.2.0(@tauri-apps/api@2.0.0-rc.0)': + dependencies: + '@rspc/client': 0.2.0 + '@tauri-apps/api': 2.0.0-rc.0 + '@sec-ant/readable-stream@0.4.1': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -4511,17 +4509,17 @@ snapshots: '@tanstack/query-core@5.51.1': {} - '@tanstack/query-core@5.51.16': {} + '@tanstack/query-core@5.51.21': {} - '@tanstack/solid-query@5.51.16(solid-js@1.8.19)': + '@tanstack/solid-query@5.51.21(solid-js@1.8.19)': dependencies: - '@tanstack/query-core': 5.51.16 + '@tanstack/query-core': 5.51.21 solid-js: 1.8.19 - '@tauri-apps/api@2.0.0-beta.15': {} - '@tauri-apps/api@2.0.0-beta.16': {} + '@tauri-apps/api@2.0.0-rc.0': {} + '@tauri-apps/cli-darwin-arm64@2.0.0-beta.23': optional: true @@ -4569,9 +4567,9 @@ snapshots: dependencies: '@tauri-apps/api': 2.0.0-beta.16 - '@tauri-apps/plugin-dialog@2.0.0-beta.8': + '@tauri-apps/plugin-dialog@https://codeload.github.com/tauri-apps/tauri-plugin-dialog/tar.gz/f83833c5445948c1b2f022e3c530ca48be9f8768': dependencies: - '@tauri-apps/api': 2.0.0-beta.16 + '@tauri-apps/api': 2.0.0-rc.0 '@tauri-apps/plugin-shell@https://codeload.github.com/tauri-apps/tauri-plugin-shell/tar.gz/5cc36dadeaad0520111c6f5e32ecdbbae7cb1311': dependencies: @@ -4666,9 +4664,9 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.0.2': + '@types/node@22.1.0': dependencies: - undici-types: 6.11.1 + undici-types: 6.13.0 '@types/normalize-package-data@2.4.4': {} @@ -4916,13 +4914,13 @@ snapshots: '@typescript-eslint/types': 8.0.0-alpha.55 eslint-visitor-keys: 3.4.3 - '@unocss/astro@0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8))': + '@unocss/astro@0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8))': dependencies: '@unocss/core': 0.61.9 '@unocss/reset': 0.61.9 - '@unocss/vite': 0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + '@unocss/vite': 0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) optionalDependencies: - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color @@ -5072,7 +5070,7 @@ snapshots: dependencies: '@unocss/core': 0.61.9 - '@unocss/vite@0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8))': + '@unocss/vite@0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.0(rollup@4.19.2) @@ -5084,7 +5082,7 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.11 - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) transitivePeerDependencies: - rollup - supports-color @@ -5128,7 +5126,7 @@ snapshots: pathe: 1.1.2 sirv: 2.0.4 tinyrainbow: 1.2.0 - vitest: 2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8) + vitest: 2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8) '@vitest/utils@2.0.5': dependencies: @@ -5239,35 +5237,37 @@ snapshots: builtin-modules@3.3.0: {} - bumpp@9.4.1: + bumpp@9.4.2: dependencies: '@jsdevtools/ez-spawn': 3.0.4 - c12: 1.10.0 + c12: 1.11.1 cac: 6.7.14 escalade: 3.1.2 fast-glob: 3.3.2 js-yaml: 4.1.0 prompts: 2.4.2 semver: 7.6.3 + transitivePeerDependencies: + - magicast bundle-require@5.0.0(esbuild@0.23.0): dependencies: esbuild: 0.23.0 load-tsconfig: 0.2.5 - c12@1.10.0: + c12@1.11.1: dependencies: chokidar: 3.6.0 confbox: 0.1.7 defu: 6.1.4 dotenv: 16.4.5 giget: 1.2.3 - jiti: 1.21.0 - mlly: 1.7.0 + jiti: 1.21.6 + mlly: 1.7.1 ohash: 1.1.3 pathe: 1.1.2 perfect-debounce: 1.0.0 - pkg-types: 1.1.0 + pkg-types: 1.1.3 rc9: 2.1.2 cac@6.7.14: {} @@ -5728,13 +5728,13 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.0.0-alpha.41(@typescript-eslint/parser@8.0.0-alpha.41(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.41(@typescript-eslint/parser@8.0.0-alpha.41(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.41(@typescript-eslint/parser@8.0.0-alpha.41(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)(vitest@2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8)): dependencies: '@typescript-eslint/utils': 7.17.0(eslint@9.8.0)(typescript@5.5.4) eslint: 9.8.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 8.0.0-alpha.41(@typescript-eslint/parser@8.0.0-alpha.41(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) - vitest: 2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8) + vitest: 2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8) transitivePeerDependencies: - supports-color - typescript @@ -5994,7 +5994,7 @@ snapshots: consola: 3.2.3 defu: 6.1.4 node-fetch-native: 1.6.4 - nypm: 0.3.8 + nypm: 0.3.9 ohash: 1.1.3 pathe: 1.1.2 tar: 6.2.1 @@ -6097,7 +6097,7 @@ snapshots: jiti-v1: jiti@1.21.6 pathe: 1.1.2 pkg-types: 1.1.3 - tsx: 4.16.4 + tsx: 4.16.5 transitivePeerDependencies: - supports-color @@ -6162,8 +6162,6 @@ snapshots: isexe@2.0.0: {} - jiti@1.21.0: {} - jiti@1.21.6: {} jiti@2.0.0-beta.2: {} @@ -6358,20 +6356,6 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.6.1: - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 - - mlly@1.7.0: - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.0 - ufo: 1.5.3 - mlly@1.7.1: dependencies: acorn: 8.12.1 @@ -6418,13 +6402,14 @@ snapshots: nwsapi@2.2.12: {} - nypm@0.3.8: + nypm@0.3.9: dependencies: citty: 0.1.6 consola: 3.2.3 execa: 8.0.1 pathe: 1.1.2 - ufo: 1.5.3 + pkg-types: 1.1.3 + ufo: 1.5.4 ofetch@1.3.4: dependencies: @@ -6541,12 +6526,6 @@ snapshots: picomatch@4.0.2: {} - pkg-types@1.1.0: - dependencies: - confbox: 0.1.7 - mlly: 1.6.1 - pathe: 1.1.2 - pkg-types@1.1.3: dependencies: confbox: 0.1.7 @@ -6910,14 +6889,14 @@ snapshots: dependencies: typescript: 5.5.4 - ts-node@10.9.2(@types/node@22.0.2)(typescript@5.5.4): + ts-node@10.9.2(@types/node@22.1.0)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.0.2 + '@types/node': 22.1.0 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 @@ -6934,7 +6913,7 @@ snapshots: tslib@2.6.3: {} - tsx@4.16.4: + tsx@4.16.5: dependencies: esbuild: 0.21.5 get-tsconfig: 4.7.6 @@ -6956,8 +6935,6 @@ snapshots: typescript@5.5.4: {} - ufo@1.5.3: {} - ufo@1.5.4: {} unconfig@0.5.5: @@ -6970,7 +6947,7 @@ snapshots: undici-types@5.26.5: {} - undici-types@6.11.1: {} + undici-types@6.13.0: {} undici@6.19.5: {} @@ -6982,9 +6959,9 @@ snapshots: universalify@0.2.0: {} - unocss@0.61.9(postcss@8.4.40)(rollup@4.19.2)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)): + unocss@0.61.9(postcss@8.4.40)(rollup@4.19.2)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)): dependencies: - '@unocss/astro': 0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + '@unocss/astro': 0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) '@unocss/cli': 0.61.9(rollup@4.19.2) '@unocss/core': 0.61.9 '@unocss/extractor-arbitrary-variants': 0.61.9 @@ -7003,9 +6980,9 @@ snapshots: '@unocss/transformer-compile-class': 0.61.9 '@unocss/transformer-directives': 0.61.9 '@unocss/transformer-variant-group': 0.61.9 - '@unocss/vite': 0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + '@unocss/vite': 0.61.9(rollup@4.19.2)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) optionalDependencies: - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) transitivePeerDependencies: - postcss - rollup @@ -7040,13 +7017,13 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-node@2.0.5(@types/node@22.0.2)(sass@1.77.8): + vite-node@2.0.5(@types/node@22.1.0)(sass@1.77.8): dependencies: cac: 6.7.14 debug: 4.3.6 pathe: 1.1.2 tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) transitivePeerDependencies: - '@types/node' - less @@ -7057,13 +7034,13 @@ snapshots: - supports-color - terser - vite-plugin-solid-svg@0.8.1(solid-js@1.8.19)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)): + vite-plugin-solid-svg@0.8.1(solid-js@1.8.19)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)): dependencies: solid-js: 1.8.19 svgo: 3.3.2 - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) - vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.19)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)): + vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.8)(solid-js@1.8.19)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)): dependencies: '@babel/core': 7.24.9 '@types/babel__core': 7.20.5 @@ -7071,39 +7048,39 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.8.19 solid-refresh: 0.6.3(solid-js@1.8.19) - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) - vitefu: 0.2.5(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) + vitefu: 0.2.5(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)) optionalDependencies: '@testing-library/jest-dom': 6.4.8 transitivePeerDependencies: - supports-color - vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)): + vite-tsconfig-paths@4.3.2(typescript@5.5.4)(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)): dependencies: debug: 4.3.5 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.5.4) optionalDependencies: - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) transitivePeerDependencies: - supports-color - typescript - vite@5.3.5(@types/node@22.0.2)(sass@1.77.8): + vite@5.3.5(@types/node@22.1.0)(sass@1.77.8): dependencies: esbuild: 0.21.5 postcss: 8.4.40 rollup: 4.19.0 optionalDependencies: - '@types/node': 22.0.2 + '@types/node': 22.1.0 fsevents: 2.3.3 sass: 1.77.8 - vitefu@0.2.5(vite@5.3.5(@types/node@22.0.2)(sass@1.77.8)): + vitefu@0.2.5(vite@5.3.5(@types/node@22.1.0)(sass@1.77.8)): optionalDependencies: - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) - vitest@2.0.5(@types/node@22.0.2)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8): + vitest@2.0.5(@types/node@22.1.0)(@vitest/ui@2.0.5)(jsdom@24.1.1)(sass@1.77.8): dependencies: '@ampproject/remapping': 2.3.0 '@vitest/expect': 2.0.5 @@ -7121,11 +7098,11 @@ snapshots: tinybench: 2.8.0 tinypool: 1.0.0 tinyrainbow: 1.2.0 - vite: 5.3.5(@types/node@22.0.2)(sass@1.77.8) - vite-node: 2.0.5(@types/node@22.0.2)(sass@1.77.8) + vite: 5.3.5(@types/node@22.1.0)(sass@1.77.8) + vite-node: 2.0.5(@types/node@22.1.0)(sass@1.77.8) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.0.2 + '@types/node': 22.1.0 '@vitest/ui': 2.0.5(vitest@2.0.5) jsdom: 24.1.1 transitivePeerDependencies: diff --git a/shared.config.ts b/shared.config.ts new file mode 100644 index 00000000..a9ddf6cc --- /dev/null +++ b/shared.config.ts @@ -0,0 +1,14 @@ +import { defineProject as defineVitestConfig } from 'vitest/config'; + +export function shared(name: TemplateStringsArray) { + return { + vitest: defineVitestConfig({ + test: { + globals: true, + name: name[0]!, + }, + }), + }; +} + +export default shared; diff --git a/tsconfig.json b/tsconfig.json index e1ef8bed..a78023c1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { - "types": ["vitest/globals", "vite/client"] + "types": ["vitest/globals", "vite/client", "node"] } } diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 00000000..f78cc8cc --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,6 @@ +import { defineWorkspace } from 'vitest/config'; + +export default defineWorkspace([ + 'packages/client/vitest.config.ts', + 'apps/frontend/vitest.config.ts', +]);