diff options
| author | ruki <waruqi@gmail.com> | 2018-11-08 00:38:48 +0800 |
|---|---|---|
| committer | ruki <waruqi@gmail.com> | 2018-11-07 21:53:09 +0800 |
| commit | 26105034da4fcce7ac883c899d781f016559310d (patch) | |
| tree | c459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/postcss-loader/lib | |
| parent | 2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff) | |
| download | xmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip | |
switch to vuepress
Diffstat (limited to 'node_modules/postcss-loader/lib')
| -rw-r--r-- | node_modules/postcss-loader/lib/Error.js | 17 | ||||
| -rw-r--r-- | node_modules/postcss-loader/lib/index.js | 196 | ||||
| -rw-r--r-- | node_modules/postcss-loader/lib/options.js | 25 | ||||
| -rw-r--r-- | node_modules/postcss-loader/lib/options.json | 43 |
4 files changed, 281 insertions, 0 deletions
diff --git a/node_modules/postcss-loader/lib/Error.js b/node_modules/postcss-loader/lib/Error.js new file mode 100644 index 00000000..05ea46ea --- /dev/null +++ b/node_modules/postcss-loader/lib/Error.js @@ -0,0 +1,17 @@ +'use strict' + +class SyntaxError extends Error { + constructor (err) { + super(err) + + this.name = 'Syntax Error' + + this.message = '' + this.message += `${this.name} \n\n(${err.line}:${err.column}) ${err.reason}` + this.message += `\n\n${err.showSourceCode()}\n` + + this.stack = false + } +} + +module.exports = SyntaxError diff --git a/node_modules/postcss-loader/lib/index.js b/node_modules/postcss-loader/lib/index.js new file mode 100644 index 00000000..623ff184 --- /dev/null +++ b/node_modules/postcss-loader/lib/index.js @@ -0,0 +1,196 @@ +'use strict' + +const path = require('path') + +const loaderUtils = require('loader-utils') + +const parseOptions = require('./options') +const validateOptions = require('schema-utils') + +const postcss = require('postcss') +const postcssrc = require('postcss-load-config') + +const SyntaxError = require('./Error') + +/** + * PostCSS Loader + * + * > Loads && processes CSS with [PostCSS](https://github.com/postcss/postcss) + * + * @author Andrey Sitnik (@ai) <andrey@sitnik.ru> + * + * @license MIT + * @version 2.0.0 + * + * @requires path + * + * @requires loader-utils + * @requires schema-utils + * + * @requires postcss + * @requires postcss-load-config + * + * @requires Error + * + * @method loader + * + * @param {String} css Source + * @param {Object} map Source Map + * + * @return {cb} cb Result + */ +module.exports = function loader (css, map, meta) { + const options = Object.assign({}, loaderUtils.getOptions(this)) + + validateOptions(require('./options.json'), options, 'PostCSS Loader') + + const cb = this.async() + const file = this.resourcePath + + const sourceMap = options.sourceMap + + Promise.resolve().then(() => { + const length = Object.keys(options) + .filter((option) => { + switch (option) { + // case 'exec': + case 'ident': + case 'config': + case 'sourceMap': + return + default: + return option + } + }) + .length + + if (length) { + return parseOptions.call(this, options) + } + + const rc = { + path: path.dirname(file), + ctx: { + file: { + extname: path.extname(file), + dirname: path.dirname(file), + basename: path.basename(file) + }, + options: {} + } + } + + if (options.config) { + if (options.config.path) { + rc.path = path.resolve(options.config.path) + } + + if (options.config.ctx) { + rc.ctx.options = options.config.ctx + } + } + + rc.ctx.webpack = this; + + return postcssrc(rc.ctx, rc.path) + }).then((config) => { + if (!config) config = {} + + if (config.file) this.addDependency(config.file) + + // Disable override `to` option from `postcss.config.js` + if (config.options.to) delete config.options.to + // Disable override `from` option from `postcss.config.js` + if (config.options.from) delete config.options.from + + let plugins = config.plugins || [] + let options = Object.assign({ + from: file, + map: sourceMap + ? sourceMap === 'inline' + ? { inline: true, annotation: false } + : { inline: false, annotation: false } + : false + }, config.options) + + // Loader Exec (Deprecated) + // https://webpack.js.org/api/loaders/#deprecated-context-properties + if (options.parser === 'postcss-js') { + css = this.exec(css, this.resource) + } + + if (typeof options.parser === 'string') { + options.parser = require(options.parser) + } + + if (typeof options.syntax === 'string') { + options.syntax = require(options.syntax) + } + + if (typeof options.stringifier === 'string') { + options.stringifier = require(options.stringifier) + } + + // Loader API Exec (Deprecated) + // https://webpack.js.org/api/loaders/#deprecated-context-properties + if (config.exec) { + css = this.exec(css, this.resource) + } + + if (sourceMap && typeof map === 'string') map = JSON.parse(map) + if (sourceMap && map) options.map.prev = map + + return postcss(plugins) + .process(css, options) + .then((result) => { + result.warnings().forEach((msg) => this.emitWarning(msg.toString())) + + result.messages.forEach((msg) => { + if (msg.type === 'dependency') this.addDependency(msg.file) + }) + + css = result.css + map = result.map ? result.map.toJSON() : null + + if (map) { + map.file = path.resolve(map.file) + map.sources = map.sources.map((src) => path.resolve(src)) + } + + if (!meta) meta = {} + + meta.ast = { 'type': 'postcss', root: result.root } + meta.messages = result.messages + + if (this.loaderIndex === 0) { + /** + * @memberof loader + * @callback cb + * + * @param {Object} null Error + * @param {String} result Result (JS Module) + * @param {Object} map Source Map + */ + cb(null, `module.exports = ${JSON.stringify(css)}`, map) + + return null + } + + /** + * @memberof loader + * @callback cb + * + * @param {Object} null Error + * @param {String} css Result (Raw Module) + * @param {Object} map Source Map + */ + cb(null, css, map, meta) + + return null + }) + }).catch((err) => { + if (err.file) this.addDependency(err.file) + + return err.name === 'CssSyntaxError' ? cb(new SyntaxError(err)) : cb(err) + }) +} diff --git a/node_modules/postcss-loader/lib/options.js b/node_modules/postcss-loader/lib/options.js new file mode 100644 index 00000000..980e9366 --- /dev/null +++ b/node_modules/postcss-loader/lib/options.js @@ -0,0 +1,25 @@ +'use strict' + +module.exports = function parseOptions (params) { + if (typeof params.plugins === 'function') { + params.plugins = params.plugins.call(this, this) + } + + let plugins + + if (typeof params.plugins === 'undefined') plugins = [] + else if (Array.isArray(params.plugins)) plugins = params.plugins + else plugins = [ params.plugins ] + + const options = {} + + if (typeof params !== 'undefined') { + options.parser = params.parser + options.syntax = params.syntax + options.stringifier = params.stringifier + } + + const exec = params && params.exec + + return Promise.resolve({ options: options, plugins: plugins, exec: exec }) +} diff --git a/node_modules/postcss-loader/lib/options.json b/node_modules/postcss-loader/lib/options.json new file mode 100644 index 00000000..e4546157 --- /dev/null +++ b/node_modules/postcss-loader/lib/options.json @@ -0,0 +1,43 @@ +{ + "type": "object", + "properties": { + "config": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "ctx": { + "type": "object" + } + }, + "additionalProperties": false + }, + "exec": { + "type": "boolean" + }, + "ident": { + "type": "string" + }, + "parser": { + "type": [ "string", "object" ] + }, + "syntax": { + "type": [ "string", "object" ] + }, + "stringifier": { + "type": [ "string", "object" ] + }, + "plugins": { + "anyOf": [ + { "type": "array" }, + { "type": "object" }, + { "instanceof": "Function" } + ] + }, + "sourceMap": { + "type": [ "string", "boolean" ] + } + }, + "additionalProperties": true +} |
