nfephp-org / sped-common Goto Github PK
View Code? Open in Web Editor NEWClasses comuns usadas nas atividades e classes das API's de NFe, CTe e MDFe
License: Other
Classes comuns usadas nas atividades e classes das API's de NFe, CTe e MDFe
License: Other
Alguém verificou se a hora de expirar o certificado não está retorando corretamente?
$this->validFrom = \DateTime::createFromFormat('ymdHis\Z', $detail['validFrom']); $this->validTo = \DateTime::createFromFormat('ymdHis\Z', $detail['validTo']);
Estou com um caso aqui que o default timezone do PHP está America/Sao_Paulo, e a data / hora de expirar em 08/04/2022 13:10:00
quando na verdade seria 08/04/2022 10:10:00.
Resumindo: O certificado está expirando 3 horas depois do horário que está no arquifo pfx.
EDIT:
[validFrom] => 210408131000Z [validTo] => 220408131000Z [validFrom_time_t] => 1617887400 [validTo_time_t] => 1649423400
Poderia ser pego direto do time_t?
A Classe SOAP requer os certificados em arquivo para usar, a SoapBase::class cria esses arquivos de forma temporária e depois os remove. Mas quando existem operações concorrentes com o mesmo certificado (mesmo CNPJ) pode ocorrer de uma operação remover os certificados que seriam usados em outra.
Implementar remoção do namespace {http://www.portalfiscal.inf.br/nfe} das mensagens de erro na validação do XML - \NFePHP\Common\Dom\ValidXsd::validar()
Ao definir true
na opção CURLOPT_VERBOSE
a saída verbosa é direcionada para a stderr
.
Caso você possua programas/testes que geram saída formatada, haverá mistura entre a stdout
e stderr
.
// fully-qualified name: \NFePHP\Common\Soap\CurlSoap
curl_setopt($oCurl, CURLOPT_VERBOSE, 1);
Line 30 in 1d0bb62
Há algum meio de retornar esse resultado menos confuso, sinto que em relação a validação anterior esse modo ta meio complexo e confuso pra resolver, só consegui resolver os erros do xml com outro validador o da tecnhospeed.
Por favor poderia adicionar suporte ao league/flysystem 2.0
Boa tarde gente.
Primeiramente muito obrigado pelas classes, realmente estão me ajudando muito.
Estou com um problema na assinatura do XML da NFSe. Estou tendo o seguinte retorno:
(
[mEnvioLoteRPSSincronoResult] => 0001-01-01T00:00:00E0800Erro na geração da assinatura!
Assinatura inválida. A Assinatura da nota não confere com a informação contida no XML.Verifique as informações do seu Certificado Digital
)
A função Signer::isSigned retorna o seguinte:
The XML content does not match the Digest Value. Probably modified after it was signed
Ainda estou realizando testes, então o código está provisório, mas estou fazendo o seguinte:
`
function AssinarXML_GerarXMLAssinado() {
$xml = file_get_contents("caminho do xml assinavel");
$tagname = 'InfDeclaracaoPrestacaoServico';
$mark = 'Id';
$algorithm = OPENSSL_ALGO_SHA1;
$canonical = [true,false,null,null];
$rootname = 'tcDeclaracaoPrestacaoServico';
try {
$pfx = file_get_contents('caminho do certificado .pfx');
$certificate = Certificate::readPfx($pfx, 'senha do certificado .pfx');
$signed = Signer::sign(
$certificate,
$xml,
$tagname,
$mark,
$algorithm,
$canonical,
$rootname
);
$arquivoXMLFinal = fopen("caminho para gravar um xml com a string assinada", "w") or die("Erro ao gravar XML!");
fwrite($arquivoXMLFinal, $signed);
fclose($arquivoXMLFinal);
} catch (\Exception $e) {
//aqui você trata a exceção
echo $e->getMessage();
}
}
`
Será que o problema é porque eu estou gravando o XML assinado em um arquivo? Será que preciso assinar direto o XML? Se for isso, tem como fazer isso nessa biblioteca?
Ressalto que a estrutura da assinatura está totalmente correta conforme o modelo da prefeitura, tem Reference ID e tudo mais.
Muito obrigado desde já e parabéns pela biblioteca, muito útil!
Testando as informações evento do empregador no eSocial.
Ao enviar o campo Indicativo de Cooperativa (indCoop) com valor 0 (Não é cooperativa) percebi que o campo não estava sendo enviado para o eSocial.
Localizei a causa do problema na classe DOMImproved metodo addChild.
Ao informar valor 0 (zero) em um campo não obrigatório, a classe não cria o node.
O problema, pelo que identifiquei, é o uso da função empty, que sempre retorna vazio para valores, 0 ou string 0. Aqui eu resolvi o problema forçando o tipo: $content !== ''
Boas!
A inclusão da função str_contains na function between do \src\Certificate\PublicKey.php obriga usar o PHP 8.
É essa a intenção mesmo?
Eu preciso colocar a assinatura após o nó assinado
hoje elé esta assinando e colocando dentro da raiz CompNfse
<CompNfse xmlns="http://www.abrasf.org.br/nfse.xsd">
<Nfse versao="2.03">
<InfNfse Id="NFSe201800000113953">
....
</InfNfse>
</Nfse>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
....
</Signature>
</CompNfse>
preciso que assinatura seja colocado após o nó assinado InfNfse
<?xml version="1.0" encoding="UTF-8"?>
<CompNfse xmlns="http://www.abrasf.org.br/nfse.xsd">
<Nfse versao="2.03">
<InfNfse Id="NFSe201800000113953">
....
</InfNfse>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
....
</Signature>
</Nfse>
</CompNfse>
estou chamando dessa forma
Signer::sign($certificate, $xml, 'InfNfse', 'Id');
Há um problema de compatibilidade com o symfony/yam na hora de instalar pelo composer
composer require nfephp-org/sped-cte:dev-master
segue o erro:
Problem 1
- Installation request for nfephp-org/sped-cte dev-master -> satisfiable by nfephp-org/sped-cte[dev-master].
- nfephp-org/sped-cte dev-master requires symfony/yaml ^3.3 -> satisfiable by symfony/yaml[3.3.x-dev, 3.4.x-dev, v3.3.0, v3.3.0-BETA1, v3.3.0-RC1, v3.3.1, v3.3.10, v3.3.11, v3.3.12, v3.3.13, v3.3.14, v3.3.15, v3.3.2, v3.3.3, v3.3.4, v3.3.5, v3.3.6, v3.3.7, v3.3.8, v3.3.9, v3.4.0, v3.4.0-BETA1, v3.4.0-BETA2, v3.4.0-BETA3, v3.4.0-BETA4, v3.4.0-RC1, v3.4.0-RC2, v3.4.1, v3.4.2, v3.4.3] but these conflict with your requirements or minimum-stability.
acredito que se vocês atualizarem a versão do yam no composer para a versão 4.0.3 resolve o problema
Bom dia! Em uma implementação, precisei forçar o http version para 1.1:
$nfeTools->soap->httpVersion('1.1');
Mas o método não existe na SoapInterface, apenas na classe SoapBase (que implementa a SoapInterface). Fiquei na dúvida se estou fazendo algo errado, ou se o método realmente está faltando na interface.
Olá, estou tentando usar a v4.00 do CTe, que usa a v5.00 do sped-common, mas estou com problemas na comunicação do CURL utilizando a classe de certificados.
Nas versões anteriores, que usavam os certs PEM eu nunca tive problemas.
Eu dei um dump no objeto do cert e parece tudo ok também, ele leu tudo e gerou tudo que precisava (aparentemente).
O certificado também funcionou normalmente para assinar o CTe.
StackTrace do erro:
PHP Fatal error: Uncaught exception 'NFePHP\Common\Exception\SoapException' with message 'An error occurred while trying to communication via soap, unable to load client cert: -8018 (SEC_ERROR_UNKNOWN_PKCS11_ERROR) [https://homologacao.nfe.fazenda.sp.gov.br/cteWEB/services/cteRecepcao.asmx]' in /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-common/src/Exception/SoapException.php:24
Stack trace:
#0 /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-common/src/Soap/SoapCurl.php(126): NFePHP\Common\Exception\SoapException::soapFault('unable to load ...')
#1 /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-cte/src/Common/Tools.php(531): NFePHP\Common\Soap\SoapCurl->send('https://homolog...', 'cteRecepcaoLote', '"http://www.por...', 2, Array, Array, '<cteDadosMsg xm...', Object(SoapHeader))
#2 /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-cte/src/Tools.php(88): NFePHP\CTe\Common\Tools->sendRequest('<cteDadosMsg xm...', Array)
#3 /mnt/dados/user/ctesync_v3/examples/testaEnvio.php(92): NFePHP\CTe\Tools->sefazEnviaLote(Array, in /mnt/dados/user/ctesync_v3/vendor/nfephp-org/sped-common/src/Exception/SoapException.php on line 24
Procurando na Web achei esses links relacionando o erro ao fato de o curl ter sido compilado usando NSS ao invés de OpenSSL:
https://stackoverflow.com/questions/19265100/curl-command-unable-to-load-client-cert-8018
https://stackoverflow.com/questions/20969241/curl-58-unable-to-load-client-key-8178
Info do meu curl (Amazon Linux 32 bits):
$ curl -V
curl 7.47.1 (i686-redhat-linux-gnu) libcurl/7.47.1 NSS/3.21.3 Basic ECC zlib/1.2.8 libidn/1.18 libpsl/0.6.2 (+libicu/50.1.2) libssh2/1.4.2
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets PSL
Sinceramente não sei como tentar resolver isso no momento.
Qualquer idéia é bem-vinda!
Talvez eu volte pra v3.00 do CTe por conta disso :(
EDIT: Teria como eu forçar uso do SoapNative ou algo assim ao invés do curl?
E se não tiver posso usar o modelo da antiga versão?
Para a lista de códigos das UFs, UFlist... É apenas um exemplo de aplicação, são previstos outros datasets, a exemplo do Data Packaged Core Datasets.
"message": "DOMDocument::createElement(): unterminated entity reference CIA",
"exception": "ErrorException",
"file": "C:\xampp\htdocs\topsoftweb\api\vendor\nfephp-org\sped-common\src\DOMImproved.php",
"line": 185,
"trace": [
{
"function": "handleError",
"class": "Illuminate\Foundation\Bootstrap\HandleExceptions",
"type": "->"
},
{
"file": "C:\xampp\htdocs\topsoftweb\api\vendor\nfephp-org\sped-common\src\DOMImproved.php",
"line": 185,
"function": "createElement",
"class": "DOMDocument",
"type": "->"
},
Poderia por favor verificar no arquivo PublicKey.php
linha 111 $this->icp = $detail['subject']['organizationName'];
no php 8.1 se o indice do array não existir está dando erro.
Boa tarde,
Estou desenvolvendo uma rotina para exportação de um arquivo TXT para o estado de Santa Catarina.
De acordo com o manual, esse arquivo deve ser assinado usando o certificado do PAF.
Já utilizamos essa classe no sistema para fazer a assinatura de documentos XML das notas, mas não encontrei uma forma de faze-lo em arquivos texto.
É possível?
Ao emitir uma NF-e, na tag <infCpl>
as quebras de linha que antes eram convertidas para a tag <br />
agora estão sendo salvas como < br/>
, ao imprimir o DANFE diretamente a partir do conteúdo do XML, as quebras de linha acabam não funcionando.
Fiz o downgrade do package para a versão anterior: v5.0.47 e funciona normalmente, o problema está de fato na versão v5.0.48. É um problema de fato, ou foi feito propositalmente?
Opa, beleza, galera, ao preparar uma api aqui pra mim, eu vie que existe algo que é muito trivial, fácil de fazer, e bom demais pra rodar em cima de documentos speds, que são as execuções de macros, assim eu poderia tirar mais responsabilidade nas montagem e separar regras de limpeza, condição, retornos, para exclusão dependendo que regras fossem passadas, adotei esse modelo aqui e ficou muito legal para construir o xml, inclusive pode se adotar um dicionário interno, onde a api irá obedece-lo de forma padrão na construção e quando alguém quiser implementar de sua maneira o poderá fazer, farei a postagem de algum código mais pra frente, mas fica muito bom.
Gostaria de saber se existe a possibilidade hoje no framework de usar A3 e A5 na nuvem, se não existe se tem alguma previsão ou alguma possibilidade de vir a existir...
Obrigado pelas informações!
Eventualmente tem ocorrido esse erro: File not found at path CNPJ/certs/RAND.pem
Tenho cerca de 40 caixas rodando ao mesmo tempo, no mesmo usuário unix.
Poderia o método SoapBase.removeTemporarilyFiles()
estar removendo arquivos que ainda estão sendo usados?
Prezados, estou no ubuntu 22.04 que está com o novo OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) (até então era o 1.1.1). Meu PHP:
PHP 8.1.5 (cli) (built: Apr 21 2022 10:32:13) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.5, Copyright (c) Zend Technologies
with Zend OPcache v8.1.5, Copyright (c), by Zend Technologies
with Xdebug v3.1.4, Copyright (c) 2002-2022, by Derick Rethans
Ao tentar assinar uma nfe tenho o erro PHP Fatal error: Uncaught NFePHP\Common\Exception\CertificateException: Impossivel ler o certificado, ocorreu o seguinte erro: (error:0308010C:digital envelope routines::unsupported)
Este erro não ocorre na versão 1.1.1 do OpenSSL.
Alguém mais passando por isso?
Estou usando essa biblioteca como base para integração com a Prefeitura de Goiania ( por mas que tenha outra já com esse intuito ).
Porém a validação do Request para Goiania é feito na Tag Rps
dentro da tag InfDeclaracaoPrestacaoServico
Sendo o Path para o nó a ser assinado: Rps -> InfDeclaracaoPrestacaoServico -> Rps
O Método Signer::sign
aceita um parâmetro tagname
, porém não consegui fazer ele selecionar a tag correta.
Há a possibilidade de mudar a visibilidade desses métodos para protected para poder ser sobreescritos?
poderia por favor liberar o pacote para que seja possível instalar com uma dependência mais nova do psr/log
"psr/log": "^1.0.1 || ^2.0 || ^3.0"
Para fazer a validação do DigestValue do XML o método isSigned() realiza uma busca no atributo @id e o foreach retorna sempre a última tag, sendo que para gerar o DigestValue a tag a ser verificada é a infNFe.
Exemplo:
<nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe99999999999999999999999900000000000000000000" versao="3.10">
...
</infNFe>
</NFe>
<protNFe versao="3.10">
<infProt Id="ID999999999999999">
...
</infProt>
</protNFe>
</nfeProc>
Trecho que apresenta o problema:
private static function digestCheck(
$xml,
$tagname = '',
$canonical = [true,false,null,null]
) {
...
$xpath = new \DOMXPath($dom);
$entries = $xpath->query('//@Id');
foreach ($entries as $entry) {
$tagname = $entry->ownerElement->nodeName;
}
...
}
Para resolver o problema basta inserir um break no foreach para ele retornar a primeira tag:
private static function digestCheck(
$xml,
$tagname = '',
$canonical = [true,false,null,null]
) {
...
$xpath = new \DOMXPath($dom);
$entries = $xpath->query('//@Id');
foreach ($entries as $entry) {
$tagname = $entry->ownerElement->nodeName;
break;
}
...
}
Client abstrato responsável em enviar a Requisição, recebe um Service Interface que implementa métodos necessários para requisição do Serviço .
Proposta.
Client
ServiceRequest
Em um sistema altamente concorrente, esse trecho de código está lançando FileNotFoundExceptions
. Isso porque 2 processos podem ao mesmo tempo listar os arquivos antigos, porém só 1 deles vai remover primeiro o arquivo, quando o 2º tentar chamar o método getTimestamp
ou delete
o arquivo já não vai mais existir e irá lançar uma exception.
Pensei em passar a option disable_asserts
com valor true
para o construtor de Fylesystem
, o que acha?
sped-common/src/Soap/SoapBase.php
Lines 583 to 596 in 91da99c
Bom dia
Eu consigo usar essa biblioteca para assinatura de XML do EFD-REINF?
Como detectar a validade do certificado?
Olá
Estou usando este projeto em alguns clientes num servidor de hospedagem compartilhada com CPanel. Quando ativei o sistema no 2º cliente, tive problemas de permissão nesta parte:
sped-common/src/Soap/SoapBase.php
Line 157 in 7a89e62
A pasta sys_get_temp_dir() . '/sped/'
só tem permissão de escrita para o usuário que criou ela, logo meu segundo usuário linux não consegue criar subpastas dentro dela. Teria como mudar a permissão dessa pasta sped para 777 e as demais manter a permissão atual? Acho que não tem problema, pois para cada cnpj há uma sub-pasta no caso do projeto sped-nfe.
Ou então permitir definir o local dessa pasta via arquivo de configuração ou algum setter.
Como eu faço para validar um xml que contenha varias assinaturas, no caso de um rps que tenho que assinar a rps e o lote
Signer::isSigned($xml, $tagname)
o digestCheck esta pegando para verificar o campo errado $informedDigest.
public static function digestCheck($xml, $tagname = '', $canonical = self::CANONICAL)
{
$dom = new \DOMDocument('1.0', 'utf-8');
$dom->formatOutput = false;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xml);
$root = $dom->documentElement;
$signature = $dom->getElementsByTagName('Signature')->item(0);
$sigURI = $signature->getElementsByTagName('Reference')->item(0)->getAttribute('URI');
if (empty($tagname)) {
if (empty($sigURI)) {
$tagname = $root->nodeName;
} else {
$xpath = new \DOMXPath($dom);
$entries = $xpath->query('//@Id');
foreach ($entries as $entry) {
$tagname = $entry->ownerElement->nodeName;
break;
}
}
}
$node = $dom->getElementsByTagName($tagname)->item(0);
if (empty($node)) {
throw SignerException::tagNotFound($tagname);
}
$sigMethAlgo = $signature->getElementsByTagName('SignatureMethod')->item(0)->getAttribute('Algorithm');
$algorithm = 'sha256';
if ($sigMethAlgo == 'http://www.w3.org/2000/09/xmldsig#rsa-sha1') {
$algorithm = 'sha1';
}
if ($sigURI == '') {
$node->removeChild($signature);
}
$calculatedDigest = self::makeDigest($node, $algorithm, $canonical);
$informedDigest = $signature->getElementsByTagName('DigestValue')->item(0)->nodeValue;
if ($calculatedDigest != $informedDigest) {
throw SignerException::digestComparisonFailed();
}
return true;
}
return new static("Impossivel carregar cURL, "
. "verifique se libcurl foi intalada. $message");
SoapBase::getStringAttributes recebe um array de atributos e no loop ao invés de concatenar os atributos ele vai sobreescrevendo, mantendo apenas o último atributo.
sped-common/src/Soap/SoapBase.php
Lines 451 to 453 in f462c7d
Para que sejam corretamente utilizados em vários locais é necessário que os xml sejam corretamente identificados quanto ao que são e a que projeto pertencem. Principalmente na montagem de documentos auxiliares (Danfe, Danfce, Dacce, etc.)
Após atualização hoje dos últimos branch do mês via composer. voltou a me aparecer o erro:
An error occurred while trying to communication via soap, communication via soap Unable to load client cert -8018.
Havia utilizado a solução abaixo (setEncriptPrivateKey) que não funciona mais e não achei nenhuma alteração que pudesse causar isso. Conseguem dar uma luz? Alguém teve o mesmo problema?
$soap = new SoapCurl($certificate);
$soap->setEncriptPrivateKey(false);
$tools = new Tools($configjson, $certificate);
$tools->loadSoapClass($soap);
Obrigado
Eu li um Issue na NFEPHP (atualmente depreciada, que havia esta função, a qual não estou conseguindo encontrar) nfephp-org/nfephp#214.
Gostaria de saber se já há algo semelhante desenvolvido nas bibliotecas atuais. E se não ha ainda, como eu poderia utilizar a função da biblioteca anterior, ou até ajudar a transportar esta função para as novas bibliotecas. Agradeço imensamente a ajuda.
Galera, queria entender se é possível via API usar como autenticação o login e senha do painel (que é utilizado no painel para emitir nfe sem certificado) para gerar a NFe ?
namespace NFePHP\Emitente;
class Emitente {
private $xNome;
private $xFant;
private $CNPJ;
private $IE;
/*
* Discutir se são necessários.
*/
// private $xLgr;
// private $nro;
// private $xCpl;
// private $xBairro;
// private $cMun;
// private $xMun;
// private $CEP;
// private $UF;
// private $xPais;
private $json;
public function __set($attr, $value)
{
if (method_exists($this, $attr)) {
$this->$attr();
} else {
$this->$attr = $value;
}
}
public function __get($attr)
{
return $this->$attr;
}
public function __toString()
{
print_r($this);
}
public function __toArray()
{
//TODO Atributos para array
}
public function __toJson()
{
// TODO Atributos para json
}
/*
* Cria atributos a partir de um json
*/
public function __serializer()
{
}
};
Foi o que pensei até o momento.
Olá pessoal! Isso é mais uma duvida do que uma issue, mas vi que tem a tag com help wanted, resolvi abrir.
Não encontrei no código um método que crie múltiplas assinaturas, e quando tento utilizar o Signer:sign() pela segunda vez, ele acaba removendo a assinatura anterior.
Estou utilizando o projeto para montar NFS-e, e no momento a que necessita de duas assinaturas é a cidade de Porto Alegre - RS.
Existe algum método? Grato desde já
Inspirado pela discussão iniciada no PR #181, talvez seria bom termos casos de teste de unidade testando a assinatura digital de documentos com estruturas diferentes. Assim, quando alguém tiver a inspiração de fazer uma melhoria no método Sign
, ficaria mais seguro de não estar quebrando o uso nos outros componentes.
Pessoa desculpe me postar uma pergunta aqui que não se reference a nota eletrônica, mais eu estou a vários dias sem solução, gostaria da ajuda de voces.
Eu preciso comunicar a um serviço da receita https://sisobrapref.receita.economia.gov.br/sisobraprefWS/recepcao?wsdl porem ele exige uma criptografia na comunicação com a transferência da informação do CNPJ "OID: 2.16.76.1.3.3"
Porem todas as forma que que tente sempre tenho a mesma resposta Certificado Transmissor sem CNPJ
eu já tentei a forma do soap nativo do php SoapClient
e também as classe SoapCurl
e SoapNative
do projeto nfephp-org/sped-common
O comando me retorna o CNPJ no certificado corretamente
$certificado->getCnpj();
se alguém puder me dar um norte eu agradeço muito.
certificado deve ser um value object que deverá conter as seguintes propriedades:
os comportamentos esperados:
EDIT:
sign
para encrypt
certificate
, companyIdentifier
No construtor da classe SoapBase é realizado a chamada do SoapBase::setTemporaryFolder, onde é chamado o SoapBase::saveTemporarilyKeyFiles criando os temporários, e logo após é chamado SoapBase::saveTemporarilyKeyFiles novamente. Isso tem real necessidade? Pois SoapBase::removeTemporarilyFiles vai remover apenas os últimos.
No construtor:
sped-common/src/Soap/SoapBase.php
Lines 157 to 161 in f462c7d
No SoapBase::setTemporaryFolder:
sped-common/src/Soap/SoapBase.php
Lines 252 to 254 in f462c7d
devemos criar uma classe para fazer a leitura do arquivo de certificado do tipo A1
talvez nesse momento não precise criar uma interface, a não ser que tenhamos outros tipos de leitores de certificado
comportamento esperado:
Certificate
UnexpectedContentException::cannotRead
Eu estou com um problema, na hora de assinar um xml, ele monta e assina certinho o documento mas quando tento enviar fala que está com erro na assinatura, fui verificar a assinatura e retorna o seguinte erro.
Reference 1 digest is invalid because the computed digest differs from the digest in the XML.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.