typestack/class-sanitizer is one of the UI-focused repositories TopGit tracks, currently at 100 stars, written primarily in TypeScript. Decorator based class property sanitation in Typescript.
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
WHY NO REVIEW YET
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
Decorator based class property sanitation in Typescript powered by validator.js.
DEPRECATION NOTICE:
This library is considered to be deprecated and won't be updated anymore. Please use the class-transformer and/or class-validator libraries instead.
Installation
npm install class-sanitizer --save
Usage
To start using the library simply create some classes and add some sanitization decorators to the properties. When calling
sanitize(instance) the library will automatically apply the rules defined in the decorators to the properties and update
the value of every marked property respectively.
NOTE:
Every sanitization decorator is property decorator meaning it cannot be placed on parameters or class definitions.
import { sanitize, Trim } from 'class-sanitizer';
class TestClass {
@Trim()
label: string;
constructor(label: string) {
this.label = label;
}
}
const instance = new TestClass(' text-with-spaces-on-both-end ');
sanitize(instance);
// -> the label property is trimmed now
// -> { label: 'text-with-spaces-on-both-end' }
Validating arrays
Every decorator expects a SanitationOptions object. When the each property is set to true
the array will be iterated and the decorator will be applied to every element of the array.
import { sanitize, Trim } from 'class-sanitizer';
class TestClass {
@Trim(undefined, { each: true })
labels: string[];
constructor(labels: string[]) {
this.labels = labels;
}
}
const instance = new TestClass([' labelA ', ' labelB', 'labelC ']);
sanitize(instance);
// -> Every value is trimmed in instance.labels now.
// -> { labels: ['labelA', 'labelB', 'labelC']}
Inheritance
Class inheritance is supported, every decorator defined on the base-class will
be applied to the property with same name on the descendant class if the property exists.
Note: Only one level of inheritance is supported! So if you have ClassA inherit ClassB which inherits ClassC the
decorators from ClassC won't be applied to ClassA when sanitizing.
import { sanitize, Trim } from 'class-sanitizer';
class BaseClass {
@Trim()
baseText: string;
}
class DescendantClass extends BaseClass {
@Trim()
descendantText: string;
}
const instance = new DescendantClass();
instance.baseText = ' text ';
instance.descendantText = ' text ';
sanitize(instance);
// -> Both value is trimmed now.
// -> { baseText: 'text', descendantText: 'text' }
Sanitizing nested values with @SanitizeNested() decorator
The @SanitizeNested property can be used to instruct the library to lookup the sanitization rules
for the class instance found on the marked property and sanitize it.
import { sanitize, Trim, SanitizeNested } from 'class-sanitizer';
class InnerTestClass {
@Trim()
text: string;
constructor(text: string) {
this.text = text;
}
}
class TestClass {
@SanitizeNested({ each: true })
children: InnerTestClass[];
@SanitizeNested({ each: false })
child: InnerTestClass;
}
const instance = new TestClass();
const innerA = new InnerTestClass(' innerA ');
const innerB = new InnerTestClass(' innerB ');
const innerC = new InnerTestClass(' innerC ');
instance.children = [innerA, innerB];
instance.child = innerC;
sanitize(instance);
// -> Both values in the array on `children` property and value on `child` property is sanitized.
// -> { children: [ { text: 'innerA' }, { text: 'innerB' }], child: { 'innerC' }}
Custom sanitation classes
The @SanitizerConstraint( decorator can be used to define custom sanitization logic. Creating a custom sanitization class requires the following steps:
Create a class which implements the CustomSanitizer interface and decorate the class with the @SanitizerConstraint() decorator.
import { CustomSanitizer, SanitizerConstraint } from 'class-sanitizer';
import { Container } from 'typedi';
@SanitizerConstraint()
export class LetterReplacer implements CustomSanitizer {
/** If you use TypeDI, you can inject services to properties with `Container.get` function. */
someInjectedService = Container.get(SomeClass);
/**
* This function will be called during sanitization.
* 1, It must be a sync function
* 2, It must return the transformed value.
*/
sanitize(text: string): string {
return text.replace(/o/g, 'w');
}
}
Then you can use your new sanitation constraint in your class:
import { Sanitize } from 'class-sanitizer';
import { LetterReplacer } from './LetterReplacer';
export class Post {
@Sanitize(LetterReplacer)
title: string;
}
Now you can use sanitizer as usual:
import { sanitize } from 'class-sanitizer';
sanitize(post);
Manual sanitation
There are several method exist in the Sanitizer that allows to perform non-decorator based sanitation:
import Sanitizer from 'class-sanitizer';
Sanitizer.trim(` Let's trim this! `);
Sanitization decorators
The following property decorators are available.
Decorator
Description
@Blacklist(chars: string)
Removes all characters that appear in the blacklist.
@Whitelist(chars: string)
Removes all characters that don't appear in the whitelist.
@Trim(chars?: string)
Trims characters (whitespace by default) from both sides of the input. You can specify chars that should be trimmed.
@Ltrim(chars?: string)
Trims characters from the left-side of the input.
@Rtrim(chars?: string)
Trims characters from the right-side of the input.
@Escape()
Replaces <, >, &, ', " and / with HTML entities.
@NormalizeEmail(lowercase?: boolean)
Normalizes an email address.
@StripLow(keepNewLines?: boolean)
Removes characters with a numerical value < 32 and 127, mostly control characters.
@ToBoolean(isStrict?: boolean)
Converts the input to a boolean. Everything except for '0', 'false' and '' returns true. In strict mode only '1' and 'true' return true.
@ToDate()
Converts the input to a date, or null if the input is not a date.
@ToFloat()
Converts the input to a float, or NaN if the input is not an integer.
@ToInt(radix?: number)
Converts the input to an integer, or NaN if the input is not an integer.
Does typestack/class-sanitizer have a project website?
No homepage URL was recorded for typestack/class-sanitizer in TopGit's last sync. The README tab above frequently contains screenshots and demo links, or check the repository description on GitHub.
How active is development on typestack/class-sanitizer?
The most recent commit recorded on typestack/class-sanitizer was 6.0 years ago, based on the GitHub push timestamp. The repository has 18 forks — one of the better signals of community interest.
Is typestack/class-sanitizer open source?
Yes — typestack/class-sanitizer ships under the MIT license, which makes its source code freely readable (and, depending on license terms, forkable and reusable). Source: github.com/typestack/class-sanitizer.
What license does typestack/class-sanitizer use?
typestack/class-sanitizer is released under the MIT license. Always verify the LICENSE file directly on GitHub for the authoritative terms — license strings can be edited out of sync with a project's actual stance.
What topics is typestack/class-sanitizer associated with?
GitHub's repository topics for typestack/class-sanitizer: "sanitizer", "typescript". TopGit's editorial category is Frontend.
Where do I read more about typestack/class-sanitizer?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/typestack/class-sanitizer is the definitive source.
Read full README in the tab above.
Still deciding about class-sanitizer?
One click hands the question to an AI along with this page — see what it says about class-sanitizer.