@lucent-lang/lucent 0.0.4

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 (125) hide show
  1. package/app.plugin.js +92 -0
  2. package/bin/lucent.cjs +16 -0
  3. package/core/index.cjs +11 -0
  4. package/dist/bench-CR3E7e2e.js +304 -0
  5. package/dist/build-CAIrRSYA.js +7 -0
  6. package/dist/build-check-QozuNJm5.js +92 -0
  7. package/dist/check-1SCmYlqA.js +7 -0
  8. package/dist/clean-BVwpbJ5K.js +35 -0
  9. package/dist/cli.js +406 -0
  10. package/dist/codes-CIuwXt1S.js +260 -0
  11. package/dist/compiler.js +4 -0
  12. package/dist/confirm-BYF5eY3q.js +34 -0
  13. package/dist/dashboard-B-NzjjaN.js +91 -0
  14. package/dist/dev-BYWMP7oC.js +221 -0
  15. package/dist/diagnostic-BM9sXmwl.js +30 -0
  16. package/dist/diff-BTDo3Sro.js +44 -0
  17. package/dist/doctor-C0PrfWT6.js +230 -0
  18. package/dist/doctor-DdR4JnVc.js +30 -0
  19. package/dist/explain--vV1oaRl.js +35 -0
  20. package/dist/format-D9fnIMEx.js +53 -0
  21. package/dist/init-gIabu1S_.js +207 -0
  22. package/dist/live-steps-BGcWFM9M.js +79 -0
  23. package/dist/new-module-C2mtb0op.js +66 -0
  24. package/dist/package-manager-BnxwCySi.js +30 -0
  25. package/dist/package.json +3 -0
  26. package/dist/packages-HyskKIsY.js +150 -0
  27. package/dist/pipeline-CH7-2cxu.js +232 -0
  28. package/dist/project-D8tEet0k.js +150 -0
  29. package/dist/sdk-coverage-BoW_3Efd.js +64 -0
  30. package/dist/sdk-prefetch-mo04JDZV.js +89 -0
  31. package/dist/sdk-search-Iv4K3-8a.js +124 -0
  32. package/dist/sdk-show-CkrdlqlP.js +74 -0
  33. package/dist/sdks-Xoyiy2E4.js +28 -0
  34. package/dist/src-BD7f1_aZ.js +11493 -0
  35. package/dist/steps--_h-FFS7.js +24 -0
  36. package/dist/theme-uv5bc0aK.js +134 -0
  37. package/dist/tsconfig-S4uyLNzf.js +59 -0
  38. package/dist/version-bqpIO5sP.js +26 -0
  39. package/gradle/lucent-classpath.gradle +38 -0
  40. package/gradle/lucent-classpath.init.gradle +6 -0
  41. package/gradle/lucent.gradle +24 -0
  42. package/lib/core.cjs +106 -0
  43. package/lib/globals.d.ts +36 -0
  44. package/lib/sdk/android.d.ts +8 -0
  45. package/lib/sdk/core.d.ts +23 -0
  46. package/lib/sdk/ios.d.ts +33 -0
  47. package/lib/sdk/platform.d.ts +8 -0
  48. package/lib/sdk/thread.d.ts +8 -0
  49. package/metro/index.cjs +72 -0
  50. package/metro/index.d.ts +6 -0
  51. package/metro/transformer.cjs +70 -0
  52. package/package.json +61 -0
  53. package/runtime/cpp/lucent/abort.cpp +61 -0
  54. package/runtime/cpp/lucent/abort.h +54 -0
  55. package/runtime/cpp/lucent/array.h +442 -0
  56. package/runtime/cpp/lucent/async.h +236 -0
  57. package/runtime/cpp/lucent/builtins.cpp +163 -0
  58. package/runtime/cpp/lucent/bytes.h +129 -0
  59. package/runtime/cpp/lucent/console.h +17 -0
  60. package/runtime/cpp/lucent/core.h +129 -0
  61. package/runtime/cpp/lucent/date.cpp +441 -0
  62. package/runtime/cpp/lucent/date.h +82 -0
  63. package/runtime/cpp/lucent/equality.h +87 -0
  64. package/runtime/cpp/lucent/function.h +61 -0
  65. package/runtime/cpp/lucent/generator.h +244 -0
  66. package/runtime/cpp/lucent/helpers.h +226 -0
  67. package/runtime/cpp/lucent/jserror.cpp +51 -0
  68. package/runtime/cpp/lucent/jserror.h +66 -0
  69. package/runtime/cpp/lucent/jsi/convert.cpp +202 -0
  70. package/runtime/cpp/lucent/jsi/convert.h +612 -0
  71. package/runtime/cpp/lucent/jsi/host.cpp +322 -0
  72. package/runtime/cpp/lucent/jsi/host.h +166 -0
  73. package/runtime/cpp/lucent/json.cpp +243 -0
  74. package/runtime/cpp/lucent/json.h +164 -0
  75. package/runtime/cpp/lucent/json_parse.h +138 -0
  76. package/runtime/cpp/lucent/jsstring.cpp +874 -0
  77. package/runtime/cpp/lucent/jsstring.h +152 -0
  78. package/runtime/cpp/lucent/lucent.h +24 -0
  79. package/runtime/cpp/lucent/map.h +344 -0
  80. package/runtime/cpp/lucent/native.cpp +76 -0
  81. package/runtime/cpp/lucent/native.h +116 -0
  82. package/runtime/cpp/lucent/number.cpp +545 -0
  83. package/runtime/cpp/lucent/number.h +190 -0
  84. package/runtime/cpp/lucent/ops.h +165 -0
  85. package/runtime/cpp/lucent/platform/android.cpp +437 -0
  86. package/runtime/cpp/lucent/platform/android.h +117 -0
  87. package/runtime/cpp/lucent/platform/ios.h +297 -0
  88. package/runtime/cpp/lucent/platform/ios.mm +31 -0
  89. package/runtime/cpp/lucent/regexp.cpp +440 -0
  90. package/runtime/cpp/lucent/regexp.h +107 -0
  91. package/runtime/cpp/lucent/scheduler.cpp +153 -0
  92. package/runtime/cpp/lucent/scheduler.h +160 -0
  93. package/runtime/cpp/lucent/unicode_data.inc +4051 -0
  94. package/runtime/cpp/rn/LucentModule.cpp +35 -0
  95. package/runtime/cpp/rn/LucentModule.h +37 -0
  96. package/runtime/cpp/third_party/quickjs/LICENSE +22 -0
  97. package/runtime/cpp/third_party/quickjs/README.md +11 -0
  98. package/runtime/cpp/third_party/quickjs/cutils.c +641 -0
  99. package/runtime/cpp/third_party/quickjs/cutils.h +457 -0
  100. package/runtime/cpp/third_party/quickjs/libregexp-opcode.h +73 -0
  101. package/runtime/cpp/third_party/quickjs/libregexp.c +3448 -0
  102. package/runtime/cpp/third_party/quickjs/libregexp.h +65 -0
  103. package/runtime/cpp/third_party/quickjs/libunicode-table.h +5206 -0
  104. package/runtime/cpp/third_party/quickjs/libunicode.c +2124 -0
  105. package/runtime/cpp/third_party/quickjs/libunicode.h +196 -0
  106. package/runtime/js/index.d.ts +7 -0
  107. package/runtime/js/index.js +60 -0
  108. package/runtime/native/LucentNative.podspec +28 -0
  109. package/runtime/native/android/CMakeLists.txt +51 -0
  110. package/runtime/native/android/build.gradle +22 -0
  111. package/runtime/native/android/include/lucentnative.h +16 -0
  112. package/runtime/native/android/src/main/java/dev/lucent/LucentPackage.java +25 -0
  113. package/runtime/native/android/src/main/java/dev/lucent/NativeProxy.java +132 -0
  114. package/runtime/native/ios/LucentRegistration.mm +23 -0
  115. package/runtime/native/package.json +6 -0
  116. package/runtime/native/react-native.config.js +19 -0
  117. package/runtime/test/jsi/harness.cpp +181 -0
  118. package/schemas/build.schema.json +152 -0
  119. package/schemas/check.schema.json +74 -0
  120. package/schemas/doctor.schema.json +40 -0
  121. package/schemas/lucent.schema.json +43 -0
  122. package/schemas/sdk-prefetch.schema.json +37 -0
  123. package/schemas/sdk-search.schema.json +54 -0
  124. package/ts-plugin/index.d.ts +4 -0
  125. package/ts-plugin/index.js +99 -0
@@ -0,0 +1,202 @@
1
+ #include "convert.h"
2
+
3
+ #include <cstring>
4
+
5
+ namespace lucent::js {
6
+
7
+ const char* jsTypeName(jsi::Runtime& rt, const jsi::Value& v) {
8
+ if (v.isUndefined()) return "undefined";
9
+ if (v.isNull()) return "null";
10
+ if (v.isBool()) return "a boolean";
11
+ if (v.isNumber()) return "a number";
12
+ if (v.isString()) return "a string";
13
+ if (v.isBigInt()) return "a bigint";
14
+ if (v.isSymbol()) return "a symbol";
15
+ jsi::Object o = v.getObject(rt);
16
+ if (o.isArray(rt)) return "an array";
17
+ if (o.isFunction(rt)) return "a function";
18
+ return "an object";
19
+ }
20
+
21
+ void throwBoundaryError(jsi::Runtime& rt, const Path& path, const char* expected, const jsi::Value& actual) {
22
+ std::string message = std::string(path.fn) + ": " + path.where() + " must be " + expected + ", got " + jsTypeName(rt, actual);
23
+ jsi::Object err = rt.global()
24
+ .getPropertyAsFunction(rt, "TypeError")
25
+ .callAsConstructor(rt, jsi::String::createFromUtf8(rt, message))
26
+ .getObject(rt);
27
+ throw jsi::JSError(rt, jsi::Value(rt, err));
28
+ }
29
+
30
+ String stringFromJs(jsi::Runtime& rt, const jsi::String& s) {
31
+ // Hermes hands most strings over in one chunk: an ASCII one becomes the
32
+ // String directly (inline when short). Later chunks go to the accumulator.
33
+ struct Acc {
34
+ String first;
35
+ size_t chunks = 0;
36
+ std::string ascii;
37
+ std::u16string wide;
38
+ bool isWide = false;
39
+ } acc;
40
+ auto collect = [&acc](bool ascii, const void* data, size_t num) {
41
+ if (acc.chunks++ == 0 && ascii) {
42
+ acc.first = String::fromLatin1(std::string_view(static_cast<const char*>(data), num));
43
+ return;
44
+ }
45
+ if (acc.chunks == 2 && acc.first.length() > 0) acc.ascii.assign(acc.first.latin1());
46
+ if (ascii && !acc.isWide) {
47
+ acc.ascii.append(static_cast<const char*>(data), num);
48
+ return;
49
+ }
50
+ if (!acc.isWide) {
51
+ acc.isWide = true;
52
+ acc.wide.reserve(acc.ascii.size() + num);
53
+ for (unsigned char c : acc.ascii) acc.wide.push_back(c);
54
+ acc.ascii.clear();
55
+ }
56
+ if (ascii) {
57
+ const char* p = static_cast<const char*>(data);
58
+ for (size_t i = 0; i < num; i++) acc.wide.push_back(static_cast<unsigned char>(p[i]));
59
+ } else {
60
+ acc.wide.append(static_cast<const char16_t*>(data), num);
61
+ }
62
+ };
63
+ s.getStringData(rt, collect);
64
+ if (acc.chunks == 1 && !acc.isWide && acc.ascii.empty()) return acc.first;
65
+ if (!acc.isWide) return String::adoptLatin1(std::move(acc.ascii));
66
+ return String::fromUtf16(acc.wide);
67
+ }
68
+
69
+ jsi::String stringToJs(jsi::Runtime& rt, const String& s) {
70
+ if (s.isOneByte()) {
71
+ std::string_view b = s.latin1();
72
+ bool ascii = true;
73
+ for (unsigned char c : b) {
74
+ if (c >= 0x80) {
75
+ ascii = false;
76
+ break;
77
+ }
78
+ }
79
+ if (ascii) return jsi::String::createFromAscii(rt, b.data(), b.size());
80
+ std::u16string w = s.toUtf16();
81
+ return jsi::String::createFromUtf16(rt, w.data(), w.size());
82
+ }
83
+ std::u16string_view w = s.utf16();
84
+ return jsi::String::createFromUtf16(rt, w.data(), w.size());
85
+ }
86
+
87
+ bool isInstanceOf(jsi::Runtime& rt, const jsi::Object& o, const char* ctor) {
88
+ jsi::Value c = rt.global().getProperty(rt, ctor);
89
+ if (!c.isObject() || !c.getObject(rt).isFunction(rt)) return false;
90
+ return o.instanceOf(rt, c.getObject(rt).getFunction(rt));
91
+ }
92
+
93
+ namespace {
94
+ class OwnedBuffer : public jsi::MutableBuffer {
95
+ public:
96
+ explicit OwnedBuffer(std::vector<uint8_t> data) : data_(std::move(data)) {}
97
+ size_t size() const override { return data_.size(); }
98
+ uint8_t* data() override { return data_.data(); }
99
+
100
+ private:
101
+ std::vector<uint8_t> data_;
102
+ };
103
+ } // namespace
104
+
105
+ Bytes Convert<Bytes>::fromJs(jsi::Runtime& rt, const jsi::Value& v, const Path& p) {
106
+ if (!v.isObject()) throwBoundaryError(rt, p, "a Uint8Array", v);
107
+ jsi::Object o = v.getObject(rt);
108
+ if (o.isArrayBuffer(rt)) {
109
+ jsi::ArrayBuffer ab = o.getArrayBuffer(rt);
110
+ return Bytes::copy(ab.data(rt), ab.size(rt));
111
+ }
112
+ if (!isInstanceOf(rt, o, "Uint8Array")) throwBoundaryError(rt, p, "a Uint8Array", v);
113
+ jsi::ArrayBuffer ab = o.getPropertyAsObject(rt, "buffer").getArrayBuffer(rt);
114
+ size_t offset = static_cast<size_t>(o.getProperty(rt, "byteOffset").getNumber());
115
+ size_t length = static_cast<size_t>(o.getProperty(rt, "byteLength").getNumber());
116
+ return Bytes::copy(ab.data(rt) + offset, length);
117
+ }
118
+
119
+ jsi::Value Convert<Bytes>::toJs(jsi::Runtime& rt, Host&, const Bytes& b) {
120
+ auto buffer = std::make_shared<OwnedBuffer>(std::vector<uint8_t>(b.data(), b.data() + b.size()));
121
+ jsi::ArrayBuffer ab(rt, buffer);
122
+ return rt.global().getPropertyAsFunction(rt, "Uint8Array").callAsConstructor(rt, ab);
123
+ }
124
+
125
+ Error Convert<Error>::fromJs(jsi::Runtime& rt, const jsi::Value& v, const Path&) {
126
+ Error e = makeError(String::fromLatin1("Error"), String());
127
+ if (v.isObject()) {
128
+ jsi::Object o = v.getObject(rt);
129
+ jsi::Value name = o.getProperty(rt, "name");
130
+ jsi::Value message = o.getProperty(rt, "message");
131
+ jsi::Value code = o.getProperty(rt, "code");
132
+ jsi::Value stack = o.getProperty(rt, "stack");
133
+ if (name.isString()) e->name = stringFromJs(rt, name.getString(rt));
134
+ if (message.isString()) e->message = stringFromJs(rt, message.getString(rt));
135
+ if (code.isString()) e->code = stringFromJs(rt, code.getString(rt));
136
+ if (stack.isString()) e->stack = stringFromJs(rt, stack.getString(rt));
137
+ } else {
138
+ e->message = stringFromJs(rt, v.toString(rt));
139
+ }
140
+ return e;
141
+ }
142
+
143
+ namespace {
144
+ struct SignalState : jsi::NativeState {
145
+ explicit SignalState(AbortSignal s) : signal(std::move(s)) {}
146
+ AbortSignal signal;
147
+ };
148
+
149
+ Error abortReason(jsi::Runtime& rt, const jsi::Value& signal) {
150
+ jsi::Value reason = signal.isObject() ? signal.getObject(rt).getProperty(rt, "reason") : jsi::Value::undefined();
151
+ return reason.isUndefined() ? abortError() : Convert<Error>::fromJs(rt, reason, Path{"AbortSignal", "reason"});
152
+ }
153
+ } // namespace
154
+
155
+ AbortSignal Convert<AbortSignal>::fromJs(jsi::Runtime& rt, const jsi::Value& v, const Path& p) {
156
+ if (!v.isObject()) throwBoundaryError(rt, p, "an AbortSignal", v);
157
+ jsi::Object o = v.getObject(rt);
158
+ if (o.hasNativeState<SignalState>(rt)) return o.getNativeState<SignalState>(rt)->signal;
159
+ jsi::Value aborted = o.getProperty(rt, "aborted");
160
+ jsi::Value add = o.getProperty(rt, "addEventListener");
161
+ if (!aborted.isBool() || !add.isObject() || !add.getObject(rt).isFunction(rt)) throwBoundaryError(rt, p, "an AbortSignal", v);
162
+ auto signal = std::make_shared<AbortSignalObject>();
163
+ if (aborted.getBool()) {
164
+ signal->abort(abortReason(rt, v));
165
+ } else {
166
+ // The JS signal owns the native one (NativeState below); the listener
167
+ // only refers to it.
168
+ std::weak_ptr<AbortSignalObject> weak = signal;
169
+ jsi::Function onAbort = jsi::Function::createFromHostFunction(
170
+ rt, jsi::PropNameID::forAscii(rt, "onAbort"), 1,
171
+ [weak](jsi::Runtime& rt, const jsi::Value& thisVal, const jsi::Value* args, size_t count) -> jsi::Value {
172
+ auto s = weak.lock();
173
+ if (!s) return jsi::Value::undefined();
174
+ jsi::Value target = count > 0 && args[0].isObject() ? args[0].getObject(rt).getProperty(rt, "target") : jsi::Value(rt, thisVal);
175
+ return callSync(rt, Host::get(rt), [&]() -> jsi::Value {
176
+ s->abort(abortReason(rt, target));
177
+ return jsi::Value::undefined();
178
+ });
179
+ });
180
+ add.getObject(rt).getFunction(rt).callWithThis(rt, o, jsi::String::createFromAscii(rt, "abort"), onAbort);
181
+ }
182
+ o.setNativeState(rt, std::make_shared<SignalState>(signal));
183
+ return signal;
184
+ }
185
+
186
+ Date Convert<Date>::fromJs(jsi::Runtime& rt, const jsi::Value& v, const Path& p) {
187
+ if (v.isObject()) {
188
+ jsi::Object o = v.getObject(rt);
189
+ jsi::Value getTime = o.getProperty(rt, "getTime");
190
+ if (getTime.isObject() && getTime.getObject(rt).isFunction(rt)) {
191
+ jsi::Value t = getTime.getObject(rt).getFunction(rt).callWithThis(rt, o);
192
+ if (t.isNumber()) return makeDate(t.getNumber());
193
+ }
194
+ }
195
+ throwBoundaryError(rt, p, "a Date", v);
196
+ }
197
+
198
+ jsi::Value Convert<Date>::toJs(jsi::Runtime& rt, Host&, const Date& d) {
199
+ return rt.global().getPropertyAsFunction(rt, "Date").callAsConstructor(rt, d->getTime());
200
+ }
201
+
202
+ } // namespace lucent::js