Skip to content

Commit 2ae6b3d

Browse files
committed
wip: add typesafe components with vue
1 parent 3349a4e commit 2ae6b3d

File tree

9 files changed

+179
-44
lines changed

9 files changed

+179
-44
lines changed

Package.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ let package = Package(
1818
.package(url: "https://github.com/swiftlang/swift-markdown.git", revision: "e62a44fd1f2764ba8807db3b6f257627449bbb8c")
1919
],
2020
targets: [
21+
.target(
22+
name: "EnvVars",
23+
dependencies: [
24+
.product(name: "Hummingbird", package: "hummingbird"),
25+
.product(name: "Dependencies", package: "swift-dependencies")
26+
]
27+
),
2128
.target(
2229
name: "PublicAssets",
2330
dependencies: [
@@ -26,7 +33,7 @@ let package = Package(
2633
],
2734
resources: [.copy("assets")],
2835
plugins: [.plugin(name: "TypedAssetsPlugin", package: "swift-web")]
29-
),
36+
),
3037
.target(
3138
name: "Models",
3239
dependencies: [
@@ -56,6 +63,7 @@ let package = Package(
5663
.target(
5764
name: "Pages",
5865
dependencies: [
66+
"EnvVars",
5967
"Models",
6068
"ActivityClient",
6169
"PublicAssets",
@@ -70,6 +78,7 @@ let package = Package(
7078
.executableTarget(
7179
name: "App",
7280
dependencies: [
81+
"EnvVars",
7382
"Models",
7483
"Routes",
7584
"Pages",

Sources/App/App.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import ArgumentParser
22
import Dependencies
3+
import EnvVars
34
import Hummingbird
45
import HummingbirdRouter
56
import Logging
@@ -9,7 +10,7 @@ import Routes
910
private let logger = Logger(label: "portfolio-server")
1011

1112
@main
12-
struct Portfolio: AsyncParsableCommand {
13+
struct App: AsyncParsableCommand {
1314
@Option(name: .shortAndLong)
1415
var hostname = "127.0.0.1"
1516

@@ -19,7 +20,7 @@ struct Portfolio: AsyncParsableCommand {
1920
func run() async throws {
2021
try await withDependencies { deps in
2122
#if DEBUG
22-
deps.envVar = try await .dotEnv()
23+
deps.envVars = try await .dotEnv()
2324
#endif
2425
} operation: {
2526
let app = self.buildApp()
@@ -34,8 +35,6 @@ struct Portfolio: AsyncParsableCommand {
3435
}
3536

3637
func buildApp() -> some ApplicationProtocol {
37-
@Dependency(\.envVar) var envVar
38-
3938
let router = Router()
4039
router.addMiddleware {
4140
SiteMiddleware()

Sources/App/Utils/Auth.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import Hummingbird
2-
import Foundation
31
import Dependencies
4-
import Parsing
2+
import EnvVars
3+
import Foundation
4+
import Hummingbird
55
import HummingbirdURLRouting
6+
import Parsing
67

78
extension HTTPFields.Authorization {
89
func validate() throws {
9-
@Dependency(\.envVar) var env
10+
@Dependency(\.envVars) var env
1011
switch self {
1112
case let .basic(username, pass):
1213
if username != env.basicAuth.0 || pass != env.basicAuth.1 {
@@ -15,4 +16,4 @@ extension HTTPFields.Authorization {
1516
default: throw HTTPError(.notFound)
1617
}
1718
}
18-
}
19+
}

Sources/App/Utils/Environment+.swift renamed to Sources/EnvVars/Environment+.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import ArgumentParser
21
import Dependencies
32
import Hummingbird
43

@@ -8,7 +7,7 @@ private enum EnvKeys {
87
static let basicAuthPassword = "BASIC_AUTH_PASSWD"
98
}
109

11-
extension Environment {
10+
public extension Environment {
1211
var appSecret: String {
1312
self.get(EnvKeys.appSecret) ?? "deadbeefdeadbeefdeadbeefdeadbeef"
1413
}
@@ -22,8 +21,8 @@ private struct EnvironmentKey: TestDependencyKey {
2221
static let testValue = Environment()
2322
}
2423

25-
extension DependencyValues {
26-
var envVar: Environment {
24+
public extension DependencyValues {
25+
var envVars: Environment {
2726
get { self[EnvironmentKey.self] }
2827
set { self[EnvironmentKey.self] = newValue }
2928
}
Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,57 @@
11
import Elementary
2+
import Dependencies
3+
import EnvVars
24

35
struct HeaderView: HTML {
6+
@Dependency(\.envVars) var envVars
7+
48
var content: some HTML {
59
header {
610
hgroup {
7-
code { "erikb.dev()" }
8-
.inlineStyle("font-size", "0.84em")
9-
.inlineStyle("color", "#AAA")
11+
a(.href("/")) {
12+
code { "erikb.dev()" }
13+
.inlineStyle("font-size", "0.84em")
14+
.inlineStyle("color", "#AAA")
15+
.inlineStyle("font-weight", "bold")
16+
}
17+
.inlineStyle("text-decoration", "none")
1018
// TODO: Add buttons to allow switching between code styling or plain text
19+
20+
// CodeStyleSelector()
1121
}
1222
.containerStyling()
1323
.inlineStyle("display", "flex")
24+
.inlineStyle("flex", "none")
25+
.inlineStyle("justify-content", "space-between")
26+
.inlineStyle("flex-direction", "row")
1427
.inlineStyle("padding", "0.75rem 1.5rem")
1528
}
1629
.wrappedStyling()
1730
}
1831
}
32+
33+
private struct CodeStyleSelector: VueComponent {
34+
// @VueState var visible = false
35+
36+
var body: some HTML {
37+
div {
38+
button {
39+
code { "</>" }
40+
.inlineStyle("color", "#AAA")
41+
}
42+
.inlineStyle("font-weight", "bold")
43+
.inlineStyle("font-size", "0.7em")
44+
.inlineStyle("background", "unset")
45+
.inlineStyle("border", "1px solid #444")
46+
.inlineStyle("border-radius", "0.2rem")
47+
.inlineStyle("padding", "0.2rem 0.35rem")
48+
49+
// ul(.v.show("visible")) {
50+
// li { "Plain Text" }
51+
// li { "Swift" }
52+
// li { "Rust" }
53+
// li { "TypeScript" }
54+
// }
55+
}
56+
}
57+
}

Sources/Pages/HomePage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public struct HomePage: Page {
1414
}
1515

1616
public var body: some HTML {
17-
div(.v.scope("{ showCode: true, selection: undefined }")) {
17+
div(.v.scope("{ codeStyle: 0, selection: undefined }")) {
1818
HeaderView()
1919
Spacer()
2020
main {

Sources/Pages/NotFoundPage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public struct NotFoundPage: Page {
4646
.inlineStyle("margin-bottom", "0.125rem")
4747
}
4848

49-
h2 { "Page Not Found" }
49+
h1 { "Page Not Found" }
5050
.inlineStyle("margin-bottom", "0.5rem")
5151

5252
pre {

Sources/Pages/Utils/Elementary+InlineStyle.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct _HTMLInlineStyle<Content: HTML>: HTML where Content.Tag: HTMLTrait.Attrib
4040
pre: String? = nil,
4141
pseudo: InlineStyle.Pseudo? = nil,
4242
post: String? = nil
43-
) -> _HTMLInlineStyle {
43+
) -> Self {
4444
var copy = self
4545
if let value {
4646
copy.styles.append(

0 commit comments

Comments
 (0)