📋 Como tem sido a sua experiência com o Help Center? Partilhe rapidamente connosco a sua opinião.

Interpretador de Javascript

Prev Next
  • PT

  • ES

  • AO

  • CV

  • MZ

  • Professional

  • Executive

  • Public Sector

  • Omnia

  • Evolution


Disponível com a Service Release 6 da versão 10.20

O interpretador de Javascript permite a avaliação de scripts na linguagem Javascript aquando da execução da aplicação, sem recurso a pré-compilação.


Interpretador de Javascript

Este interpretador fornece diversas vantagens relativamente a outras abordagens de extensibilidade, nomeadamente:

Segurança Absoluta contra Códigos Maliciosos;

  • Isolamento Total (Sandboxing): o interpretador é escrito puramente em C#. O código JavaScript enviado por um utilizador para estender a aplicação corre num ambiente fechado.

  • Sem Acesso ao Sistema: por padrão, o script não consegue aceder ao disco, à rede, a variáveis de ambiente ou à memória do servidor, mitigando ataques de engenharia social ou injeção de código.

  • Restrição de Recursos: permite definir limites rígidos de tempo de execução (timeouts) e restrições de memória para evitar que um plugin com um loop infinito tenha impacto no servidor.

  • Não são permitidas importação de bibliotecas externas nem a utilização de funções globais que não estejam disponíveis no ambiente do interpretador. O script tem de ser auto-contido, sem dependências externas.

Integração Nativa e Bidirecional com a aplicação

Dependendo do contexto, estão disponíveis objetos do ERP para serem utilizados nas fórmulas no contexto da sua avaliação. As suas propriedades podem ser lidas e interpretadas como de propriedades de objetos Javascript normais.

Acessibilidade e Ecossistema Universal

O JavaScript é a linguagem mais conhecida do mundo.

Hot-Reloading Real (Modificações em Tempo Real)

Os scripts podem ser alterados, adicionados ou removidos em tempo de execução sem a necessidade de reiniciar a aplicaçãoDocumentação da linguagem Javascript

A documentação específica da linguagem Javascript não está no ambito desta documentação, mas recomendamos a consulta na Mozilla Developer Network (MDN).

Suporte da linguagem Javascript

O interpretador implementa a especificação ECMAScript (a norma formal do Javascript). A tabela abaixo descreve o suporte por versão:

ES2015 (ES6) — suporte completo

Funcionalidade

Suportado

let / const (âmbito léxico)

Sim

Arrow functions (=>)

Sim

Classes (class, extends, super)

Sim

Desestruturação (const { a, b } = obj)

Sim

Parâmetros por omissão, rest e spread

Sim

Template strings `Olá ${nome}`

Sim

Generators (function*, yield)

Sim

Map, Set, WeakMap, WeakSet

Sim

Symbol

Sim

Proxy e Reflect

Sim

Promise

Experimental

Typed Arrays (Int8Array, Float64Array, …)

Sim

Módulos (import / export)

Sim

Tail calls (chamadas recursivas de cauda)

Não

ES2017 — suporte completo

Funcionalidade

Suportado

async / await

Sim

Object.entries(), Object.values()

Sim

Object.getOwnPropertyDescriptors()

Sim

ES2019 – ES2022 — suporte completo

Funcionalidade

Suportado

Optional chaining (obj?.prop)

Sim

Nullish coalescing (a ?? b)

Sim

Logical assignment (&&=, `\

\

=,??=`)

Sim

BigInt

Sim

Campos privados de classes (#campo)

Sim

Top-level await

Sim

ES2023 – ES2025 — suporte completo

Funcionalidade

Suportado

Métodos de Set (intersection, union, difference, …)

Sim

Array.fromAsync

Sim

Promise.try()

Sim

RegExp.escape()

Sim

Float16Array, Math.f16round()

Sim

Iteradores auxiliares (Iterator.prototype.map, .filter, …)

Sim

Limitações

Limitações importantes do parser

  • Sem tail call optimization: recursão profunda pode causar stack overflow. Prefira iteração invés de recursão para volumes grandes.

  • Promise é experimental: embora possa funcionar, não é aconselhada a sua utilização.

  • Sem acesso ao ambiente do browser: não existem window, document, localStorage, fetch ou outras APIs de browser. O ambiente disponível é definido inteiramente pela aplicação.

  • Sem acesso ao sistema: ficheiros, rede, variáveis de ambiente e processos externos não estão acessíveis.


Depuração

A depuração de scripts não é altualmente suportada. Para deteção de problemas, recomenda-se a uma estratégia de colocação de mensagens no log do ERP, usando para isso a função log que têm a seguinte assinatura:

log("Mensagem de log");

Limites para expressões e respetiva configuração

O avaliador de expressões tem várias limites cuja configuração pode ser alterada. Contudo, por defeito, estão definidos com valores que permitem uma execução segura e eficiente:

  • Memória máxima de execução da expressão em bytes (MemoryLimit): limite de memória que o avaliador pode usar para avaliar a expressão. O valor padrão é de 500Mb (500000000);

  • Tempo máximo de execução da expressão em segundos (TimeoutLimit): limite de tempo que o avaliador pode usar para avaliar a expressão. O valor padrão é de 600 segundos;

  • Número máximo de instruções que podem ser executadas (MaxStatements): limite do número de instruções que o avaliador pode executar para avaliar a expressão. O valor padrão é 9999000;

  • Permitir escrita em objetos CLR (AllowClrWrite): permite que o avaliador escreva em objetos CLR. O valor padrão é 0 (falso). Para verdadeiro use o valor 1.

  • Profundidade máxima de recursão (MaxRecursionDepth): limite da profundidade de recursão que o avaliador pode usar para avaliar a expressão. O valor padrão é -1 (sem limite);

  • Tamanho máximo de arrays (MaxArraySize): limite do tamanho máximo de arrays que podem ser criados no avaliador. O valor padrão é 0 (sem limite);

  • Tempo máximo de execução em segundos de expressões regulares (RegexTimeout): limite do tempo máximo que o avaliador pode usar para avaliar expressões regulares. O valor padrão é 0 (sem limite);

  • Tempo máximo de resolução de promessas (PromiseTimeout): limite do tempo máximo que o avaliador pode usar para resolver promessas. O valor padrão é 0 (sem limite).

Estes valores podem ser alterados através de configuração no ficheiro de configuração da aplicação (Config.INI), contudo deverá ter em consideração que valores muito elevados podem impactar o desempenho da aplicação e a sua estabilidade. Recomenda-se que apenas sejam alterados os valores quando necessário e com total conhecimento do impacto.

Os valores deverão estar dentro de uma secção [JsParser] e com os nomes das chaves exatamente como descrito anteriormente. Por exemplo:

[JsParser]
MemoryLimit=500000000
TimeoutLimit=600
MaxStatements=9999000
AllowClrWrite=0
MaxRecursionDepth=1000
MaxArraySize=10000
RegexTimeout=600
PromiseTimeout=600