Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .changeset/late-wolves-tickle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@acemir/cssom": minor
---

Add an explicit CSSStyleDeclaration integration API.

New APIs:
- `setup({ CSSStyleDeclaration })`
- `setCSSStyleDeclaration(CSSStyleDeclaration)`
- `getCSSStyleDeclaration()`
- `resetCSSStyleDeclaration()`

Rule style declarations created during parsing/cloning now use the configured constructor consistently, avoiding module load-order issues when integrating with custom CSSStyleDeclaration implementations.
13 changes: 13 additions & 0 deletions README.mdown
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,19 @@ To use it with Node.js or any other CommonJS loader:

➤ npm install @acemir/cssom

You can inject a custom declaration implementation for parsed rule styles:

```js
const cssom = require("@acemir/cssom");

cssom.setup({
CSSStyleDeclaration: YourCSSStyleDeclaration
});

// or globally:
cssom.setCSSStyleDeclaration(YourCSSStyleDeclaration);
```

## Don’t use it if...

You parse CSS to mungle, minify or reformat code like this:
Expand Down
13 changes: 6 additions & 7 deletions lib/CSSFontFaceRule.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
//.CommonJS
var CSSOM = {
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
CSSRule: require("./CSSRule").CSSRule
};
// Use cssstyle if available
try {
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
} catch (e) {
// ignore
}
var styleDeclarationProvider = require("./styleDeclarationProvider");
Object.defineProperty(CSSOM, "CSSStyleDeclaration", {
enumerable: true,
configurable: true,
get: styleDeclarationProvider.getCSSStyleDeclaration
});
///CommonJS


Expand Down
15 changes: 7 additions & 8 deletions lib/CSSKeyframeRule.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
//.CommonJS
var CSSOM = {
CSSRule: require("./CSSRule").CSSRule,
CSSStyleDeclaration: require('./CSSStyleDeclaration').CSSStyleDeclaration
CSSRule: require("./CSSRule").CSSRule
};
// Use cssstyle if available
try {
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
} catch (e) {
// ignore
}
var styleDeclarationProvider = require("./styleDeclarationProvider");
Object.defineProperty(CSSOM, "CSSStyleDeclaration", {
enumerable: true,
configurable: true,
get: styleDeclarationProvider.getCSSStyleDeclaration
});
///CommonJS


Expand Down
17 changes: 8 additions & 9 deletions lib/CSSNestedDeclarations.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
//.CommonJS
var CSSOM = {
CSSRule: require("./CSSRule").CSSRule,
CSSStyleDeclaration: require('./CSSStyleDeclaration').CSSStyleDeclaration
CSSRule: require("./CSSRule").CSSRule
};
// Use cssstyle if available
try {
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
} catch (e) {
// ignore
}
var styleDeclarationProvider = require("./styleDeclarationProvider");
Object.defineProperty(CSSOM, "CSSStyleDeclaration", {
enumerable: true,
configurable: true,
get: styleDeclarationProvider.getCSSStyleDeclaration
});
///CommonJS


Expand Down Expand Up @@ -53,4 +52,4 @@ Object.defineProperty(CSSOM.CSSNestedDeclarations.prototype, "cssText", {

//.CommonJS
exports.CSSNestedDeclarations = CSSOM.CSSNestedDeclarations;
///CommonJS
///CommonJS
8 changes: 7 additions & 1 deletion lib/CSSOM.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ var CSSOM = {
*
* @param {Object} opts - Configuration options for the CSSOM instance
* @param {Object} [opts.globalObject] - Optional global object to be assigned to CSSOM objects prototype
* @param {Function} [opts.CSSStyleDeclaration] - Optional constructor used for declaration blocks in parsed rules
* @returns {Object} A new CSSOM instance with the applied configuration
* @description
* This method creates a new instance of CSSOM and optionally
Expand All @@ -12,7 +13,13 @@ var CSSOM = {
* using a factory function and assigns the globalObject to its prototype's __globalObject property.
*/
setup: function (opts) {
opts = opts || {};
var instance = Object.create(this);
if (opts.CSSStyleDeclaration) {
var styleDeclarationProvider = require("./styleDeclarationProvider");
styleDeclarationProvider.setCSSStyleDeclaration(opts.CSSStyleDeclaration);
instance.CSSStyleDeclaration = opts.CSSStyleDeclaration;
}
if (opts.globalObject) {
if (instance.CSSStyleSheet) {
var factoryCSSStyleSheet = createFunctionFactory(instance.CSSStyleSheet);
Expand Down Expand Up @@ -55,4 +62,3 @@ function createFunctionFactory(fn) {
//.CommonJS
module.exports = CSSOM;
///CommonJS

13 changes: 6 additions & 7 deletions lib/CSSPageRule.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
//.CommonJS
var CSSOM = {
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
CSSRule: require("./CSSRule").CSSRule,
CSSRuleList: require("./CSSRuleList").CSSRuleList,
CSSGroupingRule: require("./CSSGroupingRule").CSSGroupingRule,
};
var styleDeclarationProvider = require("./styleDeclarationProvider");
var regexPatterns = require("./regexPatterns").regexPatterns;
// Use cssstyle if available
try {
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
} catch (e) {
// ignore
}
Object.defineProperty(CSSOM, "CSSStyleDeclaration", {
enumerable: true,
configurable: true,
get: styleDeclarationProvider.getCSSStyleDeclaration
});
///CommonJS


Expand Down
13 changes: 6 additions & 7 deletions lib/CSSStyleRule.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
//.CommonJS
var CSSOM = {
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
CSSRule: require("./CSSRule").CSSRule,
CSSRuleList: require("./CSSRuleList").CSSRuleList,
CSSGroupingRule: require("./CSSGroupingRule").CSSGroupingRule,
};
var styleDeclarationProvider = require("./styleDeclarationProvider");
var regexPatterns = require("./regexPatterns").regexPatterns;
// Use cssstyle if available
try {
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
} catch (e) {
// ignore
}
Object.defineProperty(CSSOM, "CSSStyleDeclaration", {
enumerable: true,
configurable: true,
get: styleDeclarationProvider.getCSSStyleDeclaration
});
///CommonJS


Expand Down
13 changes: 6 additions & 7 deletions lib/clone.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,18 @@ var CSSOM = {
CSSMediaRule: require("./CSSMediaRule").CSSMediaRule,
CSSContainerRule: require("./CSSContainerRule").CSSContainerRule,
CSSSupportsRule: require("./CSSSupportsRule").CSSSupportsRule,
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
CSSKeyframeRule: require('./CSSKeyframeRule').CSSKeyframeRule,
CSSKeyframesRule: require('./CSSKeyframesRule').CSSKeyframesRule,
CSSScopeRule: require('./CSSScopeRule').CSSScopeRule,
CSSLayerBlockRule: require('./CSSLayerBlockRule').CSSLayerBlockRule,
CSSLayerStatementRule: require('./CSSLayerStatementRule').CSSLayerStatementRule
};
// Use cssstyle if available
try {
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
} catch (e) {
// ignore
}
var styleDeclarationProvider = require("./styleDeclarationProvider");
Object.defineProperty(CSSOM, "CSSStyleDeclaration", {
enumerable: true,
configurable: true,
get: styleDeclarationProvider.getCSSStyleDeclaration
});
///CommonJS


Expand Down
8 changes: 6 additions & 2 deletions lib/cssstyleTryCatchBlock.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
//.CommonJS
var styleDeclarationProvider = require("./styleDeclarationProvider");

try {
CSSOM.CSSStyleDeclaration = require("cssstyle").CSSStyleDeclaration;
styleDeclarationProvider.setCSSStyleDeclaration(require("cssstyle").CSSStyleDeclaration);
} catch (e) {
// ignore
}
}
///CommonJS
9 changes: 9 additions & 0 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ require('./errorUtils');
require("./regexPatterns")

exports.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;
exports.getCSSStyleDeclaration = function() {
return require("./styleDeclarationProvider").getCSSStyleDeclaration();
};
exports.setCSSStyleDeclaration = function(CSSStyleDeclaration) {
return require("./styleDeclarationProvider").setCSSStyleDeclaration(CSSStyleDeclaration);
};
exports.resetCSSStyleDeclaration = function() {
return require("./styleDeclarationProvider").resetCSSStyleDeclaration();
};

require('./cssstyleTryCatchBlock');

Expand Down
28 changes: 28 additions & 0 deletions lib/styleDeclarationProvider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//.CommonJS
var currentCSSStyleDeclaration;
///CommonJS

function getDefaultCSSStyleDeclaration() {
return require("./CSSStyleDeclaration").CSSStyleDeclaration;
}

function getCSSStyleDeclaration() {
return currentCSSStyleDeclaration || getDefaultCSSStyleDeclaration();
}

function setCSSStyleDeclaration(CSSStyleDeclaration) {
if (typeof CSSStyleDeclaration !== "function") {
throw new TypeError("CSSStyleDeclaration must be a constructor function");
}
currentCSSStyleDeclaration = CSSStyleDeclaration;
}

function resetCSSStyleDeclaration() {
currentCSSStyleDeclaration = undefined;
}

//.CommonJS
exports.getCSSStyleDeclaration = getCSSStyleDeclaration;
exports.setCSSStyleDeclaration = setCSSStyleDeclaration;
exports.resetCSSStyleDeclaration = resetCSSStyleDeclaration;
///CommonJS