Skip to content

Commit

Permalink
Merge branch 'main' into gvkries/shellblueprint-16375
Browse files Browse the repository at this point in the history
  • Loading branch information
gvkries committed Jul 1, 2024
2 parents 2376f97 + b95eb7c commit ea62741
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,14 @@ public static async ValueTask<Completion> WriteToAsync(List<FilterArgument> argu

var setting = resourceManager.RegisterResource("script", name);

if (customAttributes != null)
{
foreach (var attribute in customAttributes)
{
setting.SetAttribute(attribute.Key, attribute.Value);
}
}

if (at != ResourceLocation.Unspecified)
{
setting.AtLocation(at);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.Json.Dynamic;
using System.Text.Json.Nodes;
using Jint;
using Jint.Native;
using Jint.Runtime.Interop;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.FileProviders;
Expand All @@ -23,7 +22,28 @@ public JavaScriptEngine(IMemoryCache memoryCache)

public IScriptingScope CreateScope(IEnumerable<GlobalMethod> methods, IServiceProvider serviceProvider, IFileProvider fileProvider, string basePath)
{
var engine = new Engine();
var engine = new Engine(options =>
{
options.SetWrapObjectHandler(static (e, target, type) =>
{
if (target is JsonDynamicObject dynamicObject)
{
return ObjectWrapper.Create(e, (JsonObject)dynamicObject, type);
}
if (target is JsonDynamicArray dynamicArray)
{
return ObjectWrapper.Create(e, (JsonArray)dynamicArray, type);
}
if (target is JsonDynamicValue dynamicValue)
{
return ObjectWrapper.Create(e, (JsonValue)dynamicValue, type);
}
return ObjectWrapper.Create(e, target, type);
});
});

foreach (var method in methods)
{
Expand All @@ -45,7 +65,7 @@ static void ThrowInvalidScopeTypeException()
ThrowInvalidScopeTypeException();
}

var parsedAst = _memoryCache.GetOrCreate(script, static entry => Engine.PrepareScript((string) entry.Key));
var parsedAst = _memoryCache.GetOrCreate(script, static entry => Engine.PrepareScript((string)entry.Key));

var result = jsScope.Engine.Evaluate(parsedAst).ToObject();

Expand Down
56 changes: 44 additions & 12 deletions test/OrchardCore.Tests/Data/JsonDynamicTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
using System.Text.Json.Nodes;
using OrchardCore.ContentFields.Fields;
using OrchardCore.ContentManagement;
using OrchardCore.Scripting;
using OrchardCore.Tests.Apis.Context;

namespace OrchardCore.Tests.Data;

Expand Down Expand Up @@ -721,7 +723,7 @@ public void JsonDynamicValueIsComparableToInt32()
dynamic myDynamic = new JsonDynamicValue(JsonValue.Create(value));

Assert.True(value >= myDynamic);
Assert.True(value + 10 > myDynamic);
Assert.True(value + 10 > myDynamic);

Assert.False(value - 10 >= myDynamic);
Assert.False(value > myDynamic);
Expand Down Expand Up @@ -793,24 +795,54 @@ public void JsonDynamicValueIsComparableToString()
[Fact]
public void SerializingJsonDynamicValueMustWriteValueOnly()
{
// Arrange
// Arrange
var contentItem = GetContentTestData();
dynamic contentExpando = new ExpandoObject();
contentExpando.content = contentItem.Content;

// Act
var contentStr = JConvert.SerializeObject((ExpandoObject)contentExpando);

// Assert
Assert.Equal("{\"content\":{\"TestPart\":{\"TextFieldProp\":{\"Text\":\"test\"},\"NumericFieldProp\":{\"Value\":123},\"BooleanFieldProp\":{\"Value\":true}}}}", contentStr);
}

[Fact]
public async Task SerializingJsonDynamicValueInScripting()
{
// Arrange
using var context = new SiteContext();
await context.InitializeAsync();
await context.UsingTenantScopeAsync(scope =>
{
var getTestContent = new GlobalMethod
{
Name = "getTestContent",
Method = sp => () => GetContentTestData()
};
var scriptingEngine = scope.ServiceProvider.GetRequiredService<IScriptingEngine>();
var scriptingScope = scriptingEngine.CreateScope([getTestContent], scope.ServiceProvider, null, null);
// Act
var contentStr = (string)scriptingEngine.Evaluate(scriptingScope, "return JSON.stringify(getTestContent().Content)");
// Assert
Assert.Equal("{\"TestPart\":{\"TextFieldProp\":{\"Text\":\"test\"},\"NumericFieldProp\":{\"Value\":123},\"BooleanFieldProp\":{\"Value\":true}}}", contentStr);
return Task.CompletedTask;
});
}

private static ContentItem GetContentTestData()
{
var contentItem = new ContentItem();
contentItem.Alter<TestPart>(part =>
{
part.TextFieldProp = new TextField { Text = "test" };
part.NumericFieldProp = new NumericField { Value = 123 };
part.BooleanFieldProp = new BooleanField { Value = true };
});

// Act
dynamic expandoValue = new ExpandoObject();
expandoValue.stringValue = contentItem.Content.TestPart.TextFieldProp.Text;
expandoValue.numberValue = contentItem.Content.TestPart.NumericFieldProp.Value;
expandoValue.booleanValue = contentItem.Content.TestPart.BooleanFieldProp.Value;
var jsonStr = JConvert.SerializeObject((ExpandoObject)expandoValue);

// Assert
Assert.Equal("{\"stringValue\":\"test\",\"numberValue\":123,\"booleanValue\":true}", jsonStr);
return contentItem;
}

public sealed class TestPart : ContentPart
Expand Down

0 comments on commit ea62741

Please sign in to comment.