From 931b897f65d48c293b419124f1f63719816b698a Mon Sep 17 00:00:00 2001 From: Stephen Date: Thu, 31 Oct 2019 16:50:33 -0700 Subject: [PATCH] 'created smparkinVaporWeb from template https://github.com/vapor/web-template' --- .gitignore | 15 +++ CONTRIBUTING.md | 13 +++ Package.resolved | 169 +++++++++++++++++++++++++++++++ Package.swift | 19 ++++ Public/.gitkeep | 0 Public/images/it-works.png | Bin 0 -> 49564 bytes Public/styles/app.css | 19 ++++ README.md | 20 ++++ Resources/Views/base.leaf | 10 ++ Resources/Views/hello.leaf | 7 ++ Resources/Views/welcome.leaf | 9 ++ Sources/App/Controllers/.gitkeep | 0 Sources/App/Models/.gitkeep | 0 Sources/App/app.swift | 12 +++ Sources/App/boot.swift | 6 ++ Sources/App/configure.swift | 22 ++++ Sources/App/routes.swift | 16 +++ Sources/Run/main.swift | 3 + Tests/AppTests/AppTests.swift | 12 +++ Tests/LinuxMain.swift | 11 ++ circle.yml | 43 ++++++++ web.Dockerfile | 30 ++++++ 22 files changed, 436 insertions(+) create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 Package.resolved create mode 100644 Package.swift create mode 100644 Public/.gitkeep create mode 100644 Public/images/it-works.png create mode 100644 Public/styles/app.css create mode 100644 README.md create mode 100644 Resources/Views/base.leaf create mode 100644 Resources/Views/hello.leaf create mode 100644 Resources/Views/welcome.leaf create mode 100644 Sources/App/Controllers/.gitkeep create mode 100644 Sources/App/Models/.gitkeep create mode 100644 Sources/App/app.swift create mode 100644 Sources/App/boot.swift create mode 100644 Sources/App/configure.swift create mode 100644 Sources/App/routes.swift create mode 100644 Sources/Run/main.swift create mode 100644 Tests/AppTests/AppTests.swift create mode 100644 Tests/LinuxMain.swift create mode 100644 circle.yml create mode 100644 web.Dockerfile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c235f20 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ + +# Created by https://www.gitignore.io/api/vapor + +### Vapor ### +Config/secrets + +### Vapor Patch ### +Packages +.build +xcuserdata +*.xcodeproj +DerivedData/ +.DS_Store + +# End of https://www.gitignore.io/api/vapor diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..fdadb43 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contributing to Vapor Web Template + +If you found a mistake or think of a cool new feature, please [create an issue](https://github.com/vapor/web-template/issues/new) or, if you want to implement it yourself, [fork this repo](https://github.com/vapor/web-template/fork) and open a Pull Request! + +We'll take a look as soon as we can. + +Thanks! + +## Maintainers + +- [@0xTim](https://github.com/0xTim) + +See the [Vapor maintainers doc](https://github.com/vapor/vapor/blob/master/Docs/maintainers.md) for more information. diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 0000000..dae4bef --- /dev/null +++ b/Package.resolved @@ -0,0 +1,169 @@ +{ + "object": { + "pins": [ + { + "package": "Console", + "repositoryURL": "https://github.com/vapor/console.git", + "state": { + "branch": null, + "revision": "74cfbea629d4aac34a97cead2447a6870af1950b", + "version": "3.1.1" + } + }, + { + "package": "Core", + "repositoryURL": "https://github.com/vapor/core.git", + "state": { + "branch": null, + "revision": "57368d4092f92df3131e5968c8ed24a3c7361ec0", + "version": "3.8.1" + } + }, + { + "package": "Crypto", + "repositoryURL": "https://github.com/vapor/crypto.git", + "state": { + "branch": null, + "revision": "45bb12d13cdec80dbd1cc0685ea002e51ab83439", + "version": "3.3.2" + } + }, + { + "package": "DatabaseKit", + "repositoryURL": "https://github.com/vapor/database-kit.git", + "state": { + "branch": null, + "revision": "8f352c8e66dab301ab9bfef912a01ce1361ba1e4", + "version": "1.3.3" + } + }, + { + "package": "HTTP", + "repositoryURL": "https://github.com/vapor/http.git", + "state": { + "branch": null, + "revision": "254a0a0cbf22a02b697a075a0d2ddbb448bb7c87", + "version": "3.2.0" + } + }, + { + "package": "Leaf", + "repositoryURL": "https://github.com/vapor/leaf.git", + "state": { + "branch": null, + "revision": "d35f54cbac723e673f9bd5078361eea74049c8d7", + "version": "3.0.2" + } + }, + { + "package": "Multipart", + "repositoryURL": "https://github.com/vapor/multipart.git", + "state": { + "branch": null, + "revision": "f919a01c4d10a281d6236a21b0b1d1759a72b8eb", + "version": "3.0.4" + } + }, + { + "package": "Routing", + "repositoryURL": "https://github.com/vapor/routing.git", + "state": { + "branch": null, + "revision": "626190ddd2bd9f967743b60ba6adaf90bbd2651c", + "version": "3.0.2" + } + }, + { + "package": "Service", + "repositoryURL": "https://github.com/vapor/service.git", + "state": { + "branch": null, + "revision": "fa5b5de62bd68bcde9a69933f31319e46c7275fb", + "version": "1.0.2" + } + }, + { + "package": "swift-nio", + "repositoryURL": "https://github.com/apple/swift-nio.git", + "state": { + "branch": null, + "revision": "ba7970fe396e8198b84c6c1b44b38a1d4e2eb6bd", + "version": "1.14.1" + } + }, + { + "package": "swift-nio-ssl", + "repositoryURL": "https://github.com/apple/swift-nio-ssl.git", + "state": { + "branch": null, + "revision": "0f3999f3e3c359cc74480c292644c3419e44a12f", + "version": "1.4.0" + } + }, + { + "package": "swift-nio-ssl-support", + "repositoryURL": "https://github.com/apple/swift-nio-ssl-support.git", + "state": { + "branch": null, + "revision": "c02eec4e0e6d351cd092938cf44195a8e669f555", + "version": "1.0.0" + } + }, + { + "package": "swift-nio-zlib-support", + "repositoryURL": "https://github.com/apple/swift-nio-zlib-support.git", + "state": { + "branch": null, + "revision": "37760e9a52030bb9011972c5213c3350fa9d41fd", + "version": "1.0.0" + } + }, + { + "package": "TemplateKit", + "repositoryURL": "https://github.com/vapor/template-kit.git", + "state": { + "branch": null, + "revision": "4b1073d74be9f5c6a5bc63a07a84e83efec26229", + "version": "1.1.2" + } + }, + { + "package": "URLEncodedForm", + "repositoryURL": "https://github.com/vapor/url-encoded-form.git", + "state": { + "branch": null, + "revision": "82d8d63bdb76b6dd8febe916c639ab8608dbbaed", + "version": "1.0.6" + } + }, + { + "package": "Validation", + "repositoryURL": "https://github.com/vapor/validation.git", + "state": { + "branch": null, + "revision": "4de213cf319b694e4ce19e5339592601d4dd3ff6", + "version": "2.1.1" + } + }, + { + "package": "Vapor", + "repositoryURL": "https://github.com/vapor/vapor.git", + "state": { + "branch": null, + "revision": "c86ada59b31c69f08a6abd4f776537cba48d5df6", + "version": "3.3.0" + } + }, + { + "package": "WebSocket", + "repositoryURL": "https://github.com/vapor/websocket.git", + "state": { + "branch": null, + "revision": "d85e5b6dce4d04065865f77385fc3324f98178f6", + "version": "1.1.2" + } + } + ] + }, + "version": 1 +} diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..e998791 --- /dev/null +++ b/Package.swift @@ -0,0 +1,19 @@ +// swift-tools-version:4.0 +import PackageDescription + +let package = Package( + name: "smparkinVaporWeb", + dependencies: [ + // 💧 A server-side Swift web framework. + .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"), + + // 🍃 An expressive, performant, and extensible templating language built for Swift. + .package(url: "https://github.com/vapor/leaf.git", from: "3.0.0"), + ], + targets: [ + .target(name: "App", dependencies: ["Leaf", "Vapor"]), + .target(name: "Run", dependencies: ["App"]), + .testTarget(name: "AppTests", dependencies: ["App"]) + ] +) + diff --git a/Public/.gitkeep b/Public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Public/images/it-works.png b/Public/images/it-works.png new file mode 100644 index 0000000000000000000000000000000000000000..98d11022aa393b44dc852867d390f28047befd3f GIT binary patch literal 49564 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 D`WXAK literal 0 HcmV?d00001 diff --git a/Public/styles/app.css b/Public/styles/app.css new file mode 100644 index 0000000..c1e7a00 --- /dev/null +++ b/Public/styles/app.css @@ -0,0 +1,19 @@ +body, html { + height: 100%; +} + +body { + font-family: sans-serif; +} + +div.welcome { + height: 100%; + text-align: center; +} + +div.welcome img { + position: relative; + top: 50%; + transform: translateY(-50%); + width: 300px; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..702888d --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +

+ Web Template +
+
+
+ Documentation + + + Team Chat + + + MIT License + + + Continuous Integration + + + Swift 4.1 + +

diff --git a/Resources/Views/base.leaf b/Resources/Views/base.leaf new file mode 100644 index 0000000..80e43f8 --- /dev/null +++ b/Resources/Views/base.leaf @@ -0,0 +1,10 @@ + + + + #get(title) + + + + #get(body) + + diff --git a/Resources/Views/hello.leaf b/Resources/Views/hello.leaf new file mode 100644 index 0000000..422de5a --- /dev/null +++ b/Resources/Views/hello.leaf @@ -0,0 +1,7 @@ +#set("title") { Hello, #(name)! } + +#set("body") { +

Hello, #(name)!

+} + +#embed("base") diff --git a/Resources/Views/welcome.leaf b/Resources/Views/welcome.leaf new file mode 100644 index 0000000..6120b05 --- /dev/null +++ b/Resources/Views/welcome.leaf @@ -0,0 +1,9 @@ +#set("title") { It works } + +#set("body") { +
+ +
+} + +#embed("base") diff --git a/Sources/App/Controllers/.gitkeep b/Sources/App/Controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Sources/App/Models/.gitkeep b/Sources/App/Models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Sources/App/app.swift b/Sources/App/app.swift new file mode 100644 index 0000000..c1ecaaa --- /dev/null +++ b/Sources/App/app.swift @@ -0,0 +1,12 @@ +import Vapor + +/// Creates an instance of `Application`. This is called from `main.swift` in the run target. +public func app(_ env: Environment) throws -> Application { + var config = Config.default() + var env = env + var services = Services.default() + try configure(&config, &env, &services) + let app = try Application(config: config, environment: env, services: services) + try boot(app) + return app +} diff --git a/Sources/App/boot.swift b/Sources/App/boot.swift new file mode 100644 index 0000000..9313115 --- /dev/null +++ b/Sources/App/boot.swift @@ -0,0 +1,6 @@ +import Vapor + +/// Called after your application has initialized. +public func boot(_ app: Application) throws { + // Your code here +} diff --git a/Sources/App/configure.swift b/Sources/App/configure.swift new file mode 100644 index 0000000..ce15d3c --- /dev/null +++ b/Sources/App/configure.swift @@ -0,0 +1,22 @@ +import Leaf +import Vapor + +/// Called before your application initializes. +public func configure(_ config: inout Config, _ env: inout Environment, _ services: inout Services) throws { + // Register providers first + try services.register(LeafProvider()) + + // Register routes to the router + let router = EngineRouter.default() + try routes(router) + services.register(router, as: Router.self) + + // Use Leaf for rendering views + config.prefer(LeafRenderer.self, for: ViewRenderer.self) + + // Register middleware + var middlewares = MiddlewareConfig() // Create _empty_ middleware config + middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory + middlewares.use(ErrorMiddleware.self) // Catches errors and converts to HTTP response + services.register(middlewares) +} diff --git a/Sources/App/routes.swift b/Sources/App/routes.swift new file mode 100644 index 0000000..399a140 --- /dev/null +++ b/Sources/App/routes.swift @@ -0,0 +1,16 @@ +import Vapor + +/// Register your application's routes here. +public func routes(_ router: Router) throws { + // "It works" page + router.get { req in + return try req.view().render("welcome") + } + + // Says hello + router.get("hello", String.parameter) { req -> Future in + return try req.view().render("hello", [ + "name": req.parameters.next(String.self) + ]) + } +} diff --git a/Sources/Run/main.swift b/Sources/Run/main.swift new file mode 100644 index 0000000..ade3aff --- /dev/null +++ b/Sources/Run/main.swift @@ -0,0 +1,3 @@ +import App + +try app(.detect()).run() diff --git a/Tests/AppTests/AppTests.swift b/Tests/AppTests/AppTests.swift new file mode 100644 index 0000000..d915e80 --- /dev/null +++ b/Tests/AppTests/AppTests.swift @@ -0,0 +1,12 @@ +import XCTest +@testable import App + +class AppTests: XCTestCase { + func testStub() throws { + XCTAssert(true) + } + + static let allTests = [ + ("testStub", testStub), + ] +} diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift new file mode 100644 index 0000000..f78cb77 --- /dev/null +++ b/Tests/LinuxMain.swift @@ -0,0 +1,11 @@ +#if os(Linux) + +import XCTest +@testable import AppTests + +XCTMain([ + // AppTests + testCase(AppTests.allTests), +]) + +#endif diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000..583c382 --- /dev/null +++ b/circle.yml @@ -0,0 +1,43 @@ +version: 2 + +jobs: + linux: + docker: + - image: swift:4.1 + steps: + - checkout + - run: + name: Compile code + command: swift build + - run: + name: Run unit tests + command: swift test + + linux-release: + docker: + - image: swift:4.1 + steps: + - checkout + - run: + name: Compile code with optimizations + command: swift build -c release + +workflows: + version: 2 + tests: + jobs: + - linux + - linux-release + + nightly: + triggers: + - schedule: + cron: "0 0 * * *" + filters: + branches: + only: + - master + jobs: + - linux + - linux-release + \ No newline at end of file diff --git a/web.Dockerfile b/web.Dockerfile new file mode 100644 index 0000000..a778270 --- /dev/null +++ b/web.Dockerfile @@ -0,0 +1,30 @@ +# You can set the Swift version to what you need for your app. Versions can be found here: https://hub.docker.com/_/swift +FROM swift:5.0 as builder + +# For local build, add `--build-arg env=docker` +# In your application, you can use `Environment.custom(name: "docker")` to check if you're in this env +ARG env + +RUN apt-get -qq update && apt-get install -y \ + libssl-dev zlib1g-dev \ + && rm -r /var/lib/apt/lists/* +WORKDIR /app +COPY . . +RUN mkdir -p /build/lib && cp -R /usr/lib/swift/linux/*.so* /build/lib +RUN swift build -c release && mv `swift build -c release --show-bin-path` /build/bin + +# Production image +FROM ubuntu:18.04 +ARG env +# DEBIAN_FRONTEND=noninteractive for automatic UTC configuration in tzdata +RUN apt-get -qq update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + libatomic1 libicu60 libxml2 libcurl4 libz-dev libbsd0 tzdata \ + && rm -r /var/lib/apt/lists/* +WORKDIR /app +COPY --from=builder /build/bin/Run . +COPY --from=builder /build/lib/* /usr/lib/ +COPY --from=builder /app/Public ./Public +COPY --from=builder /app/Resources ./Resources +ENV ENVIRONMENT=$env + +ENTRYPOINT ./Run serve --env $ENVIRONMENT --hostname 0.0.0.0 --port 80