Skip to content

Latest commit

 

History

631 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FOSUtilities

Run unit tests Swift Package Manager

There are multiple libraries provided by the FOSUtilities package: FOSFoundation, FOSMVVM, FOSTesting, FOSTestingUI, FOSMVVMVapor, FOSTestingVapor.

Documentation

For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.

Create a project in one minute

The package ships a scaffolder that generates a complete FOSMVVM application: a SwiftUI app (localOnly), a SwiftUI app plus a Vapor server sharing one ViewModel contract (clientServer), or a reusable ViewModel package (sharedLibrary). It needs Xcode and xcodegen (brew install xcodegen):

git clone https://github.com/foscomputerservices/FOSUtilities.git
cd FOSUtilities
swift run fosmvvm-bootstrap new --output ~/MyApp

A short interview asks for the project name, shape, platforms, bundle id, and team (add --verbose to also print the equivalent --config JSON so reruns can skip the questions). Add --verify to build the generated project and run its tests on your machine (CI already verifies every release this way). Full details: Creating a Project.

Already have a project?

doctor audits an existing project against the same rules the scaffolder generates by. If your project is a Swift package that already depends on FOSUtilities, there is nothing to install:

swift package fosmvvm-doctor --shape clientServer

An Xcode-only project — a .xcodeproj with no package manifest — has nothing for swift package to attach to, so run the audit from a FOSUtilities checkout instead (a standalone installable binary is planned):

swift run fosmvvm-bootstrap doctor --project ~/MyApp --shape localOnly

It reports and never rewrites — every finding names the setting and the value to use. It catches the failures that surface far from their cause: a second direct link to a FOS product, a silently-ignored misspelled build setting, a missing development team, a deployment target under the FOSUtilities floor, a test plan pointing at identifiers a regeneration re-minted. Errors exit non-zero; warnings do not.

FOSFoundation

FOSFoundation is a library of protocols, patterns, types and routines that I have found generally useful in my projects. Support areas include:

  • Extensions to URL for one-line REST-Style requests
  • Extensions to JSONEncoder and JSONDecoder for single-statement encoding/decoding of Codables
    • Along with standardized support for handling various Date and DateTime styles
  • Extensions to Collection for throttling execution of requests when servers restrict the number of requests per any time period
  • Extensions on String such as:
    • CamelCase / snake_case conversion
    • Hexadecimal String to/from UInt64, Int64, UInt, and Int
    • Cleaning and standardizing user-provided input
    • Generating random and unique Strings
    • Swift Range support
    • String obfuscation/revealing (e.g., ROT 13/ROT 47)

For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.

FOSMVVM

FOSMVVM is a library that implements the Model-View-ViewModel pattern for binding SwiftUI projects to Vapor web services.

For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.

Quick Glance

Here is an example of setting up a new Model-View-ViewModel-based client application

View Model

@ViewModel
public struct LandingPageViewModel: RequestableViewModel {
    public typealias Request = LandingPageRequest

    @LocalizedString public var pageTitle

    public var vmId = ViewModelId()

    public init() {}

    public static func stub() -> Self { .init() }
}

View

struct LandingPageView: ViewModelView {
    let viewModel: LandingPageViewModel

    var body: some View {
        VStack {
            Text(viewModel.pageTitle)
                .font(.headline)
                .padding(.bottom, 30)
        }
        .padding()
    }
}

Client Application Main

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            LandingPageView.bind()
        }
        .environment(
             MVVMEnvironment(
                 currentVersion: .currentApplicationVersion,
                 appBundle: Bundle.main,
                 deploymentURLs: [
                    .production, .init(serverBaseURL: URL(string: "http://api.mywebserver.com")!),
                    .staging, .init(serverBaseURL: URL(string: "http://staging-api.mywebserver.com")!),
                    .debug, .init(serverBaseURL: URL(string: "http://localhost:8080")!)
                 ]
            )
        )
    }
}

Vapor Server Application

public func configure(_ app: Application) async throws {
    // uncomment to serve files from /Public folder
    // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
    // register routes
    try routes(app)

    try app.initYamlLocalization(
        bundle: Bundle.module,
        resourceDirectoryName: "Resources"
    )
}

func routes(_ app: Application) throws {
    app.routesregister(viewModel: LandingPageViewModel.self)
}

Claude Code Integration

This repository includes Claude Code skills for generating FOSMVVM architecture components. These skills help automate the creation of ViewModels, Fields protocols, DataModels, ServerRequests, and Leaf Views following FOSMVVM patterns.

Available Skills

Skill Purpose
fosmvvm-viewmodel-generator Generate ViewModels for UI screens and components
fosmvvm-fields-generator Generate Form Specifications with validation and localization
fosmvvm-serverrequest-generator Generate ServerRequest types for client-server communication
fosmvvm-fluent-datamodel-generator Generate Fluent DataModels for server-side persistence
fosmvvm-leaf-view-generator Generate Leaf templates for WebApps
fosmvvm-swiftui-view-generator Generate SwiftUI views that render ViewModels
fosmvvm-react-view-generator Generate React components that render ViewModels
fosmvvm-serverrequest-test-generator Generate ServerRequest tests using VaporTesting
fosmvvm-viewmodel-test-generator Generate ViewModel tests with multi-locale verification
fosmvvm-ui-tests-generator Generate UI tests for ViewModelViews
fosmvvm-swiftui-app-setup Set up the main App struct for SwiftUI applications
skill-generator Generate new Claude Code skills

Installation

To use these skills in your FOSMVVM projects, add this repository as a Claude Code plugin marketplace.

Option 1: Interactive

/plugin marketplace add foscomputerservices/FOSUtilities
/plugin install fosmvvm-generators@fosmvvm-tools

Option 2: Project Configuration

Add to your project's .claude/settings.json:

{
  "enabledPlugins": {
    "fosmvvm-generators@fosmvvm-tools": true
  },
  "extraKnownMarketplaces": {
    "fosmvvm-tools": {
      "source": {
        "source": "github",
        "repo": "foscomputerservices/FOSUtilities"
      }
    }
  }
}

Architecture Documentation

For detailed FOSMVVM architecture concepts, see FOSMVVMArchitecture.md.

OpenClaw Integration

The FOSMVVM skills are also available for OpenClaw agents via ClawHub.

Install from ClawHub

clawhub install fosmvvm-viewmodel-generator
clawhub install fosmvvm-fields-generator
clawhub install fosmvvm-serverrequest-generator
clawhub install fosmvvm-fluent-datamodel-generator
clawhub install fosmvvm-leaf-view-generator
clawhub install fosmvvm-swiftui-view-generator
clawhub install fosmvvm-react-view-generator
clawhub install fosmvvm-serverrequest-test-generator
clawhub install fosmvvm-viewmodel-test-generator
clawhub install fosmvvm-ui-tests-generator
clawhub install fosmvvm-swiftui-app-setup

Install from Repository

Alternatively, point OpenClaw at this repository's skills directory. Add to ~/.openclaw/openclaw.json:

{
  "skills": {
    "load": {
      "extraDirs": ["/path/to/FOSUtilities/.claude/skills"]
    }
  }
}

Or symlink individual skills into your OpenClaw workspace:

ln -s /path/to/FOSUtilities/.claude/skills/fosmvvm-viewmodel-generator ~/.openclaw/workspace/skills/

FOSTesting

FOSTestingUtilities is a package of testing patterns, types and routines that I have found generally useful in my projects.

For guides, articles, and API documentation see the library's documentation on the Web or in Xcode.

Swift Package Manager

FOSUtilities supports the Swift Package Manager. To include FOSUtilities in your project add the following to your Package.swift file:

.package(url: "git@github.com:foscomputerservices/FOSUtilities.git", branch: "main"),

To use one of the libraries, add one or more entry in the dependencies list of a target in your Package.swift file:

.target(
    name: "MyTarget",
    dependencies: [
        .product(name: "FOSFoundation", package: "FOSUtilities"),
        .product(name: "FOSMVVM", package: "FOSUtilities")
        // ...
    ]
),
.testTarget(
    name: "MyTests",
    dependencies: [
        .byName(name: "MyTarget"),
        .byName(name: "FOSFoundation"),
        .byName(name: "FOSMVVM"),
        .byName(name: "FOSTesting"),
        .product(name: "Testing", package: "swift-testing")
    ]
)

Contributing

All contributions are welcome! Please see CONTRIBUTING.md for more details.

Maintainers

This project is maintained by David Hunt owner of FOS Computer Services, LLC.

License

FOSUtilities is under the Apache License. See the LICENSE file for more information.

About

Swift libraries for supporting the Model-View-ViewModel pattern on macOS, iOS, Windows and Linux

Topics

Resources

Contributing

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages