136 lines
2.9 KiB
JavaScript
136 lines
2.9 KiB
JavaScript
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;
|