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

@nik-kita/typeorm-single-table-inheritance-decorators

v1.0.5

Published

> _This is amateur library. Use it on your own risk_

Downloads

6

Readme

About

This is amateur library. Use it on your own risk

STI or Single Table Inheritance is the cool feature in Typeorm that allow you to define many abstractions with common properties etc. under the one table.

It is absolutely your choose are you need this feature and so on... But if you want to use it, you may meet some problems with difference behavior if it was not inherited child table-abstractions but real tables.

The common example is NOT NULL constraint. Because only one child has some property other child will always have NULL for it. So how define this constraint particularly for special child?

One of the solutions is to use @Check decorator with custom constraint logic. For example in our case it should be something like:

@Column()
@Check("type = 'OurChildType' AND onlyInThisChildProp IS NOT NULL")
onlyInThisChildProp: string;

But you see that there are a lot of manual code and raw sql etc. So this is what this package do. It simply encapsulate these all for you.

Full example of usage, copied from test's fixtures:

/* eslint-disable max-classes-per-file */
import {
    ChildEntity, Column, Entity, PrimaryGeneratedColumn, TableInheritance,
} from 'typeorm';
import { NotNullForChildTypes } from '@nik-kita/typeorm-single-table-inheritance-decorators/with-snake-strategy';

export const stiTableName = 'sti_family' as const;

// eslint-disable-next-line no-shadow
export enum TestStiChildEnum {
SON = 'Son',
DAUGHTER = 'Daughter',
BROTHER = 'Brother',
SISTER = 'Sister',
}

@TableInheritance({
    column: {
        name: 'type',
        type: 'enum',
        enum: [TestStiChildEnum.SON, TestStiChildEnum.DAUGHTER, TestStiChildEnum.BROTHER, TestStiChildEnum.SISTER],
    },
})
@Entity(stiTableName)
export abstract class TestStiParent {
@PrimaryGeneratedColumn('uuid')
id!: string;

@Column({
    nullable: true,
})
common?: string;

@Column({
    nullable: true,
})
@NotNullForChildTypes([TestStiChildEnum.BROTHER, TestStiChildEnum.SISTER])
car?: string;
}

@ChildEntity(TestStiChildEnum.BROTHER)
export class TestStiBrother extends TestStiParent {
}

@ChildEntity(TestStiChildEnum.SISTER)
export class TestStiSister extends TestStiParent {
}

@ChildEntity(TestStiChildEnum.SON)
export class TestStiSon extends TestStiParent {
@Column({
    nullable: true,
})
@NotNullForChildTypes([TestStiChildEnum.SON])
lego?: string;
}

@ChildEntity(TestStiChildEnum.DAUGHTER)
export class TestStiDaughter extends TestStiParent {
@Column()
barby?: string;
}

Bla bla bla...

  • You see that the same functional is exists in many variants:
    • for default (raw) naming, when your class's property firstName will stored in database as firstname of you may be implicitly define class's name in sql convention like first_name...
    • for "snake" naming strategy getted from this package