feat: initial commit of Railtrack Pro prototype with complete test suite
This commit is contained in:
+135
@@ -0,0 +1,135 @@
|
||||
import generate from 'css-tree/generator';
|
||||
|
||||
import { calculate, calculateForAST } from './core/index.js';
|
||||
import { compare, equals, greaterThan, lessThan } from './util/compare.js';
|
||||
import { min, max } from './util/filter.js';
|
||||
import { sortAsc, sortDesc } from './util/sort.js';
|
||||
|
||||
class NotAllowedError extends Error {
|
||||
constructor() {
|
||||
super('Manipulating a Specificity instance is not allowed. Instead, create a new Specificity()');
|
||||
}
|
||||
}
|
||||
|
||||
class Specificity {
|
||||
constructor(value, selector = null) {
|
||||
this.value = value;
|
||||
this.selector = selector;
|
||||
}
|
||||
|
||||
get a() {
|
||||
return this.value.a;
|
||||
}
|
||||
|
||||
set a(val) {
|
||||
throw new NotAllowedError();
|
||||
}
|
||||
|
||||
get b() {
|
||||
return this.value.b;
|
||||
}
|
||||
|
||||
set b(val) {
|
||||
throw new NotAllowedError();
|
||||
}
|
||||
|
||||
get c() {
|
||||
return this.value.c;
|
||||
}
|
||||
|
||||
set c(val) {
|
||||
throw new NotAllowedError();
|
||||
}
|
||||
|
||||
selectorString() {
|
||||
// this.selector already is a String
|
||||
if (typeof this.selector === 'string' || this.selector instanceof String) {
|
||||
return this.selector;
|
||||
}
|
||||
|
||||
// this.selector is a Selector as parsed by CSSTree
|
||||
if (this.selector instanceof Object) {
|
||||
if (this.selector.type === 'Selector') {
|
||||
return generate(this.selector);
|
||||
}
|
||||
}
|
||||
|
||||
// this.selector is something else …
|
||||
return '';
|
||||
}
|
||||
|
||||
toObject() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
toArray() {
|
||||
return [this.value.a, this.value.b, this.value.c];
|
||||
}
|
||||
|
||||
toString() {
|
||||
return `(${this.value.a},${this.value.b},${this.value.c})`;
|
||||
}
|
||||
|
||||
toJSON() {
|
||||
return {
|
||||
selector: this.selectorString(),
|
||||
asObject: this.toObject(),
|
||||
asArray: this.toArray(),
|
||||
asString: this.toString(),
|
||||
};
|
||||
}
|
||||
|
||||
isEqualTo(otherSpecificity) {
|
||||
return equals(this, otherSpecificity);
|
||||
}
|
||||
|
||||
isGreaterThan(otherSpecificity) {
|
||||
return greaterThan(this, otherSpecificity);
|
||||
}
|
||||
|
||||
isLessThan(otherSpecificity) {
|
||||
return lessThan(this, otherSpecificity);
|
||||
}
|
||||
|
||||
static calculate(selector) {
|
||||
return calculate(selector);
|
||||
}
|
||||
|
||||
static calculateForAST(selector) {
|
||||
return calculateForAST(selector);
|
||||
}
|
||||
|
||||
static compare(s1, s2) {
|
||||
return compare(s1, s2);
|
||||
}
|
||||
|
||||
static equals(s1, s2) {
|
||||
return equals(s1, s2);
|
||||
}
|
||||
|
||||
static lessThan(s1, s2) {
|
||||
return lessThan(s1, s2);
|
||||
}
|
||||
|
||||
static greaterThan(s1, s2) {
|
||||
return greaterThan(s1, s2);
|
||||
}
|
||||
|
||||
static min(...specificities) {
|
||||
return min(...specificities);
|
||||
}
|
||||
|
||||
static max(...specificities) {
|
||||
return max(...specificities);
|
||||
}
|
||||
|
||||
static sortAsc(...specificities) {
|
||||
return sortAsc(...specificities);
|
||||
}
|
||||
|
||||
static sortDesc(...specificities) {
|
||||
return sortDesc(...specificities);
|
||||
}
|
||||
}
|
||||
|
||||
export default Specificity;
|
||||
Reference in New Issue
Block a user