mirror of
https://github.com/thangisme/notes.git
synced 2024-11-01 03:17:30 -04:00
433 lines
35 KiB
JavaScript
433 lines
35 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
exports.__esModule = true;
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
||
|
|
||
|
var _mapGenerator = require('./map-generator');
|
||
|
|
||
|
var _mapGenerator2 = _interopRequireDefault(_mapGenerator);
|
||
|
|
||
|
var _stringify2 = require('./stringify');
|
||
|
|
||
|
var _stringify3 = _interopRequireDefault(_stringify2);
|
||
|
|
||
|
var _warnOnce = require('./warn-once');
|
||
|
|
||
|
var _warnOnce2 = _interopRequireDefault(_warnOnce);
|
||
|
|
||
|
var _result = require('./result');
|
||
|
|
||
|
var _result2 = _interopRequireDefault(_result);
|
||
|
|
||
|
var _parse = require('./parse');
|
||
|
|
||
|
var _parse2 = _interopRequireDefault(_parse);
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
|
||
|
function isPromise(obj) {
|
||
|
return (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && typeof obj.then === 'function';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* A Promise proxy for the result of PostCSS transformations.
|
||
|
*
|
||
|
* A `LazyResult` instance is returned by {@link Processor#process}.
|
||
|
*
|
||
|
* @example
|
||
|
* const lazy = postcss([cssnext]).process(css);
|
||
|
*/
|
||
|
|
||
|
var LazyResult = function () {
|
||
|
function LazyResult(processor, css, opts) {
|
||
|
_classCallCheck(this, LazyResult);
|
||
|
|
||
|
this.stringified = false;
|
||
|
this.processed = false;
|
||
|
|
||
|
var root = void 0;
|
||
|
if ((typeof css === 'undefined' ? 'undefined' : _typeof(css)) === 'object' && css.type === 'root') {
|
||
|
root = css;
|
||
|
} else if (css instanceof LazyResult || css instanceof _result2.default) {
|
||
|
root = css.root;
|
||
|
if (css.map) {
|
||
|
if (typeof opts.map === 'undefined') opts.map = {};
|
||
|
if (!opts.map.inline) opts.map.inline = false;
|
||
|
opts.map.prev = css.map;
|
||
|
}
|
||
|
} else {
|
||
|
var parser = _parse2.default;
|
||
|
if (opts.syntax) parser = opts.syntax.parse;
|
||
|
if (opts.parser) parser = opts.parser;
|
||
|
if (parser.parse) parser = parser.parse;
|
||
|
|
||
|
try {
|
||
|
root = parser(css, opts);
|
||
|
} catch (error) {
|
||
|
this.error = error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.result = new _result2.default(processor, root, opts);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a {@link Processor} instance, which will be used
|
||
|
* for CSS transformations.
|
||
|
* @type {Processor}
|
||
|
*/
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Processes input CSS through synchronous plugins
|
||
|
* and calls {@link Result#warnings()}.
|
||
|
*
|
||
|
* @return {Warning[]} warnings from plugins
|
||
|
*/
|
||
|
LazyResult.prototype.warnings = function warnings() {
|
||
|
return this.sync().warnings();
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Alias for the {@link LazyResult#css} property.
|
||
|
*
|
||
|
* @example
|
||
|
* lazy + '' === lazy.css;
|
||
|
*
|
||
|
* @return {string} output CSS
|
||
|
*/
|
||
|
|
||
|
|
||
|
LazyResult.prototype.toString = function toString() {
|
||
|
return this.css;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Processes input CSS through synchronous and asynchronous plugins
|
||
|
* and calls `onFulfilled` with a Result instance. If a plugin throws
|
||
|
* an error, the `onRejected` callback will be executed.
|
||
|
*
|
||
|
* It implements standard Promise API.
|
||
|
*
|
||
|
* @param {onFulfilled} onFulfilled - callback will be executed
|
||
|
* when all plugins will finish work
|
||
|
* @param {onRejected} onRejected - callback will be executed on any error
|
||
|
*
|
||
|
* @return {Promise} Promise API to make queue
|
||
|
*
|
||
|
* @example
|
||
|
* postcss([cssnext]).process(css).then(result => {
|
||
|
* console.log(result.css);
|
||
|
* });
|
||
|
*/
|
||
|
|
||
|
|
||
|
LazyResult.prototype.then = function then(onFulfilled, onRejected) {
|
||
|
return this.async().then(onFulfilled, onRejected);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Processes input CSS through synchronous and asynchronous plugins
|
||
|
* and calls onRejected for each error thrown in any plugin.
|
||
|
*
|
||
|
* It implements standard Promise API.
|
||
|
*
|
||
|
* @param {onRejected} onRejected - callback will be executed on any error
|
||
|
*
|
||
|
* @return {Promise} Promise API to make queue
|
||
|
*
|
||
|
* @example
|
||
|
* postcss([cssnext]).process(css).then(result => {
|
||
|
* console.log(result.css);
|
||
|
* }).catch(error => {
|
||
|
* console.error(error);
|
||
|
* });
|
||
|
*/
|
||
|
|
||
|
|
||
|
LazyResult.prototype.catch = function _catch(onRejected) {
|
||
|
return this.async().catch(onRejected);
|
||
|
};
|
||
|
|
||
|
LazyResult.prototype.handleError = function handleError(error, plugin) {
|
||
|
try {
|
||
|
this.error = error;
|
||
|
if (error.name === 'CssSyntaxError' && !error.plugin) {
|
||
|
error.plugin = plugin.postcssPlugin;
|
||
|
error.setMessage();
|
||
|
} else if (plugin.postcssVersion) {
|
||
|
var pluginName = plugin.postcssPlugin;
|
||
|
var pluginVer = plugin.postcssVersion;
|
||
|
var runtimeVer = this.result.processor.version;
|
||
|
var a = pluginVer.split('.');
|
||
|
var b = runtimeVer.split('.');
|
||
|
|
||
|
if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {
|
||
|
(0, _warnOnce2.default)('Your current PostCSS version ' + 'is ' + runtimeVer + ', but ' + pluginName + ' ' + 'uses ' + pluginVer + '. Perhaps this is ' + 'the source of the error below.');
|
||
|
}
|
||
|
}
|
||
|
} catch (err) {
|
||
|
if (console && console.error) console.error(err);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
LazyResult.prototype.asyncTick = function asyncTick(resolve, reject) {
|
||
|
var _this = this;
|
||
|
|
||
|
if (this.plugin >= this.processor.plugins.length) {
|
||
|
this.processed = true;
|
||
|
return resolve();
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
var plugin = this.processor.plugins[this.plugin];
|
||
|
var promise = this.run(plugin);
|
||
|
this.plugin += 1;
|
||
|
|
||
|
if (isPromise(promise)) {
|
||
|
promise.then(function () {
|
||
|
_this.asyncTick(resolve, reject);
|
||
|
}).catch(function (error) {
|
||
|
_this.handleError(error, plugin);
|
||
|
_this.processed = true;
|
||
|
reject(error);
|
||
|
});
|
||
|
} else {
|
||
|
this.asyncTick(resolve, reject);
|
||
|
}
|
||
|
} catch (error) {
|
||
|
this.processed = true;
|
||
|
reject(error);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
LazyResult.prototype.async = function async() {
|
||
|
var _this2 = this;
|
||
|
|
||
|
if (this.processed) {
|
||
|
return new Promise(function (resolve, reject) {
|
||
|
if (_this2.error) {
|
||
|
reject(_this2.error);
|
||
|
} else {
|
||
|
resolve(_this2.stringify());
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
if (this.processing) {
|
||
|
return this.processing;
|
||
|
}
|
||
|
|
||
|
this.processing = new Promise(function (resolve, reject) {
|
||
|
if (_this2.error) return reject(_this2.error);
|
||
|
_this2.plugin = 0;
|
||
|
_this2.asyncTick(resolve, reject);
|
||
|
}).then(function () {
|
||
|
_this2.processed = true;
|
||
|
return _this2.stringify();
|
||
|
});
|
||
|
|
||
|
return this.processing;
|
||
|
};
|
||
|
|
||
|
LazyResult.prototype.sync = function sync() {
|
||
|
if (this.processed) return this.result;
|
||
|
this.processed = true;
|
||
|
|
||
|
if (this.processing) {
|
||
|
throw new Error('Use process(css).then(cb) to work with async plugins');
|
||
|
}
|
||
|
|
||
|
if (this.error) throw this.error;
|
||
|
|
||
|
for (var _iterator = this.result.processor.plugins, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
||
|
var _ref;
|
||
|
|
||
|
if (_isArray) {
|
||
|
if (_i >= _iterator.length) break;
|
||
|
_ref = _iterator[_i++];
|
||
|
} else {
|
||
|
_i = _iterator.next();
|
||
|
if (_i.done) break;
|
||
|
_ref = _i.value;
|
||
|
}
|
||
|
|
||
|
var plugin = _ref;
|
||
|
|
||
|
var promise = this.run(plugin);
|
||
|
if (isPromise(promise)) {
|
||
|
throw new Error('Use process(css).then(cb) to work with async plugins');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return this.result;
|
||
|
};
|
||
|
|
||
|
LazyResult.prototype.run = function run(plugin) {
|
||
|
this.result.lastPlugin = plugin;
|
||
|
|
||
|
try {
|
||
|
return plugin(this.result.root, this.result);
|
||
|
} catch (error) {
|
||
|
this.handleError(error, plugin);
|
||
|
throw error;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
LazyResult.prototype.stringify = function stringify() {
|
||
|
if (this.stringified) return this.result;
|
||
|
this.stringified = true;
|
||
|
|
||
|
this.sync();
|
||
|
|
||
|
var opts = this.result.opts;
|
||
|
var str = _stringify3.default;
|
||
|
if (opts.syntax) str = opts.syntax.stringify;
|
||
|
if (opts.stringifier) str = opts.stringifier;
|
||
|
if (str.stringify) str = str.stringify;
|
||
|
|
||
|
var map = new _mapGenerator2.default(str, this.result.root, this.result.opts);
|
||
|
var data = map.generate();
|
||
|
this.result.css = data[0];
|
||
|
this.result.map = data[1];
|
||
|
|
||
|
return this.result;
|
||
|
};
|
||
|
|
||
|
_createClass(LazyResult, [{
|
||
|
key: 'processor',
|
||
|
get: function get() {
|
||
|
return this.result.processor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Options from the {@link Processor#process} call.
|
||
|
* @type {processOptions}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'opts',
|
||
|
get: function get() {
|
||
|
return this.result.opts;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Processes input CSS through synchronous plugins, converts `Root`
|
||
|
* to a CSS string and returns {@link Result#css}.
|
||
|
*
|
||
|
* This property will only work with synchronous plugins.
|
||
|
* If the processor contains any asynchronous plugins
|
||
|
* it will throw an error. This is why this method is only
|
||
|
* for debug purpose, you should always use {@link LazyResult#then}.
|
||
|
*
|
||
|
* @type {string}
|
||
|
* @see Result#css
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'css',
|
||
|
get: function get() {
|
||
|
return this.stringify().css;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* An alias for the `css` property. Use it with syntaxes
|
||
|
* that generate non-CSS output.
|
||
|
*
|
||
|
* This property will only work with synchronous plugins.
|
||
|
* If the processor contains any asynchronous plugins
|
||
|
* it will throw an error. This is why this method is only
|
||
|
* for debug purpose, you should always use {@link LazyResult#then}.
|
||
|
*
|
||
|
* @type {string}
|
||
|
* @see Result#content
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'content',
|
||
|
get: function get() {
|
||
|
return this.stringify().content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Processes input CSS through synchronous plugins
|
||
|
* and returns {@link Result#map}.
|
||
|
*
|
||
|
* This property will only work with synchronous plugins.
|
||
|
* If the processor contains any asynchronous plugins
|
||
|
* it will throw an error. This is why this method is only
|
||
|
* for debug purpose, you should always use {@link LazyResult#then}.
|
||
|
*
|
||
|
* @type {SourceMapGenerator}
|
||
|
* @see Result#map
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'map',
|
||
|
get: function get() {
|
||
|
return this.stringify().map;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Processes input CSS through synchronous plugins
|
||
|
* and returns {@link Result#root}.
|
||
|
*
|
||
|
* This property will only work with synchronous plugins. If the processor
|
||
|
* contains any asynchronous plugins it will throw an error.
|
||
|
*
|
||
|
* This is why this method is only for debug purpose,
|
||
|
* you should always use {@link LazyResult#then}.
|
||
|
*
|
||
|
* @type {Root}
|
||
|
* @see Result#root
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'root',
|
||
|
get: function get() {
|
||
|
return this.sync().root;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Processes input CSS through synchronous plugins
|
||
|
* and returns {@link Result#messages}.
|
||
|
*
|
||
|
* This property will only work with synchronous plugins. If the processor
|
||
|
* contains any asynchronous plugins it will throw an error.
|
||
|
*
|
||
|
* This is why this method is only for debug purpose,
|
||
|
* you should always use {@link LazyResult#then}.
|
||
|
*
|
||
|
* @type {Message[]}
|
||
|
* @see Result#messages
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'messages',
|
||
|
get: function get() {
|
||
|
return this.sync().messages;
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return LazyResult;
|
||
|
}();
|
||
|
|
||
|
exports.default = LazyResult;
|
||
|
|
||
|
/**
|
||
|
* @callback onFulfilled
|
||
|
* @param {Result} result
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @callback onRejected
|
||
|
* @param {Error} error
|
||
|
*/
|
||
|
|
||
|
module.exports = exports['default'];
|
||
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxhenktcmVzdWx0LmVzNiJdLCJuYW1lcyI6WyJpc1Byb21pc2UiLCJvYmoiLCJ0aGVuIiwiTGF6eVJlc3VsdCIsInByb2Nlc3NvciIsImNzcyIsIm9wdHMiLCJzdHJpbmdpZmllZCIsInByb2Nlc3NlZCIsInJvb3QiLCJ0eXBlIiwibWFwIiwiaW5saW5lIiwicHJldiIsInBhcnNlciIsInN5bnRheCIsInBhcnNlIiwiZXJyb3IiLCJyZXN1bHQiLCJ3YXJuaW5ncyIsInN5bmMiLCJ0b1N0cmluZyIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsImFzeW5jIiwiY2F0Y2giLCJoYW5kbGVFcnJvciIsInBsdWdpbiIsIm5hbWUiLCJwb3N0Y3NzUGx1Z2luIiwic2V0TWVzc2FnZSIsInBvc3Rjc3NWZXJzaW9uIiwicGx1Z2luTmFtZSIsInBsdWdpblZlciIsInJ1bnRpbWVWZXIiLCJ2ZXJzaW9uIiwiYSIsInNwbGl0IiwiYiIsInBhcnNlSW50IiwiZXJyIiwiY29uc29sZSIsImFzeW5jVGljayIsInJlc29sdmUiLCJyZWplY3QiLCJwbHVnaW5zIiwibGVuZ3RoIiwicHJvbWlzZSIsInJ1biIsIlByb21pc2UiLCJzdHJpbmdpZnkiLCJwcm9jZXNzaW5nIiwiRXJyb3IiLCJsYXN0UGx1Z2luIiwic3RyIiwic3RyaW5naWZpZXIiLCJkYXRhIiwiZ2VuZXJhdGUiLCJjb250ZW50IiwibWVzc2FnZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7QUFFQSxTQUFTQSxTQUFULENBQW1CQyxHQUFuQixFQUF3QjtBQUNwQixXQUFPLFFBQU9BLEdBQVAseUNBQU9BLEdBQVAsT0FBZSxRQUFmLElBQTJCLE9BQU9BLElBQUlDLElBQVgsS0FBb0IsVUFBdEQ7QUFDSDs7QUFFRDs7Ozs7Ozs7O0lBUU1DLFU7QUFFRix3QkFBWUMsU0FBWixFQUF1QkMsR0FBdkIsRUFBNEJDLElBQTVCLEVBQWtDO0FBQUE7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
|