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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rdfjs/wrapper

v0.32.0

Published

RDF/JS object mapping library

Downloads

417

Readme

RDF/JS Wrapper

Test Workflow npm

An RDF/JS object mapping library.

Purpose

The purpose of the RDF/JS Wrapper library is to enable idiomatic JavaScript object-oriented programming over RDF with type system support (TypeScript compatible).

In other words, RDF data is abstracted away and developers can define standard mapping classes to program over it.

Additionally, standard mapping classes can be defined and reused in any number of context where they are relevant (see for example @solid/object).

How To?

Publish the package

  1. Run npm version major | minor | patch locally (see npm-version)
  2. Draft a new release
  3. The Continuous Deployment action will be triggered and automatically publish to npm

Background

RDF/JS Wrapper uses the interfaces described in the RDF/JS specifications.

Practically, to map RDF to objects, you need to:

  1. Write a class or use an existing class that extends TermWrapper
  2. Each class needs a Term, a Dataset, and a DataFactory to be instantiated
  3. Each class property will have an associated RDF Property (a string, generally a URL, that is defined by an ontology/vocabulary)
  4. Each class property will have an associated arity (singular, singular nullable or set)
  5. Each class property depending on its type can have:
    1. a corresponding ValueMapping to get values, that is translating RDF Terms to JavaScript primitive values (string, number, boolean...)
    2. a corresponding TermMapping to set values, that is translating Javascript primitive values to RDF Terms
    3. a corresponding ObjectMapping to wrap child objects as a TermWrapper
    4. a corresponding ValueMapping and TermMapping for sets of primitive values (both can be an ObjectMapping)
  6. Each class mutates the underlying Dataset that is passed to it at instantiation time

Wrapping RDF

In order to wrap RDF, one needs an underlying data structure. Therefore, both TermWrapper and DatasetWrapper take an RDF/JS Dataset and Datafactory as constructor parameters.

Wrapping Terms

Term wrapping lets you manipulate data in a graph via class properties.

A term wrapper instantiates a class from a term.

For example you can write a Person class with one name property:

import { TermWrapper, ValueMapping, TermMapping } from "https://unpkg.com/@rdfjs/wrapper"

class Person extends TermWrapper {
	get name() {
		return this.singularNullable("https://example.org/name", ValueMapping.literalToString)
	}

	set name(value) {
		this.overwriteNullable("https://example.org/name", value, TermMapping.literalToString)
	}
}

Assuming the following RDF has been loaded in a dataset dataset_x:

PREFIX ex: <https://example.org/>

ex:person1 ex:name "Alice" .

Class usage:

const person1 = new Person("https://example.org/person1", dataset_x, DataFactory)

// Get property
console.log(person1.name)
// outputs "Alice"

// Set property
person1.name = [...person1].reverse().join("")
console.log(person1.name)
// outputs "ecilA"

Wrapping Datasets

Dataset wrapping lets you find data in a graph that is meant to be wrapped.

For example, you can write a People dataset wrapper to find each Person in a graph:

class People extends DatasetWrapper {
	[Symbol.iterator]() {
		return this.subjectsOf("https://example.org/name", Person)
	}
}

Assuming the following RDF has been loaded in a dataset dataset_y:

PREFIX ex: <https://example.org/>

ex:person1 ex:name "Alice" .
ex:person2 ex:name "Bob" .

Dataset Wrapper usage:

const people = new People(dataset_y, DataFactory)

for (const person of people) {
	console.log(person.name)
}
// outputs
// Alice
// Bob

Wrapping objects

For example you can write a Person class with one name and one mum property:

import { TermWrapper, ValueMapping, TermMapping, ObjectMapping } from "https://unpkg.com/@rdfjs/wrapper"

class Person extends TermWrapper {
	get name() {
		return this.singularNullable("https://example.org/name", ValueMapping.literalToString)
	}

	set name(value) {
		this.singularNullable("https://example.org/name", value, TermMapping.literalToString)
	}

	get mum() {
		return this.singularNullable("https://example.org/mum", ObjectMapping.as(Person))
	}

	set mum(value) {
		this.overwriteNullable("https://example.org/mum", value, ObjectMapping.as(Person))
	}
}

Assuming the following RDF has been loaded in a dataset dataset_z:

PREFIX ex: <https://example.org/>

ex:person1 ex:name "Alice" .

ex:person2
	ex:name "Bob" ;
	ex:mum ex:person2 ;
.

Class usage:

const person2 = new Person("https://example.org/person2", dataset_z, DataFactory)

// Get property
console.log(person2.name)
// outputs "Bob"

// Get property from child class
console.log(person2.mum.name)
// outputs "Alice"

// Set class properties
const person3 = new Person("https://example.org/person3", dataset_z, DataFactory)
person3.name = "Joanne"
person1.mum = person3
console.log(person1.mum.name)
// outputs "Joanne"
console.log(person2.mum.mum.name)
// outputs "Joanne"

See also

License

This work is dual-licensed under MIT and Apache 2.0. You can choose between one of them if you use this work.

SPDX-License-Identifier: MIT OR Apache-2.0