Rustelo/resources/nickel/routes/defaults.ncl

143 lines
4 KiB
Text
Raw Normal View History

2026-07-18 20:16:16 +01:00
# Route Configuration Defaults and Helpers
#
# Provides shared default values and helper functions for route creation.
# Reduces duplication by providing common patterns.
let contracts = import "contracts.ncl" in
{
# Base route with common defaults
# Use this as foundation via merge operator (&)
# Note: | default = allows overriding via merge
base_route = {
enabled | default = true,
generate_boilerplate_only | default = false,
replace_existing_boilerplate | default = false,
show_in_sitemap | default = true,
menu_group | default = "main",
priority | default = 0.8,
is_external | default = false,
component_dynamic | default = false,
content_type_param | default = false,
keywords | default = [],
lang_prefixes | default = [],
menu_order | default = 999,
},
# Helper function: Create a route with minimal required fields
#
# Usage:
# make_route "Home" "/" "en"
# & { priority = 1.0, menu_icon = "home", ... }
#
# Parameters:
# comp_name: Component name (e.g., "Home", "About")
# url_path: URL path (e.g., "/", "/about")
# lang: Language code (e.g., "en", "es")
#
# Returns: Route record with defaults + generated keys
make_route
| String -> String -> String -> Dyn
= fun comp_name url_path lang =>
base_route & {
component = comp_name,
path = url_path,
language = lang,
# Auto-generate title/description keys from component name (| default = allows override)
title_key | default = "%{std.string.lowercase comp_name}-page-title",
description_key | default = "%{std.string.lowercase comp_name}-page-description",
},
# Helper function: Create a content route (blog, portfolio, etc.)
#
# Usage:
# make_content_route "ContentIndex" "/blog" "en" "blog"
# & { menu_icon = "book", ... }
#
# Parameters:
# comp_name: Component name
# url_path: URL path
# lang: Language code
# ctype: Content type (e.g., "blog", "portfolio")
#
# Returns: Route record with content-specific settings
make_content_route
| String -> String -> String -> String -> Dyn
= fun comp_name url_path lang ctype =>
make_route comp_name url_path lang & {
component_dynamic = true,
content_type_param = true,
props = {
content_type = ctype,
use_categories = true,
use_feature = true,
},
},
# Helper function: Create an admin route (protected)
#
# Usage:
# make_admin_route "AdminDashboard" "/admin" "en"
# & { menu_icon = "shield", ... }
#
# Parameters:
# comp_name: Component name
# url_path: URL path
# lang: Language code
#
# Returns: Route record with admin-specific settings
make_admin_route
| String -> String -> String -> Dyn
= fun comp_name url_path lang =>
make_route comp_name url_path lang & {
menu_group = "admin",
show_in_sitemap = false,
priority = 0.3,
},
# Helper function: Create an external link route
#
# Usage:
# make_external_link "GitHub" "https://github.com" "en"
# & { menu_icon = "external", ... }
#
# Parameters:
# lbl: Display label
# ext_url: External URL
# lang: Language code
#
# Returns: Route record for external links
make_external_link
| String -> String -> String -> Dyn
= fun lbl ext_url lang =>
base_route & {
component = "ExternalLink",
path = ext_url,
language = lang,
title_key = lbl,
description_key = lbl,
is_external = true,
show_in_sitemap = false,
},
# Common menu orders for consistency
menu_orders = {
home = 1,
about = 2,
services = 3,
portfolio = 4,
blog = 5,
contact = 10,
admin = 100,
},
# Common priorities for SEO
priorities = {
critical = 1.0, # Home page
high = 0.9, # Main pages (About, Services)
normal = 0.8, # Content pages (Blog posts)
low = 0.5, # Archive, Tags
minimal = 0.3, # Admin, Login
},
}