From f88fa2dcf8385e507310adc8f813945d90bd7286 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 15 Nov 2018 05:43:19 -0500 Subject: [PATCH] Support shebang --- js/main.ts | 1 - src/deno_dir.rs | 31 +++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/js/main.ts b/js/main.ts index b0c7ed6d4d..6f2d0fcfa1 100644 --- a/js/main.ts +++ b/js/main.ts @@ -86,7 +86,6 @@ export default function denoMain() { const cwd = startResMsg.cwd(); log("cwd", cwd); - // TODO handle shebang. for (let i = 1; i < startResMsg.argvLength(); i++) { args.push(startResMsg.argv(i)); } diff --git a/src/deno_dir.rs b/src/deno_dir.rs index ee114a654e..a7b9f97d6d 100644 --- a/src/deno_dir.rs +++ b/src/deno_dir.rs @@ -218,7 +218,7 @@ impl DenoDir { self.resolve_module(module_specifier, containing_file)?; let result = self.get_source_code(module_name.as_str(), filename.as_str()); - let out = match result { + let mut out = match result { Ok(out) => out, Err(err) => { if err.kind() == ErrorKind::NotFound { @@ -233,9 +233,11 @@ impl DenoDir { } else { return Err(err); } - }, + } }; + out.source_code = filter_shebang(out.source_code); + let result = self.load_cache(out.filename.as_str(), out.source_code.as_str()); match result { @@ -941,3 +943,28 @@ fn test_map_content_type() { msg::MediaType::Unknown ); } + +fn filter_shebang(code: String) -> String { + if !code.starts_with("#!") { + return code; + } + match code.find('\n') { + None => { + return String::from(""); + } + Some(i) => { + let (_, rest) = code.split_at(i); + return String::from(rest); + } + } +} + +#[test] +fn test_filter_shebang() { + assert_eq!(filter_shebang("".to_string()), ""); + assert_eq!(filter_shebang("#".to_string()), "#"); + assert_eq!(filter_shebang("#!".to_string()), ""); + assert_eq!(filter_shebang("#!\n\n".to_string()), "\n\n"); + let code = "#!/usr/bin/env deno\nconsole.log('hello');\n".to_string(); + assert_eq!(filter_shebang(code), "\nconsole.log('hello');\n"); +}