You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.6 KiB
77 lines
1.6 KiB
"use strict"; |
|
const path = require("path"); |
|
const patched = {}; |
|
|
|
function isPromise (obj) { |
|
return typeof obj === "object" && typeof obj.then === "function"; |
|
} |
|
|
|
function runDocument (plugin) { |
|
const result = this.result; |
|
result.lastPlugin = plugin; |
|
const promise = result.root.nodes.map(root => { |
|
try { |
|
return plugin(root, result); |
|
} catch (error) { |
|
this.handleError(error, plugin); |
|
throw error; |
|
} |
|
}); |
|
if (promise.some(isPromise)) { |
|
return Promise.all(promise); |
|
} |
|
} |
|
|
|
function patchDocument (Document, LazyResult) { |
|
LazyResult = LazyResult.prototype; |
|
const runRoot = LazyResult.run; |
|
|
|
LazyResult.run = function run () { |
|
return (this.result.root instanceof Document ? runDocument : runRoot).apply(this, arguments); |
|
}; |
|
} |
|
|
|
function patchNode (Node) { |
|
Node = Node.prototype; |
|
const NodeToString = Node.toString; |
|
Node.toString = function toString (stringifier) { |
|
return NodeToString.call(this, stringifier || this.root().source.syntax); |
|
}; |
|
} |
|
|
|
function patch (Document) { |
|
let fn; |
|
let file; |
|
if (Document) { |
|
patch(); |
|
fn = patchDocument.bind(this, Document); |
|
file = "lazy-result"; |
|
} else { |
|
fn = patchNode; |
|
file = "node"; |
|
} |
|
findPostcss().map(dir => ( |
|
[dir + "lib", file].join(path.sep) |
|
)).filter(file => ( |
|
!patched[file] |
|
)).forEach(file => { |
|
try { |
|
fn(require(file)); |
|
} catch (ex) { |
|
// |
|
} |
|
patched[file] = true; |
|
}); |
|
} |
|
|
|
function findPostcss () { |
|
const result = {}; |
|
for (const file in require.cache) { |
|
if (/^(.+?(\\|\/))postcss(\2)/.test(file)) { |
|
result[RegExp.lastMatch] = true; |
|
} |
|
} |
|
return Object.keys(result); |
|
} |
|
|
|
module.exports = patch;
|
|
|