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

easy-ini

v1.1.3

Published

manage ini files content

Downloads

9

Readme

Easy-INI - a simple way to manipulate INI files content

Table of Contents


Getting Started

why should you use this package?

  1. You don't want to manipulate an object and just use stright and forward methods (you can if you insist)
  2. You care about preserving comments
  3. You want easy formatting and cool logic like merge and replace

basic example

const INI = require('easy-ini')
const myINI = new INI('cool=awesome')
myINI.putStringInSection('; so important','[WOW]')
const giveItBack = myINI.createINIString()

Class Methods:

constructor(,{}) Create ini object

  • str,
  • optional: defSec = 'DEFAULT_SECTION!',
  • optional: eol = require('os').EOL)
  • optional: autoTrim = true
// You can start with an empty INI
const myINI = new INI('')

// By default the EOL is the taken from the OS, set it if needed
const myINI = new INI('',{eol: '\r\n'})

// DebSec is needed to represent the first lines that may not be under a section
// By default it's: [DEFAULT_SECTION!] , if for some reason you actually use this name for a section, provide another to avoid unwanted behavior
const myINI = new INI('',{defSec: 'NEXT_LEVEL_DEFAULT_SECTION'})

createINIString({}) Make an ini string from the object, every param is optional and do what it says

  • shouldTrim = false,
  • shouldFix = false,
  • cleanHashComments = false,
  • cleanBreakComment = false,
  • cleanEmptyLines = false,
  • noEmptySections = false,
  • noSections = false
// To get true representation use without any parameter
const newINIString = myINI.createINIString()

createSimpleObject() Make an Object including only they types that are specified

// by passing [3,4] , will also create a level for sections
const newINIString = myINI.createSimpleObject()

getKeyIfExists() Get line object by referance {type, key, val}

  • inputKey
// Changing the returned object will change the original
myINI.getKeyIfExists('cool').val = 'ouch'
// Returnes null if failed to find

findAndChangeKeyIfExists() finds a pair by key and replace value

  • inputKey,
  • inputValue = ''
// Same as using getKeyIfExists but without returning referance
myINI.findAndChangeKeyIfExists('cool','OUCH')
// Returnes true for success, otherwize false

findAndRemoveKeyIfExists() remove key value pair from object

  • inputKey
// Remove a pair (key=value) by matching the key with input string
myINI.findAndRemoveKeyIfExists('cool')
// Returnes true for success, otherwize false

removeEverythingButSections() remove all other sections

  • sections = []
  • partialMatch = false
// wanting to remove everything else
myINI.removeEverythingButSections(['[GLOBALS]'])
// can also be ussed for partial mataches
myINI.removeEverythingButSections(['GLOB'], true)

findAndRemoveSectionIfExists() remove entire section from object

  • sectionName
  • partialMatch = false
// Remove an entire section
myINI.findAndRemoveSectionIfExists('[DO_NOT_REMOVE]')
// Returnes true for success, otherwize false

putStringInSection() adds a line to the end of a section

  • string,
  • sectionName = this.defSecName
// If section does not exist, will create it at the end
myINI.putStringInSection('#comment','[BLAHBLAH]')
// If the input is a key=value pair, and key exists in section , will change its value
// Also true when no section is provided (will use default one)

getLinesByMatch() find all lines containing a string

  • token
// Will return an array with with all matches across all sections
myINI.getLinesByMatch('#INCLUDE=')

removeLineByMatch() matches keys, values or comments

  • token,
  • global = false,
  • _done = false (internal use)
// Will return true if at least one line was removed, else false
myINI.removeLineByMatch(';DUAH', true)

findAndReplace() searches for the token and replaces with the value if found

  • token,
  • value = '',
  • global = false,
  • _done = false (internal use)
// if global is false will change only the first occurrence
myINI.findAndReplace('<<BASE_DOMAIN>>', 'mashu-mashu-mashu.com', true)
// Will return true if at least one line was removed, else false

solveDuplicates() fixes ini object so and removes duplicate keys leaving first or last occurence

  • preferFirstOccurrence = false
// Will remove duplicate keys across the entire ini object
myINI.solveDuplicates()
// Returnes true when finished

solveSelfReferences() use values to replace matching content wrapped by a given prefix and suffix

  • prefix
  • suffix
/*  super_secret_config.ini:
        something=whatever
        say=ha
        dude=%say%%say%%say% %relax%
        relax=%something%               */

myINI.solveSelfReferences('%', '%')

/*  ==>
        something=whatever
        say=ha
        dude=hahaha whatever
        relax=whatever                  */

mergeWith() merges with another ini object

  • anotherINIObject
  • before = false
// If before is true will place new values at the beginning of each section
myINI.mergeWith(notMyINI)

Good To Know:

  1. the INI class accepets a string input for the constructor ( not a path to an ini file )
  2. the default section is a representation for the first lines that are not under any section (could be the whole file)
  3. considers text only lines as garbage
  4. You can edit myINI.iniData directly
  5. line types:
    • 0: empty line
    • 1: hash comment
    • 2: break comment
    • 3: section
    • 4: pair
    • 5: garbage

Use Case Examples:

handling ini dependency

const fs = require('fs')
const INI = require('easy-ini')
const productConfig = new INI(fs.readFileSync('./amazing_app_info.ini',{encoding: 'utf8'}))

let includes
while (includes = productConfig.getLinesByMatch("#INCLUDE")){
    if (includes.length == 0) {break}
    productConfig.removeLineByMatch('#INCLUDE', true)
    for (const include of includes.reverse()) {
        const includePath = include.split('=')[1]
        const tempINI = new INI(fs.readFileSync(includePath, {encoding: 'utf8'}))
        productConfig.mergeWith(tempINI, true)
    }
}
productConfig.solveDuplicates()
const finalConfig = productConfig.createINIString()
fs.writeFileSync("./final.ini", finalConfig)

ini template proccessing

const fs = require('fs')
const INI = require('easy-ini')
const webCon = new INI(fs.readFileSync('./website_config.ini',{encoding: 'utf8'}))
// latest=GGEZ.v69.zip
// download-url=<<SubDomain>>.<<BaseDomain>>/download/%latest%
webCon.findAndReplace('<<BaseDomain>>', 'easy-ini.com', true)
webCon.findAndReplace('<<SubDomain>>', 'download', true)
webCon.findAndReplace('<<Author>>', 'Gal Angel', true)
webCon.solveSelfReferences('%', '%')
const upCon = webCon.createINIString()
fs.writeFileSync("./to_upload.ini", upCon)

Author

License

GNU General Public License v3.0

Acknowledgments

  • stackOverflow
  • coffee
  • my cats