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

dom-component-parser

v1.0.0

Published

Extract nodes and corresponding custom options from the DOM

Downloads

10

Readme

dom-component-parser

Latest Version on NPM Software License Build Status

Sometimes you want to be able to quickly set up a JavaScript component in your DOM with some settings. Libraries like Vue.js provide a powerful API to create custom components, but is quite heavy for cases like mounting third party libraries to your DOM.

Say we want to mount a hypothetical Uploader component on all .js-uploader nodes:

<div
    class="js-uploader"
    data-url="http://my-site.com/upload1"
    data-multiple
></div>
<div
    class="js-uploader"
    data-url="http://my-site.com/upload2"
></div>

Now let's retrieve the DOM element and read out the options in JavaScript:

for (let element of document.querySelectorAll('.js-uploader')) {
    const url = element.getAttribute('data-url');
    const multiple = element.getAttribute('data-multiple') === '' ? true : false;

    if (!url) throw new Error();

    new Uploader(element, { url, multiple });
}

The dom-component-parser cleans up the above process by declaring a component name and options object shape.

import component from 'dom-component-parser';

component('uploader', {
    url: 'required', // `required` is a special flag, will throw an error if missing
    multiple: false, // Defaults to false
}).forEach(({ element, options }) => new Uploader(element, options));

Install

You can install the package via npm:

$ npm install dom-component-parser

Usage

Retrieving Components

The component method always returns an array of results. Components are queried for a class with their names prefixed by js-, e.g. a component named my-uploader expects an element with a js-my-uploader class.

<div class="js-my-uploader" data-upload-url="http://example.com"></div>
import component from 'dom-component-parser';

const myUploaders = component('my-uploader');
// => [ { element: <Element>, options: {} } ]

Declaring Component options

Component options are declared as objects, and map to the component's data attributes. The attribute's corresponding value provided in the script will be used as the default value if it's omitted from the DOM element. Camel-cased object keys will look for a snake-cased data attributes.

<div class="js-my-uploader"></div>
<div class="js-my-uploader" data-upload-url="http://my-site.com/upload"></div>
const myUploaders = component('my-uploader', { uploadUrl: 'http://example.com' });
// [ { element: <Element>, options: { uploadUrl: 'http://example.com' } },
//   { element: <Element>, options: { uploadUrl: 'http://my-site.com/upload' } } ]

There's also a special required keyword, which will throw an error if the data attribute is missing.

<div class="js-my-uploader"></div>
const myUploaders = component('my-uploader', { uploadUrl: 'required' });
// Error: Option `required` is missing on component `my-uploader`

Attributes without values will be casted to true.

<div class="js-my-uploader"></div>
<div class="js-my-uploader" data-multiple></div>
const myUploaders = component('my-uploader', { multiple: false });
// [ { element: <Element>, options: { multiple: false } },
//   { element: <Element>, options: { multiple: true } } ]

Change log

Please see CHANGELOG for more information what has changed recently.

Testing

$ npm run test

Contributing

Please see CONTRIBUTING for details.

Security

If you discover any security related issues, please contact Sebastian De Deyne instead of using the issue tracker.

Credits

About Spatie

Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.

License

The MIT License (MIT). Please see License File for more information.