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

@zeedhi/zeedhi-miragejs

v1.2.11

Published

Customizable Miragejs server for Zeedhi Next apps

Downloads

18

Readme

Zeedhi MirageJS

Servidor MirageJS customizável, criado para aplicações Zeedhi Next

Instalação

Para instalar, rode o seguinte comando:

npm install @zeedhi/zeedhi-miragejs

Configuração

Primeiramente, precisamos configurar as rotas do servidor. Elas são configuradas como objetos js que seguem a interface IRouteConfig, que pode ser encontrada ao final da documentação. Existem 3 tipos de rota:

Rota Estática

Para criar uma rota estática, crie um objeto usando a interface IRouteConfig e defina a propriedade route com o nome da rota. Depois, defina a propriedade staticRoute como true:

import { IRouteConfig } from '@zeedhi/zeedhi-miragejs';

const user: IRouteConfig = {
  route: 'users',
  staticRoute: true,
}

Agora precisamos inserir dados nessa rota. Isso é feito na propriedade data, que recebe um array de objetos.

Importante: todo objeto deve ter uma coluna id

import { IRouteConfig } from '@zeedhi/zeedhi-miragejs';

const user: IRouteConfig = {
  route: 'users',
  staticRoute: true,
  data: [
    {
      id: '1',
      first_name: 'Foo',
      email: '[email protected]',
    },
    {
      id: '2',
      first_name: 'Bar',
      email: '[email protected]',
    },
    {
      id: '2',
      first_name: 'Baz',
      email: '[email protected]',
    },
  ],
};

Rota Dinâmica

Rotas dinâmicas permitem criar múltiplos objetos com uma configuração mínima. Para criá-la, defina a propriedade count (o número total de linhas) e a propriedade columns.

Na propriedade columns será feita a configuração das colunas da rota. Ela recebe um dicionário de objetos, em que o nome da coluna é definido pela chave do objeto.

A propriedade type define o tipo de cada coluna, e aceita os seguintes valores: int, string, float e date.

int

Colunas do tipo int serão números inteiros. Devemos utilizar o símbolo %s na propriedade value, e esse símbolo será posteriormente substituído pelo id da linha.

Ex:

{
  id: {
    type: 'int',
    value: '%s',
  }
}
// Resultará em: 1, 2, 3, 4, ...
{
  id: {
    type: 'int',
    value: '100%s',
  }
}
// Resultará em: 1001, 1002, 1003, 1004, ...

string

Colunas do tipo string funcionam de forma semelhante à int, porém aceita strings.

Ex:

{
  first_name: {
    type: 'string',
    value: 'User %s',
  }
}
// Resultará em: User 1, User 2, User 3, User 4, ...

float

Colunas do tipo float serão números aleatórios. É possível definir o número mínimo, máximo e a precisão das casas decimais, utilizando as propriedades min, max e precision, respectivamente

Ex:

{
  salary: {
    type: 'float',
    min: 1000,
    max: 10000,
    precision: 2,
  }
}
// Resultará em: 8067.01, 4126.8, 7665.45, 3099.1, ...

date

Colunas do tipo date irão gerar datas aleatórias no formato YYYY-MM-DD:

Ex:

{
  hire_date: {
    type: 'date',
  }
}
// Resultará em: 2020-12-23, 2017-02-18, 2020-08-11, 2021-09-11, ...

Foreign Key

Uma coluna pode ser definida como sendo uma Foreign Key, basta definir a propriedade foreignKey como true e a propriedade table com o nome da tabela que ela referencia.

Ex:

{
  department_id: {
    type: 'int',
    foreignKey: true,
    table: 'department',
  }
}

Exemplo Completo

O exemplo abaixo ilustra todas as configurações possíveis de uma rota dinâmica.

Obs: será necessário também criar uma rota department para o exemplo funcionar corretamente.

import { IRouteConfig } from '@zeedhi/zeedhi-miragejs';

const user: IRouteConfig = {
  route: 'users',
  exact: false,
  count: 100,
  columns: {
    id: {
      type: 'int',
      value: '%s',
    },
    first_name: {
      type: 'string',
      value: 'User %s',
    },
    department_id: {
      type: 'int',
      foreignKey: true,
      table: 'department',
    },
    salary: {
      type: 'float',
      min: 1000,
      max: 10000,
      precision: 2,
    },
    hire_date: {
      type: 'date',
    },
  },
};

Rota Externa

Rotas externas utilizam de APIs já existentes para criar datasets baseados nelas. Durante a criação do servidor, será realizada uma requisição automática para buscar os dados externos, que serão formatados da forma necessária.

Para criar uma Rota Externa, defina a propriedade externalApi como true, a propriedade apiUrl contendo a URL dos dados externos, e a propriedade dataColumn especificando qual coluna da Response contém os dados. Por exemplo, se a requisição retornar:

{
  "page": 1,
  "total": 500,
  "results": [...]
}

A propriedade dataColumn deve ser definida como results.

A configuração das colunas segue um formato parecido com o das Rotas Dinâmicas. Aqui, devemos utilizar a propriedade location para definir o caminho para os dados dentro do objeto retornado.

Por exemplo, se a requisição retornar os dados no seguinte formato:

{
  "results": [
    {
      "gender": "male",
      "name": {
        "title": "Mr",
        "first": "Bento",
        "last": "Rezende"
      },
      "email": "[email protected]",
      "login": {
        "uuid": "2d15994b-0f51-4524-ab85-8332eccec216",
      },
    },
  ],
}

Podemos ver que alguns dados estão dentro de objetos. Para formatar esses dados de uma forma aceitável pelo Zeedhi Next, devemos usar a propriedade location para cada coluna:

import { IExternalColumn, IRouteConfig } from '@zeedhi/zeedhi-miragejs';

const user: IRouteConfig<IExternalColumn> = {
  route: 'users',
  externalApi: true,
  apiUrl: 'https://randomuser.me/api/?results=1000&nat=br',
  dataColumn: 'results',
  columns: {
    id: {
      location: ['login', 'uuid'],
    },
    first_name: {
      location: ['name', 'first'],
    },
    last_name: {
      location: ['name', 'last'],
    },
    email: {
      location: ['email'],
    },
    gender: {
      location: ['gender'],
    },
  },
};

/* Resultará em:
[
  {
    id: "2d15994b-0f51-4524-ab85-8332eccec216",
    first_name: "Bento",
    last_name: "Rezende",
    email: "[email protected]",
    gender: "male"
  }
]
*/

Inicialização do Servidor

O servidor é inicializado pela função makeServer. Essa função recebe por parâmetro um objeto que segue a interface IServerParams:

IServerParams

Nome | Tipo | Descrição
----------|--------------------------------|--------------------------------------------------------------------------------------------------------------- config | IDictionary<IRouteConfig> | Dicionário contendo os objetos de configuração de cada rota criados conforme a seção anterior
endpoint | string | A url base do servidor. Normalmente será utilizado o `Config.endPoint`
logging | boolean | undefined | Define se o servidor deve exibir os logs de cada requisição no console
timing | number | undefined | Configuração de delay de cada requisição. Mude esse valor caso queira testar o desempenho em conexões lentas

No exemplo abaixo, o servidor será criado com as rotas users (estática) e departments (dinâmica). É possível melhorar a legibilidade desse código separando cada rota em um módulo.

Ex:

import { Config, IDictionary } from '@zeedhi/core';
import { makeServer, IRouteConfig } from '@zeedhi/zeedhi-miragejs';

const user: IRouteConfig = {
  route: 'users',
  staticRoute: true,
  data: [
    {
      id: '1',
      first_name: 'Foo',
      email: '[email protected]',
    },
    {
      id: '2',
      first_name: 'Bar',
      email: '[email protected]',
    },
    {
      id: '2',
      first_name: 'Baz',
      email: '[email protected]',
    },
  ],
};

const department: IRouteConfig = {
  route: 'departments',
  count: 20,
  columns: {
    id: {
      type: 'int',
      value: '%s',
    },
    name: {
      type: 'string',
      value: 'Department %s',
    },
  },
};

const serverConfig: IDictionary<IRouteConfig<any>> = {
  user,
  department,
};

/**
 * Mude a propriedade logging para false para remover os logs do console
 */
makeServer({ endpoint: Config.endPoint, config: serverConfig, logging: true });

Configuração Adicional (Axios)

O pacote @zeedhi/zeedhi-core utiliza o axios na versão 0.21.4, o que o torna incompatível com o MirageJS.

Para corrigir esse problema será necessário instalar (ou criar) um custom adapter do axios:

npm install @zeedhi/axios-mirage-adapter

E podemos utilizar esse adapter a partir dos Interceptors:

import { Config, Interceptor } from '@zeedhi/core';
import { makeServer } from '@zeedhi/zeedhi-miragejs';
import serverConfig from '@/server/config';
import adapter from '@zeedhi/axios-mirage-adapter';

Interceptor.addRequestSuccess((config) => ({ ...config, adapter }));

makeServer({ endpoint: Config.endPoint, config: serverConfig });

Interfaces

IRouteConfig<T = IDataColumn>

Nome | Tipo | Descrição
-------------|------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- apiUrl | string | undefined | Url da API externa
count | number | undefined | Número de linhas que serão geradas pela rota dinâmica
columns | IDictionary | undefined | Configuração das colunas de rotas dinâmicas ou externas
data | IDictionary[] | undefined | Dados da rota caso ela seja estática
dataColumn | string | undefined | Nome da coluna onde estão os dados da api externa
exact | boolean | undefined | Define se a rota utilizará filtros exatos ou não. Filtros exatos só retornam dados que estejam de acordo com todos os filtros passados, enquanto os não exatos retornam dados que cumpram apenas 1 dos filtros externalApi | boolean | undefined | Define se a rota usará uma api externa
route | string | Nome da rota
staticRoute | boolean | undefined | Define se a rota é estática

IExternalColumn

Nome | Tipo | Descrição
------------|----------------------|-------------------------------------------------------------------------------------------------------------------------- location | string[] | Array de strings contendo o caminho para uma propriedade dentro do objeto retornado pela API
showOnList | boolean | undefined | Define se a coluna deverá ser retornada junto com os outros dados. Se for false, a coluna servirá apenas como filtro

IDataColumn

Nome | Tipo | Descrição
------------|----------------------|-------------------------------------------------------------------------------------------------------------- foreignKey | boolean | undefined | Define se a coluna é chave estrangeira de alguma outra rota
max | number | undefined | Valor máximo retornado caso a coluna seja do tipo float
min | number | undefined | Valor mínimo retornado caso a coluna seja do tipo float
precision | number | undefined | Precisão das casas decimais
showOnList | boolean | undefined | Define se o campo deverá ser retornado pela requisição. Se for false a coluna servirá apenas como filtro table | string | undefined | Define a tabela referenciada pela coluna caso ela seja foreignKey
type | string | Tipo da coluna
value | string | undefined | Valor da coluna usado pelos os tipos int e string