Project updates from Template
This commit contains the latest updates from the generic Website template, which move the toolchain to Swift 6.4, gate analytics and structured data behind traits, and rework page routing: - Updated the Swift toolchain for all the package dependencies and the Website service to version 6.4. (345b305) - Adapted all the existing middlewares in the Infrastructure package to Swift 6.4. (26008df) - Moved test resource teardown in the Persistence and the Website library into defer blocks. (27984a9) - Gated analytics behind a trait and reworked structured data in the Infrastructure package. (c7d4769) - Enabled the Analytics trait in the Website service. (f6a6bbd) - Reworked page routing in the Website service. (d1cb2c1) - Gated the structured data features in the Infrastructure package behind a trait. (f0a8791) - Enabled the StructuredData trait of the Infrastructure package in the Website service. (bbfdeb3) - Fixed the asset pin and a build warning in the Dockerfile of the Website service. (6ed0f9b) The root README change in 345b305 was left out, as this project no longer carries that file. From d1cb2c1, the RootController rework was left out, as the prototype serves a session-aware landing page and routes its other pages through their own controllers; the view-event reporter was appended to the prototype's shared script instead. The prototype code was adapted to the stricter Swift 6.4 settings: `String(format:)` was swapped for safe formatting, the NoIndex middleware takes a `@concurrent` next handler, and the tests flagged by warnings-as-errors were tightened. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
326299fc35
commit
911424de24
57 files changed
+864
-273
No files matched your search
@@ -6,6 +6,8 @@ import Foundation
|
||||
/// A conforming page supplies its locale, its title, the stylesheets and scripts it needs, its head metadata, and its content; the protocol assembles the
|
||||
/// rest of the document around them: the viewport declaration, the summary, canonical, and social card tags, the structured data script, the analytics
|
||||
/// tracker script, and the metadata followed by the stylesheet links and the deferred script tags in the head, and the content as the body.
|
||||
///
|
||||
/// ``analytics`` requires the `Analytics` trait; ``structuredData``, the `StructuredData` trait.
|
||||
public protocol Page: HTMLDocument, Sendable {
|
||||
|
||||
// MARK: Associated types
|
||||
@@ -18,8 +20,10 @@ public protocol Page: HTMLDocument, Sendable {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
#if Analytics
|
||||
/// The analytics tracker embedded as a deferred script in the document head, or `nil` (the default) to omit it.
|
||||
var analytics: Analytics? { get }
|
||||
#endif
|
||||
|
||||
/// The version token appended to the page's asset URLs, or `nil` to leave them unversioned.
|
||||
var assetVersion: String? { get }
|
||||
@@ -48,8 +52,10 @@ public protocol Page: HTMLDocument, Sendable {
|
||||
/// to omit them.
|
||||
var socialCard: SocialCard? { get }
|
||||
|
||||
#if StructuredData
|
||||
/// The page's structured data, rendered as a JSON-LD script in the document head, or `nil` (the default) to omit it.
|
||||
var structuredData: StructuredData? { get }
|
||||
#endif
|
||||
|
||||
/// The stylesheets linked in the document head, in order.
|
||||
var stylesheets: [any Asset] { get }
|
||||
@@ -94,6 +100,7 @@ public extension Page {
|
||||
.content("width=device-width, initial-scale=1")
|
||||
)
|
||||
|
||||
#if Analytics
|
||||
// Rendered first so the cross-origin handshake starts before the parser reaches the tracker script tag.
|
||||
if let origin = analytics?.origin {
|
||||
link(
|
||||
@@ -101,6 +108,7 @@ public extension Page {
|
||||
.href(origin)
|
||||
)
|
||||
}
|
||||
#endif
|
||||
|
||||
if let summary {
|
||||
meta(
|
||||
@@ -128,6 +136,7 @@ public extension Page {
|
||||
}
|
||||
}
|
||||
|
||||
#if StructuredData
|
||||
if let structuredData {
|
||||
script(.custom(
|
||||
name: "type",
|
||||
@@ -136,7 +145,9 @@ public extension Page {
|
||||
HTMLRaw(structuredData.payload)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if Analytics
|
||||
if let analytics {
|
||||
script(
|
||||
.defer,
|
||||
@@ -160,6 +171,7 @@ public extension Page {
|
||||
) {}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
metadata
|
||||
|
||||
@@ -184,20 +196,24 @@ public extension Page {
|
||||
}
|
||||
}
|
||||
|
||||
#if Analytics
|
||||
/// The analytics tracker is omitted unless the page provides one.
|
||||
var analytics: Analytics? {
|
||||
nil
|
||||
}
|
||||
#endif
|
||||
|
||||
/// The social card is omitted unless the page provides one.
|
||||
var socialCard: SocialCard? {
|
||||
nil
|
||||
}
|
||||
|
||||
#if StructuredData
|
||||
/// The structured data is omitted unless the page provides one.
|
||||
var structuredData: StructuredData? {
|
||||
nil
|
||||
}
|
||||
#endif
|
||||
|
||||
/// The summary is omitted unless the page provides one.
|
||||
var summary: String? {
|
||||
|
||||
Reference in new issue
Block a user