
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
TypeScript library for creating and manipulating strongly-typed relational tables.
relatix makes it easy to create and manipulate relational data in TypeScript.
Create, link, and query your tables effortlessly without compromising type safety. Its clear, intuitive syntax lets you define interconnected tables and populate them with consistent data thanks to strong typing of the initial state.
Install relatix using npm:
npm install relatix
Full documentation is available at relatixjs.github.io/relatix-docs
Define people, projects, and tasks with relationships in a type-safe manner:
import { Tables, Text, Number, Ref, SelfRef } from "relatix";
// 1. Define the Model Structure
const { tables, select, initIds } = Tables()
.addTables({
// Define standalone tables first
People: {
name: Text,
age: Number,
// Optional self-reference (e.g., manager, peer)
reportsTo: SelfRef as typeof SelfRef | null,
},
Projects: {
title: Text,
},
})
.addTables((Ref) => ({
// Define tables referencing existing ones
Tasks: {
title: Text,
assignedTo: Ref("People"), // Strongly-typed reference to People table
project: Ref("Projects"), // Strongly-typed reference to Projects table
},
}))
.populate(({ People, Projects }) => ({
// 2. Populate with Initial Data (Type-checked!)
People: {
alice: { name: "Alice", age: 30, reportsTo: null },
bob: { name: "Bob", age: 42, reportsTo: People("alice") }, // Refers to 'alice'
},
Projects: {
launch: { title: "Website Launch" },
},
Tasks: {
task1: {
title: "Design Homepage",
assignedTo: People("alice"), // Refers to 'alice'
project: Projects("launch"), // Refers to 'launch'
},
task2: {
title: "Develop API",
assignedTo: People("bob"), // Refers to 'bob'
project: Projects("launch"),
},
},
}))
.done(); // Finalize and get utilities
// 3. Use the Model & Utilities
const aliceId = initIds.People.alice; // Get Alice's generated ID
const aliceData = select.People.byId(tables, aliceId);
console.log(`Selected Person: ${aliceData?.d.name}`); // Output: Selected Person: Alice
// TypeScript Error Example:
// const invalidTask = { title: "Invalid", assignedTo: People("nonExistent"), project: Projects("launch") };
// The line above would cause a TypeScript error during '.populate' because "nonExistent" isn't defined.
deepSelect to retrieve entries with all nested references automatically resolved into full data objects.commit utility, ensuring data integrity.id and label generation using TableOptions for debugging or specific requirements.SelfRef) and multiple references between tables.FAQs
TypeScript library for creating and manipulating strongly-typed relational tables.
We found that relatix demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer 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
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.