From 3d3fa864c908f9a58201dcfe53f8596407280051 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Mon, 23 Jan 2023 16:07:57 +0100 Subject: [PATCH] Update jint (#967) * Update jint and move some files. * Another update to the vars. --- .../ContentWrapper/ContentDataProperty.cs | 2 +- .../Scripting/ContentWrapper/JsonMapper.cs | 18 +++-- .../{ => Internal}/JintExtensions.cs | 2 +- .../JintObjectConverter.cs} | 8 +-- .../Scripting/{ => Internal}/JintUser.cs | 2 +- .../Scripting/Internal/Parser.cs | 8 +-- .../Scripting/JintScriptEngine.cs | 2 +- .../Scripting/ScriptContext.cs | 67 +++++++++++++++++-- .../Scripting/ScriptExecutionContext.cs | 19 ++---- .../Scripting/ScriptVars.cs | 13 +++- .../Scripting/WritableContext.cs | 12 +--- ...Squidex.Domain.Apps.Core.Operations.csproj | 2 +- .../Apps/DomainObject/Guards/GuardApp.cs | 2 +- .../Assets/AssetsJintExtension.cs | 7 +- .../Assets/Queries/Steps/ScriptAsset.cs | 8 +-- .../Contents/Queries/Steps/ScriptContent.cs | 8 +-- .../Contents/ReferencesJintExtension.cs | 1 + .../Contents/Models/AllContentsByPostDto.cs | 4 +- .../Scripting/JintScriptEngineTests.cs | 54 +++++++++++---- .../Operations/Scripting/JintUserTests.cs | 2 +- .../Contents/Queries/ScriptContentTests.cs | 2 +- 21 files changed, 156 insertions(+), 87 deletions(-) rename backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/{ => Internal}/JintExtensions.cs (94%) rename backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/{DefaultConverter.cs => Internal/JintObjectConverter.cs} (88%) rename backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/{ => Internal}/JintUser.cs (97%) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataProperty.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataProperty.cs index ae6a140c3..97ebc597c 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataProperty.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/ContentDataProperty.cs @@ -18,7 +18,7 @@ public sealed class ContentDataProperty : CustomProperty private ContentFieldObject? contentField; private JsValue value; - protected override JsValue CustomValue + protected override JsValue? CustomValue { get { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/JsonMapper.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/JsonMapper.cs index 741518a77..51259bcfb 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/JsonMapper.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ContentWrapper/JsonMapper.cs @@ -16,14 +16,24 @@ namespace Squidex.Domain.Apps.Core.Scripting.ContentWrapper; public static class JsonMapper { + private class JsonObjectInstance : ObjectInstance + { + public JsonObjectInstance(Engine engine) + : base(engine) + { + } + } + public static JsValue Map(JsonValue value, Engine engine) { switch (value.Value) { case null: return JsValue.Null; - case bool b: - return new JsBoolean(b); + case true: + return JsBoolean.True; + case false: + return JsBoolean.False; case double n: return new JsNumber(n); case string s: @@ -52,11 +62,11 @@ public static class JsonMapper private static JsValue FromObject(JsonObject obj, Engine engine) { - var target = new ObjectInstance(engine); + var target = new JsonObjectInstance(engine); foreach (var (key, value) in obj) { - target.FastAddProperty(key, Map(value, engine), true, true, true); + target.Set(key, Map(value, engine)); } return target; diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintExtensions.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintExtensions.cs similarity index 94% rename from backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintExtensions.cs rename to backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintExtensions.cs index f0838d2d6..d96f8711b 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintExtensions.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintExtensions.cs @@ -9,7 +9,7 @@ using Jint; using Jint.Native; using Squidex.Infrastructure; -namespace Squidex.Domain.Apps.Core.Scripting; +namespace Squidex.Domain.Apps.Core.Scripting.Internal; public static class JintExtensions { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintObjectConverter.cs similarity index 88% rename from backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs rename to backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintObjectConverter.cs index d3484a905..def46bd86 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintObjectConverter.cs @@ -16,13 +16,13 @@ using Squidex.Domain.Apps.Core.Scripting.ContentWrapper; using Squidex.Infrastructure; using Squidex.Shared.Users; -namespace Squidex.Domain.Apps.Core.Scripting; +namespace Squidex.Domain.Apps.Core.Scripting.Internal; -public sealed class DefaultConverter : IObjectConverter +public sealed class JintObjectConverter : IObjectConverter { - public static readonly DefaultConverter Instance = new DefaultConverter(); + public static readonly JintObjectConverter Instance = new JintObjectConverter(); - private DefaultConverter() + private JintObjectConverter() { } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintUser.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintUser.cs similarity index 97% rename from backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintUser.cs rename to backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintUser.cs index d9e53ee4b..d9675597e 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintUser.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/JintUser.cs @@ -13,7 +13,7 @@ using Squidex.Infrastructure.Security; using Squidex.Shared.Identity; using Squidex.Shared.Users; -namespace Squidex.Domain.Apps.Core.Scripting; +namespace Squidex.Domain.Apps.Core.Scripting.Internal; public static class JintUser { diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/Parser.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/Parser.cs index 3852780ad..36acae9b2 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/Parser.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Internal/Parser.cs @@ -14,10 +14,6 @@ namespace Squidex.Domain.Apps.Core.Scripting.Internal; internal sealed class Parser { private static readonly TimeSpan CacheDuration = TimeSpan.FromMinutes(10); - private static readonly ParserOptions DefaultParserOptions = new ParserOptions - { - AdaptRegexp = true, Tolerant = true - }; private readonly IMemoryCache cache; @@ -34,9 +30,7 @@ internal sealed class Parser { entry.AbsoluteExpirationRelativeToNow = CacheDuration; - var parser = new JavaScriptParser(script, DefaultParserOptions); - - return parser.ParseScript(); + return new JavaScriptParser().ParseScript(script); })!; } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs index 77ae989e4..991078054 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs @@ -133,7 +133,7 @@ public sealed class JintScriptEngine : IScriptEngine, IScriptDescriptor var engine = new Engine(engineOptions => { - engineOptions.AddObjectConverter(DefaultConverter.Instance); + engineOptions.AddObjectConverter(JintObjectConverter.Instance); engineOptions.SetReferencesResolver(NullPropagation.Instance); engineOptions.Strict(); diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptContext.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptContext.cs index 796c5c21e..b689e17f9 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptContext.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptContext.cs @@ -5,16 +5,65 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System.Collections; using System.Diagnostics.CodeAnalysis; using Squidex.Infrastructure; +using Squidex.Text; namespace Squidex.Domain.Apps.Core.Scripting; -public class ScriptContext : Dictionary +public class ScriptContext : IEnumerable> { - public ScriptContext() - : base(StringComparer.OrdinalIgnoreCase) + private readonly Dictionary values = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public void CopyFrom(ScriptVars vars) + { + Guard.NotNull(vars); + + foreach (var (key, item) in vars) + { + if (!values.ContainsKey(key)) + { + SetItem(key, item); + } + } + } + + public void SetItem(string? key, (object? Value, bool IsReadonly) item) + { + Set(key, item.Value, item.IsReadonly); + } + + public void Set(string? key, object? value, bool isReadonly = false) { + if (string.IsNullOrWhiteSpace(key)) + { + return; + } + + var finalKey = key.ToCamelCase(); + + if (values.TryGetValue(finalKey, out var existing) && existing.IsReadonly) + { + return; + } + + values[finalKey] = (value, isReadonly); + } + + public bool TryGetValue(string key, [MaybeNullWhen(false)] out object? value) + { + Guard.NotNull(key); + + value = default!; + + if (values.TryGetValue(key, out var item)) + { + value = item.Value; + return true; + } + + return false; } public bool TryGetValue(string key, [MaybeNullWhen(false)] out T value) @@ -23,7 +72,7 @@ public class ScriptContext : Dictionary value = default!; - if (TryGetValue(key, out var temp) && temp is T typed) + if (values.TryGetValue(key, out var item) && item.Value is T typed) { value = typed; return true; @@ -31,4 +80,14 @@ public class ScriptContext : Dictionary return false; } + + public IEnumerator> GetEnumerator() + { + return values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return values.GetEnumerator(); + } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs index 53b685ade..74ea573c7 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs @@ -7,7 +7,6 @@ using Jint; using Squidex.Infrastructure.Tasks; -using Squidex.Text; namespace Squidex.Domain.Apps.Core.Scripting; @@ -117,30 +116,20 @@ public sealed class ScriptExecutionContext : ScriptExecutionContext, ISchedul { var engine = Engine; + CopyFrom(vars); + if (options.AsContext) { var contextInstance = new WritableContext(engine, vars); - foreach (var (key, value) in vars.Where(x => x.Value != null)) - { - this[key.ToCamelCase()] = value; - } - engine.SetValue("ctx", contextInstance); engine.SetValue("context", contextInstance); } else { - foreach (var (key, value) in vars) + foreach (var (key, item) in vars) { - var property = key.ToCamelCase(); - - if (value != null) - { - engine.SetValue(property, value); - - this[property] = value; - } + engine.SetValue(key, item.Value!); } } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs index 1aeac926e..03bd8913d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptVars.cs @@ -11,12 +11,19 @@ namespace Squidex.Domain.Apps.Core.Scripting; public class ScriptVars : ScriptContext { - public void SetValue(object? value, [CallerMemberName] string? key = null) + public object? this[string key] { - if (key != null) + get { - this[key] = value; + TryGetValue(key, out var result); + return result; } + set => Set(key, value, true); + } + + public void SetValue(object? value, [CallerMemberName] string? key = null) + { + Set(key, value, true); } public T GetValue([CallerMemberName] string? key = null) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/WritableContext.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/WritableContext.cs index d177f19e4..2c3542406 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/WritableContext.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/WritableContext.cs @@ -8,7 +8,6 @@ using Jint; using Jint.Native; using Jint.Native.Object; -using Squidex.Text; namespace Squidex.Domain.Apps.Core.Scripting; @@ -21,14 +20,9 @@ internal sealed class WritableContext : ObjectInstance { this.vars = vars; - foreach (var (key, value) in vars) + foreach (var (key, item) in vars) { - var property = key.ToCamelCase(); - - if (value != null) - { - FastAddProperty(property, FromObject(engine, value), true, true, true); - } + base.Set(key, FromObject(engine, item.Value), this); } } @@ -36,7 +30,7 @@ internal sealed class WritableContext : ObjectInstance { var propertyName = property.AsString(); - vars[propertyName] = value.ToObject(); + vars.Set(propertyName, value.ToObject()); return base.Set(property, value, receiver); } diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj index 7dc4977d3..1d4732df3 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj @@ -20,7 +20,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/DomainObject/Guards/GuardApp.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/DomainObject/Guards/GuardApp.cs index fa5475f32..d40b5bb27 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/DomainObject/Guards/GuardApp.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/DomainObject/Guards/GuardApp.cs @@ -5,6 +5,7 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System.Security.Claims; using Squidex.Domain.Apps.Entities.Apps.Commands; using Squidex.Domain.Apps.Entities.Billing; using Squidex.Domain.Apps.Entities.Teams; @@ -14,7 +15,6 @@ using Squidex.Infrastructure.Validation; using Squidex.Shared; using Squidex.Shared.Identity; using Squidex.Text; -using System.Security.Claims; namespace Squidex.Domain.Apps.Entities.Apps.DomainObject.Guards; diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetsJintExtension.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetsJintExtension.cs index 39a7642d2..712698171 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetsJintExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/AssetsJintExtension.cs @@ -15,6 +15,7 @@ using Squidex.Assets; using Squidex.Domain.Apps.Core.Assets; using Squidex.Domain.Apps.Core.Rules.EnrichedEvents; using Squidex.Domain.Apps.Core.Scripting; +using Squidex.Domain.Apps.Core.Scripting.Internal; using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Properties; using Squidex.Infrastructure; @@ -180,14 +181,14 @@ public sealed class AssetsJintExtension : IJintExtension, IScriptDescriptor if (componentY?.IsNumber() == true) { - options.ComponentX = (int)componentX.AsNumber(); + options.ComponentX = (int)componentY.AsNumber(); } - var assetThumbnailGenerator = serviceProvider.GetRequiredService(); + var assetGenerator = serviceProvider.GetRequiredService(); var assetFileStore = serviceProvider.GetRequiredService(); try { - var hash = await asset.GetBlurHashAsync(options, assetFileStore, assetThumbnailGenerator, ct); + var hash = await asset.GetBlurHashAsync(options, assetFileStore, assetGenerator, ct); scheduler.Run(callback, JsValue.FromObject(context.Engine, hash)); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/Steps/ScriptAsset.cs b/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/Steps/ScriptAsset.cs index 41123e1f2..68c83bc94 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/Steps/ScriptAsset.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Assets/Queries/Steps/ScriptAsset.cs @@ -82,13 +82,7 @@ public sealed class ScriptAsset : IAssetEnricherStep } }; - foreach (var (key, value) in sharedVars) - { - if (!vars.ContainsKey(key)) - { - vars[key] = value; - } - } + vars.CopyFrom(sharedVars); var options = new ScriptOptions { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs index 5d7bb16fe..0426537c2 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Queries/Steps/ScriptContent.cs @@ -79,13 +79,7 @@ public sealed class ScriptContent : IContentEnricherStep StatusOld = default }; - foreach (var (key, value) in sharedVars) - { - if (!vars.ContainsKey(key)) - { - vars[key] = value; - } - } + vars.CopyFrom(sharedVars); var options = new ScriptOptions { diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs index f93963a34..c04716ec3 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/ReferencesJintExtension.cs @@ -10,6 +10,7 @@ using Jint.Native; using Jint.Runtime; using Microsoft.Extensions.DependencyInjection; using Squidex.Domain.Apps.Core.Scripting; +using Squidex.Domain.Apps.Core.Scripting.Internal; using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Properties; using Squidex.Infrastructure; diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs index 2b8d33040..e81a56299 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/Models/AllContentsByPostDto.cs @@ -5,14 +5,14 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System.Text.Json; +using System.Text.Json.Serialization; using NodaTime; using Squidex.Domain.Apps.Entities; using Squidex.Infrastructure; using Squidex.Infrastructure.Queries; using Squidex.Infrastructure.Translations; using Squidex.Infrastructure.Validation; -using System.Text.Json; -using System.Text.Json.Serialization; namespace Squidex.Areas.Api.Controllers.Contents.Models; diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs index fbad4e865..5320ad325 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineTests.cs @@ -488,6 +488,40 @@ public class JintScriptEngineTests : IClassFixture Assert.Equal(id.ToString(), actual.ToString()); } + [Fact] + public void Should_allow_null_vars() + { + var vars = new ScriptVars + { + ["value"] = null + }; + + const string script = @" + return value; + "; + + var actual = sut.Execute(vars, script); + + Assert.Equal(JsonValue.Null, actual); + } + + [Fact] + public void Should_not_allow_to_overwrite_initial_var() + { + var vars = new ScriptVars + { + ["value"] = 13 + }; + + const string script = @" + ctx.value = ctx.value * 2; + "; + + sut.Execute(vars, script, new ScriptOptions { AsContext = true }); + + Assert.Equal(13, vars["value"]); + } + [Fact] public void Should_share_vars_between_executions() { @@ -497,11 +531,11 @@ public class JintScriptEngineTests : IClassFixture }; const string script1 = @" - ctx.value = ctx.value * 2; + ctx.shared = ctx.value * 2; "; const string script2 = @" - return ctx.value + 2; + return ctx.shared + 2; "; sut.Execute(vars, script1, new ScriptOptions { AsContext = true }); @@ -543,30 +577,22 @@ public class JintScriptEngineTests : IClassFixture }; const string script1 = @" - ctx.obj = { number: ctx.value * 2 }; + ctx.shared = { number: ctx.value * 2 }; "; const string script2 = @" - ctx.data.test = { iv: ctx.obj.number + 2 }; + ctx.data.test = { iv: ctx.shared.number + 2 }; replace(); "; -#pragma warning disable MA0042 // Do not use blocking calls in an async method - sut.Execute(vars, script1, new ScriptOptions { AsContext = true }); -#pragma warning restore MA0042 // Do not use blocking calls in an async method + await sut.ExecuteAsync(vars, script1, new ScriptOptions { AsContext = true }); var vars2 = new DataScriptVars { ["data"] = new ContentData() }; - foreach (var (key, value) in vars) - { - if (!vars2.ContainsKey(key)) - { - vars2[key] = value; - } - } + vars2.CopyFrom(vars); var actual = await sut.TransformAsync(vars2, script2, new ScriptOptions { AsContext = true }); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintUserTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintUserTests.cs index 43bf3db1b..1db2035f4 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintUserTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintUserTests.cs @@ -7,7 +7,7 @@ using System.Security.Claims; using Jint; -using Squidex.Domain.Apps.Core.Scripting; +using Squidex.Domain.Apps.Core.Scripting.Internal; using Squidex.Infrastructure.Security; using Squidex.Shared.Identity; diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs index 0f74a2c5f..6620d73a5 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Queries/ScriptContentTests.cs @@ -76,7 +76,7 @@ public class ScriptContentTests : GivenContext A.That.Matches(x => Equals(x["contentId"], content.Id) && Equals(x["data"], oldData) && - Equals(x["AppId"], AppId.Id) && + Equals(x["appId"], AppId.Id) && Equals(x["appName"], AppId.Name) && Equals(x["user"], ApiContext.UserPrincipal)), "my-query",