🔨 chore: prepare for tauri rc

This commit is contained in:
Pauline 2024-08-03 08:39:12 +02:00
parent 7009f5db08
commit ee70456c48
No known key found for this signature in database
GPG key ID: 722BB181973296AE
40 changed files with 393 additions and 330 deletions

4
.gitignore vendored
View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -6,17 +6,16 @@ pub mod error;
pub mod ext;
#[derive(Clone, serde::Serialize)]
struct SingleInstancePayload {
pub struct SingleInstancePayload {
args: Vec<String>,
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<F: FnOnce(&mut tauri::App) + Send + 'static>(setup: F) {
pub async fn run_app<F: FnOnce(&tauri::AppHandle<tauri::Wry>) + Send + 'static>(
builder: tauri::Builder<tauri::Wry>,
setup: F,
) {
let prebuild = tauri_specta::Builder::<tauri::Wry>::new()
.commands(collect_commands!())
.events(collect_events!())
@ -51,7 +53,7 @@ pub async fn run_app<F: FnOnce(&mut tauri::App) + Send + 'static>(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<F: FnOnce(&mut tauri::App) + Send + 'static>(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<F: FnOnce(&mut tauri::App) + Send + 'static>(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<dyn std::error::Error>> {
let win = app.get_webview_window("main").unwrap();
fn setup(handle: &tauri::AppHandle) -> Result<(), Box<dyn std::error::Error>> {
let win = handle.get_webview_window("main").unwrap();
win.show().unwrap();
Ok(())

View file

@ -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": {

View file

@ -1,3 +0,0 @@
/dist-isolation
/coverage
/src/bindings.ts

View file

@ -1,17 +1,15 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<link rel="icon" type="image/svg+xml" href="/src/assets/logo.svg" />
<title>OneLauncher</title>
</head>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<link rel="icon" type="image/svg+xml" href="/src/assets/logo.svg" />
<title>OneLauncher</title>
</head>
<body>
<noscript>JavaScript is disabled, please contact support at <a href="https://polyfrost.org/discord">our Discord</a>!</noscript>
<div id="root" />
<script src="/src/index.tsx" type="module"></script>
</body>
<body>
<div id="root"></div>
<script type="module" src="/src/index.tsx"></script>
</body>
</html>

View file

@ -0,0 +1,10 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Isolation Secure Script</title>
</head>
<body>
<script src="index.js"></script>
</body>
</html>

View file

@ -1,4 +1,3 @@
// @ts-nocheck
window.__TAURI_ISOLATION_HOOK__ = (payload) => {
return payload;
};

View file

@ -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"

View file

@ -1,10 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Isolation Secure Script</title>
</head>
<body>
<script src="index.js"></script>
</body>
</html>

View file

@ -1,7 +0,0 @@
import type { AttributifyAttributes } from 'unocss/preset-attributify';
declare module 'solid-js' {
namespace JSX {
interface HTMLAttributes<T> extends AttributifyAttributes { }
}
}

View file

@ -0,0 +1,13 @@
export type WithIndex<T> = T & { index: number };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
type GrowToSize<T, N extends number, A extends T[]> = A['length'] extends N ? A : GrowToSize<T, N, [...A, T]>;
export type FixedArray<T, N extends number> = GrowToSize<T, N, []>;
// Get size of enum as a type - https://stackoverflow.com/a/68317984/23592613
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
type UnionToOvlds<U> = UnionToIntersection<U extends any ? (f: U) => void : never>;
type PopUnion<U> = UnionToOvlds<U> extends (a: infer A) => void ? A : never;
export type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;
export type UnionToArray<T, A extends unknown[] = []> = IsUnion<T> extends true ? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]> : [T, ...A];

View file

@ -1,24 +0,0 @@
declare namespace globalThis {
export type WithIndex<T> = T & { index: number }
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
type GrowToSize<T, N extends number, A extends T[]> = A['length'] extends N ? A : GrowToSize<T, N, [...A, T]>;
export type FixedArray<T, N extends number> = GrowToSize<T, N, []>;
// Get size of enum as a type - https://stackoverflow.com/a/68317984/23592613
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
type UnionToOvlds<U> = UnionToIntersection<U extends any ? (f: U) => void : never>;
type PopUnion<U> = UnionToOvlds<U> extends (a: infer A) => void ? A : never;
export type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;
export type UnionToArray<T, A extends unknown[] = []> = IsUnion<T> extends true ? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]> : [T, ...A];
// enum Example {
// how = "how",
// to = "to",
// count = "count",
// enum = "enum",
// entries = "entries"
// }
// type Result = UnionToArray<keyof typeof Example>['length'] // = 5
}

View file

@ -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 (
<GlobalContexts>

View file

@ -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';

View file

@ -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<boolean>;

View file

@ -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<CreateCluster>;
type PartialClusterUpdateFunc = <K extends keyof PartialCluster>(key: K, value: PartialCluster[K]) => any;

View file

@ -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;

View file

@ -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;

View file

@ -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<string, Cluster[]>;

View file

@ -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],
},
];

View file

@ -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() {

View file

@ -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';

View file

@ -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<string[]>((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('/');
}

View file

@ -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,
};

View file

@ -1 +1,9 @@
/// <reference types="vite/client" />
import type { AttributifyAttributes } from 'unocss/preset-attributify';
declare module 'solid-js' {
namespace JSX {
interface HTMLAttributes<T> extends AttributifyAttributes { }
}
}

View file

@ -35,8 +35,6 @@
"include": [
"./src/**/*.ts",
"./src/**/*.d.ts",
"./src/**/*.tsx",
"./src-isolation/**/*.ts",
"./*.ts"
"./src/**/*.tsx"
]
}

View file

@ -1,5 +1,3 @@
/// <reference types="vitest/config"/>
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;

View file

@ -0,0 +1,3 @@
import shared from '../../shared.config';
export default shared`frontend`.vitest;

18
changelogithub.config.ts Normal file
View file

@ -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,
};

View file

@ -10,6 +10,7 @@ export default petal({
'toml/padding-line-between-pairs': 'off',
},
},
gitignore: true,
ignores: [
'**/target',
'**/dist',

View file

@ -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"

View file

@ -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",

View file

@ -0,0 +1,3 @@
import shared from '../../shared.config';
export default shared`client`.vitest;

View file

@ -15,7 +15,7 @@ pub use utils::*;
static PROXY_STATE: OnceCell<Arc<ProxyState>> = OnceCell::const_new();
pub struct ProxyState {
#[cfg(feature = "tauri")]
pub app: tauri::AppHandle,
pub app: tauri::AppHandle<tauri::Wry>,
pub ingress_feeds: RwLock<HashMap<Uuid, Ingress>>,
}
@ -88,11 +88,11 @@ impl Drop for IngressId {
impl ProxyState {
#[cfg(feature = "tauri")]
pub async fn initialize(app: tauri::AppHandle) -> crate::Result<Arc<Self>> {
pub async fn initialize(handle: &tauri::AppHandle<tauri::Wry>) -> crate::Result<Arc<Self>> {
PROXY_STATE
.get_or_try_init(|| async {
Ok(Arc::new(Self {
app,
app: handle.clone(),
ingress_feeds: RwLock::new(HashMap::new()),
}))
})

259
pnpm-lock.yaml generated
View file

@ -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:

14
shared.config.ts Normal file
View file

@ -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;

View file

@ -1,6 +1,6 @@
{
"extends": "./tsconfig.base.json",
"compilerOptions": {
"types": ["vitest/globals", "vite/client"]
"types": ["vitest/globals", "vite/client", "node"]
}
}

6
vitest.workspace.ts Normal file
View file

@ -0,0 +1,6 @@
import { defineWorkspace } from 'vitest/config';
export default defineWorkspace([
'packages/client/vitest.config.ts',
'apps/frontend/vitest.config.ts',
]);