bare-ui-kit 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CMakeLists.txt CHANGED
@@ -5,9 +5,23 @@ find_package(cmake-fetch REQUIRED PATHS node_modules/cmake-fetch)
5
5
 
6
6
  project(bare_ui_kit C OBJC)
7
7
 
8
- fetch_package("github:holepunchto/bare@1.24.5")
8
+ fetch_package("github:holepunchto/bare@1.25.0")
9
9
  fetch_package("github:holepunchto/libpath")
10
10
 
11
+ add_bare_module(bare_ui_kit)
12
+
13
+ target_sources(
14
+ ${bare_ui_kit}
15
+ PRIVATE
16
+ binding.m
17
+ )
18
+
19
+ target_link_libraries(
20
+ ${bare_ui_kit}
21
+ PUBLIC
22
+ "-framework UIKit"
23
+ )
24
+
11
25
  add_executable(bare_runtime)
12
26
 
13
27
  target_sources(
@@ -35,7 +49,6 @@ target_link_libraries(
35
49
  PUBLIC
36
50
  $<LINK_LIBRARY:WHOLE_ARCHIVE,bare_static>
37
51
  PRIVATE
38
- log_static
39
52
  rlimit_static
40
53
  path_static
41
54
  )
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # bare-ui-kit
2
2
 
3
- UIKit runtime for Bare.
3
+ UIKit bindings and runtime for Bare.
4
4
 
5
5
  ```
6
6
  npm i bare-ui-kit
package/binding.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require.addon()
package/binding.m ADDED
@@ -0,0 +1,39 @@
1
+ #import <assert.h>
2
+ #import <bare.h>
3
+ #import <js.h>
4
+ #import <utf.h>
5
+
6
+ #import <UIKit/UIKit.h>
7
+
8
+ #import "lib/view.h"
9
+ #import "lib/view-controller.h"
10
+ #import "lib/window.h"
11
+
12
+ static js_value_t *
13
+ bare_ui_kit_exports(js_env_t *env, js_value_t *exports) {
14
+ int err;
15
+
16
+ #define V(name, fn) \
17
+ { \
18
+ js_value_t *val; \
19
+ err = js_create_function(env, name, -1, fn, NULL, &val); \
20
+ assert(err == 0); \
21
+ err = js_set_named_property(env, exports, name, val); \
22
+ assert(err == 0); \
23
+ }
24
+
25
+ V("viewHidden", bare_ui_kit_view_hidden)
26
+ V("viewAddSubview", bare_ui_kit_view_add_subview)
27
+
28
+ V("viewControllerInit", bare_ui_kit_view_controller_init)
29
+ V("viewControllerView", bare_ui_kit_view_controller_view)
30
+
31
+ V("windowInit", bare_ui_kit_window_init)
32
+ V("windowRootViewController", bare_ui_kit_window_root_view_controller)
33
+ V("windowMakeKeyWindow", bare_ui_kit_window_make_key_window)
34
+ #undef V
35
+
36
+ return exports;
37
+ }
38
+
39
+ BARE_MODULE(bare_ui_kit, bare_ui_kit_exports)
package/index.js ADDED
@@ -0,0 +1,3 @@
1
+ exports.View = require('./lib/view')
2
+ exports.ViewController = require('./lib/view-controller')
3
+ exports.Window = require('./lib/window')
package/lib/bridging.h ADDED
@@ -0,0 +1,8 @@
1
+ #import <js.h>
2
+
3
+ #import <Foundation/Foundation.h>
4
+
5
+ static void
6
+ bare_ui_kit__on_bridged_release(js_env_t *env, void *data, void *finalize_hint) {
7
+ CFBridgingRelease(data);
8
+ }
package/lib/runtime.m CHANGED
@@ -1,7 +1,6 @@
1
1
  #import <assert.h>
2
2
  #import <bare.h>
3
3
  #import <js.h>
4
- #import <log.h>
5
4
  #import <path.h>
6
5
  #import <rlimit.h>
7
6
  #import <signal.h>
@@ -141,6 +140,23 @@ bare__terminate(void) {
141
140
 
142
141
  err = bare_terminate(bare);
143
142
  assert(err == 0);
143
+
144
+ err = bare_run(bare, UV_RUN_DEFAULT);
145
+ assert(err == 0);
146
+
147
+ int exit_code;
148
+ err = bare_teardown(bare, UV_RUN_DEFAULT, &exit_code);
149
+ assert(err == 0);
150
+
151
+ err = uv_loop_close(bare__loop);
152
+ assert(err == 0);
153
+
154
+ err = uv_async_send(&bare__platform_shutdown);
155
+ assert(err == 0);
156
+
157
+ uv_thread_join(&bare__platform_thread);
158
+
159
+ if (exit_code != 0) _exit(exit_code);
144
160
  }
145
161
 
146
162
  static void
@@ -191,12 +207,11 @@ main(int argc, char *argv[]) {
191
207
  signal(SIGPIPE, SIG_IGN);
192
208
  #endif
193
209
 
194
- err = log_open("bare", 0);
195
- assert(err == 0);
196
-
197
210
  err = rlimit_set(rlimit_open_files, rlimit_infer);
198
211
  assert(err == 0);
199
212
 
213
+ uv_disable_stdio_inheritance();
214
+
200
215
  argv = uv_setup_args(argc, argv);
201
216
 
202
217
  err = uv_barrier_init(&bare__platform_ready, 2);
@@ -0,0 +1,97 @@
1
+ #import <assert.h>
2
+ #import <bare.h>
3
+ #import <js.h>
4
+
5
+ #import <UIKit/UIKit.h>
6
+
7
+ #import "bridging.h"
8
+
9
+ @interface BareViewController : UIViewController {
10
+ @public
11
+ js_env_t *env;
12
+ js_ref_t *ctx;
13
+ }
14
+
15
+ @end
16
+
17
+ @implementation BareViewController
18
+
19
+ - (void)dealloc {
20
+ int err;
21
+
22
+ err = js_delete_reference(env, ctx);
23
+ assert(err == 0);
24
+
25
+ [super dealloc];
26
+ }
27
+
28
+ @end
29
+
30
+ static js_value_t *
31
+ bare_ui_kit_view_controller_init(js_env_t *env, js_callback_info_t *info) {
32
+ int err;
33
+
34
+ size_t argc = 1;
35
+ js_value_t *argv[1];
36
+
37
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
38
+ assert(err == 0);
39
+
40
+ assert(argc == 1);
41
+
42
+ js_value_t *result;
43
+
44
+ @autoreleasepool {
45
+ BareViewController *handle = [[BareViewController alloc] init];
46
+
47
+ err = js_create_external(env, (void *) CFBridgingRetain(handle), bare_ui_kit__on_bridged_release, NULL, &result);
48
+ assert(err == 0);
49
+
50
+ handle->env = env;
51
+
52
+ err = js_create_reference(env, argv[0], 1, &handle->ctx);
53
+ assert(err == 0);
54
+ }
55
+
56
+ return result;
57
+ }
58
+
59
+ static js_value_t *
60
+ bare_ui_kit_view_controller_view(js_env_t *env, js_callback_info_t *info) {
61
+ int err;
62
+
63
+ size_t argc = 2;
64
+ js_value_t *argv[2];
65
+
66
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
67
+ assert(err == 0);
68
+
69
+ assert(argc == 1 || argc == 2);
70
+
71
+ void *handle;
72
+ err = js_get_value_external(env, argv[0], &handle);
73
+ assert(err == 0);
74
+
75
+ js_value_t *result = NULL;
76
+
77
+ @autoreleasepool {
78
+ UIViewController *view_controller = (__bridge UIViewController *) handle;
79
+
80
+ if (argc == 1) {
81
+ UIView *view = view_controller.view;
82
+
83
+ err = js_create_external(env, (void *) CFBridgingRetain(view), bare_ui_kit__on_bridged_release, NULL, &result);
84
+ assert(err == 0);
85
+ } else {
86
+ void *handle;
87
+ err = js_get_value_external(env, argv[1], &handle);
88
+ assert(err == 0);
89
+
90
+ UIView *view = (__bridge UIView *) handle;
91
+
92
+ view_controller.view = view;
93
+ }
94
+ }
95
+
96
+ return result;
97
+ }
@@ -0,0 +1,25 @@
1
+ const EventEmitter = require('bare-events')
2
+ const binding = require('../binding')
3
+ const UIKitView = require('./view')
4
+
5
+ module.exports = class UIKitViewController extends EventEmitter {
6
+ constructor(handle = null) {
7
+ super()
8
+
9
+ this._handle = handle || binding.viewControllerInit(this)
10
+ }
11
+
12
+ get view() {
13
+ return new UIKitView(binding.viewControllerView(this._handle))
14
+ }
15
+
16
+ set view(view) {
17
+ binding.viewControllerView(this._handle, view._handle)
18
+ }
19
+
20
+ [Symbol.for('bare.inspect')]() {
21
+ return {
22
+ __proto__: { constructor: UIKitViewController }
23
+ }
24
+ }
25
+ }
package/lib/view.h ADDED
@@ -0,0 +1,73 @@
1
+
2
+ #import <assert.h>
3
+ #import <bare.h>
4
+ #import <js.h>
5
+
6
+ #import <UIKit/UIKit.h>
7
+
8
+ static js_value_t *
9
+ bare_ui_kit_view_hidden(js_env_t *env, js_callback_info_t *info) {
10
+ int err;
11
+
12
+ size_t argc = 2;
13
+ js_value_t *argv[2];
14
+
15
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
16
+ assert(err == 0);
17
+
18
+ assert(argc == 1 || argc == 2);
19
+
20
+ void *handle;
21
+ err = js_get_value_external(env, argv[0], &handle);
22
+ assert(err == 0);
23
+
24
+ js_value_t *result = NULL;
25
+
26
+ @autoreleasepool {
27
+ UIView *view = (__bridge UIView *) handle;
28
+
29
+ if (argc == 1) {
30
+ err = js_get_boolean(env, view.hidden, &result);
31
+ assert(err == 0);
32
+ } else {
33
+ bool value;
34
+ err = js_get_value_bool(env, argv[1], &value);
35
+ assert(err == 0);
36
+
37
+ view.hidden = value;
38
+ }
39
+ }
40
+
41
+ return result;
42
+ }
43
+
44
+ static js_value_t *
45
+ bare_ui_kit_view_add_subview(js_env_t *env, js_callback_info_t *info) {
46
+ int err;
47
+
48
+ size_t argc = 2;
49
+ js_value_t *argv[2];
50
+
51
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
52
+ assert(err == 0);
53
+
54
+ assert(argc == 2);
55
+
56
+ void *handle;
57
+ err = js_get_value_external(env, argv[0], &handle);
58
+ assert(err == 0);
59
+
60
+ @autoreleasepool {
61
+ UIView *view = (__bridge UIView *) handle;
62
+
63
+ void *handle;
64
+ err = js_get_value_external(env, argv[1], &handle);
65
+ assert(err == 0);
66
+
67
+ UIView *subview = (__bridge UIView *) handle;
68
+
69
+ [view addSubview:subview];
70
+ }
71
+
72
+ return NULL;
73
+ }
package/lib/view.js ADDED
@@ -0,0 +1,29 @@
1
+ const EventEmitter = require('bare-events')
2
+ const binding = require('../binding')
3
+
4
+ module.exports = class UIKitView extends EventEmitter {
5
+ constructor(handle = null) {
6
+ super()
7
+
8
+ this._handle = handle
9
+ }
10
+
11
+ get hidden() {
12
+ return binding.viewHidden(this._handle)
13
+ }
14
+
15
+ set hidden(value) {
16
+ binding.viewHidden(this._handle, value)
17
+ }
18
+
19
+ addSubview(view) {
20
+ binding.viewAddSubview(this._handle, view._handle)
21
+ return this
22
+ }
23
+
24
+ [Symbol.for('bare.inspect')]() {
25
+ return {
26
+ __proto__: { constructor: UIKitView }
27
+ }
28
+ }
29
+ }
package/lib/window.h ADDED
@@ -0,0 +1,124 @@
1
+ #import <assert.h>
2
+ #import <bare.h>
3
+ #import <js.h>
4
+
5
+ #import <UIKit/UIKit.h>
6
+
7
+ #import "bridging.h"
8
+
9
+ @interface BareWindow : UIWindow {
10
+ @public
11
+ js_env_t *env;
12
+ js_ref_t *ctx;
13
+ }
14
+
15
+ @end
16
+
17
+ @implementation BareWindow
18
+
19
+ - (void)dealloc {
20
+ int err;
21
+
22
+ err = js_delete_reference(env, ctx);
23
+ assert(err == 0);
24
+
25
+ [super dealloc];
26
+ }
27
+
28
+ @end
29
+
30
+ static js_value_t *
31
+ bare_ui_kit_window_init(js_env_t *env, js_callback_info_t *info) {
32
+ int err;
33
+
34
+ size_t argc = 1;
35
+ js_value_t *argv[1];
36
+
37
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
38
+ assert(err == 0);
39
+
40
+ assert(argc == 1);
41
+
42
+ js_value_t *result;
43
+
44
+ @autoreleasepool {
45
+ BareWindow *handle = [[BareWindow alloc] init];
46
+
47
+ err = js_create_external(env, (void *) CFBridgingRetain(handle), bare_ui_kit__on_bridged_release, NULL, &result);
48
+ assert(err == 0);
49
+
50
+ handle->env = env;
51
+
52
+ err = js_create_reference(env, argv[0], 1, &handle->ctx);
53
+ assert(err == 0);
54
+ }
55
+
56
+ return result;
57
+ }
58
+
59
+ static js_value_t *
60
+ bare_ui_kit_window_root_view_controller(js_env_t *env, js_callback_info_t *info) {
61
+ int err;
62
+
63
+ size_t argc = 2;
64
+ js_value_t *argv[2];
65
+
66
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
67
+ assert(err == 0);
68
+
69
+ assert(argc == 1 || argc == 2);
70
+
71
+ void *handle;
72
+ err = js_get_value_external(env, argv[0], &handle);
73
+ assert(err == 0);
74
+
75
+ js_value_t *result = NULL;
76
+
77
+ @autoreleasepool {
78
+ UIWindow *window = (__bridge UIWindow *) handle;
79
+
80
+ if (argc == 1) {
81
+ UIViewController *view_controller = window.rootViewController;
82
+
83
+ if (view_controller == NULL) return NULL;
84
+
85
+ err = js_create_external(env, (void *) CFBridgingRetain(handle), bare_ui_kit__on_bridged_release, NULL, &result);
86
+ assert(err == 0);
87
+ } else {
88
+ void *handle;
89
+ err = js_get_value_external(env, argv[1], &handle);
90
+ assert(err == 0);
91
+
92
+ UIViewController *view_controller = (__bridge UIViewController *) handle;
93
+
94
+ window.rootViewController = view_controller;
95
+ }
96
+ }
97
+
98
+ return result;
99
+ }
100
+
101
+ static js_value_t *
102
+ bare_ui_kit_window_make_key_window(js_env_t *env, js_callback_info_t *info) {
103
+ int err;
104
+
105
+ size_t argc = 1;
106
+ js_value_t *argv[1];
107
+
108
+ err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
109
+ assert(err == 0);
110
+
111
+ assert(argc == 1);
112
+
113
+ void *handle;
114
+ err = js_get_value_external(env, argv[0], &handle);
115
+ assert(err == 0);
116
+
117
+ @autoreleasepool {
118
+ BareWindow *window = (__bridge BareWindow *) handle;
119
+
120
+ [window makeKeyWindow];
121
+ }
122
+
123
+ return NULL;
124
+ }
package/lib/window.js ADDED
@@ -0,0 +1,34 @@
1
+ const binding = require('../binding')
2
+ const UIKitView = require('./view')
3
+ const UIKitViewController = require('./view-controller')
4
+
5
+ module.exports = exports = class UIKitWindow extends UIKitView {
6
+ constructor() {
7
+ super()
8
+
9
+ this._handle = binding.windowInit(this)
10
+ }
11
+
12
+ get rootViewController() {
13
+ const handle = binding.windowRootViewController(this._handle)
14
+
15
+ if (handle === undefined) return null
16
+
17
+ return new UIKitViewController(handle)
18
+ }
19
+
20
+ set rootViewController(viewController) {
21
+ binding.windowRootViewController(this._handle, viewController._handle)
22
+ }
23
+
24
+ makeKeyWindow() {
25
+ binding.windowMakeKeyWindow(this._handle)
26
+ return this
27
+ }
28
+
29
+ [Symbol.for('bare.inspect')]() {
30
+ return {
31
+ __proto__: { constructor: UIKitWindow }
32
+ }
33
+ }
34
+ }
package/package.json CHANGED
@@ -1,20 +1,26 @@
1
1
  {
2
2
  "name": "bare-ui-kit",
3
- "version": "0.1.0",
4
- "description": "UIKit runtime for Bare",
3
+ "version": "0.2.0",
4
+ "description": "UIKit bindings and runtime for Bare",
5
5
  "exports": {
6
6
  "./package": "./package.json",
7
+ ".": "./index.js",
7
8
  "./runtime": "./runtime.js"
8
9
  },
9
10
  "files": [
10
11
  "index.js",
12
+ "binding.m",
13
+ "binding.js",
11
14
  "runtime.js",
12
15
  "CMakeLists.txt",
13
16
  "lib",
14
17
  "prebuilds"
15
18
  ],
19
+ "addon": true,
16
20
  "scripts": {
17
- "test": "prettier . --check"
21
+ "format": "prettier --write . && lunte --fix",
22
+ "lint": "prettier --check . && lunte",
23
+ "test": "brittle-bare --coverage test.js"
18
24
  },
19
25
  "repository": {
20
26
  "type": "git",
@@ -27,12 +33,17 @@
27
33
  },
28
34
  "homepage": "https://github.com/holepunchto/bare-ui-kit#readme",
29
35
  "dependencies": {
36
+ "bare-events": "^2.8.2",
30
37
  "require-asset": "^1.1.0"
31
38
  },
39
+ "peerDependencies": {
40
+ "bare-build": "^1.0.0"
41
+ },
32
42
  "devDependencies": {
33
43
  "brittle": "^3.18.0",
34
44
  "cmake-bare": "^1.6.5",
35
45
  "cmake-fetch": "^1.4.0",
46
+ "lunte": "^1.8.0",
36
47
  "prettier": "^3.4.1",
37
48
  "prettier-config-holepunch": "^2.0.0"
38
49
  }
Binary file
Binary file
Binary file
package/runtime.js CHANGED
@@ -1,3 +1,7 @@
1
+ const { type } = require('bare-build/constants')
2
+
3
+ const { EXECUTABLE } = type
4
+
1
5
  require.asset = require('require-asset')
2
6
 
3
7
  const prebuilds = {}
@@ -5,13 +9,25 @@ const prebuilds = {}
5
9
  exports.prebuilds = prebuilds
6
10
 
7
11
  prebuilds['ios-arm64'] = () => {
8
- return require.asset('./prebuilds/ios-arm64/bare', __filename)
12
+ return {
13
+ type: EXECUTABLE,
14
+ path: require.asset('./prebuilds/ios-arm64/bare', __filename),
15
+ dependencies: []
16
+ }
9
17
  }
10
18
 
11
19
  prebuilds['ios-arm64-simulator'] = () => {
12
- return require.asset('./prebuilds/ios-arm64-simulator/bare', __filename)
20
+ return {
21
+ type: EXECUTABLE,
22
+ path: require.asset('./prebuilds/ios-arm64-simulator/bare', __filename),
23
+ dependencies: []
24
+ }
13
25
  }
14
26
 
15
27
  prebuilds['ios-x64-simulator'] = () => {
16
- return require.asset('./prebuilds/ios-x64-simulator/bare', __filename)
28
+ return {
29
+ type: EXECUTABLE,
30
+ path: require.asset('./prebuilds/ios-x64-simulator/bare', __filename),
31
+ dependencies: []
32
+ }
17
33
  }