summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/standalone.rs35
-rw-r--r--cli/tests/integration_tests.rs32
-rw-r--r--cli/tests/standalone_compiler_ops.ts12
3 files changed, 79 insertions, 0 deletions
diff --git a/cli/standalone.rs b/cli/standalone.rs
index 60415c7e7..7216a5fd6 100644
--- a/cli/standalone.rs
+++ b/cli/standalone.rs
@@ -3,6 +3,9 @@
use crate::colors;
use crate::file_fetcher::get_source_from_bytes;
use crate::file_fetcher::strip_shebang;
+use crate::flags::Flags;
+use crate::ops;
+use crate::program_state::ProgramState;
use crate::version;
use data_url::DataUrl;
use deno_core::error::type_error;
@@ -181,11 +184,33 @@ impl ModuleLoader for EmbeddedModuleLoader {
}
}
+fn metadata_to_flags(metadata: &Metadata) -> Flags {
+ let permissions = metadata.permissions.clone();
+ Flags {
+ argv: metadata.argv.clone(),
+ unstable: metadata.unstable,
+ seed: metadata.seed,
+ location: metadata.location.clone(),
+ allow_env: permissions.allow_env,
+ allow_hrtime: permissions.allow_hrtime,
+ allow_net: permissions.allow_net,
+ allow_plugin: permissions.allow_plugin,
+ allow_read: permissions.allow_read,
+ allow_run: permissions.allow_run,
+ allow_write: permissions.allow_write,
+ v8_flags: metadata.v8_flags.clone(),
+ log_level: metadata.log_level,
+ ..Default::default()
+ }
+}
+
pub async fn run(
source_code: String,
metadata: Metadata,
) -> Result<(), AnyError> {
+ let flags = metadata_to_flags(&metadata);
let main_module = resolve_url(SPECIFIER)?;
+ let program_state = ProgramState::build(flags).await?;
let permissions = Permissions::from_options(&metadata.permissions);
let blob_url_store = BlobUrlStore::default();
let broadcast_channel = InMemoryBroadcastChannel::default();
@@ -226,6 +251,16 @@ pub async fn run(
};
let mut worker =
MainWorker::from_options(main_module.clone(), permissions, &options);
+ {
+ let js_runtime = &mut worker.js_runtime;
+ js_runtime
+ .op_state()
+ .borrow_mut()
+ .put::<Arc<ProgramState>>(program_state.clone());
+ ops::errors::init(js_runtime);
+ ops::runtime_compiler::init(js_runtime);
+ js_runtime.sync_ops_cache();
+ }
worker.bootstrap(&options);
worker.execute_module(&main_module).await?;
worker.execute("window.dispatchEvent(new Event('load'))")?;
diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs
index d58080210..bc67d5479 100644
--- a/cli/tests/integration_tests.rs
+++ b/cli/tests/integration_tests.rs
@@ -5877,6 +5877,38 @@ console.log("finish");
}
#[test]
+ fn standalone_compiler_ops() {
+ let dir = TempDir::new().expect("tempdir fail");
+ let exe = if cfg!(windows) {
+ dir.path().join("standalone_compiler_ops.exe")
+ } else {
+ dir.path().join("standalone_compiler_ops")
+ };
+ let output = util::deno_cmd()
+ .current_dir(util::root_path())
+ .arg("compile")
+ .arg("--unstable")
+ .arg("--output")
+ .arg(&exe)
+ .arg("./cli/tests/standalone_compiler_ops.ts")
+ .stdout(std::process::Stdio::piped())
+ .spawn()
+ .unwrap()
+ .wait_with_output()
+ .unwrap();
+ assert!(output.status.success());
+ let output = Command::new(exe)
+ .stdout(std::process::Stdio::piped())
+ .stderr(std::process::Stdio::piped())
+ .spawn()
+ .unwrap()
+ .wait_with_output()
+ .unwrap();
+ assert!(output.status.success());
+ assert_eq!(output.stdout, b"Hello, Compiler API!\n");
+ }
+
+ #[test]
fn compile_with_directory_exists_error() {
let dir = TempDir::new().expect("tempdir fail");
let exe = if cfg!(windows) {
diff --git a/cli/tests/standalone_compiler_ops.ts b/cli/tests/standalone_compiler_ops.ts
new file mode 100644
index 000000000..b95e1222e
--- /dev/null
+++ b/cli/tests/standalone_compiler_ops.ts
@@ -0,0 +1,12 @@
+const { files } = await Deno.emit("/mod.ts", {
+ bundle: "classic",
+ sources: {
+ "/mod.ts": `import { hello } from "/hello.ts"; console.log(hello);`,
+ "/hello.ts": `export const hello: string = "Hello, Compiler API!"`,
+ },
+ compilerOptions: {
+ sourceMap: false,
+ },
+});
+
+eval(files["deno:///bundle.js"]);