From 26f4ed4fded53b08f1502face212d75baf9e4777 Mon Sep 17 00:00:00 2001 From: Stephen Parkinson Date: Sat, 16 Sep 2023 17:46:51 -0700 Subject: [PATCH] vapor app for running from ios --- .gitignore | 3 - Dockerfile | 77 --- Package.swift | 40 -- README.md | 1 - Sources/App/configure.swift | 15 - Sources/Run/main.swift | 9 - Tests/AppTests/AppTests.swift | 12 - Tests/LinuxMain.swift | 11 - docker-compose.yml | 30 -- smparkin.xcodeproj/project.pbxproj | 439 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 77 ++- .../UserInterfaceState.xcuserstate | Bin 0 -> 45454 bytes .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + smparkin/Assets.xcassets/Contents.json | 6 + smparkin/ContentView.swift | 29 ++ smparkin/Log.swift | 23 + .../Preview Assets.xcassets/Contents.json | 6 + {Public => smparkin/Public}/css/404style.css | 0 {Public => smparkin/Public}/images/bg.jpg | Bin {Public => smparkin/Public}/images/me.jpg | Bin {Public => smparkin/Public}/images/trees.jpg | Bin {Public => smparkin/Public}/media/gif.gif | Bin {Public => smparkin/Public}/media/gif2.gif | Bin {Public => smparkin/Public}/media/song.mp3 | Bin .../App/routes.swift => smparkin/Routes.swift | 0 smparkin/Server.swift | 58 +++ {Resources => smparkin}/Views/404.leaf | 0 {Resources => smparkin}/Views/home.leaf | 0 {Resources => smparkin}/Views/privacy.leaf | 0 {Resources => smparkin}/Views/welcome.leaf | 0 smparkin/smparkinApp.swift | 17 + 35 files changed, 665 insertions(+), 241 deletions(-) delete mode 100644 .gitignore delete mode 100644 Dockerfile delete mode 100644 Package.swift delete mode 100644 README.md delete mode 100644 Sources/App/configure.swift delete mode 100644 Sources/Run/main.swift delete mode 100644 Tests/AppTests/AppTests.swift delete mode 100644 Tests/LinuxMain.swift delete mode 100644 docker-compose.yml create mode 100644 smparkin.xcodeproj/project.pbxproj create mode 100644 smparkin.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 smparkin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename Package.resolved => smparkin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved (69%) create mode 100644 smparkin.xcodeproj/project.xcworkspace/xcuserdata/smparkin.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 smparkin.xcodeproj/xcuserdata/smparkin.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 smparkin/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 smparkin/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 smparkin/Assets.xcassets/Contents.json create mode 100644 smparkin/ContentView.swift create mode 100644 smparkin/Log.swift create mode 100644 smparkin/Preview Content/Preview Assets.xcassets/Contents.json rename {Public => smparkin/Public}/css/404style.css (100%) rename {Public => smparkin/Public}/images/bg.jpg (100%) rename {Public => smparkin/Public}/images/me.jpg (100%) rename {Public => smparkin/Public}/images/trees.jpg (100%) rename {Public => smparkin/Public}/media/gif.gif (100%) rename {Public => smparkin/Public}/media/gif2.gif (100%) rename {Public => smparkin/Public}/media/song.mp3 (100%) rename Sources/App/routes.swift => smparkin/Routes.swift (100%) create mode 100644 smparkin/Server.swift rename {Resources => smparkin}/Views/404.leaf (100%) rename {Resources => smparkin}/Views/home.leaf (100%) rename {Resources => smparkin}/Views/privacy.leaf (100%) rename {Resources => smparkin}/Views/welcome.leaf (100%) create mode 100644 smparkin/smparkinApp.swift diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 3441547..0000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.build* -.vscode* -.swiftpm* diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 087e712..0000000 --- a/Dockerfile +++ /dev/null @@ -1,77 +0,0 @@ -# ================================ -# Build image -# ================================ -FROM swift:5.7-jammy as build - -# Install OS updates and, if needed, sqlite3 -RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \ - && apt-get -q update \ - && apt-get -q dist-upgrade -y\ - && rm -rf /var/lib/apt/lists/* - -# Set up a build area -WORKDIR /build - -# First just resolve dependencies. -# This creates a cached layer that can be reused -# as long as your Package.swift/Package.resolved -# files do not change. -COPY ./Package.* ./ -RUN swift package resolve - -# Copy entire repo into container -COPY . . - -# Build everything, with optimizations -RUN swift build -c release --static-swift-stdlib - -# Switch to the staging area -WORKDIR /staging - -# Copy main executable to staging area -RUN cp "$(swift build --package-path /build -c release --show-bin-path)/Run" ./ - -# Copy resources bundled by SPM to staging area -RUN find -L "$(swift build --package-path /build -c release --show-bin-path)/" -regex '.*\.resources$' -exec cp -Ra {} ./ \; - -# Copy any resources from the public directory and views directory if the directories exist -# Ensure that by default, neither the directory nor any of its contents are writable. -RUN [ -d /build/Public ] && { mv /build/Public ./Public && chmod -R a-w ./Public; } || true -RUN [ -d /build/Resources ] && { mv /build/Resources ./Resources && chmod -R a-w ./Resources; } || true - -# ================================ -# Run image -# ================================ -FROM ubuntu:jammy - -# Make sure all system packages are up to date, and install only essential packages. -RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \ - && apt-get -q update \ - && apt-get -q dist-upgrade -y \ - && apt-get -q install -y \ - ca-certificates \ - tzdata \ -# If your app or its dependencies import FoundationNetworking, also install `libcurl4`. - # libcurl4 \ -# If your app or its dependencies import FoundationXML, also install `libxml2`. - # libxml2 \ - && rm -r /var/lib/apt/lists/* - -# Create a vapor user and group with /app as its home directory -RUN useradd --user-group --create-home --system --skel /dev/null --home-dir /app vapor - -# Switch to the new home directory -WORKDIR /app - -# Copy built executable and any staged resources from builder -COPY --from=build --chown=vapor:vapor /staging /app - -# Ensure all further commands run as the vapor user -USER vapor:vapor - -# Let Docker bind to port 8080 -EXPOSE 8080 - -# Start the Vapor service when the image is run, default to listening on 8080 in production environment -ENTRYPOINT ["./Run"] -CMD ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"] diff --git a/Package.swift b/Package.swift deleted file mode 100644 index 397f9f6..0000000 --- a/Package.swift +++ /dev/null @@ -1,40 +0,0 @@ -// swift-tools-version:5.7 -import PackageDescription - -let package = Package( - name: "smparkin", - platforms: [ - .macOS(.v13), - .iOS(.v16) - ], - dependencies: [ - .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"), - .package(url: "https://github.com/vapor/leaf.git", from: "4.0.0"), - ], - targets: [ - .target( - name: "App", - dependencies: [ - .product(name: "Vapor", package: "vapor"), - .product(name: "Leaf", package: "leaf") - ], - swiftSettings: [ - .unsafeFlags(["-cross-module-optimization"], .when(configuration: .release)) - ] - ), - .executableTarget( - name: "Run", - dependencies: [ - .target(name: "App") - ] - ), - .testTarget( - name: "AppTests", - dependencies: [ - .target(name: "App"), - .product(name: "XCTVapor", package: "vapor") - ] - ) - ] -) - diff --git a/README.md b/README.md deleted file mode 100644 index cc2ec01..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -smpark.in diff --git a/Sources/App/configure.swift b/Sources/App/configure.swift deleted file mode 100644 index 746898b..0000000 --- a/Sources/App/configure.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Leaf -import Vapor - -// Called before your application initializes. -public func configure(_ app: Application) throws { - //leaf - app.views.use(.leaf) - - //Register middleware - app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory)) - app.middleware.use(ErrorMiddleware.default(environment: app.environment)) - - //routes - try routes(app) -} diff --git a/Sources/Run/main.swift b/Sources/Run/main.swift deleted file mode 100644 index 373be5f..0000000 --- a/Sources/Run/main.swift +++ /dev/null @@ -1,9 +0,0 @@ -import App -import Vapor - -var env = try Environment.detect() -try LoggingSystem.bootstrap(from: &env) -let app = Application(env) -defer { app.shutdown() } -try configure(app) -try app.run() diff --git a/Tests/AppTests/AppTests.swift b/Tests/AppTests/AppTests.swift deleted file mode 100644 index d915e80..0000000 --- a/Tests/AppTests/AppTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index f78cb77..0000000 --- a/Tests/LinuxMain.swift +++ /dev/null @@ -1,11 +0,0 @@ -#if os(Linux) - -import XCTest -@testable import AppTests - -XCTMain([ - // AppTests - testCase(AppTests.allTests), -]) - -#endif diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index c46e129..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,30 +0,0 @@ -# Docker Compose file for Vapor -# -# Install Docker on your system to run and test -# your Vapor app in a production-like environment. -# -# Note: This file is intended for testing and does not -# implement best practices for a production deployment. -# -# Learn more: https://docs.docker.com/compose/reference/ -# -# Build images: docker-compose build -# Start app: docker-compose up app -# Stop all: docker-compose down -# -version: '3.7' - -x-shared_environment: &shared_environment - LOG_LEVEL: ${LOG_LEVEL:-debug} - -services: - app: - image: smparkin:latest - build: - context: . - environment: - <<: *shared_environment - ports: - - '8888:8888' - # user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user. - command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8888"] diff --git a/smparkin.xcodeproj/project.pbxproj b/smparkin.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dd6d023 --- /dev/null +++ b/smparkin.xcodeproj/project.pbxproj @@ -0,0 +1,439 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + C041F2C22AB021E30011752C /* smparkinApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C041F2C12AB021E30011752C /* smparkinApp.swift */; }; + C041F2C42AB021E30011752C /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C041F2C32AB021E30011752C /* ContentView.swift */; }; + C041F2C62AB021E40011752C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C041F2C52AB021E40011752C /* Assets.xcassets */; }; + C041F2C92AB021E40011752C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C041F2C82AB021E40011752C /* Preview Assets.xcassets */; }; + C041F2D22AB0238F0011752C /* Vapor in Frameworks */ = {isa = PBXBuildFile; productRef = C041F2D12AB0238F0011752C /* Vapor */; }; + C041F2D72AB023CA0011752C /* Leaf in Frameworks */ = {isa = PBXBuildFile; productRef = C041F2D62AB023CA0011752C /* Leaf */; }; + C041F2DA2AB0243C0011752C /* Public in Resources */ = {isa = PBXBuildFile; fileRef = C041F2D82AB0243C0011752C /* Public */; }; + C041F2DD2AB024510011752C /* Routes.swift in Sources */ = {isa = PBXBuildFile; fileRef = C041F2DC2AB024510011752C /* Routes.swift */; }; + C041F2DF2AB0246C0011752C /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = C041F2DE2AB0246C0011752C /* Server.swift */; }; + C0C8E2BE2AB0304D00E809B4 /* home.leaf in Resources */ = {isa = PBXBuildFile; fileRef = C0C8E2BB2AB02B6C00E809B4 /* home.leaf */; }; + C0C8E2BF2AB0304D00E809B4 /* privacy.leaf in Resources */ = {isa = PBXBuildFile; fileRef = C0C8E2BC2AB02B6C00E809B4 /* privacy.leaf */; }; + C0C8E2C02AB0304D00E809B4 /* welcome.leaf in Resources */ = {isa = PBXBuildFile; fileRef = C0C8E2BD2AB02B6C00E809B4 /* welcome.leaf */; }; + C0C8E2C12AB0304D00E809B4 /* 404.leaf in Resources */ = {isa = PBXBuildFile; fileRef = C0C8E2BA2AB02B6C00E809B4 /* 404.leaf */; }; + C0C8E2C52AB03D6200E809B4 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C8E2C42AB03D6200E809B4 /* Log.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + C041F2BE2AB021E30011752C /* smparkin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = smparkin.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C041F2C12AB021E30011752C /* smparkinApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = smparkinApp.swift; sourceTree = ""; }; + C041F2C32AB021E30011752C /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + C041F2C52AB021E40011752C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + C041F2C82AB021E40011752C /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + C041F2D82AB0243C0011752C /* Public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Public; sourceTree = ""; }; + C041F2DC2AB024510011752C /* Routes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Routes.swift; sourceTree = ""; }; + C041F2DE2AB0246C0011752C /* Server.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Server.swift; sourceTree = ""; }; + C0C8E2BA2AB02B6C00E809B4 /* 404.leaf */ = {isa = PBXFileReference; lastKnownFileType = text; path = 404.leaf; sourceTree = ""; }; + C0C8E2BB2AB02B6C00E809B4 /* home.leaf */ = {isa = PBXFileReference; lastKnownFileType = text; path = home.leaf; sourceTree = ""; }; + C0C8E2BC2AB02B6C00E809B4 /* privacy.leaf */ = {isa = PBXFileReference; lastKnownFileType = text; path = privacy.leaf; sourceTree = ""; }; + C0C8E2BD2AB02B6C00E809B4 /* welcome.leaf */ = {isa = PBXFileReference; lastKnownFileType = text; path = welcome.leaf; sourceTree = ""; }; + C0C8E2C42AB03D6200E809B4 /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C041F2BB2AB021E30011752C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C041F2D72AB023CA0011752C /* Leaf in Frameworks */, + C041F2D22AB0238F0011752C /* Vapor in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C041F2B52AB021E30011752C = { + isa = PBXGroup; + children = ( + C041F2C02AB021E30011752C /* smparkin */, + C041F2BF2AB021E30011752C /* Products */, + ); + sourceTree = ""; + }; + C041F2BF2AB021E30011752C /* Products */ = { + isa = PBXGroup; + children = ( + C041F2BE2AB021E30011752C /* smparkin.app */, + ); + name = Products; + sourceTree = ""; + }; + C041F2C02AB021E30011752C /* smparkin */ = { + isa = PBXGroup; + children = ( + C041F2C12AB021E30011752C /* smparkinApp.swift */, + C041F2C32AB021E30011752C /* ContentView.swift */, + C041F2DE2AB0246C0011752C /* Server.swift */, + C041F2DC2AB024510011752C /* Routes.swift */, + C0C8E2C42AB03D6200E809B4 /* Log.swift */, + C0C8E2B92AB02B6C00E809B4 /* Views */, + C041F2D82AB0243C0011752C /* Public */, + C041F2C52AB021E40011752C /* Assets.xcassets */, + C041F2C72AB021E40011752C /* Preview Content */, + ); + path = smparkin; + sourceTree = ""; + }; + C041F2C72AB021E40011752C /* Preview Content */ = { + isa = PBXGroup; + children = ( + C041F2C82AB021E40011752C /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + C0C8E2B92AB02B6C00E809B4 /* Views */ = { + isa = PBXGroup; + children = ( + C0C8E2BA2AB02B6C00E809B4 /* 404.leaf */, + C0C8E2BB2AB02B6C00E809B4 /* home.leaf */, + C0C8E2BC2AB02B6C00E809B4 /* privacy.leaf */, + C0C8E2BD2AB02B6C00E809B4 /* welcome.leaf */, + ); + path = Views; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C041F2BD2AB021E30011752C /* smparkin */ = { + isa = PBXNativeTarget; + buildConfigurationList = C041F2CC2AB021E40011752C /* Build configuration list for PBXNativeTarget "smparkin" */; + buildPhases = ( + C041F2BA2AB021E30011752C /* Sources */, + C041F2BB2AB021E30011752C /* Frameworks */, + C041F2BC2AB021E30011752C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = smparkin; + packageProductDependencies = ( + C041F2D12AB0238F0011752C /* Vapor */, + C041F2D62AB023CA0011752C /* Leaf */, + ); + productName = smparkin; + productReference = C041F2BE2AB021E30011752C /* smparkin.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C041F2B62AB021E30011752C /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + C041F2BD2AB021E30011752C = { + CreatedOnToolsVersion = 15.0; + }; + }; + }; + buildConfigurationList = C041F2B92AB021E30011752C /* Build configuration list for PBXProject "smparkin" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C041F2B52AB021E30011752C; + packageReferences = ( + C041F2D02AB0238F0011752C /* XCRemoteSwiftPackageReference "vapor" */, + C041F2D52AB023CA0011752C /* XCRemoteSwiftPackageReference "leaf" */, + ); + productRefGroup = C041F2BF2AB021E30011752C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C041F2BD2AB021E30011752C /* smparkin */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C041F2BC2AB021E30011752C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C0C8E2BE2AB0304D00E809B4 /* home.leaf in Resources */, + C0C8E2C12AB0304D00E809B4 /* 404.leaf in Resources */, + C041F2C92AB021E40011752C /* Preview Assets.xcassets in Resources */, + C041F2DA2AB0243C0011752C /* Public in Resources */, + C041F2C62AB021E40011752C /* Assets.xcassets in Resources */, + C0C8E2C02AB0304D00E809B4 /* welcome.leaf in Resources */, + C0C8E2BF2AB0304D00E809B4 /* privacy.leaf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C041F2BA2AB021E30011752C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C041F2DF2AB0246C0011752C /* Server.swift in Sources */, + C041F2C42AB021E30011752C /* ContentView.swift in Sources */, + C0C8E2C52AB03D6200E809B4 /* Log.swift in Sources */, + C041F2C22AB021E30011752C /* smparkinApp.swift in Sources */, + C041F2DD2AB024510011752C /* Routes.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + C041F2CA2AB021E40011752C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + C041F2CB2AB021E40011752C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C041F2CD2AB021E40011752C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"smparkin/Preview Content\""; + DEVELOPMENT_TEAM = QR825BQSTL; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = in.smpark.smparkin; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C041F2CE2AB021E40011752C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"smparkin/Preview Content\""; + DEVELOPMENT_TEAM = QR825BQSTL; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = in.smpark.smparkin; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C041F2B92AB021E30011752C /* Build configuration list for PBXProject "smparkin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C041F2CA2AB021E40011752C /* Debug */, + C041F2CB2AB021E40011752C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C041F2CC2AB021E40011752C /* Build configuration list for PBXNativeTarget "smparkin" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C041F2CD2AB021E40011752C /* Debug */, + C041F2CE2AB021E40011752C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + C041F2D02AB0238F0011752C /* XCRemoteSwiftPackageReference "vapor" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/vapor/vapor.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.81.0; + }; + }; + C041F2D52AB023CA0011752C /* XCRemoteSwiftPackageReference "leaf" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/vapor/leaf.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.2.4; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + C041F2D12AB0238F0011752C /* Vapor */ = { + isa = XCSwiftPackageProductDependency; + package = C041F2D02AB0238F0011752C /* XCRemoteSwiftPackageReference "vapor" */; + productName = Vapor; + }; + C041F2D62AB023CA0011752C /* Leaf */ = { + isa = XCSwiftPackageProductDependency; + package = C041F2D52AB023CA0011752C /* XCRemoteSwiftPackageReference "leaf" */; + productName = Leaf; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = C041F2B62AB021E30011752C /* Project object */; +} diff --git a/smparkin.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/smparkin.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/smparkin.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/smparkin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/smparkin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/smparkin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Package.resolved b/smparkin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved similarity index 69% rename from Package.resolved rename to smparkin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index c902b82..ea75aa1 100644 --- a/Package.resolved +++ b/smparkin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/swift-server/async-http-client.git", "state" : { - "revision" : "864c8d9e0ead5de7ba70b61c8982f89126710863", - "version" : "1.15.0" + "revision" : "16f7e62c08c6969899ce6cc277041e868364e5cf", + "version" : "1.19.0" } }, { @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/vapor/async-kit.git", "state" : { - "revision" : "9acea4c92f51a5885c149904f0d11db4712dda80", - "version" : "1.16.0" + "revision" : "eab9edff78e8ace20bd7cb6e792ab46d54f59ab9", + "version" : "1.18.0" } }, { @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/vapor/console-kit.git", "state" : { - "revision" : "447f1046fb4e9df40973fe426ecb24a6f0e8d3b4", - "version" : "4.6.0" + "revision" : "9a12000f4064a2bdc49068d7258292ec1bdc88fc", + "version" : "4.7.0" } }, { @@ -41,8 +41,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/vapor/leaf-kit.git", "state" : { - "revision" : "62169b44cc79734e11bf44b8d7154865dee5936b", - "version" : "1.10.1" + "revision" : "13f2fc4c8479113cd23876d9a434ef4573e368bb", + "version" : "1.10.2" } }, { @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/vapor/multipart-kit.git", "state" : { - "revision" : "0d55c35e788451ee27222783c7d363cb88092fab", - "version" : "4.5.2" + "revision" : "1adfd69df2da08f7931d4281b257475e32c96734", + "version" : "4.5.4" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/vapor/routing-kit.git", "state" : { - "revision" : "ffac7b3a127ce1e85fb232f1a6271164628809ad", - "version" : "4.6.0" + "revision" : "e0539da5b60a60d7381f44cdcf04036f456cee2f", + "version" : "4.8.0" } }, { @@ -77,17 +77,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-atomics.git", "state" : { - "revision" : "ff3d2212b6b093db7f177d0855adbc4ef9c5f036", - "version" : "1.0.3" - } - }, - { - "identity" : "swift-backtrace", - "kind" : "remoteSourceControl", - "location" : "https://github.com/swift-server/swift-backtrace.git", - "state" : { - "revision" : "f25620d5d05e2f1ba27154b40cafea2b67566956", - "version" : "1.3.3" + "revision" : "6c89474e62719ddcc1e9614989fff2f68208fe10", + "version" : "1.1.0" } }, { @@ -104,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-crypto.git", "state" : { - "revision" : "da0fe44138ab86e380f40a2acbd8a611b07d3f64", - "version" : "2.4.0" + "revision" : "60f13f60c4d093691934dc6cfdf5f508ada1f894", + "version" : "2.6.0" } }, { @@ -113,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "32e8d724467f8fe623624570367e3d50c5638e46", - "version" : "1.5.2" + "revision" : "532d8b529501fb73a2455b179e0bbb6d49b652ed", + "version" : "1.5.3" } }, { @@ -122,8 +113,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-metrics.git", "state" : { - "revision" : "e8bced74bc6d747745935e469f45d03f048d6cbd", - "version" : "2.3.4" + "revision" : "971ba26378ab69c43737ee7ba967a896cb74c0d1", + "version" : "2.4.1" } }, { @@ -131,8 +122,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio.git", "state" : { - "revision" : "45167b8006448c79dda4b7bd604e07a034c15c49", - "version" : "2.48.0" + "revision" : "cf281631ff10ec6111f2761052aa81896a83a007", + "version" : "2.58.0" } }, { @@ -140,8 +131,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-extras.git", "state" : { - "revision" : "d75ed708d00353acf173ca23018b6bd46f949464", - "version" : "1.17.0" + "revision" : "0e0d0aab665ff1a0659ce75ac003081f2b1c8997", + "version" : "1.19.0" } }, { @@ -149,8 +140,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-http2.git", "state" : { - "revision" : "38feec96bcd929028939107684073554bf01abeb", - "version" : "1.25.2" + "revision" : "a8ccf13fa62775277a5d56844878c828bbb3be1a", + "version" : "1.27.0" } }, { @@ -158,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-ssl.git", "state" : { - "revision" : "4fb7ead803e38949eb1d6fabb849206a72c580f3", - "version" : "2.23.0" + "revision" : "320bd978cceb8e88c125dcbb774943a92f6286e9", + "version" : "2.25.0" } }, { @@ -167,8 +158,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-nio-transport-services.git", "state" : { - "revision" : "c0d9a144cfaec8d3d596aadde3039286a266c15c", - "version" : "1.15.0" + "revision" : "e7403c35ca6bb539a7ca353b91cc2d8ec0362d58", + "version" : "1.19.0" } }, { @@ -185,8 +176,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/vapor/vapor.git", "state" : { - "revision" : "bac0fe31e3b186537eb750d44fae048681e2b773", - "version" : "4.74.0" + "revision" : "03a08f6e88d5ca8c1cfd84f8367b21dfe050d082", + "version" : "4.81.0" } }, { @@ -194,8 +185,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/vapor/websocket-kit.git", "state" : { - "revision" : "2b8885974e8d9f522e787805000553f4f7cce8a0", - "version" : "2.7.0" + "revision" : "53fe0639a98903858d0196b699720decb42aee7b", + "version" : "2.14.0" } } ], diff --git a/smparkin.xcodeproj/project.xcworkspace/xcuserdata/smparkin.xcuserdatad/UserInterfaceState.xcuserstate b/smparkin.xcodeproj/project.xcworkspace/xcuserdata/smparkin.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..c89150ef3d23c72d8e967fd1f6d21f652a5c50ea GIT binary patch literal 45454 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 literal 0 HcmV?d00001 diff --git a/smparkin.xcodeproj/xcuserdata/smparkin.xcuserdatad/xcschemes/xcschememanagement.plist b/smparkin.xcodeproj/xcuserdata/smparkin.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..24b24c7 --- /dev/null +++ b/smparkin.xcodeproj/xcuserdata/smparkin.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + smparkin.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/smparkin/Assets.xcassets/AccentColor.colorset/Contents.json b/smparkin/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/smparkin/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smparkin/Assets.xcassets/AppIcon.appiconset/Contents.json b/smparkin/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/smparkin/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smparkin/Assets.xcassets/Contents.json b/smparkin/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/smparkin/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/smparkin/ContentView.swift b/smparkin/ContentView.swift new file mode 100644 index 0000000..166fd04 --- /dev/null +++ b/smparkin/ContentView.swift @@ -0,0 +1,29 @@ +// +// ContentView.swift +// smparkin +// +// Created by Stephen Parkinson on 9/11/23. +// + +import SwiftUI + +struct ContentView: View { + @StateObject var server: Server = Server(port: 8080) + + var body: some View { + VStack { + Text(ProcessInfo().hostName + ":\(server.port)") + List(server.logs.reversed(), id: \.self) { log in + Text(log) + } + } + .padding() + .onAppear { + server.start() + } + } +} + +#Preview { + ContentView() +} diff --git a/smparkin/Log.swift b/smparkin/Log.swift new file mode 100644 index 0000000..6d3e552 --- /dev/null +++ b/smparkin/Log.swift @@ -0,0 +1,23 @@ +// +// Log.swift +// smparkin +// +// Created by Stephen Parkinson on 9/11/23. +// + +import Vapor + +struct LogMiddleware: Middleware { + let server: Server + + init(server: Server) { + self.server = server + } + + func respond(to request: Request, chainingTo next: Responder) -> EventLoopFuture { + DispatchQueue.main.async { + server.logs.append("\(server.dateFormatter.string(from: Date.now)) \(request.url.path)") + } + return next.respond(to: request) + } +} diff --git a/smparkin/Preview Content/Preview Assets.xcassets/Contents.json b/smparkin/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/smparkin/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Public/css/404style.css b/smparkin/Public/css/404style.css similarity index 100% rename from Public/css/404style.css rename to smparkin/Public/css/404style.css diff --git a/Public/images/bg.jpg b/smparkin/Public/images/bg.jpg similarity index 100% rename from Public/images/bg.jpg rename to smparkin/Public/images/bg.jpg diff --git a/Public/images/me.jpg b/smparkin/Public/images/me.jpg similarity index 100% rename from Public/images/me.jpg rename to smparkin/Public/images/me.jpg diff --git a/Public/images/trees.jpg b/smparkin/Public/images/trees.jpg similarity index 100% rename from Public/images/trees.jpg rename to smparkin/Public/images/trees.jpg diff --git a/Public/media/gif.gif b/smparkin/Public/media/gif.gif similarity index 100% rename from Public/media/gif.gif rename to smparkin/Public/media/gif.gif diff --git a/Public/media/gif2.gif b/smparkin/Public/media/gif2.gif similarity index 100% rename from Public/media/gif2.gif rename to smparkin/Public/media/gif2.gif diff --git a/Public/media/song.mp3 b/smparkin/Public/media/song.mp3 similarity index 100% rename from Public/media/song.mp3 rename to smparkin/Public/media/song.mp3 diff --git a/Sources/App/routes.swift b/smparkin/Routes.swift similarity index 100% rename from Sources/App/routes.swift rename to smparkin/Routes.swift diff --git a/smparkin/Server.swift b/smparkin/Server.swift new file mode 100644 index 0000000..f19a913 --- /dev/null +++ b/smparkin/Server.swift @@ -0,0 +1,58 @@ +import Leaf +import Vapor +import SwiftUI + +class Server: ObservableObject { + @Published var logs: [String] = [String]() + let dateFormatter = ISO8601DateFormatter() + var app: Application + let port: Int + + init(port: Int) { + self.port = port + app = Application(.production) + configure(app) + } + + // Called before your application initializes. + private func configure(_ app: Application) { + app.http.server.configuration.hostname = "0.0.0.0" + app.http.server.configuration.port = port + + //leaf + app.views.use(.leaf) + app.leaf.cache.isEnabled = app.environment.isRelease + app.leaf.configuration.rootDirectory = Bundle.main.bundlePath + + //Register middleware + app.middleware.use(FileMiddleware(publicDirectory: "\(Bundle.main.bundlePath)/\(app.directory.publicDirectory)")) + app.middleware.use(ErrorMiddleware.default(environment: app.environment)) + app.middleware.use(LogMiddleware.init(server: self)) + + //routes + do { + try routes(app) + } catch { + fatalError(error.localizedDescription) + } + } + + func start() { + Task(priority: .background) { + do { + try app.start() + } catch { + fatalError(error.localizedDescription) + } + } + } + + func stop() { + app.shutdown() + } + + func restart() { + stop() + start() + } +} diff --git a/Resources/Views/404.leaf b/smparkin/Views/404.leaf similarity index 100% rename from Resources/Views/404.leaf rename to smparkin/Views/404.leaf diff --git a/Resources/Views/home.leaf b/smparkin/Views/home.leaf similarity index 100% rename from Resources/Views/home.leaf rename to smparkin/Views/home.leaf diff --git a/Resources/Views/privacy.leaf b/smparkin/Views/privacy.leaf similarity index 100% rename from Resources/Views/privacy.leaf rename to smparkin/Views/privacy.leaf diff --git a/Resources/Views/welcome.leaf b/smparkin/Views/welcome.leaf similarity index 100% rename from Resources/Views/welcome.leaf rename to smparkin/Views/welcome.leaf diff --git a/smparkin/smparkinApp.swift b/smparkin/smparkinApp.swift new file mode 100644 index 0000000..fcd6cd6 --- /dev/null +++ b/smparkin/smparkinApp.swift @@ -0,0 +1,17 @@ +// +// smparkinApp.swift +// smparkin +// +// Created by Stephen Parkinson on 9/11/23. +// + +import SwiftUI + +@main +struct smparkinApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +}