foscomputerservices/fosutilities
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][docs] or in Xcode.
[docs]: https://swiftpackageindex.com/foscomputerservices/FOSUtilities/documentation/fosfoundation
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 - ISO 8601 - JSON
- 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][docs] 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][docs] 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-toolsOption 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-setupInstall 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][docs] 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.
Package Metadata
Repository: foscomputerservices/fosutilities
Default branch: main
README: README.md