Compare commits

..

6 Commits

Author SHA1 Message Date
Valerio Ageno 3de9d1be66 feat: update version to v0.1.4 2024-06-15 21:04:37 +02:00
Valerio Ageno 00916f188d Merge pull request #3 from Valerioageno/enable-template-in-tuono-new
[tuono new] Enable --template flag
2024-06-15 21:01:08 +02:00
Valerio Ageno fff5f92893 doc: update examples READMEs 2024-06-15 21:02:10 +02:00
Valerio Ageno 8b796fc1f4 doc: update tutorial doc 2024-06-15 20:59:07 +02:00
Valerio Ageno 5ac679785b feat(tuono new): support --template arg 2024-06-15 20:55:19 +02:00
Valerio Ageno 38b6cc8c65 fix: broken icons in readme tree 2024-06-15 14:36:09 +02:00
13 changed files with 91 additions and 56 deletions
+8 -8
View File
@@ -61,14 +61,14 @@ tuono dev
## Folder structure
```
├── package.json
├── public
├── src
│ ├── routes
│ └── styles
├── Cargo.toml
├── README.md
└── tsconfig.json
├── package.json
├── public
├── src
│ ├── routes
│ └── styles
├── Cargo.toml
├── README.md
└── tsconfig.json
```
## License
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "tuono"
version = "0.1.3"
version = "0.1.4"
edition = "2021"
authors = ["V. Ageno <valerioageno@yahoo.it>"]
description = "The react/rust fullstack framework"
+13 -3
View File
@@ -15,7 +15,14 @@ enum Actions {
/// Build the production assets
Build,
/// Scaffold a new project
New { folder_name: Option<String> },
New {
/// The folder in which load the project. Default is the current directory.
folder_name: Option<String>,
/// The template to use to scaffold the project. The template should match one of the tuono
/// examples
#[arg(short, long)]
template: Option<String>,
},
}
#[derive(Parser, Debug)]
@@ -46,8 +53,11 @@ pub fn cli() -> std::io::Result<()> {
let mut vite_build = Command::new("./node_modules/.bin/tuono-build-prod");
let _ = &vite_build.output()?;
}
Actions::New { folder_name } => {
scaffold_project::create_new_project(folder_name);
Actions::New {
folder_name,
template,
} => {
scaffold_project::create_new_project(folder_name, template);
}
}
+22 -15
View File
@@ -38,12 +38,11 @@ fn create_file(path: PathBuf, content: String) -> std::io::Result<()> {
Ok(())
}
pub fn create_new_project(folder_name: Option<String>) {
pub fn create_new_project(folder_name: Option<String>, template: Option<String>) {
let folder = folder_name.unwrap_or(".".to_string());
if folder != "." {
create_dir(&folder).unwrap();
}
// In case of missing select the tuono example
let template = template.unwrap_or("tuono".to_string());
let client = blocking::Client::builder()
.user_agent("")
@@ -60,21 +59,25 @@ pub fn create_new_project(folder_name: Option<String>) {
let new_project_files = res
.tree
.iter()
.filter(|GithubFile { path, .. }| {
// TODO: Handle custom example download by CLI argument --template
if path.starts_with("examples/tuono/") {
return true;
}
false
})
.filter(|GithubFile { path, .. }| path.starts_with(&format!("examples/{template}/")))
.collect::<Vec<&GithubFile>>();
if new_project_files.is_empty() {
println!("Template not found: {template}");
return;
}
if folder != "." {
create_dir(&folder).unwrap();
}
let folder_name = PathBuf::from(&folder);
let current_dir = env::current_dir().expect("Failed to get current working directory");
let folder_path = current_dir.join(folder_name);
create_directories(&new_project_files, &folder_path).expect("Failed to create directories");
create_directories(&new_project_files, &folder_path, &template)
.expect("Failed to create directories");
for GithubFile {
element_type, path, ..
@@ -88,7 +91,7 @@ pub fn create_new_project(folder_name: Option<String>) {
.text()
.expect("Failed to parse the repo structure");
let path = PathBuf::from(&path.replace("examples/tuono/", ""));
let path = PathBuf::from(&path.replace(&format!("examples/{template}/"), ""));
let file_path = folder_path.join(&path);
@@ -101,13 +104,17 @@ pub fn create_new_project(folder_name: Option<String>) {
outro(folder);
}
fn create_directories(new_project_files: &Vec<&GithubFile>, folder_path: &Path) -> io::Result<()> {
fn create_directories(
new_project_files: &[&GithubFile],
folder_path: &Path,
template: &String,
) -> io::Result<()> {
for GithubFile {
element_type, path, ..
} in new_project_files.iter()
{
if let GithubFileType::Tree = element_type {
let path = PathBuf::from(&path.replace("examples/tuono/", ""));
let path = PathBuf::from(&path.replace(&format!("examples/{template}/"), ""));
let dir_path = folder_path.join(&path);
create_dir(&dir_path).unwrap();
+2 -1
View File
@@ -54,6 +54,8 @@ async fn main() {
.with_state(fetch);
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
println!("\nDevelopment app ready at http://localhost:3000/");
axum::serve(listener, app).await.unwrap();
}
@@ -240,7 +242,6 @@ pub fn bundle_axum_source() -> io::Result<()> {
pub fn check_tuono_folder() -> io::Result<()> {
let dev_folder = Path::new(DEV_FOLDER);
if !&dev_folder.is_dir() {
println!("exists");
fs::create_dir(dev_folder)?;
}
+1 -1
View File
@@ -54,7 +54,7 @@ pub async fn watch() -> Result<()> {
run_server.start().await;
println!("\nDevelopment app ready at http://localhost:3000/");
build_ssr_bundle.to_wait().await;
let wx = Watchexec::new(move |mut action| {
let mut should_reload = false;
+2 -2
View File
@@ -1,6 +1,6 @@
[package]
name = "tuono_lib"
version = "0.1.3"
version = "0.1.4"
edition = "2021"
authors = ["V. Ageno <valerioageno@yahoo.it>"]
description = "The react/rust fullstack framework"
@@ -24,5 +24,5 @@ serde = { version = "1.0.202", features = ["derive"] }
erased-serde = "0.4.5"
serde_json = "1.0"
tuono_lib_macros = {path = "../tuono_lib_macros", version = "0.1.3"}
tuono_lib_macros = {path = "../tuono_lib_macros", version = "0.1.4"}
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "tuono_lib_macros"
version = "0.1.3"
version = "0.1.4"
edition = "2021"
description = "The react/rust fullstack framework"
homepage = "https://github.com/Valerioageno/tuono"
+23 -22
View File
@@ -4,23 +4,22 @@ This tutorial is meant for giving you a sneak peek of the framework and is inten
The first part is about the project setup and the base knowledge needed to work with tuono. The actual tutorial starts at [Tutorial introduction](#tutorial-introduction).
> If you prefer to see directly the final outcome check out the [tutorial source](https://github.com/Valerioageno/tuono/tree/main/examples/tutorial).
> If you have already installed the tuono CLI you can download the tutorial source with `tuono new tuono-tutorial --template tutorial`
## Table of Content
* [Tuono tutorial](#tuono-tutorial)
* [Installation](#installation)
* [Project scaffold](#project-scaffold)
* [Start the dev environment](#start-the-dev-environment)
* [The “/” route](#the--route)
* [Tutorial introduction](#tutorial-introduction)
* [Fetch all the pokemons](#fetch-all-the-pokemons)
* [Create a stand-alone component](#create-a-stand-alone-component)
* [Create the /pokemons/[pokemon] route](#create-the-pokemonspokemon-route)
* [Error handling](#error-handling)
* [Conclusion](#conclusion)
* [CLI Installation](#cli-installation)
* [Project scaffold](#project-scaffold)
* [Start the dev environment](#start-the-dev-environment)
* [The “/” route](#the--route)
* [Tutorial introduction](#tutorial-introduction)
* [Fetch all the pokemons](#fetch-all-the-pokemons)
* [Create a stand-alone component](#create-a-stand-alone-component)
* [Create the /pokemons/[pokemon] route](#create-the-pokemonspokemon-route)
* [Error handling](#error-handling)
* [Conclusion](#conclusion)
## Installation
## CLI Installation
The tuono CLI is hosted on [crates.io](https://crates.io/crates/tuono); to download and install it just run on a terminal:
@@ -34,9 +33,11 @@ To check that is correctly installed run:
$ tuono --version
```
Run `tuono -h` to see all the available commands.
## Project scaffold
To setup a new project you just need to run the following command:
To setup a new fresh project you just need to run the following command:
```bash
$ tuono new tuono-tutorial
@@ -53,14 +54,14 @@ Open it with your favourite code editor.
The project will have the following structure:
```
├── package.json
├── public
├── src
│ ├── routes
│ └── styles
├── Cargo.toml
├── README.md
└── tsconfig.json
├── package.json
├── public
├── src
│ ├── routes
│ └── styles
├── Cargo.toml
├── README.md
└── tsconfig.json
```
**public/**: put here all the files you want to be public
+10
View File
@@ -7,3 +7,13 @@ To simply scaffold the base project run in your terminal:
```shell
$ tuono new [NAME]
```
You can install any example included in this folder by just using the `--template` flag:
```shell
$ tuono new [NAME] --template [TEMPLATE]
```
`[TEMPLATE]` is the folder name.
+6
View File
@@ -1,3 +1,9 @@
# Tuono tutorial
This project is the outcome of the [tuono tutorial](https://github.com/Valerioageno/tuono/blob/main/docs/tutorial.md)
If you want to directly install it you can run:
```bash
$ tuono new my-project -t tutorial
```
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "tuono",
"version": "0.1.3",
"version": "0.1.4",
"description": "",
"main": "src/index.js",
"packageManager": "pnpm@9.1.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "tuono",
"version": "0.1.3",
"version": "0.1.4",
"description": "The react/rust fullstack framework",
"scripts": {
"dev": "vite build --watch",