Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions devctl/commands/add.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@

import typer

from devctl.generators.scaffold_angular import generate_angular_resource
from devctl.generators.scaffold_spring import generate_spring_resource
from devctl.generators.scaffold_vue import generate_vue_resource
from devctl.generators.angular.scaffold import generate_angular_resource
from devctl.generators.spring.scaffold import generate_spring_resource
from devctl.generators.vue.scaffold import generate_vue_resource
from devctl.orchestrator.scanner import detect_environment

app = typer.Typer(help="Adds resources to the current project (Scaffolding).")
Expand Down
11 changes: 6 additions & 5 deletions devctl/commands/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@

import typer

# Angular generator
from devctl.generators.angular import generate_angular_boilerplate
# Angular Generator
from devctl.generators.angular.init import generate_angular_boilerplate

# Spring Generator
from devctl.generators.spring.init import download_spring_boilerplate
from devctl.generators.vue.init import generate_vue_boilerplate

# Spring generator
from devctl.generators.spring import download_spring_boilerplate
from devctl.generators.vue import generate_vue_boilerplate
from devctl.orchestrator.config_builder import generate_config
from devctl.utils.dependencies import check_tool

Expand Down
2 changes: 2 additions & 0 deletions devctl/generators/angular/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .init import generate_angular_boilerplate, setup_angular_environments
from .scaffold import generate_angular_resource, parse_ts_fields
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import subprocess

import typer
from jinja2 import Environment, FileSystemLoader
from devctl.utils.templates import get_jinja_env


def setup_angular_environments(project_path: str):
Expand All @@ -23,8 +23,7 @@ def setup_angular_environments(project_path: str):
os.makedirs(env_dir, exist_ok=True)

# 2. Template rendering via Jinja2
templates_dir = os.path.join(os.path.dirname(__file__), "..", "templates", "angular", "config")
env = Environment(loader=FileSystemLoader(templates_dir))
env = get_jinja_env("angular/config")

files_to_generate = {
"proxy.conf.json.j2": os.path.join(project_path, "src", "proxy.conf.json"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import os

import typer
from jinja2 import Environment, FileSystemLoader

from devctl.orchestrator.scanner import detect_environment
from devctl.utils.templates import get_jinja_env

# Dictionary mapping CLI types to TypeScript types
TS_TYPE_MAP = {
Expand Down Expand Up @@ -117,8 +117,7 @@ def generate_angular_resource(resource_name: str, fields_str: str, root_path: st
},
]

templates_dir = os.path.join(os.path.dirname(__file__), "..", "templates", "angular", "feature")
env = Environment(loader=FileSystemLoader(templates_dir))
env = get_jinja_env("angular/feature")

typer.secho(f"⚙️ Generating Angular feature '{entity_name}'...", fg=typer.colors.CYAN)

Expand Down
2 changes: 2 additions & 0 deletions devctl/generators/spring/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .init import patch_pom_xml, download_spring_boilerplate
from .scaffold import generate_spring_resource, generate_spring_security
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import requests
import typer

from devctl.generators.scaffold_spring import generate_spring_security
from devctl.generators.spring.scaffold import generate_spring_security


def patch_pom_xml(project_path: str):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
import os

import typer
from jinja2 import Environment, FileSystemLoader

from devctl.utils.templates import get_jinja_env

# Dictionary mapping CLI types to Java types
JAVA_TYPE_MAP = {
Expand Down Expand Up @@ -87,8 +88,7 @@ def generate_spring_resource(resource_name: str, fields_str: str):
{"dir": "mapper", "suffix": "Mapper", "template": "mapper/Mapper.java.j2"},
]

templates_dir = os.path.join(os.path.dirname(__file__), "..", "templates", "spring")
env = Environment(loader=FileSystemLoader(templates_dir))
env = get_jinja_env("spring")

typer.secho(
f"⚙️ Generating Spring resource '{entity_name}' (with MapStruct & DTOs)...",
Expand Down Expand Up @@ -143,8 +143,7 @@ def generate_spring_security(_root_path: str = "."):
os.makedirs(target_dir, exist_ok=True)

# Setup Jinja2
templates_dir = os.path.join(os.path.dirname(__file__), "..", "templates", "spring", "config")
env = Environment(loader=FileSystemLoader(templates_dir))
env = get_jinja_env("spring/config")

security_files = [
"JwtService.java",
Expand Down
2 changes: 2 additions & 0 deletions devctl/generators/vue/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .init import generate_vue_boilerplate, setup_vue_proxy, setup_vue_router
from .scaffold import generate_vue_resource
9 changes: 4 additions & 5 deletions devctl/generators/vue.py → devctl/generators/vue/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import subprocess

import typer
from jinja2 import Environment, FileSystemLoader

from devctl.utils.templates import get_jinja_env


def setup_vue_proxy(project_path: str):
Expand All @@ -16,8 +17,7 @@ def setup_vue_proxy(project_path: str):
"""
typer.secho("⚙️ Configuring Vite Proxy for Spring Boot...", fg=typer.colors.CYAN)

templates_dir = os.path.join(os.path.dirname(__file__), "..", "templates", "vue", "config")
env = Environment(loader=FileSystemLoader(templates_dir))
env = get_jinja_env("vue/config")

target_path = os.path.join(project_path, "vite.config.ts")

Expand Down Expand Up @@ -52,8 +52,7 @@ def setup_vue_router(project_path: str):
os.makedirs(router_dir, exist_ok=True)

# 3. Jinja2 template rendering
templates_dir = os.path.join(os.path.dirname(__file__), "..", "templates", "vue", "config")
env = Environment(loader=FileSystemLoader(templates_dir))
env = get_jinja_env("vue/config")

files_to_generate = {
"router.ts.j2": os.path.join(router_dir, "index.ts"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
import os

import typer
from jinja2 import Environment, FileSystemLoader, select_autoescape

from devctl.generators.scaffold_angular import parse_ts_fields
from devctl.generators.angular.scaffold import parse_ts_fields
from devctl.orchestrator.scanner import detect_environment
from devctl.utils.templates import get_jinja_env


def generate_vue_resource(resource_name: str, fields_str: str, root_path: str = "."):
Expand Down Expand Up @@ -68,11 +68,7 @@ def generate_vue_resource(resource_name: str, fields_str: str, root_path: str =
},
]

templates_dir = os.path.join(os.path.dirname(__file__), "..", "templates", "vue", "feature")
env = Environment(
loader=FileSystemLoader(templates_dir),
autoescape=select_autoescape(["html", "xml"]),
)
env = get_jinja_env("vue/feature")

typer.secho(f"⚙️ Generating Vue.js feature '{entity_name}'...", fg=typer.colors.CYAN)

Expand Down
21 changes: 21 additions & 0 deletions devctl/utils/templates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import os

Check notice

Code scanning / CodeQL

Unused import Note

Import of 'os' is not used.
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
from pathlib import Path
from jinja2 import Environment, FileSystemLoader


def get_jinja_env(template_subdir: str) -> Environment:
"""
Returns a Jinja2 environment for a specific template subdirectory.
"""
base_dir = Path(__file__).resolve().parent.parent / "templates"
template_path = base_dir / template_subdir

if not template_path.exists():
raise FileNotFoundError(f"Template directory not found: {template_path}")

return Environment(
loader=FileSystemLoader(str(template_path)),
trim_blocks=True,
lstrip_blocks=True,
keep_trailing_newline=True,

Check failure

Code scanning / CodeQL

Jinja2 templating with autoescape=False High

Using jinja2 templates with autoescape=False can potentially allow XSS attacks.
)
Comment on lines +16 to +21
Loading