Manifesto de extensão
No diretório base da sua extensão, você deve criar um arquivo chamado extension.json
. Ele contém detalhes críticos da sua extensão que permitem que o Adobe Experience Platform o consuma corretamente. Alguns conteúdos são formados à maneira de npms package.json
.
Um exemplo extension.json
pode ser encontrado na extensão Hello World do repositório GitHub.
Um manifesto de extensão deve consistir no seguinte:
name
platform
web
.version
displayName
description
iconPath
(Opcional).svg
. O SVG deve ser quadrado e pode ser dimensionado pelo Platform.author
O "autor" é um objeto que deve ser estruturado da seguinte forma:
name
: O nome do autor da extensão. Como alternativa, o nome da empresa pode ser usado aqui.url
(Opcional): Um URL em que você pode saber mais sobre o autor da extensão.email
(Opcional): O endereço de email do autor da extensão.
Ele é consistente com as regras npm do campo do autor.
exchangeUrl
(Obrigatório para extensões públicas)https://www.adobeexchange.com/experiencecloud.details.######.html
.viewBasePath
src/view/
, o valor de viewBasePath
será src/view/
.hostedLibFiles
(Opcional)Esta opção contém uma matriz com caminhos relativos de arquivos de biblioteca de terceiros que precisam ser hospedados.
main
(Opcional)Este módulo sempre será incluído na biblioteca de tempo de execução e executado. Como o módulo é sempre incluído na biblioteca de tempo de execução, recomendamos usar apenas um módulo "principal" quando absolutamente necessário e manter o tamanho mínimo do código.
Não é garantido que este módulo seja executado primeiro; outros módulos podem ser executados antes dele.
configuration
(Opcional)events
(Opcional)conditions
(Opcional)actions
(Opcional)dataElements
(Opcional)sharedModules
(Opcional)Uma matriz de objetos de definição de módulo compartilhado. Cada objeto de módulo compartilhado na matriz deve ser estruturado da seguinte maneira:
name
: o nome do módulo compartilhado. Observe que esse nome será usado ao referenciar módulos compartilhados de outras extensões, conforme descrito em Módulos compartilhados. Esse nome nunca é exibido em nenhuma interface do usuário. Ele deve ser diferente dos nomes de outros módulos compartilhados na sua extensão e deve estar em conformidade com as regras de nomenclatura. É usado pelas tags como um identificador e não deve ser alterado após a publicação de sua extensão.libPath
: o caminho relativo para o módulo compartilhado. Ele não deve começar com uma barra. Ele deve fazer referência a um arquivo JavaScript com uma extensão.js
.
Apêndice
Regras de nomenclatura naming-rules
O valor de qualquer campo name
em extension.json
deve estar em conformidade com as seguintes regras:
- Deve ter 214 caracteres ou menos
- Não deve começar com um ponto ou um sublinhado
- Não deve conter letras maiúsculas
- Deve conter somente caracteres seguros para URL
Eles são compatíveis com as regras de nome de pacote npm.
Propriedades de objetos de configuração config-object
O objeto de configuração deve ser estruturado da seguinte maneira:
viewPath
viewBasePath
e não deve começar com uma barra. Ele deve fazer referência a um arquivo HTML com uma extensão .html
. Os sufixos de string de consulta e identificador de fragmento (hashes) são aceitáveis.schema
Um objeto de Esquema JSON que descreve o formato de um objeto válido sendo salvo da visualização de configuração de extensão. Como você é o desenvolvedor da visualização de configuração, é sua responsabilidade garantir que qualquer objeto de configuração salvo corresponda a esse esquema. Esse esquema também será usado para validação quando os usuários tentarem salvar dados usando os serviços do Platform
Este é um exemplo de objeto de esquema:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"delay": {
"type": "number",
"minimum": 1
}
},
"required": [
"delay"
],
"additionalProperties": false
}
Recomendamos usar uma ferramenta como o validador de Esquema JSON para testar manualmente seu esquema.
transforms
(Opcional)Definições de tipo type-definitions
Uma definição de tipo é um objeto usado para descrever um evento, uma condição, uma ação ou um tipo de elemento de dados. O objeto consiste no seguinte:
name
displayName
categoryName
(Opcional)displayName
será listado em categoryName
na interface. Todos os tipos com o mesmo categoryName
serão listados na mesma categoria. Por exemplo, se sua extensão fornecesse um tipo de evento keyUp
e um tipo de evento keyDown
e ambos tivessem um categoryName
de Keyboard
, ambos os tipos de evento seriam listados na categoria Teclado enquanto o usuário selecionava na lista de tipos de evento disponíveis ao criar uma regra. O valor de categoryName
deve ser legível.libPath
.js
.viewPath
(Opcional)viewBasePath
e não deve começar com uma barra. Ele deve fazer referência a um arquivo HTML com uma extensão .html
. Strings de consulta e identificadores de fragmento (hashes) são aceitáveis. Se o módulo de biblioteca do seu tipo não usar nenhuma configuração de um usuário, você poderá excluir essa propriedade, e o Platform exibirá um espaço reservado informando que nenhuma configuração é necessária.schema
Um objeto de Esquema JSON descrevendo o formato de um objeto de configurações válido que pode ser salvo pelo usuário. Normalmente, as configurações são definidas e salvas por um usuário por meio da interface da Coleção de dados. Nesses casos, a visualização da extensão pode tomar as etapas necessárias para validar as configurações fornecidas pelo usuário. Por outro lado, alguns usuários optam por usar APIs de tags diretamente, sem a ajuda de qualquer interface do usuário. A finalidade desse esquema é permitir que o Platform valide adequadamente se os objetos de configurações salvos pelos usuários, independentemente de uma interface do usuário ser usada, estão em um formato compatível com o módulo da biblioteca que atuará sobre o objeto de configurações no tempo de execução.
Este é um exemplo de objeto de esquema:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"delay": {
"type": "number",
"minimum": 1
}
},
"required": [
"delay"
],
"additionalProperties": false
}
Recomendamos usar uma ferramenta como o validador de Esquema JSON para testar manualmente seu esquema.
transforms
(Opcional)Transformações transforms
Para certos casos de uso, as extensões exigem que os objetos de configurações salvos de uma exibição sejam transformados pela Platform antes de serem emitidos para a biblioteca de tempo de execução da tag. Você pode solicitar que uma ou mais dessas transformações ocorram definindo a propriedade transforms
ao definir uma definição de tipo dentro de extension.json
. A propriedade transforms
é uma matriz de objetos na qual cada objeto representa uma transformação que deve ocorrer.
Todas as transformações exigem um type
e um propertyPath
. O type
deve ser um dos seguintes function
, remove
e file
e descreve qual transformação do Platform deve ser aplicada ao objeto de configurações. O propertyPath
é uma string delimitada por ponto que indica às tags onde localizar a propriedade que precisa ser modificada no objeto de configurações. Este é um exemplo de objeto de configurações e alguns propertyPath
s:
{
foo: {
bar: "A string",
baz: [
"A",
"B",
"C"
]
}
}
- Se você definir um
propertyPath
defoo.bar
, transformará o valor"A string"
. - Se você definir um
propertyPath
defoo.baz[]
, transformará cada valor na matrizbaz
. - Se você definir um
propertyPath
defoo.baz
, transformará a matrizbaz
.
Os caminhos de propriedade podem usar qualquer combinação de matriz e notação de objeto para aplicar transformações em qualquer nível do objeto de configurações.
propertyPath
(por exemplo, foo.baz[]
) ainda não é suportado na ferramenta sandbox* de extensão.As seções abaixo descrevem as transformações disponíveis e como usá-las.
Transformação de função
A transformação de função permite que o código escrito pelos usuários da Platform seja executado por um módulo da biblioteca de tempo de execução da tag emitida.
Suponhamos que gostaríamos de fornecer um tipo de ação de "script personalizado". A visualização de ação "script personalizado" pode fornecer uma área de texto na qual o usuário pode digitar algum código. Suponhamos que um usuário tenha inserido o seguinte código na área de texto:
console.log('Welcome, ' + username +'. This is ZomboCom.');
Quando o usuário salva a regra, o objeto de configurações salvo pela visualização pode ter a seguinte aparência:
{
foo: {
bar: "console.log('Welcome, ' + username +'. This is ZomboCom.');"
}
}
Quando uma regra que usa nossa ação é acionada na biblioteca de tempo de execução da tag, queremos executar o código do usuário e passar um nome de usuário para ele.
No ponto em que o objeto de configurações é salvo da visualização do tipo de ação, o código do usuário é simplesmente uma string. Isso é bom porque pode ser serializado corretamente de e para JSON. No entanto, também é ruim porque, normalmente, seria emitido na biblioteca de tempo de execução de tags como uma string, em vez de uma função executável. Embora você possa tentar executar o código no módulo de biblioteca do tipo de ação usando eval
ou um construtor de função, isso é altamente desencorajado devido a políticas de segurança de conteúdo que potencialmente bloqueiam a execução.
Como solução alternativa para essa situação, o uso da transformação de função instrui a Platform a envolver o código do usuário em uma função executável quando ele é emitido na biblioteca de tempo de execução de tags. Para resolver nosso problema de exemplo, definimos a transformação na definição de tipo em extension.json
da seguinte forma:
{
"transforms": [
{
"type": "function",
"propertyPath": "foo.bar",
"parameters": ["username"]
}
]
}
type
define o tipo de transformação que deve ser aplicado ao objeto de configurações.propertyPath
é uma string delimitada por período que informa ao Platform onde localizar a propriedade que precisa ser modificada dentro do objeto de configurações.parameters
é uma matriz de nomes de parâmetros que devem ser incluídos na assinatura da função de encapsulamento.
Quando o objeto de configurações for emitido na biblioteca de tempo de execução de tags, ele será transformado no seguinte:
{
foo: {
bar: function(username) {
console.log('Welcome, ' + username +'. This is ZomboCom.');
}
}
}
Seu módulo de biblioteca pode então chamar a função que contém o código do usuário e passar o argumento username
.
Transformação de arquivo
A transformação de arquivo permite que o código escrito pelos usuários da Platform seja emitido em um arquivo separado da biblioteca de tempo de execução de tags. O arquivo será hospedado com a biblioteca de tempo de execução de tags e poderá ser carregado conforme necessário por sua extensão no tempo de execução.
Suponhamos que gostaríamos de fornecer um tipo de ação de "script personalizado". A visualização do tipo de ação pode fornecer uma área de texto na qual o usuário pode digitar algum código. Suponhamos que um usuário tenha inserido o seguinte código na área de texto:
console.log('This is ZomboCom.');
Quando o usuário salva a regra, o objeto de configurações salvo pela visualização pode ter a seguinte aparência:
{
foo: {
bar: "console.log('This is ZomboCom.');"
}
}
Queremos que o código do usuário seja colocado em um arquivo separado em vez de ser incluído na biblioteca de tempo de execução de tags. Quando uma regra que usa nossa ação é acionada na biblioteca de tempo de execução de tags, queremos carregar o código do usuário anexando um elemento de script ao corpo do documento. Para resolver nosso problema de exemplo, definiríamos a transformação na definição do tipo de ação em extension.json
da seguinte maneira:
{
"transforms": [
{
"type": "file",
"propertyPath": "foo.bar"
}
]
}
type
define o tipo de transformação que deve ser aplicado ao objeto de configurações.propertyPath
é uma string delimitada por período que informa ao Platform onde localizar a propriedade que precisa ser modificada dentro do objeto de configurações.
Quando o objeto de configurações for emitido na biblioteca de tempo de execução de tags, ele será transformado no seguinte:
{
foo: {
bar: "//launch.cdn.com/path/abc.js"
}
}
Nesse caso, o valor de foo.bar
foi transformado em um URL. O URL exato será determinado no momento em que a biblioteca for criada. O arquivo sempre receberá uma extensão .js
e será entregue usando um tipo MIME orientado por JavaScript. Podemos adicionar suporte para outros tipos MIME no futuro.
Remover transformação
Por padrão, todas as propriedades do objeto de configurações são emitidas na biblioteca de tempo de execução de tags. Se determinadas propriedades forem usadas apenas para a visualização de extensão, especialmente se contiverem informações confidenciais (por exemplo, token secreto), você deverá remover a transformação para impedir que as informações sejam emitidas para a biblioteca de tempo de execução de tags.
Vamos supor que gostaríamos de oferecer um novo tipo de ação. A visualização do tipo de ação pode fornecer uma entrada na qual o usuário pode inserir uma chave secreta que permitirá a conexão com uma API específica. Vamos supor que um usuário tenha inserido o seguinte texto na entrada:
ABCDEFG
Quando o usuário salva a regra, o objeto de configurações salvo pela visualização pode ter a seguinte aparência:
{
foo: {
bar: "ABCDEFG"
}
}
Não queremos incluir a propriedade bar
na biblioteca de tempo de execução de tags. Para resolver nosso problema de exemplo, definiríamos a transformação na definição do tipo de ação em extension.json
da seguinte maneira:
{
"transforms": [
{
"type": "remove",
"propertyPath": "foo.bar"
}
]
}
type
define o tipo de transformação que deve ser aplicado ao objeto de configurações.propertyPath
é uma string delimitada por período que informa ao Platform onde localizar a propriedade que precisa ser modificada dentro do objeto de configurações.
Quando o objeto de configurações for emitido na biblioteca de tempo de execução de tags, ele será transformado no seguinte:
{
foo: {
}
}
Nesse caso, o valor de foo.bar
foi removido do objeto de configurações.