@3leaps/sysprims 0.1.7
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/LICENSE +6 -0
- package/README.md +31 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/ffi.d.ts +34 -0
- package/dist/ffi.d.ts.map +1 -0
- package/dist/ffi.js +60 -0
- package/dist/ffi.js.map +1 -0
- package/dist/index.d.ts +158 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +246 -0
- package/dist/index.js.map +1 -0
- package/dist/native/index.d.ts +32 -0
- package/dist/native/index.js +327 -0
- package/dist/native/sysprims.darwin-arm64.node +0 -0
- package/dist/native.d.ts +3 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +86 -0
- package/dist/native.js.map +1 -0
- package/dist/types.d.ts +124 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/native/Cargo.toml +28 -0
- package/native/build.rs +3 -0
- package/native/src/lib.rs +416 -0
- package/package.json +61 -0
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
use std::time::Duration;
|
|
2
|
+
|
|
3
|
+
use napi_derive::napi;
|
|
4
|
+
use sysprims_core::schema::{SPAWN_IN_GROUP_CONFIG_V1, TERMINATE_TREE_CONFIG_V1};
|
|
5
|
+
use sysprims_core::SysprimsError;
|
|
6
|
+
use sysprims_proc::{PortFilter, ProcessFilter};
|
|
7
|
+
use sysprims_timeout::{spawn_in_group, terminate_tree, SpawnInGroupConfig, TerminateTreeConfig};
|
|
8
|
+
|
|
9
|
+
#[repr(i32)]
|
|
10
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
11
|
+
pub enum SysprimsErrorCode {
|
|
12
|
+
Ok = 0,
|
|
13
|
+
InvalidArgument = 1,
|
|
14
|
+
SpawnFailed = 2,
|
|
15
|
+
Timeout = 3,
|
|
16
|
+
PermissionDenied = 4,
|
|
17
|
+
NotFound = 5,
|
|
18
|
+
NotSupported = 6,
|
|
19
|
+
GroupCreationFailed = 7,
|
|
20
|
+
System = 8,
|
|
21
|
+
Internal = 99,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
impl From<&SysprimsError> for SysprimsErrorCode {
|
|
25
|
+
fn from(err: &SysprimsError) -> Self {
|
|
26
|
+
match err.error_code() {
|
|
27
|
+
1 => SysprimsErrorCode::InvalidArgument,
|
|
28
|
+
2 => SysprimsErrorCode::SpawnFailed,
|
|
29
|
+
3 => SysprimsErrorCode::Timeout,
|
|
30
|
+
4 => SysprimsErrorCode::PermissionDenied,
|
|
31
|
+
5 => SysprimsErrorCode::NotFound,
|
|
32
|
+
6 => SysprimsErrorCode::NotSupported,
|
|
33
|
+
7 => SysprimsErrorCode::GroupCreationFailed,
|
|
34
|
+
8 => SysprimsErrorCode::System,
|
|
35
|
+
_ => SysprimsErrorCode::Internal,
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#[napi(object)]
|
|
41
|
+
pub struct SysprimsCallJsonResult {
|
|
42
|
+
pub code: i32,
|
|
43
|
+
pub json: Option<String>,
|
|
44
|
+
pub message: Option<String>,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#[napi(object)]
|
|
48
|
+
pub struct SysprimsCallU32Result {
|
|
49
|
+
pub code: i32,
|
|
50
|
+
pub value: Option<u32>,
|
|
51
|
+
pub message: Option<String>,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#[napi(object)]
|
|
55
|
+
pub struct SysprimsCallVoidResult {
|
|
56
|
+
pub code: i32,
|
|
57
|
+
pub message: Option<String>,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
fn ok_json(json: String) -> SysprimsCallJsonResult {
|
|
61
|
+
SysprimsCallJsonResult {
|
|
62
|
+
code: SysprimsErrorCode::Ok as i32,
|
|
63
|
+
json: Some(json),
|
|
64
|
+
message: None,
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fn err_json(err: SysprimsError) -> SysprimsCallJsonResult {
|
|
69
|
+
SysprimsCallJsonResult {
|
|
70
|
+
code: SysprimsErrorCode::from(&err) as i32,
|
|
71
|
+
json: None,
|
|
72
|
+
message: Some(err.to_string()),
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#[cfg(unix)]
|
|
77
|
+
fn ok_u32(value: u32) -> SysprimsCallU32Result {
|
|
78
|
+
SysprimsCallU32Result {
|
|
79
|
+
code: SysprimsErrorCode::Ok as i32,
|
|
80
|
+
value: Some(value),
|
|
81
|
+
message: None,
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fn err_u32(err: SysprimsError) -> SysprimsCallU32Result {
|
|
86
|
+
SysprimsCallU32Result {
|
|
87
|
+
code: SysprimsErrorCode::from(&err) as i32,
|
|
88
|
+
value: None,
|
|
89
|
+
message: Some(err.to_string()),
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
fn ok_void() -> SysprimsCallVoidResult {
|
|
94
|
+
SysprimsCallVoidResult {
|
|
95
|
+
code: SysprimsErrorCode::Ok as i32,
|
|
96
|
+
message: None,
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
fn err_void(err: SysprimsError) -> SysprimsCallVoidResult {
|
|
101
|
+
SysprimsCallVoidResult {
|
|
102
|
+
code: SysprimsErrorCode::from(&err) as i32,
|
|
103
|
+
message: Some(err.to_string()),
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
#[napi]
|
|
108
|
+
pub fn sysprims_abi_version() -> u32 {
|
|
109
|
+
1
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// -----------------------------------------------------------------------------
|
|
113
|
+
// Process Inspection
|
|
114
|
+
// -----------------------------------------------------------------------------
|
|
115
|
+
|
|
116
|
+
#[napi]
|
|
117
|
+
pub fn sysprims_proc_get(pid: u32) -> SysprimsCallJsonResult {
|
|
118
|
+
match sysprims_proc::get_process(pid) {
|
|
119
|
+
Ok(info) => match serde_json::to_string(&info) {
|
|
120
|
+
Ok(json) => ok_json(json),
|
|
121
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
122
|
+
"failed to serialize process info: {}",
|
|
123
|
+
e
|
|
124
|
+
))),
|
|
125
|
+
},
|
|
126
|
+
Err(e) => err_json(e),
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
#[napi]
|
|
131
|
+
pub fn sysprims_proc_list(filter_json: String) -> SysprimsCallJsonResult {
|
|
132
|
+
let filter = if filter_json.is_empty() || filter_json == "{}" {
|
|
133
|
+
ProcessFilter::default()
|
|
134
|
+
} else {
|
|
135
|
+
match serde_json::from_str::<ProcessFilter>(&filter_json) {
|
|
136
|
+
Ok(f) => f,
|
|
137
|
+
Err(e) => {
|
|
138
|
+
return err_json(SysprimsError::invalid_argument(format!(
|
|
139
|
+
"invalid filter JSON: {}",
|
|
140
|
+
e
|
|
141
|
+
)))
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
if let Err(e) = filter.validate() {
|
|
147
|
+
return err_json(e);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
match sysprims_proc::snapshot_filtered(&filter) {
|
|
151
|
+
Ok(snapshot) => match serde_json::to_string(&snapshot) {
|
|
152
|
+
Ok(json) => ok_json(json),
|
|
153
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
154
|
+
"failed to serialize snapshot: {}",
|
|
155
|
+
e
|
|
156
|
+
))),
|
|
157
|
+
},
|
|
158
|
+
Err(e) => err_json(e),
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
#[napi]
|
|
163
|
+
pub fn sysprims_proc_listening_ports(filter_json: String) -> SysprimsCallJsonResult {
|
|
164
|
+
let filter = if filter_json.is_empty() || filter_json == "{}" {
|
|
165
|
+
PortFilter::default()
|
|
166
|
+
} else {
|
|
167
|
+
match serde_json::from_str::<PortFilter>(&filter_json) {
|
|
168
|
+
Ok(f) => f,
|
|
169
|
+
Err(e) => {
|
|
170
|
+
return err_json(SysprimsError::invalid_argument(format!(
|
|
171
|
+
"invalid filter JSON: {}",
|
|
172
|
+
e
|
|
173
|
+
)))
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
if let Err(e) = filter.validate() {
|
|
179
|
+
return err_json(e);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
match sysprims_proc::listening_ports(Some(&filter)) {
|
|
183
|
+
Ok(snapshot) => match serde_json::to_string(&snapshot) {
|
|
184
|
+
Ok(json) => ok_json(json),
|
|
185
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
186
|
+
"failed to serialize port bindings: {}",
|
|
187
|
+
e
|
|
188
|
+
))),
|
|
189
|
+
},
|
|
190
|
+
Err(e) => err_json(e),
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
#[napi]
|
|
195
|
+
pub fn sysprims_proc_wait_pid(pid: u32, timeout_ms: u32) -> SysprimsCallJsonResult {
|
|
196
|
+
match sysprims_proc::wait_pid(pid, Duration::from_millis(timeout_ms as u64)) {
|
|
197
|
+
Ok(result) => match serde_json::to_string(&result) {
|
|
198
|
+
Ok(json) => ok_json(json),
|
|
199
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
200
|
+
"failed to serialize wait result: {}",
|
|
201
|
+
e
|
|
202
|
+
))),
|
|
203
|
+
},
|
|
204
|
+
Err(e) => err_json(e),
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// -----------------------------------------------------------------------------
|
|
209
|
+
// Self Introspection
|
|
210
|
+
// -----------------------------------------------------------------------------
|
|
211
|
+
|
|
212
|
+
#[napi]
|
|
213
|
+
pub fn sysprims_self_getpgid() -> SysprimsCallU32Result {
|
|
214
|
+
#[cfg(unix)]
|
|
215
|
+
{
|
|
216
|
+
match sysprims_session::getpgid(0) {
|
|
217
|
+
Ok(v) => ok_u32(v),
|
|
218
|
+
Err(e) => err_u32(e),
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
#[cfg(windows)]
|
|
223
|
+
{
|
|
224
|
+
err_u32(SysprimsError::not_supported("getpgid", "windows"))
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
#[napi]
|
|
229
|
+
pub fn sysprims_self_getsid() -> SysprimsCallU32Result {
|
|
230
|
+
#[cfg(unix)]
|
|
231
|
+
{
|
|
232
|
+
match sysprims_session::getsid(0) {
|
|
233
|
+
Ok(v) => ok_u32(v),
|
|
234
|
+
Err(e) => err_u32(e),
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
#[cfg(windows)]
|
|
239
|
+
{
|
|
240
|
+
err_u32(SysprimsError::not_supported("getsid", "windows"))
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// -----------------------------------------------------------------------------
|
|
245
|
+
// Signals
|
|
246
|
+
// -----------------------------------------------------------------------------
|
|
247
|
+
|
|
248
|
+
#[napi]
|
|
249
|
+
pub fn sysprims_signal_send(pid: u32, signal: i32) -> SysprimsCallVoidResult {
|
|
250
|
+
match sysprims_signal::kill(pid, signal) {
|
|
251
|
+
Ok(()) => ok_void(),
|
|
252
|
+
Err(e) => err_void(e),
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
#[napi]
|
|
257
|
+
pub fn sysprims_signal_send_group(pgid: u32, signal: i32) -> SysprimsCallVoidResult {
|
|
258
|
+
match sysprims_signal::killpg(pgid, signal) {
|
|
259
|
+
Ok(()) => ok_void(),
|
|
260
|
+
Err(e) => err_void(e),
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
#[napi]
|
|
265
|
+
pub fn sysprims_terminate(pid: u32) -> SysprimsCallVoidResult {
|
|
266
|
+
match sysprims_signal::terminate(pid) {
|
|
267
|
+
Ok(()) => ok_void(),
|
|
268
|
+
Err(e) => err_void(e),
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
#[napi]
|
|
273
|
+
pub fn sysprims_force_kill(pid: u32) -> SysprimsCallVoidResult {
|
|
274
|
+
match sysprims_signal::force_kill(pid) {
|
|
275
|
+
Ok(()) => ok_void(),
|
|
276
|
+
Err(e) => err_void(e),
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// -----------------------------------------------------------------------------
|
|
281
|
+
// Terminate Tree
|
|
282
|
+
// -----------------------------------------------------------------------------
|
|
283
|
+
|
|
284
|
+
#[derive(Debug, serde::Deserialize)]
|
|
285
|
+
#[serde(deny_unknown_fields)]
|
|
286
|
+
struct WireTerminateTreeConfig {
|
|
287
|
+
#[serde(default = "default_terminate_tree_schema_id")]
|
|
288
|
+
schema_id: String,
|
|
289
|
+
|
|
290
|
+
#[serde(default)]
|
|
291
|
+
grace_timeout_ms: Option<u64>,
|
|
292
|
+
#[serde(default)]
|
|
293
|
+
kill_timeout_ms: Option<u64>,
|
|
294
|
+
#[serde(default)]
|
|
295
|
+
signal: Option<i32>,
|
|
296
|
+
#[serde(default)]
|
|
297
|
+
kill_signal: Option<i32>,
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
fn default_terminate_tree_schema_id() -> String {
|
|
301
|
+
TERMINATE_TREE_CONFIG_V1.to_string()
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
impl From<WireTerminateTreeConfig> for TerminateTreeConfig {
|
|
305
|
+
fn from(value: WireTerminateTreeConfig) -> Self {
|
|
306
|
+
let mut cfg = TerminateTreeConfig::default();
|
|
307
|
+
if let Some(v) = value.grace_timeout_ms {
|
|
308
|
+
cfg.grace_timeout_ms = v;
|
|
309
|
+
}
|
|
310
|
+
if let Some(v) = value.kill_timeout_ms {
|
|
311
|
+
cfg.kill_timeout_ms = v;
|
|
312
|
+
}
|
|
313
|
+
if let Some(v) = value.signal {
|
|
314
|
+
cfg.signal = v;
|
|
315
|
+
}
|
|
316
|
+
if let Some(v) = value.kill_signal {
|
|
317
|
+
cfg.kill_signal = v;
|
|
318
|
+
}
|
|
319
|
+
cfg
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
#[napi]
|
|
324
|
+
pub fn sysprims_terminate_tree(pid: u32, config_json: String) -> SysprimsCallJsonResult {
|
|
325
|
+
let cfg = if config_json.is_empty() || config_json == "{}" {
|
|
326
|
+
TerminateTreeConfig::default()
|
|
327
|
+
} else {
|
|
328
|
+
let wire = match serde_json::from_str::<WireTerminateTreeConfig>(&config_json) {
|
|
329
|
+
Ok(v) => v,
|
|
330
|
+
Err(e) => {
|
|
331
|
+
return err_json(SysprimsError::invalid_argument(format!(
|
|
332
|
+
"invalid config JSON: {}",
|
|
333
|
+
e
|
|
334
|
+
)))
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
if wire.schema_id != TERMINATE_TREE_CONFIG_V1 {
|
|
339
|
+
return err_json(SysprimsError::invalid_argument(format!(
|
|
340
|
+
"invalid schema_id (expected {})",
|
|
341
|
+
TERMINATE_TREE_CONFIG_V1
|
|
342
|
+
)));
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
wire.into()
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
match terminate_tree(pid, cfg) {
|
|
349
|
+
Ok(result) => match serde_json::to_string(&result) {
|
|
350
|
+
Ok(json) => ok_json(json),
|
|
351
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
352
|
+
"failed to serialize terminate result: {}",
|
|
353
|
+
e
|
|
354
|
+
))),
|
|
355
|
+
},
|
|
356
|
+
Err(e) => err_json(e),
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// -----------------------------------------------------------------------------
|
|
361
|
+
// Spawn In Group
|
|
362
|
+
// -----------------------------------------------------------------------------
|
|
363
|
+
|
|
364
|
+
#[derive(Debug, serde::Deserialize)]
|
|
365
|
+
#[serde(deny_unknown_fields)]
|
|
366
|
+
struct WireSpawnInGroupConfig {
|
|
367
|
+
schema_id: String,
|
|
368
|
+
argv: Vec<String>,
|
|
369
|
+
#[serde(default)]
|
|
370
|
+
cwd: Option<String>,
|
|
371
|
+
#[serde(default)]
|
|
372
|
+
env: Option<std::collections::BTreeMap<String, String>>,
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
#[napi]
|
|
376
|
+
pub fn sysprims_spawn_in_group(config_json: String) -> SysprimsCallJsonResult {
|
|
377
|
+
if config_json.is_empty() {
|
|
378
|
+
return err_json(SysprimsError::invalid_argument(
|
|
379
|
+
"config_json cannot be empty",
|
|
380
|
+
));
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
let wire = match serde_json::from_str::<WireSpawnInGroupConfig>(&config_json) {
|
|
384
|
+
Ok(v) => v,
|
|
385
|
+
Err(e) => {
|
|
386
|
+
return err_json(SysprimsError::invalid_argument(format!(
|
|
387
|
+
"invalid config JSON: {}",
|
|
388
|
+
e
|
|
389
|
+
)))
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
if wire.schema_id != SPAWN_IN_GROUP_CONFIG_V1 {
|
|
394
|
+
return err_json(SysprimsError::invalid_argument(format!(
|
|
395
|
+
"invalid schema_id (expected {})",
|
|
396
|
+
SPAWN_IN_GROUP_CONFIG_V1
|
|
397
|
+
)));
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
let cfg = SpawnInGroupConfig {
|
|
401
|
+
argv: wire.argv,
|
|
402
|
+
cwd: wire.cwd,
|
|
403
|
+
env: wire.env,
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
match spawn_in_group(cfg) {
|
|
407
|
+
Ok(result) => match serde_json::to_string(&result) {
|
|
408
|
+
Ok(json) => ok_json(json),
|
|
409
|
+
Err(e) => err_json(SysprimsError::internal(format!(
|
|
410
|
+
"failed to serialize spawn result: {}",
|
|
411
|
+
e
|
|
412
|
+
))),
|
|
413
|
+
},
|
|
414
|
+
Err(e) => err_json(e),
|
|
415
|
+
}
|
|
416
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@3leaps/sysprims",
|
|
3
|
+
"version": "0.1.7",
|
|
4
|
+
"description": "GPL-free cross-platform process utilities (TypeScript bindings via Node-API native addon)",
|
|
5
|
+
"license": "MIT OR Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/3leaps/sysprims.git",
|
|
9
|
+
"directory": "bindings/typescript/sysprims"
|
|
10
|
+
},
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/",
|
|
15
|
+
"native/",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18"
|
|
21
|
+
},
|
|
22
|
+
"napi": {
|
|
23
|
+
"name": "sysprims",
|
|
24
|
+
"triples": {
|
|
25
|
+
"defaults": false,
|
|
26
|
+
"additional": [
|
|
27
|
+
"x86_64-unknown-linux-gnu",
|
|
28
|
+
"x86_64-unknown-linux-musl",
|
|
29
|
+
"aarch64-unknown-linux-gnu",
|
|
30
|
+
"aarch64-unknown-linux-musl",
|
|
31
|
+
"aarch64-apple-darwin",
|
|
32
|
+
"x86_64-pc-windows-msvc",
|
|
33
|
+
"aarch64-pc-windows-msvc"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"clean": "node scripts/clean.js",
|
|
39
|
+
"build:native": "napi build --cargo-cwd native --release --platform --strip dist/native",
|
|
40
|
+
"build": "tsc -p tsconfig.build.json",
|
|
41
|
+
"build:test": "tsc -p tsconfig.test.json",
|
|
42
|
+
"test": "npm run clean && npm run build && npm run build:native && npm run build:test && node scripts/run-tests.js",
|
|
43
|
+
"test:ci": "npm run clean && npm run build && npm run build:native && npm run build:test && node scripts/run-tests.js",
|
|
44
|
+
"typecheck": "tsc -p tsconfig.build.json --noEmit"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {},
|
|
47
|
+
"optionalDependencies": {
|
|
48
|
+
"@3leaps/sysprims-linux-x64-gnu": "0.1.7",
|
|
49
|
+
"@3leaps/sysprims-linux-x64-musl": "0.1.7",
|
|
50
|
+
"@3leaps/sysprims-linux-arm64-gnu": "0.1.7",
|
|
51
|
+
"@3leaps/sysprims-linux-arm64-musl": "0.1.7",
|
|
52
|
+
"@3leaps/sysprims-darwin-arm64": "0.1.7",
|
|
53
|
+
"@3leaps/sysprims-win32-x64-msvc": "0.1.7",
|
|
54
|
+
"@3leaps/sysprims-win32-arm64-msvc": "0.1.7"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@napi-rs/cli": "^2.18.4",
|
|
58
|
+
"@types/node": "^22.10.0",
|
|
59
|
+
"typescript": "^5.6.3"
|
|
60
|
+
}
|
|
61
|
+
}
|