deno_runtime/ops/
bootstrap.rs1use deno_core::op2;
4use deno_core::OpState;
5use deno_terminal::colors::ColorLevel;
6use serde::Serialize;
7
8use crate::BootstrapOptions;
9
10deno_core::extension!(
11 deno_bootstrap,
12 ops = [
13 op_bootstrap_args,
14 op_bootstrap_pid,
15 op_bootstrap_numcpus,
16 op_bootstrap_user_agent,
17 op_bootstrap_language,
18 op_bootstrap_log_level,
19 op_bootstrap_no_color,
20 op_bootstrap_color_depth,
21 op_bootstrap_is_stdout_tty,
22 op_bootstrap_is_stderr_tty,
23 op_bootstrap_unstable_args,
24 op_snapshot_options,
25 ],
26 options = {
27 snapshot_options: Option<SnapshotOptions>,
28 },
29 state = |state, options| {
30 if let Some(snapshot_options) = options.snapshot_options {
31 state.put::<SnapshotOptions>(snapshot_options);
32 }
33 },
34);
35
36#[derive(Serialize)]
37#[serde(rename_all = "camelCase")]
38pub struct SnapshotOptions {
39 pub ts_version: String,
40 pub v8_version: &'static str,
41 pub target: String,
42}
43
44impl Default for SnapshotOptions {
45 fn default() -> Self {
46 let arch = std::env::consts::ARCH;
47 let platform = std::env::consts::OS;
48 let target = match platform {
49 "macos" => format!("{}-apple-darwin", arch),
50 "linux" => format!("{}-unknown-linux-gnu", arch),
51 "windows" => format!("{}-pc-windows-msvc", arch),
52 rest => format!("{}-{}", arch, rest),
53 };
54
55 Self {
56 ts_version: "n/a".to_owned(),
57 v8_version: deno_core::v8::VERSION_STRING,
58 target,
59 }
60 }
61}
62
63#[op2]
65#[serde]
66pub fn op_snapshot_options(state: &mut OpState) -> SnapshotOptions {
67 state.take::<SnapshotOptions>()
68}
69
70#[op2]
71#[serde]
72pub fn op_bootstrap_args(state: &mut OpState) -> Vec<String> {
73 state.borrow::<BootstrapOptions>().args.clone()
74}
75
76#[op2(fast)]
77#[smi]
78pub fn op_bootstrap_pid() -> u32 {
79 std::process::id()
80}
81
82#[op2(fast)]
83#[smi]
84pub fn op_bootstrap_numcpus(state: &mut OpState) -> u32 {
85 state.borrow::<BootstrapOptions>().cpu_count as u32
86}
87
88#[op2]
89#[string]
90pub fn op_bootstrap_user_agent(state: &mut OpState) -> String {
91 state.borrow::<BootstrapOptions>().user_agent.clone()
92}
93
94#[op2]
95#[serde]
96pub fn op_bootstrap_unstable_args(state: &mut OpState) -> Vec<String> {
97 let options = state.borrow::<BootstrapOptions>();
98 let mut flags = Vec::with_capacity(options.unstable_features.len());
99 for granular_flag in crate::UNSTABLE_GRANULAR_FLAGS.iter() {
100 if options.unstable_features.contains(&granular_flag.id) {
101 flags.push(format!("--unstable-{}", granular_flag.name));
102 }
103 }
104 flags
105}
106
107#[op2]
108#[string]
109pub fn op_bootstrap_language(state: &mut OpState) -> String {
110 state.borrow::<BootstrapOptions>().locale.clone()
111}
112
113#[op2(fast)]
114#[smi]
115pub fn op_bootstrap_log_level(state: &mut OpState) -> i32 {
116 state.borrow::<BootstrapOptions>().log_level as i32
117}
118
119#[op2(fast)]
120pub fn op_bootstrap_no_color(state: &mut OpState) -> bool {
121 let options = state.borrow::<BootstrapOptions>();
122 options.no_color
123}
124
125#[op2(fast)]
126pub fn op_bootstrap_color_depth(state: &mut OpState) -> i32 {
127 let options = state.borrow::<BootstrapOptions>();
128 match options.color_level {
129 ColorLevel::None => 1,
130 ColorLevel::Ansi => 4,
131 ColorLevel::Ansi256 => 8,
132 ColorLevel::TrueColor => 24,
133 }
134}
135
136#[op2(fast)]
137pub fn op_bootstrap_is_stdout_tty(state: &mut OpState) -> bool {
138 let options = state.borrow::<BootstrapOptions>();
139 options.is_stdout_tty
140}
141
142#[op2(fast)]
143pub fn op_bootstrap_is_stderr_tty(state: &mut OpState) -> bool {
144 let options = state.borrow::<BootstrapOptions>();
145 options.is_stderr_tty
146}