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 |
|---|---|
| Sim |
Arrow functions ( | Sim |
Classes ( | Sim |
Desestruturação ( | Sim |
Parâmetros por omissão, rest e spread | Sim |
Template strings | Sim |
Generators ( | Sim |
| Sim |
| Sim |
| Sim |
| Experimental |
Typed Arrays ( | Sim |
Módulos ( | Sim |
Tail calls (chamadas recursivas de cauda) | Não |
ES2017 — suporte completo
Funcionalidade | Suportado |
|---|---|
| Sim |
| Sim |
| Sim |
ES2019 – ES2022 — suporte completo
Funcionalidade | Suportado | ||
|---|---|---|---|
Optional chaining ( | Sim | ||
Nullish coalescing ( | Sim | ||
Logical assignment ( | \ | = | Sim |
| Sim | ||
Campos privados de classes ( | Sim | ||
Top-level | Sim |
ES2023 – ES2025 — suporte completo
Funcionalidade | Suportado |
|---|---|
Métodos de | Sim |
| Sim |
| Sim |
| Sim |
| Sim |
Iteradores auxiliares ( | 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