Compare commits
2 commits
renovate/c
...
main
Author | SHA1 | Date | |
---|---|---|---|
2b4827715a | |||
80d34a065b |
13 changed files with 756 additions and 652 deletions
791
Cargo.lock
generated
791
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -11,11 +11,12 @@ edition.workspace = true
|
|||
|
||||
[dependencies]
|
||||
axum = { version = "0.8", features = ["http2"] }
|
||||
axum-controller = { version = "0.2.0", path = "../../axum-controller/axum-controller" }
|
||||
axum-controller-macros = { version = "0.2.0", path = "../../axum-controller/axum-controller-macros" }
|
||||
axum-typed-routing = { git = "https://github.com/jvdwrf/axum-typed-routing", version = "0.2.0" }
|
||||
datastar = { git = "https://github.com/starfederation/datastar.git", version = "0.1.0" }
|
||||
maud = { version = "0.27.0", features = ["axum"] }
|
||||
hypertext = { version = "0.6.0", features = ["axum"] }
|
||||
mime_guess = "2.0.5"
|
||||
minijinja = { version = "2.7.0", features = ["loader"] }
|
||||
rust-embed = { version = "8.5.0", features = ["axum", "compression"] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
tokio = { version = "1.43", features = ["full", "tracing"] }
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
* Planning (newest)
|
||||
- maud vs hypertext vs minijinja
|
||||
- try porting to hypertext ?
|
||||
- try porting to hypertext::maud !
|
||||
* Todos
|
||||
** Starter boilerplate
|
||||
*** [X] Server: Axum
|
||||
|
|
|
@ -1,57 +1,122 @@
|
|||
use std::sync::{Arc, Once};
|
||||
use std::sync::Once;
|
||||
|
||||
use axum::{
|
||||
body::Body,
|
||||
extract::State,
|
||||
http::{header, Response, StatusCode, Uri},
|
||||
response::{Html, IntoResponse},
|
||||
response::IntoResponse,
|
||||
routing::get,
|
||||
};
|
||||
use axum_typed_routing::{route, TypedRouter};
|
||||
use maud::{html, Markup};
|
||||
use axum_controller::*;
|
||||
use hypertext::{maud, GlobalAttributes, Renderable};
|
||||
use rust_embed::RustEmbed;
|
||||
|
||||
#[allow(unused)]
|
||||
#[route(GET "/item/:id?amount&offset")]
|
||||
async fn item_handler(
|
||||
id: u32,
|
||||
amount: Option<u32>,
|
||||
offset: Option<u32>,
|
||||
State(state): State<AppState>,
|
||||
// Json(json): Json<u32>,
|
||||
) -> Markup {
|
||||
// todo!("handle request")
|
||||
mod html_elements {
|
||||
use hypertext::elements;
|
||||
pub use hypertext::html_elements::*;
|
||||
|
||||
html! {
|
||||
h1 { "Item" }
|
||||
p {
|
||||
(format!("{id:?} {amount:?} {offset:?} {state:?}"))
|
||||
elements! {
|
||||
bla {
|
||||
blub
|
||||
}
|
||||
my_element {
|
||||
my_attribute
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We use a wildcard matcher ("/dist/*file") to match against everything
|
||||
// within our defined assets directory. This is the directory on our Asset
|
||||
// struct below, where folder = "examples/public/".
|
||||
#[route(GET "/dist/*path")]
|
||||
async fn static_handler(path: String, _: State<AppState>) -> impl IntoResponse {
|
||||
let path = path.trim_start_matches('/').to_string();
|
||||
struct TestController {}
|
||||
|
||||
StaticFile(path)
|
||||
#[controller(
|
||||
state = AppState
|
||||
)]
|
||||
impl TestController {
|
||||
#[route(GET "/")]
|
||||
async fn index(State(_): State<AppState>) -> impl IntoResponse {
|
||||
maud! {
|
||||
html lang="en" {
|
||||
head {
|
||||
meta charset="UTF-8";
|
||||
meta name="viewport" content="width=device-width, initial-scale=1.0";
|
||||
title {
|
||||
"My Website"
|
||||
}
|
||||
script type="module" src="/dist/datastar.min.js" {}
|
||||
link rel="stylesheet" href="/dist/styles.min.css";
|
||||
link rel="icon" href="/dist/favicon.ico";
|
||||
}
|
||||
body {
|
||||
main {
|
||||
h1 {
|
||||
"Welcome to My Website"
|
||||
}
|
||||
div."m-1" {
|
||||
"div"
|
||||
}
|
||||
div."m1" {
|
||||
"div"
|
||||
}
|
||||
div ."m1" {
|
||||
"m1"
|
||||
}
|
||||
div ."m2" {
|
||||
"m2"
|
||||
}
|
||||
div ."m3" {
|
||||
"m3"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.render()
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
#[route(GET "/item/:id?amount&offset")]
|
||||
async fn item_handler(
|
||||
id: u32,
|
||||
amount: Option<u32>,
|
||||
offset: Option<u32>,
|
||||
State(state): State<AppState>,
|
||||
// Json(json): Json<u32>,
|
||||
) -> impl IntoResponse {
|
||||
// todo!("handle request")
|
||||
|
||||
maud! {
|
||||
h1 { "Item" }
|
||||
p {
|
||||
(format!("{id:?} {amount:?} {offset:?} {state:?}"))
|
||||
}
|
||||
}
|
||||
.render()
|
||||
}
|
||||
}
|
||||
|
||||
fn markup_404(uri: String) -> Markup {
|
||||
html! {
|
||||
struct DistController;
|
||||
|
||||
#[controller(state=AppState, path="/dist")]
|
||||
impl DistController {
|
||||
#[route(GET "/*path")]
|
||||
async fn static_handler(path: String, _: State<AppState>) -> impl IntoResponse {
|
||||
let path = path.trim_start_matches('/').to_string();
|
||||
|
||||
StaticFile(path)
|
||||
}
|
||||
}
|
||||
|
||||
fn markup_404(uri: String) -> impl Renderable {
|
||||
maud! {
|
||||
h1 { "404" }
|
||||
p { (format!("{uri:?} Not Found")) }
|
||||
p { (uri) " Not Found" }
|
||||
@for i in 0..5 {
|
||||
div .{"m-" (i)} { (i) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn markup_405() -> Markup {
|
||||
html! {
|
||||
fn markup_405() -> impl Renderable {
|
||||
maud! {
|
||||
h1 { "404" }
|
||||
p { "Method not allowed!" }
|
||||
@for i in 1..3 {
|
||||
|
@ -62,17 +127,21 @@ fn markup_405() -> Markup {
|
|||
|
||||
// Finally, we use a fallback route for anything that didn't match.
|
||||
async fn handle_404(uri: Uri) -> impl IntoResponse {
|
||||
(StatusCode::NOT_FOUND, markup_404(format!("{uri:?}"))).into_response()
|
||||
(
|
||||
StatusCode::NOT_FOUND,
|
||||
axum::response::Html(markup_404(format!("{uri:?}")).render()),
|
||||
)
|
||||
.into_response()
|
||||
}
|
||||
|
||||
async fn handle_405() -> impl IntoResponse {
|
||||
(StatusCode::METHOD_NOT_ALLOWED, markup_405()).into_response()
|
||||
(
|
||||
StatusCode::METHOD_NOT_ALLOWED,
|
||||
axum::response::Html(markup_405().render()),
|
||||
)
|
||||
.into_response()
|
||||
}
|
||||
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "public/"]
|
||||
struct Asset;
|
||||
|
||||
pub struct StaticFile<T>(pub T);
|
||||
|
||||
impl<T> IntoResponse for StaticFile<T>
|
||||
|
@ -82,6 +151,9 @@ where
|
|||
fn into_response(self) -> Response<Body> {
|
||||
let path = self.0.into();
|
||||
tracing::debug!(?path);
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "public/"]
|
||||
struct Asset;
|
||||
|
||||
match Asset::get(path.as_str()) {
|
||||
Some(content) => {
|
||||
|
@ -89,7 +161,11 @@ where
|
|||
|
||||
([(header::CONTENT_TYPE, mime.as_ref())], content.data).into_response()
|
||||
}
|
||||
None => (StatusCode::NOT_FOUND, markup_404(path)).into_response(),
|
||||
None => (
|
||||
StatusCode::NOT_FOUND,
|
||||
axum::response::Html(markup_404(path).render()),
|
||||
)
|
||||
.into_response(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,182 +185,25 @@ pub fn initialize_logger() {
|
|||
});
|
||||
}
|
||||
|
||||
use minijinja::{Environment, Template};
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct AppState {
|
||||
_field: String,
|
||||
mj_env: Arc<minijinja::Environment<'static>>,
|
||||
}
|
||||
|
||||
#[route(GET "/")]
|
||||
async fn jinja_index_handler(state: State<AppState>) -> impl IntoResponse {
|
||||
RenderTemplate::new("/".to_string(), state.mj_env.clone())
|
||||
}
|
||||
|
||||
#[route(GET "/*path")]
|
||||
async fn jinja_index_handler_path(path: String, state: State<AppState>) -> impl IntoResponse {
|
||||
RenderTemplate::new(path, state.mj_env.clone())
|
||||
}
|
||||
|
||||
struct RenderTemplate {
|
||||
tmpl_name: String,
|
||||
env: Arc<Environment<'static>>,
|
||||
ctx: minijinja::Value,
|
||||
block: Option<String>,
|
||||
}
|
||||
|
||||
impl RenderTemplate {
|
||||
fn new(tmpl_name: String, env: Arc<Environment<'static>>) -> Self {
|
||||
Self {
|
||||
tmpl_name,
|
||||
env,
|
||||
ctx: minijinja::Value::from(()),
|
||||
block: None,
|
||||
}
|
||||
}
|
||||
|
||||
fn _new_with_ctx(
|
||||
tmpl_name: String,
|
||||
env: Arc<Environment<'static>>,
|
||||
ctx: minijinja::Value,
|
||||
) -> Self {
|
||||
Self {
|
||||
tmpl_name,
|
||||
env,
|
||||
ctx,
|
||||
block: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IntoResponse for RenderTemplate {
|
||||
fn into_response(self) -> axum::response::Response {
|
||||
let path = self.tmpl_name;
|
||||
let env = self.env;
|
||||
let ctx = self.ctx;
|
||||
let block = self.block;
|
||||
|
||||
let res = env.get_template(&path);
|
||||
|
||||
let render = move |template: Template| match block {
|
||||
None => match template.render(ctx) {
|
||||
Ok(html) => Html(html).into_response(),
|
||||
Err(_) => (
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"Failed to render template",
|
||||
)
|
||||
.into_response(),
|
||||
},
|
||||
Some(block) => match template.eval_to_state(ctx).unwrap().render_block(&block) {
|
||||
Ok(html) => Html(html).into_response(),
|
||||
Err(_) => (
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
"Failed to render block template",
|
||||
)
|
||||
.into_response(),
|
||||
},
|
||||
};
|
||||
|
||||
match res {
|
||||
Ok(template) => render(template),
|
||||
Err(_) => {
|
||||
let template = env.get_template("404").unwrap();
|
||||
let html = render(template);
|
||||
(StatusCode::NOT_FOUND, html).into_response()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Template loader for embedded templates. Uses Symbol’s value as variable is void: rust-embed to embed templates into the binary.
|
||||
/// For input path example/template
|
||||
/// it looks up:
|
||||
/// - $template_dir/example/template/index.html
|
||||
/// - $template_dir/example/template.html
|
||||
///
|
||||
/// Instead of example/template
|
||||
/// any of:
|
||||
/// - example//template/
|
||||
/// - example/template///
|
||||
/// - example/template.html
|
||||
/// - example/template/index.html
|
||||
/// would also resolve to the same 2 templates above
|
||||
/// TODO Canonilize path with a middleware that redirects any weird variants to the canonical path?
|
||||
fn template_loader(name: &str) -> Result<Option<String>, minijinja::Error> {
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "src/templates/"]
|
||||
struct Templ;
|
||||
// lets extract the "clean path" (i.e. '.html' or '/index.html' suffix)
|
||||
let mut clean_path = name
|
||||
.to_string()
|
||||
.chars()
|
||||
.fold(String::new(), |mut acc, c| {
|
||||
if c == '/' && acc.chars().last() != Some('/') {
|
||||
acc.push(c);
|
||||
} else if c != '/' {
|
||||
acc.push(c);
|
||||
}
|
||||
|
||||
acc
|
||||
})
|
||||
.to_string();
|
||||
clean_path = clean_path
|
||||
.strip_suffix("index.html")
|
||||
.unwrap_or(&clean_path)
|
||||
.to_string();
|
||||
|
||||
clean_path = clean_path
|
||||
.strip_suffix(".html")
|
||||
.unwrap_or(&clean_path)
|
||||
.to_string();
|
||||
|
||||
let cleaned_path = clean_path.to_string();
|
||||
|
||||
let files_to_try = vec![
|
||||
format!("./{}.html", cleaned_path),
|
||||
format!("./{}/index.html", cleaned_path),
|
||||
];
|
||||
|
||||
let found_template = files_to_try.into_iter().find_map(|path| {
|
||||
tracing::info!(?path);
|
||||
match Templ::get(path.as_str()) {
|
||||
Some(content) => {
|
||||
let content = std::str::from_utf8(&content.data).unwrap().to_string();
|
||||
Some(content)
|
||||
}
|
||||
None => None,
|
||||
}
|
||||
});
|
||||
|
||||
Ok(found_template)
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
initialize_logger();
|
||||
|
||||
let mut mj_env = Environment::new();
|
||||
|
||||
mj_env.set_loader(template_loader);
|
||||
|
||||
let app_state = AppState {
|
||||
_field: "".to_string(),
|
||||
mj_env: Arc::new(mj_env),
|
||||
};
|
||||
|
||||
// TODO pick free port/config
|
||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:8000").await.unwrap();
|
||||
|
||||
let ui_router = axum::Router::new().typed_route(item_handler);
|
||||
|
||||
let router: axum::Router = axum::Router::new()
|
||||
// .route("/", get(jinja_index_handler))
|
||||
.merge(ui_router.clone())
|
||||
.nest("/ui", ui_router)
|
||||
.typed_route(jinja_index_handler)
|
||||
.typed_route(jinja_index_handler_path)
|
||||
.typed_route(static_handler)
|
||||
.merge(TestController::into_router(app_state.clone()))
|
||||
.merge(DistController::into_router(app_state.clone()))
|
||||
.fallback_service(get(handle_404))
|
||||
.method_not_allowed_fallback(handle_405)
|
||||
.with_state(app_state);
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
<h1>Not Found! </h1>
|
|
@ -1,4 +0,0 @@
|
|||
<h1>Def</h1>
|
||||
{% block sidebar %}
|
||||
"Sidebar test"
|
||||
{% endblock sidebar %}
|
|
@ -1,26 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>My Website</title>
|
||||
<!-- TODO!!!: Add favico -->
|
||||
<!-- <link rel="icon" href="./favicon.ico" type="image/x-icon"> -->
|
||||
<script type="module" src="/dist/datastar.min.js"></script>
|
||||
<link rel="stylesheet" href="/dist/styles.min.css">
|
||||
<link rel="icon" href="/dist/favicon.ico" />
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<h1>Welcome to My Website</h1>
|
||||
<div m-1>div</div>
|
||||
<div class="m-1">div</div>
|
||||
<div class="m1">div</div>
|
||||
<m1>m1</m1>
|
||||
<m2>m2</m2>
|
||||
<m3>m3</m3>
|
||||
</main>
|
||||
<!-- <script src="index.js"></script> -->
|
||||
</body>
|
||||
</html>
|
|
@ -1,25 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>My Website</title>
|
||||
<!-- TODO!!!: Add favico -->
|
||||
<!-- <link rel="icon" href="./favicon.ico" type="image/x-icon"> -->
|
||||
<script type="module" src="/dist/datastar.min.js"></script>
|
||||
<link rel="stylesheet" href="/dist/styles.min.css">
|
||||
<link rel="icon" href="/dist/favicon.ico" />
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<h1>Welcome to My Website</h1>
|
||||
<div m-1>div</div>
|
||||
<div class="m-1">div</div>
|
||||
<div class="m1">div</div>
|
||||
<m1>div</m1>
|
||||
</main>
|
||||
<!-- <script src="index.js"></script> -->
|
||||
</body>
|
||||
</html>
|
49
flake.lock
generated
49
flake.lock
generated
|
@ -5,11 +5,11 @@
|
|||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1735644329,
|
||||
"narHash": "sha256-tO3HrHriyLvipc4xr+Ewtdlo7wM1OjXNjlWRgmM7peY=",
|
||||
"lastModified": 1741473158,
|
||||
"narHash": "sha256-kWNaq6wQUbUMlPgw8Y+9/9wP0F8SHkjy24/mN3UAppg=",
|
||||
"owner": "numtide",
|
||||
"repo": "devshell",
|
||||
"rev": "f7795ede5b02664b57035b3b757876703e2c3eac",
|
||||
"rev": "7c9e793ebe66bcba8292989a68c0419b737a22a0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -23,11 +23,11 @@
|
|||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1735774679,
|
||||
"narHash": "sha256-soePLBazJk0qQdDVhdbM98vYdssfs3WFedcq+raipRI=",
|
||||
"lastModified": 1741352980,
|
||||
"narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "f2f7418ce0ab4a5309a4596161d154cfc877af66",
|
||||
"rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -64,16 +64,16 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1739180049,
|
||||
"narHash": "sha256-LjIIeMqGJVv6rHsnf5tWhejiysD3LIsOplwE+M3YeZg=",
|
||||
"lastModified": 1741373670,
|
||||
"narHash": "sha256-BPawysk5uWq9W4K/r+ZJr3AliPemVQqKOuSD7U4Px+Y=",
|
||||
"owner": "ggerganov",
|
||||
"repo": "llama.cpp",
|
||||
"rev": "d7b31a9d84297b493a61c9a8ee3a458e7ccc64a7",
|
||||
"rev": "7ab364390f92b0b8d83f69821a536b424838f3f8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "ggerganov",
|
||||
"ref": "b4681",
|
||||
"ref": "b4855",
|
||||
"repo": "llama.cpp",
|
||||
"type": "github"
|
||||
}
|
||||
|
@ -96,28 +96,31 @@
|
|||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1735774519,
|
||||
"narHash": "sha256-CewEm1o2eVAnoqb6Ml+Qi9Gg/EfNAxbRx1lANGVyoLI=",
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/NixOS/nixpkgs/archive/e9b51731911566bbf7e4895475a87fe06961de0b.tar.gz"
|
||||
"lastModified": 1740877520,
|
||||
"narHash": "sha256-oiwv/ZK/2FhGxrCkQkB83i7GnWXPPLzoqFHpDD3uYpk=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "147dee35aab2193b174e4c0868bd80ead5ce755c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"type": "tarball",
|
||||
"url": "https://github.com/NixOS/nixpkgs/archive/e9b51731911566bbf7e4895475a87fe06961de0b.tar.gz"
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1738758495,
|
||||
"narHash": "sha256-CZ8T4vP3ag2hwkpSZjatxJb55ouszvmnWw09qxGW9TU=",
|
||||
"lastModified": 1741379970,
|
||||
"narHash": "sha256-Wh7esNh7G24qYleLvgOSY/7HlDUzWaL/n4qzlBePpiw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ceaea203f3ae1787b1bd13f021f686391696fc5b",
|
||||
"rev": "36fd87baa9083f34f7f5027900b62ee6d09b1f2f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable-small",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
|
@ -170,11 +173,11 @@
|
|||
"nixpkgs": "nixpkgs_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1738290352,
|
||||
"narHash": "sha256-YKOHUmc0Clm4tMV8grnxYL4IIwtjTayoq/3nqk0QM7k=",
|
||||
"lastModified": 1741486734,
|
||||
"narHash": "sha256-3hrpyTLNmnJpioVT1DDoVgsp7fWYkuS3JWCtfHsX1rk=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "b031b584125d33d23a0182f91ddbaf3ab4880236",
|
||||
"rev": "d95582a900bd0e7e516ce3bed0503f742649fffb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
];
|
||||
};
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable-small";
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
rust-overlay.url = "github:oxalica/rust-overlay";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
|
@ -23,7 +23,7 @@
|
|||
flake = false;
|
||||
};
|
||||
llama-cpp = {
|
||||
url = "github:ggerganov/llama.cpp/b4681";
|
||||
url = "github:ggerganov/llama.cpp/b4855";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.flake-parts.follows = "flake-parts";
|
||||
};
|
||||
|
|
165
package-lock.json
generated
165
package-lock.json
generated
|
@ -1,14 +1,15 @@
|
|||
{
|
||||
"name": "oeko-mono",
|
||||
"name": "redvault-ai",
|
||||
"version": "0.1.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "oeko-mono",
|
||||
"name": "redvault-ai",
|
||||
"version": "0.1.1",
|
||||
"license": "AGPL",
|
||||
"devDependencies": {
|
||||
"@anthropic-ai/claude-code": "^0.2.35",
|
||||
"@starfederation/datastar": "^1.0.0-beta.7",
|
||||
"@tailwindcss/forms": "0.5.7",
|
||||
"@tailwindcss/typography": "0.5.10",
|
||||
|
@ -70,6 +71,26 @@
|
|||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@anthropic-ai/claude-code": {
|
||||
"version": "0.2.35",
|
||||
"resolved": "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-0.2.35.tgz",
|
||||
"integrity": "sha512-OTCLa2kvtbYJ2tDbKNxZ7N2kUMXGXTIzr5DW18zYSMMu5RpOLyL+A/DfKXNgcvri76ttttj7lcQRLmQ0pCqZDA==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "SEE LICENSE IN README.md",
|
||||
"bin": {
|
||||
"claude": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-darwin-arm64": "^0.33.5",
|
||||
"@img/sharp-linux-arm": "^0.33.5",
|
||||
"@img/sharp-linux-x64": "^0.33.5",
|
||||
"@img/sharp-win32-x64": "^0.33.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm": {
|
||||
"version": "0.18.20",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
|
||||
|
@ -490,6 +511,146 @@
|
|||
"mlly": "^1.7.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-darwin-arm64": {
|
||||
"version": "0.33.5",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
|
||||
"integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-darwin-arm64": "1.0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-darwin-arm64": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz",
|
||||
"integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-arm": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz",
|
||||
"integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-x64": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
|
||||
"integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-arm": {
|
||||
"version": "0.33.5",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz",
|
||||
"integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-arm": "1.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-x64": {
|
||||
"version": "0.33.5",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
|
||||
"integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-x64": "1.0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-win32-x64": {
|
||||
"version": "0.33.5",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz",
|
||||
"integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui": {
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"build-all": "npm run build-unocss & npm run build-bundle"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@anthropic-ai/claude-code": "^0.2.35",
|
||||
"@starfederation/datastar": "^1.0.0-beta.7",
|
||||
"@tailwindcss/forms": "0.5.7",
|
||||
"@tailwindcss/typography": "0.5.10",
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
[toolchain]
|
||||
channel = "nightly-2025-01-30"
|
||||
targets = [
|
||||
"x86_64-unknown-linux-gnu",
|
||||
"wasm32-unknown-unknown",
|
||||
"x86_64-pc-windows-msvc",
|
||||
]
|
||||
channel = "nightly-2025-03-01"
|
||||
components = [
|
||||
"cargo",
|
||||
"rustfmt",
|
||||
"rust-analyzer",
|
||||
"rust-src",
|
||||
"rustc-codegen-cranelift",
|
||||
"rustc-dev",
|
||||
"cargo",
|
||||
"rust-analyzer",
|
||||
"rust-src",
|
||||
"rustc-codegen-cranelift",
|
||||
"rustc-dev",
|
||||
"rustfmt",
|
||||
]
|
||||
profile = "default"
|
||||
targets = [
|
||||
"wasm32-unknown-unknown",
|
||||
"x86_64-pc-windows-msvc",
|
||||
"x86_64-unknown-linux-gnu",
|
||||
]
|
||||
|
|
Loading…
Add table
Reference in a new issue