This conversation has been locked due to inactivity. Please create a new post.
This conversation has been locked due to inactivity. Please create a new post.
I have a private extension and I am trying to use the extension bridge for code editor.
When the code is saved I want that the code saved is saved as a function in the settings.
function editConfig() {
window.extensionBridge.openCodeEditor({
language: 'javascript'
}).then(function(code) {
//source property needs to be a function
window.customCode = {
source: function(window) {
code
}
}
});
}
However when I look at the window.customCode.source I can see that the body of the function does not contain the value of code from editor but just
ƒ (window) {
code
}
I am using vanilla javascript in my project. Should I be using new Function('window', code) ?
I would like to obtain same functionality as in the code editor for the data element action from the core extension.
Solved! Go to Solution.
After testing I can confirm that you can use the following in your extension.json file
"transforms": [
{
"type": "function",
"propertyPath": "source",
"parameters": ["event"]
}
]You need to place it at the same level as schema
"configuration": {
"viewPath": "configuration/configuration.html",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": { }
},
"transforms": [
{
"type": "function",
"propertyPath": "source",
"parameters": ["event"]
}
]
},In my extension the on edit button I call this function:
function editConfig() {
window.extensionBridge.openCodeEditor({
code: window.customCode.source,
language: 'javascript'
}).then(function (code) {
window.customCode.source = code;
});
}This is configuration in extension bridge
window.extensionBridge.register({
init: function (info) {
if (info.settings) {
if (info.settings.source) {
window.customCode.source = info.settings.source;
}
}
},
getSettings: function () {
return {
source: window.customCode.source
}
},
validate: function () {
return true;
}
});When I enter this code and I save in my configuration view:
var x = 123; return x;
When the build is successfully completed I can see the following in the library:
"settings": {
"source": function(event) {
var x = 123;
return x;
}
}This is documented here: https://experienceleague.adobe.com/docs/experience-platform/tags/extension-dev/manifest.html?lang=en
The function transform allows code written by Platform users to be executed by a library module within the emitted tag runtime library.
Let’s assume we would like to provide a “custom script” action type. The “custom script” action view might provide a textarea wherein the user can enter some code. Let’s assume a user entered the following code into the textarea:
console.log('Welcome, ' + username +'. This is ZomboCom.');
When the user saves the rule, the settings object saved by the view may look like this:
{
foo: {
bar: "console.log('Welcome, ' + username +'. This is ZomboCom.');"
}
}When a rule using our action fires within the tag runtime library, we would like to execute the user’s code and pass it a username.
At the point that the settings object is saved from the action type’s view, the user’s code is simply a string. This is good because it can be properly serialized to and from JSON; however, it’s also bad because it would typically be emitted in the tag runtime library as a string as well instead of an executable function. Although you could attempt to execute the code within your action type’s library module using eval or a Function constructor, it is highly discouraged due to content security policies potentially blocking execution.
As a workaround for this situation, using the function transform tells Platform to wrap the user’s code in a executable function when it is emitted in the tag runtime library. To solve our example problem, we would define the transform on the type definition in extension.json as follows:
{
"transforms": [
{
"type": "function",
"propertyPath": "foo.bar",
"parameters": ["username"]
}
]
}When the settings object is emitted in the tag runtime library, it will be transformed to the following:
{
foo: {
bar: function(username) {
console.log('Welcome, ' + username +'. This is ZomboCom.');
}
}
}Your library module can then call the function containing the user’s code and pass in the username argument.
I looked at the source code of the core extension https://github.com/adobe/reactor-extension-core and based on what I could see so far the data element for custom code, the only thing that would transform the code to a function like so in the compiled launch library:
"test": {
"modulePath": "core/src/lib/dataElements/customCode.js",
"settings": {
"source": function(event) {
console.log('test', _satellite.getVar('payload', event));
return "123"
}
}
},If this configuration in the extension.json
"transforms": [
{
"type": "function",
"propertyPath": "source",
"parameters": ["event"]
}
]I am in the process of testing this in my extension.
Views
Replies
Total Likes
After testing I can confirm that you can use the following in your extension.json file
"transforms": [
{
"type": "function",
"propertyPath": "source",
"parameters": ["event"]
}
]You need to place it at the same level as schema
"configuration": {
"viewPath": "configuration/configuration.html",
"schema": {
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": { }
},
"transforms": [
{
"type": "function",
"propertyPath": "source",
"parameters": ["event"]
}
]
},In my extension the on edit button I call this function:
function editConfig() {
window.extensionBridge.openCodeEditor({
code: window.customCode.source,
language: 'javascript'
}).then(function (code) {
window.customCode.source = code;
});
}This is configuration in extension bridge
window.extensionBridge.register({
init: function (info) {
if (info.settings) {
if (info.settings.source) {
window.customCode.source = info.settings.source;
}
}
},
getSettings: function () {
return {
source: window.customCode.source
}
},
validate: function () {
return true;
}
});When I enter this code and I save in my configuration view:
var x = 123; return x;
When the build is successfully completed I can see the following in the library:
"settings": {
"source": function(event) {
var x = 123;
return x;
}
}This is documented here: https://experienceleague.adobe.com/docs/experience-platform/tags/extension-dev/manifest.html?lang=en
The function transform allows code written by Platform users to be executed by a library module within the emitted tag runtime library.
Let’s assume we would like to provide a “custom script” action type. The “custom script” action view might provide a textarea wherein the user can enter some code. Let’s assume a user entered the following code into the textarea:
console.log('Welcome, ' + username +'. This is ZomboCom.');
When the user saves the rule, the settings object saved by the view may look like this:
{
foo: {
bar: "console.log('Welcome, ' + username +'. This is ZomboCom.');"
}
}When a rule using our action fires within the tag runtime library, we would like to execute the user’s code and pass it a username.
At the point that the settings object is saved from the action type’s view, the user’s code is simply a string. This is good because it can be properly serialized to and from JSON; however, it’s also bad because it would typically be emitted in the tag runtime library as a string as well instead of an executable function. Although you could attempt to execute the code within your action type’s library module using eval or a Function constructor, it is highly discouraged due to content security policies potentially blocking execution.
As a workaround for this situation, using the function transform tells Platform to wrap the user’s code in a executable function when it is emitted in the tag runtime library. To solve our example problem, we would define the transform on the type definition in extension.json as follows:
{
"transforms": [
{
"type": "function",
"propertyPath": "foo.bar",
"parameters": ["username"]
}
]
}When the settings object is emitted in the tag runtime library, it will be transformed to the following:
{
foo: {
bar: function(username) {
console.log('Welcome, ' + username +'. This is ZomboCom.');
}
}
}Your library module can then call the function containing the user’s code and pass in the username argument.
Thanks @Alexis_Cazes_ for posting the solution as well. Keep up the good work.
Views
Replies
Total Likes