feat: initial commit of Railtrack Pro prototype with complete test suite

This commit is contained in:
Railtrack Pro Dev
2026-03-13 14:26:16 +00:00
commit 40500bb503
7790 changed files with 986332 additions and 0 deletions
+135
View File
@@ -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;