├── 1_hello_world ├── Sources │ ├── Trampoline │ │ ├── include │ │ │ └── Trampoline.h │ │ └── trampoline.c │ └── HelloWorld │ │ └── HelloWorld.swift ├── hello.js ├── package.json └── Package.swift ├── 3_callbacks ├── Sources │ ├── Trampoline │ │ ├── include │ │ │ └── Trampoline.h │ │ └── trampoline.c │ └── Callbacks │ │ └── Callbacks.swift ├── addon.js ├── package.json └── Package.swift ├── 2_function_arguments ├── Sources │ ├── Trampoline │ │ ├── include │ │ │ └── Trampoline.h │ │ └── trampoline.c │ └── FunctionArguments │ │ └── FunctionArguments.swift ├── addon.js ├── package.json └── Package.swift └── .gitignore /1_hello_world/Sources/Trampoline/include/Trampoline.h: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /3_callbacks/Sources/Trampoline/include/Trampoline.h: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /2_function_arguments/Sources/Trampoline/include/Trampoline.h: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .build/ 2 | package-lock.json 3 | Package.resolved 4 | -------------------------------------------------------------------------------- /1_hello_world/hello.js: -------------------------------------------------------------------------------- 1 | var addon = require('./.build/release/HelloWorld.node') 2 | 3 | console.log(addon.hello()) 4 | -------------------------------------------------------------------------------- /3_callbacks/addon.js: -------------------------------------------------------------------------------- 1 | var addon = require('./.build/release/Callbacks.node') 2 | 3 | addon(function (msg) { 4 | console.log(msg) 5 | }) 6 | -------------------------------------------------------------------------------- /2_function_arguments/addon.js: -------------------------------------------------------------------------------- 1 | var addon = require('./.build/release/FunctionArguments.node') 2 | 3 | console.log('This should be eight:', addon.add(3, 5)) 4 | -------------------------------------------------------------------------------- /3_callbacks/Sources/Trampoline/trampoline.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | napi_value _init_callbacks(napi_env, napi_value); 4 | 5 | NAPI_MODULE(callbacks, _init_callbacks) 6 | -------------------------------------------------------------------------------- /1_hello_world/Sources/Trampoline/trampoline.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | napi_value _init_hello_world(napi_env, napi_value); 4 | 5 | NAPI_MODULE(hello_world, _init_hello_world) 6 | -------------------------------------------------------------------------------- /2_function_arguments/Sources/Trampoline/trampoline.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | napi_value _init_function_arguments(napi_env, napi_value); 4 | 5 | NAPI_MODULE(function_arguments, _init_function_arguments) 6 | -------------------------------------------------------------------------------- /1_hello_world/Sources/HelloWorld/HelloWorld.swift: -------------------------------------------------------------------------------- 1 | import NAPI 2 | 3 | func hello() -> String { 4 | return "world" 5 | } 6 | 7 | @_cdecl("_init_hello_world") 8 | func initHelloWorld(env: OpaquePointer, exports: OpaquePointer) -> OpaquePointer? { 9 | return initModule(env, exports, [ 10 | .function("hello", hello) 11 | ]) 12 | } 13 | -------------------------------------------------------------------------------- /3_callbacks/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "callbacks", 3 | "version": "0.0.0", 4 | "main": "addon.js", 5 | "private": true, 6 | "scripts": { 7 | "test": "node addon.js", 8 | "postinstall": "swift build -c release -Xlinker -undefined -Xlinker dynamic_lookup && mv .build/release/libCallbacks.dylib .build/release/Callbacks.node" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /1_hello_world/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello_world", 3 | "version": "0.0.0", 4 | "main": "hello.js", 5 | "private": true, 6 | "scripts": { 7 | "test": "node hello.js", 8 | "postinstall": "swift build -c release -Xlinker -undefined -Xlinker dynamic_lookup && mv .build/release/libHelloWorld.dylib .build/release/HelloWorld.node" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /3_callbacks/Sources/Callbacks/Callbacks.swift: -------------------------------------------------------------------------------- 1 | import NAPI 2 | 3 | func runCallback(env: OpaquePointer, fn: Function) throws -> Void { 4 | try fn.call(env, "hello world") 5 | } 6 | 7 | @_cdecl("_init_callbacks") 8 | func initCallbacks(env: OpaquePointer, exports: OpaquePointer) -> OpaquePointer? { 9 | return try! Function(named: "", runCallback).napiValue(env) 10 | } 11 | -------------------------------------------------------------------------------- /2_function_arguments/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "function_arguments", 3 | "version": "0.0.0", 4 | "main": "addon.js", 5 | "private": true, 6 | "scripts": { 7 | "test": "node addon.js", 8 | "postinstall": "swift build -c release -Xlinker -undefined -Xlinker dynamic_lookup && mv .build/release/libFunctionArguments.dylib .build/release/FunctionArguments.node" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /2_function_arguments/Sources/FunctionArguments/FunctionArguments.swift: -------------------------------------------------------------------------------- 1 | import NAPI 2 | 3 | func add(a: Double, b: Double) -> Double { 4 | return a + b 5 | } 6 | 7 | @_cdecl("_init_function_arguments") 8 | func initFunctionArguments(env: OpaquePointer, exports: OpaquePointer) -> OpaquePointer? { 9 | return initModule(env, exports, [ 10 | .function("add", add) 11 | ]) 12 | } 13 | -------------------------------------------------------------------------------- /3_callbacks/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.2 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "Callbacks", 7 | products: [ 8 | .library(name: "Callbacks", type: .dynamic, targets: ["Callbacks"]), 9 | ], 10 | dependencies: [ 11 | .package(url: "https://github.com/LinusU/swift-napi-bindings", from: "1.0.0-alpha.1"), 12 | ], 13 | targets: [ 14 | .target(name: "Trampoline", dependencies: ["NAPIC"]), 15 | .target(name: "Callbacks", dependencies: ["NAPI", "Trampoline"]), 16 | ] 17 | ) 18 | -------------------------------------------------------------------------------- /1_hello_world/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.2 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "HelloWorld", 7 | products: [ 8 | .library(name: "HelloWorld", type: .dynamic, targets: ["HelloWorld"]), 9 | ], 10 | dependencies: [ 11 | .package(url: "https://github.com/LinusU/swift-napi-bindings", from: "1.0.0-alpha.1"), 12 | ], 13 | targets: [ 14 | .target(name: "Trampoline", dependencies: ["NAPIC"]), 15 | .target(name: "HelloWorld", dependencies: ["NAPI", "Trampoline"]), 16 | ] 17 | ) 18 | -------------------------------------------------------------------------------- /2_function_arguments/Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.2 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "FunctionArguments", 7 | products: [ 8 | .library(name: "FunctionArguments", type: .dynamic, targets: ["FunctionArguments"]), 9 | ], 10 | dependencies: [ 11 | .package(url: "https://github.com/LinusU/swift-napi-bindings", from: "1.0.0-alpha.1"), 12 | ], 13 | targets: [ 14 | .target(name: "Trampoline", dependencies: ["NAPIC"]), 15 | .target(name: "FunctionArguments", dependencies: ["NAPI", "Trampoline"]), 16 | ] 17 | ) 18 | --------------------------------------------------------------------------------