
Security News
Deno 2.4 Brings Back deno bundle, Improves Dependency Management and Observability
Deno 2.4 brings back bundling, improves dependency updates and telemetry, and makes the runtime more practical for real-world JavaScript projects.
componentsjs
Advanced tools
A semantic dependency injection framework
This repository contains the source code of Components.js. Full documentation on its usage can be found at http://componentsjs.readthedocs.io/.
Interested in contributing to this project? Have a look at this contribution guide.
Components.js is a dependency injection framework for TypeScript and JavaScript projects using JSON(-LD) files.
Instead of hard-wiring software components together, Components.js allows these components to be instantiated and wired together declaratively using semantic configuration files. The advantage of these semantic configuration files is that software components can be uniquely and globally identified using URIs.
Configurations can be written in any RDF serialization, such as JSON-LD.
This software is aimed for developers who want to build modular and easily configurable and rewireable JavaScript applications.
Get started with the TypeScript or JavaScript quick start guide below!
Components.js can be installed using npm:
$ npm install componentsjs
Component and module files can be automatically generated using Components-Generator.js:
$ npm install -D componentsjs-generator
package.json
:
{
"name": "my-package",
"version": "2.3.4",
"lsd:module": true,
"main": "index.js",
"types": "index.d.ts",
...
"scripts": {
...
"build": "npm run build:ts && npm run build:components",
"build:ts": "tsc",
"build:components": "componentsjs-generator",
"prepare": "npm run build",
...
}
}
"lsd:module"
will allow Components.js to find your module(s) when they are included from other packages.
The "scripts"
entry will make sure that all required component files will be generated when building your package.
The componentsjs-generator
will look for your compiled TypeScript files (.d.ts
) in the lib/
directory.
If you use a different output directory for TypeScript (e.g. dist/
), you must pass this to the generator using -s
flag (e.g. componentsjs-generator -s dist
).
Assuming a TypeScript class that is exported from the package:
export class MyClass {
public readonly name: string;
constructor(name: string) {
this.name = name;
}
}
config.jsonld
:
{
"@context": [
"https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^6.0.0/components/context.jsonld",
"https://linkedsoftwaredependencies.org/bundles/npm/my-package/^2.0.0/components/context.jsonld"
],
"@id": "urn:my-package:myInstance",
"@type": "MyClass",
"name": "John"
}
This configuration is a semantic representation of the instantiation of MyClass
with name
set to "John"
.
...
import { ComponentsManager } from 'componentsjs';
const manager = await ComponentsManager.build({
mainModulePath: __dirname, // Path to your npm package's root
});
await manager.configRegistry.register('config.jsonld');
const myInstance = await manager.instantiate('urn:my-package:myInstance');
...
myInstance
is an instance of type MyClass
, as defined in the config file.
After running npm run build
, you can now execute your program.
Components.js can be installed using npm:
$ npm install componentsjs
Assuming a JavaScript class that is exported from the package:
export class MyClass {
public readonly name;
constructor(name) {
this.name = name;
}
}
module.jsonld
:
{
"@context": [
"https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^6.0.0/components/context.jsonld",
{ "ex": "http://example.org/" }
],
"@id": "ex:MyPackage",
"@type": "Module",
"requireName": "my-package",
"components": [
{
"@id": "ex:MyPackage/MyClass",
"@type": "Class",
"requireElement": "MyClass",
"parameters": [
{ "@id": "ex:MyPackage/MyClass#name", "unique": true }
],
"constructorArguments": [
{ "@id": "ex:MyPackage/MyClass#name" }
]
}
]
}
The npm module my-package
exports a class with the name MyClass
.
The constructor of MyClass
takes a single name
argument.
config.jsonld
:
{
"@context": [
"https://linkedsoftwaredependencies.org/bundles/npm/componentsjs/^6.0.0/components/context.jsonld",
{
"ex": "http://example.org/",
"name": "ex:MyPackage/MyClass#name"
}
],
"@id": "http://example.org/myInstance",
"@type": "ex:MyPackage/MyClass",
"name": "John"
}
This configuration is a semantic representation of the instantiation of MyClass
with name
set to "John"
.
...
import { ComponentsManager } from 'componentsjs';
const manager = await ComponentsManager.build({
mainModulePath: __dirname, // Path to your npm package's root
});
await manager.configRegistry.register('config.jsonld');
const myInstance = await manager.instantiate('http://example.org/myInstance');
...
myInstance
is an instance of type MyClass
, as defined in the config file.
The ComponentsManager
can be customized with the following options:
const manager = await ComponentsManager.build({
// Absolute path to the package root from which module resolution should start.
mainModulePath: __dirname,
// Callback for registering components and modules
// Defaults to an invocation of {@link ComponentRegistry.registerAvailableModules}.
moduleLoader: (registry) => {},
// Callback for registering configurations.
// Defaults to no config registrations.
configLoader: (registry) => {},
// A strategy for constructing instances.
// Defaults to {@link ConstructionStrategyCommonJs}.
constructionStrategy: new ConstructionStrategyCommonJs(),
// If the error state should be dumped into `componentsjs-error-state.json` after failed instantiations.
// Defaults to `true`.
dumpErrorState: true,
// The logging level.
// Defaults to `'warn'`.
logLevel: 'warn',
// The module state.
// Defaults to a newly created instance on the {@link mainModulePath}.
moduleState: {},
// If JSON-LD context validation should be skipped.
// Defaults to `true`.
skipContextValidation: true,
// If values for parameters should be type-checked.
// Defaults to `true`.
typeChecking: true,
});
If you are using or extending Components.js as part of a scientific publication, we would appreciate a citation of our article.
@article{taelman_swj_componentsjs_2022,
author = {Taelman, Ruben and Van Herwegen, Joachim and Vander Sande, Miel and Verborgh, Ruben},
title = {Components.js: Semantic Dependency Injection},
journal = {Semantic Web Journal},
year = {2022},
month = jan,
url = {https://linkedsoftwaredependencies.github.io/Article-System-Components/}
}
Components.js is written by Ruben Taelman.
This code is copyrighted by Ghent University – imec and released under the MIT license.
FAQs
A semantic dependency injection framework
The npm package componentsjs receives a total of 17,408 weekly downloads. As such, componentsjs popularity was classified as popular.
We found that componentsjs demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Deno 2.4 brings back bundling, improves dependency updates and telemetry, and makes the runtime more practical for real-world JavaScript projects.
Security News
CVEForecast.org uses machine learning to project a record-breaking surge in vulnerability disclosures in 2025.
Security News
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.