Skip to content

Commit 7e25b9e

Browse files
authored
feat: include rust debug logs (#46)
1 parent b3ff912 commit 7e25b9e

File tree

4 files changed

+59
-10
lines changed

4 files changed

+59
-10
lines changed

src/mod.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,13 @@ export interface WorkspaceOptions {
5959
platform?: "node" | "browser";
6060
/** Whether to force using the cache. */
6161
cachedOnly?: boolean;
62-
/** Enable debug logs. */
62+
/**
63+
* Enable debug logs.
64+
*
65+
* @remarks Note that the Rust debug logs are enabled globally
66+
* and can only be enabled by the first workspace that gets
67+
* created. This is a limitation of how the Rust logging works.
68+
*/
6369
debug?: boolean;
6470
/** Whether to preserve JSX syntax in the loaded output. */
6571
preserveJsx?: boolean;
@@ -205,14 +211,14 @@ export class Loader implements Disposable {
205211
): string {
206212
if (this.#debug) {
207213
console.error(
208-
`Resolving '${specifier}' from '${referrer ?? "<undefined>"}' (${
209-
resolutionModeToString(resolutionMode)
210-
})`,
214+
`DEBUG - Resolving '${specifier}' from '${
215+
referrer ?? "<undefined>"
216+
}' (${resolutionModeToString(resolutionMode)})`,
211217
);
212218
}
213219
const value = this.#inner.resolve_sync(specifier, referrer, resolutionMode);
214220
if (this.#debug) {
215-
console.error(`Resolved to '${value}'`);
221+
console.error(`DEBUG - Resolved to '${value}'`);
216222
}
217223
return value;
218224
}
@@ -232,9 +238,9 @@ export class Loader implements Disposable {
232238
): Promise<string> {
233239
if (this.#debug) {
234240
console.error(
235-
`Resolving '${specifier}' from '${referrer ?? "<undefined>"}' (${
236-
resolutionModeToString(resolutionMode)
237-
})`,
241+
`DEBUG - Resolving '${specifier}' from '${
242+
referrer ?? "<undefined>"
243+
}' (${resolutionModeToString(resolutionMode)})`,
238244
);
239245
}
240246
const value = await this.#inner.resolve(
@@ -243,7 +249,7 @@ export class Loader implements Disposable {
243249
resolutionMode,
244250
);
245251
if (this.#debug) {
246-
console.error(`Resolved to '${value}'`);
252+
console.error(`DEBUG - Resolved to '${value}'`);
247253
}
248254
return value;
249255
}
@@ -255,7 +261,7 @@ export class Loader implements Disposable {
255261
): Promise<LoadResponse> {
256262
if (this.#debug) {
257263
console.error(
258-
`Loading '${specifier}' with type '${
264+
`DEBUG - Loading '${specifier}' with type '${
259265
requestedModuleTypeToString(requestedModuleType) ?? "<default>"
260266
}'`,
261267
);

src/rs_lib/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/rs_lib/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ path = "lib.rs"
1212
anyhow = "1.0.57"
1313
console_error_panic_hook = "0.1.6"
1414
js-sys = "=0.3.77"
15+
log = "0.4"
1516
serde = "1.0.149"
1617
serde-wasm-bindgen = "=0.6.5"
1718
wasm-bindgen = "=0.2.100"

src/rs_lib/lib.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::path::Path;
66
use std::path::PathBuf;
77
use std::rc::Rc;
88
use std::sync::Arc;
9+
use std::sync::OnceLock;
910

1011
use anyhow::Context;
1112
use anyhow::bail;
@@ -56,6 +57,9 @@ use deno_semver::jsr::JsrPackageReqReference;
5657
use deno_semver::npm::NpmPackageReqReference;
5758
use js_sys::Object;
5859
use js_sys::Uint8Array;
60+
use log::LevelFilter;
61+
use log::Metadata;
62+
use log::Record;
5963
use node_resolver::NodeConditionOptions;
6064
use node_resolver::NodeResolverOptions;
6165
use node_resolver::PackageJsonThreadLocalCache;
@@ -79,6 +83,31 @@ extern "C" {
7983
fn error(s: &JsValue);
8084
}
8185

86+
static GLOBAL_LOGGER: OnceLock<Logger> = OnceLock::new();
87+
88+
struct Logger {
89+
debug: bool,
90+
}
91+
92+
impl log::Log for Logger {
93+
fn enabled(&self, metadata: &Metadata) -> bool {
94+
metadata.level() <= log::Level::Info
95+
|| metadata.level() == log::Level::Debug && self.debug
96+
}
97+
98+
fn log(&self, record: &Record) {
99+
if self.enabled(record.metadata()) {
100+
error(&JsValue::from(format!(
101+
"{} RS - {}",
102+
record.level(),
103+
record.args()
104+
)));
105+
}
106+
}
107+
108+
fn flush(&self) {}
109+
}
110+
82111
#[derive(Debug, Clone)]
83112
pub struct ConsoleLogReporter;
84113

@@ -133,6 +162,8 @@ pub struct DenoWorkspaceOptions {
133162
pub preserve_jsx: Option<bool>,
134163
#[serde(default)]
135164
pub no_transpile: Option<bool>,
165+
#[serde(default)]
166+
pub debug: Option<bool>,
136167
}
137168

138169
#[wasm_bindgen]
@@ -176,6 +207,16 @@ impl DenoWorkspace {
176207
})
177208
}
178209

210+
let debug = options.debug.unwrap_or(false);
211+
let logger = GLOBAL_LOGGER.get_or_init(|| Logger { debug });
212+
_ = log::set_logger(logger).map(|()| {
213+
log::set_max_level(if debug {
214+
LevelFilter::Debug
215+
} else {
216+
LevelFilter::Info
217+
})
218+
});
219+
179220
let sys = RealSys;
180221
let cwd = sys.env_current_dir()?;
181222
let is_browser_platform = resolve_is_browser_platform(&options)?;

0 commit comments

Comments
 (0)