yaver-cli 1.0.0 → 1.95.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.
- package/bin/yaver +5 -0
- package/bin/yaver-push +2 -2
- package/hermesc/hermesc +0 -0
- package/package.json +4 -3
- package/sdk-manifest.json +649 -32
- package/src/agent-runtime.js +217 -0
- package/src/analyzer.js +13 -4
- package/src/bundler.js +5 -5
- package/src/commands/devices.js +1 -1
- package/src/commands/doctor.js +2 -1
- package/src/commands/init.js +4 -4
- package/src/commands/modules.js +2 -1
- package/src/commands/push.js +4 -3
- package/src/commands/status.js +1 -1
- package/src/discovery.js +1 -1
- package/src/index.js +87 -7
- package/src/sdk-manifest.js +9 -0
package/bin/yaver
ADDED
package/bin/yaver-push
CHANGED
package/hermesc/hermesc
ADDED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yaver-cli",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.95.4",
|
|
4
|
+
"description": "Unified npm bootstrap for the Yaver agent and push-to-device React Native tooling",
|
|
5
5
|
"bin": {
|
|
6
|
+
"yaver": "bin/yaver",
|
|
6
7
|
"yaver-push": "bin/yaver-push"
|
|
7
8
|
},
|
|
8
9
|
"main": "src/index.js",
|
|
@@ -20,7 +21,7 @@
|
|
|
20
21
|
"expo-go-alternative"
|
|
21
22
|
],
|
|
22
23
|
"author": "Yaver <hello@yaver.io>",
|
|
23
|
-
"license": "
|
|
24
|
+
"license": "AGPL-3.0-only",
|
|
24
25
|
"repository": {
|
|
25
26
|
"type": "git",
|
|
26
27
|
"url": "git+https://github.com/kivanccakmak/yaver.io.git"
|
package/sdk-manifest.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"react": "19.1.0",
|
|
5
5
|
"hermes": {
|
|
6
6
|
"version": "0.81.5",
|
|
7
|
-
"bytecodeVersion":
|
|
7
|
+
"bytecodeVersion": 96
|
|
8
8
|
},
|
|
9
9
|
"arch": {
|
|
10
10
|
"newArch": true,
|
|
@@ -13,46 +13,663 @@
|
|
|
13
13
|
},
|
|
14
14
|
"supportedRNRange": "0.81.x",
|
|
15
15
|
"nativeModules": {
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"react-native-gesture-handler": "2.28.0",
|
|
19
|
-
"react-native-reanimated": "4.1.1",
|
|
20
|
-
"react-native-svg": "15.15.4",
|
|
21
|
-
"react-native-webview": "13.15.0",
|
|
16
|
+
"@expo/vector-icons": "15.1.1",
|
|
17
|
+
"@gorhom/bottom-sheet": "5.2.9",
|
|
22
18
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
19
|
+
"@react-native-community/datetimepicker": "8.4.4",
|
|
23
20
|
"@react-native-community/netinfo": "11.4.1",
|
|
24
|
-
"react-native-
|
|
25
|
-
"react-native-
|
|
26
|
-
"react-native-
|
|
27
|
-
"@
|
|
28
|
-
"
|
|
29
|
-
"react-native-
|
|
30
|
-
"
|
|
31
|
-
"
|
|
21
|
+
"@react-native-community/slider": "5.0.1",
|
|
22
|
+
"@react-native-masked-view/masked-view": "0.3.2",
|
|
23
|
+
"@react-native-picker/picker": "2.11.1",
|
|
24
|
+
"@react-native-segmented-control/segmented-control": "2.5.7",
|
|
25
|
+
"@shopify/flash-list": "2.0.2",
|
|
26
|
+
"@shopify/react-native-skia": "2.2.12",
|
|
27
|
+
"expo-apple-authentication": "8.0.8",
|
|
28
|
+
"expo-asset": "12.0.12",
|
|
29
|
+
"expo-auth-session": "7.0.10",
|
|
30
|
+
"expo-av": "16.0.8",
|
|
31
|
+
"expo-background-fetch": "14.0.9",
|
|
32
|
+
"expo-battery": "10.0.8",
|
|
33
|
+
"expo-blur": "15.0.8",
|
|
34
|
+
"expo-brightness": "14.0.8",
|
|
35
|
+
"expo-calendar": "15.0.8",
|
|
32
36
|
"expo-camera": "17.0.10",
|
|
33
|
-
"expo-
|
|
34
|
-
"expo-sensors": "15.0.8",
|
|
35
|
-
"expo-haptics": "15.0.8",
|
|
36
|
-
"expo-device": "8.0.10",
|
|
37
|
+
"expo-clipboard": "8.0.8",
|
|
37
38
|
"expo-constants": "18.0.13",
|
|
38
|
-
"expo-
|
|
39
|
+
"expo-contacts": "15.0.11",
|
|
40
|
+
"expo-crypto": "15.0.8",
|
|
41
|
+
"expo-device": "8.0.10",
|
|
42
|
+
"expo-document-picker": "14.0.8",
|
|
39
43
|
"expo-file-system": "19.0.21",
|
|
40
|
-
"expo-asset": "12.0.12",
|
|
41
44
|
"expo-font": "14.0.11",
|
|
42
|
-
"expo-
|
|
45
|
+
"expo-haptics": "15.0.8",
|
|
46
|
+
"expo-image": "3.0.11",
|
|
47
|
+
"expo-image-manipulator": "14.0.8",
|
|
48
|
+
"expo-image-picker": "17.0.10",
|
|
49
|
+
"expo-keep-awake": "15.0.8",
|
|
50
|
+
"expo-linear-gradient": "15.0.8",
|
|
43
51
|
"expo-linking": "8.0.11",
|
|
52
|
+
"expo-local-authentication": "17.0.8",
|
|
53
|
+
"expo-localization": "17.0.8",
|
|
54
|
+
"expo-location": "19.0.8",
|
|
55
|
+
"expo-mail-composer": "15.0.8",
|
|
56
|
+
"expo-media-library": "18.2.1",
|
|
57
|
+
"expo-notifications": "0.32.16",
|
|
58
|
+
"expo-print": "15.0.8",
|
|
59
|
+
"expo-router": "6.0.23",
|
|
60
|
+
"expo-screen-capture": "8.0.9",
|
|
61
|
+
"expo-screen-orientation": "9.0.8",
|
|
44
62
|
"expo-secure-store": "15.0.8",
|
|
45
|
-
"expo-
|
|
46
|
-
"expo-
|
|
47
|
-
"expo-speech": "14.0.8",
|
|
48
|
-
"expo-web-browser": "15.0.10",
|
|
49
|
-
"expo-apple-authentication": "8.0.8",
|
|
50
|
-
"expo-battery": "10.0.8",
|
|
51
|
-
"expo-brightness": "14.0.8",
|
|
52
|
-
"expo-localization": "55.0.11",
|
|
53
|
-
"expo-share-intent": "3.2.3",
|
|
63
|
+
"expo-sensors": "15.0.8",
|
|
64
|
+
"expo-share-intent": "5.1.1",
|
|
54
65
|
"expo-sharing": "14.0.8",
|
|
66
|
+
"expo-speech": "14.0.8",
|
|
55
67
|
"expo-splash-screen": "31.0.13",
|
|
56
|
-
"expo-
|
|
68
|
+
"expo-sqlite": "16.0.10",
|
|
69
|
+
"expo-status-bar": "3.0.9",
|
|
70
|
+
"expo-system-ui": "6.0.9",
|
|
71
|
+
"expo-task-manager": "14.0.9",
|
|
72
|
+
"expo-updates": "29.0.16",
|
|
73
|
+
"expo-video": "3.0.16",
|
|
74
|
+
"expo-video-thumbnails": "10.0.8",
|
|
75
|
+
"expo-web-browser": "15.0.10",
|
|
76
|
+
"lottie-react-native": "7.3.6",
|
|
77
|
+
"react-native-ble-plx": "3.5.1",
|
|
78
|
+
"react-native-gesture-handler": "2.28.0",
|
|
79
|
+
"react-native-get-random-values": "1.11.0",
|
|
80
|
+
"react-native-iap": "14.7.20",
|
|
81
|
+
"react-native-maps": "1.20.1",
|
|
82
|
+
"react-native-markdown-display": "7.0.2",
|
|
83
|
+
"react-native-mmkv": "4.3.0",
|
|
84
|
+
"react-native-nitro-modules": "0.35.3",
|
|
85
|
+
"react-native-pager-view": "6.9.1",
|
|
86
|
+
"react-native-reanimated": "4.1.7",
|
|
87
|
+
"react-native-safe-area-context": "5.6.2",
|
|
88
|
+
"react-native-screens": "4.16.0",
|
|
89
|
+
"react-native-svg": "15.12.1",
|
|
90
|
+
"react-native-udp": "4.1.7",
|
|
91
|
+
"react-native-video": "6.19.1",
|
|
92
|
+
"react-native-view-shot": "4.0.3",
|
|
93
|
+
"react-native-web": "0.21.2",
|
|
94
|
+
"react-native-webview": "13.15.0",
|
|
95
|
+
"react-native-worklets": "0.5.1",
|
|
96
|
+
"victory-native": "41.20.2",
|
|
97
|
+
"whisper.rn": "0.5.5"
|
|
98
|
+
},
|
|
99
|
+
"moduleSupport": {
|
|
100
|
+
"@expo/vector-icons": {
|
|
101
|
+
"version": "15.1.1",
|
|
102
|
+
"hostApp": true,
|
|
103
|
+
"cliPush": true,
|
|
104
|
+
"agentOpenInYaver": true,
|
|
105
|
+
"pluginEnabled": false
|
|
106
|
+
},
|
|
107
|
+
"@gorhom/bottom-sheet": {
|
|
108
|
+
"version": "5.2.9",
|
|
109
|
+
"hostApp": true,
|
|
110
|
+
"cliPush": true,
|
|
111
|
+
"agentOpenInYaver": true,
|
|
112
|
+
"pluginEnabled": false
|
|
113
|
+
},
|
|
114
|
+
"@react-native-async-storage/async-storage": {
|
|
115
|
+
"version": "2.2.0",
|
|
116
|
+
"hostApp": true,
|
|
117
|
+
"cliPush": true,
|
|
118
|
+
"agentOpenInYaver": true,
|
|
119
|
+
"pluginEnabled": false
|
|
120
|
+
},
|
|
121
|
+
"@react-native-community/datetimepicker": {
|
|
122
|
+
"version": "8.4.4",
|
|
123
|
+
"hostApp": true,
|
|
124
|
+
"cliPush": true,
|
|
125
|
+
"agentOpenInYaver": true,
|
|
126
|
+
"pluginEnabled": false
|
|
127
|
+
},
|
|
128
|
+
"@react-native-community/netinfo": {
|
|
129
|
+
"version": "11.4.1",
|
|
130
|
+
"hostApp": true,
|
|
131
|
+
"cliPush": true,
|
|
132
|
+
"agentOpenInYaver": true,
|
|
133
|
+
"pluginEnabled": false
|
|
134
|
+
},
|
|
135
|
+
"@react-native-community/slider": {
|
|
136
|
+
"version": "5.0.1",
|
|
137
|
+
"hostApp": true,
|
|
138
|
+
"cliPush": true,
|
|
139
|
+
"agentOpenInYaver": true,
|
|
140
|
+
"pluginEnabled": false
|
|
141
|
+
},
|
|
142
|
+
"@react-native-masked-view/masked-view": {
|
|
143
|
+
"version": "0.3.2",
|
|
144
|
+
"hostApp": true,
|
|
145
|
+
"cliPush": true,
|
|
146
|
+
"agentOpenInYaver": true,
|
|
147
|
+
"pluginEnabled": false
|
|
148
|
+
},
|
|
149
|
+
"@react-native-picker/picker": {
|
|
150
|
+
"version": "2.11.1",
|
|
151
|
+
"hostApp": true,
|
|
152
|
+
"cliPush": true,
|
|
153
|
+
"agentOpenInYaver": true,
|
|
154
|
+
"pluginEnabled": false
|
|
155
|
+
},
|
|
156
|
+
"@react-native-segmented-control/segmented-control": {
|
|
157
|
+
"version": "2.5.7",
|
|
158
|
+
"hostApp": true,
|
|
159
|
+
"cliPush": true,
|
|
160
|
+
"agentOpenInYaver": true,
|
|
161
|
+
"pluginEnabled": false
|
|
162
|
+
},
|
|
163
|
+
"@shopify/flash-list": {
|
|
164
|
+
"version": "2.0.2",
|
|
165
|
+
"hostApp": true,
|
|
166
|
+
"cliPush": true,
|
|
167
|
+
"agentOpenInYaver": true,
|
|
168
|
+
"pluginEnabled": false
|
|
169
|
+
},
|
|
170
|
+
"@shopify/react-native-skia": {
|
|
171
|
+
"version": "2.2.12",
|
|
172
|
+
"hostApp": true,
|
|
173
|
+
"cliPush": true,
|
|
174
|
+
"agentOpenInYaver": true,
|
|
175
|
+
"pluginEnabled": false
|
|
176
|
+
},
|
|
177
|
+
"expo-apple-authentication": {
|
|
178
|
+
"version": "8.0.8",
|
|
179
|
+
"hostApp": true,
|
|
180
|
+
"cliPush": true,
|
|
181
|
+
"agentOpenInYaver": true,
|
|
182
|
+
"pluginEnabled": true
|
|
183
|
+
},
|
|
184
|
+
"expo-asset": {
|
|
185
|
+
"version": "12.0.12",
|
|
186
|
+
"hostApp": true,
|
|
187
|
+
"cliPush": true,
|
|
188
|
+
"agentOpenInYaver": true,
|
|
189
|
+
"pluginEnabled": false
|
|
190
|
+
},
|
|
191
|
+
"expo-auth-session": {
|
|
192
|
+
"version": "7.0.10",
|
|
193
|
+
"hostApp": true,
|
|
194
|
+
"cliPush": true,
|
|
195
|
+
"agentOpenInYaver": true,
|
|
196
|
+
"pluginEnabled": false
|
|
197
|
+
},
|
|
198
|
+
"expo-av": {
|
|
199
|
+
"version": "16.0.8",
|
|
200
|
+
"hostApp": true,
|
|
201
|
+
"cliPush": true,
|
|
202
|
+
"agentOpenInYaver": true,
|
|
203
|
+
"pluginEnabled": false
|
|
204
|
+
},
|
|
205
|
+
"expo-background-fetch": {
|
|
206
|
+
"version": "14.0.9",
|
|
207
|
+
"hostApp": true,
|
|
208
|
+
"cliPush": true,
|
|
209
|
+
"agentOpenInYaver": true,
|
|
210
|
+
"pluginEnabled": false
|
|
211
|
+
},
|
|
212
|
+
"expo-battery": {
|
|
213
|
+
"version": "10.0.8",
|
|
214
|
+
"hostApp": true,
|
|
215
|
+
"cliPush": true,
|
|
216
|
+
"agentOpenInYaver": true,
|
|
217
|
+
"pluginEnabled": false
|
|
218
|
+
},
|
|
219
|
+
"expo-blur": {
|
|
220
|
+
"version": "15.0.8",
|
|
221
|
+
"hostApp": true,
|
|
222
|
+
"cliPush": true,
|
|
223
|
+
"agentOpenInYaver": true,
|
|
224
|
+
"pluginEnabled": false
|
|
225
|
+
},
|
|
226
|
+
"expo-brightness": {
|
|
227
|
+
"version": "14.0.8",
|
|
228
|
+
"hostApp": true,
|
|
229
|
+
"cliPush": true,
|
|
230
|
+
"agentOpenInYaver": true,
|
|
231
|
+
"pluginEnabled": false
|
|
232
|
+
},
|
|
233
|
+
"expo-calendar": {
|
|
234
|
+
"version": "15.0.8",
|
|
235
|
+
"hostApp": true,
|
|
236
|
+
"cliPush": true,
|
|
237
|
+
"agentOpenInYaver": true,
|
|
238
|
+
"pluginEnabled": false
|
|
239
|
+
},
|
|
240
|
+
"expo-camera": {
|
|
241
|
+
"version": "17.0.10",
|
|
242
|
+
"hostApp": true,
|
|
243
|
+
"cliPush": true,
|
|
244
|
+
"agentOpenInYaver": true,
|
|
245
|
+
"pluginEnabled": true
|
|
246
|
+
},
|
|
247
|
+
"expo-clipboard": {
|
|
248
|
+
"version": "8.0.8",
|
|
249
|
+
"hostApp": true,
|
|
250
|
+
"cliPush": true,
|
|
251
|
+
"agentOpenInYaver": true,
|
|
252
|
+
"pluginEnabled": false
|
|
253
|
+
},
|
|
254
|
+
"expo-constants": {
|
|
255
|
+
"version": "18.0.13",
|
|
256
|
+
"hostApp": true,
|
|
257
|
+
"cliPush": true,
|
|
258
|
+
"agentOpenInYaver": true,
|
|
259
|
+
"pluginEnabled": false
|
|
260
|
+
},
|
|
261
|
+
"expo-contacts": {
|
|
262
|
+
"version": "15.0.11",
|
|
263
|
+
"hostApp": true,
|
|
264
|
+
"cliPush": true,
|
|
265
|
+
"agentOpenInYaver": true,
|
|
266
|
+
"pluginEnabled": false
|
|
267
|
+
},
|
|
268
|
+
"expo-crypto": {
|
|
269
|
+
"version": "15.0.8",
|
|
270
|
+
"hostApp": true,
|
|
271
|
+
"cliPush": true,
|
|
272
|
+
"agentOpenInYaver": true,
|
|
273
|
+
"pluginEnabled": false
|
|
274
|
+
},
|
|
275
|
+
"expo-device": {
|
|
276
|
+
"version": "8.0.10",
|
|
277
|
+
"hostApp": true,
|
|
278
|
+
"cliPush": true,
|
|
279
|
+
"agentOpenInYaver": true,
|
|
280
|
+
"pluginEnabled": false
|
|
281
|
+
},
|
|
282
|
+
"expo-document-picker": {
|
|
283
|
+
"version": "14.0.8",
|
|
284
|
+
"hostApp": true,
|
|
285
|
+
"cliPush": true,
|
|
286
|
+
"agentOpenInYaver": true,
|
|
287
|
+
"pluginEnabled": false
|
|
288
|
+
},
|
|
289
|
+
"expo-file-system": {
|
|
290
|
+
"version": "19.0.21",
|
|
291
|
+
"hostApp": true,
|
|
292
|
+
"cliPush": true,
|
|
293
|
+
"agentOpenInYaver": true,
|
|
294
|
+
"pluginEnabled": false
|
|
295
|
+
},
|
|
296
|
+
"expo-font": {
|
|
297
|
+
"version": "14.0.11",
|
|
298
|
+
"hostApp": true,
|
|
299
|
+
"cliPush": true,
|
|
300
|
+
"agentOpenInYaver": true,
|
|
301
|
+
"pluginEnabled": true
|
|
302
|
+
},
|
|
303
|
+
"expo-haptics": {
|
|
304
|
+
"version": "15.0.8",
|
|
305
|
+
"hostApp": true,
|
|
306
|
+
"cliPush": true,
|
|
307
|
+
"agentOpenInYaver": true,
|
|
308
|
+
"pluginEnabled": false
|
|
309
|
+
},
|
|
310
|
+
"expo-image": {
|
|
311
|
+
"version": "3.0.11",
|
|
312
|
+
"hostApp": true,
|
|
313
|
+
"cliPush": true,
|
|
314
|
+
"agentOpenInYaver": true,
|
|
315
|
+
"pluginEnabled": false
|
|
316
|
+
},
|
|
317
|
+
"expo-image-manipulator": {
|
|
318
|
+
"version": "14.0.8",
|
|
319
|
+
"hostApp": true,
|
|
320
|
+
"cliPush": true,
|
|
321
|
+
"agentOpenInYaver": true,
|
|
322
|
+
"pluginEnabled": false
|
|
323
|
+
},
|
|
324
|
+
"expo-image-picker": {
|
|
325
|
+
"version": "17.0.10",
|
|
326
|
+
"hostApp": true,
|
|
327
|
+
"cliPush": true,
|
|
328
|
+
"agentOpenInYaver": true,
|
|
329
|
+
"pluginEnabled": true
|
|
330
|
+
},
|
|
331
|
+
"expo-keep-awake": {
|
|
332
|
+
"version": "15.0.8",
|
|
333
|
+
"hostApp": true,
|
|
334
|
+
"cliPush": true,
|
|
335
|
+
"agentOpenInYaver": true,
|
|
336
|
+
"pluginEnabled": false
|
|
337
|
+
},
|
|
338
|
+
"expo-linear-gradient": {
|
|
339
|
+
"version": "15.0.8",
|
|
340
|
+
"hostApp": true,
|
|
341
|
+
"cliPush": true,
|
|
342
|
+
"agentOpenInYaver": true,
|
|
343
|
+
"pluginEnabled": false
|
|
344
|
+
},
|
|
345
|
+
"expo-linking": {
|
|
346
|
+
"version": "8.0.11",
|
|
347
|
+
"hostApp": true,
|
|
348
|
+
"cliPush": true,
|
|
349
|
+
"agentOpenInYaver": true,
|
|
350
|
+
"pluginEnabled": false
|
|
351
|
+
},
|
|
352
|
+
"expo-local-authentication": {
|
|
353
|
+
"version": "17.0.8",
|
|
354
|
+
"hostApp": true,
|
|
355
|
+
"cliPush": true,
|
|
356
|
+
"agentOpenInYaver": true,
|
|
357
|
+
"pluginEnabled": false
|
|
358
|
+
},
|
|
359
|
+
"expo-localization": {
|
|
360
|
+
"version": "17.0.8",
|
|
361
|
+
"hostApp": true,
|
|
362
|
+
"cliPush": true,
|
|
363
|
+
"agentOpenInYaver": true,
|
|
364
|
+
"pluginEnabled": true
|
|
365
|
+
},
|
|
366
|
+
"expo-location": {
|
|
367
|
+
"version": "19.0.8",
|
|
368
|
+
"hostApp": true,
|
|
369
|
+
"cliPush": true,
|
|
370
|
+
"agentOpenInYaver": true,
|
|
371
|
+
"pluginEnabled": true
|
|
372
|
+
},
|
|
373
|
+
"expo-mail-composer": {
|
|
374
|
+
"version": "15.0.8",
|
|
375
|
+
"hostApp": true,
|
|
376
|
+
"cliPush": true,
|
|
377
|
+
"agentOpenInYaver": true,
|
|
378
|
+
"pluginEnabled": true
|
|
379
|
+
},
|
|
380
|
+
"expo-media-library": {
|
|
381
|
+
"version": "18.2.1",
|
|
382
|
+
"hostApp": true,
|
|
383
|
+
"cliPush": true,
|
|
384
|
+
"agentOpenInYaver": true,
|
|
385
|
+
"pluginEnabled": false
|
|
386
|
+
},
|
|
387
|
+
"expo-notifications": {
|
|
388
|
+
"version": "0.32.16",
|
|
389
|
+
"hostApp": true,
|
|
390
|
+
"cliPush": true,
|
|
391
|
+
"agentOpenInYaver": true,
|
|
392
|
+
"pluginEnabled": true
|
|
393
|
+
},
|
|
394
|
+
"expo-print": {
|
|
395
|
+
"version": "15.0.8",
|
|
396
|
+
"hostApp": true,
|
|
397
|
+
"cliPush": true,
|
|
398
|
+
"agentOpenInYaver": true,
|
|
399
|
+
"pluginEnabled": false
|
|
400
|
+
},
|
|
401
|
+
"expo-router": {
|
|
402
|
+
"version": "6.0.23",
|
|
403
|
+
"hostApp": true,
|
|
404
|
+
"cliPush": true,
|
|
405
|
+
"agentOpenInYaver": true,
|
|
406
|
+
"pluginEnabled": true
|
|
407
|
+
},
|
|
408
|
+
"expo-screen-capture": {
|
|
409
|
+
"version": "8.0.9",
|
|
410
|
+
"hostApp": true,
|
|
411
|
+
"cliPush": true,
|
|
412
|
+
"agentOpenInYaver": true,
|
|
413
|
+
"pluginEnabled": false
|
|
414
|
+
},
|
|
415
|
+
"expo-screen-orientation": {
|
|
416
|
+
"version": "9.0.8",
|
|
417
|
+
"hostApp": true,
|
|
418
|
+
"cliPush": true,
|
|
419
|
+
"agentOpenInYaver": true,
|
|
420
|
+
"pluginEnabled": false
|
|
421
|
+
},
|
|
422
|
+
"expo-secure-store": {
|
|
423
|
+
"version": "15.0.8",
|
|
424
|
+
"hostApp": true,
|
|
425
|
+
"cliPush": true,
|
|
426
|
+
"agentOpenInYaver": true,
|
|
427
|
+
"pluginEnabled": true
|
|
428
|
+
},
|
|
429
|
+
"expo-sensors": {
|
|
430
|
+
"version": "15.0.8",
|
|
431
|
+
"hostApp": true,
|
|
432
|
+
"cliPush": true,
|
|
433
|
+
"agentOpenInYaver": true,
|
|
434
|
+
"pluginEnabled": true
|
|
435
|
+
},
|
|
436
|
+
"expo-share-intent": {
|
|
437
|
+
"version": "5.1.1",
|
|
438
|
+
"hostApp": true,
|
|
439
|
+
"cliPush": true,
|
|
440
|
+
"agentOpenInYaver": true,
|
|
441
|
+
"pluginEnabled": false
|
|
442
|
+
},
|
|
443
|
+
"expo-sharing": {
|
|
444
|
+
"version": "14.0.8",
|
|
445
|
+
"hostApp": true,
|
|
446
|
+
"cliPush": true,
|
|
447
|
+
"agentOpenInYaver": true,
|
|
448
|
+
"pluginEnabled": false
|
|
449
|
+
},
|
|
450
|
+
"expo-speech": {
|
|
451
|
+
"version": "14.0.8",
|
|
452
|
+
"hostApp": true,
|
|
453
|
+
"cliPush": true,
|
|
454
|
+
"agentOpenInYaver": true,
|
|
455
|
+
"pluginEnabled": false
|
|
456
|
+
},
|
|
457
|
+
"expo-splash-screen": {
|
|
458
|
+
"version": "31.0.13",
|
|
459
|
+
"hostApp": true,
|
|
460
|
+
"cliPush": true,
|
|
461
|
+
"agentOpenInYaver": true,
|
|
462
|
+
"pluginEnabled": true
|
|
463
|
+
},
|
|
464
|
+
"expo-sqlite": {
|
|
465
|
+
"version": "16.0.10",
|
|
466
|
+
"hostApp": true,
|
|
467
|
+
"cliPush": true,
|
|
468
|
+
"agentOpenInYaver": true,
|
|
469
|
+
"pluginEnabled": true
|
|
470
|
+
},
|
|
471
|
+
"expo-status-bar": {
|
|
472
|
+
"version": "3.0.9",
|
|
473
|
+
"hostApp": true,
|
|
474
|
+
"cliPush": true,
|
|
475
|
+
"agentOpenInYaver": true,
|
|
476
|
+
"pluginEnabled": false
|
|
477
|
+
},
|
|
478
|
+
"expo-system-ui": {
|
|
479
|
+
"version": "6.0.9",
|
|
480
|
+
"hostApp": true,
|
|
481
|
+
"cliPush": true,
|
|
482
|
+
"agentOpenInYaver": true,
|
|
483
|
+
"pluginEnabled": false
|
|
484
|
+
},
|
|
485
|
+
"expo-task-manager": {
|
|
486
|
+
"version": "14.0.9",
|
|
487
|
+
"hostApp": true,
|
|
488
|
+
"cliPush": true,
|
|
489
|
+
"agentOpenInYaver": true,
|
|
490
|
+
"pluginEnabled": false
|
|
491
|
+
},
|
|
492
|
+
"expo-updates": {
|
|
493
|
+
"version": "29.0.16",
|
|
494
|
+
"hostApp": true,
|
|
495
|
+
"cliPush": true,
|
|
496
|
+
"agentOpenInYaver": true,
|
|
497
|
+
"pluginEnabled": true
|
|
498
|
+
},
|
|
499
|
+
"expo-video": {
|
|
500
|
+
"version": "3.0.16",
|
|
501
|
+
"hostApp": true,
|
|
502
|
+
"cliPush": true,
|
|
503
|
+
"agentOpenInYaver": true,
|
|
504
|
+
"pluginEnabled": true
|
|
505
|
+
},
|
|
506
|
+
"expo-video-thumbnails": {
|
|
507
|
+
"version": "10.0.8",
|
|
508
|
+
"hostApp": true,
|
|
509
|
+
"cliPush": true,
|
|
510
|
+
"agentOpenInYaver": true,
|
|
511
|
+
"pluginEnabled": false
|
|
512
|
+
},
|
|
513
|
+
"expo-web-browser": {
|
|
514
|
+
"version": "15.0.10",
|
|
515
|
+
"hostApp": true,
|
|
516
|
+
"cliPush": true,
|
|
517
|
+
"agentOpenInYaver": true,
|
|
518
|
+
"pluginEnabled": false
|
|
519
|
+
},
|
|
520
|
+
"lottie-react-native": {
|
|
521
|
+
"version": "7.3.6",
|
|
522
|
+
"hostApp": true,
|
|
523
|
+
"cliPush": true,
|
|
524
|
+
"agentOpenInYaver": true,
|
|
525
|
+
"pluginEnabled": false
|
|
526
|
+
},
|
|
527
|
+
"react-native-ble-plx": {
|
|
528
|
+
"version": "3.5.1",
|
|
529
|
+
"hostApp": true,
|
|
530
|
+
"cliPush": true,
|
|
531
|
+
"agentOpenInYaver": true,
|
|
532
|
+
"pluginEnabled": false
|
|
533
|
+
},
|
|
534
|
+
"react-native-gesture-handler": {
|
|
535
|
+
"version": "2.28.0",
|
|
536
|
+
"hostApp": true,
|
|
537
|
+
"cliPush": true,
|
|
538
|
+
"agentOpenInYaver": true,
|
|
539
|
+
"pluginEnabled": false
|
|
540
|
+
},
|
|
541
|
+
"react-native-get-random-values": {
|
|
542
|
+
"version": "1.11.0",
|
|
543
|
+
"hostApp": true,
|
|
544
|
+
"cliPush": true,
|
|
545
|
+
"agentOpenInYaver": true,
|
|
546
|
+
"pluginEnabled": false
|
|
547
|
+
},
|
|
548
|
+
"react-native-iap": {
|
|
549
|
+
"version": "14.7.20",
|
|
550
|
+
"hostApp": true,
|
|
551
|
+
"cliPush": true,
|
|
552
|
+
"agentOpenInYaver": true,
|
|
553
|
+
"pluginEnabled": false
|
|
554
|
+
},
|
|
555
|
+
"react-native-maps": {
|
|
556
|
+
"version": "1.20.1",
|
|
557
|
+
"hostApp": true,
|
|
558
|
+
"cliPush": true,
|
|
559
|
+
"agentOpenInYaver": true,
|
|
560
|
+
"pluginEnabled": false
|
|
561
|
+
},
|
|
562
|
+
"react-native-markdown-display": {
|
|
563
|
+
"version": "7.0.2",
|
|
564
|
+
"hostApp": true,
|
|
565
|
+
"cliPush": true,
|
|
566
|
+
"agentOpenInYaver": true,
|
|
567
|
+
"pluginEnabled": false
|
|
568
|
+
},
|
|
569
|
+
"react-native-mmkv": {
|
|
570
|
+
"version": "4.3.0",
|
|
571
|
+
"hostApp": true,
|
|
572
|
+
"cliPush": true,
|
|
573
|
+
"agentOpenInYaver": true,
|
|
574
|
+
"pluginEnabled": false
|
|
575
|
+
},
|
|
576
|
+
"react-native-nitro-modules": {
|
|
577
|
+
"version": "0.35.3",
|
|
578
|
+
"hostApp": true,
|
|
579
|
+
"cliPush": true,
|
|
580
|
+
"agentOpenInYaver": true,
|
|
581
|
+
"pluginEnabled": false
|
|
582
|
+
},
|
|
583
|
+
"react-native-pager-view": {
|
|
584
|
+
"version": "6.9.1",
|
|
585
|
+
"hostApp": true,
|
|
586
|
+
"cliPush": true,
|
|
587
|
+
"agentOpenInYaver": true,
|
|
588
|
+
"pluginEnabled": false
|
|
589
|
+
},
|
|
590
|
+
"react-native-reanimated": {
|
|
591
|
+
"version": "4.1.7",
|
|
592
|
+
"hostApp": true,
|
|
593
|
+
"cliPush": true,
|
|
594
|
+
"agentOpenInYaver": true,
|
|
595
|
+
"pluginEnabled": false
|
|
596
|
+
},
|
|
597
|
+
"react-native-safe-area-context": {
|
|
598
|
+
"version": "5.6.2",
|
|
599
|
+
"hostApp": true,
|
|
600
|
+
"cliPush": true,
|
|
601
|
+
"agentOpenInYaver": true,
|
|
602
|
+
"pluginEnabled": false
|
|
603
|
+
},
|
|
604
|
+
"react-native-screens": {
|
|
605
|
+
"version": "4.16.0",
|
|
606
|
+
"hostApp": true,
|
|
607
|
+
"cliPush": true,
|
|
608
|
+
"agentOpenInYaver": true,
|
|
609
|
+
"pluginEnabled": false
|
|
610
|
+
},
|
|
611
|
+
"react-native-svg": {
|
|
612
|
+
"version": "15.12.1",
|
|
613
|
+
"hostApp": true,
|
|
614
|
+
"cliPush": true,
|
|
615
|
+
"agentOpenInYaver": true,
|
|
616
|
+
"pluginEnabled": false
|
|
617
|
+
},
|
|
618
|
+
"react-native-udp": {
|
|
619
|
+
"version": "4.1.7",
|
|
620
|
+
"hostApp": true,
|
|
621
|
+
"cliPush": true,
|
|
622
|
+
"agentOpenInYaver": true,
|
|
623
|
+
"pluginEnabled": false
|
|
624
|
+
},
|
|
625
|
+
"react-native-video": {
|
|
626
|
+
"version": "6.19.1",
|
|
627
|
+
"hostApp": true,
|
|
628
|
+
"cliPush": true,
|
|
629
|
+
"agentOpenInYaver": true,
|
|
630
|
+
"pluginEnabled": false
|
|
631
|
+
},
|
|
632
|
+
"react-native-view-shot": {
|
|
633
|
+
"version": "4.0.3",
|
|
634
|
+
"hostApp": true,
|
|
635
|
+
"cliPush": true,
|
|
636
|
+
"agentOpenInYaver": true,
|
|
637
|
+
"pluginEnabled": false
|
|
638
|
+
},
|
|
639
|
+
"react-native-web": {
|
|
640
|
+
"version": "0.21.2",
|
|
641
|
+
"hostApp": true,
|
|
642
|
+
"cliPush": true,
|
|
643
|
+
"agentOpenInYaver": true,
|
|
644
|
+
"pluginEnabled": false
|
|
645
|
+
},
|
|
646
|
+
"react-native-webview": {
|
|
647
|
+
"version": "13.15.0",
|
|
648
|
+
"hostApp": true,
|
|
649
|
+
"cliPush": true,
|
|
650
|
+
"agentOpenInYaver": true,
|
|
651
|
+
"pluginEnabled": false
|
|
652
|
+
},
|
|
653
|
+
"react-native-worklets": {
|
|
654
|
+
"version": "0.5.1",
|
|
655
|
+
"hostApp": true,
|
|
656
|
+
"cliPush": true,
|
|
657
|
+
"agentOpenInYaver": true,
|
|
658
|
+
"pluginEnabled": false
|
|
659
|
+
},
|
|
660
|
+
"victory-native": {
|
|
661
|
+
"version": "41.20.2",
|
|
662
|
+
"hostApp": true,
|
|
663
|
+
"cliPush": true,
|
|
664
|
+
"agentOpenInYaver": true,
|
|
665
|
+
"pluginEnabled": false
|
|
666
|
+
},
|
|
667
|
+
"whisper.rn": {
|
|
668
|
+
"version": "0.5.5",
|
|
669
|
+
"hostApp": true,
|
|
670
|
+
"cliPush": true,
|
|
671
|
+
"agentOpenInYaver": true,
|
|
672
|
+
"pluginEnabled": false
|
|
673
|
+
}
|
|
57
674
|
}
|
|
58
675
|
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const os = require('os');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const { spawn } = require('child_process');
|
|
5
|
+
const { pipeline } = require('stream/promises');
|
|
6
|
+
const https = require('https');
|
|
7
|
+
|
|
8
|
+
const PACKAGE = require('../package.json');
|
|
9
|
+
|
|
10
|
+
const DEFAULT_REPO = process.env.YAVER_AGENT_REPO || 'kivanccakmak/yaver.io';
|
|
11
|
+
const AGENT_VERSION = process.env.YAVER_AGENT_VERSION || PACKAGE.version;
|
|
12
|
+
const CACHE_ROOT = process.env.YAVER_AGENT_CACHE_DIR || path.join(os.homedir(), '.yaver', 'bin');
|
|
13
|
+
|
|
14
|
+
async function ensureAgentBinary({ quiet = false } = {}) {
|
|
15
|
+
const asset = resolveAsset();
|
|
16
|
+
const localAgentPath = resolveLocalAgentBinary(asset);
|
|
17
|
+
if (localAgentPath) {
|
|
18
|
+
return localAgentPath;
|
|
19
|
+
}
|
|
20
|
+
const installDir = path.join(CACHE_ROOT, AGENT_VERSION, asset.cacheKey);
|
|
21
|
+
const binaryPath = path.join(installDir, asset.binaryName);
|
|
22
|
+
|
|
23
|
+
if (fs.existsSync(binaryPath)) {
|
|
24
|
+
if (process.platform !== 'win32') {
|
|
25
|
+
fs.chmodSync(binaryPath, 0o755);
|
|
26
|
+
}
|
|
27
|
+
return binaryPath;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
fs.mkdirSync(installDir, { recursive: true });
|
|
31
|
+
const tmpPath = path.join(installDir, asset.downloadName);
|
|
32
|
+
|
|
33
|
+
if (!quiet) {
|
|
34
|
+
console.error(`Installing Yaver agent ${AGENT_VERSION} for ${asset.cacheKey}...`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
await downloadToFile(asset.url, tmpPath);
|
|
38
|
+
|
|
39
|
+
if (asset.archiveType === 'tar.gz') {
|
|
40
|
+
await extractTarball(tmpPath, installDir);
|
|
41
|
+
fs.rmSync(tmpPath, { force: true });
|
|
42
|
+
} else {
|
|
43
|
+
fs.renameSync(tmpPath, binaryPath);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!fs.existsSync(binaryPath)) {
|
|
47
|
+
throw new Error(`agent binary missing after install: ${binaryPath}`);
|
|
48
|
+
}
|
|
49
|
+
if (process.platform !== 'win32') {
|
|
50
|
+
fs.chmodSync(binaryPath, 0o755);
|
|
51
|
+
}
|
|
52
|
+
return binaryPath;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function runAgentCommand(args, options = {}) {
|
|
56
|
+
const localAgent = resolveLocalAgentCommand(args);
|
|
57
|
+
const spawnSpec = localAgent
|
|
58
|
+
? localAgent
|
|
59
|
+
: { command: await ensureAgentBinary(options), args };
|
|
60
|
+
const child = spawn(spawnSpec.command, spawnSpec.args, {
|
|
61
|
+
stdio: 'inherit',
|
|
62
|
+
env: process.env,
|
|
63
|
+
cwd: spawnSpec.cwd || process.cwd(),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await new Promise((resolve, reject) => {
|
|
67
|
+
child.on('error', reject);
|
|
68
|
+
child.on('exit', (code, signal) => {
|
|
69
|
+
if (signal) {
|
|
70
|
+
reject(new Error(`agent terminated by signal ${signal}`));
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (code && code !== 0) {
|
|
74
|
+
const error = new Error(`agent exited with code ${code}`);
|
|
75
|
+
error.exitCode = code;
|
|
76
|
+
reject(error);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
resolve();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function resolveAgentInfo() {
|
|
85
|
+
const asset = resolveAsset();
|
|
86
|
+
return {
|
|
87
|
+
version: AGENT_VERSION,
|
|
88
|
+
repo: DEFAULT_REPO,
|
|
89
|
+
asset: asset.downloadName,
|
|
90
|
+
binaryName: asset.binaryName,
|
|
91
|
+
cacheDir: path.join(CACHE_ROOT, AGENT_VERSION, asset.cacheKey),
|
|
92
|
+
downloadUrl: asset.url,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function resolveLocalAgentBinary(asset) {
|
|
97
|
+
if (process.env.YAVER_AGENT_BIN && fs.existsSync(process.env.YAVER_AGENT_BIN)) {
|
|
98
|
+
return process.env.YAVER_AGENT_BIN;
|
|
99
|
+
}
|
|
100
|
+
const repoBinary = path.join(repoRoot(), 'desktop', 'agent', asset.downloadName.replace('.tar.gz', '').replace('.exe', '.exe'));
|
|
101
|
+
if (fs.existsSync(repoBinary)) {
|
|
102
|
+
return repoBinary;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function resolveLocalAgentCommand(agentArgs) {
|
|
108
|
+
if (process.env.YAVER_AGENT_BIN && fs.existsSync(process.env.YAVER_AGENT_BIN)) {
|
|
109
|
+
return { command: process.env.YAVER_AGENT_BIN, args: agentArgs };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const asset = resolveAsset();
|
|
113
|
+
const localBinary = resolveLocalAgentBinary(asset);
|
|
114
|
+
if (localBinary) {
|
|
115
|
+
return { command: localBinary, args: agentArgs };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const agentDir = path.join(repoRoot(), 'desktop', 'agent');
|
|
119
|
+
const goMod = path.join(agentDir, 'go.mod');
|
|
120
|
+
if (fs.existsSync(goMod)) {
|
|
121
|
+
return {
|
|
122
|
+
command: 'go',
|
|
123
|
+
args: ['run', '.', ...agentArgs],
|
|
124
|
+
cwd: agentDir,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function resolveAsset() {
|
|
132
|
+
const platform = process.platform;
|
|
133
|
+
const arch = process.arch;
|
|
134
|
+
const goArch = arch === 'x64' ? 'amd64' : arch === 'arm64' ? 'arm64' : null;
|
|
135
|
+
|
|
136
|
+
if (!goArch) {
|
|
137
|
+
throw new Error(`unsupported architecture for npm bootstrap: ${arch}`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (platform === 'win32') {
|
|
141
|
+
return {
|
|
142
|
+
cacheKey: `${platform}-${goArch}`,
|
|
143
|
+
binaryName: 'yaver.exe',
|
|
144
|
+
downloadName: `yaver-windows-${goArch}.exe`,
|
|
145
|
+
archiveType: 'exe',
|
|
146
|
+
url: releaseUrl(`yaver-windows-${goArch}.exe`),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (platform === 'darwin' || platform === 'linux') {
|
|
151
|
+
return {
|
|
152
|
+
cacheKey: `${platform}-${goArch}`,
|
|
153
|
+
binaryName: 'yaver',
|
|
154
|
+
downloadName: `yaver-${platform}-${goArch}.tar.gz`,
|
|
155
|
+
archiveType: 'tar.gz',
|
|
156
|
+
url: releaseUrl(`yaver-${platform}-${goArch}.tar.gz`),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
throw new Error(`unsupported platform for npm bootstrap: ${platform}`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function releaseUrl(assetName) {
|
|
164
|
+
return `https://github.com/${DEFAULT_REPO}/releases/download/v${AGENT_VERSION}/${assetName}`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async function downloadToFile(url, destPath) {
|
|
168
|
+
const response = await request(url);
|
|
169
|
+
if (response.statusCode && response.statusCode >= 400) {
|
|
170
|
+
throw new Error(`download failed (${response.statusCode}) from ${url}. Publish the matching CLI release assets or set YAVER_AGENT_BIN.`);
|
|
171
|
+
}
|
|
172
|
+
await pipeline(response, fs.createWriteStream(destPath));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function request(url) {
|
|
176
|
+
return new Promise((resolve, reject) => {
|
|
177
|
+
https.get(url, (response) => {
|
|
178
|
+
if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) {
|
|
179
|
+
resolve(request(response.headers.location));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
resolve(response);
|
|
183
|
+
}).on('error', reject);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async function extractTarball(archivePath, destDir) {
|
|
188
|
+
const child = spawn('tar', ['-xzf', archivePath, '-C', destDir], {
|
|
189
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
let stderr = '';
|
|
193
|
+
child.stderr.on('data', (chunk) => {
|
|
194
|
+
stderr += chunk.toString();
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
await new Promise((resolve, reject) => {
|
|
198
|
+
child.on('error', reject);
|
|
199
|
+
child.on('exit', (code) => {
|
|
200
|
+
if (code !== 0) {
|
|
201
|
+
reject(new Error(stderr.trim() || `tar exited with code ${code}`));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
resolve();
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
module.exports = {
|
|
210
|
+
ensureAgentBinary,
|
|
211
|
+
resolveAgentInfo,
|
|
212
|
+
runAgentCommand,
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
function repoRoot() {
|
|
216
|
+
return path.resolve(__dirname, '..', '..');
|
|
217
|
+
}
|
package/src/analyzer.js
CHANGED
|
@@ -73,7 +73,7 @@ function analyzeProject(packageJson, sdkManifest) {
|
|
|
73
73
|
if (PURE_JS_PACKAGES.has(name)) continue;
|
|
74
74
|
if (FALSE_POSITIVE_NATIVE.has(name)) continue;
|
|
75
75
|
if (packageJson.devDependencies?.[name] && !packageJson.dependencies?.[name]) continue;
|
|
76
|
-
if (!looksLikeNativeModule(name)) continue;
|
|
76
|
+
if (!looksLikeNativeModule(name, sdkManifest)) continue;
|
|
77
77
|
|
|
78
78
|
const sdkVersion = sdkManifest.nativeModules[name];
|
|
79
79
|
|
|
@@ -89,10 +89,10 @@ function analyzeProject(packageJson, sdkManifest) {
|
|
|
89
89
|
|
|
90
90
|
const localParsed = semver.coerce(cleanLocal);
|
|
91
91
|
const sdkParsed = semver.coerce(sdkVersion);
|
|
92
|
-
if (localParsed && sdkParsed &&
|
|
92
|
+
if (localParsed && sdkParsed && hasPotentiallyBreakingVersionDrift(localParsed, sdkParsed)) {
|
|
93
93
|
warnings.push({
|
|
94
94
|
type: 'version_mismatch', module: name,
|
|
95
|
-
message: `"${name}": project ${version}, yaver ${sdkVersion}.
|
|
95
|
+
message: `"${name}": project ${version}, yaver ${sdkVersion}. Version differs at a potentially breaking boundary.`,
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -101,7 +101,8 @@ function analyzeProject(packageJson, sdkManifest) {
|
|
|
101
101
|
return { reactNativeVersion: projectRN, errors, warnings, availableModules, missingModules };
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
function looksLikeNativeModule(name) {
|
|
104
|
+
function looksLikeNativeModule(name, sdkManifest) {
|
|
105
|
+
if (sdkManifest?.nativeModules?.[name]) return true;
|
|
105
106
|
return name.startsWith('react-native-') ||
|
|
106
107
|
name.startsWith('@react-native-') ||
|
|
107
108
|
name.startsWith('@react-native/') ||
|
|
@@ -114,4 +115,12 @@ function cleanVersion(v) {
|
|
|
114
115
|
return (v || '').replace(/[\^~>=<\s]/g, '');
|
|
115
116
|
}
|
|
116
117
|
|
|
118
|
+
function hasPotentiallyBreakingVersionDrift(projectVersion, sdkVersion) {
|
|
119
|
+
if (semver.major(projectVersion) !== semver.major(sdkVersion)) return true;
|
|
120
|
+
if (semver.major(projectVersion) === 0 && semver.minor(projectVersion) !== semver.minor(sdkVersion)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
117
126
|
module.exports = { analyzeProject, PURE_JS_PACKAGES, FALSE_POSITIVE_NATIVE };
|
package/src/bundler.js
CHANGED
|
@@ -21,7 +21,7 @@ function getHermescPath() {
|
|
|
21
21
|
if (rnHermesc) return rnHermesc;
|
|
22
22
|
|
|
23
23
|
throw new Error(
|
|
24
|
-
`hermesc not found for ${key}. Install
|
|
24
|
+
`hermesc not found for ${key}. Install yaver-cli hermesc binaries or ensure react-native is installed.`
|
|
25
25
|
);
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -103,13 +103,13 @@ async function compileHermes({ inputPath, outputPath }) {
|
|
|
103
103
|
|
|
104
104
|
function readBytecodeVersion(hbcPath) {
|
|
105
105
|
const buf = fs.readFileSync(hbcPath);
|
|
106
|
-
if (buf.length <
|
|
106
|
+
if (buf.length < 12) return null;
|
|
107
107
|
|
|
108
|
-
// Hermes
|
|
109
|
-
const magic = buf.readUInt32LE(
|
|
108
|
+
// Hermes HBC format: magic at offset 4, BC version at offset 8
|
|
109
|
+
const magic = buf.readUInt32LE(4);
|
|
110
110
|
if (magic !== 0x1F1903C1) return null;
|
|
111
111
|
|
|
112
|
-
return buf.readUInt32LE(
|
|
112
|
+
return buf.readUInt32LE(8);
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
module.exports = { bundle, compileHermes, readBytecodeVersion, getHermescPath };
|
package/src/commands/devices.js
CHANGED
|
@@ -16,7 +16,7 @@ async function devices() {
|
|
|
16
16
|
for (const d of found) {
|
|
17
17
|
console.log(` 📱 ${d.name} (${d.platform})`);
|
|
18
18
|
console.log(` IP: ${d.ip}:${d.port}`);
|
|
19
|
-
console.log(` Push: yaver
|
|
19
|
+
console.log(` Push: yaver push --device ${d.ip}\n`);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
|
package/src/commands/doctor.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
2
|
const { analyzeProject } = require('../analyzer');
|
|
3
|
+
const { loadSDKManifest } = require('../sdk-manifest');
|
|
3
4
|
|
|
4
5
|
async function doctor() {
|
|
5
6
|
if (!fs.existsSync('package.json')) {
|
|
@@ -8,7 +9,7 @@ async function doctor() {
|
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
|
11
|
-
const sdkManifest =
|
|
12
|
+
const sdkManifest = loadSDKManifest();
|
|
12
13
|
const analysis = analyzeProject(pkg, sdkManifest);
|
|
13
14
|
|
|
14
15
|
console.log('\n📋 Yaver Compatibility Report\n');
|
package/src/commands/init.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
2
|
const { analyzeProject } = require('../analyzer');
|
|
3
|
+
const { loadSDKManifest } = require('../sdk-manifest');
|
|
4
4
|
|
|
5
5
|
async function init() {
|
|
6
6
|
if (!fs.existsSync('package.json')) {
|
|
@@ -16,7 +16,7 @@ async function init() {
|
|
|
16
16
|
|
|
17
17
|
console.log('🔍 Analyzing your project...\n');
|
|
18
18
|
|
|
19
|
-
const sdkManifest =
|
|
19
|
+
const sdkManifest = loadSDKManifest();
|
|
20
20
|
const analysis = analyzeProject(pkg, sdkManifest);
|
|
21
21
|
|
|
22
22
|
printAnalysis(analysis, sdkManifest);
|
|
@@ -37,12 +37,12 @@ async function init() {
|
|
|
37
37
|
|
|
38
38
|
if (analysis.errors.filter(e => e.type === 'missing_module').length > 0) {
|
|
39
39
|
console.log('\n⚠️ Your project has compatibility issues (see above).');
|
|
40
|
-
console.log(' You can still push with: yaver
|
|
40
|
+
console.log(' You can still push with: yaver push --ignore-missing');
|
|
41
41
|
console.log(' Features using missing modules will crash.\n');
|
|
42
42
|
} else if (analysis.errors.length > 0) {
|
|
43
43
|
console.log('\n🚫 Incompatible — see errors above.\n');
|
|
44
44
|
} else {
|
|
45
|
-
console.log('\n🎉 Fully compatible! Run: yaver
|
|
45
|
+
console.log('\n🎉 Fully compatible! Run: yaver push\n');
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
package/src/commands/modules.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
async function modules() {
|
|
2
|
-
const
|
|
2
|
+
const { loadSDKManifest } = require('../sdk-manifest');
|
|
3
|
+
const sdkManifest = loadSDKManifest();
|
|
3
4
|
|
|
4
5
|
console.log(`\n📦 Yaver SDK v${sdkManifest.sdkVersion} — Native Modules\n`);
|
|
5
6
|
console.log(` React Native: ${sdkManifest.reactNative}`);
|
package/src/commands/push.js
CHANGED
|
@@ -3,13 +3,14 @@ const path = require('path');
|
|
|
3
3
|
const { analyzeProject } = require('../analyzer');
|
|
4
4
|
const { bundle, compileHermes, readBytecodeVersion } = require('../bundler');
|
|
5
5
|
const { discoverDevice, fetchHealth } = require('../discovery');
|
|
6
|
+
const { loadSDKManifest } = require('../sdk-manifest');
|
|
6
7
|
const { pushBundle, pushAssets } = require('../transport');
|
|
7
8
|
|
|
8
9
|
async function push(options = {}) {
|
|
9
10
|
const startTime = Date.now();
|
|
10
11
|
const quiet = options.quiet;
|
|
11
12
|
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
|
12
|
-
const sdkManifest =
|
|
13
|
+
const sdkManifest = loadSDKManifest();
|
|
13
14
|
|
|
14
15
|
// Find device
|
|
15
16
|
if (!quiet) console.log('📡 Finding device...');
|
|
@@ -22,7 +23,7 @@ async function push(options = {}) {
|
|
|
22
23
|
|
|
23
24
|
if (health.hermes?.bytecodeVersion !== sdkManifest.hermes.bytecodeVersion) {
|
|
24
25
|
console.error(`�� Hermes BC mismatch: device BC${health.hermes?.bytecodeVersion}, CLI BC${sdkManifest.hermes.bytecodeVersion}`);
|
|
25
|
-
console.error(' Update
|
|
26
|
+
console.error(' Update the npm package or the yaver.io app.');
|
|
26
27
|
process.exit(1);
|
|
27
28
|
}
|
|
28
29
|
|
|
@@ -42,7 +43,7 @@ async function push(options = {}) {
|
|
|
42
43
|
console.warn(`\n⚠��� ${analysis.missingModules.length} native module(s) NOT in yaver SDK:`);
|
|
43
44
|
analysis.missingModules.forEach(m => console.warn(` • ${m.name}@${m.version}`));
|
|
44
45
|
console.warn('\n App will crash if it calls these modules.');
|
|
45
|
-
console.warn(' Push anyway: yaver
|
|
46
|
+
console.warn(' Push anyway: yaver push --ignore-missing\n');
|
|
46
47
|
if (!options.force) process.exit(1);
|
|
47
48
|
}
|
|
48
49
|
|
package/src/commands/status.js
CHANGED
|
@@ -14,7 +14,7 @@ async function status(options = {}) {
|
|
|
14
14
|
console.log(` Missing: ${yj.missingModules?.length || 0} native modules`);
|
|
15
15
|
console.log(` Analyzed: ${yj.analyzedAt}`);
|
|
16
16
|
} else {
|
|
17
|
-
console.log(' No yaver.json found. Run: yaver
|
|
17
|
+
console.log(' No yaver.json found. Run: yaver push init');
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
// Device status
|
package/src/discovery.js
CHANGED
|
@@ -24,7 +24,7 @@ async function discoverDevice(manualIp) {
|
|
|
24
24
|
throw new Error(
|
|
25
25
|
'No yaver.io device found on network.\n' +
|
|
26
26
|
' Make sure the yaver.io app is open on your phone (same WiFi).\n' +
|
|
27
|
-
' Or specify device IP: yaver
|
|
27
|
+
' Or specify device IP: yaver push --device <ip>'
|
|
28
28
|
);
|
|
29
29
|
}
|
|
30
30
|
|
package/src/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
const PACKAGE = require('../package.json');
|
|
2
|
+
const { resolveAgentInfo, runAgentCommand } = require('./agent-runtime');
|
|
1
3
|
const { init } = require('./commands/init');
|
|
2
4
|
const { push } = require('./commands/push');
|
|
3
5
|
const { doctor } = require('./commands/doctor');
|
|
@@ -6,8 +8,8 @@ const { modules } = require('./commands/modules');
|
|
|
6
8
|
const { reset } = require('./commands/reset');
|
|
7
9
|
const { status } = require('./commands/status');
|
|
8
10
|
|
|
9
|
-
const
|
|
10
|
-
yaver
|
|
11
|
+
const PUSH_HELP = `
|
|
12
|
+
yaver push — Push existing React Native projects to the Yaver mobile host
|
|
11
13
|
|
|
12
14
|
Commands:
|
|
13
15
|
init Analyze project, show compatibility, create yaver.json
|
|
@@ -27,12 +29,43 @@ Options:
|
|
|
27
29
|
--help Show this help
|
|
28
30
|
`;
|
|
29
31
|
|
|
30
|
-
|
|
32
|
+
const UNIFIED_HELP = `
|
|
33
|
+
yaver — single npm install for the Go agent and the RN push CLI
|
|
34
|
+
|
|
35
|
+
Agent commands:
|
|
36
|
+
yaver serve Start the Yaver agent (downloads platform binary if needed)
|
|
37
|
+
yaver auth Sign in and configure the agent
|
|
38
|
+
yaver version Print agent version
|
|
39
|
+
yaver <agent-command> Forward any other command to the Go agent
|
|
40
|
+
|
|
41
|
+
Push-to-device commands:
|
|
42
|
+
yaver push Bundle + validate + push current RN/Expo project
|
|
43
|
+
yaver push init Analyze current project and create yaver.json
|
|
44
|
+
yaver push doctor Deep compatibility report for current project
|
|
45
|
+
yaver push modules List native modules compiled into the mobile host
|
|
46
|
+
yaver push devices Scan LAN for Yaver mobile hosts
|
|
47
|
+
yaver push reset Clear pushed bundle on the selected device
|
|
48
|
+
yaver push status Show project + device push status
|
|
49
|
+
|
|
50
|
+
Compatibility:
|
|
51
|
+
yaver-push <command> Legacy alias for the push subcommands above
|
|
52
|
+
|
|
53
|
+
Options:
|
|
54
|
+
--help Show this help
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const PUSH_SUBCOMMANDS = new Set(['init', 'push', 'doctor', 'devices', 'modules', 'reset', 'status']);
|
|
58
|
+
const DIRECT_PUSH_ALIASES = new Map([
|
|
59
|
+
['init', 'init'],
|
|
60
|
+
['modules', 'modules'],
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
async function runPushCli(args) {
|
|
31
64
|
const command = args[0];
|
|
32
65
|
const options = parseArgs(args.slice(1));
|
|
33
66
|
|
|
34
|
-
if (!command || command === '--help' || command === '-h') {
|
|
35
|
-
console.log(
|
|
67
|
+
if (!command || command === '--help' || command === '-h' || args.includes('--help') || args.includes('-h')) {
|
|
68
|
+
console.log(PUSH_HELP);
|
|
36
69
|
process.exit(0);
|
|
37
70
|
}
|
|
38
71
|
|
|
@@ -61,7 +94,7 @@ async function run(args) {
|
|
|
61
94
|
break;
|
|
62
95
|
default:
|
|
63
96
|
console.error(`Unknown command: ${command}`);
|
|
64
|
-
console.log(
|
|
97
|
+
console.log(PUSH_HELP);
|
|
65
98
|
process.exit(1);
|
|
66
99
|
}
|
|
67
100
|
} catch (err) {
|
|
@@ -71,6 +104,53 @@ async function run(args) {
|
|
|
71
104
|
}
|
|
72
105
|
}
|
|
73
106
|
|
|
107
|
+
async function runUnified(args) {
|
|
108
|
+
const command = args[0];
|
|
109
|
+
|
|
110
|
+
if (!command || command === '--help' || command === '-h' || command === 'help') {
|
|
111
|
+
console.log(UNIFIED_HELP);
|
|
112
|
+
process.exit(0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (command === 'push') {
|
|
116
|
+
const next = args[1];
|
|
117
|
+
if (!next || next.startsWith('-')) {
|
|
118
|
+
await runPushCli(['push', ...args.slice(1)]);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (PUSH_SUBCOMMANDS.has(next)) {
|
|
122
|
+
const subcommand = next === 'push' ? 'push' : next;
|
|
123
|
+
await runPushCli([subcommand, ...args.slice(2)]);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
console.error(`Unknown push subcommand: ${next}`);
|
|
127
|
+
console.log(PUSH_HELP);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (DIRECT_PUSH_ALIASES.has(command)) {
|
|
132
|
+
await runPushCli([DIRECT_PUSH_ALIASES.get(command), ...args.slice(1)]);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (command === 'npm-agent-info') {
|
|
137
|
+
const info = resolveAgentInfo();
|
|
138
|
+
console.log(JSON.stringify(info, null, 2));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
await runAgentCommand(args);
|
|
144
|
+
} catch (err) {
|
|
145
|
+
if (typeof err.exitCode === 'number') {
|
|
146
|
+
process.exit(err.exitCode);
|
|
147
|
+
}
|
|
148
|
+
console.error(`\n❌ ${err.message}`);
|
|
149
|
+
if (process.env.YAVER_DEBUG) console.error(err.stack);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
74
154
|
function parseArgs(args) {
|
|
75
155
|
const opts = {};
|
|
76
156
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -90,4 +170,4 @@ function parseArgs(args) {
|
|
|
90
170
|
return opts;
|
|
91
171
|
}
|
|
92
172
|
|
|
93
|
-
module.exports = {
|
|
173
|
+
module.exports = { runPushCli, runUnified };
|