bare-ui-kit 0.0.0 → 0.1.1

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
@@ -8,6 +8,20 @@ project(bare_ui_kit C OBJC)
8
8
  fetch_package("github:holepunchto/bare@1.24.5")
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,10 +1,10 @@
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>
7
+ #import <unistd.h>
8
8
  #import <uv.h>
9
9
 
10
10
  #import <UIKit/UIKit.h>
@@ -14,9 +14,6 @@ static uv_async_t bare__platform_shutdown;
14
14
  static uv_thread_t bare__platform_thread;
15
15
  static js_platform_t *bare__platform;
16
16
 
17
- static int bare__argc;
18
- static char **bare__argv;
19
-
20
17
  static uv_loop_t *bare__loop;
21
18
  static uv_async_t bare__shutdown;
22
19
  static bare_t *bare;
@@ -89,24 +86,6 @@ static void
89
86
  bare__launch(void) {
90
87
  int err;
91
88
 
92
- err = uv_barrier_init(&bare__platform_ready, 2);
93
- assert(err == 0);
94
-
95
- err = uv_thread_create(&bare__platform_thread, bare__on_platform_thread, NULL);
96
- assert(err == 0);
97
-
98
- uv_barrier_wait(&bare__platform_ready);
99
-
100
- uv_barrier_destroy(&bare__platform_ready);
101
-
102
- bare__loop = uv_default_loop();
103
-
104
- err = uv_async_init(bare__loop, &bare__shutdown, bare__on_shutdown);
105
- assert(err == 0);
106
-
107
- err = bare_setup(bare__loop, bare__platform, NULL, bare__argc, (const char **) bare__argv, NULL, &bare);
108
- assert(err == 0);
109
-
110
89
  size_t len;
111
90
 
112
91
  char bin[4096];
@@ -115,22 +94,18 @@ bare__launch(void) {
115
94
  err = uv_exepath(bin, &len);
116
95
  assert(err == 0);
117
96
 
118
- size_t dir;
119
- err = path_dirname(bin, &dir, path_behavior_system);
120
- assert(err == 0);
121
-
122
- char bundle[4096];
97
+ char entry[4096];
123
98
  len = 4096;
124
99
 
125
100
  err = path_join(
126
101
  (const char *[]) {bin, "..", "app.bundle", NULL},
127
- bundle,
102
+ entry,
128
103
  &len,
129
104
  path_behavior_system
130
105
  );
131
106
  assert(err == 0);
132
107
 
133
- err = bare_load(bare, bundle, NULL, NULL);
108
+ err = bare_load(bare, entry, NULL, NULL);
134
109
  (void) err;
135
110
 
136
111
  dispatch_queue_t queue = dispatch_get_main_queue();
@@ -215,16 +190,69 @@ main(int argc, char *argv[]) {
215
190
  signal(SIGPIPE, SIG_IGN);
216
191
  #endif
217
192
 
218
- err = log_open("bare", 0);
219
- assert(err == 0);
220
-
221
193
  err = rlimit_set(rlimit_open_files, rlimit_infer);
222
194
  assert(err == 0);
223
195
 
196
+ uv_disable_stdio_inheritance();
197
+
224
198
  argv = uv_setup_args(argc, argv);
225
199
 
226
- bare__argc = argc;
227
- bare__argv = argv;
200
+ err = uv_barrier_init(&bare__platform_ready, 2);
201
+ assert(err == 0);
202
+
203
+ err = uv_thread_create(&bare__platform_thread, bare__on_platform_thread, NULL);
204
+ assert(err == 0);
205
+
206
+ uv_barrier_wait(&bare__platform_ready);
207
+
208
+ uv_barrier_destroy(&bare__platform_ready);
209
+
210
+ bare__loop = uv_default_loop();
211
+
212
+ size_t len;
213
+
214
+ char bin[4096];
215
+ len = sizeof(bin);
216
+
217
+ err = uv_exepath(bin, &len);
218
+ assert(err == 0);
219
+
220
+ char preflight[4096];
221
+ len = 4096;
222
+
223
+ err = path_join(
224
+ (const char *[]) {bin, "..", "preflight.bundle", NULL},
225
+ preflight,
226
+ &len,
227
+ path_behavior_system
228
+ );
229
+ assert(err == 0);
230
+
231
+ uv_fs_t fs;
232
+ err = uv_fs_access(bare__loop, &fs, preflight, R_OK, NULL);
233
+
234
+ if (err == 0) {
235
+ err = bare_setup(bare__loop, bare__platform, NULL, argc, (const char **) argv, NULL, &bare);
236
+ assert(err == 0);
237
+
238
+ err = bare_load(bare, preflight, NULL, NULL);
239
+ (void) err;
240
+
241
+ err = bare_run(bare, UV_RUN_DEFAULT);
242
+ assert(err == 0);
243
+
244
+ int exit_code;
245
+ err = bare_teardown(bare, UV_RUN_DEFAULT, &exit_code);
246
+ assert(err == 0);
247
+
248
+ if (exit_code != 0) _exit(exit_code);
249
+ }
250
+
251
+ err = uv_async_init(bare__loop, &bare__shutdown, bare__on_shutdown);
252
+ assert(err == 0);
253
+
254
+ err = bare_setup(bare__loop, bare__platform, NULL, argc, (const char **) argv, NULL, &bare);
255
+ assert(err == 0);
228
256
 
229
257
  @autoreleasepool {
230
258
  return UIApplicationMain(argc, argv, @"BareApp", @"BareApp");
@@ -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,18 +1,22 @@
1
1
  {
2
2
  "name": "bare-ui-kit",
3
- "version": "0.0.0",
4
- "description": "UIKit runtime for Bare",
3
+ "version": "0.1.1",
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
21
  "test": "prettier . --check"
18
22
  },
@@ -27,6 +31,7 @@
27
31
  },
28
32
  "homepage": "https://github.com/holepunchto/bare-ui-kit#readme",
29
33
  "dependencies": {
34
+ "bare-events": "^2.8.2",
30
35
  "require-asset": "^1.1.0"
31
36
  },
32
37
  "devDependencies": {
Binary file
Binary file