diff --git a/Cargo.toml b/Cargo.toml index 175b4257..a1cc4a96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,31 +6,31 @@ members = [ ] [workspace.dependencies] -ahash = "0.8.6" -async-trait = "0.1.77" +ahash = "0.8.11" +async-trait = "0.1.80" bincode = "2.0.0-rc.3" -bumpalo = "3.14.0" -chrono = "0.4.31" +bumpalo = "3.16.0" +chrono = "0.4.38" criterion = "0.5.1" -fastrand = "2.0.1" +fastrand = "2.1.0" futures = "0.3.30" humantime = "2.1.0" once_cell = "1.19.0" -petgraph = "0.6.4" +petgraph = "0.6.5" phf = "0.11.2" -regex = "1.10.2" +regex = "1.10.4" regex-lite = "0.1.5" strum = "0.26.2" strum_macros = "0.26.2" -serde = "1.0.195" -serde_json = "1.0.111" +serde = "1.0.202" +serde_json = "1.0.117" itertools = "0.13.0" -rust_decimal = "1.33.1" -rust_decimal_macros = "1.33.1" +rust_decimal = "1.35.0" +rust_decimal_macros = "1.34.2" json_dotpath = "1.1.0" -anyhow = "1.0.79" -thiserror = "1.0.50" +anyhow = "1.0.86" +thiserror = "1.0.61" [profile.release] lto = true diff --git a/core/engine/Cargo.toml b/core/engine/Cargo.toml index d1de0a16..7df1303d 100644 --- a/core/engine/Cargo.toml +++ b/core/engine/Cargo.toml @@ -23,7 +23,7 @@ once_cell = { workspace = true } json_dotpath = { workspace = true } fixedbitset = "0.4.2" futures = { workspace = true } -rquickjs = { version = "0.4.3", features = ["macro", "loader", "rust-alloc"] } +rquickjs = { version = "0.6.2", features = ["macro", "loader", "rust-alloc"] } itertools = { workspace = true } zen-expression = { path = "../expression", version = "0.22.0" } zen-tmpl = { path = "../template", version = "0.22.0" } diff --git a/core/engine/src/handler/function/js_value.rs b/core/engine/src/handler/function/js_value.rs index 8d7f60c1..926fada2 100644 --- a/core/engine/src/handler/function/js_value.rs +++ b/core/engine/src/handler/function/js_value.rs @@ -82,6 +82,7 @@ impl<'js> FromJs<'js> for JsValue { Type::Constructor => json!("[Constructor]"), Type::Symbol => json!("[Symbol]"), Type::Unknown => json!("[Unknown]"), + Type::Promise => json!("[Promise]"), }; Ok(JsValue(computed_value)) diff --git a/core/engine/src/handler/function/script.rs b/core/engine/src/handler/function/script.rs index f6f76d25..e60aeb1b 100644 --- a/core/engine/src/handler/function/script.rs +++ b/core/engine/src/handler/function/script.rs @@ -1,7 +1,7 @@ use std::fmt::Debug; use anyhow::Context as _; -use rquickjs::{Context, Ctx, Error as QError, FromJs, Runtime}; +use rquickjs::{Context, Ctx, Error as QError, FromJs, Module, Runtime}; use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -34,15 +34,14 @@ impl Script { serde_json::to_string(args).context("Failed to serialize function arguments")?; let json_response = context.with(|ctx| -> anyhow::Result { - let _ = ctx - .clone() - .compile("main", "import 'internals'; globalThis.now = Date.now();") - .map_err(|e| map_js_error(&ctx, e))?; - - let _ = ctx - .globals() - .set("log", Vec::::new()) - .map_err(|e| map_js_error(&ctx, e))?; + Module::evaluate( + ctx.clone(), + "main", + "import 'internals'; globalThis.now = Date.now(); globalThis.log = [];", + ) + .map_err(|e| map_js_error(&ctx, e))? + .finish::<()>() + .map_err(|e| map_js_error(&ctx, e))?; ctx.eval::(format!("{source};main({args_str})")) .map_err(|e| map_js_error(&ctx, e)) diff --git a/core/expression/src/variable/mod.rs b/core/expression/src/variable/mod.rs index 6757f874..5e3e3414 100644 --- a/core/expression/src/variable/mod.rs +++ b/core/expression/src/variable/mod.rs @@ -1,7 +1,7 @@ pub use crate::variable::map::BumpMap; pub use bumpalo::collections::Vec as BumpVec; use bumpalo::Bump; -use chrono::NaiveDateTime; +use chrono::{DateTime, NaiveDateTime}; use rust_decimal::prelude::ToPrimitive; use rust_decimal::Decimal; use serde_json::{Number, Value}; @@ -163,13 +163,14 @@ impl TryFrom<&Variable<'_>> for NaiveDateTime { fn try_from(value: &Variable<'_>) -> Result { match value { Variable::String(a) => date_time(a), - Variable::Number(a) => NaiveDateTime::from_timestamp_opt( + Variable::Number(a) => DateTime::from_timestamp( a.to_i64().ok_or_else(|| VMError::OpcodeErr { opcode: "DateManipulation".into(), message: "Failed to extract date".into(), })?, 0, ) + .map(|t| t.naive_utc()) .ok_or_else(|| VMError::ParseDateTimeErr { timestamp: a.to_string(), }), diff --git a/core/expression/src/vm/vm.rs b/core/expression/src/vm/vm.rs index 3935156e..4650e82e 100644 --- a/core/expression/src/vm/vm.rs +++ b/core/expression/src/vm/vm.rs @@ -1113,7 +1113,7 @@ impl<'arena, 'parent_ref, 'bytecode_ref> VMInner<'arena, 'parent_ref, 'bytecode_ message: "Failed to run DateFunction".into(), })?; - self.push(Number(s.timestamp().into())); + self.push(Number(s.and_utc().timestamp().into())); } Opcode::Slice => { let from_var = self.pop()?; @@ -1233,7 +1233,7 @@ impl<'arena, 'parent_ref, 'bytecode_ref> VMInner<'arena, 'parent_ref, 'bytecode_ Opcode::ParseDateTime => { let a = self.pop()?; let ts = match a { - String(a) => date_time(a)?.timestamp(), + String(a) => date_time(a)?.and_utc().timestamp(), Number(a) => a.to_i64().ok_or_else(|| OpcodeErr { opcode: "ParseDateTime".into(), message: "Number overflow".into(),