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

@codismart/architect-toolkit

v0.0.7

Published

Este repositorio está diseñado para facilitar el uso de diferentes patrones de diseño en proyectos de desarrollo de software, proporcionando una estructura modular y organizada para implementar soluciones escalables y reutilizables. Dentro del repositorio

Downloads

396

Readme

Architect Toolkit

Este repositorio está diseñado para facilitar el uso de diferentes patrones de diseño en proyectos de desarrollo de software, proporcionando una estructura modular y organizada para implementar soluciones escalables y reutilizables. Dentro del repositorio, se incluyen implementaciones de patrones como el Builder, State, Repository, y Specification, además de una amplia gama de errores personalizados que permiten manejar situaciones específicas de la aplicación.

Contenidos

Características

  • Implementaciones de patrones de diseño como Builder, State, Repository, Specification.
  • Módulos para trabajar con bases de datos como Cassandra y MongoDB.
  • Manejo de errores personalizados para situaciones como fallos de red, base de datos, validación de datos, etc.
  • Conversión de nomenclaturas entre diferentes formatos como camelCase, snake_case, kebab-case, etc.

Instalación

Puedes instalar el paquete desde npm:

  npm i @codismart/architect-toolkit

O sigue estos pasos para instalar y configurar el proyecto en tu entorno local:

# Clonar el repositorio
git clone https://github.com/cr8297408/architect-toolkit

# Navegar al directorio del proyecto
cd architect-toolkit

# Instalar dependencias
npm install

Uso

A continuación se presentan algunos ejemplos de uso con base en los archivos y módulos proporcionados:

Builder Pattern

Ejemplo de uso del Builder Pattern para construir consultas en Cassandra:

import { GeneralCassandraQueryBuilder, CassandraOperator } from '@codismart/architect-toolkit';

export class ExampleBuilder extends GeneralCassandraQueryBuilder<IExample> {
  constructor(props) {
    super({
      ...props,
      tableName: 'example',
    });
  }

  whereConditionUuid(uuid: string): this {
    this.where('uuid', CassandraOperator.EQUALS, uuid);
    return this;
  }
}

const builder = new ExampleBuilder({ keyspace: 'example_keyspace' });
builder.whereConditionUuid('123e4567-e89b-12d3-a456-426614174000');
builder.set('name', 'John');
const resultBuild = builder.buildUpdateQuery();
console.log(resultBuild); // { query: UPDATE example_keyspace.example SET name = ? WHERE uuid = ?, parameters: ['John', '123e4567-e89b-12d3-a456-426614174000'] }

Ejemplo de uso del Builder Pattern para construir consultas en SQL:

class ConfigurationUpdateBuilder extends GeneralSQLQueryBuilder<Configuration> {
  constructor(options: IGeneralSqlQueryBuilderOptions) {
    super(options);
  }

  whereConditionUuid(uuid: string): this {
    this.where('conditionUuid', SqlOperator.EQUALS, uuid);
    return this;
  }
}

const builder = new ConfigurationUpdateBuilder({ tableName: 'configurations' });
builder.whereConditionUuid('123e4567-e89b-12d3-a456-426614174000');
builder.set('name', 'John');
const resultBuild = builder.buildUpdateQuery();
console.log(resultBuild); // { query: UPDATE configurations SET name = ? WHERE conditionUuid = ?, parameters: ['John', '123e4567-e89b-12d3-a456-426614174000'] }

Step Pattern

Ejemplo de uso del Step Pattern para abstraer la lógica de un proceso en diferentes etapas:


import { Step } from '@codismart/architect-toolkit';

class ExampleStep extends Step {
  name = 'ExampleStep';
  async exec(state: State): Promise<void> {
    // TODO: Implement your logic here
  }
}

class ExampleStep2 extends Step {
  name = 'ExampleStep2';
  async exec(state: ExampleState): Promise<void> {
    // TODO: Implement your logic of second step here
    console.log(state.uuid);
  }
}


State Pattern

Ejemplo de uso del State Pattern para manejar el estado de una entidad en una aplicación:

import { State } from '@codismart/architect-toolkit';

class ExampleState extends State<IExample> {
  #uuid: string;
  constructor(example: IExample) {
    super();
    this.#uuid = example.uuid;
  }  

  set uuid(uuid: string) {
    this.#uuid = uuid;
  }

  get uuid(): string {
    return this.#uuid;
  }
}

Ejemplo de uso del State Pattern combinado con el Step Pattern para crear una cadena de responsabilidades que ejecute diferentes procesos en orden:


import { ExampleState } from '../state/ExampleState';
import { ExampleStep } from '../step/ExampleStep';
import { StateMachine } from '@codismart/architect-toolkit';

const yourExampleServiceOrModule = (example: IExample) => {
  const state = new ExampleState(example);

  await state.accept(new ExampleStep(state));
  await state.accept(new ExampleStep2(state));
  await state.accept(new ExampleStep3(state));
  // ... Todos los pasos que necesites
  await state.accept(new ExampleStepN(state));
}

Repository Pattern

Ejemplo de uso del Repository Pattern para interactuar con una base de datos:

import { Repository } from '@codismart/architect-toolkit';

class ConfigurationRepository extends Repository<Configuration> {
  constructor(private readonly dbService: DbService) {
    super();
  }

  async findAll(): Promise<Configuration[]> {
    const { query, parameters } = this.build();
    const result = await this.executeQuery(query, parameters);
    return result.rows.map((row) => this.mapRowToEntity(row));
  }

  async update(configuration: Configuration): Promise<Configuration> {
    const { query, parameters } = this.buildUpdateQuery(configuration);
    const result = await this.executeQuery(query, parameters);
    return this.mapRowToEntity(result.rows[0]);
  }

  // si usas specifications para tus filtros:
  async getExampleBySpecifications({
    specifications,
  }: exampleDependences): Promise<IExample[]> {
    const { sql, params } = this.combineFilterSpecifications(specifications);
    const query = `
      SELECT * FROM example
      WHERE ${sql}
    `;
    const result = await this.dbService.read(query, params);
    return result.map((row) => this.#rowToModel(row));
  }
}

Command Pattern

Ejemplo de uso del Command Pattern para implementar un comando en una el update de una aplicación:

import { ICommand, GeneralCommandManager } from '@codismart/architect-toolkit';

class UpdateExampleCommand implements ICommand {
  private oldExample: IExample;
  constructor(
    private id: string,
    private exampleNewData: Partial<IExample>,
    private repository: Repository<IExample>
  ) {}

  // metodo para ejecutar el comando
  async execute(): Promise<void> {
    this.oldExample = await this.repository.getById(this.id);
    await this.repository.update(this.id, this.exampleNewData);
  }

  // metodo para revertir los cambios
  async undo(): Promise<void> {
    await this.repository.update(this.id, this.oldExample);
  }
}

async function yourServideOrModule(exampleId: string, updateData: Partial<IExample>): Promise<void> {
  const productRepository = new ExampleRepository();
  const invoker = new GeneralCommandManager();

  const command = new UpdateExampleCommand(exampleId, updateData, productRepository);
  invoker.addCommand(command);

  await invoker.executeSingleCommand();
}