Skip to content

Commit

Permalink
feat: add blazor template (#656)
Browse files Browse the repository at this point in the history
  • Loading branch information
jimmy-mll committed Apr 23, 2024
1 parent 14b6042 commit 4edb69f
Show file tree
Hide file tree
Showing 20 changed files with 691 additions and 3 deletions.
6 changes: 6 additions & 0 deletions .changes/blazor.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"create-tauri-app": minor
"create-tauri-app-js": minor
---

Add Blazor template
10 changes: 8 additions & 2 deletions .github/workflows/templates-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,19 @@ jobs:
with:
node-version: 18

- name: Install .NET@8.0.x
if: matrix.settings.manager == 'dotnet'
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x

- uses: dtolnay/rust-toolchain@stable

- run: cargo install tauri-cli
if: matrix.settings.manager == 'cargo' && matrix.settings.beta != true
if: (matrix.settings.manager == 'cargo' || matrix.settings.manager == 'dotnet') && matrix.settings.beta != true

- run: cargo install tauri-cli --version '^2.0.0-beta'
if: matrix.settings.manager == 'cargo' && matrix.settings.beta == true
if: (matrix.settings.manager == 'cargo' || matrix.settings.manager == 'dotnet') && matrix.settings.beta == true

- run: |
rustup target add wasm32-unknown-unknown
Expand Down
6 changes: 6 additions & 0 deletions .scripts/generate-templates-matrix.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ const matrixConfig = [
run_cmd: "bun run",
templates: nodeJsTemplates,
},
{
manager: "dotnet",
install_cmd: "",
run_cmd: "cargo",
templates: ["blazor"],
},
];

const outMatrix = [];
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ Currently supported template presets include:
- `yew`
- `leptos`
- `sycamore`
- `blazor`

You can use `.` for the project name to scaffold in the current directory.

Expand Down
1 change: 1 addition & 0 deletions node/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ Currently supported template presets include:
- `yew`
- `leptos`
- `sycamore`
- `blazor`

You can use `.` for the project name to scaffold in the current directory.

Expand Down
5 changes: 4 additions & 1 deletion src/category.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::package_manager::PackageManager;
pub enum Category {
Rust,
JsTs,
Dotnet,
}
impl Default for Category {
fn default() -> Self {
Expand All @@ -15,7 +16,7 @@ impl Default for Category {
}

impl<'a> Category {
pub const ALL: &'a [Self] = &[Category::JsTs, Category::Rust];
pub const ALL: &'a [Self] = &[Category::JsTs, Category::Rust, Category::Dotnet];

pub const fn package_managers(&self) -> &[PackageManager] {
match self {
Expand All @@ -26,6 +27,7 @@ impl<'a> Category {
PackageManager::Npm,
PackageManager::Bun,
],
Category::Dotnet => &[PackageManager::Dotnet],
}
}
}
Expand All @@ -42,6 +44,7 @@ impl Display for Category {
match self {
Category::Rust => write!(f, "Rust - ({managers})"),
Category::JsTs => write!(f, "TypeScript / JavaScript - ({managers})"),
Category::Dotnet => write!(f, ".NET - ({managers})"),
}
}
}
14 changes: 14 additions & 0 deletions src/deps.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,14 @@ fn is_xcode_command_line_tools_installed() -> bool {
.unwrap_or(false)
}

fn is_dotnet_installed() -> bool {
Command::new("dotnet")
.arg("--version")
.output()
.map(|o| o.status.success())
.unwrap_or(false)
}

struct Dep<'a> {
name: &'a str,
instruction: String,
Expand Down Expand Up @@ -281,6 +289,12 @@ pub fn print_missing_deps(pkg_manager: PackageManager, template: Template, beta:
exists: &is_xcode_command_line_tools_installed,
skip: false,
},
Dep {
name: ".NET",
instruction: format!("Visit {BLUE}{BOLD}https://dotnet.microsoft.com/download{RESET}"),
exists: &is_dotnet_installed,
skip: !template.needs_dotnet() || pkg_manager.is_node(),
}
];

let missing_deps: Vec<(&str, &str)> = deps
Expand Down
7 changes: 7 additions & 0 deletions src/package_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub enum PackageManager {
Yarn,
Npm,
Bun,
Dotnet,
}

impl Default for PackageManager {
Expand All @@ -30,6 +31,7 @@ impl Display for PackageManager {
PackageManager::Yarn => write!(f, "yarn"),
PackageManager::Npm => write!(f, "npm"),
PackageManager::Bun => write!(f, "bun"),
PackageManager::Dotnet => write!(f, "dotnet"),
}
}
}
Expand All @@ -43,6 +45,7 @@ impl FromStr for PackageManager {
"yarn" => Ok(PackageManager::Yarn),
"npm" => Ok(PackageManager::Npm),
"bun" => Ok(PackageManager::Bun),
"dotnet" => Ok(PackageManager::Dotnet),
_ => Err(format!(
"{YELLOW}{s}{RESET} is not a valid package manager. Valid package mangers are [{}]",
PackageManager::ALL
Expand All @@ -62,6 +65,7 @@ impl<'a> PackageManager {
PackageManager::Yarn,
PackageManager::Npm,
PackageManager::Bun,
PackageManager::Dotnet,
];

/// Node.js managers
Expand Down Expand Up @@ -94,6 +98,7 @@ impl PackageManager {
Template::Angular,
Template::Preact,
],
PackageManager::Dotnet => &[Template::Blazor],
}
}

Expand Down Expand Up @@ -123,6 +128,7 @@ impl PackageManager {
Template::Preact,
Template::PreactTs,
],
PackageManager::Dotnet => &[Template::Blazor],
}
}

Expand All @@ -143,6 +149,7 @@ impl PackageManager {
PackageManager::Yarn => "yarn",
PackageManager::Npm => "npm run",
PackageManager::Bun => "bun run",
PackageManager::Dotnet => "cargo",
}
}

Expand Down
39 changes: 39 additions & 0 deletions src/template.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ pub enum Template {
Angular,
Preact,
PreactTs,
Blazor,
}

impl Default for Template {
Expand Down Expand Up @@ -82,6 +83,7 @@ impl Display for Template {
Template::Angular => write!(f, "angular"),
Template::Preact => write!(f, "preact"),
Template::PreactTs => write!(f, "preact-ts"),
Template::Blazor => write!(f, "blazor"),
}
}
}
Expand All @@ -106,6 +108,7 @@ impl FromStr for Template {
"angular" => Ok(Template::Angular),
"preact" => Ok(Template::Preact),
"preact-ts" => Ok(Template::PreactTs),
"blazor" => Ok(Template::Blazor),
_ => Err(format!(
"{YELLOW}{s}{RESET} is not a valid template. Valid templates are [{}]",
Template::ALL
Expand All @@ -131,6 +134,9 @@ impl Template {
Template::Sycamore => "Sycamore - (https://sycamore-rs.netlify.app/)",
Template::Angular => "Angular - (https://angular.dev/)",
Template::Preact => "Preact - (https://preactjs.com/)",
Template::Blazor => {
"Blazor - (https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor/)"
}
_ => unreachable!(),
}
}
Expand All @@ -154,6 +160,7 @@ impl<'a> Template {
Template::Angular,
Template::Preact,
Template::PreactTs,
Template::Blazor,
];

pub fn flavors<'b>(&self, pkg_manager: PackageManager) -> Option<&'b [Flavor]> {
Expand Down Expand Up @@ -220,6 +227,7 @@ impl<'a> Template {
| Template::Preact
| Template::PreactTs => PackageManager::NODE,
Template::Yew | Template::Leptos | Template::Sycamore => &[PackageManager::Cargo],
Template::Blazor => &[PackageManager::Dotnet],
}
}

Expand All @@ -234,6 +242,10 @@ impl<'a> Template {
)
}

pub const fn needs_dotnet(&self) -> bool {
matches!(self, Template::Blazor)
}

pub const fn needs_wasm32_target(&self) -> bool {
matches!(self, Template::Sycamore | Template::Yew | Template::Leptos)
}
Expand All @@ -256,13 +268,16 @@ impl<'a> Template {
let manifest = Manifest::parse(&manifest_str, mobile)?;

let lib_name = format!("{}_lib", package_name.replace('-', "_"));
let project_name_pascal_case = Self::transform_to_pascal_case(project_name.to_string());

let beta_str = beta.to_string();
let manifest_template_data: HashMap<&str, &str> = [
("beta", beta_str.as_str()),
("pkg_manager_run_command", pkg_manager.run_cmd()),
("lib_name", &lib_name),
("package_name", package_name),
("project_name", project_name),
("project_name_pascal_case", &project_name_pascal_case),
(
"double_dash_with_space",
if pkg_manager == PackageManager::Npm {
Expand All @@ -279,6 +294,10 @@ impl<'a> Template {
("beta", beta_str.clone()),
("mobile", mobile.to_string()),
("project_name", project_name.to_string()),
(
"project_name_pascal_case",
project_name_pascal_case.to_string(),
),
("package_name", package_name.to_string()),
(
"before_dev_command",
Expand Down Expand Up @@ -376,6 +395,8 @@ impl<'a> Template {
(data, file_name)
};

let file_name = lte::render(file_name, template_data)?;

let parent = p.parent().unwrap();
fs::create_dir_all(parent)?;
fs::write(parent.join(file_name), file_data)?;
Expand Down Expand Up @@ -423,4 +444,22 @@ impl<'a> Template {

Ok(())
}

fn transform_to_pascal_case(s: String) -> String {
let mut result = String::new();
let mut capitalize_next = false;
for (s, c) in s.chars().enumerate() {
if s == 0 {
result.push(c.to_ascii_uppercase());
} else if capitalize_next {
result.push(c.to_ascii_uppercase());
capitalize_next = false;
} else if ['_', '-'].contains(&c) {
capitalize_next = true;
} else {
result.push(c);
}
}
result
}
}
9 changes: 9 additions & 0 deletions templates/template-blazor/.manifest
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
beforeDevCommand = dotnet watch run --project src/{% project_name_pascal_case %}.csproj
beforeBuildCommand = dotnet publish -c release src/{% project_name_pascal_case %}.csproj -o dist
devPath = http://localhost:1420
distDir = ../dist/wwwroot
withGlobalTauri = true

[files]
styles.css = src/wwwroot/css/app.css
tauri.svg = src/wwwroot/img/tauri.svg

0 comments on commit 4edb69f

Please sign in to comment.