https://github.com/kabiroberai/node-swift Skip to content Navigation Menu Toggle navigation Sign in * Product + Actions Automate any workflow + Packages Host and manage packages + Security Find and fix vulnerabilities + Codespaces Instant dev environments + GitHub Copilot Write better code with AI + Code review Manage code changes + Issues Plan and track work + Discussions Collaborate outside of code Explore + All features + Documentation + GitHub Skills + Blog * Solutions For + Enterprise + Teams + Startups + Education By Solution + CI/CD & Automation + DevOps + DevSecOps Resources + Learning Pathways + White papers, Ebooks, Webinars + Customer Stories + Partners * Open Source + GitHub Sponsors Fund open source developers + The ReadME Project GitHub community articles Repositories + Topics + Trending + Collections * Enterprise + Enterprise platform AI-powered developer platform Available add-ons + Advanced Security Enterprise-grade security features + GitHub Copilot Enterprise-grade AI features + Premium Support Enterprise-grade 24/7 support * Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search [ ] Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. [ ] [ ] Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name [ ] Query [ ] To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} kabiroberai / node-swift Public * Notifications You must be signed in to change notification settings * Fork 5 * Star 166 * Create Node modules in Swift License MIT license 166 stars 5 forks Branches Tags Activity Star Notifications You must be signed in to change notification settings * Code * Issues 6 * Pull requests 1 * Actions * Projects 0 * Security * Insights Additional navigation options * Code * Issues * Pull requests * Actions * Projects * Security * Insights kabiroberai/node-swift This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. main BranchesTags Go to file Code Folders and files Name Name Last commit Last commit message date Latest commit History 163 Commits .swiftpm/xcode .swiftpm/xcode Sources Sources Tests/NodeJSCTests Tests/NodeJSCTests example example src src test test vendored/node/lib vendored/node/lib .eslintignore .eslintignore .eslintrc.json .eslintrc.json .gitattributes .gitattributes .gitignore .gitignore .npmignore .npmignore LICENSE.md LICENSE.md Package.resolved Package.resolved Package.swift Package.swift README.md README.md node-swift.xctestplan node-swift.xctestplan package-lock.json package-lock.json package.json package.json tsconfig.json tsconfig.json View all files Repository files navigation * README * MIT license NodeSwift Bridge Node.js and Swift code. What is it? NodeSwift allows you to write Swift code that talks to Node.js libraries, and vice versa. This enables possibilities such as * Using native macOS APIs and SwiftPM in an Electron app. * Interacting with the vast array of NPM APIs from a Swift program (e.g. a macOS app, iOS app, or a Vapor server). * Speeding up your JS code by writing performance critical bits in Swift. Example MyModule.swift import NodeAPI #NodeModule(exports: [ "nums": [Double.pi.rounded(.down), Double.pi.rounded(.up)], "str": String(repeating: "NodeSwift! ", count: 3), "add": try NodeFunction { (a: Double, b: Double) in "\(a) + \(b) = \(a + b)" }, ]) index.js const { nums, str, add } = require("./build/MyModule.node"); console.log(nums); // [ 3, 4 ] console.log(str); // NodeSwift! NodeSwift! NodeSwift! console.log(add(5, 10)); // 5.0 + 10.0 = 15.0 Features * Safe: NodeSwift makes use of Swift's memory safety and automatic reference counting. This means that, unlike with the C-based Node-API, you never have to think about memory management while writing NodeSwift modules. * Simple: With progressive disclosure, you can decide whether you want to use simpler or more advanced NodeSwift APIs to suit whatever your needs might be. * Idiomatic: NodeSwift's APIs feel right at home in idiomatic Swift code. For example, to make a Swift class usable from Node.js you literally declare a class in Swift that conforms to NodeClass. We also use several Swift features like Dynamic Member Lookup that are designed precisely to make this sort of interop easy. * Versatile: You have access to the full set of Node.js APIs in Swift, from JavaScript object manipulation to event loop scheduling. * Cross-platform: NodeSwift works not only on macOS, but also on Linux, Windows, and even iOS! How? A NodeSwift module consists of an SwiftPM package and NPM package in the same folder, both of which express NodeSwift as a dependency. The Swift package is exposed to JavaScript as a native Node.js module, which can be require'd by the JS code. The two sides communicate via Node-API, which is wrapped by the NodeAPI module on the Swift side. Get started For details, see the example in /example. Alternatives WebAssembly While WebAssembly is great for performance, it still runs in a virtual machine, which means it can't access native Darwin/Win32/ GNU+Linux APIs. NodeSwift runs your Swift code on the bare metal, which should be even faster than WASM, in addition to unlocking access to the operating system's native APIs. On the other hand, if you want to run Swift code in the browser, WebAssembly might be the right choice since NodeSwift requires a Node.js runtime. Other NAPI wrappers NAPI, NAN, Neon etc. are all other options for building native Node.js modules, each with its own strengths. For example, NAPI is written in C and thus affords great portability at the cost of memory unsafety. NodeSwift is a great option if you want to enhance your JS tool on Apple platforms, if you want to bring Node.js code into your existing Swift program, or if you simply prefer Swift to C/C++/Rust/ etc. About Create Node modules in Swift Resources Readme License MIT license Activity Stars 166 stars Watchers 10 watching Forks 5 forks Report repository Releases 6 v1.1.4 Latest Mar 16, 2024 + 5 releases Packages 0 No packages published Contributors 3 * @kabiroberai kabiroberai Kabir Oberai * @KishanBagaria KishanBagaria Kishan Bagaria * @vmanot vmanot Vatsal Manot Languages * Swift 50.2% * C++ 33.0% * C 12.0% * TypeScript 3.6% * JavaScript 1.2% Footer (c) 2024 GitHub, Inc. Footer navigation * Terms * Privacy * Security * Status * Docs * Contact * Manage cookies * Do not share my personal information You can't perform that action at this time.