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 🙏

© 2025 – Pkg Stats / Ryan Hefner

limitlessfs

v1.3.0

Published

Custom configuration file reader

Readme

limitlessfs

Leitor de arquivo de configuração personalizado para Node.js

Instalação

$ npm i limitlessfs

Como usar

Exemplo do uso:

const limitlessfs = require('limitlessfs')

limitlessfs._config = {
  _true: 'sim',
  _false: 'nao',
  _blocks: [
    /* Configuração das linhas do seu arquivo */
  ]
}

limitlessfs._read('./arquivo.txt') // Caminho do seu arquivo de configuração

// Após o _read() a constante será convertida em um objeto, com os valores que você definiu no "_blocks"
console.log(limitlessfs)

DICA: O objeto "._config" por vezes, pode ficar extenso dependendo da quantidade de linhas que o seu arquivo de configuração tem. Por esse motivo, é aconselhado, definir toda a configuração do limitlessfs em um arquivo separado da sua aplicação para não misturar com o seu código, e depois importá-lo em seu projeto.

Exemplo:

// Arquivo configureLimitlessfs.js

const limitlessfs = require('limitlessfs')

limitlessfs._config = {
  _true: 'sim',
  _false: 'nao',
  _blocks: [
    /* Configuração das linhas... */
  ]
}

limitlessfs._read('./arquivo.txt')

// Permitindo a exportação...
module.exports = limitlessfs
// No seu Projeto...

const limitlessfs = require('./configureLimitlessfs')

// A constante está pronta para ser usada como objeto na sua Aplicação
console.log(limitlessfs)

Dessa maneira todas as configurações não ficam juntas da sua aplicação :relaxed:

.config = { attributes... }

limitlessfs.config = {
  /* Sua opções do config aqui... */
  _blocks: []
}

O objeto .config é o principal atributo para configurar o limitlessfs, é através dele que você tem acesso ao atributo _blocks que define a leitura das linhas do seu arquivo, o .config também tem várias opções para personalizar a leitura do arquivo, são elas:

  • _separator: String ~ Array | Caractere que separa os atributos dos valores do arquivo. Default: :
  • _true: String ~ Array | Valor considerado como o true. Default: yes
  • _false: String ~ Array | Valor considerado como o false. Default: no
  • _split: String ~ Array | Caractere que separa os valores de um Array. Default: ,
  • _ignoreCharacter: String ~ Array | Caracteres a serem ignorados e removidos antes da leitura do arquivo.
  • _removeQM: Boolean | Remover todas as "aspas" (simples e duplas) do arquivo antes da leitura. Default: false
  • _ignoreCaseInSplit: Boolean | Não considera o Case-sensitive nos valores que separam um Array. Default: true
  • _blocks: Array | Obrigatório Configura os parâmetros para a leitura dos valores do arquivo.

Nota sobre o _removeQM

Se o _removeQM for definido true e no arquivo existir uma linha com a entrada: '' (Vazia com aspas), como o _removeQM remove todas as aspas antes da leitura das linhas, o valor da entrada será considerado null e não uma "string vazia"

_blocks: [ Objects... ]

O _blocks é o responsável por saber como ler o seu arquivo. Ele é um Array onde cada index é responsável por uma linha do arquivo, e os index são preenchidos com um Objeto que leva as configurações.

_blocks: [
  {
    line:
    render:
    value:
    require:
    default:
    caseSensitive:  
  },
  ...]

Apenas os atributos line e render são obrigatórios, o restante das opções são opcionais.

  • line: String ~ Array | A linha no seu arquivo que leva o(s) valor(es). (Antes do _separator)
  • render: String | O nome da linha que será "renderizado" no Objeto final.
  • value: Property | Os valores são: String, Number, Array, Boolean, null. É o tipo do valor a ser atribuido a linha. Caso esse atributo não seja definido, o próprio limitlessfs buscará tipo do valor.
  • require: Boolean | Se a linha é obrigatória ou não. Default: true
  • default: Any | O valor padrão a ser atribuido, caso a linha não tenha sido escrita no arquivo.
  • caseSensitive: Boolean | Se o limitlessfs respeitará a diferença entre letras maiúsculas e minúsculas dos valores da linha, e não converterá todos os valores para minúsculo (padrão). Default: false

Nota Importante sobre o line

Para facilitar a leitura dos atributos das linhas no arquivo, por padrão o limitlessfs retira todas as acentuações e cedilha nos atributos e nas entradas do line, e converte tudo para letras minúsculas. Sendo assim, você pode escrever da maneira que desejar nas entradas do line, sem se preucupar com Case Sensitive ou acentuação.

Nota sobre o require e default

Pode ocorrer uma situação em que se define uma linha como "require: false" e não passa o valor de "default" para a linha, nesse caso, se a linha não for escrita ou esteja sem valor, o limitless atribuirá o valor de null

Mensagens e outras opções

É possível personalizar as mensagens de erros e alertas que aparecem no console, você pode acessar as mensagens através do atributo __msg.<nomeDaMsg>. O limitlessfs possui três mensagens de erro e duas de alerta:

/* Mensagens de Erro: */
limitlessfs.__msg = {
  fileNotFound: 'File "{0}" not found. Check file local',
  lineRequire: 'Line {0} Required!',
  errorLineParam: 'ERROR in param value "{0}", on line: {1}'
}

/* Mensagens de Alerta: */
limitlessfs.__msg = {
  emplyLineParam: 'WARN: Line ({0}) param value: "{1}". Converted for {2}',
  emplyLineParamSetted: 'WARN: Line ({0}) with defined value has a "{1}" parameter. Converted for default value.'
}

IMPORTANTE: Esteja ciente que os números dentro de chaves {0}, {1} e {2} são parâmentos é não devem ser removidos, de resto você pode fazem qualquer alteração na string.

// Exemplo, modificando uma mensagem:
limitlessfs.__msg.lineRequire = 'Linha {0} é obrigatória!'

Opções e Valores defaults

Através do atributo __defaultValues.<nomeDaPropriedade>, você pode manipular alguns comportamentos padrão do limitlessfs, segue toda a lista de propriedades acessíveis do __defaultValues:

limitlessfs.__defaultValues = {
  // Valores default do "_config = {}"
  _separator: ':',
  _removeQM: false,
  _ignoreCharacter: '',
  _split: ',',
  _true: 'yes',
  _false: 'no',
  _ignoreCaseInSplit: true,
  
  // Valores default para o tipo do "value" para um linha ausente e que não é obrigatória
  array: [],
  string: '',
  number: 0,
  boolean: false,

  // Valor default para uma linha ausente, sem o atributo "value" definido
  emplyLineParam: null,

  // Padrão de Identificação para uma linha de comentário. (você pode adicionar um Array de valores)
  comment: '>>',

  // Exibir ou ocultar as mensagens de "Alertas" no console.
  hideWarnMsg: false,

  // Tipo de encoder para ler o arquivo de configuração.
  encode: null
}

Exemplo, modificando uma propriedade default:

limitlessfs.__msg.hideWarnMsg = true

._read( filename , encode )

O _read() deve ser chamado sempre depois de todas as configurações. Ele pode receber duas entradas, o nome do arquivo para fazer a leitura (Obrigatório) e o tipo de codificação (Opcional). Veja o exemplo:

limitlessfs._read('meuArquivo.txt', 'ascii')

Curiosidade:

O limitlessfs também lê arquivos .json

Exemplo completo

Veja o exemplo de uma configuração completa de uma aplicação para gerar sequências aleatórias, e o arquivo .txt que é possível ler, aplicando essas configurações:

Arquivo texto de configuração da aplicação - entradas.txt:

## Arquivo de Configuração da Aplicação "rands.js"

>> BASE...
   Números a cercar    = 1 até 31
   Iteração            = 1
   Comprimento do jogo = 20

>> DETALHES...
   Números fixos         : 
   Números excluídos     : 
   Combinações a excluir = ''

>> PERSONALIZAÇÃO...
   Números ordenados                = sim
   Pode repetir combinações?        = não
   Abrir arquivo quando finalizar!? = sim

>> FINALIZAÇÃO...
   Total de combinações  : 100
   Nome do arquivo final = Loterias

Arquivo JS de configuração separado do limitlessfs - configLimitlessfs.js:

const limitlessfs = require('limitlessfs')

// Personalizar as mensagens de ATENÇÃO e ERRO:
aijr.__msg.fileNotFound = 'Não encontrou o arquivo {0}'
aijr.__msg.lineRequire = 'Coloque a linha "{0}" ai'
aijr.__msg.emplyLineParam = 'ATENÇÃO: A linha ({0}) está "{1}". O valor será convertido para "{2}"'
aijr.__msg.errorLineParam = 'ERRO no valor "{0}", passado como parâmetro da linha: {1}'
aijr.__msg.emplyLineParamSetted = 'AVISO: A linha ({0}) de valor definido está "{1}". O valor será convertido para o "valor padrão".'

// Personalizar as tags de comentário:
limitlessfs.__defaultValues.comment = ['##','>>']

limitlessfs._config = {
  _separator: ['=',':'], // Como o arquivo txt tem dois tipos de separador, passamos os dois
  _true: 'sim', // Reconhecer o tipo True
  _false: 'nao', // Reconhecer o tipo False
  _split: [' ate ',',',' a '], // Passando os separadores de Array
  _ignoreCharacter: ['?','!'], // Strings que serão ignoradas/removida da leitura no arquivo
  _blocks: [
  {
    line: 'numeros a cercar', // Identificando a linha
    render: 'range', // Passando qual o nome do atributo no Objeto final. Ex: limitlessfs.range
    value: Array // Tipo do valor do atributo
  },
  {
    line: ['iteracao','pulo','avanco','sequencia'],
    render: 'sequential',
    value: Number,
    require: false, // Informando que essa linha não será obrigatória 
    default: 1 // O valor default do atributo, caso a linha não seja escrita
  },
  {
    line: 'numeros fixos',
    render: 'fixedNum',
    value: Array,
    require: false,
  },
  {
    line: ['numeros excluidos','numeros a excluir','numeros removidos','numeros a remover'],
    render: 'excludeNum',
    value: Array,
    require: false,
  },
  {
    line: ['combinacoes a excluir','combinacoes excluidas','combinacoes para excluir'],
    render: 'excludeCombinations',
    require: false,
  },
  {
    line: ['comprimento do jogo','comprimento do cartao'],
    render: 'width',
  },
  {
    line: ['total de combinacoes','total de jogos'],
    render: 'total',
    require: false,
    default: 1
  },
  {
    line: ['numeros ordenados','em ordem'],
    render: 'sorted',
    require: false,
  },
  {
    line: ['pode repetir combinacoes','pode ter combinacoes repetidas'],
    render: 'norepeat',
    require: false,
  },
  {
    line: ['nome do arquivo final','nome final do arquivo','arquivo de saida'],
    render: 'filename',
    // Por ser um nome, informando que o valor dessa linha deve ser preservado o Case Sensitive
    caseSensitive: true,
    require: false,
    default: 'rand'
  },
  {
    line: ['abrir arquivo quando finalizar','abrir ao finalizar'],
    render: 'openfileFinished',
    require: false,
  }]
}

limitlessfs._read('../entradas.txt')
module.exports = limitlessfs

Arquivo da Aplicação - rands.js:

const config = require('./configLimitlessfs')

console.log(config)
// Resultado no console:
{
  range: [ 1, 31 ],
  sequential: 1,
  fixedNum: [],
  excludeNum: [],
  excludeCombinations: '',
  width: 20,
  total: 100,
  sorted: true,
  norepeat: false,
  filename: 'Loterias',
  openfileFinished: true
}