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

@js.properties/properties

v0.5.4

Published

JavaScript .properties parser and stringifier

Downloads

144,008

Readme

@js.properties/properties

JavaScript .properties parser & stringifier

Build Status npm license

This is a parser and stringifier written in JavaScript and PEG.js for Java .properties file format, following the syntax defined in Java API Specification.

The parser can return parsed properties object (parse or parseToProperites) in a flat structure or a hierarchical namespaced structure, or return raw parsing result (parseToEntries) as an array of entry objects which have key, element, sep, indent, eol, original and location as keys.

As to the raw parsing result:

  • Each logical line of input .properties file is parsed into an object, with the original logical line, indent key sep element eol parts, and/or line location info optionally kept;
  • Properties with duplicate keys are kept in the raw output so that one can build high-level applications reporting them;
  • Blank and comment lines can be kept as well so that there is no info loss of the original file after parsing. This could be useful for something like .properties IDE.

The stingifier (stringify, stringifyFromProperties or stringifyFromEntries) effectively does the reverse of what the parser does.

Installation

npm install --save @js.properties/properties
# or
yarn add @js.properties/properties

Quick Example

example.properties:

# Comment here
hello = world

  foo : bar

demo.js (Node.js):

const fs = require('fs');
const Properties = require('@js.properties/properties');

const input = fs.readFileSync('example.properties', 'utf8');
const options = {   // options is optional
  all: true,        // Include empty and blank lines
  sep: true,        // Include separator in output
  indent: true,     // Include indentation in output
  eol: true,        // Include eol (end of line) in output
  original: true,   // Include original logical line in output
  location: true,   // Include location info in output
};
let output = Properties.parseToEntries(input, options);

demo.html (Browser):

<!-- @js.properties/properties is available as an UMD module. -->
<script src="properties.min.js"></script>
<script>
// Input can be entered manually or read via FileReader API
var output = Properties.parseToEntries('...');
</script>

Output with all options off:

[
  { "key": "hello", "element": "world" },
  { "key": "foo", "element": "bar" }
]

Output with all options on:

[
  {
    "key": null, "element": null,
    "sep": null, "indent": "", "eol": "\n",
    "original": "# Comment here",
    "location": {
      "start": { "offset":  0, "line": 1, "column":  1 },
      "end":   { "offset": 14, "line": 1, "column": 15 } }
  },
  {
    "key": "hello", "element": "world",
    "sep": " = ", "indent": "", "eol": "\n",
    "original": "hello = world",
    "location": {
      "start": { "offset": 15, "line": 2, "column":  1 },
      "end":   { "offset": 28, "line": 2, "column": 14 } }
  },
  {
    "key": null, "element": null,
    "sep": null, "indent": "", "eol": "\n",
    "original": "",
    "location": {
      "start": { "offset": 29, "line": 3, "column":  1 },
      "end":   { "offset": 29, "line": 3, "column":  1 } }
  },
  {
    "key": "foo", "element": "bar",
    "sep": " : ", "indent": "  ", "eol": "\n",
    "original": "  foo : bar",
    "location": {
      "start": { "offset": 30, "line": 4, "column":  1 },
      "end":   { "offset": 41, "line": 4, "column": 12 } }
  }
]

There is also a method parseToProperties(input) (alias parse) which generates output like:

{
  "hello": "world",
  "foo": "bar"
}

API

Method: parseToProperties(string [, options ])

Method Alias: parse(string [, options ])

Object: options

Option | Type | Description ----------- | ------- | ---- namespace | boolean | Parse dot separated keys as namespaced

All options default to false.

true and { '': true } can be used as a shortcut to turn on all options. { '': true, namespace: false } can be used to turn on all options except for those listed explicitly.

Returns: object

Throws: SyntaxError Invalid Unicode escape sequence

Method: parseToEntries(string [, options ])

Object: options

Option | Type | Description ---------- | ------- | ---- all | boolean | Include empty and blank lines sep | boolean | Include separator in output indent | boolean | Include indentation in output eol | boolean | Include eol (end of line) in output original | boolean | Include original logical line in output location | boolean | Include location info in output

All options default to false.

true and { '': true } can be used as a shortcut to turn on all options. { '': true, location: false } can be used to turn on all options except for those listed explicitly.

Returns: Array<PropertyEntry>

Object: PropertyEntry

Property | Type | Description ---------- | -------------- | ---- key | string | null | Property Key element | string | null | Property Element (value) sep | string | null | (optional) The separator of the property indent | string | (optional) The indentation of the property eol | string | null | (optional) The eol (end of line) of the logical line [*] original | string | (optional) The original logical line [*] containing the property location | Location | (optional) The start and end position of the logical line [*]

Note: key, element and sep will be null for blank and comment lines.

Note: indent is always a string, in the case of no indentation, it's an empty string.

Note: original is always a string, in the case of blank line, it's an empty string.

Note: eol will be null if this is the last line and contains no final eol.

[*] A logical line may spread across several natural lines if line continuation is involved.

Object: Location

{ start: Position, end: Position }

Object: Position

{ offset: number, line: number, column: number }

Method: stringifyFromProperties(object [, options ])

Turn properties object into .properties file string.

Method: stringifyFromEntries(Array<PropertyEntry> [, options ])

When stringifying from entries, if original is set in the entry, it's used; otherwise, property is computed from key, sep and element.

Method: stringify(object | Array<PropertyEntry> [, options ])

This is an alias for stringifyFromProperties and stringifyFromEntries depending on the type of arguments.

Object: stringify options

Option | Type | Default | Description ----------- | ------- | -------- | ---- sep | string | " = " | The separator to use [*] eol | string | "\r\n" | The eol (end of line) to use [*] namespace | string | "" | A namespace to prefix all keys [**]

[*] Thses options are used in stringify, stringifyFromProperties and stringifyFromEntries. In the case of stringifying from entries, option values are considered only if relevant field does not exist in the entry.

[**] Used only in stringify or stringifyFromProperties.


Development

Code Structure

@js.properties/properties
├── src            // Originally authored source code.
│   └── *.pegjs.js //   This one is an exception, generated by pegjs.
├── types          // TypeScript declaration files
├── cjs            // Generated by babel, spread in multiple files,
│                  //   in CommonJS format, for Node.js use.
├── umd            // Generated by webpack into a single file,
│                  //   in UMD format, for browser and Node.js.
└── test
    ├── data       // Test data, *.properties are authored
    │              //   and *.json are generated and compared
    ├── java       // Reference implementation in Java
    └── js         // Test code in JavaScript

Build

yarn run prepare
# or
npm run prepare

Test & Lint

yarn test
# or
npm test

Test Only

yarn tap
# or
npm tap

Update expected test output

yarn run tap:snapshot
# or
npm run tap:snapshot

Lint Only

yarn run lint
# or
npm run lint

LICENSE

The MIT License. See LICENSE file.