npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@codeplaydata/adapters

v0.8.1

Published

<div align="center">

Downloads

38

Readme

Adapters

Seguindo os princípios do Ports and Adapters - Alistair Cockburn essa lib é um agregado de adaptadores utilizados por outros pacotes do projeto CodePlayData. A ideia é se preocupar menos com aplicações de terceiros, i.e. banco de dados, servidos/clients http, e mais com os objetos específicos do seu projeto, como os repositórios e gateways.

Os comentários no código estarão em inglês e a documentação/testes em português.

Como Usar

Em uma situação em que sua infraestrutra dependa de um Banco de Dados estruturado a documentos como o MongoDB. Abaixo está a implementação desse tipo de situação:

import { database, DocumentDatabaseRepository } from '@codeplaydata/adapters';

class CustomMongoDBRepository extends DocumentDatabaseRepository {
    private constructor(readonly collection: MongoDBCollection) {
        super(collection)
    }

    async saveDoc(doc: Document) {
        return await this.collection.query('insertOne', doc)
    }

    async clear() {
        await this.collection.query('deleteMany', undefined, {})
    }

    static start(collection: MongoDBCollection) {
        return new GenericMongoDBRepository(collection)
    }
}

const mongo = http.database.document.mongo(process.env.MONGO_URI as string || "mongodb://localhost:27017", "npm_adapters", "collection1");

const repo = CustomMongoDBRepository.start(mongo);
const doc = { name: 'subject-1'};
const result = await repo.saveDoc(doc);

/.../

Para a mesma situação só que trocando o MongoDB pelo FaunaDB seria assim:

class CustomFaunaDBRepository extends DocumentDatabaseRepository {
    private constructor(readonly collection: MongoDBCollection) {
        super(collection)
    }

    async saveDoc(doc: Document) {
        return await this.collection.query('Create', doc)
    }

    async clear() {
        await this.collection.query('Delete', undefined, {})
    }

    static start(collection: MongoDBCollection) {
        return new GenericFaunaDBRepository(collection)
    }
}

const fauna = http.database.document.fauna(process.env.FAUNA_HOST as string || "http://localhost:8443", process.env.FAUNA_SECRET as string, process.env.FAUNA_COLLECTION as string  || "teste");

const repo = CustomFaunaBRepository.start(fauna);
const doc = { name: 'subject-1'};
const result = await repo.saveDoc(doc);

Também é possível importar as classes diretamente sem os hooks, tendo que usar o new em todas as chamadas. As interfaces, classes abstratas e builders para confecção dos repositórios e gateways também estão disponíveis para importação.

Como Testar

A estrutura de testes foi sustentanda em containers. O arquivo ./docker/docker_build.sh faz o build das três imagens necessárias equanto o ./docker/docker_up.sh sobe as imagens e o ./docker/docker_down.sh as destroi.

Caso as imagens já estejam salvas é possível usar o script de atalho na root chamado ./test.sh. Lembre-se que é esperado um arquivo .env com a seguinte estrutura:

Caso não exista ele será criado ao menos para armazenar o segredo do FaunaDB durante os testes.

É possível que esses softwares já estejam instalados em sua máquina e você queria testá-los fora dos containers, nesse caso lembre-se e comentar as linhas que os referem nos arquivos de criação e deleção dos containers.

Implementações

Abaixo estão os adapters já implementados até agora:

| Adapter | Andamento | |:---------|:-----------| | MongoDB | ok | | FaunaDB | ok | | Redis | em dev | | Fetch | ok | | Axios | ok | | Express | ok | | Fastify | ok | | node:http | ok | | WebAssembly | ok |


Licença

Copyright 2023 Pedro Paulo Teixeira dos Santos

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.