summaryrefslogtreecommitdiff
path: root/node_modules/postcss-svgo
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
commitc06f7ee0a40255214c477e13d9b956a7e07c2900 (patch)
treef5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/postcss-svgo
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/postcss-svgo')
-rw-r--r--node_modules/postcss-svgo/LICENSE-MIT22
-rw-r--r--node_modules/postcss-svgo/README.md110
-rw-r--r--node_modules/postcss-svgo/package.json45
-rw-r--r--node_modules/postcss-svgo/src/globals.d.ts1
-rw-r--r--node_modules/postcss-svgo/src/index.js140
-rw-r--r--node_modules/postcss-svgo/src/lib/url.js18
-rw-r--r--node_modules/postcss-svgo/types/index.d.ts17
-rw-r--r--node_modules/postcss-svgo/types/lib/url.d.ts6
8 files changed, 359 insertions, 0 deletions
diff --git a/node_modules/postcss-svgo/LICENSE-MIT b/node_modules/postcss-svgo/LICENSE-MIT
new file mode 100644
index 00000000..fd0e863a
--- /dev/null
+++ b/node_modules/postcss-svgo/LICENSE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) Ben Briggs <beneb.info@gmail.com> (http://beneb.info)
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/postcss-svgo/README.md b/node_modules/postcss-svgo/README.md
new file mode 100644
index 00000000..ea447bff
--- /dev/null
+++ b/node_modules/postcss-svgo/README.md
@@ -0,0 +1,110 @@
+# [postcss][postcss]-svgo
+
+> Optimise inline SVG with PostCSS.
+
+
+## Install
+
+With [npm](https://npmjs.org/package/postcss-svgo) do:
+
+```
+npm install postcss-svgo --save
+```
+
+
+## Example
+
+### Input
+
+```css
+h1 {
+ background: url('data:image/svg+xml;charset=utf-8,<?xml version="1.0" encoding="utf-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve"><circle cx="50" cy="50" r="40" fill="yellow" /></svg>');
+}
+
+h2 {
+ background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNDAiIGZpbGw9InllbGxvdyIgLz48IS0tdGVzdCBjb21tZW50LS0+PC9zdmc+');
+}
+```
+
+### Output
+
+```css
+h1 {
+ background: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="40" fill="%23ff0"/></svg>');
+}
+
+h2 {
+ background: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBmaWxsPSIjZmYwIi8+PC9zdmc+');
+}
+```
+
+
+## API
+
+### `svgo([options])`
+
+#### options
+
+##### encode
+
+Type: `boolean`
+Default: `undefined`
+
+If `true`, it will encode URL-unsafe characters such as `<`, `>` and `&`;
+`false` will decode these characters, and `undefined` will neither encode nor
+decode the original input. Note that regardless of this setting, `#` will
+always be URL-encoded.
+
+##### plugins
+
+Optionally, you can customise the output by specifying the `plugins` option. You
+will need to provide the config in comma separated objects, like the example
+below. Note that you can either disable the plugin by setting it to `false`,
+or pass different options to change the default behaviour.
+
+```js
+var postcss = require('postcss');
+var svgo = require('postcss-svgo');
+
+var opts = {
+ plugins: [{
+ removeDoctype: false
+ }, {
+ removeComments: false
+ }, {
+ cleanupNumericValues: {
+ floatPrecision: 2
+ }
+ }, {
+ convertColors: {
+ names2hex: false,
+ rgb2hex: false
+ }
+ }]
+};
+
+postcss([ svgo(opts) ]).process(css).then(function (result) {
+ console.log(result.css)
+});
+```
+
+You can view the [full list of plugins here][plugins].
+
+
+## Usage
+
+See the [PostCSS documentation](https://github.com/postcss/postcss#usage) for
+examples for your environment.
+
+
+## Contributors
+
+See [CONTRIBUTORS.md](https://github.com/cssnano/cssnano/blob/master/CONTRIBUTORS.md).
+
+
+## License
+
+MIT © [Ben Briggs](http://beneb.info)
+
+[postcss]: https://github.com/postcss/postcss
+[plugins]: https://github.com/svg/svgo/tree/master/plugins
diff --git a/node_modules/postcss-svgo/package.json b/node_modules/postcss-svgo/package.json
new file mode 100644
index 00000000..55e4e4a2
--- /dev/null
+++ b/node_modules/postcss-svgo/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "postcss-svgo",
+ "version": "6.0.0",
+ "description": "Optimise inline SVG with PostCSS.",
+ "main": "src/index.js",
+ "types": "types/index.d.ts",
+ "files": [
+ "LICENSE-MIT",
+ "src",
+ "types"
+ ],
+ "keywords": [
+ "css",
+ "minify",
+ "optimise",
+ "postcss",
+ "postcss-plugin",
+ "svg",
+ "svgo"
+ ],
+ "license": "MIT",
+ "homepage": "https://github.com/cssnano/cssnano",
+ "author": {
+ "name": "Ben Briggs",
+ "email": "beneb.info@gmail.com",
+ "url": "http://beneb.info"
+ },
+ "repository": "cssnano/cssnano",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^3.0.2"
+ },
+ "bugs": {
+ "url": "https://github.com/cssnano/cssnano/issues"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >= 18"
+ },
+ "devDependencies": {
+ "postcss": "^8.2.15"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.15"
+ }
+} \ No newline at end of file
diff --git a/node_modules/postcss-svgo/src/globals.d.ts b/node_modules/postcss-svgo/src/globals.d.ts
new file mode 100644
index 00000000..731c4638
--- /dev/null
+++ b/node_modules/postcss-svgo/src/globals.d.ts
@@ -0,0 +1 @@
+declare var URL: typeof import('url').URL;
diff --git a/node_modules/postcss-svgo/src/index.js b/node_modules/postcss-svgo/src/index.js
new file mode 100644
index 00000000..a40850c8
--- /dev/null
+++ b/node_modules/postcss-svgo/src/index.js
@@ -0,0 +1,140 @@
+'use strict';
+const valueParser = require('postcss-value-parser');
+const { optimize } = require('svgo');
+const { encode, decode } = require('./lib/url');
+
+const PLUGIN = 'postcss-svgo';
+const dataURI = /data:image\/svg\+xml(;((charset=)?utf-8|base64))?,/i;
+const dataURIBase64 = /data:image\/svg\+xml;base64,/i;
+
+// the following regex will globally match:
+// \b([\w-]+) --> a word (a sequence of one or more [alphanumeric|underscore|dash] characters; followed by
+// \s*=\s* --> an equal sign character (=) between optional whitespaces; followed by
+// \\"([\S\s]+?)\\" --> any characters (including whitespaces and newlines) between literal escaped quotes (\")
+const escapedQuotes = /\b([\w-]+)\s*=\s*\\"([\S\s]+?)\\"/g;
+
+/**
+ * @param {string} input the SVG string
+ * @param {Options} opts
+ * @return {{result: string, isUriEncoded: boolean}} the minification result
+ */
+function minifySVG(input, opts) {
+ let svg = input;
+ let decodedUri, isUriEncoded;
+ try {
+ decodedUri = decode(input);
+ isUriEncoded = decodedUri !== input;
+ } catch (e) {
+ // Swallow exception if we cannot decode the value
+ isUriEncoded = false;
+ }
+
+ if (isUriEncoded) {
+ svg = /** @type {string} */ (decodedUri);
+ }
+
+ if (opts.encode !== undefined) {
+ isUriEncoded = opts.encode;
+ }
+
+ // normalize all escaped quote characters from svg attributes
+ // from <svg attr=\"value\"... /> to <svg attr="value"... />
+ // see: https://github.com/cssnano/cssnano/issues/1194
+ svg = svg.replace(escapedQuotes, '$1="$2"');
+
+ const result = optimize(svg, opts);
+
+ return {
+ result: /** @type {import('svgo').Output}*/ (result).data,
+ isUriEncoded,
+ };
+}
+
+/**
+ * @param {import('postcss').Declaration} decl
+ * @param {Options} opts
+ * @param {import('postcss').Result} postcssResult
+ * @return {void}
+ */
+function minify(decl, opts, postcssResult) {
+ const parsed = valueParser(decl.value);
+
+ const minified = parsed.walk((node) => {
+ if (
+ node.type !== 'function' ||
+ node.value.toLowerCase() !== 'url' ||
+ !node.nodes.length
+ ) {
+ return;
+ }
+ let { value, quote } = /** @type {valueParser.StringNode} */ (
+ node.nodes[0]
+ );
+
+ let optimizedValue;
+
+ try {
+ if (dataURIBase64.test(value)) {
+ const url = new URL(value);
+ const base64String = `${url.protocol}${url.pathname}`.replace(
+ dataURI,
+ ''
+ );
+ const svg = Buffer.from(base64String, 'base64').toString('utf8');
+ const { result } = minifySVG(svg, opts);
+ const data = Buffer.from(result).toString('base64');
+ optimizedValue = 'data:image/svg+xml;base64,' + data + url.hash;
+ } else if (dataURI.test(value)) {
+ const svg = value.replace(dataURI, '');
+ const { result, isUriEncoded } = minifySVG(svg, opts);
+ let data = isUriEncoded ? encode(result) : result;
+ // Should always encode # otherwise we yield a broken SVG
+ // in Firefox (works in Chrome however). See this issue:
+ // https://github.com/cssnano/cssnano/issues/245
+ data = data.replace(/#/g, '%23');
+ optimizedValue = 'data:image/svg+xml;charset=utf-8,' + data;
+ quote = isUriEncoded ? '"' : "'";
+ } else {
+ return;
+ }
+ } catch (error) {
+ decl.warn(postcssResult, `${error}`);
+ return;
+ }
+ node.nodes[0] = Object.assign({}, node.nodes[0], {
+ value: optimizedValue,
+ quote: quote,
+ type: 'string',
+ before: '',
+ after: '',
+ });
+
+ return false;
+ });
+
+ decl.value = minified.toString();
+}
+/** @typedef {{encode?: boolean, plugins?: object[]} & import('svgo').Config} Options */
+/**
+ * @type {import('postcss').PluginCreator<Options>}
+ * @param {Options} opts
+ * @return {import('postcss').Plugin}
+ */
+function pluginCreator(opts = {}) {
+ return {
+ postcssPlugin: PLUGIN,
+
+ OnceExit(css, { result }) {
+ css.walkDecls((decl) => {
+ if (!dataURI.test(decl.value)) {
+ return;
+ }
+
+ minify(decl, opts, result);
+ });
+ },
+ };
+}
+
+pluginCreator.postcss = true;
+module.exports = pluginCreator;
diff --git a/node_modules/postcss-svgo/src/lib/url.js b/node_modules/postcss-svgo/src/lib/url.js
new file mode 100644
index 00000000..1db6a397
--- /dev/null
+++ b/node_modules/postcss-svgo/src/lib/url.js
@@ -0,0 +1,18 @@
+'use strict';
+/**
+ * @param {string} data
+ * @return {string}
+ */
+function encode(data) {
+ return data
+ .replace(/"/g, "'")
+ .replace(/%/g, '%25')
+ .replace(/</g, '%3C')
+ .replace(/>/g, '%3E')
+ .replace(/&/g, '%26')
+ .replace(/#/g, '%23')
+ .replace(/\s+/g, ' ');
+}
+
+const decode = decodeURIComponent;
+module.exports = { encode, decode };
diff --git a/node_modules/postcss-svgo/types/index.d.ts b/node_modules/postcss-svgo/types/index.d.ts
new file mode 100644
index 00000000..0dcd6108
--- /dev/null
+++ b/node_modules/postcss-svgo/types/index.d.ts
@@ -0,0 +1,17 @@
+export = pluginCreator;
+/** @typedef {{encode?: boolean, plugins?: object[]} & import('svgo').Config} Options */
+/**
+ * @type {import('postcss').PluginCreator<Options>}
+ * @param {Options} opts
+ * @return {import('postcss').Plugin}
+ */
+declare function pluginCreator(opts?: Options): import('postcss').Plugin;
+declare namespace pluginCreator {
+ export { postcss, Options };
+}
+type Options = {
+ encode?: boolean;
+ plugins?: object[];
+} & import('svgo').Config;
+declare var postcss: true;
+import { encode } from "./lib/url";
diff --git a/node_modules/postcss-svgo/types/lib/url.d.ts b/node_modules/postcss-svgo/types/lib/url.d.ts
new file mode 100644
index 00000000..abbce50b
--- /dev/null
+++ b/node_modules/postcss-svgo/types/lib/url.d.ts
@@ -0,0 +1,6 @@
+/**
+ * @param {string} data
+ * @return {string}
+ */
+export function encode(data: string): string;
+export const decode: typeof decodeURIComponent;