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

decorators-parser-js

v0.0.8

Published

### License © 2023 Smartschool Inc. All rights reserved.

Downloads

29

Readme

Decorators Parser

License

© 2023 Smartschool Inc. All rights reserved.

Installation guide

  1. Install NodeJS 18 or newer from https://nodejs.org/en/download
  2. Add NodeJS to PATH - example guide
  3. Run npm install "decorators-parser-js" in your command line

API

parse

function parse(file, data)

Parses given string or file and returns a list of dictionaries. If both file and data are provided, data will be ignored.

constructor

function constructor(constraints={}, ignored=[])

Creates a new Parser object. constraints is a dictionary of constraints for decorators. ignored is a list of decorators to ignore.

Decorators format

Decorator name can be any string that does not contain '@' character. If decorator does not satisfy this requirement InvalidDecoratorException will be thrown.

Example:

@decorator(some nice value)

Standard decorators

Decorators can be used in one of three ways:

@decorator(value)

or

@decorator()
Some very long and complicated value that would be hard to read if it were in parenthesis like the value above.

or

@decorator
Some very long and complicated value that would be hard to read if it were in parenthesis like the value above.

All of these create Javascript dictionary like this:

{
    'decorator': 'value'
}

@new decorator

Using @new decorator starts a new dictionary and adds it to the current list of dictionaries. In a single piece of text between two @new decorators (which correspond to a single JavaScript dictionary) there can not be two decorators with the same name. Using a same name without an appropriate @new decorator will result in DuplicateDecoratorException being thrown.

Example:

task.txt:

@question()
Who is Lincoln?

@new
@question()
What is the purpose of the Bill of Rights?

run.js:

import { Parser } from "decorators-parser-js"
let task_parser = new Parser()
console.log(task_parser.parse('task.txt'))

result:

[
    {
        'question': 'Who is Lincoln?'
    },
    {
        'question': 'What is the purpose of the Bill of Rights?'
    }
]

Global decorators

In addition to standard decorators, decorators which name starts with global- are added to each dictionary while parsing a file. Dictionary key is the decorator's suffix after global-

Example:

task.txt:

@global-topic(History)
@question()
Who is Lincoln?

@new
@question()
What is the purpose of the Bill of Rights?

run.js:

import { Parser } from "decorators-parser-js"
let task_parser = new Parser()
console.log(task_parser.parse('task.txt'))

result:

[
    {
        'topic': 'History',
        'question': 'Who is Lincoln?'
    },
    {
        'topic': 'History',
        'question': 'What is the purpose of the Bill of Rights?'
    }
]

Constraints

Decorators can use constraints on their values. If a decorator has value that does not match regular expression provided, Parser will throw InvalidValueException. Parser class takes optional constraints argument in its constructor which is a JavaScript dictionary in a format shown below (if format of the given dictionary is invalid, InvalidConstraintException will be thrown):

let example = {
    'question': 
    {
        'regex': '^([^@]+)$',
        'description': 'any non-empty string without @'
    },
    'correct':
    {
        'regex': '^([1-4])$',
        'description': 'any number from 1 to 4'
    }
}

Example 1

task.txt:

@correct(11)

run.js:

import { Parser } from "decorators-parser-js"
let task_parser = new Parser(example)
console.log(task_parser.parse('task.txt'))

Will result in the following output:

InvalidValueException [Error]: 'correct' should be any number from 1 to 4 but is 11

Example 2

If we take Example 1 but change task.txt file to:

correct(1)

The output will be:

[
    {
        'correct': '1'
    }
]

Ignored decorators

If you need to use @ symbol for something else than decorator, you can specify names to exclude from the search

Example:

task.txt:

@question
Some long question with @ref in it

run.js:

import { Parser } from "decorators-parser-js"
let task_parser = new Parser({}, ["ref"])
console.log(task_parser.parse('task.txt'))

Will result in the following output:

[
    {
        'question': 'Some long question with @ref in it'
    }
]