Fix code quality violations and exclude Manifest from checks
Document application modes (development/debug/production) Add global file drop handler, order column normalization, SPA hash fix Serve CDN assets via /_vendor/ URLs instead of merging into bundles Add production minification with license preservation Improve JSON formatting for debugging and production optimization Add CDN asset caching with CSS URL inlining for production builds Add three-mode system (development, debug, production) Update Manifest CLAUDE.md to reflect helper class architecture Refactor Manifest.php into helper classes for better organization Pre-manifest-refactor checkpoint: Add app_mode documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
263
node_modules/postcss-url/CHANGELOG.md
generated
vendored
Executable file
263
node_modules/postcss-url/CHANGELOG.md
generated
vendored
Executable file
@@ -0,0 +1,263 @@
|
||||
# 10.1.3 - 2021-03-19
|
||||
|
||||
Fixed: update mime version
|
||||
|
||||
# 10.1.2 - 2021-03-19
|
||||
|
||||
Fixed: tilde operator for dependencies to allow for newer patch version
|
||||
|
||||
# 10.1.1 - 2020-11-26
|
||||
|
||||
Fixed: updated mime and xxhashjs versions
|
||||
Fixed: postcss peerDependency version `8.1.2 -> 8.0.0`
|
||||
|
||||
# 10.1.0 - 2020-11-04
|
||||
|
||||
Fixed: Replaced mkdirp with make-dir ([PR#152](https://github.com/postcss/postcss-url/pull/152))
|
||||
Fixed: updated dev dependencies, resolved `npm audit` issues
|
||||
|
||||
# 10.0.0 - 2020-10-23
|
||||
|
||||
Added: support for PostCSS 8 ([PR#148](https://github.com/postcss/postcss-url/pull/148))
|
||||
Fixed: path resolution when to/from paths match ([PR#136](https://github.com/postcss/postcss-url/pull/136))
|
||||
|
||||
# 9.0.0 - 2019-04-17
|
||||
|
||||
Fixed: Async API
|
||||
Added: support for PostCSS 8
|
||||
|
||||
# 8.0.0 - 2018-08-09
|
||||
|
||||
Changed: updated postcss 6.0.1 > 7.0.2, postcss-import 10.0.0 > 12.0.0, and required nodejs version ([PR#126](https://github.com/postcss/postcss-url/pull/126))
|
||||
Changed: updated mime package
|
||||
|
||||
# 7.3.2 - 2018-04-03
|
||||
|
||||
Fixed: ignore urls which starts with `~` ([PR#119](https://github.com/postcss/postcss-url/pull/119))
|
||||
|
||||
# 7.3.1 - 2018-02-25
|
||||
|
||||
Fixed: ignore urls which starts with `//` ([PR#117](https://github.com/postcss/postcss-url/pull/117))
|
||||
|
||||
# 7.3.0 - 2017-10-26
|
||||
|
||||
Added: hash option - `append` ([PR#114](https://github.com/postcss/postcss-url/pull/114))
|
||||
|
||||
# 7.2.1 - 2017-10-19
|
||||
|
||||
Fixed: dependency security ([#108](https://github.com/postcss/postcss-url/issues/108)) ([#109](https://github.com/postcss/postcss-url/issues/109))
|
||||
|
||||
# 7.2.0 - 2017-10-17
|
||||
|
||||
Added: `assetsPath` option for `rebase`
|
||||
|
||||
# 7.1.2 - 2017-08-11
|
||||
|
||||
Fixed: wrap url by quotes for inlined svg ([#78](https://github.com/postcss/postcss-url/issues/78))
|
||||
|
||||
# 7.1.1 - 2017-07-24
|
||||
|
||||
Fixed: force wrap url by quotes for `optimizeSvgEncode` ([#105](https://github.com/postcss/postcss-url/issues/105))
|
||||
|
||||
# 7.1.0 - 2017-07-19
|
||||
|
||||
Added: `optimizeSvgEncode` option for inlined svg ([#103](https://github.com/postcss/postcss-url/issues/103))
|
||||
Added: `rebase` as fallback in copy ([#104](https://github.com/postcss/postcss-url/issues/104))
|
||||
|
||||
# 7.0.0 - 2017-06-05
|
||||
|
||||
Added: PostCss 6 support
|
||||
|
||||
# 6.3.0 - 2017-06-04
|
||||
|
||||
Added: `multi` property for `custom`
|
||||
Added: option to include fragment identifiers on inline data URIs
|
||||
Added: support ignoring SVG fragment inlining warning
|
||||
|
||||
# 6.1.0 - 2017-05-13
|
||||
|
||||
Changed: filter functions access to asset object
|
||||
Added: support crypto hash function methods
|
||||
Added: support for postcss's dependency messaging
|
||||
|
||||
# 6.0.4 - 2017-04-06
|
||||
|
||||
Fixed: prepare asset without file path in decl
|
||||
([#94](https://github.com/postcss/postcss-url/issues/94))
|
||||
|
||||
# 6.0.3 - 2017-04-04
|
||||
|
||||
Fixed: hash url error
|
||||
([#89](https://github.com/postcss/postcss-url/issues/89))
|
||||
|
||||
# 6.0.2 - 2017-04-04
|
||||
|
||||
Fixed: match options before analyzing
|
||||
([pull-88](https://github.com/postcss/postcss-url/pull/88))
|
||||
|
||||
# 6.0.1 - 2017-04-03
|
||||
|
||||
- Fixed: bug with empty options
|
||||
([#87](https://github.com/postcss/postcss-url/issues/87))
|
||||
|
||||
# 6.0.0 - 2017-04-02
|
||||
|
||||
- Changed: es5 -> es6
|
||||
- Added: multiple options for postcss-url as array
|
||||
- Added: multiple `basePath` as array
|
||||
- Added: _copy_ accept `basePath` param
|
||||
- Changed: hash function to xxhash
|
||||
- Changed: arguments in custom url callback
|
||||
- Changed: no processing callback in _inline_ without `maxSize`
|
||||
- Changed: `filter` matches by asset path, relative to project (process.cwd)
|
||||
- Changed: _copy_ can work without postcss `to` option, but required `assetPath`
|
||||
|
||||
# 5.1.2 - 2016-05-01
|
||||
|
||||
- Fixed: node 6 compatibility
|
||||
([#68](https://github.com/postcss/postcss-url/issues/68))
|
||||
|
||||
# 5.1.1 - 2016-02-03
|
||||
|
||||
- Fixed: typo in an error message
|
||||
([#62](https://github.com/postcss/postcss-url/pull/62))
|
||||
|
||||
# 5.1.0 - 2016-01-19
|
||||
|
||||
- Added: `filter` option
|
||||
([#61](https://github.com/postcss/postcss-url/pull/61))
|
||||
|
||||
# 5.0.2 - 2015-10-12
|
||||
|
||||
- Fixed: now rebase url in old Internet Explorer filter
|
||||
`progid:DXImageTransform.Microsoft.AlphaImageLoader()`
|
||||
([#55](https://github.com/postcss/postcss-url/pull/55))
|
||||
|
||||
# 5.0.1 - 2015-10-04
|
||||
|
||||
- Fixed: windows compatibility
|
||||
([#52](https://github.com/postcss/postcss-url/pull/52))
|
||||
|
||||
# 5.0.0 - 2015-09-07
|
||||
|
||||
- Removed: compatibility with postcss v4.x
|
||||
([#45](https://github.com/postcss/postcss-url/pull/45))
|
||||
- Added: compatibility with postcss v5.x
|
||||
([#76](https://github.com/postcss/postcss-url/pull/45))
|
||||
|
||||
# 4.0.1 - 2015-08-06
|
||||
|
||||
- Fixed: copy/rename of hash and query string for filenames
|
||||
([#40](https://github.com/postcss/postcss-url/pull/40))
|
||||
|
||||
# 4.0.0 - 2015-06-18
|
||||
|
||||
- Fixed: fallback callback is working again
|
||||
([#33](https://github.com/postcss/postcss-url/pull/33))
|
||||
- Changed: Messages are now passed via postcss messages api
|
||||
(no more console.warn)
|
||||
- Added: callbacks might have now postcss result object as last param.
|
||||
Handy to send some messages.
|
||||
|
||||
# 3.3.0 - 2015-06-16
|
||||
|
||||
- Added: postcss ^4.1.x dependency
|
||||
([#31](https://github.com/postcss/postcss-url/pull/31))
|
||||
- Added: new options to url callback
|
||||
([#32](https://github.com/postcss/postcss-url/pull/32))
|
||||
|
||||
# 3.2.0 - 2015-05-01
|
||||
|
||||
- Added: New `fallback` option to use if max size is exceeded or url contains a hash
|
||||
([#30](https://github.com/postcss/postcss-url/pull/30))
|
||||
|
||||
# 3.1.0 - 2015-05-01
|
||||
|
||||
- Added: New copy value for `url` option
|
||||
([#29](https://github.com/postcss/postcss-url/pull/29))
|
||||
|
||||
# 3.0.0 - 2015-03-02
|
||||
|
||||
- Changed: upgraded to postcss v4.1.x
|
||||
|
||||
# 2.1.1 - 2015-03-31
|
||||
|
||||
- Fixed: whitespace before and after url() value are now supported and preserved
|
||||
([#27](https://github.com/postcss/postcss-url/pull/27))
|
||||
|
||||
# 2.1.0 - 2015-03-12
|
||||
|
||||
- Added: related postcss declaration object has been added as a 2nd parameter to the url callback for custom processing
|
||||
|
||||
# 2.0.2 - 2015-01-31
|
||||
|
||||
- Fixed: url that are just hashes are ignored completely
|
||||
([#25](https://github.com/postcss/postcss-url/issues/25))
|
||||
|
||||
# 2.0.1 - 2015-01-31
|
||||
|
||||
- Fixed: url with hashes are ignored for inline mode only
|
||||
([#23](https://github.com/postcss/postcss-url/pull/23))
|
||||
|
||||
# 2.0.0 - 2015-01-26
|
||||
|
||||
- Added: compatibility with postcss v4.x
|
||||
- Removed: compatibility with postcss v3.x
|
||||
|
||||
# 1.3.1 - 2015-01-26
|
||||
|
||||
- Fixed: dependency issue related to "directory-encoder"
|
||||
([#22](https://github.com/postcss/postcss-url/pull/22))
|
||||
|
||||
# 1.3.0 - 2015-01-26
|
||||
|
||||
- Changed: SVGs are now in plain text (not base64 encoded) ([3c04f7a](https://github.com/postcss/postcss-url/commit/3c04f7abb1c017dfef34d3ddb00a5b44d8af951f), [#18](https://github.com/postcss/postcss-url/issues/18))
|
||||
- Fixed: URLs with hashes (e.g. SVG fragments) are now ignored ([c3a9abc](https://github.com/postcss/postcss-url/commit/c3a9abcbed33ede323e7dcd6708b8fdb6168462f), [#20](https://github.com/postcss/postcss-url/pull/20))
|
||||
|
||||
# 1.2.3 - 2015-01-10
|
||||
|
||||
- Use Node's native buffer.toString("base64"). The js-base64 library was producing incorrect base64 for certain files
|
||||
([#17](https://github.com/postcss/postcss-url/pull/17))
|
||||
|
||||
# 1.2.2 - unpublished
|
||||
|
||||
# 1.2.1 - 2014-12-09
|
||||
|
||||
- Data URIs are ignored correctly
|
||||
([#15](https://github.com/postcss/postcss-url/pull/15))
|
||||
|
||||
# 1.2.0 - 2014-12-04
|
||||
|
||||
- `url` now accept a function to allow custom transformation of the url string
|
||||
- All absolute url protocols are now ignored (not just /https?/).
|
||||
|
||||
# 1.1.3 - 2014-12-04
|
||||
|
||||
- Fix absolute urls being mangled
|
||||
([#13](https://github.com/postcss/postcss-url/issues/13))
|
||||
|
||||
# 1.1.2 - 2014-11-08
|
||||
|
||||
- Fix MaxSize issue
|
||||
([#9](https://github.com/postcss/postcss-url/issues/9))
|
||||
|
||||
# 1.1.1 - 2014-10-30
|
||||
|
||||
- Fix bug which leads to not correct base64 code
|
||||
|
||||
# 1.1.0 - 2014-10-29
|
||||
|
||||
- Add `maxSize` (size in kbytes) and `basePath` (base path for images to inline) options for _inline_ mode.
|
||||
|
||||
# 1.0.2 - 2014-10-10
|
||||
|
||||
- Fix non-working base64 encoding
|
||||
|
||||
# 1.0.1 - 2014-10-09
|
||||
|
||||
- Fix paths for Windows
|
||||
([#3](https://github.com/postcss/postcss-url/issue/3) via [#4](https://github.com/postcss/postcss-url/pull/4))
|
||||
|
||||
# 1.0.0 - 2014-08-24
|
||||
|
||||
First release
|
||||
20
node_modules/postcss-url/LICENSE
generated
vendored
Executable file
20
node_modules/postcss-url/LICENSE
generated
vendored
Executable file
@@ -0,0 +1,20 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Maxime Thirouin
|
||||
|
||||
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.
|
||||
264
node_modules/postcss-url/README.md
generated
vendored
Executable file
264
node_modules/postcss-url/README.md
generated
vendored
Executable file
@@ -0,0 +1,264 @@
|
||||
# postcss-url
|
||||
|
||||
[](https://travis-ci.org/postcss/postcss-url)
|
||||
[](https://ci.appveyor.com/project/MoOx/postcss-url)
|
||||
[](https://david-dm.org/postcss/postcss-url)
|
||||
[](https://david-dm.org/postcss/postcss-url?type=dev)
|
||||
|
||||
> [PostCSS](https://github.com/postcss/postcss) plugin to rebase, inline or copy on url().
|
||||
|
||||
## Installation
|
||||
|
||||
```console
|
||||
$ npm install postcss postcss-url
|
||||
```
|
||||
|
||||
## Basic example - rebase
|
||||
|
||||
```js
|
||||
// dependencies
|
||||
const fs = require("fs")
|
||||
const postcss = require("postcss")
|
||||
const url = require("postcss-url")
|
||||
|
||||
// css to be processed
|
||||
const css = fs.readFileSync("input.css", "utf8")
|
||||
|
||||
// process css
|
||||
const output = postcss()
|
||||
.use(url({
|
||||
url: "rebase"
|
||||
}))
|
||||
.process(css, {
|
||||
from: "src/stylesheet/index.css",
|
||||
to: "dist/index.css"
|
||||
})
|
||||
```
|
||||
before:
|
||||
```css
|
||||
.element {
|
||||
background: url('images/sprite.png');
|
||||
}
|
||||
```
|
||||
after:
|
||||
```css
|
||||
.element {
|
||||
/* rebasing path by new destination */
|
||||
background: url('../src/stylesheet/images/sprite.png');
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Inline
|
||||
```js
|
||||
// postcss-url options
|
||||
const options = {
|
||||
url: 'inline'
|
||||
};
|
||||
|
||||
postcss()
|
||||
.use(url(options))
|
||||
.process(css, {
|
||||
from: "src/stylesheet/index.css",
|
||||
to: "dist/index.css"
|
||||
})
|
||||
```
|
||||
before:
|
||||
```css
|
||||
.element {
|
||||
background: url('/images/sprite.png');
|
||||
filter: url('/images/circle.svg');
|
||||
}
|
||||
```
|
||||
after:
|
||||
```css
|
||||
.element {
|
||||
/* inlined png as base64 */
|
||||
background: url('data:image/png;base64,R0lGODlhAQABAJH/AP///wAAAP///wAAACH/C0FET0JFOklSMS4');
|
||||
/* inlined svg as encodeURIComponent */
|
||||
filter: url('data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%2F%3E');
|
||||
}
|
||||
```
|
||||
|
||||
## Copy
|
||||
```js
|
||||
// postcss-url options
|
||||
const options = {
|
||||
url: 'copy',
|
||||
// base path to search assets from
|
||||
basePath: path.resolve('node_modules/bootstrap'),
|
||||
// dir to copy assets
|
||||
assetsPath: 'img',
|
||||
// using hash names for assets (generates from asset content)
|
||||
useHash: true
|
||||
};
|
||||
|
||||
postcss()
|
||||
.use(url(options))
|
||||
.process(css, {
|
||||
from: "src/stylesheet/index.css",
|
||||
to: "dist/index.css"
|
||||
})
|
||||
```
|
||||
before:
|
||||
```css
|
||||
.element {
|
||||
background: url('/images/sprite.png');
|
||||
}
|
||||
```
|
||||
after:
|
||||
```css
|
||||
.element {
|
||||
/* copy 'sprite.png' from 'node_modules/bootstrap/images/' to 'dist/img/' */
|
||||
/* and rename it by hash function */
|
||||
background: url('img/a2ds3kfu.png');
|
||||
}
|
||||
```
|
||||
|
||||
### Multiple options
|
||||
|
||||
process first matched option by default.
|
||||
```multi: true``` in `custom` will processing with other options
|
||||
|
||||
```js
|
||||
const options = [
|
||||
{ filter: '**/assets/copy/*.png', url: 'copy', assetsPath: 'img', useHash: true },
|
||||
{ filter: '**/assets/inline/*.svg', url: 'inline' },
|
||||
{ filter: '**/assets/**/*.gif', url: 'rebase' },
|
||||
// using custom function to build url
|
||||
{ filter: 'cdn/**/*', url: (asset) => `https://cdn.url/${asset.url}` }
|
||||
];
|
||||
|
||||
postcss().use(url(options))
|
||||
```
|
||||
|
||||
Checkout [tests](test) for examples.
|
||||
|
||||
### Options combinations
|
||||
|
||||
* `rebase` - _default_
|
||||
* `assetsPath` - directory to copy assets (relative to `to` or absolute)
|
||||
* `inline`
|
||||
* `basePath` - path or array of paths to search assets (relative to `from`, or absolute)
|
||||
* `encodeType` - `base64`, `encodeURI`, `encodeURIComponent`
|
||||
* `includeUriFragment` - include the fragment identifer at the end of the URI
|
||||
* `maxSize` - file size in kbytes
|
||||
* `fallback` - `copy`, `rebase` or custom function for files > `maxSize`
|
||||
* `ignoreFragmentWarning` - do not warn when an SVG URL with a fragment is inlined
|
||||
* `optimizeSvgEncode` - reduce size of inlined svg (IE9+, Android 3+)
|
||||
* `copy`
|
||||
* `basePath` - path or array of paths to search assets (relative to `from`, or absolute)
|
||||
* `assetsPath` - directory to copy assets (relative to `to` or absolute)
|
||||
* `useHash` - use filehash(xxhash) for naming
|
||||
* `hashOptions` - options for hash function
|
||||
* `custom {Function}`
|
||||
* `multi` - processing with other options
|
||||
|
||||
### Options list
|
||||
|
||||
#### `url`
|
||||
##### `rebase` - _(default)_
|
||||
Allow you to fix `url()` according to postcss `to` and/or `from` options (rebase to `to` first if available, otherwise `from` or `process.cwd()`).
|
||||
##### `inline`
|
||||
Allow you to inline assets using base64 encoding. Can use postcss `from` option to find ressources.
|
||||
##### `copy`
|
||||
Allow you to copy and rebase assets according to postcss `to`, `assetsPath` and `from` options (`assetsPath` is relative to the option `to`).
|
||||
##### `url: {Function}`
|
||||
Custom transform function. Takes following arguments:
|
||||
* `asset`
|
||||
* `url` - original url
|
||||
* `pathname` - url pathname (url without search or hash)
|
||||
* `absolutePath` - absolute path to asset
|
||||
* `relativePath` - current relative path to asset
|
||||
* `search` - _search_ from `url`, ex. `?query=1` from `./image.png?query=1`
|
||||
* `hash` - _hash_ from `url`, ex. `#spriteLink` from `../asset.svg#spriteLink`
|
||||
* `dir`
|
||||
* `from` - postcss option from
|
||||
* `to` - postcss option to
|
||||
* `file` - decl file path
|
||||
* `options` - postcss-url matched options
|
||||
* `decl` - related postcss declaration object
|
||||
* `warn` - wrapped function `result.warn` for current `decl`
|
||||
* `result` – postcss result object
|
||||
|
||||
And should return the transformed url.
|
||||
You can use this option to adjust urls for CDN.
|
||||
|
||||
#### `maxSize`
|
||||
|
||||
Specify the maximum file size to inline (in kbytes)
|
||||
|
||||
#### `ignoreFragmentWarning`
|
||||
_(default: `false`)_
|
||||
|
||||
Do not warn when an SVG URL with a fragment is inlined.
|
||||
PostCSS-URL does not support partial inlining. The entire SVG file will be inlined. By default a warning will be issued when this occurs.
|
||||
|
||||
**NOTE:** Only files less than the maximum size will be inlined.
|
||||
|
||||
#### `filter`
|
||||
|
||||
A regular expression e.g. `/\.svg$/`, a [minimatch string](https://github.com/isaacs/minimatch) e.g. `'**/*.svg'` or a custom filter function to determine wether a file should be inlined.
|
||||
|
||||
#### `fallback`
|
||||
|
||||
The url fallback method to use if max size is exceeded or url contains a hash.
|
||||
Custom transform functions are supported.
|
||||
|
||||
#### `includeUriFragment`
|
||||
_(default: `false`)_
|
||||
|
||||
Specifies whether the URL's fragment identifer value, if present, will be added
|
||||
to the inlined data URI.
|
||||
|
||||
#### `basePath`
|
||||
|
||||
Specify the base path or list of base paths where to search images from
|
||||
|
||||
#### `assetsPath`
|
||||
|
||||
_(default: `false`)_
|
||||
|
||||
If you specify an `assetsPath`, the assets files will be copied in that
|
||||
destination
|
||||
|
||||
#### `useHash`
|
||||
|
||||
_(default: `false`)_
|
||||
|
||||
If set to `true` the copy method is going to rename the path of the files by a hash name
|
||||
|
||||
#### `hashOptions`
|
||||
|
||||
##### `method`
|
||||
|
||||
_(default: `xxhash32`)_
|
||||
|
||||
Hash method `xxhash32|xxhash64` or custom function (accept file buffer)
|
||||
##### `shrink`
|
||||
|
||||
_(default: `8`)_
|
||||
|
||||
Result hash shrink count
|
||||
##### `append`
|
||||
|
||||
_(default: `false`)_
|
||||
|
||||
Prepend the original filename in resulting filename
|
||||
|
||||
---
|
||||
|
||||
## Contributing
|
||||
|
||||
Work on a branch, install dev-dependencies, respect coding style & run tests before submitting a bug fix or a feature.
|
||||
|
||||
```console
|
||||
$ git clone https://github.com/postcss/postcss-url.git
|
||||
$ git checkout -b patch-1
|
||||
$ npm install
|
||||
$ npm test
|
||||
```
|
||||
|
||||
## [Changelog](CHANGELOG.md)
|
||||
|
||||
## [License](LICENSE)
|
||||
1
node_modules/postcss-url/node_modules/.bin/mime
generated
vendored
Symbolic link
1
node_modules/postcss-url/node_modules/.bin/mime
generated
vendored
Symbolic link
@@ -0,0 +1 @@
|
||||
../mime/cli.js
|
||||
66
node_modules/postcss-url/node_modules/make-dir/index.d.ts
generated
vendored
Executable file
66
node_modules/postcss-url/node_modules/make-dir/index.d.ts
generated
vendored
Executable file
@@ -0,0 +1,66 @@
|
||||
/// <reference types="node"/>
|
||||
import * as fs from 'fs';
|
||||
|
||||
declare namespace makeDir {
|
||||
interface Options {
|
||||
/**
|
||||
Directory [permissions](https://x-team.com/blog/file-system-permissions-umask-node-js/).
|
||||
|
||||
@default 0o777
|
||||
*/
|
||||
readonly mode?: number;
|
||||
|
||||
/**
|
||||
Use a custom `fs` implementation. For example [`graceful-fs`](https://github.com/isaacs/node-graceful-fs).
|
||||
|
||||
Using a custom `fs` implementation will block the use of the native `recursive` option if `fs.mkdir` or `fs.mkdirSync` is not the native function.
|
||||
|
||||
@default require('fs')
|
||||
*/
|
||||
readonly fs?: typeof fs;
|
||||
}
|
||||
}
|
||||
|
||||
declare const makeDir: {
|
||||
/**
|
||||
Make a directory and its parents if needed - Think `mkdir -p`.
|
||||
|
||||
@param path - Directory to create.
|
||||
@returns The path to the created directory.
|
||||
|
||||
@example
|
||||
```
|
||||
import makeDir = require('make-dir');
|
||||
|
||||
(async () => {
|
||||
const path = await makeDir('unicorn/rainbow/cake');
|
||||
|
||||
console.log(path);
|
||||
//=> '/Users/sindresorhus/fun/unicorn/rainbow/cake'
|
||||
|
||||
// Multiple directories:
|
||||
const paths = await Promise.all([
|
||||
makeDir('unicorn/rainbow'),
|
||||
makeDir('foo/bar')
|
||||
]);
|
||||
|
||||
console.log(paths);
|
||||
// [
|
||||
// '/Users/sindresorhus/fun/unicorn/rainbow',
|
||||
// '/Users/sindresorhus/fun/foo/bar'
|
||||
// ]
|
||||
})();
|
||||
```
|
||||
*/
|
||||
(path: string, options?: makeDir.Options): Promise<string>;
|
||||
|
||||
/**
|
||||
Synchronously make a directory and its parents if needed - Think `mkdir -p`.
|
||||
|
||||
@param path - Directory to create.
|
||||
@returns The path to the created directory.
|
||||
*/
|
||||
sync(path: string, options?: makeDir.Options): string;
|
||||
};
|
||||
|
||||
export = makeDir;
|
||||
156
node_modules/postcss-url/node_modules/make-dir/index.js
generated
vendored
Executable file
156
node_modules/postcss-url/node_modules/make-dir/index.js
generated
vendored
Executable file
@@ -0,0 +1,156 @@
|
||||
'use strict';
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const {promisify} = require('util');
|
||||
const semver = require('semver');
|
||||
|
||||
const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0');
|
||||
|
||||
// https://github.com/nodejs/node/issues/8987
|
||||
// https://github.com/libuv/libuv/pull/1088
|
||||
const checkPath = pth => {
|
||||
if (process.platform === 'win32') {
|
||||
const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''));
|
||||
|
||||
if (pathHasInvalidWinCharacters) {
|
||||
const error = new Error(`Path contains invalid characters: ${pth}`);
|
||||
error.code = 'EINVAL';
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const processOptions = options => {
|
||||
// https://github.com/sindresorhus/make-dir/issues/18
|
||||
const defaults = {
|
||||
mode: 0o777,
|
||||
fs
|
||||
};
|
||||
|
||||
return {
|
||||
...defaults,
|
||||
...options
|
||||
};
|
||||
};
|
||||
|
||||
const permissionError = pth => {
|
||||
// This replicates the exception of `fs.mkdir` with native the
|
||||
// `recusive` option when run on an invalid drive under Windows.
|
||||
const error = new Error(`operation not permitted, mkdir '${pth}'`);
|
||||
error.code = 'EPERM';
|
||||
error.errno = -4048;
|
||||
error.path = pth;
|
||||
error.syscall = 'mkdir';
|
||||
return error;
|
||||
};
|
||||
|
||||
const makeDir = async (input, options) => {
|
||||
checkPath(input);
|
||||
options = processOptions(options);
|
||||
|
||||
const mkdir = promisify(options.fs.mkdir);
|
||||
const stat = promisify(options.fs.stat);
|
||||
|
||||
if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) {
|
||||
const pth = path.resolve(input);
|
||||
|
||||
await mkdir(pth, {
|
||||
mode: options.mode,
|
||||
recursive: true
|
||||
});
|
||||
|
||||
return pth;
|
||||
}
|
||||
|
||||
const make = async pth => {
|
||||
try {
|
||||
await mkdir(pth, options.mode);
|
||||
|
||||
return pth;
|
||||
} catch (error) {
|
||||
if (error.code === 'EPERM') {
|
||||
throw error;
|
||||
}
|
||||
|
||||
if (error.code === 'ENOENT') {
|
||||
if (path.dirname(pth) === pth) {
|
||||
throw permissionError(pth);
|
||||
}
|
||||
|
||||
if (error.message.includes('null bytes')) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
await make(path.dirname(pth));
|
||||
|
||||
return make(pth);
|
||||
}
|
||||
|
||||
try {
|
||||
const stats = await stat(pth);
|
||||
if (!stats.isDirectory()) {
|
||||
throw new Error('The path is not a directory');
|
||||
}
|
||||
} catch (_) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return pth;
|
||||
}
|
||||
};
|
||||
|
||||
return make(path.resolve(input));
|
||||
};
|
||||
|
||||
module.exports = makeDir;
|
||||
|
||||
module.exports.sync = (input, options) => {
|
||||
checkPath(input);
|
||||
options = processOptions(options);
|
||||
|
||||
if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) {
|
||||
const pth = path.resolve(input);
|
||||
|
||||
fs.mkdirSync(pth, {
|
||||
mode: options.mode,
|
||||
recursive: true
|
||||
});
|
||||
|
||||
return pth;
|
||||
}
|
||||
|
||||
const make = pth => {
|
||||
try {
|
||||
options.fs.mkdirSync(pth, options.mode);
|
||||
} catch (error) {
|
||||
if (error.code === 'EPERM') {
|
||||
throw error;
|
||||
}
|
||||
|
||||
if (error.code === 'ENOENT') {
|
||||
if (path.dirname(pth) === pth) {
|
||||
throw permissionError(pth);
|
||||
}
|
||||
|
||||
if (error.message.includes('null bytes')) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
make(path.dirname(pth));
|
||||
return make(pth);
|
||||
}
|
||||
|
||||
try {
|
||||
if (!options.fs.statSync(pth).isDirectory()) {
|
||||
throw new Error('The path is not a directory');
|
||||
}
|
||||
} catch (_) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
return pth;
|
||||
};
|
||||
|
||||
return make(path.resolve(input));
|
||||
};
|
||||
9
node_modules/postcss-url/node_modules/make-dir/license
generated
vendored
Executable file
9
node_modules/postcss-url/node_modules/make-dir/license
generated
vendored
Executable file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
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.
|
||||
59
node_modules/postcss-url/node_modules/make-dir/package.json
generated
vendored
Executable file
59
node_modules/postcss-url/node_modules/make-dir/package.json
generated
vendored
Executable file
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "make-dir",
|
||||
"version": "3.1.0",
|
||||
"description": "Make a directory and its parents if needed - Think `mkdir -p`",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/make-dir",
|
||||
"funding": "https://github.com/sponsors/sindresorhus",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && nyc ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts"
|
||||
],
|
||||
"keywords": [
|
||||
"mkdir",
|
||||
"mkdirp",
|
||||
"make",
|
||||
"directories",
|
||||
"dir",
|
||||
"dirs",
|
||||
"folders",
|
||||
"directory",
|
||||
"folder",
|
||||
"path",
|
||||
"parent",
|
||||
"parents",
|
||||
"intermediate",
|
||||
"recursively",
|
||||
"recursive",
|
||||
"create",
|
||||
"fs",
|
||||
"filesystem",
|
||||
"file-system"
|
||||
],
|
||||
"dependencies": {
|
||||
"semver": "^6.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/graceful-fs": "^4.1.3",
|
||||
"@types/node": "^13.7.1",
|
||||
"ava": "^1.4.0",
|
||||
"codecov": "^3.2.0",
|
||||
"graceful-fs": "^4.1.15",
|
||||
"nyc": "^15.0.0",
|
||||
"path-type": "^4.0.0",
|
||||
"tempy": "^0.2.1",
|
||||
"tsd": "^0.11.0",
|
||||
"xo": "^0.25.4"
|
||||
}
|
||||
}
|
||||
125
node_modules/postcss-url/node_modules/make-dir/readme.md
generated
vendored
Executable file
125
node_modules/postcss-url/node_modules/make-dir/readme.md
generated
vendored
Executable file
@@ -0,0 +1,125 @@
|
||||
# make-dir [](https://travis-ci.org/sindresorhus/make-dir) [](https://codecov.io/gh/sindresorhus/make-dir)
|
||||
|
||||
> Make a directory and its parents if needed - Think `mkdir -p`
|
||||
|
||||
## Advantages over [`mkdirp`](https://github.com/substack/node-mkdirp)
|
||||
|
||||
- Promise API *(Async/await ready!)*
|
||||
- Fixes many `mkdirp` issues: [#96](https://github.com/substack/node-mkdirp/pull/96) [#70](https://github.com/substack/node-mkdirp/issues/70) [#66](https://github.com/substack/node-mkdirp/issues/66)
|
||||
- 100% test coverage
|
||||
- CI-tested on macOS, Linux, and Windows
|
||||
- Actively maintained
|
||||
- Doesn't bundle a CLI
|
||||
- Uses the native `fs.mkdir/mkdirSync` [`recursive` option](https://nodejs.org/dist/latest/docs/api/fs.html#fs_fs_mkdir_path_options_callback) in Node.js >=10.12.0 unless [overridden](#fs)
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install make-dir
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
$ pwd
|
||||
/Users/sindresorhus/fun
|
||||
$ tree
|
||||
.
|
||||
```
|
||||
|
||||
```js
|
||||
const makeDir = require('make-dir');
|
||||
|
||||
(async () => {
|
||||
const path = await makeDir('unicorn/rainbow/cake');
|
||||
|
||||
console.log(path);
|
||||
//=> '/Users/sindresorhus/fun/unicorn/rainbow/cake'
|
||||
})();
|
||||
```
|
||||
|
||||
```
|
||||
$ tree
|
||||
.
|
||||
└── unicorn
|
||||
└── rainbow
|
||||
└── cake
|
||||
```
|
||||
|
||||
Multiple directories:
|
||||
|
||||
```js
|
||||
const makeDir = require('make-dir');
|
||||
|
||||
(async () => {
|
||||
const paths = await Promise.all([
|
||||
makeDir('unicorn/rainbow'),
|
||||
makeDir('foo/bar')
|
||||
]);
|
||||
|
||||
console.log(paths);
|
||||
/*
|
||||
[
|
||||
'/Users/sindresorhus/fun/unicorn/rainbow',
|
||||
'/Users/sindresorhus/fun/foo/bar'
|
||||
]
|
||||
*/
|
||||
})();
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### makeDir(path, options?)
|
||||
|
||||
Returns a `Promise` for the path to the created directory.
|
||||
|
||||
### makeDir.sync(path, options?)
|
||||
|
||||
Returns the path to the created directory.
|
||||
|
||||
#### path
|
||||
|
||||
Type: `string`
|
||||
|
||||
Directory to create.
|
||||
|
||||
#### options
|
||||
|
||||
Type: `object`
|
||||
|
||||
##### mode
|
||||
|
||||
Type: `integer`\
|
||||
Default: `0o777`
|
||||
|
||||
Directory [permissions](https://x-team.com/blog/file-system-permissions-umask-node-js/).
|
||||
|
||||
##### fs
|
||||
|
||||
Type: `object`\
|
||||
Default: `require('fs')`
|
||||
|
||||
Use a custom `fs` implementation. For example [`graceful-fs`](https://github.com/isaacs/node-graceful-fs).
|
||||
|
||||
Using a custom `fs` implementation will block the use of the native `recursive` option if `fs.mkdir` or `fs.mkdirSync` is not the native function.
|
||||
|
||||
## Related
|
||||
|
||||
- [make-dir-cli](https://github.com/sindresorhus/make-dir-cli) - CLI for this module
|
||||
- [del](https://github.com/sindresorhus/del) - Delete files and directories
|
||||
- [globby](https://github.com/sindresorhus/globby) - User-friendly glob matching
|
||||
- [cpy](https://github.com/sindresorhus/cpy) - Copy files
|
||||
- [cpy-cli](https://github.com/sindresorhus/cpy-cli) - Copy files on the command-line
|
||||
- [move-file](https://github.com/sindresorhus/move-file) - Move a file
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<b>
|
||||
<a href="https://tidelift.com/subscription/pkg/npm-make-dir?utm_source=npm-make-dir&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
|
||||
</b>
|
||||
<br>
|
||||
<sub>
|
||||
Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
|
||||
</sub>
|
||||
</div>
|
||||
289
node_modules/postcss-url/node_modules/mime/CHANGELOG.md
generated
vendored
Executable file
289
node_modules/postcss-url/node_modules/mime/CHANGELOG.md
generated
vendored
Executable file
@@ -0,0 +1,289 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
### [2.5.2](https://github.com/broofa/mime/compare/v2.5.0...v2.5.2) (2021-02-17)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* update to mime-db@1.46.0, fixes [#253](https://github.com/broofa/mime/issues/253) ([f10e6aa](https://github.com/broofa/mime/commit/f10e6aa62e1356de7e2491d7fb4374c8dac65800))
|
||||
|
||||
## [2.5.0](https://github.com/broofa/mime/compare/v2.4.7...v2.5.0) (2021-01-16)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* improved CLI ([#244](https://github.com/broofa/mime/issues/244)) ([c8a8356](https://github.com/broofa/mime/commit/c8a8356e3b27f3ef46b64b89b428fdb547b14d5f))
|
||||
|
||||
### [2.4.7](https://github.com/broofa/mime/compare/v2.4.6...v2.4.7) (2020-12-16)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* update to latest mime-db ([43b09ef](https://github.com/broofa/mime/commit/43b09eff0233eacc449af2b1f99a19ba9e104a44))
|
||||
|
||||
### [2.4.6](https://github.com/broofa/mime/compare/v2.4.5...v2.4.6) (2020-05-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* add cli.js to package.json files ([#237](https://github.com/broofa/mime/issues/237)) ([6c070bc](https://github.com/broofa/mime/commit/6c070bc298fa12a48e2ed126fbb9de641a1e7ebc))
|
||||
|
||||
### [2.4.5](https://github.com/broofa/mime/compare/v2.4.4...v2.4.5) (2020-05-01)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix [#236](https://github.com/broofa/mime/issues/236) ([7f4ecd0](https://github.com/broofa/mime/commit/7f4ecd0d850ed22c9e3bfda2c11fc74e4dde12a7))
|
||||
* update to latest mime-db ([c5cb3f2](https://github.com/broofa/mime/commit/c5cb3f2ab8b07642a066efbde1142af1b90c927b))
|
||||
|
||||
### [2.4.4](https://github.com/broofa/mime/compare/v2.4.3...v2.4.4) (2019-06-07)
|
||||
|
||||
|
||||
|
||||
### [2.4.3](https://github.com/broofa/mime/compare/v2.4.2...v2.4.3) (2019-05-15)
|
||||
|
||||
|
||||
|
||||
### [2.4.2](https://github.com/broofa/mime/compare/v2.4.1...v2.4.2) (2019-04-07)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* don't use arrow function introduced in 2.4.1 ([2e00b5c](https://github.com/broofa/mime/commit/2e00b5c))
|
||||
|
||||
|
||||
|
||||
### [2.4.1](https://github.com/broofa/mime/compare/v2.4.0...v2.4.1) (2019-04-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* update MDN and mime-db types ([3e567a9](https://github.com/broofa/mime/commit/3e567a9))
|
||||
|
||||
|
||||
|
||||
# [2.4.0](https://github.com/broofa/mime/compare/v2.3.1...v2.4.0) (2018-11-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Bind exported methods ([9d2a7b8](https://github.com/broofa/mime/commit/9d2a7b8))
|
||||
* update to mime-db@1.37.0 ([49e6e41](https://github.com/broofa/mime/commit/49e6e41))
|
||||
|
||||
|
||||
|
||||
### [2.3.1](https://github.com/broofa/mime/compare/v2.3.0...v2.3.1) (2018-04-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix [#198](https://github.com/broofa/mime/issues/198) ([25ca180](https://github.com/broofa/mime/commit/25ca180))
|
||||
|
||||
|
||||
|
||||
# [2.3.0](https://github.com/broofa/mime/compare/v2.2.2...v2.3.0) (2018-04-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* fix [#192](https://github.com/broofa/mime/issues/192) ([5c35df6](https://github.com/broofa/mime/commit/5c35df6))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add travis-ci testing ([d64160f](https://github.com/broofa/mime/commit/d64160f))
|
||||
|
||||
|
||||
|
||||
### [2.2.2](https://github.com/broofa/mime/compare/v2.2.1...v2.2.2) (2018-03-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* update types files to mime-db@1.32.0 ([85aac16](https://github.com/broofa/mime/commit/85aac16))
|
||||
|
||||
|
||||
### [2.2.1](https://github.com/broofa/mime/compare/v2.2.0...v2.2.1) (2018-03-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Retain type->extension mappings for non-default types. Fixes [#180](https://github.com/broofa/mime/issues/180) ([b5c83fb](https://github.com/broofa/mime/commit/b5c83fb))
|
||||
|
||||
|
||||
|
||||
# [2.2.0](https://github.com/broofa/mime/compare/v2.1.0...v2.2.0) (2018-01-04)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Retain type->extension mappings for non-default types. Fixes [#180](https://github.com/broofa/mime/issues/180) ([10f82ac](https://github.com/broofa/mime/commit/10f82ac))
|
||||
|
||||
|
||||
|
||||
# [2.1.0](https://github.com/broofa/mime/compare/v2.0.5...v2.1.0) (2017-12-22)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Upgrade to mime-db@1.32.0. Fixes [#185](https://github.com/broofa/mime/issues/185) ([3f775ba](https://github.com/broofa/mime/commit/3f775ba))
|
||||
|
||||
|
||||
|
||||
### [2.0.5](https://github.com/broofa/mime/compare/v2.0.1...v2.0.5) (2017-12-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* ES5 support (back to node v0.4) ([f14ccb6](https://github.com/broofa/mime/commit/f14ccb6))
|
||||
|
||||
|
||||
|
||||
# Changelog
|
||||
|
||||
### v2.0.4 (24/11/2017)
|
||||
- [**closed**] Switch to mime-score module for resolving extension contention issues. [#182](https://github.com/broofa/mime/issues/182)
|
||||
- [**closed**] Update mime-db to 1.31.0 in v1.x branch [#181](https://github.com/broofa/mime/issues/181)
|
||||
|
||||
---
|
||||
|
||||
## v1.5.0 (22/11/2017)
|
||||
- [**closed**] need ES5 version ready in npm package [#179](https://github.com/broofa/mime/issues/179)
|
||||
- [**closed**] mime-db no trace of iWork - pages / numbers / etc. [#178](https://github.com/broofa/mime/issues/178)
|
||||
- [**closed**] How it works in brownser ? [#176](https://github.com/broofa/mime/issues/176)
|
||||
- [**closed**] Missing `./Mime` [#175](https://github.com/broofa/mime/issues/175)
|
||||
- [**closed**] Vulnerable Regular Expression [#167](https://github.com/broofa/mime/issues/167)
|
||||
|
||||
---
|
||||
|
||||
### v2.0.3 (25/09/2017)
|
||||
*No changelog for this release.*
|
||||
|
||||
---
|
||||
|
||||
### v1.4.1 (25/09/2017)
|
||||
- [**closed**] Issue when bundling with webpack [#172](https://github.com/broofa/mime/issues/172)
|
||||
|
||||
---
|
||||
|
||||
### v2.0.2 (15/09/2017)
|
||||
- [**V2**] fs.readFileSync is not a function [#165](https://github.com/broofa/mime/issues/165)
|
||||
- [**closed**] The extension for video/quicktime should map to .mov, not .qt [#164](https://github.com/broofa/mime/issues/164)
|
||||
- [**V2**] [v2 Feedback request] Mime class API [#163](https://github.com/broofa/mime/issues/163)
|
||||
- [**V2**] [v2 Feedback request] Resolving conflicts over extensions [#162](https://github.com/broofa/mime/issues/162)
|
||||
- [**V2**] Allow callers to load module with official, full, or no defined types. [#161](https://github.com/broofa/mime/issues/161)
|
||||
- [**V2**] Use "facets" to resolve extension conflicts [#160](https://github.com/broofa/mime/issues/160)
|
||||
- [**V2**] Remove fs and path dependencies [#152](https://github.com/broofa/mime/issues/152)
|
||||
- [**V2**] Default content-type should not be application/octet-stream [#139](https://github.com/broofa/mime/issues/139)
|
||||
- [**V2**] reset mime-types [#124](https://github.com/broofa/mime/issues/124)
|
||||
- [**V2**] Extensionless paths should return null or false [#113](https://github.com/broofa/mime/issues/113)
|
||||
|
||||
---
|
||||
|
||||
### v2.0.1 (14/09/2017)
|
||||
- [**closed**] Changelog for v2.0 does not mention breaking changes [#171](https://github.com/broofa/mime/issues/171)
|
||||
- [**closed**] MIME breaking with 'class' declaration as it is without 'use strict mode' [#170](https://github.com/broofa/mime/issues/170)
|
||||
|
||||
---
|
||||
|
||||
## v2.0.0 (12/09/2017)
|
||||
- [**closed**] woff and woff2 [#168](https://github.com/broofa/mime/issues/168)
|
||||
|
||||
---
|
||||
|
||||
## v1.4.0 (28/08/2017)
|
||||
- [**closed**] support for ac3 voc files [#159](https://github.com/broofa/mime/issues/159)
|
||||
- [**closed**] Help understanding change from application/xml to text/xml [#158](https://github.com/broofa/mime/issues/158)
|
||||
- [**closed**] no longer able to override mimetype [#157](https://github.com/broofa/mime/issues/157)
|
||||
- [**closed**] application/vnd.adobe.photoshop [#147](https://github.com/broofa/mime/issues/147)
|
||||
- [**closed**] Directories should appear as something other than application/octet-stream [#135](https://github.com/broofa/mime/issues/135)
|
||||
- [**closed**] requested features [#131](https://github.com/broofa/mime/issues/131)
|
||||
- [**closed**] Make types.json loading optional? [#129](https://github.com/broofa/mime/issues/129)
|
||||
- [**closed**] Cannot find module './types.json' [#120](https://github.com/broofa/mime/issues/120)
|
||||
- [**V2**] .wav files show up as "audio/x-wav" instead of "audio/x-wave" [#118](https://github.com/broofa/mime/issues/118)
|
||||
- [**closed**] Don't be a pain in the ass for node community [#108](https://github.com/broofa/mime/issues/108)
|
||||
- [**closed**] don't make default_type global [#78](https://github.com/broofa/mime/issues/78)
|
||||
- [**closed**] mime.extension() fails if the content-type is parameterized [#74](https://github.com/broofa/mime/issues/74)
|
||||
|
||||
---
|
||||
|
||||
### v1.3.6 (11/05/2017)
|
||||
- [**closed**] .md should be text/markdown as of March 2016 [#154](https://github.com/broofa/mime/issues/154)
|
||||
- [**closed**] Error while installing mime [#153](https://github.com/broofa/mime/issues/153)
|
||||
- [**closed**] application/manifest+json [#149](https://github.com/broofa/mime/issues/149)
|
||||
- [**closed**] Dynamic adaptive streaming over HTTP (DASH) file extension typo [#141](https://github.com/broofa/mime/issues/141)
|
||||
- [**closed**] charsets image/png undefined [#140](https://github.com/broofa/mime/issues/140)
|
||||
- [**closed**] Mime-db dependency out of date [#130](https://github.com/broofa/mime/issues/130)
|
||||
- [**closed**] how to support plist? [#126](https://github.com/broofa/mime/issues/126)
|
||||
- [**closed**] how does .types file format look like? [#123](https://github.com/broofa/mime/issues/123)
|
||||
- [**closed**] Feature: support for expanding MIME patterns [#121](https://github.com/broofa/mime/issues/121)
|
||||
- [**closed**] DEBUG_MIME doesn't work [#117](https://github.com/broofa/mime/issues/117)
|
||||
|
||||
---
|
||||
|
||||
### v1.3.4 (06/02/2015)
|
||||
*No changelog for this release.*
|
||||
|
||||
---
|
||||
|
||||
### v1.3.3 (06/02/2015)
|
||||
*No changelog for this release.*
|
||||
|
||||
---
|
||||
|
||||
### v1.3.1 (05/02/2015)
|
||||
- [**closed**] Consider adding support for Handlebars .hbs file ending [#111](https://github.com/broofa/mime/issues/111)
|
||||
- [**closed**] Consider adding support for hjson. [#110](https://github.com/broofa/mime/issues/110)
|
||||
- [**closed**] Add mime type for Opus audio files [#94](https://github.com/broofa/mime/issues/94)
|
||||
- [**closed**] Consider making the `Requesting New Types` information more visible [#77](https://github.com/broofa/mime/issues/77)
|
||||
|
||||
---
|
||||
|
||||
## v1.3.0 (05/02/2015)
|
||||
- [**closed**] Add common name? [#114](https://github.com/broofa/mime/issues/114)
|
||||
- [**closed**] application/x-yaml [#104](https://github.com/broofa/mime/issues/104)
|
||||
- [**closed**] Add mime type for WOFF file format 2.0 [#102](https://github.com/broofa/mime/issues/102)
|
||||
- [**closed**] application/x-msi for .msi [#99](https://github.com/broofa/mime/issues/99)
|
||||
- [**closed**] Add mimetype for gettext translation files [#98](https://github.com/broofa/mime/issues/98)
|
||||
- [**closed**] collaborators [#88](https://github.com/broofa/mime/issues/88)
|
||||
- [**closed**] getting errot in installation of mime module...any1 can help? [#87](https://github.com/broofa/mime/issues/87)
|
||||
- [**closed**] should application/json's charset be utf8? [#86](https://github.com/broofa/mime/issues/86)
|
||||
- [**closed**] Add "license" and "licenses" to package.json [#81](https://github.com/broofa/mime/issues/81)
|
||||
- [**closed**] lookup with extension-less file on Windows returns wrong type [#68](https://github.com/broofa/mime/issues/68)
|
||||
|
||||
---
|
||||
|
||||
### v1.2.11 (15/08/2013)
|
||||
- [**closed**] Update mime.types [#65](https://github.com/broofa/mime/issues/65)
|
||||
- [**closed**] Publish a new version [#63](https://github.com/broofa/mime/issues/63)
|
||||
- [**closed**] README should state upfront that "application/octet-stream" is default for unknown extension [#55](https://github.com/broofa/mime/issues/55)
|
||||
- [**closed**] Suggested improvement to the charset API [#52](https://github.com/broofa/mime/issues/52)
|
||||
|
||||
---
|
||||
|
||||
### v1.2.10 (25/07/2013)
|
||||
- [**closed**] Mime type for woff files should be application/font-woff and not application/x-font-woff [#62](https://github.com/broofa/mime/issues/62)
|
||||
- [**closed**] node.types in conflict with mime.types [#51](https://github.com/broofa/mime/issues/51)
|
||||
|
||||
---
|
||||
|
||||
### v1.2.9 (17/01/2013)
|
||||
- [**closed**] Please update "mime" NPM [#49](https://github.com/broofa/mime/issues/49)
|
||||
- [**closed**] Please add semicolon [#46](https://github.com/broofa/mime/issues/46)
|
||||
- [**closed**] parse full mime types [#43](https://github.com/broofa/mime/issues/43)
|
||||
|
||||
---
|
||||
|
||||
### v1.2.8 (10/01/2013)
|
||||
- [**closed**] /js directory mime is application/javascript. Is it correct? [#47](https://github.com/broofa/mime/issues/47)
|
||||
- [**closed**] Add mime types for lua code. [#45](https://github.com/broofa/mime/issues/45)
|
||||
|
||||
---
|
||||
|
||||
### v1.2.7 (19/10/2012)
|
||||
- [**closed**] cannot install 1.2.7 via npm [#41](https://github.com/broofa/mime/issues/41)
|
||||
- [**closed**] Transfer ownership to @broofa [#36](https://github.com/broofa/mime/issues/36)
|
||||
- [**closed**] it's wrong to set charset to UTF-8 for text [#30](https://github.com/broofa/mime/issues/30)
|
||||
- [**closed**] Allow multiple instances of MIME types container [#27](https://github.com/broofa/mime/issues/27)
|
||||
21
node_modules/postcss-url/node_modules/mime/LICENSE
generated
vendored
Executable file
21
node_modules/postcss-url/node_modules/mime/LICENSE
generated
vendored
Executable file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2010 Benjamin Thomas, Robert Kieffer
|
||||
|
||||
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.
|
||||
97
node_modules/postcss-url/node_modules/mime/Mime.js
generated
vendored
Executable file
97
node_modules/postcss-url/node_modules/mime/Mime.js
generated
vendored
Executable file
@@ -0,0 +1,97 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* @param typeMap [Object] Map of MIME type -> Array[extensions]
|
||||
* @param ...
|
||||
*/
|
||||
function Mime() {
|
||||
this._types = Object.create(null);
|
||||
this._extensions = Object.create(null);
|
||||
|
||||
for (let i = 0; i < arguments.length; i++) {
|
||||
this.define(arguments[i]);
|
||||
}
|
||||
|
||||
this.define = this.define.bind(this);
|
||||
this.getType = this.getType.bind(this);
|
||||
this.getExtension = this.getExtension.bind(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Define mimetype -> extension mappings. Each key is a mime-type that maps
|
||||
* to an array of extensions associated with the type. The first extension is
|
||||
* used as the default extension for the type.
|
||||
*
|
||||
* e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
|
||||
*
|
||||
* If a type declares an extension that has already been defined, an error will
|
||||
* be thrown. To suppress this error and force the extension to be associated
|
||||
* with the new type, pass `force`=true. Alternatively, you may prefix the
|
||||
* extension with "*" to map the type to extension, without mapping the
|
||||
* extension to the type.
|
||||
*
|
||||
* e.g. mime.define({'audio/wav', ['wav']}, {'audio/x-wav', ['*wav']});
|
||||
*
|
||||
*
|
||||
* @param map (Object) type definitions
|
||||
* @param force (Boolean) if true, force overriding of existing definitions
|
||||
*/
|
||||
Mime.prototype.define = function(typeMap, force) {
|
||||
for (let type in typeMap) {
|
||||
let extensions = typeMap[type].map(function(t) {
|
||||
return t.toLowerCase();
|
||||
});
|
||||
type = type.toLowerCase();
|
||||
|
||||
for (let i = 0; i < extensions.length; i++) {
|
||||
const ext = extensions[i];
|
||||
|
||||
// '*' prefix = not the preferred type for this extension. So fixup the
|
||||
// extension, and skip it.
|
||||
if (ext[0] === '*') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!force && (ext in this._types)) {
|
||||
throw new Error(
|
||||
'Attempt to change mapping for "' + ext +
|
||||
'" extension from "' + this._types[ext] + '" to "' + type +
|
||||
'". Pass `force=true` to allow this, otherwise remove "' + ext +
|
||||
'" from the list of extensions for "' + type + '".'
|
||||
);
|
||||
}
|
||||
|
||||
this._types[ext] = type;
|
||||
}
|
||||
|
||||
// Use first extension as default
|
||||
if (force || !this._extensions[type]) {
|
||||
const ext = extensions[0];
|
||||
this._extensions[type] = (ext[0] !== '*') ? ext : ext.substr(1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Lookup a mime type based on extension
|
||||
*/
|
||||
Mime.prototype.getType = function(path) {
|
||||
path = String(path);
|
||||
let last = path.replace(/^.*[/\\]/, '').toLowerCase();
|
||||
let ext = last.replace(/^.*\./, '').toLowerCase();
|
||||
|
||||
let hasPath = last.length < path.length;
|
||||
let hasDot = ext.length < last.length - 1;
|
||||
|
||||
return (hasDot || !hasPath) && this._types[ext] || null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return file extension associated with a mime type
|
||||
*/
|
||||
Mime.prototype.getExtension = function(type) {
|
||||
type = /^\s*([^;\s]*)/.test(type) && RegExp.$1;
|
||||
return type && this._extensions[type.toLowerCase()] || null;
|
||||
};
|
||||
|
||||
module.exports = Mime;
|
||||
187
node_modules/postcss-url/node_modules/mime/README.md
generated
vendored
Executable file
187
node_modules/postcss-url/node_modules/mime/README.md
generated
vendored
Executable file
@@ -0,0 +1,187 @@
|
||||
<!--
|
||||
-- This file is auto-generated from src/README_js.md. Changes should be made there.
|
||||
-->
|
||||
# Mime
|
||||
|
||||
A comprehensive, compact MIME type module.
|
||||
|
||||
[](https://travis-ci.org/broofa/mime)
|
||||
|
||||
## Version 2 Notes
|
||||
|
||||
Version 2 is a breaking change from 1.x as the semver implies. Specifically:
|
||||
|
||||
* `lookup()` renamed to `getType()`
|
||||
* `extension()` renamed to `getExtension()`
|
||||
* `charset()` and `load()` methods have been removed
|
||||
|
||||
If you prefer the legacy version of this module please `npm install mime@^1`. Version 1 docs may be found [here](https://github.com/broofa/mime/tree/v1.4.0).
|
||||
|
||||
## Install
|
||||
|
||||
### NPM
|
||||
```
|
||||
npm install mime
|
||||
```
|
||||
|
||||
### Browser
|
||||
|
||||
It is recommended that you use a bundler such as
|
||||
[webpack](https://webpack.github.io/) or [browserify](http://browserify.org/) to
|
||||
package your code. However, browser-ready versions are available via wzrd.in.
|
||||
E.g. For the full version:
|
||||
|
||||
<script src="https://wzrd.in/standalone/mime@latest"></script>
|
||||
<script>
|
||||
mime.getType(...); // etc.
|
||||
</script>
|
||||
|
||||
Or, for the `mime/lite` version:
|
||||
|
||||
<script src="https://wzrd.in/standalone/mime%2flite@latest"></script>
|
||||
<script>
|
||||
mimelite.getType(...); // (Note `mimelite` here)
|
||||
</script>
|
||||
|
||||
## Quick Start
|
||||
|
||||
For the full version (800+ MIME types, 1,000+ extensions):
|
||||
|
||||
```javascript
|
||||
const mime = require('mime');
|
||||
|
||||
mime.getType('txt'); // ⇨ 'text/plain'
|
||||
mime.getExtension('text/plain'); // ⇨ 'txt'
|
||||
```
|
||||
|
||||
See [Mime API](#mime-api) below for API details.
|
||||
|
||||
## Lite Version
|
||||
|
||||
There is also a "lite" version of this module that omits vendor-specific
|
||||
(`*/vnd.*`) and experimental (`*/x-*`) types. It weighs in at ~2.5KB, compared
|
||||
to 8KB for the full version. To load the lite version:
|
||||
|
||||
```javascript
|
||||
const mime = require('mime/lite');
|
||||
```
|
||||
|
||||
## Mime .vs. mime-types .vs. mime-db modules
|
||||
|
||||
For those of you wondering about the difference between these [popular] NPM modules,
|
||||
here's a brief rundown ...
|
||||
|
||||
[`mime-db`](https://github.com/jshttp/mime-db) is "the source of
|
||||
truth" for MIME type information. It is not an API. Rather, it is a canonical
|
||||
dataset of mime type definitions pulled from IANA, Apache, NGINX, and custom mappings
|
||||
submitted by the Node.js community.
|
||||
|
||||
[`mime-types`](https://github.com/jshttp/mime-types) is a thin
|
||||
wrapper around mime-db that provides an API drop-in compatible(ish) with `mime @ < v1.3.6` API.
|
||||
|
||||
`mime` is, as of v2, a self-contained module bundled with a pre-optimized version
|
||||
of the `mime-db` dataset. It provides a simplified API with the following characteristics:
|
||||
|
||||
* Intelligently resolved type conflicts (See [mime-score](https://github.com/broofa/mime-score) for details)
|
||||
* Method naming consistent with industry best-practices
|
||||
* Compact footprint. E.g. The minified+compressed sizes of the various modules:
|
||||
|
||||
Module | Size
|
||||
--- | ---
|
||||
`mime-db` | 18 KB
|
||||
`mime-types` | same as mime-db
|
||||
`mime` | 8 KB
|
||||
`mime/lite` | 2 KB
|
||||
|
||||
## Mime API
|
||||
|
||||
Both `require('mime')` and `require('mime/lite')` return instances of the MIME
|
||||
class, documented below.
|
||||
|
||||
Note: Inputs to this API are case-insensitive. Outputs (returned values) will
|
||||
be lowercase.
|
||||
|
||||
### new Mime(typeMap, ... more maps)
|
||||
|
||||
Most users of this module will not need to create Mime instances directly.
|
||||
However if you would like to create custom mappings, you may do so as follows
|
||||
...
|
||||
|
||||
```javascript
|
||||
// Require Mime class
|
||||
const Mime = require('mime/Mime');
|
||||
|
||||
// Define mime type -> extensions map
|
||||
const typeMap = {
|
||||
'text/abc': ['abc', 'alpha', 'bet'],
|
||||
'text/def': ['leppard']
|
||||
};
|
||||
|
||||
// Create and use Mime instance
|
||||
const myMime = new Mime(typeMap);
|
||||
myMime.getType('abc'); // ⇨ 'text/abc'
|
||||
myMime.getExtension('text/def'); // ⇨ 'leppard'
|
||||
```
|
||||
|
||||
If more than one map argument is provided, each map is `define()`ed (see below), in order.
|
||||
|
||||
### mime.getType(pathOrExtension)
|
||||
|
||||
Get mime type for the given path or extension. E.g.
|
||||
|
||||
```javascript
|
||||
mime.getType('js'); // ⇨ 'application/javascript'
|
||||
mime.getType('json'); // ⇨ 'application/json'
|
||||
|
||||
mime.getType('txt'); // ⇨ 'text/plain'
|
||||
mime.getType('dir/text.txt'); // ⇨ 'text/plain'
|
||||
mime.getType('dir\\text.txt'); // ⇨ 'text/plain'
|
||||
mime.getType('.text.txt'); // ⇨ 'text/plain'
|
||||
mime.getType('.txt'); // ⇨ 'text/plain'
|
||||
```
|
||||
|
||||
`null` is returned in cases where an extension is not detected or recognized
|
||||
|
||||
```javascript
|
||||
mime.getType('foo/txt'); // ⇨ null
|
||||
mime.getType('bogus_type'); // ⇨ null
|
||||
```
|
||||
|
||||
### mime.getExtension(type)
|
||||
Get extension for the given mime type. Charset options (often included in
|
||||
Content-Type headers) are ignored.
|
||||
|
||||
```javascript
|
||||
mime.getExtension('text/plain'); // ⇨ 'txt'
|
||||
mime.getExtension('application/json'); // ⇨ 'json'
|
||||
mime.getExtension('text/html; charset=utf8'); // ⇨ 'html'
|
||||
```
|
||||
|
||||
### mime.define(typeMap[, force = false])
|
||||
|
||||
Define [more] type mappings.
|
||||
|
||||
`typeMap` is a map of type -> extensions, as documented in `new Mime`, above.
|
||||
|
||||
By default this method will throw an error if you try to map a type to an
|
||||
extension that is already assigned to another type. Passing `true` for the
|
||||
`force` argument will suppress this behavior (overriding any previous mapping).
|
||||
|
||||
```javascript
|
||||
mime.define({'text/x-abc': ['abc', 'abcd']});
|
||||
|
||||
mime.getType('abcd'); // ⇨ 'text/x-abc'
|
||||
mime.getExtension('text/x-abc') // ⇨ 'abc'
|
||||
```
|
||||
|
||||
## Command Line
|
||||
|
||||
mime [path_or_extension]
|
||||
|
||||
E.g.
|
||||
|
||||
> mime scripts/jquery.js
|
||||
application/javascript
|
||||
|
||||
----
|
||||
Markdown generated from [src/README_js.md](src/README_js.md) by [](https://github.com/broofa/runmd)
|
||||
46
node_modules/postcss-url/node_modules/mime/cli.js
generated
vendored
Executable file
46
node_modules/postcss-url/node_modules/mime/cli.js
generated
vendored
Executable file
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
'use strict';
|
||||
|
||||
process.title = 'mime';
|
||||
let mime = require('.');
|
||||
let pkg = require('./package.json');
|
||||
let args = process.argv.splice(2);
|
||||
|
||||
if (args.includes('--version') || args.includes('-v') || args.includes('--v')) {
|
||||
console.log(pkg.version);
|
||||
process.exit(0);
|
||||
} else if (args.includes('--name') || args.includes('-n') || args.includes('--n')) {
|
||||
console.log(pkg.name);
|
||||
process.exit(0);
|
||||
} else if (args.includes('--help') || args.includes('-h') || args.includes('--h')) {
|
||||
console.log(pkg.name + ' - ' + pkg.description + '\n');
|
||||
console.log(`Usage:
|
||||
|
||||
mime [flags] [path_or_extension]
|
||||
|
||||
Flags:
|
||||
--help, -h Show this message
|
||||
--version, -v Display the version
|
||||
--name, -n Print the name of the program
|
||||
|
||||
Note: the command will exit after it executes if a command is specified
|
||||
The path_or_extension is the path to the file or the extension of the file.
|
||||
|
||||
Examples:
|
||||
mime --help
|
||||
mime --version
|
||||
mime --name
|
||||
mime -v
|
||||
mime src/log.js
|
||||
mime new.py
|
||||
mime foo.sh
|
||||
`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
let file = args[0];
|
||||
let type = mime.getType(file);
|
||||
|
||||
process.stdout.write(type + '\n');
|
||||
|
||||
4
node_modules/postcss-url/node_modules/mime/index.js
generated
vendored
Executable file
4
node_modules/postcss-url/node_modules/mime/index.js
generated
vendored
Executable file
@@ -0,0 +1,4 @@
|
||||
'use strict';
|
||||
|
||||
let Mime = require('./Mime');
|
||||
module.exports = new Mime(require('./types/standard'), require('./types/other'));
|
||||
4
node_modules/postcss-url/node_modules/mime/lite.js
generated
vendored
Executable file
4
node_modules/postcss-url/node_modules/mime/lite.js
generated
vendored
Executable file
@@ -0,0 +1,4 @@
|
||||
'use strict';
|
||||
|
||||
let Mime = require('./Mime');
|
||||
module.exports = new Mime(require('./types/standard'));
|
||||
52
node_modules/postcss-url/node_modules/mime/package.json
generated
vendored
Executable file
52
node_modules/postcss-url/node_modules/mime/package.json
generated
vendored
Executable file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"author": {
|
||||
"name": "Robert Kieffer",
|
||||
"url": "http://github.com/broofa",
|
||||
"email": "robert@broofa.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"mime": "cli.js"
|
||||
},
|
||||
"contributors": [],
|
||||
"description": "A comprehensive library for mime-type mapping",
|
||||
"license": "MIT",
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"benchmark": "*",
|
||||
"chalk": "4.1.0",
|
||||
"eslint": "7.20.0",
|
||||
"mime-db": "1.46.0",
|
||||
"mime-score": "1.2.0",
|
||||
"mime-types": "2.1.28",
|
||||
"mocha": "8.3.0",
|
||||
"runmd": "*",
|
||||
"standard-version": "9.1.0"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"lite.js",
|
||||
"Mime.js",
|
||||
"cli.js",
|
||||
"/types"
|
||||
],
|
||||
"scripts": {
|
||||
"prepare": "node src/build.js && runmd --output README.md src/README_js.md",
|
||||
"release": "standard-version",
|
||||
"benchmark": "node src/benchmark.js",
|
||||
"md": "runmd --watch --output README.md src/README_js.md",
|
||||
"test": "mocha src/test.js"
|
||||
},
|
||||
"keywords": [
|
||||
"util",
|
||||
"mime"
|
||||
],
|
||||
"name": "mime",
|
||||
"repository": {
|
||||
"url": "https://github.com/broofa/mime",
|
||||
"type": "git"
|
||||
},
|
||||
"version": "2.5.2"
|
||||
}
|
||||
1
node_modules/postcss-url/node_modules/mime/types/other.js
generated
vendored
Executable file
1
node_modules/postcss-url/node_modules/mime/types/other.js
generated
vendored
Executable file
File diff suppressed because one or more lines are too long
1
node_modules/postcss-url/node_modules/mime/types/standard.js
generated
vendored
Executable file
1
node_modules/postcss-url/node_modules/mime/types/standard.js
generated
vendored
Executable file
File diff suppressed because one or more lines are too long
15
node_modules/postcss-url/node_modules/minimatch/LICENSE
generated
vendored
Executable file
15
node_modules/postcss-url/node_modules/minimatch/LICENSE
generated
vendored
Executable file
@@ -0,0 +1,15 @@
|
||||
The ISC License
|
||||
|
||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
224
node_modules/postcss-url/node_modules/minimatch/README.md
generated
vendored
Executable file
224
node_modules/postcss-url/node_modules/minimatch/README.md
generated
vendored
Executable file
@@ -0,0 +1,224 @@
|
||||
# minimatch
|
||||
|
||||
A minimal matching utility.
|
||||
|
||||
[](http://travis-ci.org/isaacs/minimatch)
|
||||
|
||||
|
||||
This is the matching library used internally by npm.
|
||||
|
||||
It works by converting glob expressions into JavaScript `RegExp`
|
||||
objects.
|
||||
|
||||
## Usage
|
||||
|
||||
```javascript
|
||||
var minimatch = require("minimatch")
|
||||
|
||||
minimatch("bar.foo", "*.foo") // true!
|
||||
minimatch("bar.foo", "*.bar") // false!
|
||||
minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
Supports these glob features:
|
||||
|
||||
* Brace Expansion
|
||||
* Extended glob matching
|
||||
* "Globstar" `**` matching
|
||||
|
||||
See:
|
||||
|
||||
* `man sh`
|
||||
* `man bash`
|
||||
* `man 3 fnmatch`
|
||||
* `man 5 gitignore`
|
||||
|
||||
## Minimatch Class
|
||||
|
||||
Create a minimatch object by instantiating the `minimatch.Minimatch` class.
|
||||
|
||||
```javascript
|
||||
var Minimatch = require("minimatch").Minimatch
|
||||
var mm = new Minimatch(pattern, options)
|
||||
```
|
||||
|
||||
### Properties
|
||||
|
||||
* `pattern` The original pattern the minimatch object represents.
|
||||
* `options` The options supplied to the constructor.
|
||||
* `set` A 2-dimensional array of regexp or string expressions.
|
||||
Each row in the
|
||||
array corresponds to a brace-expanded pattern. Each item in the row
|
||||
corresponds to a single path-part. For example, the pattern
|
||||
`{a,b/c}/d` would expand to a set of patterns like:
|
||||
|
||||
[ [ a, d ]
|
||||
, [ b, c, d ] ]
|
||||
|
||||
If a portion of the pattern doesn't have any "magic" in it
|
||||
(that is, it's something like `"foo"` rather than `fo*o?`), then it
|
||||
will be left as a string rather than converted to a regular
|
||||
expression.
|
||||
|
||||
* `regexp` Created by the `makeRe` method. A single regular expression
|
||||
expressing the entire pattern. This is useful in cases where you wish
|
||||
to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
|
||||
* `negate` True if the pattern is negated.
|
||||
* `comment` True if the pattern is a comment.
|
||||
* `empty` True if the pattern is `""`.
|
||||
|
||||
### Methods
|
||||
|
||||
* `makeRe` Generate the `regexp` member if necessary, and return it.
|
||||
Will return `false` if the pattern is invalid.
|
||||
* `match(fname)` Return true if the filename matches the pattern, or
|
||||
false otherwise.
|
||||
* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
|
||||
filename, and match it against a single row in the `regExpSet`. This
|
||||
method is mainly for internal use, but is exposed so that it can be
|
||||
used by a glob-walker that needs to avoid excessive filesystem calls.
|
||||
|
||||
All other methods are internal, and will be called as necessary.
|
||||
|
||||
### minimatch(path, pattern, options)
|
||||
|
||||
Main export. Tests a path against the pattern using the options.
|
||||
|
||||
```javascript
|
||||
var isJS = minimatch(file, "*.js", { matchBase: true })
|
||||
```
|
||||
|
||||
### minimatch.filter(pattern, options)
|
||||
|
||||
Returns a function that tests its
|
||||
supplied argument, suitable for use with `Array.filter`. Example:
|
||||
|
||||
```javascript
|
||||
var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
|
||||
```
|
||||
|
||||
### minimatch.match(list, pattern, options)
|
||||
|
||||
Match against the list of
|
||||
files, in the style of fnmatch or glob. If nothing is matched, and
|
||||
options.nonull is set, then return a list containing the pattern itself.
|
||||
|
||||
```javascript
|
||||
var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
|
||||
```
|
||||
|
||||
### minimatch.makeRe(pattern, options)
|
||||
|
||||
Make a regular expression object from the pattern.
|
||||
|
||||
## Options
|
||||
|
||||
All options are `false` by default.
|
||||
|
||||
### debug
|
||||
|
||||
Dump a ton of stuff to stderr.
|
||||
|
||||
### nobrace
|
||||
|
||||
Do not expand `{a,b}` and `{1..3}` brace sets.
|
||||
|
||||
### noglobstar
|
||||
|
||||
Disable `**` matching against multiple folder names.
|
||||
|
||||
### dot
|
||||
|
||||
Allow patterns to match filenames starting with a period, even if
|
||||
the pattern does not explicitly have a period in that spot.
|
||||
|
||||
Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
|
||||
is set.
|
||||
|
||||
### noext
|
||||
|
||||
Disable "extglob" style patterns like `+(a|b)`.
|
||||
|
||||
### nocase
|
||||
|
||||
Perform a case-insensitive match.
|
||||
|
||||
### nonull
|
||||
|
||||
When a match is not found by `minimatch.match`, return a list containing
|
||||
the pattern itself if this option is set. When not set, an empty list
|
||||
is returned if there are no matches.
|
||||
|
||||
### matchBase
|
||||
|
||||
If set, then patterns without slashes will be matched
|
||||
against the basename of the path if it contains slashes. For example,
|
||||
`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
|
||||
|
||||
### nocomment
|
||||
|
||||
Suppress the behavior of treating `#` at the start of a pattern as a
|
||||
comment.
|
||||
|
||||
### nonegate
|
||||
|
||||
Suppress the behavior of treating a leading `!` character as negation.
|
||||
|
||||
### flipNegate
|
||||
|
||||
Returns from negate expressions the same as if they were not negated.
|
||||
(Ie, true on a hit, false on a miss.)
|
||||
|
||||
### partial
|
||||
|
||||
Compare a partial path to a pattern. As long as the parts of the path that
|
||||
are present are not contradicted by the pattern, it will be treated as a
|
||||
match. This is useful in applications where you're walking through a
|
||||
folder structure, and don't yet have the full path, but want to ensure that
|
||||
you do not walk down paths that can never be a match.
|
||||
|
||||
For example,
|
||||
|
||||
```js
|
||||
minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d
|
||||
minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d
|
||||
minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a
|
||||
```
|
||||
|
||||
## Comparisons to other fnmatch/glob implementations
|
||||
|
||||
While strict compliance with the existing standards is a worthwhile
|
||||
goal, some discrepancies exist between minimatch and other
|
||||
implementations, and are intentional.
|
||||
|
||||
If the pattern starts with a `!` character, then it is negated. Set the
|
||||
`nonegate` flag to suppress this behavior, and treat leading `!`
|
||||
characters normally. This is perhaps relevant if you wish to start the
|
||||
pattern with a negative extglob pattern like `!(a|B)`. Multiple `!`
|
||||
characters at the start of a pattern will negate the pattern multiple
|
||||
times.
|
||||
|
||||
If a pattern starts with `#`, then it is treated as a comment, and
|
||||
will not match anything. Use `\#` to match a literal `#` at the
|
||||
start of a line, or set the `nocomment` flag to suppress this behavior.
|
||||
|
||||
The double-star character `**` is supported by default, unless the
|
||||
`noglobstar` flag is set. This is supported in the manner of bsdglob
|
||||
and bash 4.1, where `**` only has special significance if it is the only
|
||||
thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
|
||||
`a/**b` will not.
|
||||
|
||||
If an escaped pattern has no matches, and the `nonull` flag is set,
|
||||
then minimatch.match returns the pattern as-provided, rather than
|
||||
interpreting the character escapes. For example,
|
||||
`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
|
||||
`"*a?"`. This is akin to setting the `nullglob` option in bash, except
|
||||
that it does not resolve escaped pattern characters.
|
||||
|
||||
If brace expansion is not disabled, then it is performed before any
|
||||
other interpretation of the glob pattern. Thus, a pattern like
|
||||
`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
|
||||
**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
|
||||
checked for validity. Since those two are valid, matching proceeds.
|
||||
947
node_modules/postcss-url/node_modules/minimatch/minimatch.js
generated
vendored
Executable file
947
node_modules/postcss-url/node_modules/minimatch/minimatch.js
generated
vendored
Executable file
@@ -0,0 +1,947 @@
|
||||
module.exports = minimatch
|
||||
minimatch.Minimatch = Minimatch
|
||||
|
||||
var path = (function () { try { return require('path') } catch (e) {}}()) || {
|
||||
sep: '/'
|
||||
}
|
||||
minimatch.sep = path.sep
|
||||
|
||||
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
||||
var expand = require('brace-expansion')
|
||||
|
||||
var plTypes = {
|
||||
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
||||
'?': { open: '(?:', close: ')?' },
|
||||
'+': { open: '(?:', close: ')+' },
|
||||
'*': { open: '(?:', close: ')*' },
|
||||
'@': { open: '(?:', close: ')' }
|
||||
}
|
||||
|
||||
// any single thing other than /
|
||||
// don't need to escape / when using new RegExp()
|
||||
var qmark = '[^/]'
|
||||
|
||||
// * => any number of characters
|
||||
var star = qmark + '*?'
|
||||
|
||||
// ** when dots are allowed. Anything goes, except .. and .
|
||||
// not (^ or / followed by one or two dots followed by $ or /),
|
||||
// followed by anything, any number of times.
|
||||
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
|
||||
|
||||
// not a ^ or / followed by a dot,
|
||||
// followed by anything, any number of times.
|
||||
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
|
||||
|
||||
// characters that need to be escaped in RegExp.
|
||||
var reSpecials = charSet('().*{}+?[]^$\\!')
|
||||
|
||||
// "abc" -> { a:true, b:true, c:true }
|
||||
function charSet (s) {
|
||||
return s.split('').reduce(function (set, c) {
|
||||
set[c] = true
|
||||
return set
|
||||
}, {})
|
||||
}
|
||||
|
||||
// normalizes slashes.
|
||||
var slashSplit = /\/+/
|
||||
|
||||
minimatch.filter = filter
|
||||
function filter (pattern, options) {
|
||||
options = options || {}
|
||||
return function (p, i, list) {
|
||||
return minimatch(p, pattern, options)
|
||||
}
|
||||
}
|
||||
|
||||
function ext (a, b) {
|
||||
b = b || {}
|
||||
var t = {}
|
||||
Object.keys(a).forEach(function (k) {
|
||||
t[k] = a[k]
|
||||
})
|
||||
Object.keys(b).forEach(function (k) {
|
||||
t[k] = b[k]
|
||||
})
|
||||
return t
|
||||
}
|
||||
|
||||
minimatch.defaults = function (def) {
|
||||
if (!def || typeof def !== 'object' || !Object.keys(def).length) {
|
||||
return minimatch
|
||||
}
|
||||
|
||||
var orig = minimatch
|
||||
|
||||
var m = function minimatch (p, pattern, options) {
|
||||
return orig(p, pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.Minimatch = function Minimatch (pattern, options) {
|
||||
return new orig.Minimatch(pattern, ext(def, options))
|
||||
}
|
||||
m.Minimatch.defaults = function defaults (options) {
|
||||
return orig.defaults(ext(def, options)).Minimatch
|
||||
}
|
||||
|
||||
m.filter = function filter (pattern, options) {
|
||||
return orig.filter(pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.defaults = function defaults (options) {
|
||||
return orig.defaults(ext(def, options))
|
||||
}
|
||||
|
||||
m.makeRe = function makeRe (pattern, options) {
|
||||
return orig.makeRe(pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.braceExpand = function braceExpand (pattern, options) {
|
||||
return orig.braceExpand(pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.match = function (list, pattern, options) {
|
||||
return orig.match(list, pattern, ext(def, options))
|
||||
}
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
Minimatch.defaults = function (def) {
|
||||
return minimatch.defaults(def).Minimatch
|
||||
}
|
||||
|
||||
function minimatch (p, pattern, options) {
|
||||
assertValidPattern(pattern)
|
||||
|
||||
if (!options) options = {}
|
||||
|
||||
// shortcut: comments match nothing.
|
||||
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||
return false
|
||||
}
|
||||
|
||||
return new Minimatch(pattern, options).match(p)
|
||||
}
|
||||
|
||||
function Minimatch (pattern, options) {
|
||||
if (!(this instanceof Minimatch)) {
|
||||
return new Minimatch(pattern, options)
|
||||
}
|
||||
|
||||
assertValidPattern(pattern)
|
||||
|
||||
if (!options) options = {}
|
||||
|
||||
pattern = pattern.trim()
|
||||
|
||||
// windows support: need to use /, not \
|
||||
if (path.sep !== '/') {
|
||||
pattern = pattern.split(path.sep).join('/')
|
||||
}
|
||||
|
||||
this.options = options
|
||||
this.set = []
|
||||
this.pattern = pattern
|
||||
this.regexp = null
|
||||
this.negate = false
|
||||
this.comment = false
|
||||
this.empty = false
|
||||
this.partial = !!options.partial
|
||||
|
||||
// make the set of regexps etc.
|
||||
this.make()
|
||||
}
|
||||
|
||||
Minimatch.prototype.debug = function () {}
|
||||
|
||||
Minimatch.prototype.make = make
|
||||
function make () {
|
||||
var pattern = this.pattern
|
||||
var options = this.options
|
||||
|
||||
// empty patterns and comments match nothing.
|
||||
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||
this.comment = true
|
||||
return
|
||||
}
|
||||
if (!pattern) {
|
||||
this.empty = true
|
||||
return
|
||||
}
|
||||
|
||||
// step 1: figure out negation, etc.
|
||||
this.parseNegate()
|
||||
|
||||
// step 2: expand braces
|
||||
var set = this.globSet = this.braceExpand()
|
||||
|
||||
if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
// step 3: now we have a set, so turn each one into a series of path-portion
|
||||
// matching patterns.
|
||||
// These will be regexps, except in the case of "**", which is
|
||||
// set to the GLOBSTAR object for globstar behavior,
|
||||
// and will not contain any / characters
|
||||
set = this.globParts = set.map(function (s) {
|
||||
return s.split(slashSplit)
|
||||
})
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
// glob --> regexps
|
||||
set = set.map(function (s, si, set) {
|
||||
return s.map(this.parse, this)
|
||||
}, this)
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
// filter out everything that didn't compile properly.
|
||||
set = set.filter(function (s) {
|
||||
return s.indexOf(false) === -1
|
||||
})
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
this.set = set
|
||||
}
|
||||
|
||||
Minimatch.prototype.parseNegate = parseNegate
|
||||
function parseNegate () {
|
||||
var pattern = this.pattern
|
||||
var negate = false
|
||||
var options = this.options
|
||||
var negateOffset = 0
|
||||
|
||||
if (options.nonegate) return
|
||||
|
||||
for (var i = 0, l = pattern.length
|
||||
; i < l && pattern.charAt(i) === '!'
|
||||
; i++) {
|
||||
negate = !negate
|
||||
negateOffset++
|
||||
}
|
||||
|
||||
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
||||
this.negate = negate
|
||||
}
|
||||
|
||||
// Brace expansion:
|
||||
// a{b,c}d -> abd acd
|
||||
// a{b,}c -> abc ac
|
||||
// a{0..3}d -> a0d a1d a2d a3d
|
||||
// a{b,c{d,e}f}g -> abg acdfg acefg
|
||||
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
||||
//
|
||||
// Invalid sets are not expanded.
|
||||
// a{2..}b -> a{2..}b
|
||||
// a{b}c -> a{b}c
|
||||
minimatch.braceExpand = function (pattern, options) {
|
||||
return braceExpand(pattern, options)
|
||||
}
|
||||
|
||||
Minimatch.prototype.braceExpand = braceExpand
|
||||
|
||||
function braceExpand (pattern, options) {
|
||||
if (!options) {
|
||||
if (this instanceof Minimatch) {
|
||||
options = this.options
|
||||
} else {
|
||||
options = {}
|
||||
}
|
||||
}
|
||||
|
||||
pattern = typeof pattern === 'undefined'
|
||||
? this.pattern : pattern
|
||||
|
||||
assertValidPattern(pattern)
|
||||
|
||||
// Thanks to Yeting Li <https://github.com/yetingli> for
|
||||
// improving this regexp to avoid a ReDOS vulnerability.
|
||||
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
|
||||
// shortcut. no need to expand.
|
||||
return [pattern]
|
||||
}
|
||||
|
||||
return expand(pattern)
|
||||
}
|
||||
|
||||
var MAX_PATTERN_LENGTH = 1024 * 64
|
||||
var assertValidPattern = function (pattern) {
|
||||
if (typeof pattern !== 'string') {
|
||||
throw new TypeError('invalid pattern')
|
||||
}
|
||||
|
||||
if (pattern.length > MAX_PATTERN_LENGTH) {
|
||||
throw new TypeError('pattern is too long')
|
||||
}
|
||||
}
|
||||
|
||||
// parse a component of the expanded set.
|
||||
// At this point, no pattern may contain "/" in it
|
||||
// so we're going to return a 2d array, where each entry is the full
|
||||
// pattern, split on '/', and then turned into a regular expression.
|
||||
// A regexp is made at the end which joins each array with an
|
||||
// escaped /, and another full one which joins each regexp with |.
|
||||
//
|
||||
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
||||
// when it is the *only* thing in a path portion. Otherwise, any series
|
||||
// of * is equivalent to a single *. Globstar behavior is enabled by
|
||||
// default, and can be disabled by setting options.noglobstar.
|
||||
Minimatch.prototype.parse = parse
|
||||
var SUBPARSE = {}
|
||||
function parse (pattern, isSub) {
|
||||
assertValidPattern(pattern)
|
||||
|
||||
var options = this.options
|
||||
|
||||
// shortcuts
|
||||
if (pattern === '**') {
|
||||
if (!options.noglobstar)
|
||||
return GLOBSTAR
|
||||
else
|
||||
pattern = '*'
|
||||
}
|
||||
if (pattern === '') return ''
|
||||
|
||||
var re = ''
|
||||
var hasMagic = !!options.nocase
|
||||
var escaping = false
|
||||
// ? => one single character
|
||||
var patternListStack = []
|
||||
var negativeLists = []
|
||||
var stateChar
|
||||
var inClass = false
|
||||
var reClassStart = -1
|
||||
var classStart = -1
|
||||
// . and .. never match anything that doesn't start with .,
|
||||
// even when options.dot is set.
|
||||
var patternStart = pattern.charAt(0) === '.' ? '' // anything
|
||||
// not (start or / followed by . or .. followed by / or end)
|
||||
: options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
|
||||
: '(?!\\.)'
|
||||
var self = this
|
||||
|
||||
function clearStateChar () {
|
||||
if (stateChar) {
|
||||
// we had some state-tracking character
|
||||
// that wasn't consumed by this pass.
|
||||
switch (stateChar) {
|
||||
case '*':
|
||||
re += star
|
||||
hasMagic = true
|
||||
break
|
||||
case '?':
|
||||
re += qmark
|
||||
hasMagic = true
|
||||
break
|
||||
default:
|
||||
re += '\\' + stateChar
|
||||
break
|
||||
}
|
||||
self.debug('clearStateChar %j %j', stateChar, re)
|
||||
stateChar = false
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0, len = pattern.length, c
|
||||
; (i < len) && (c = pattern.charAt(i))
|
||||
; i++) {
|
||||
this.debug('%s\t%s %s %j', pattern, i, re, c)
|
||||
|
||||
// skip over any that are escaped.
|
||||
if (escaping && reSpecials[c]) {
|
||||
re += '\\' + c
|
||||
escaping = false
|
||||
continue
|
||||
}
|
||||
|
||||
switch (c) {
|
||||
/* istanbul ignore next */
|
||||
case '/': {
|
||||
// completely not allowed, even escaped.
|
||||
// Should already be path-split by now.
|
||||
return false
|
||||
}
|
||||
|
||||
case '\\':
|
||||
clearStateChar()
|
||||
escaping = true
|
||||
continue
|
||||
|
||||
// the various stateChar values
|
||||
// for the "extglob" stuff.
|
||||
case '?':
|
||||
case '*':
|
||||
case '+':
|
||||
case '@':
|
||||
case '!':
|
||||
this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
|
||||
|
||||
// all of those are literals inside a class, except that
|
||||
// the glob [!a] means [^a] in regexp
|
||||
if (inClass) {
|
||||
this.debug(' in class')
|
||||
if (c === '!' && i === classStart + 1) c = '^'
|
||||
re += c
|
||||
continue
|
||||
}
|
||||
|
||||
// if we already have a stateChar, then it means
|
||||
// that there was something like ** or +? in there.
|
||||
// Handle the stateChar, then proceed with this one.
|
||||
self.debug('call clearStateChar %j', stateChar)
|
||||
clearStateChar()
|
||||
stateChar = c
|
||||
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
||||
// just clear the statechar *now*, rather than even diving into
|
||||
// the patternList stuff.
|
||||
if (options.noext) clearStateChar()
|
||||
continue
|
||||
|
||||
case '(':
|
||||
if (inClass) {
|
||||
re += '('
|
||||
continue
|
||||
}
|
||||
|
||||
if (!stateChar) {
|
||||
re += '\\('
|
||||
continue
|
||||
}
|
||||
|
||||
patternListStack.push({
|
||||
type: stateChar,
|
||||
start: i - 1,
|
||||
reStart: re.length,
|
||||
open: plTypes[stateChar].open,
|
||||
close: plTypes[stateChar].close
|
||||
})
|
||||
// negation is (?:(?!js)[^/]*)
|
||||
re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
|
||||
this.debug('plType %j %j', stateChar, re)
|
||||
stateChar = false
|
||||
continue
|
||||
|
||||
case ')':
|
||||
if (inClass || !patternListStack.length) {
|
||||
re += '\\)'
|
||||
continue
|
||||
}
|
||||
|
||||
clearStateChar()
|
||||
hasMagic = true
|
||||
var pl = patternListStack.pop()
|
||||
// negation is (?:(?!js)[^/]*)
|
||||
// The others are (?:<pattern>)<type>
|
||||
re += pl.close
|
||||
if (pl.type === '!') {
|
||||
negativeLists.push(pl)
|
||||
}
|
||||
pl.reEnd = re.length
|
||||
continue
|
||||
|
||||
case '|':
|
||||
if (inClass || !patternListStack.length || escaping) {
|
||||
re += '\\|'
|
||||
escaping = false
|
||||
continue
|
||||
}
|
||||
|
||||
clearStateChar()
|
||||
re += '|'
|
||||
continue
|
||||
|
||||
// these are mostly the same in regexp and glob
|
||||
case '[':
|
||||
// swallow any state-tracking char before the [
|
||||
clearStateChar()
|
||||
|
||||
if (inClass) {
|
||||
re += '\\' + c
|
||||
continue
|
||||
}
|
||||
|
||||
inClass = true
|
||||
classStart = i
|
||||
reClassStart = re.length
|
||||
re += c
|
||||
continue
|
||||
|
||||
case ']':
|
||||
// a right bracket shall lose its special
|
||||
// meaning and represent itself in
|
||||
// a bracket expression if it occurs
|
||||
// first in the list. -- POSIX.2 2.8.3.2
|
||||
if (i === classStart + 1 || !inClass) {
|
||||
re += '\\' + c
|
||||
escaping = false
|
||||
continue
|
||||
}
|
||||
|
||||
// handle the case where we left a class open.
|
||||
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
||||
// split where the last [ was, make sure we don't have
|
||||
// an invalid re. if so, re-walk the contents of the
|
||||
// would-be class to re-translate any characters that
|
||||
// were passed through as-is
|
||||
// TODO: It would probably be faster to determine this
|
||||
// without a try/catch and a new RegExp, but it's tricky
|
||||
// to do safely. For now, this is safe and works.
|
||||
var cs = pattern.substring(classStart + 1, i)
|
||||
try {
|
||||
RegExp('[' + cs + ']')
|
||||
} catch (er) {
|
||||
// not a valid class!
|
||||
var sp = this.parse(cs, SUBPARSE)
|
||||
re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
|
||||
hasMagic = hasMagic || sp[1]
|
||||
inClass = false
|
||||
continue
|
||||
}
|
||||
|
||||
// finish up the class.
|
||||
hasMagic = true
|
||||
inClass = false
|
||||
re += c
|
||||
continue
|
||||
|
||||
default:
|
||||
// swallow any state char that wasn't consumed
|
||||
clearStateChar()
|
||||
|
||||
if (escaping) {
|
||||
// no need
|
||||
escaping = false
|
||||
} else if (reSpecials[c]
|
||||
&& !(c === '^' && inClass)) {
|
||||
re += '\\'
|
||||
}
|
||||
|
||||
re += c
|
||||
|
||||
} // switch
|
||||
} // for
|
||||
|
||||
// handle the case where we left a class open.
|
||||
// "[abc" is valid, equivalent to "\[abc"
|
||||
if (inClass) {
|
||||
// split where the last [ was, and escape it
|
||||
// this is a huge pita. We now have to re-walk
|
||||
// the contents of the would-be class to re-translate
|
||||
// any characters that were passed through as-is
|
||||
cs = pattern.substr(classStart + 1)
|
||||
sp = this.parse(cs, SUBPARSE)
|
||||
re = re.substr(0, reClassStart) + '\\[' + sp[0]
|
||||
hasMagic = hasMagic || sp[1]
|
||||
}
|
||||
|
||||
// handle the case where we had a +( thing at the *end*
|
||||
// of the pattern.
|
||||
// each pattern list stack adds 3 chars, and we need to go through
|
||||
// and escape any | chars that were passed through as-is for the regexp.
|
||||
// Go through and escape them, taking care not to double-escape any
|
||||
// | chars that were already escaped.
|
||||
for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
|
||||
var tail = re.slice(pl.reStart + pl.open.length)
|
||||
this.debug('setting tail', re, pl)
|
||||
// maybe some even number of \, then maybe 1 \, followed by a |
|
||||
tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
|
||||
if (!$2) {
|
||||
// the | isn't already escaped, so escape it.
|
||||
$2 = '\\'
|
||||
}
|
||||
|
||||
// need to escape all those slashes *again*, without escaping the
|
||||
// one that we need for escaping the | character. As it works out,
|
||||
// escaping an even number of slashes can be done by simply repeating
|
||||
// it exactly after itself. That's why this trick works.
|
||||
//
|
||||
// I am sorry that you have to see this.
|
||||
return $1 + $1 + $2 + '|'
|
||||
})
|
||||
|
||||
this.debug('tail=%j\n %s', tail, tail, pl, re)
|
||||
var t = pl.type === '*' ? star
|
||||
: pl.type === '?' ? qmark
|
||||
: '\\' + pl.type
|
||||
|
||||
hasMagic = true
|
||||
re = re.slice(0, pl.reStart) + t + '\\(' + tail
|
||||
}
|
||||
|
||||
// handle trailing things that only matter at the very end.
|
||||
clearStateChar()
|
||||
if (escaping) {
|
||||
// trailing \\
|
||||
re += '\\\\'
|
||||
}
|
||||
|
||||
// only need to apply the nodot start if the re starts with
|
||||
// something that could conceivably capture a dot
|
||||
var addPatternStart = false
|
||||
switch (re.charAt(0)) {
|
||||
case '[': case '.': case '(': addPatternStart = true
|
||||
}
|
||||
|
||||
// Hack to work around lack of negative lookbehind in JS
|
||||
// A pattern like: *.!(x).!(y|z) needs to ensure that a name
|
||||
// like 'a.xyz.yz' doesn't match. So, the first negative
|
||||
// lookahead, has to look ALL the way ahead, to the end of
|
||||
// the pattern.
|
||||
for (var n = negativeLists.length - 1; n > -1; n--) {
|
||||
var nl = negativeLists[n]
|
||||
|
||||
var nlBefore = re.slice(0, nl.reStart)
|
||||
var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
|
||||
var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
|
||||
var nlAfter = re.slice(nl.reEnd)
|
||||
|
||||
nlLast += nlAfter
|
||||
|
||||
// Handle nested stuff like *(*.js|!(*.json)), where open parens
|
||||
// mean that we should *not* include the ) in the bit that is considered
|
||||
// "after" the negated section.
|
||||
var openParensBefore = nlBefore.split('(').length - 1
|
||||
var cleanAfter = nlAfter
|
||||
for (i = 0; i < openParensBefore; i++) {
|
||||
cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
|
||||
}
|
||||
nlAfter = cleanAfter
|
||||
|
||||
var dollar = ''
|
||||
if (nlAfter === '' && isSub !== SUBPARSE) {
|
||||
dollar = '$'
|
||||
}
|
||||
var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
|
||||
re = newRe
|
||||
}
|
||||
|
||||
// if the re is not "" at this point, then we need to make sure
|
||||
// it doesn't match against an empty path part.
|
||||
// Otherwise a/* will match a/, which it should not.
|
||||
if (re !== '' && hasMagic) {
|
||||
re = '(?=.)' + re
|
||||
}
|
||||
|
||||
if (addPatternStart) {
|
||||
re = patternStart + re
|
||||
}
|
||||
|
||||
// parsing just a piece of a larger pattern.
|
||||
if (isSub === SUBPARSE) {
|
||||
return [re, hasMagic]
|
||||
}
|
||||
|
||||
// skip the regexp for non-magical patterns
|
||||
// unescape anything in it, though, so that it'll be
|
||||
// an exact match against a file etc.
|
||||
if (!hasMagic) {
|
||||
return globUnescape(pattern)
|
||||
}
|
||||
|
||||
var flags = options.nocase ? 'i' : ''
|
||||
try {
|
||||
var regExp = new RegExp('^' + re + '$', flags)
|
||||
} catch (er) /* istanbul ignore next - should be impossible */ {
|
||||
// If it was an invalid regular expression, then it can't match
|
||||
// anything. This trick looks for a character after the end of
|
||||
// the string, which is of course impossible, except in multi-line
|
||||
// mode, but it's not a /m regex.
|
||||
return new RegExp('$.')
|
||||
}
|
||||
|
||||
regExp._glob = pattern
|
||||
regExp._src = re
|
||||
|
||||
return regExp
|
||||
}
|
||||
|
||||
minimatch.makeRe = function (pattern, options) {
|
||||
return new Minimatch(pattern, options || {}).makeRe()
|
||||
}
|
||||
|
||||
Minimatch.prototype.makeRe = makeRe
|
||||
function makeRe () {
|
||||
if (this.regexp || this.regexp === false) return this.regexp
|
||||
|
||||
// at this point, this.set is a 2d array of partial
|
||||
// pattern strings, or "**".
|
||||
//
|
||||
// It's better to use .match(). This function shouldn't
|
||||
// be used, really, but it's pretty convenient sometimes,
|
||||
// when you just want to work with a regex.
|
||||
var set = this.set
|
||||
|
||||
if (!set.length) {
|
||||
this.regexp = false
|
||||
return this.regexp
|
||||
}
|
||||
var options = this.options
|
||||
|
||||
var twoStar = options.noglobstar ? star
|
||||
: options.dot ? twoStarDot
|
||||
: twoStarNoDot
|
||||
var flags = options.nocase ? 'i' : ''
|
||||
|
||||
var re = set.map(function (pattern) {
|
||||
return pattern.map(function (p) {
|
||||
return (p === GLOBSTAR) ? twoStar
|
||||
: (typeof p === 'string') ? regExpEscape(p)
|
||||
: p._src
|
||||
}).join('\\\/')
|
||||
}).join('|')
|
||||
|
||||
// must match entire pattern
|
||||
// ending in a * or ** will make it less strict.
|
||||
re = '^(?:' + re + ')$'
|
||||
|
||||
// can match anything, as long as it's not this.
|
||||
if (this.negate) re = '^(?!' + re + ').*$'
|
||||
|
||||
try {
|
||||
this.regexp = new RegExp(re, flags)
|
||||
} catch (ex) /* istanbul ignore next - should be impossible */ {
|
||||
this.regexp = false
|
||||
}
|
||||
return this.regexp
|
||||
}
|
||||
|
||||
minimatch.match = function (list, pattern, options) {
|
||||
options = options || {}
|
||||
var mm = new Minimatch(pattern, options)
|
||||
list = list.filter(function (f) {
|
||||
return mm.match(f)
|
||||
})
|
||||
if (mm.options.nonull && !list.length) {
|
||||
list.push(pattern)
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
Minimatch.prototype.match = function match (f, partial) {
|
||||
if (typeof partial === 'undefined') partial = this.partial
|
||||
this.debug('match', f, this.pattern)
|
||||
// short-circuit in the case of busted things.
|
||||
// comments, etc.
|
||||
if (this.comment) return false
|
||||
if (this.empty) return f === ''
|
||||
|
||||
if (f === '/' && partial) return true
|
||||
|
||||
var options = this.options
|
||||
|
||||
// windows: need to use /, not \
|
||||
if (path.sep !== '/') {
|
||||
f = f.split(path.sep).join('/')
|
||||
}
|
||||
|
||||
// treat the test path as a set of pathparts.
|
||||
f = f.split(slashSplit)
|
||||
this.debug(this.pattern, 'split', f)
|
||||
|
||||
// just ONE of the pattern sets in this.set needs to match
|
||||
// in order for it to be valid. If negating, then just one
|
||||
// match means that we have failed.
|
||||
// Either way, return on the first hit.
|
||||
|
||||
var set = this.set
|
||||
this.debug(this.pattern, 'set', set)
|
||||
|
||||
// Find the basename of the path by looking for the last non-empty segment
|
||||
var filename
|
||||
var i
|
||||
for (i = f.length - 1; i >= 0; i--) {
|
||||
filename = f[i]
|
||||
if (filename) break
|
||||
}
|
||||
|
||||
for (i = 0; i < set.length; i++) {
|
||||
var pattern = set[i]
|
||||
var file = f
|
||||
if (options.matchBase && pattern.length === 1) {
|
||||
file = [filename]
|
||||
}
|
||||
var hit = this.matchOne(file, pattern, partial)
|
||||
if (hit) {
|
||||
if (options.flipNegate) return true
|
||||
return !this.negate
|
||||
}
|
||||
}
|
||||
|
||||
// didn't get any hits. this is success if it's a negative
|
||||
// pattern, failure otherwise.
|
||||
if (options.flipNegate) return false
|
||||
return this.negate
|
||||
}
|
||||
|
||||
// set partial to true to test if, for example,
|
||||
// "/a/b" matches the start of "/*/b/*/d"
|
||||
// Partial means, if you run out of file before you run
|
||||
// out of pattern, then that's fine, as long as all
|
||||
// the parts match.
|
||||
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
||||
var options = this.options
|
||||
|
||||
this.debug('matchOne',
|
||||
{ 'this': this, file: file, pattern: pattern })
|
||||
|
||||
this.debug('matchOne', file.length, pattern.length)
|
||||
|
||||
for (var fi = 0,
|
||||
pi = 0,
|
||||
fl = file.length,
|
||||
pl = pattern.length
|
||||
; (fi < fl) && (pi < pl)
|
||||
; fi++, pi++) {
|
||||
this.debug('matchOne loop')
|
||||
var p = pattern[pi]
|
||||
var f = file[fi]
|
||||
|
||||
this.debug(pattern, p, f)
|
||||
|
||||
// should be impossible.
|
||||
// some invalid regexp stuff in the set.
|
||||
/* istanbul ignore if */
|
||||
if (p === false) return false
|
||||
|
||||
if (p === GLOBSTAR) {
|
||||
this.debug('GLOBSTAR', [pattern, p, f])
|
||||
|
||||
// "**"
|
||||
// a/**/b/**/c would match the following:
|
||||
// a/b/x/y/z/c
|
||||
// a/x/y/z/b/c
|
||||
// a/b/x/b/x/c
|
||||
// a/b/c
|
||||
// To do this, take the rest of the pattern after
|
||||
// the **, and see if it would match the file remainder.
|
||||
// If so, return success.
|
||||
// If not, the ** "swallows" a segment, and try again.
|
||||
// This is recursively awful.
|
||||
//
|
||||
// a/**/b/**/c matching a/b/x/y/z/c
|
||||
// - a matches a
|
||||
// - doublestar
|
||||
// - matchOne(b/x/y/z/c, b/**/c)
|
||||
// - b matches b
|
||||
// - doublestar
|
||||
// - matchOne(x/y/z/c, c) -> no
|
||||
// - matchOne(y/z/c, c) -> no
|
||||
// - matchOne(z/c, c) -> no
|
||||
// - matchOne(c, c) yes, hit
|
||||
var fr = fi
|
||||
var pr = pi + 1
|
||||
if (pr === pl) {
|
||||
this.debug('** at the end')
|
||||
// a ** at the end will just swallow the rest.
|
||||
// We have found a match.
|
||||
// however, it will not swallow /.x, unless
|
||||
// options.dot is set.
|
||||
// . and .. are *never* matched by **, for explosively
|
||||
// exponential reasons.
|
||||
for (; fi < fl; fi++) {
|
||||
if (file[fi] === '.' || file[fi] === '..' ||
|
||||
(!options.dot && file[fi].charAt(0) === '.')) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// ok, let's see if we can swallow whatever we can.
|
||||
while (fr < fl) {
|
||||
var swallowee = file[fr]
|
||||
|
||||
this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
|
||||
|
||||
// XXX remove this slice. Just pass the start index.
|
||||
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
||||
this.debug('globstar found match!', fr, fl, swallowee)
|
||||
// found a match.
|
||||
return true
|
||||
} else {
|
||||
// can't swallow "." or ".." ever.
|
||||
// can only swallow ".foo" when explicitly asked.
|
||||
if (swallowee === '.' || swallowee === '..' ||
|
||||
(!options.dot && swallowee.charAt(0) === '.')) {
|
||||
this.debug('dot detected!', file, fr, pattern, pr)
|
||||
break
|
||||
}
|
||||
|
||||
// ** swallows a segment, and continue.
|
||||
this.debug('globstar swallow a segment, and continue')
|
||||
fr++
|
||||
}
|
||||
}
|
||||
|
||||
// no match was found.
|
||||
// However, in partial mode, we can't say this is necessarily over.
|
||||
// If there's more *pattern* left, then
|
||||
/* istanbul ignore if */
|
||||
if (partial) {
|
||||
// ran out of file
|
||||
this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
|
||||
if (fr === fl) return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// something other than **
|
||||
// non-magic patterns just have to match exactly
|
||||
// patterns with magic have been turned into regexps.
|
||||
var hit
|
||||
if (typeof p === 'string') {
|
||||
hit = f === p
|
||||
this.debug('string match', p, f, hit)
|
||||
} else {
|
||||
hit = f.match(p)
|
||||
this.debug('pattern match', p, f, hit)
|
||||
}
|
||||
|
||||
if (!hit) return false
|
||||
}
|
||||
|
||||
// Note: ending in / means that we'll get a final ""
|
||||
// at the end of the pattern. This can only match a
|
||||
// corresponding "" at the end of the file.
|
||||
// If the file ends in /, then it can only match a
|
||||
// a pattern that ends in /, unless the pattern just
|
||||
// doesn't have any more for it. But, a/b/ should *not*
|
||||
// match "a/b/*", even though "" matches against the
|
||||
// [^/]*? pattern, except in partial mode, where it might
|
||||
// simply not be reached yet.
|
||||
// However, a/b/ should still satisfy a/*
|
||||
|
||||
// now either we fell off the end of the pattern, or we're done.
|
||||
if (fi === fl && pi === pl) {
|
||||
// ran out of pattern and filename at the same time.
|
||||
// an exact hit!
|
||||
return true
|
||||
} else if (fi === fl) {
|
||||
// ran out of file, but still had pattern left.
|
||||
// this is ok if we're doing the match as part of
|
||||
// a glob fs traversal.
|
||||
return partial
|
||||
} else /* istanbul ignore else */ if (pi === pl) {
|
||||
// ran out of pattern, still have file left.
|
||||
// this is only acceptable if we're on the very last
|
||||
// empty segment of a file with a trailing slash.
|
||||
// a/* should match a/b/
|
||||
return (fi === fl - 1) && (file[fi] === '')
|
||||
}
|
||||
|
||||
// should be unreachable.
|
||||
/* istanbul ignore next */
|
||||
throw new Error('wtf?')
|
||||
}
|
||||
|
||||
// replace stuff like \* with *
|
||||
function globUnescape (s) {
|
||||
return s.replace(/\\(.)/g, '$1')
|
||||
}
|
||||
|
||||
function regExpEscape (s) {
|
||||
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
|
||||
}
|
||||
33
node_modules/postcss-url/node_modules/minimatch/package.json
generated
vendored
Executable file
33
node_modules/postcss-url/node_modules/minimatch/package.json
generated
vendored
Executable file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
|
||||
"name": "minimatch",
|
||||
"description": "a glob matcher in javascript",
|
||||
"version": "3.0.8",
|
||||
"publishConfig": {
|
||||
"tag": "v3.0-legacy"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/isaacs/minimatch.git"
|
||||
},
|
||||
"main": "minimatch.js",
|
||||
"scripts": {
|
||||
"test": "tap",
|
||||
"preversion": "npm test",
|
||||
"postversion": "npm publish",
|
||||
"postpublish": "git push origin --all; git push origin --tags"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tap": "^15.1.6"
|
||||
},
|
||||
"license": "ISC",
|
||||
"files": [
|
||||
"minimatch.js"
|
||||
]
|
||||
}
|
||||
48
node_modules/postcss-url/package.json
generated
vendored
Executable file
48
node_modules/postcss-url/package.json
generated
vendored
Executable file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"name": "postcss-url",
|
||||
"version": "10.1.3",
|
||||
"description": "PostCSS plugin to rebase or inline on url().",
|
||||
"keywords": [
|
||||
"css",
|
||||
"postcss",
|
||||
"postcss-plugin",
|
||||
"url",
|
||||
"rebase",
|
||||
"inline",
|
||||
"base64",
|
||||
"assets"
|
||||
],
|
||||
"author": "Maxime Thirouin",
|
||||
"license": "MIT",
|
||||
"repository": "https://github.com/postcss/postcss-url.git",
|
||||
"main": "src/index.js",
|
||||
"files": [
|
||||
"src"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"dependencies": {
|
||||
"make-dir": "~3.1.0",
|
||||
"mime": "~2.5.2",
|
||||
"minimatch": "~3.0.4",
|
||||
"xxhashjs": "~0.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"chai": "4.1.2",
|
||||
"eslint": "7.12.1",
|
||||
"mocha": "8.2.1",
|
||||
"npmpub": "5.0.0",
|
||||
"postcss": "^8.0.0",
|
||||
"postcss-import": "12.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"postcss": "^8.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint --fix .",
|
||||
"tests": "mocha --recursive --require ./test/setup",
|
||||
"test": "npm run lint && npm run tests",
|
||||
"release": "npmpub"
|
||||
}
|
||||
}
|
||||
57
node_modules/postcss-url/src/index.js
generated
vendored
Executable file
57
node_modules/postcss-url/src/index.js
generated
vendored
Executable file
@@ -0,0 +1,57 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
|
||||
const declProcessor = require('./lib/decl-processor').declProcessor;
|
||||
|
||||
const plugin = (options) => {
|
||||
options = options || {};
|
||||
|
||||
return {
|
||||
postcssPlugin: 'postcss-url',
|
||||
Once(styles, { result }) {
|
||||
const promises = [];
|
||||
const opts = result.opts;
|
||||
const from = opts.from ? path.dirname(opts.from) : '.';
|
||||
const to = opts.to ? path.dirname(opts.to) : from;
|
||||
|
||||
styles.walkDecls((decl) =>
|
||||
promises.push(declProcessor(from, to, options, result, decl))
|
||||
);
|
||||
|
||||
return Promise.all(promises);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
plugin.postcss = true;
|
||||
|
||||
module.exports = plugin;
|
||||
|
||||
/**
|
||||
* @callback PostcssUrl~UrlProcessor
|
||||
* @param {String} from from
|
||||
* @param {String} dirname to dirname
|
||||
* @param {String} oldUrl url
|
||||
* @param {String} to destination
|
||||
* @param {Object} options plugin options
|
||||
* @param {Object} decl postcss declaration
|
||||
* @return {String|undefined} new url or undefined if url is old
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} PostcssUrl~HashOptions
|
||||
* @property {Function|String} [method=^xxhash32|xxhash64] - hash name or custom function, accepting file content
|
||||
* @see https://github.com/pierrec/js-xxhash
|
||||
* @property {Number} [shrink=8] - shrink hash string
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} Decl - postcss decl
|
||||
* @see http://api.postcss.org/Declaration.html
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} Result - postcss result
|
||||
* @see http://api.postcss.org/Result.html
|
||||
*/
|
||||
175
node_modules/postcss-url/src/lib/decl-processor.js
generated
vendored
Executable file
175
node_modules/postcss-url/src/lib/decl-processor.js
generated
vendored
Executable file
@@ -0,0 +1,175 @@
|
||||
'use strict';
|
||||
|
||||
const matchOptions = require('./match-options');
|
||||
const paths = require('./paths');
|
||||
|
||||
const getPathDeclFile = paths.getPathDeclFile;
|
||||
const getDirDeclFile = paths.getDirDeclFile;
|
||||
const prepareAsset = paths.prepareAsset;
|
||||
|
||||
/**
|
||||
* @typedef UrlRegExp
|
||||
* @name UrlRegExp
|
||||
* @desc A regex for match url with parentheses:
|
||||
* (before url)(the url)(after url).
|
||||
* (the url) will be replace with new url, and before and after will remain
|
||||
* @type RegExp
|
||||
*/
|
||||
/**
|
||||
* @type {UrlRegExp[]}
|
||||
*/
|
||||
const URL_PATTERNS = [
|
||||
/(url\(\s*['"]?)([^"')]+)(["']?\s*\))/g,
|
||||
/(AlphaImageLoader\(\s*src=['"]?)([^"')]+)(["'])/g
|
||||
];
|
||||
|
||||
const WITH_QUOTES = /^['"]/;
|
||||
|
||||
/**
|
||||
* Restricted modes
|
||||
*
|
||||
* @type {String[]}
|
||||
*/
|
||||
const PROCESS_TYPES = ['rebase', 'inline', 'copy', 'custom'];
|
||||
|
||||
const getUrlProcessorType = (optionUrl) =>
|
||||
typeof optionUrl === 'function' ? 'custom' : (optionUrl || 'rebase');
|
||||
|
||||
/**
|
||||
* @param {String} optionUrl
|
||||
* @returns {PostcssUrl~UrlProcessor}
|
||||
*/
|
||||
function getUrlProcessor(optionUrl) {
|
||||
const mode = getUrlProcessorType(optionUrl);
|
||||
|
||||
if (PROCESS_TYPES.indexOf(mode) === -1) {
|
||||
throw new Error(`Unknown mode for postcss-url: ${mode}`);
|
||||
}
|
||||
|
||||
return require(`../type/${mode}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {PostcssUrl~UrlProcessor} urlProcessor
|
||||
* @param {Result} result
|
||||
* @param {Decl} decl
|
||||
* @returns {Function}
|
||||
*/
|
||||
const wrapUrlProcessor = (urlProcessor, result, decl) => {
|
||||
const warn = (message) => decl.warn(result, message);
|
||||
const addDependency = (file) => result.messages.push({
|
||||
type: 'dependency',
|
||||
file,
|
||||
parent: getPathDeclFile(decl)
|
||||
});
|
||||
|
||||
return (asset, dir, option) =>
|
||||
urlProcessor(asset, dir, option, decl, warn, result, addDependency);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Decl} decl
|
||||
* @returns {RegExp}
|
||||
*/
|
||||
const getPattern = (decl) =>
|
||||
URL_PATTERNS.find((pattern) => pattern.test(decl.value));
|
||||
|
||||
/**
|
||||
* @param {String} url
|
||||
* @param {Dir} dir
|
||||
* @param {Options} options
|
||||
* @param {Result} result
|
||||
* @param {Decl} decl
|
||||
* @returns {Promise<String|undefined>}
|
||||
*/
|
||||
const replaceUrl = (url, dir, options, result, decl) => {
|
||||
const asset = prepareAsset(url, dir, decl);
|
||||
|
||||
const matchedOptions = matchOptions(asset, options);
|
||||
|
||||
if (!matchedOptions) return Promise.resolve();
|
||||
|
||||
const process = (option) => {
|
||||
const wrappedUrlProcessor = wrapUrlProcessor(getUrlProcessor(option.url), result, decl);
|
||||
|
||||
return wrappedUrlProcessor(asset, dir, option);
|
||||
};
|
||||
|
||||
let resultPromise = Promise.resolve();
|
||||
|
||||
if (Array.isArray(matchedOptions)) {
|
||||
for (let i = 0; i < matchedOptions.length; i++) {
|
||||
resultPromise = resultPromise
|
||||
.then(() => process(matchedOptions[i]))
|
||||
.then((newUrl) => {
|
||||
asset.url = newUrl;
|
||||
|
||||
return newUrl;
|
||||
});
|
||||
}
|
||||
} else {
|
||||
resultPromise = process(matchedOptions);
|
||||
}
|
||||
|
||||
return resultPromise.then((newUrl) => {
|
||||
asset.url = newUrl;
|
||||
|
||||
return newUrl;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {String} from
|
||||
* @param {String} to
|
||||
* @param {PostcssUrl~Options} options
|
||||
* @param {Result} result
|
||||
* @param {Decl} decl
|
||||
* @returns {Promise<PostcssUrl~DeclProcessor>}
|
||||
*/
|
||||
const declProcessor = (from, to, options, result, decl) => {
|
||||
const dir = { from, to, file: getDirDeclFile(decl) };
|
||||
const pattern = getPattern(decl);
|
||||
|
||||
if (!pattern) return Promise.resolve();
|
||||
|
||||
const promises = [];
|
||||
|
||||
decl.value = decl.value
|
||||
.replace(pattern, (matched, before, url, after) => {
|
||||
const newUrlPromise = replaceUrl(url, dir, options, result, decl);
|
||||
|
||||
promises.push(
|
||||
newUrlPromise
|
||||
.then((newUrl) => {
|
||||
if (!newUrl) return matched;
|
||||
|
||||
if (WITH_QUOTES.test(newUrl) && WITH_QUOTES.test(after)) {
|
||||
before = before.slice(0, -1);
|
||||
after = after.slice(1);
|
||||
}
|
||||
|
||||
decl.value = decl.value.replace(matched, `${before}${newUrl}${after}`);
|
||||
})
|
||||
);
|
||||
|
||||
return matched;
|
||||
});
|
||||
|
||||
return Promise.all(promises);
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
declProcessor
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {Object} PostcssUrl~Options - postcss-url Options
|
||||
* @property {String} [url=^rebase|inline|copy|custom] - processing mode
|
||||
* @property {Minimatch|RegExp|Function} [filter] - filter assets by relative pathname
|
||||
* @property {String} [assetsPath] - absolute or relative path to copy assets
|
||||
* @property {String|String[]} [basePath] - absolute or relative paths to search, when copy or inline
|
||||
* @property {Number} [maxSize] - max file size in kbytes for inline mode
|
||||
* @property {String} [fallback] - fallback mode if file exceeds maxSize
|
||||
* @property {Boolean} [useHash] - use file hash instead filename
|
||||
* @property {HashOptions} [hashOptions] - params for generating hash name
|
||||
*/
|
||||
55
node_modules/postcss-url/src/lib/encode.js
generated
vendored
Executable file
55
node_modules/postcss-url/src/lib/encode.js
generated
vendored
Executable file
@@ -0,0 +1,55 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Optimize encoding SVG files (IE9+, Android 3+)
|
||||
* @see https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
||||
*
|
||||
* @param {String} svgContent
|
||||
* @returns {String}
|
||||
*/
|
||||
const optimizedSvgEncode = (svgContent) => {
|
||||
const result = encodeURIComponent(svgContent)
|
||||
.replace(/%3D/g, '=')
|
||||
.replace(/%3A/g, ':')
|
||||
.replace(/%2F/g, '/')
|
||||
.replace(/%22/g, "'")
|
||||
.replace(/%2C/g, ',')
|
||||
.replace(/%3B/g, ';');
|
||||
|
||||
// Lowercase the hex-escapes for better gzipping
|
||||
return result.replace(/(%[0-9A-Z]{2})/g, (matched, AZ) => {
|
||||
return AZ.toLowerCase();
|
||||
});
|
||||
};
|
||||
/**
|
||||
* Encoding file contents to string
|
||||
*
|
||||
* @param {PostcssUrl~File} file
|
||||
* @param {String} [encodeType=base64|encodeURI|encodeURIComponent]
|
||||
* @param {Boolean} [shouldOptimizeURIEncode]
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
module.exports = (file, encodeType, shouldOptimizeSvgEncode) => {
|
||||
const dataMime = `data:${file.mimeType}`;
|
||||
|
||||
if (encodeType === 'base64') {
|
||||
return `${dataMime};base64,${file.contents.toString('base64')}`;
|
||||
}
|
||||
|
||||
const encodeFunc = encodeType === 'encodeURI' ? encodeURI : encodeURIComponent;
|
||||
|
||||
const content = file.contents.toString('utf8')
|
||||
// removing new lines
|
||||
.replace(/\n+/g, '');
|
||||
|
||||
let encodedStr = (shouldOptimizeSvgEncode && encodeType === 'encodeURIComponent')
|
||||
? optimizedSvgEncode(content)
|
||||
: encodeFunc(content);
|
||||
|
||||
encodedStr = encodedStr
|
||||
.replace(/%20/g, ' ')
|
||||
.replace(/#/g, '%23');
|
||||
|
||||
return `${dataMime},${encodedStr}`;
|
||||
};
|
||||
85
node_modules/postcss-url/src/lib/get-file.js
generated
vendored
Executable file
85
node_modules/postcss-url/src/lib/get-file.js
generated
vendored
Executable file
@@ -0,0 +1,85 @@
|
||||
'use strict';
|
||||
|
||||
const fs = require('fs');
|
||||
const mime = require('mime');
|
||||
|
||||
const getPathByBasePath = require('./paths').getPathByBasePath;
|
||||
|
||||
const readFileAsync = (filePath) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.readFile(filePath, (err, data) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
}
|
||||
resolve(data);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const existFileAsync = (filePath) => {
|
||||
return new Promise((resolve) =>
|
||||
fs.access(filePath, (err) => {
|
||||
resolve(!err);
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
const findExistsPath = (paths) => {
|
||||
let resolved = false;
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const findPromises = paths.map((path) => {
|
||||
return existFileAsync(path).then((isExists) => {
|
||||
if (!resolved && isExists) {
|
||||
resolved = true;
|
||||
resolve(path);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Promise.all(findPromises).then(() => {
|
||||
if (!resolved) {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {PostcssUrl~Asset} asset
|
||||
* @param {PostcssUrl~Options} options
|
||||
* @param {PostcssUrl~Dir} dir
|
||||
* @param {Function} warn
|
||||
* @returns {Promise<PostcssUrl~File | Undefined>}
|
||||
*/
|
||||
const getFile = (asset, options, dir, warn) => {
|
||||
const paths = options.basePath
|
||||
? getPathByBasePath(options.basePath, dir.from, asset.pathname)
|
||||
: [asset.absolutePath];
|
||||
|
||||
return findExistsPath(paths)
|
||||
.then((path) => readFileAsync(path)
|
||||
.then((contents) => {
|
||||
return {
|
||||
path,
|
||||
contents,
|
||||
mimeType: mime.getType(path)
|
||||
};
|
||||
})
|
||||
)
|
||||
.catch(() => {
|
||||
warn(`Can't read file '${paths.join()}', ignoring`);
|
||||
|
||||
return;
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = getFile;
|
||||
|
||||
/**
|
||||
* @typedef {Object} PostcssUrl~File
|
||||
* @property {String} path
|
||||
* @property {Buffer} contents
|
||||
* @property {String} mimeType
|
||||
*/
|
||||
54
node_modules/postcss-url/src/lib/hash.js
generated
vendored
Executable file
54
node_modules/postcss-url/src/lib/hash.js
generated
vendored
Executable file
@@ -0,0 +1,54 @@
|
||||
'use strict';
|
||||
|
||||
const crypto = require('crypto');
|
||||
const xxh = require('xxhashjs');
|
||||
const HEXBASE = 16;
|
||||
|
||||
const defaultHashOptions = {
|
||||
method: 'xxhash32',
|
||||
shrink: 8,
|
||||
append: false
|
||||
};
|
||||
|
||||
const getxxhash = (content, options) => {
|
||||
const hashFunc = options.method === 'xxhash32' ? xxh.h32 : xxh.h64;
|
||||
const seed = 0;
|
||||
|
||||
return hashFunc(seed)
|
||||
.update(content)
|
||||
.digest()
|
||||
.toString(HEXBASE);
|
||||
};
|
||||
|
||||
const getHash = (content, options) => {
|
||||
if (options.method && typeof options.method === 'function') {
|
||||
return options.method(content);
|
||||
}
|
||||
|
||||
if (options.method && options.method.indexOf('xxhash') === 0) {
|
||||
return getxxhash(content, options);
|
||||
}
|
||||
|
||||
try {
|
||||
const hashFunc = crypto.createHash(options.method);
|
||||
|
||||
return hashFunc.update(content)
|
||||
.digest('hex');
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = function(content, options) {
|
||||
options = options || defaultHashOptions;
|
||||
|
||||
let hash = getHash(content, options);
|
||||
|
||||
if (hash == null) {
|
||||
// bad hash method; fallback to defaults
|
||||
// TODO: warning/error reporting?
|
||||
hash = getHash(content, defaultHashOptions);
|
||||
}
|
||||
|
||||
return options.shrink ? hash.substr(0, options.shrink) : hash;
|
||||
};
|
||||
92
node_modules/postcss-url/src/lib/match-options.js
generated
vendored
Executable file
92
node_modules/postcss-url/src/lib/match-options.js
generated
vendored
Executable file
@@ -0,0 +1,92 @@
|
||||
'use strict';
|
||||
|
||||
const minimatch = require('minimatch');
|
||||
const path = require('path');
|
||||
|
||||
const paths = require('./paths');
|
||||
|
||||
const isUrlShouldBeIgnored = paths.isUrlShouldBeIgnored;
|
||||
|
||||
/**
|
||||
* Returns whether the given asset matches the given pattern
|
||||
* Allways returns true if the given pattern is empty
|
||||
*
|
||||
* @param {PostcssUrl~Asset} asset the processed asset
|
||||
* @param {String|RegExp|Function} pattern A minimatch string,
|
||||
* regular expression or function to test the asset
|
||||
*
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
const matchesFilter = (asset, pattern) => {
|
||||
const relativeToRoot = path.relative(process.cwd(), asset.absolutePath);
|
||||
|
||||
if (typeof pattern === 'string') {
|
||||
pattern = minimatch.filter(pattern);
|
||||
|
||||
return pattern(relativeToRoot);
|
||||
}
|
||||
|
||||
if (pattern instanceof RegExp) {
|
||||
return pattern.test(relativeToRoot);
|
||||
}
|
||||
|
||||
if (pattern instanceof Function) {
|
||||
return pattern(asset);
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Matching single option
|
||||
*
|
||||
* @param {PostcssUrl~Asset} asset
|
||||
* @param {PostcssUrl~Options} option
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
const matchOption = (asset, option) => {
|
||||
const matched = matchesFilter(asset, option.filter);
|
||||
|
||||
if (!matched) return false;
|
||||
|
||||
return typeof option.url === 'function' || !isUrlShouldBeIgnored(asset.url, option);
|
||||
};
|
||||
|
||||
const isMultiOption = (option) =>
|
||||
option.multi && typeof option.url === 'function';
|
||||
|
||||
/**
|
||||
* Matching options by asset
|
||||
*
|
||||
* @param {PostcssUrl~Asset} asset
|
||||
* @param {PostcssUrl~Options|PostcssUrl~Options[]} options
|
||||
* @returns {PostcssUrl~Options|undefined}
|
||||
*/
|
||||
const matchOptions = (asset, options) => {
|
||||
if (!options) return;
|
||||
|
||||
if (Array.isArray(options)) {
|
||||
const optionIndex = options.findIndex((option) => matchOption(asset, option));
|
||||
|
||||
if (optionIndex < 0) return;
|
||||
|
||||
const matchedOption = options[optionIndex];
|
||||
|
||||
// if founded option is last
|
||||
if (optionIndex === options.length - 1) return matchedOption;
|
||||
|
||||
const extendOptions = options
|
||||
.slice(optionIndex + 1)
|
||||
.filter((option) =>
|
||||
(isMultiOption(matchedOption) || isMultiOption(option)) && matchOption(asset, option)
|
||||
);
|
||||
|
||||
return extendOptions.length
|
||||
? [matchedOption].concat(extendOptions)
|
||||
: matchedOption;
|
||||
}
|
||||
|
||||
if (matchOption(asset, options)) return options;
|
||||
};
|
||||
|
||||
module.exports = matchOptions;
|
||||
155
node_modules/postcss-url/src/lib/paths.js
generated
vendored
Executable file
155
node_modules/postcss-url/src/lib/paths.js
generated
vendored
Executable file
@@ -0,0 +1,155 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const url = require('url');
|
||||
|
||||
/**
|
||||
* Normalazing result url, before replace decl value
|
||||
*
|
||||
* @param {String} assetUrl
|
||||
* @returns {String}
|
||||
*/
|
||||
const normalize = (assetUrl) => {
|
||||
assetUrl = path.normalize(assetUrl);
|
||||
|
||||
return path.sep === '\\' ? assetUrl.replace(/\\/g, '\/') : assetUrl;
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {String} assetUrl
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
const isUrlWithoutPathname = (assetUrl) => {
|
||||
return assetUrl[0] === '#'
|
||||
|| assetUrl.indexOf('%23') === 0
|
||||
|| assetUrl.indexOf('data:') === 0
|
||||
|| /^[a-z]+:\/\//.test(assetUrl)
|
||||
|| /^\/\//.test(assetUrl);
|
||||
};
|
||||
|
||||
/**
|
||||
* Check if url is absolute, hash or data-uri
|
||||
*
|
||||
* @param {String} assetUrl
|
||||
* @param {PostcssUrl~Options} options
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
const isUrlShouldBeIgnored = (assetUrl, options) => {
|
||||
const isAbsolutePath = assetUrl[0] === '/';
|
||||
const isStartsWithTilde = assetUrl[0] === '~';
|
||||
|
||||
return isUrlWithoutPathname(assetUrl) || ((isAbsolutePath || isStartsWithTilde) && !options.basePath);
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {String} baseDir - absolute target path
|
||||
* @param {String} assetsPath - extend asset path, can be absolute path
|
||||
* @param {String} relative - current relative asset path
|
||||
* @returns {String}
|
||||
*/
|
||||
const getAssetsPath = (baseDir, assetsPath, relative) =>
|
||||
path.resolve(baseDir, assetsPath || '', relative || '');
|
||||
|
||||
/**
|
||||
* Target path, output base dir
|
||||
*
|
||||
* @param {Dir} dir
|
||||
* @returns {String}
|
||||
*/
|
||||
const getTargetDir = (dir) =>
|
||||
dir.to != null ? dir.to : process.cwd();
|
||||
|
||||
/**
|
||||
* Stylesheet file path from decl
|
||||
*
|
||||
* @param {Decl} decl
|
||||
* @returns {String}
|
||||
*/
|
||||
const getPathDeclFile = (decl) =>
|
||||
decl.source && decl.source.input && decl.source.input.file;
|
||||
|
||||
/**
|
||||
* Stylesheet file dir from decl
|
||||
*
|
||||
* @param {Decl} decl
|
||||
* @returns {String}
|
||||
*/
|
||||
const getDirDeclFile = (decl) => {
|
||||
const filename = getPathDeclFile(decl);
|
||||
|
||||
return filename ? path.dirname(filename) : process.cwd();
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns paths list, where we can find assets file
|
||||
*
|
||||
* @param {String[]|String} basePath - base paths where trying search to assets file
|
||||
* @param {Dir} dirFrom
|
||||
* @param {String} relPath - relative asset path
|
||||
* @returns {String[]}
|
||||
*/
|
||||
const getPathByBasePath = (basePath, dirFrom, relPath) => {
|
||||
if (relPath[0] === '/') {
|
||||
relPath = `.${relPath}`;
|
||||
}
|
||||
|
||||
basePath = !Array.isArray(basePath) ? [basePath] : basePath;
|
||||
|
||||
return basePath.map((pathItem) =>
|
||||
getAssetsPath(dirFrom, pathItem, relPath)
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Preparing asset paths and data
|
||||
*
|
||||
* @param {String} assetUrl
|
||||
* @param {PostcssUrl~Dir} dir
|
||||
* @param {Decl} decl
|
||||
* @returns {PostcssUrl~Asset}
|
||||
*/
|
||||
const prepareAsset = (assetUrl, dir, decl) => {
|
||||
const parsedUrl = url.parse(assetUrl);
|
||||
const pathname = !isUrlWithoutPathname(assetUrl) ? parsedUrl.pathname : null;
|
||||
const absolutePath = pathname
|
||||
? path.resolve(path.join(dir.file, pathname))
|
||||
: getPathDeclFile(decl);
|
||||
|
||||
return {
|
||||
url: assetUrl,
|
||||
originUrl: assetUrl,
|
||||
pathname,
|
||||
absolutePath: absolutePath || dir.from,
|
||||
relativePath: absolutePath ? path.relative(dir.from, absolutePath) : '.',
|
||||
search: (parsedUrl.search || ''),
|
||||
hash: (parsedUrl.hash || '')
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
normalize,
|
||||
prepareAsset,
|
||||
getAssetsPath,
|
||||
getDirDeclFile,
|
||||
getPathDeclFile,
|
||||
getTargetDir,
|
||||
getPathByBasePath,
|
||||
isUrlShouldBeIgnored
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {Object} PostcssUrl~Asset
|
||||
* @property {String} url - origin asset url
|
||||
* @property {String} name - parsed asset filename
|
||||
* @property {String} absolutePath - absolute asset path
|
||||
* @property {String} relativePath - relative asset path (relative to target dir)
|
||||
* @property {String} search - search from url, ex. ?query=1
|
||||
* @property {String} hash - hash from url
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} PostcssUrl~Dir
|
||||
* @property {String} from - dirname from postcss option 'from'
|
||||
* @property {String} to - dirname from postcss option 'to'
|
||||
* @property {String} file - decl file dirname (css file)
|
||||
*/
|
||||
79
node_modules/postcss-url/src/type/copy.js
generated
vendored
Executable file
79
node_modules/postcss-url/src/type/copy.js
generated
vendored
Executable file
@@ -0,0 +1,79 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const makeDir = require('make-dir');
|
||||
|
||||
const calcHash = require('../lib/hash');
|
||||
const paths = require('../lib/paths');
|
||||
const getFile = require('../lib/get-file');
|
||||
|
||||
const getTargetDir = paths.getTargetDir;
|
||||
const getAssetsPath = paths.getAssetsPath;
|
||||
const normalize = paths.normalize;
|
||||
|
||||
const getHashName = (file, options) =>
|
||||
(options && options.append ? (`${path.basename(file.path, path.extname(file.path))}_`) : '')
|
||||
+ calcHash(file.contents, options)
|
||||
+ path.extname(file.path);
|
||||
|
||||
const writeFileAsync = (file, dest) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
fs.writeFile(dest, file.contents, { flag: 'wx' }, (err) => {
|
||||
if (err) {
|
||||
err.code === 'EEXIST' ? resolve() : reject(err);
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Copy images from readed from url() to an specific assets destination
|
||||
* (`assetsPath`) and fix url() according to that path.
|
||||
* You can rename the assets by a hash or keep the real filename.
|
||||
*
|
||||
* Option assetsPath is require and is relative to the css destination (`to`)
|
||||
*
|
||||
* @type {PostcssUrl~UrlProcessor}
|
||||
* @param {PostcssUrl~Asset} asset
|
||||
* @param {PostcssUrl~Dir} dir
|
||||
* @param {PostcssUrl~Option} options
|
||||
* @param {PostcssUrl~Decl} decl
|
||||
* @param {Function} warn
|
||||
* @param {Result} result
|
||||
* @param {Function} addDependency
|
||||
*
|
||||
* @returns {Promise<String|Undefined>}
|
||||
*/
|
||||
|
||||
module.exports = function processCopy(asset, dir, options, decl, warn, result, addDependency) {
|
||||
if (!options.assetsPath && dir.from === dir.to) {
|
||||
warn('Option `to` of postcss is required, ignoring');
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return getFile(asset, options, dir, warn)
|
||||
.then((file) => {
|
||||
if (!file) return;
|
||||
|
||||
const assetRelativePath = options.useHash
|
||||
? getHashName(file, options.hashOptions)
|
||||
: asset.relativePath;
|
||||
|
||||
const targetDir = getTargetDir(dir);
|
||||
const newAssetBaseDir = getAssetsPath(targetDir, options.assetsPath);
|
||||
const newAssetPath = path.join(newAssetBaseDir, assetRelativePath);
|
||||
const newRelativeAssetPath = normalize(path.relative(targetDir, newAssetPath));
|
||||
|
||||
return makeDir(path.dirname(newAssetPath))
|
||||
.then(() => writeFileAsync(file, newAssetPath))
|
||||
.then(() => {
|
||||
addDependency(file.path);
|
||||
|
||||
return `${newRelativeAssetPath}${asset.search}${asset.hash}`;
|
||||
});
|
||||
}
|
||||
);
|
||||
};
|
||||
13
node_modules/postcss-url/src/type/custom.js
generated
vendored
Executable file
13
node_modules/postcss-url/src/type/custom.js
generated
vendored
Executable file
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Transform url() based on a custom callback
|
||||
*
|
||||
* @type {PostcssUrl~UrlProcessor}
|
||||
* @param {PostcssUrl~Asset} asset
|
||||
* @param {PostcssUrl~Dir} dir
|
||||
* @param {PostcssUrl~Option} options
|
||||
*
|
||||
* @returns {Promise<String|Undefined>}
|
||||
*/
|
||||
module.exports = function getCustomProcessor(asset, dir, options) {
|
||||
return Promise.resolve().then(() => options.url.apply(null, arguments));
|
||||
};
|
||||
91
node_modules/postcss-url/src/type/inline.js
generated
vendored
Executable file
91
node_modules/postcss-url/src/type/inline.js
generated
vendored
Executable file
@@ -0,0 +1,91 @@
|
||||
'use strict';
|
||||
|
||||
const processCopy = require('./copy');
|
||||
const processRebase = require('./rebase');
|
||||
|
||||
const encodeFile = require('../lib/encode');
|
||||
const getFile = require('../lib/get-file');
|
||||
|
||||
/**
|
||||
* @param {String} originUrl
|
||||
* @param {PostcssUrl~Dir} dir
|
||||
* @param {PostcssUrl~Option} options
|
||||
*
|
||||
* @returns {String|Undefined}
|
||||
*/
|
||||
function processFallback(originUrl, dir, options) {
|
||||
if (typeof options.fallback === 'function') {
|
||||
return options.fallback.apply(null, arguments);
|
||||
}
|
||||
switch (options.fallback) {
|
||||
case 'copy':
|
||||
return processCopy.apply(null, arguments);
|
||||
case 'rebase':
|
||||
return processRebase.apply(null, arguments);
|
||||
default:
|
||||
return Promise.resolve();
|
||||
}
|
||||
}
|
||||
|
||||
const inlineProcess = (file, asset, warn, addDependency, options) => {
|
||||
const isSvg = file.mimeType === 'image/svg+xml';
|
||||
const defaultEncodeType = isSvg ? 'encodeURIComponent' : 'base64';
|
||||
const encodeType = options.encodeType || defaultEncodeType;
|
||||
|
||||
// Warn for svg with hashes/fragments
|
||||
if (isSvg && asset.hash && !options.ignoreFragmentWarning) {
|
||||
// eslint-disable-next-line max-len
|
||||
warn(`Image type is svg and link contains #. Postcss-url cant handle svg fragments. SVG file fully inlined. ${file.path}`);
|
||||
}
|
||||
|
||||
addDependency(file.path);
|
||||
|
||||
const optimizeSvgEncode = isSvg && options.optimizeSvgEncode;
|
||||
const encodedStr = encodeFile(file, encodeType, optimizeSvgEncode);
|
||||
const resultValue = options.includeUriFragment && asset.hash
|
||||
? encodedStr + asset.hash
|
||||
: encodedStr;
|
||||
|
||||
// wrap url by quotes if percent-encoded svg
|
||||
return isSvg && encodeType !== 'base64' ? `"${resultValue}"` : resultValue;
|
||||
};
|
||||
|
||||
/**
|
||||
* Inline image in url()
|
||||
*
|
||||
* @type {PostcssUrl~UrlProcessor}
|
||||
* @param {PostcssUrl~Asset} asset
|
||||
* @param {PostcssUrl~Dir} dir
|
||||
* @param {PostcssUrl~Options} options
|
||||
* @param {PostcssUrl~Decl} decl
|
||||
* @param {Function} warn
|
||||
* @param {Result} result
|
||||
* @param {Function} addDependency
|
||||
*
|
||||
* @returns {Promise<String|Undefined>}
|
||||
*/
|
||||
// eslint-disable-next-line complexity
|
||||
module.exports = function(asset, dir, options, decl, warn, result, addDependency) {
|
||||
return getFile(asset, options, dir, warn)
|
||||
.then((file) => {
|
||||
if (!file) return;
|
||||
|
||||
if (!file.mimeType) {
|
||||
warn(`Unable to find asset mime-type for ${file.path}`);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const maxSize = (options.maxSize || 0) * 1024;
|
||||
|
||||
if (maxSize) {
|
||||
const size = Buffer.byteLength(file.contents);
|
||||
|
||||
if (size >= maxSize) {
|
||||
return processFallback.apply(this, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
return inlineProcess(file, asset, warn, addDependency, options);
|
||||
});
|
||||
};
|
||||
25
node_modules/postcss-url/src/type/rebase.js
generated
vendored
Executable file
25
node_modules/postcss-url/src/type/rebase.js
generated
vendored
Executable file
@@ -0,0 +1,25 @@
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const paths = require('../lib/paths');
|
||||
const normalize = paths.normalize;
|
||||
const getAssetsPath = paths.getAssetsPath;
|
||||
|
||||
/**
|
||||
* Fix url() according to source (`from`) or destination (`to`)
|
||||
*
|
||||
* @type {PostcssUrl~UrlProcessor}
|
||||
* @param {PostcssUrl~Asset} asset
|
||||
* @param {PostcssUrl~Dir} dir
|
||||
* @param {PostcssUrl~Option} options
|
||||
*
|
||||
* @returns {Promise<String>}
|
||||
*/
|
||||
module.exports = function(asset, dir, options) {
|
||||
const dest = getAssetsPath(dir.to, options && options.assetsPath || '');
|
||||
const rebasedUrl = normalize(
|
||||
path.relative(dest, asset.absolutePath)
|
||||
);
|
||||
|
||||
return Promise.resolve().then(() => `${rebasedUrl}${asset.search}${asset.hash}`);
|
||||
};
|
||||
Reference in New Issue
Block a user