basalt-core 0.0.0-rc5 → 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.
Files changed (149) hide show
  1. package/dist/cli/basalt.d.ts.map +1 -1
  2. package/dist/cli/basalt.js +18 -1
  3. package/dist/cli/basalt.js.map +1 -1
  4. package/dist/cli/bundle-cli.js +0 -0
  5. package/dist/cli/desktop.d.ts.map +1 -1
  6. package/dist/cli/desktop.js +53 -4
  7. package/dist/cli/desktop.js.map +1 -1
  8. package/dist/cli/packageApp.d.ts.map +1 -1
  9. package/dist/cli/packageApp.js +7 -1
  10. package/dist/cli/packageApp.js.map +1 -1
  11. package/dist/metro-config.d.ts.map +1 -1
  12. package/dist/metro-config.js +53 -5
  13. package/dist/metro-config.js.map +1 -1
  14. package/dist/src/KeyHandler.d.ts +1 -1
  15. package/dist/src/KeyHandler.d.ts.map +1 -1
  16. package/dist/src/KeyHandler.js.map +1 -1
  17. package/dist/src/index.d.ts +5 -0
  18. package/dist/src/index.d.ts.map +1 -1
  19. package/dist/src/overrides/Alert.d.ts +1 -1
  20. package/dist/src/overrides/Alert.js +1 -1
  21. package/dist/src/overrides/BaseViewConfig.d.ts +10 -3
  22. package/dist/src/overrides/BaseViewConfig.d.ts.map +1 -1
  23. package/dist/src/overrides/BaseViewConfig.js +21 -3
  24. package/dist/src/overrides/BaseViewConfig.js.map +1 -1
  25. package/dist/src/overrides/Button.d.ts +81 -0
  26. package/dist/src/overrides/Button.d.ts.map +1 -0
  27. package/dist/src/overrides/Button.js +109 -0
  28. package/dist/src/overrides/Button.js.map +1 -0
  29. package/dist/src/overrides/ScrollView.d.ts +25 -2
  30. package/dist/src/overrides/ScrollView.d.ts.map +1 -1
  31. package/dist/src/overrides/ScrollView.js +64 -7
  32. package/dist/src/overrides/ScrollView.js.map +1 -1
  33. package/dist/src/overrides/Settings.d.ts +81 -0
  34. package/dist/src/overrides/Settings.d.ts.map +1 -0
  35. package/dist/src/overrides/Settings.js +120 -0
  36. package/dist/src/overrides/Settings.js.map +1 -0
  37. package/dist/src/overrides/processDecelerationRate.d.ts +20 -0
  38. package/dist/src/overrides/processDecelerationRate.d.ts.map +1 -0
  39. package/dist/src/overrides/processDecelerationRate.js +31 -0
  40. package/dist/src/overrides/processDecelerationRate.js.map +1 -0
  41. package/dist/src/useContextMenu.d.ts +57 -6
  42. package/dist/src/useContextMenu.d.ts.map +1 -1
  43. package/dist/src/useContextMenu.js +34 -1
  44. package/dist/src/useContextMenu.js.map +1 -1
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/native/CMakeLists.txt +85 -1
  47. package/native/cmake/Skia.cmake +29 -6
  48. package/native/core/ActionSheet.cpp +75 -0
  49. package/native/core/ActionSheet.h +90 -0
  50. package/native/core/AppStateHost.cpp +76 -0
  51. package/native/core/AppStateHost.h +68 -0
  52. package/native/core/BackgroundLayers.h +282 -0
  53. package/native/core/BlendModes.h +67 -0
  54. package/native/core/CoreModules.cpp +380 -11
  55. package/native/core/CoreModules.h +140 -4
  56. package/native/core/CrashHandler.cpp +246 -0
  57. package/native/core/CrashHandler.h +65 -0
  58. package/native/core/CursorNames.h +110 -0
  59. package/native/core/DevMenu.cpp +6 -5
  60. package/native/core/DeviceMetrics.cpp +87 -0
  61. package/native/core/DeviceMetrics.h +80 -0
  62. package/native/core/Filters.h +336 -0
  63. package/native/core/FontFitting.h +183 -0
  64. package/native/core/FontScaling.h +153 -0
  65. package/native/core/FontVariants.h +148 -0
  66. package/native/core/Gradients.h +523 -0
  67. package/native/core/ImageAnimation.h +109 -0
  68. package/native/core/ImageBytes.cpp +28 -1
  69. package/native/core/ImageBytes.h +17 -1
  70. package/native/core/ImageProgress.h +85 -0
  71. package/native/core/LabelRegistry.h +189 -0
  72. package/native/core/LegacyShadow.h +90 -0
  73. package/native/core/LiveRegions.h +114 -0
  74. package/native/core/MenuModule.cpp +35 -4
  75. package/native/core/MountingWalk.h +125 -2
  76. package/native/core/PlatformServices.h +187 -3
  77. package/native/core/SafeAreaComponent.cpp +115 -0
  78. package/native/core/SafeAreaComponent.h +105 -0
  79. package/native/core/ScreensComponent.cpp +201 -0
  80. package/native/core/ScreensComponent.h +216 -0
  81. package/native/core/ScrollBounds.cpp +8 -0
  82. package/native/core/ScrollBounds.h +14 -0
  83. package/native/core/ScrollIndicator.h +67 -0
  84. package/native/core/ScrollMomentum.cpp +24 -0
  85. package/native/core/ScrollMomentum.h +14 -0
  86. package/native/core/ScrollSnap.cpp +121 -12
  87. package/native/core/ScrollSnap.h +45 -0
  88. package/native/core/ScrollVisiblePosition.cpp +68 -0
  89. package/native/core/ScrollVisiblePosition.h +101 -0
  90. package/native/core/SettingsStore.cpp +199 -0
  91. package/native/core/SettingsStore.h +127 -0
  92. package/native/core/ShadowShape.h +38 -0
  93. package/native/core/SkiaViewComponent.cpp +11 -0
  94. package/native/core/SkiaViewComponent.h +50 -0
  95. package/native/core/SystemLocale.cpp +103 -0
  96. package/native/core/SystemLocale.h +86 -0
  97. package/native/core/TestDialog.cpp +45 -6
  98. package/native/core/TestDialog.h +15 -0
  99. package/native/core/TextAlignments.h +240 -0
  100. package/native/core/TextChecking.h +133 -0
  101. package/native/core/TextColors.h +83 -0
  102. package/native/core/TextDecorations.h +101 -0
  103. package/native/core/TextDirection.cpp +242 -0
  104. package/native/core/TextDirection.h +88 -0
  105. package/native/core/TextHighlight.h +30 -0
  106. package/native/core/TextSelection.cpp +97 -0
  107. package/native/core/TextSelection.h +161 -0
  108. package/native/core/TextShadows.h +96 -0
  109. package/native/core/TextVerticalAlign.h +33 -0
  110. package/native/core/UIManagerAccess.cpp +36 -0
  111. package/native/core/UIManagerAccess.h +28 -0
  112. package/native/core/WindowBoundsCache.cpp +58 -1
  113. package/native/core/WindowControl.h +24 -0
  114. package/native/core/WritingDirections.h +52 -0
  115. package/native/core/portability_probe.cpp +7 -0
  116. package/native/tests/RenamedFontFile.h +161 -0
  117. package/native/tests/TestHarness.cpp +18 -0
  118. package/native/tests/test_action_sheet.cpp +157 -0
  119. package/native/tests/test_app_state.cpp +60 -0
  120. package/native/tests/test_background_layers.cpp +281 -0
  121. package/native/tests/test_blend_modes.cpp +79 -0
  122. package/native/tests/test_blobs.cpp +1 -1
  123. package/native/tests/test_device_metrics.cpp +126 -0
  124. package/native/tests/test_filters.cpp +271 -0
  125. package/native/tests/test_font_fitting.cpp +172 -0
  126. package/native/tests/test_font_scaling.cpp +127 -0
  127. package/native/tests/test_font_variants.cpp +84 -0
  128. package/native/tests/test_gradients.cpp +390 -0
  129. package/native/tests/test_image_animation.cpp +105 -0
  130. package/native/tests/test_image_progress.cpp +94 -0
  131. package/native/tests/test_label_registry.cpp +262 -0
  132. package/native/tests/test_legacy_shadow.cpp +165 -0
  133. package/native/tests/test_live_regions.cpp +108 -0
  134. package/native/tests/test_menu_entries.cpp +192 -0
  135. package/native/tests/test_momentum.cpp +45 -0
  136. package/native/tests/test_scroll_bounds.cpp +42 -0
  137. package/native/tests/test_scroll_indicator.cpp +61 -0
  138. package/native/tests/test_scroll_snap.cpp +129 -0
  139. package/native/tests/test_scroll_visible_position.cpp +121 -0
  140. package/native/tests/test_settings_store.cpp +257 -0
  141. package/native/tests/test_shadow_shape.cpp +47 -0
  142. package/native/tests/test_system_locale.cpp +36 -0
  143. package/native/tests/test_text_alignment.cpp +299 -0
  144. package/native/tests/test_text_checking.cpp +31 -0
  145. package/native/tests/test_text_colors.cpp +92 -0
  146. package/native/tests/test_text_decorations.cpp +100 -0
  147. package/native/tests/test_text_selection.cpp +168 -0
  148. package/native/tests/test_text_shadows.cpp +132 -0
  149. package/package.json +4 -2
@@ -0,0 +1,168 @@
1
+ // What a press and a drag mean inside selectable text.
2
+ //
3
+ // The selection itself is two integers and an ordering; what is worth asserting
4
+ // is the arbitration, because that is where a wrong answer breaks something
5
+ // else. A press that claimed immediately would stop a `<Pressable>` wrapping
6
+ // the text from ever firing, and a press that never claimed would scroll the
7
+ // list instead of selecting. Both are invisible in a screenshot.
8
+
9
+ #include "TestHarness.h"
10
+
11
+ #include "TextSelection.h"
12
+
13
+ #include <sstream>
14
+ #include <string>
15
+
16
+ using basalt::TextSelection;
17
+ using facebook::react::Point;
18
+
19
+ namespace {
20
+
21
+ // A paragraph's tag, for readability: the number itself means nothing.
22
+ constexpr facebook::react::Tag kParagraph = 7;
23
+ constexpr facebook::react::Tag kOtherParagraph = 9;
24
+
25
+ } // namespace
26
+
27
+ TEST(selection_a_press_selects_nothing) {
28
+ // The whole arbitration rests on this: a press is a tap until it moves, so
29
+ // nothing is selected and nothing is claimed.
30
+ TextSelection selection;
31
+ selection.press(kParagraph, 4, Point{10, 10});
32
+ EXPECT(!selection.dragging());
33
+ EXPECT(!selection.active());
34
+ EXPECT(selection.range().empty());
35
+ EXPECT_EQ((long)selection.tag(), 0L);
36
+ }
37
+
38
+ TEST(selection_a_small_move_is_still_a_tap) {
39
+ // A cursor delivers sub-pixel motion and a hand shakes. Claiming here would
40
+ // cancel a touch sequence that is still a press.
41
+ TextSelection selection;
42
+ selection.press(kParagraph, 4, Point{10, 10});
43
+ EXPECT(!selection.moveTo(5, Point{11, 10}));
44
+ EXPECT(!selection.moveTo(5, Point{10, 11.5}));
45
+ EXPECT(!selection.active());
46
+ EXPECT(selection.range().empty());
47
+ }
48
+
49
+ TEST(selection_a_move_past_the_threshold_claims_the_gesture_once) {
50
+ TextSelection selection;
51
+ selection.press(kParagraph, 4, Point{10, 10});
52
+
53
+ // True the once: the caller cancels the touch sequence on this edge, and
54
+ // cancelling twice would be a second touchcancel for one gesture.
55
+ EXPECT(selection.moveTo(9, Point{40, 10}));
56
+ EXPECT(!selection.moveTo(12, Point{60, 10}));
57
+ EXPECT(!selection.moveTo(14, Point{80, 10}));
58
+
59
+ EXPECT(selection.dragging());
60
+ EXPECT(selection.active());
61
+ EXPECT_EQ((long)selection.tag(), (long)kParagraph);
62
+ EXPECT_EQ(selection.range().start, 4);
63
+ EXPECT_EQ(selection.range().length, 10);
64
+ }
65
+
66
+ TEST(selection_a_drag_backwards_selects_the_same_text) {
67
+ // Anchor and focus are where the gesture started and where it is now, in that
68
+ // order; a range is the two of them sorted. Reporting a negative length to a
69
+ // highlight would draw nothing and look like the feature was off.
70
+ TextSelection selection;
71
+ selection.press(kParagraph, 12, Point{80, 10});
72
+ EXPECT(selection.moveTo(4, Point{40, 10}));
73
+ EXPECT_EQ(selection.range().start, 4);
74
+ EXPECT_EQ(selection.range().length, 8);
75
+ }
76
+
77
+ TEST(selection_a_release_keeps_the_selection_and_ends_the_drag) {
78
+ TextSelection selection;
79
+ selection.press(kParagraph, 4, Point{10, 10});
80
+ EXPECT(selection.moveTo(9, Point{40, 10}));
81
+ selection.release();
82
+
83
+ // The highlight stays: a person lets go of the mouse and expects the text to
84
+ // stay selected until they click somewhere.
85
+ EXPECT(selection.active());
86
+ EXPECT_EQ(selection.range().length, 5);
87
+ // And moving afterwards does not extend it, the button being up.
88
+ EXPECT(!selection.dragging());
89
+ EXPECT(!selection.moveTo(20, Point{200, 10}));
90
+ EXPECT_EQ(selection.range().length, 5);
91
+ }
92
+
93
+ TEST(selection_a_tap_clears_what_was_selected) {
94
+ TextSelection selection;
95
+ selection.press(kParagraph, 4, Point{10, 10});
96
+ EXPECT(selection.moveTo(9, Point{40, 10}));
97
+ selection.release();
98
+ EXPECT(selection.active());
99
+
100
+ // On the press rather than the release: a highlight that survived the click
101
+ // meant to dismiss it until the button came up again would flicker.
102
+ selection.press(kParagraph, 2, Point{20, 10});
103
+ EXPECT(!selection.active());
104
+ EXPECT(selection.range().empty());
105
+ }
106
+
107
+ TEST(selection_a_press_outside_selectable_text_cannot_become_one) {
108
+ // Tag 0 is "nothing selectable here", which is what a host passes for a press
109
+ // on a view that is not a selectable paragraph. Every later move has to stay
110
+ // a touch, or dragging over a plain view would cancel its own press.
111
+ TextSelection selection;
112
+ selection.press(0, 0, Point{10, 10});
113
+ EXPECT(!selection.moveTo(5, Point{80, 10}));
114
+ EXPECT(!selection.dragging());
115
+ EXPECT(!selection.active());
116
+ }
117
+
118
+ TEST(selection_a_press_in_another_paragraph_moves_it) {
119
+ TextSelection selection;
120
+ selection.press(kParagraph, 4, Point{10, 10});
121
+ EXPECT(selection.moveTo(9, Point{40, 10}));
122
+ selection.release();
123
+
124
+ selection.press(kOtherParagraph, 1, Point{10, 100});
125
+ EXPECT(selection.moveTo(6, Point{50, 100}));
126
+ EXPECT_EQ((long)selection.tag(), (long)kOtherParagraph);
127
+ EXPECT_EQ(selection.range().start, 1);
128
+ EXPECT_EQ(selection.range().length, 5);
129
+ }
130
+
131
+ TEST(selection_a_drag_that_comes_back_to_where_it_started_selects_nothing) {
132
+ // Claimed and empty, which is a real state: the gesture is a selection -- the
133
+ // touch sequence was cancelled and cannot be un-cancelled -- and there is
134
+ // nothing to draw. A host asking `active()` gets false and draws nothing,
135
+ // which is what matters.
136
+ TextSelection selection;
137
+ selection.press(kParagraph, 4, Point{10, 10});
138
+ EXPECT(selection.moveTo(9, Point{40, 10}));
139
+ EXPECT(!selection.moveTo(4, Point{10, 10}));
140
+ EXPECT(selection.dragging());
141
+ EXPECT(!selection.active());
142
+ EXPECT(selection.range().empty());
143
+ }
144
+
145
+ TEST(selection_clearing_forgets_the_paragraph_as_well) {
146
+ // What a mutation calls when the text it was selecting is gone: an index into
147
+ // a paragraph that has been re-laid-out means nothing, and a highlight drawn
148
+ // from it would be in the wrong place rather than absent.
149
+ TextSelection selection;
150
+ selection.press(kParagraph, 4, Point{10, 10});
151
+ EXPECT(selection.moveTo(9, Point{40, 10}));
152
+ selection.clear();
153
+ EXPECT(!selection.active());
154
+ EXPECT(!selection.dragging());
155
+ EXPECT_EQ((long)selection.tag(), 0L);
156
+ EXPECT(selection.range().empty());
157
+ }
158
+
159
+ TEST(selection_a_vertical_drag_claims_too) {
160
+ // The threshold is a distance rather than a horizontal one: selecting from
161
+ // one line to the next is mostly vertical motion, and a sweep down a
162
+ // paragraph has to claim as readily as a sweep across one.
163
+ TextSelection selection;
164
+ selection.press(kParagraph, 4, Point{10, 10});
165
+ EXPECT(selection.moveTo(40, Point{10, 40}));
166
+ EXPECT(selection.active());
167
+ EXPECT_EQ(selection.range().length, 36);
168
+ }
@@ -0,0 +1,132 @@
1
+ // The text shadow a paragraph draws. See core/TextShadows.h.
2
+ //
3
+ // The resolution is shared because the rule is a decision rather than a
4
+ // reading: the props are per fragment and neither text engine can draw a
5
+ // different shadow per run, so the first fragment that asks for one wins. A
6
+ // host deciding that for itself would be a host deciding it differently.
7
+
8
+ #include "TestHarness.h"
9
+
10
+ #include "TextShadows.h"
11
+
12
+ #include <sstream>
13
+ #include <utility>
14
+ #include <vector>
15
+
16
+ using basalt::TextShadow;
17
+ using basalt::textShadow;
18
+ using facebook::react::AttributedString;
19
+ using facebook::react::ColorComponents;
20
+ using Fragment = facebook::react::AttributedString::Fragment;
21
+ using facebook::react::TextAttributes;
22
+
23
+ namespace {
24
+
25
+ Fragment fragmentWith(const TextAttributes &attributes, const std::string &text = "x") {
26
+ Fragment fragment;
27
+ fragment.string = text;
28
+ fragment.textAttributes = attributes;
29
+ return fragment;
30
+ }
31
+
32
+ TextAttributes shadowed(float dx, float dy, float radius, float alpha) {
33
+ TextAttributes attributes;
34
+ attributes.textShadowOffset = facebook::react::Size{dx, dy};
35
+ attributes.textShadowRadius = radius;
36
+ attributes.textShadowColor =
37
+ facebook::react::colorFromComponents(ColorComponents{1.0F, 0.0F, 0.0F, alpha});
38
+ return attributes;
39
+ }
40
+
41
+ AttributedString stringOf(std::vector<Fragment> fragments) {
42
+ AttributedString string;
43
+ for (auto &fragment : fragments) {
44
+ // appendFragment takes an rvalue, which is how React Native's own callers
45
+ // build one.
46
+ string.appendFragment(std::move(fragment));
47
+ }
48
+ return string;
49
+ }
50
+
51
+ // Not `near`: that is a legacy macro from <minwindef.h>, which arrives
52
+ // through AttributedString.h on Windows and turns the declaration below into
53
+ // `bool (float, float)`. Every other core test that spells it `near` gets away
54
+ // with it by not including that header.
55
+ bool closeTo(float a, float b) { return std::fabs(a - b) < 0.001F; }
56
+
57
+ } // namespace
58
+
59
+ TEST(text_shadow_carries_its_offset_sigma_and_colour) {
60
+ const auto shadow = textShadow(stringOf({fragmentWith(shadowed(2.0F, 3.0F, 4.0F, 0.5F))}));
61
+ EXPECT(shadow.has_value());
62
+ if (!shadow.has_value()) {
63
+ return;
64
+ }
65
+ EXPECT(closeTo(shadow->dx, 2.0F));
66
+ EXPECT(closeTo(shadow->dy, 3.0F));
67
+ // The standard deviation as React Native gave it: iOS puts this straight into
68
+ // NSShadow's blur radius, so it is not CSS's radius and must not be halved or
69
+ // doubled here. Each host converts for its own call.
70
+ EXPECT(closeTo(shadow->standardDeviation, 4.0F));
71
+ EXPECT(closeTo(shadow->red, 1.0F));
72
+ // Within a byte: a colour is packed to eight bits a channel on the way in, so
73
+ // half alpha comes back as 128/255 rather than as 0.5 exactly.
74
+ EXPECT(std::fabs(shadow->alpha - 0.5F) < 0.01F);
75
+ }
76
+
77
+ // The first fragment that asks for one, which is the rule and the limit.
78
+ TEST(text_shadow_is_the_first_fragments) {
79
+ TextAttributes plain;
80
+ const auto shadow = textShadow(stringOf({
81
+ fragmentWith(plain, "no shadow here"),
82
+ fragmentWith(shadowed(1.0F, 1.0F, 1.0F, 1.0F), "this one"),
83
+ fragmentWith(shadowed(9.0F, 9.0F, 9.0F, 1.0F), "not this one"),
84
+ }));
85
+ EXPECT(shadow.has_value());
86
+ EXPECT(shadow.has_value() && closeTo(shadow->dx, 1.0F));
87
+ }
88
+
89
+ // No colour is no shadow, which is React Native's default for every `<Text>`:
90
+ // the props are three and the colour is the one that turns it on.
91
+ TEST(text_shadow_needs_a_colour) {
92
+ TextAttributes noColour;
93
+ noColour.textShadowOffset = facebook::react::Size{2.0F, 2.0F};
94
+ noColour.textShadowRadius = 3.0F;
95
+ EXPECT(!textShadow(stringOf({fragmentWith(noColour)})).has_value());
96
+
97
+ // And a transparent colour is a shadow an app asked to be invisible.
98
+ EXPECT(!textShadow(stringOf({fragmentWith(shadowed(2.0F, 2.0F, 3.0F, 0.0F))})).has_value());
99
+ }
100
+
101
+ // A shadow with no offset and no blur is behind the glyphs and cannot be seen,
102
+ // so it is skipped rather than drawn: both hosts pay for a shadow pass.
103
+ TEST(text_shadow_with_no_offset_and_no_blur_is_nothing) {
104
+ EXPECT(!textShadow(stringOf({fragmentWith(shadowed(0.0F, 0.0F, 0.0F, 1.0F))})).has_value());
105
+ // A blur on its own is visible, though, and so is an offset on its own.
106
+ EXPECT(textShadow(stringOf({fragmentWith(shadowed(0.0F, 0.0F, 2.0F, 1.0F))})).has_value());
107
+ EXPECT(textShadow(stringOf({fragmentWith(shadowed(1.0F, 0.0F, 0.0F, 1.0F))})).has_value());
108
+ }
109
+
110
+ // `textShadowRadius` arrives as NaN when the style does not set it, which is how
111
+ // React Native spells "not set" for a Float -- and NaN in a blur is a crash or a
112
+ // blank paragraph depending on the renderer.
113
+ TEST(text_shadow_an_unset_radius_is_zero_rather_than_nan) {
114
+ TextAttributes attributes;
115
+ attributes.textShadowOffset = facebook::react::Size{2.0F, 0.0F};
116
+ attributes.textShadowColor =
117
+ facebook::react::colorFromComponents(ColorComponents{0.0F, 0.0F, 0.0F, 1.0F});
118
+ // textShadowRadius is left at its default, which is quiet NaN.
119
+ const auto shadow = textShadow(stringOf({fragmentWith(attributes)}));
120
+ EXPECT(shadow.has_value());
121
+ EXPECT(shadow.has_value() && closeTo(shadow->standardDeviation, 0.0F));
122
+
123
+ // And a negative radius is clamped, which a stylesheet can ask for and a
124
+ // gaussian cannot take.
125
+ TextAttributes negative = shadowed(1.0F, 1.0F, -8.0F, 1.0F);
126
+ const auto clamped = textShadow(stringOf({fragmentWith(negative)}));
127
+ EXPECT(clamped.has_value() && closeTo(clamped->standardDeviation, 0.0F));
128
+ }
129
+
130
+ TEST(text_shadow_an_empty_string_has_none) {
131
+ EXPECT(!textShadow(AttributedString{}).has_value());
132
+ }
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "basalt-core",
3
- "version": "0.0.0-rc5",
3
+ "version": "0.2.0",
4
4
  "description": "React Native on the desktop, over React Native's own C++ core rather than a fork. The shared half: the platform module, the Metro configuration that resolves it, the bundler, and the C++ that is not about a toolkit.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "git+https://github.com/vincentvella/basalt-core.git",
8
+ "url": "git+https://github.com/vincentvella/basalt.git",
9
9
  "directory": "packages/basalt-core"
10
10
  },
11
+ "homepage": "https://basaltjs.dev",
11
12
  "main": "dist/src/index.js",
12
13
  "exports": {
13
14
  ".": "./dist/src/index.js",
@@ -33,6 +34,7 @@
33
34
  },
34
35
  "bin": {
35
36
  "basalt": "dist/cli/basalt.js",
37
+ "basalt-core": "dist/cli/basalt.js",
36
38
  "basalt-bundle": "dist/cli/bundle-cli.js"
37
39
  },
38
40
  "types": "dist/src/index.d.ts",