aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFeuerfuchs <git@feuerfuchs.dev>2020-11-01 20:55:14 +0100
committerFeuerfuchs <git@feuerfuchs.dev>2020-11-01 20:55:14 +0100
commitd07f664450ddaaebb44127a4bd057763d13d3f82 (patch)
tree234cfd673ac527869a8dda4f32afbec48c87b512
downloadiro-sass-d07f664450ddaaebb44127a4bd057763d13d3f82.tar.gz
iro-sass-d07f664450ddaaebb44127a4bd057763d13d3f82.tar.bz2
iro-sass-d07f664450ddaaebb44127a4bd057763d13d3f82.zip
Init
-rw-r--r--.gitignore5
-rw-r--r--.npmignore6
-rw-r--r--.sass-lint.yml14
-rw-r--r--.vscode/tasks.json38
-rw-r--r--README.md346
-rw-r--r--jsconfig.json6
-rw-r--r--package.json42
-rw-r--r--src/_bem.scss62
-rw-r--r--src/_contexts.scss315
-rw-r--r--src/_easing.scss483
-rw-r--r--src/_functions.scss328
-rw-r--r--src/_gradients.scss600
-rw-r--r--src/_harmony.scss94
-rw-r--r--src/_math.scss62
-rw-r--r--src/_props.scss281
-rw-r--r--src/_responsive.scss406
-rw-r--r--src/_vars.scss16
-rw-r--r--src/bem-shortcodes.scss349
-rw-r--r--src/bem/_block.scss392
-rw-r--r--src/bem/_debug.scss16
-rw-r--r--src/bem/_element.scss622
-rw-r--r--src/bem/_functions.scss26
-rw-r--r--src/bem/_modifier.scss246
-rw-r--r--src/bem/_multi.scss131
-rw-r--r--src/bem/_state.scss146
-rw-r--r--src/bem/_suffix.scss118
-rw-r--r--src/bem/_theme.scss61
-rw-r--r--src/bem/_validators.scss176
-rw-r--r--src/bem/_vars.scss108
-rw-r--r--src/harmony-shortcodes.scss35
-rw-r--r--src/main.scss10
-rw-r--r--src/prep.scss2
-rw-r--r--src/responsive-shortcodes.scss14
-rw-r--r--test/_bem.scss19
-rw-r--r--test/_contexts.scss65
-rw-r--r--test/_functions.scss103
-rw-r--r--test/_gradients.scss264
-rw-r--r--test/_harmony.scss249
-rw-r--r--test/_math.scss21
-rw-r--r--test/_props.scss282
-rw-r--r--test/_responsive.scss9
-rw-r--r--test/bem/_examples.scss224
-rw-r--r--test/bem/_iro-bem-at-theme.scss55
-rw-r--r--test/bem/_iro-bem-block.scss85
-rw-r--r--test/bem/_iro-bem-composed-of.scss149
-rw-r--r--test/bem/_iro-bem-element.scss491
-rw-r--r--test/bem/_iro-bem-modifier.scss654
-rw-r--r--test/bem/_iro-bem-multi.scss591
-rw-r--r--test/bem/_iro-bem-next-twin-element.scss153
-rw-r--r--test/bem/_iro-bem-related-element.scss459
-rw-r--r--test/bem/_iro-bem-state.scss177
-rw-r--r--test/bem/_iro-bem-suffix.scss94
-rw-r--r--test/test.js4
-rw-r--r--test/test.scss16
-rw-r--r--yarn.lock3842
55 files changed, 13562 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dc8af33
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
1node_modules
2sassdoc
3.sassdoc
4test/**/*.css
5yarn-error.log \ No newline at end of file
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..6185438
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,6 @@
1node_modules
2sassdoc
3.sassdoc
4.pages
5test/**/*.css
6yarn-error.log \ No newline at end of file
diff --git a/.sass-lint.yml b/.sass-lint.yml
new file mode 100644
index 0000000..93f03da
--- /dev/null
+++ b/.sass-lint.yml
@@ -0,0 +1,14 @@
1options:
2 merge-default-rules: true
3 formatter: visualstudio
4rules:
5 indentation:
6 - 1
7 - size: 4
8 property-sort-order:
9 - 1
10 - order: recess
11 leading-zero:
12 - 1
13 - include: true
14 space-around-operator: 0
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..f6545ad
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,38 @@
1{
2 "version": "2.0.0",
3 "runner": "terminal",
4 "command": "npm",
5 "tasks": [
6 {
7 "label": "lint",
8 "command": "npm",
9 "args": [
10 "run",
11 "livelint"
12 ],
13 "type": "shell",
14 "isBackground": true,
15 "problemMatcher": [
16 {
17 "owner": "sass-lint",
18 "fileLocation": "relative",
19 "pattern": [
20 {
21 "regexp": "^(.*)\\((\\d+),(\\d+)\\): (info|warning|error) (.*)$",
22 "file": 1,
23 "line": 2,
24 "column": 3,
25 "severity": 4,
26 "message": 5
27 }
28 ],
29 "background": {
30 "activeOnStart": false,
31 "beginsPattern": "^BEGIN LINT",
32 "endsPattern": "^END LINT"
33 }
34 }
35 ]
36 }
37 ]
38} \ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..62b15cc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,346 @@
1# iro-sass
2
3iro-sass is a [Sass](http://sass-lang.com/) library that I developed to create websites.
4
5Its main feature is a **[BEM system](#bem-system)**, though it also includes some other useful features:
6
7- Easing background gradients
8- Context stacks: A temporary data storage
9- Property trees]: A persistent data storage
10- Responsive properties: A generalization of responsive typography
11- Modular scales
12
13All features are explained in greater detail in the [Wiki](https://git.vulpes.one/Feuerfuchs/iro-sass/wiki).
14The rest of this document is a quick overview over what iro-sass has to offer.
15
16- [iro-sass](#iro-sass)
17 - [Getting started](#getting-started)
18 - [Development](#development)
19 - [Changelog](#changelog)
20 - [Known issues](#known-issues)
21 - [Features](#features)
22 - [BEM system](#bem-system)
23 - [Easing background gradients](#easing-background-gradients)
24 - [Context stacks](#context-stacks)
25 - [Property trees](#property-trees)
26 - [Responsive properties](#responsive-properties)
27 - [Modular scales](#modular-scales)
28
29## Getting started
30
31Install the package [iro-sass](https://www.npmjs.com/package/iro-sass) from the npm repository using the package manager of your choice.
32
33- npm: `npm install iro-sass`
34- yarn: `yarn add iro-sass`
35
36Then include iro-sass in your Sass stylesheet:
37
38```scss
39@import 'iro-sass/src/main';
40// (overrides)
41// files that depend on iro-sass
42```
43
44iro-sass uses function, mixin and variable names that are prefixed with 'iro-' to avoid clashes with other libraries.
45There are, however, shorter versions of many mixins and functions available (referred to as "shortcodes").
46Just import one of these files to use a certain set of shortcodes:
47
48- `iro-sass/src/bem-shortcodes`: BEM
49- `iro-sass/src/responsive-shortcodes`: Responsive properties
50- `iro-sass/src/harmony-shortcodes`: Modular scales
51
52**Note:** If the 'node_modules' folder isn't a search path for Sass imports, you have to prefix your imports with the path to 'node_modules'.
53An import might then look like this: `@import 'node_modules/iro-sass/src/main';`
54
55## Development
56
57Clone the repository, then run `npm install` or `yarn` to install all dependencies.
58
59The following npm scripts are available:
60
61- `lint`: Lint the source code with [sass-lint](https://www.npmjs.com/package/sass-lint).
62- `livelint`: Lint automatically whenever the code changes.
63- `doc`: Generate the SassDoc documentation with [sassdoc](http://sassdoc.com/).
64- `test`: Run unit tests with [sass-true](https://www.npmjs.com/package/sass-true) and [Mocha](https://mochajs.org/).
65
66## Changelog
67
68[Changelog](https://git.vulpes.one/Feuerfuchs/iro-sass/blob/main/CHANGELOG.md)
69
70## Known issues
71
72Check out the [issue tracker](https://git.vulpes.one/Feuerfuchs/iro-sass/issues).
73
74## Features
75
76### BEM system
77
78iro-sass' main feature is its BEM system which was developed over the course of two years. Features include:
79
80- **Full [BEM](https://en.bem.info/) and [BEMIT](https://csswizardry.com/2015/08/bemit-taking-the-bem-naming-convention-a-step-further/) support:** Namespaced blocks, suffixes, states, and so on.
81- **Robustness:** Most selector-related operations use Sass' native selector functions instead of manual parsing and assembling.
82- **Quality:** All mixins generate optimal selectors with a minimal degree of specificity.
83- **Safety:** All mixins perform checks if they are used correctly.
84- **Flexibility:** Mix BEM selectors and other selectors however you like — the BEM system will adapt.
85- **Strictness:** The BEM system allows you to define rules that control how the BEM mixins may or may not be used.
86
87Below is a basic example showing how the BEM system can be used:
88
89```scss
90@include iro-bem-object('media') {
91 display: flex;
92 align-items: flex-start;
93 justify-content: flex-start;
94
95 @include iro-bem-element('image') {
96 display: block;
97 flex: 0 0 auto;
98 order: 1;
99 overflow: hidden;
100 }
101
102 @include iro-bem-element('body') {
103 order: 2;
104 }
105
106 @include iro-bem-modifier('rtl') {
107 justify-content: flex-end;
108
109 @include iro-bem-element('image') {
110 order: 2;
111 }
112
113 @include iro-bem-element('body') {
114 order: 1;
115 }
116 }
117}
118```
119
120The result is this CSS:
121
122```css
123.o-media {
124 display: flex;
125 align-items: flex-start;
126 justify-content: flex-start;
127}
128
129.o-media__image {
130 display: block;
131 flex: 0 0 auto;
132 order: 1;
133 overflow: hidden;
134}
135
136.o-media__body {
137 order: 2;
138}
139
140.o-media--rtl {
141 justify-content: flex-end;
142}
143
144.o-media--rtl .o-media__image {
145 order: 2;
146}
147
148.o-media--rtl .o-media__body {
149 order: 1;
150}
151```
152
153### Easing background gradients
154
155The background gradients generated by browsers usually have a pretty hard transition from one color to another. In some situations, this results in a clearly visible edge where the transition ends.
156
157[Andreas Larsen wrote an article on CSS-Tricks](https://css-tricks.com/easing-linear-gradients/) where this whole problem is explained in detail.
158He also developed a solution, a [PostCSS plugin](https://github.com/larsenwork/postcss-easing-gradients) which automatically converts linear gradients using an easing function into regular linear-gradients.
159
160This solution works for simple use cases, but unfortunately it wasn't suitable for me.
161First, I wanted to use easing radial-gradients as well, which aren't supported by the PostCSS plugin.
162And second, I wanted to freely position the color stops and not be locked to 0% for the start and 100% for the end.
163
164The easing gradients provided by iro-sass address the above problems.
165Moreover, they have one more major feature: You can use multiple color stops with varying easing functions.
166
167The syntax is kept as close to the [new CSSWG proposal](https://github.com/w3c/csswg-drafts/issues/1332) as possible to make the transition to the native easing gradients easier later on.
168
169Example usage:
170
171```scss
172.test {
173 background-image: iro-easing-linear-gradient(
174 to right,
175 #000 2em,
176 #f00,
177 ease-in-out-sine,
178 transparent 10em
179 );
180}
181```
182
183This will generate a linear-gradient where black normally fades into red, from 2em to 6em.
184Then, red *smoothly* fades into transparent, from 6em to 10em.
185After that, the gradient remains transparent.
186
187### Context stacks
188
189Context stacks are a temporary data storage and, as the name suggests, are used like a conventional stack data structure.
190This means: Whenever you want to store a context -- which is an identifier and any kind of data, such as a map, a list, a string, etc... -- you push it to the stack.
191From then on, this context is publicly accessible.
192In order to remove it, you pop the stack.
193
194This feature becomes extremely useful when paired with mixins and their `@content` directive: Pushing a context to the stack before `@content` and popping the stack afterwards gives it the role of a call stack.
195Thats how the BEM system, for example, attaches metadata to the selectors it generates.
196These information are used to generate optimal selectors without much parsing.
197
198Below is an example of how context stacks can be used:
199
200```scss
201$context-id: 'some-context-stack';
202
203@mixin anything($p) {
204 @include iro-context-push($context-id, 'anything', (
205 --this: 1,
206 --is: true,
207 --the: 'test',
208 --data: $p
209 ));
210
211 @content;
212
213 @include iro-context-pop($context-id);
214}
215
216// Usage:
217
218.test {
219 @include anything('hello') {
220 $context-data: nth(iro-context-get($context-id, 'anything'), 2);
221 $this: map-get($context-data, --this); // 1
222 $is: map-get($context-data, --is); // true
223 $the: map-get($context-data, --the); // 'test'
224 $data: map-get($context-data, --data); // 'hello'
225 }
226}
227```
228
229### Property trees
230
231Property trees are basically global maps that are immutable as long as you just use the intended functions.
232
233It's a very simple feature, but it makes managing large sets of structured data much easier.
234
235Example usage:
236
237```scss
238@include iro-props-save((
239 --accent: #f00,
240 --accent-text: #fff,
241
242 --background: #fff,
243 --text: #222,
244
245 --link: (
246 --idle: (
247 --text: #000,
248 --underline: #f00
249 ),
250 --hover: (
251 --text: #f00,
252 --underline: #f00
253 )
254 )
255), 'light');
256
257// Usage:
258
259p {
260 color: iro-props-get(--text, 'light'); // #222
261 background-color: iro-props-get(--background, 'light'); // #fff
262}
263
264a {
265 color: iro-props-get(--link --idle --text, 'light'); // #000
266 border-bottom: 1px solid iro-props-get(--link --idle --underline, 'light'); // #f00
267 text-decoration: none;
268
269 &:hover {
270 color: iro-props-get(--link --hover --text, 'light'); // #f00
271 border-bottom-color: iro-props-get(--link --hover --underline, 'light'); // #f00
272 }
273}
274```
275
276### Responsive properties
277
278Responsive properties allow you to assign values to properties depending on the current viewport width.
279iro-sass provides a large number of mixins for this task to cover many use cases.
280The most simple one is the following:
281
282```scss
283.title {
284 @include iro-responsive-property(padding, ( 20rem: 2.1rem, 40rem: 2.6rem, 60rem: 3.5rem ));
285}
286```
287
288The padding will be 2.1rem if the viewport is 20rem wide, 2.6rem if it's 40rem wide, and 3.5rem if it's 60rem wide.
289If the viewport is narrower than 20rem, the padding will stick with 2.1rem.
290If the viewport is wider than 60rem, the padding will stick with 3.5rem.
291
292By default, iro-sass will dynamically scale the property value between viewport widths, which is technique known from [fluid typography](https://css-tricks.com/snippets/css/fluid-typography/).
293This behavior can be switched off if it's undesired.
294
295If you use [include-media](https://include-media.com/), all responsive mixins also support named viewports.
296The example above could then be written like this:
297
298```scss
299.title {
300 @include iro-responsive-property(padding, ( phone: 2.1rem, tablet: 2.6rem, desktop: 3.5rem ));
301}
302```
303
304### Modular scales
305
306From the description of [modularscale-sass](https://github.com/modularscale/modularscale-sass):
307
308> A modular scale is a list of values that share the same relationship. These values are often used to size type and create a sense of harmony in a design. Proportions within modular scales are all around us from the spacing of the joints on our fingers to branches on trees. These natural proportions have been used since the time of the ancient Greeks in architecture and design and can be a tremendously helpful tool to leverage for web designers.
309
310iro-sass provides a mixin to create basic and multi-stranded modular scales.
311It's a lightweight alternative to modularscale-sass.
312
313Example with a multi-stranded modular scale:
314
315```scss
316$mod-scale: 1em 2em, 1.1;
317
318h1 {
319 font-size: iro-harmony-modular-scale(3, $mod-scale...); // Will be: 1.128em
320}
321h2 {
322 font-size: iro-harmony-modular-scale(2, $mod-scale...); // Will be: 1.1em
323}
324h3 {
325 font-size: iro-harmony-modular-scale(1, $mod-scale...); // Will be: 1.026em
326}
327```
328
329Combined with iro-sass' responsive properties:
330
331```scss
332$responsive-mod-scale: (
333 320px: (1rem 2rem, 1.1),
334 640px: (1rem 2rem, 1.2)
335);
336
337h1 {
338 @include iro-responsive-modular-scale(font-size, 3, $responsive-mod-scale);
339}
340h2 {
341 @include iro-responsive-modular-scale(font-size, 2, $responsive-mod-scale);
342}
343h3 {
344 @include iro-responsive-modular-scale(font-size, 1, $responsive-mod-scale);
345}
346```
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..e0cc6bb
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,6 @@
1{
2 "compilerOptions": {
3 "allowSyntheticDefaultImports": true,
4 "checkJs": true
5 }
6}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d4eb18b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,42 @@
1{
2 "name": "iro-sass",
3 "version": "1.0.0",
4 "author": "Feuerfuchs <me@feuerfuchs.dev>",
5 "license": "MIT",
6 "description": "A mixin-based Sass framework that makes it easier to work with BEM, organize variables and more.",
7 "main": "src/main.scss",
8 "keywords": [
9 "sass",
10 "scss",
11 "library",
12 "iro",
13 "bem",
14 "bemit",
15 "gradients",
16 "easing",
17 "variables"
18 ],
19 "repository": {
20 "type": "git",
21 "url": "git+https://git.vulpes.one/Feuerfuchs/iro-sass.git"
22 },
23 "bugs": {
24 "url": "https://git.vulpes.one/Feuerfuchs/iro-sass/issues"
25 },
26 "homepage": "https://git.vulpes.one/Feuerfuchs/iro-sass",
27 "devDependencies": {
28 "mocha": "^8.2.0",
29 "nodemon": "^2.0.6",
30 "sass": "^1.28.0",
31 "sass-lint": "^1.12.1",
32 "sass-true": "^6.0.1",
33 "sassdoc": "^2.7.3"
34 },
35 "scripts": {
36 "prepublishOnly": "npm run test",
37 "lint": "sass-lint '{src,test}/**/*.scss' -q -v || true",
38 "livelint": "nodemon --watch src --watch test -e scss -x 'echo \"BEGIN LINT\" && npm run lint && echo \"END LINT\"'",
39 "doc": "sassdoc src",
40 "test": "mocha test/test.js"
41 }
42}
diff --git a/src/_bem.scss b/src/_bem.scss
new file mode 100644
index 0000000..b6032ea
--- /dev/null
+++ b/src/_bem.scss
@@ -0,0 +1,62 @@
1////
2/// BEM.
3///
4/// BEM is a methodology for structuring websites and is mostly known for it's CSS naming convention.
5/// BEMIT is in extension of this methodology and allows you to give blocks a more fine-grained purpose
6/// than BEM alone would let you do.
7///
8/// Sass does support BEM quite well thanks to the ampersand (&) and the @at-root directive. However,
9/// there is no way to make sure users adhere to the BEM or BEMIT methodology.
10/// That's where the mixins in this file come into play: They automatically generate the right selectors
11/// and perform checks regarding the nesting order, nesting depth, and so on.
12///
13/// There are comments in the mixins explaining what selector is generated. The EBNF grammar is as follows:
14///
15/// (* Shorthands for block, element, modifier, suffix *)
16/// entity_shorthand = "b" "e" "m" "s" "t" ;
17///
18/// (* One or multiple BEMIT entities that were generated with an earlier mixin invocation *)
19/// existing_entities = "{" entity_shorthand { "," entity_shorthand } "}" ;
20///
21/// (* A BEM entity that doesn't depend on a parent entity *)
22/// generated_independent_entity = "block" ;
23///
24/// (* A BEM entity that is attached to a parent entity *)
25/// generated_attached_entity = existing_entities ( "__element" | "--modifier" | "@suffix" ) ;
26///
27/// (* A selector created by the user, such as "&:hover", "> a", and so on *)
28/// manual_selector_part = "[manual selector]" ;
29///
30/// (* A part of the selector that may or may not be in the generated result *)
31/// optional_selector_part = "(" ( existing_entities | manual_selector_part ) ")" ;
32///
33/// (* One part of the selector *)
34/// selector_part = existing_entities | manual_selector_part | optional_selector_part | generated_independent_entity | generated_attached_entity ;
35///
36/// (* How the left and right selector are related, i.e. space means right is a descendant of left, and dot means right specializes left *)
37/// selector_link = " " | "." ;
38///
39/// (* The whole selector *)
40/// selector = selector_part { ( selector_link ) selector_part } ;
41///
42/// @link https://en.bem.info/ Information about BEM
43/// @link https://csswizardry.com/2015/08/bemit-taking-the-bem-naming-convention-a-step-further/ Information about BEMIT
44///
45/// @group BEM
46///
47/// @access public
48////
49
50@import 'bem/vars';
51@import 'bem/functions';
52@import 'bem/validators';
53@import 'bem/block';
54@import 'bem/element';
55@import 'bem/modifier';
56@import 'bem/suffix';
57@import 'bem/state';
58@import 'bem/theme';
59@import 'bem/multi';
60@import 'bem/debug';
61
62@include iro-context-stack-create($iro-bem-context-id);
diff --git a/src/_contexts.scss b/src/_contexts.scss
new file mode 100644
index 0000000..556fde3
--- /dev/null
+++ b/src/_contexts.scss
@@ -0,0 +1,315 @@
1////
2/// Context handling.
3///
4/// Contexts allow you to pass data between mixins and let you enforce a certain nesting order.
5/// It's an essential part for the BEM-related mixins.
6///
7/// If you want to create a new context, the easiest pattern is to create a new mixin and wrap
8/// the @content between a pair of iro-context-push and iro-context-pop.
9/// From within the @content, you can access the context's data with iro-context-get.
10/// To make the compilation fail if a certain nesting order is violated, use
11/// iro-context-assert-stack-must-contain and iro-context-assert-stack-must-not-contain.
12///
13/// @group Contexts
14///
15/// @access public
16////
17
18///
19/// Map of all context stacks.
20///
21/// @type map
22///
23/// @access private
24///
25$iro-context-stacks: ();
26
27///
28/// Create a new context stack.
29///
30/// @param {string} $stack-id - ID of context stack
31///
32/// @throw If context stack already exists
33///
34@mixin iro-context-stack-create($stack-id) {
35 $noop: iro-context-stack-create($stack-id);
36}
37
38///
39/// Create a new context stack.
40///
41/// @param {string} $stack-id - ID of context stack
42///
43@function iro-context-stack-create($stack-id) {
44 @if map-has-key($iro-context-stacks, $stack-id) {
45 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
46 }
47
48 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: ())) !global;
49
50 @return null;
51}
52
53///
54/// Clear a context stack.
55///
56/// @param {string} $stack-id - ID of context stack
57///
58@mixin iro-context-stack-clear($stack-id) {
59 $noop: iro-context-stack-clear($stack-id);
60}
61
62///
63/// Clear a context stack.
64///
65/// @param {string} $stack-id - ID of context stack
66///
67@function iro-context-stack-clear($stack-id) {
68 @if not map-has-key($iro-context-stacks, $stack-id) {
69 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
70 }
71
72 $context-stack: ();
73 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: $context-stack)) !global;
74
75 @return null;
76}
77
78///
79/// Delete a context stack.
80///
81/// @param {string} $stack-id - ID of context stack
82///
83@mixin iro-context-stack-delete($stack-id) {
84 $noop: iro-context-stack-delete($stack-id);
85}
86
87///
88/// Delete a context stack.
89///
90/// @param {string} $stack-id - ID of context stack
91///
92@function iro-context-stack-delete($stack-id) {
93 @if not map-has-key($iro-context-stacks, $stack-id) {
94 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
95 }
96
97 $iro-context-stacks: map-remove($iro-context-stacks, $stack-id) !global;
98
99 @return null;
100}
101
102///
103/// Push a new context to a context stack.
104///
105/// @param {string} $stack-id - ID of context stack to use
106/// @param {string} $id - ID of new context
107/// @param {any} $data [()] - Data that belongs to the context
108///
109@mixin iro-context-push($stack-id, $id, $data: ()) {
110 $noop: iro-context-push($stack-id, $id, $data);
111}
112
113///
114/// Push a new context to a context stack.
115///
116/// @param {string} $stack-id - ID of context stack to use
117/// @param {string} $id - ID of new context
118/// @param {any} $data [()] - Data that belongs to the context
119///
120/// @return {list} A list with two items: 1 = context id, 2 = context data
121///
122@function iro-context-push($stack-id, $id, $data: ()) {
123 @if not map-has-key($iro-context-stacks, $stack-id) {
124 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
125 }
126
127 $context: $id $data;
128 $context-stack: map-get($iro-context-stacks, $stack-id);
129 $context-stack: append($context-stack, $context);
130 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: $context-stack)) !global;
131
132 @return $context;
133}
134
135///
136/// Pop the latest context from a context stack.
137///
138/// @param {string} $stack-id - ID of context stack to use
139///
140/// @throw If context stack doesn't exist
141///
142@mixin iro-context-pop($stack-id) {
143 $noop: iro-context-pop($stack-id);
144}
145
146///
147/// Pop the latest context from a context stack.
148///
149/// @param {string} $stack-id - ID of context stack to use
150///
151/// @return {list} A list with two items: 1 = context id, 2 = context data
152///
153@function iro-context-pop($stack-id) {
154 @if not map-has-key($iro-context-stacks, $stack-id) {
155 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
156 }
157
158 $context-stack: map-get($iro-context-stacks, $stack-id);
159
160 @if length($context-stack) == 0 {
161 @error 'Context stack "#{inspect($stack-id)}" is already empty.';
162 }
163
164 $popped-context: nth($context-stack, -1);
165
166 @if length($context-stack) == 1 {
167 $context-stack: ();
168 } @else {
169 $context-stack: iro-list-slice($context-stack, 1, length($context-stack) - 1);
170 }
171
172 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: $context-stack)) !global;
173
174 @return $popped-context;
175}
176
177///
178/// Assert that a context stack must contain one of the given context IDs.
179///
180/// @param {string} $stack-id - ID of context stack to use
181/// @param {list} $context-ids - Context IDs
182/// @param {bool} $check-head-only [false] - If false, all items will be checked. If true, only the head will be checked.
183///
184/// @throw If assertion fails
185///
186@mixin iro-context-assert-stack-must-contain($stack-id, $context-ids, $check-head-only: false) {
187 @if not iro-context-stack-contains($stack-id, $context-ids, $check-head-only) {
188 @error 'Must be called inside of contexts "#{inspect($context-ids)}".';
189 }
190}
191
192///
193/// Assert that a context stack must not contain any of the given context IDs.
194///
195/// @param {string} $stack-id - ID of context stack to use
196/// @param {list} $context-ids - Context IDs
197/// @param {bool} $check-head-only [false] - If false, all items will be checked. If true, only the head will be checked.
198///
199/// @throw If assertion fails
200///
201@mixin iro-context-assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only: false) {
202 @if iro-context-stack-contains($stack-id, $context-ids, $check-head-only) {
203 @error 'Must not be called inside of contexts "#{inspect($context-ids)}".';
204 }
205}
206
207///
208/// Check if a context stack contains one of the given context IDs.
209///
210/// @param {string} $stack-id - ID of context stack to use
211/// @param {list} $context-ids - Context IDs
212/// @param {bool} $check-head-only [false] - If false, all items will be checked. If true, only the head will be checked.
213///
214/// @return {bool} `true` if the context stack contains one of the context IDs, otherwise `false`
215///
216@function iro-context-stack-contains($stack-id, $context-ids, $check-head-only: false) {
217 @if not map-has-key($iro-context-stacks, $stack-id) {
218 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
219 }
220
221 $context-stack: map-get($iro-context-stacks, $stack-id);
222
223 @if length($context-stack) == 0 {
224 @return false;
225 }
226
227 $end-idx: if($check-head-only, length($context-stack), 1);
228
229 @for $i from length($context-stack) through $end-idx {
230 $context: nth($context-stack, $i);
231
232 @each $chk-context in $context-ids {
233 @if nth($context, 1) == $chk-context {
234 @return true;
235 }
236 }
237 }
238
239 @return false;
240}
241
242///
243/// Assert that a context stack must contain a number of contexts smaller than $max-count.
244///
245/// @param {string} $stack-id - ID of context stack to use
246/// @param {number} $max-count - Maximum number ofg contexts in context stack
247///
248/// @throw If assertion fails
249///
250@mixin iro-context-assert-stack-count($stack-id, $max-count) {
251 @if iro-context-stack-count($stack-id) > $max-count {
252 @error 'Maximum context count "#{inspect($max-count)}" exceeded.';
253 }
254}
255
256///
257/// Get the number of contexts from a context stack.
258///
259/// @param {string} $stack-id - ID of context stack to use
260///
261/// @return {number} The number of contexts
262///
263@function iro-context-stack-count($stack-id) {
264 @if not map-has-key($iro-context-stacks, $stack-id) {
265 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
266 }
267
268 $context-stack: map-get($iro-context-stacks, $stack-id);
269
270 @return length($context-stack);
271}
272
273///
274/// Get a specific context from the stack.
275///
276/// @param {string} $stack-id - ID of context stack to use
277/// @param {number | string | list} $type-or-level - If this is a number (!= 0), the nth context from the head will be returned. If it is a string, the first context with a matching ID will be returned. If it is a list, the first context that matches one of the IDs in the list will be returned.
278///
279/// @return {list} Null if no match was found, otherwise a list with two items: 1. context ID, 2. context data.
280///
281@function iro-context-get($stack-id, $type-or-level: null) {
282 @if not map-has-key($iro-context-stacks, $stack-id) {
283 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
284 }
285
286 $context-stack: map-get($iro-context-stacks, $stack-id);
287
288 @if length($context-stack) == 0 {
289 @return null;
290 }
291
292 @if type-of($type-or-level) == number {
293 $context: nth($context-stack, -$type-or-level);
294
295 @return $context;
296 } @else {
297 @for $i from -1 through -(length($context-stack)) {
298 $context: nth($context-stack, $i);
299
300 @if type-of($type-or-level) == list {
301 @for $j from 1 through length($type-or-level) {
302 $ctx: nth($type-or-level, $j);
303
304 @if nth($context, 1) == $ctx {
305 @return $context;
306 }
307 }
308 } @else if nth($context, 1) == $type-or-level {
309 @return $context;
310 }
311 }
312 }
313
314 @return null;
315}
diff --git a/src/_easing.scss b/src/_easing.scss
new file mode 100644
index 0000000..c41635b
--- /dev/null
+++ b/src/_easing.scss
@@ -0,0 +1,483 @@
1////
2/// Easing.
3///
4/// A collection of easing functions which are commonly used for animations.
5/// This code is based on https://github.com/gre/bezier-easing.
6///
7/// @group Easing
8///
9/// @access public
10////
11
12///
13/// @access private
14///
15$iro-cubic-bezier-sample-pool: ();
16
17///
18/// Sample pool size for cubic bezier calculations.
19///
20$iro-cubic-bezier-sample-pool-size: 10 !default;
21
22///
23/// Minimum slope required to use the Newton-Raphson method for cubic bezier calculations.
24///
25$iro-cubic-bezier-newton-min-slope: 0.001 !default;
26
27///
28/// Number of iterations of the Newton-Raphson method.
29///
30$iro-cubic-bezier-newton-iters: 4 !default;
31
32///
33/// Precision of the subdivision method for cubic bezier calculations.
34///
35$iro-cubic-bezier-subdiv-precision: 0.0000001 !default;
36
37///
38/// Maximum iterations of the subdivision method for cubic bezier calculations.
39///
40$iro-cubic-bezier-subdiv-max-iters: 10 !default;
41
42///
43/// A cubic bezier function identical to the CSS cubic-bezier function.
44///
45/// @param {number} $x1 - X of first point
46/// @param {number} $y1 - Y of first point
47/// @param {number} $x2 - X of second point
48/// @param {number} $y2 - Y of second point
49/// @param {number} $x - Progress between 0 and 1 inclusive
50///
51/// @return {number}
52///
53@function iro-cubic-bezier($x1, $y1, $x2, $y2, $x) {
54 //
55 // Cover simple cases
56 //
57
58 @if ($x1 == $y1) and ($x2 == $y2) {
59 @return $x;
60 }
61 @if $x == 0 {
62 @return 0;
63 }
64 @if $x == 1 {
65 @return 1;
66 }
67
68 //
69 // Generate samples
70 //
71
72 $sample-pool-key: $x1 + '_' + $x2;
73
74 @if not map-has-key($iro-cubic-bezier-sample-pool, $sample-pool-key) {
75 $samples: ();
76
77 @for $i from 0 through $iro-cubic-bezier-sample-pool-size {
78 $samples: append($samples, iro-cubic-bezier-func($x1, $x2, $i / $iro-cubic-bezier-sample-pool-size));
79 }
80
81 $iro-cubic-bezier-sample-pool: map-merge($iro-cubic-bezier-sample-pool, ($sample-pool-key: $samples)) !global;
82 }
83
84 //
85 // Calculate cubic bezier
86 //
87
88 @return iro-cubic-bezier-func($y1, $y2, iro-cubic-bezier-t-for-x($x1, $x2, $x));
89}
90
91///
92/// @access private
93///
94@function iro-cubic-bezier-func-a($p1, $p2) {
95 @return 1 - 3 * $p2 + 3 * $p1;
96}
97
98///
99/// @access private
100///
101@function iro-cubic-bezier-func-b($p1, $p2) {
102 @return 3 * $p2 - 6 * $p1;
103}
104
105///
106/// @access private
107///
108@function iro-cubic-bezier-func-c($p1) {
109 @return 3 * $p1;
110}
111
112///
113/// One-dimensional cubic bezier function.
114///
115/// @access private
116///
117@function iro-cubic-bezier-func($p1, $p2, $t) {
118 @return ((iro-cubic-bezier-func-a($p1, $p2) * $t + iro-cubic-bezier-func-b($p1, $p2)) * $t + iro-cubic-bezier-func-c($p1)) * $t;
119}
120
121///
122/// Derivative of the one-dimensional cubic bezier function.
123///
124/// @access private
125///
126@function iro-cubic-bezier-func-slope($p1, $p2, $t) {
127 @return 3 * iro-cubic-bezier-func-a($p1, $p2) * $t * $t + 2 * iro-cubic-bezier-func-b($p1, $p2) * $t + iro-cubic-bezier-func-c($p1);
128}
129
130///
131/// Newton-Raphson method to calculate the t parameter for a given x parameter.
132///
133/// @access private
134///
135@function iro-cubic-bezier-newton-raphson($x1, $x2, $x, $t) {
136 @for $i from 1 through $iro-cubic-bezier-newton-iters {
137 $cur-slope: iro-cubic-bezier-func-slope($x1, $x2, $t);
138
139 @if $cur-slope == 0 {
140 @return $t;
141 }
142
143 $cur-x: iro-cubic-bezier-func($x1, $x2, $t) - $x;
144 $t: $t - $cur-x / $cur-slope;
145 }
146
147 @return $t;
148}
149
150///
151/// Subdivision method to calculate the t parameter for a given x parameter.
152///
153/// @access private
154///
155@function iro-cubic-bezier-binary-subdivide($x1, $x2, $x, $a, $b) {
156 $cur-x: 0;
157 $cur-t: 0;
158 $i: 0;
159
160 @while $i < $iro-cubic-bezier-subdiv-max-iters {
161 $cur-t: $a + ($b - $a) / 2;
162 $cur-x: iro-cubic-bezier-func($x1, $x2, $cur-t) - $x;
163
164 @if $cur-x > 0 {
165 $b: $cur-t;
166 } @else {
167 $a: $cur-t;
168 }
169
170 @if abs($cur-x) < $iro-cubic-bezier-subdiv-precision {
171 @return $cur-t;
172 }
173 }
174
175 @return $cur-t;
176}
177
178///
179/// Calculate the t parameter for a given x parameter.
180///
181/// @access private
182///
183@function iro-cubic-bezier-t-for-x($x1, $x2, $x) {
184 $sample-pool-key: $x1 + '_' + $x2;
185 $samples: map-get($iro-cubic-bezier-sample-pool, $sample-pool-key);
186
187 $intv-start: 0;
188 $cur-sample: 1;
189 $last-sample: $iro-cubic-bezier-sample-pool-size;
190
191 @while ($cur-sample != $last-sample) and (nth($samples, $cur-sample) <= $x) {
192 $intv-start: $intv-start + (1 / $iro-cubic-bezier-sample-pool-size);
193 $cur-sample: $cur-sample + 1;
194 }
195 $cur-sample: $cur-sample - 1;
196
197 $dist: ($x - nth($samples, $cur-sample)) / (nth($samples, $cur-sample + 1) - nth($samples, $cur-sample));
198 $guess-t: $intv-start + $dist / $iro-cubic-bezier-sample-pool-size;
199
200 $init-slope: iro-cubic-bezier-func-slope($x1, $x2, $guess-t);
201 @if $init-slope >= $iro-cubic-bezier-newton-min-slope {
202 @return iro-cubic-bezier-newton-raphson($x1, $x2, $x, $guess-t);
203 } @else if $init-slope == 0 {
204 @return $guess-t;
205 } @else {
206 @return iro-cubic-bezier-binary-subdivide($x1, $x2, $x, $intv-start, $intv-start + 1 / $iro-cubic-bezier-sample-pool-size);
207 }
208}
209
210///
211/// Sinusoidal easing function (in direction).
212///
213/// @param {number} $x - Progress between 0 and 1 inclusive
214///
215/// @return {number}
216///
217@function iro-ease($x) {
218 @return iro-cubic-bezier(0.25, 0.1, 0.25, 1, $x);
219}
220
221///
222/// Sinusoidal easing function (in direction).
223///
224/// @param {number} $x - Progress between 0 and 1 inclusive
225///
226/// @return {number}
227///
228@function iro-ease-in($x) {
229 @return iro-cubic-bezier(0.42, 0, 1, 1, $x);
230}
231
232///
233/// Sinusoidal easing function (out direction).
234///
235/// @param {number} $x - Progress between 0 and 1 inclusive
236///
237/// @return {number}
238///
239@function iro-ease-out($x) {
240 @return iro-cubic-bezier(0, 0, 0.58, 1, $x);
241}
242
243///
244/// Sinusoidal easing function (in-out direction).
245///
246/// @param {number} $x - Progress between 0 and 1 inclusive
247///
248/// @return {number}
249///
250@function iro-ease-in-out($x) {
251 @return iro-cubic-bezier(0.42, 0, 0.58, 1, $x);
252}
253
254///
255/// Sinusoidal easing function (in direction).
256///
257/// @param {number} $x - Progress between 0 and 1 inclusive
258///
259/// @return {number}
260///
261@function iro-ease-in-sine($x) {
262 @return iro-cubic-bezier(0.47, 0, 0.745, 0.715, $x);
263}
264
265///
266/// Sinusoidal easing function (out direction).
267///
268/// @param {number} $x - Progress between 0 and 1 inclusive
269///
270/// @return {number}
271///
272@function iro-ease-out-sine($x) {
273 @return iro-cubic-bezier(0.39, 0.575, 0.565, 1, $x);
274}
275
276///
277/// Sinusoidal easing function (in-out direction).
278///
279/// @param {number} $x - Progress between 0 and 1 inclusive
280///
281/// @return {number}
282///
283@function iro-ease-in-out-sine($x) {
284 @return iro-cubic-bezier(0.445, 0.05, 0.55, 0.95, $x);
285}
286
287///
288/// Quadratic easing function (in direction).
289///
290/// @param {number} $x - Progress between 0 and 1 inclusive
291///
292/// @return {number}
293///
294@function iro-ease-in-quad($x) {
295 @return iro-cubic-bezier(0.55, 0.085, 0.68, 0.53, $x);
296}
297
298///
299/// Quadratic easing function (out direction).
300///
301/// @param {number} $x - Progress between 0 and 1 inclusive
302///
303/// @return {number}
304///
305@function iro-ease-out-quad($x) {
306 @return iro-cubic-bezier(0.25, 0.46, 0.45, 0.94, $x);
307}
308
309///
310/// Quadratic easing function (in-out direction).
311///
312/// @param {number} $x - Progress between 0 and 1 inclusive
313///
314/// @return {number}
315///
316@function iro-ease-in-out-quad($x) {
317 @return iro-cubic-bezier(0.455, 0.03, 0.515, 0.955, $x);
318}
319
320///
321/// Cubic easing function (in direction).
322///
323/// @param {number} $x - Progress between 0 and 1 inclusive
324///
325/// @return {number}
326///
327@function iro-ease-in-cubic($x) {
328 @return iro-cubic-bezier(0.55, 0.055, 0.675, 0.19, $x);
329}
330
331///
332/// Cubic easing function (out direction).
333///
334/// @param {number} $x - Progress between 0 and 1 inclusive
335///
336/// @return {number}
337///
338@function iro-ease-out-cubic($x) {
339 @return iro-cubic-bezier(0.215, 0.61, 0.355, 1, $x);
340}
341
342///
343/// Cubic easing function (in-out direction).
344///
345/// @param {number} $x - Progress between 0 and 1 inclusive
346///
347/// @return {number}
348///
349@function iro-ease-in-out-cubic($x) {
350 @return iro-cubic-bezier(0.645, 0.045, 0.355, 1, $x);
351}
352
353///
354/// Quart easing function (in direction).
355///
356/// @param {number} $x - Progress between 0 and 1 inclusive
357///
358/// @return {number}
359///
360@function iro-ease-in-quart($x) {
361 @return iro-cubic-bezier(0.895, 0.03, 0.685, 0.22, $x);
362}
363
364///
365/// Quart easing function (out direction).
366///
367/// @param {number} $x - Progress between 0 and 1 inclusive
368///
369/// @return {number}
370///
371@function iro-ease-out-quart($x) {
372 @return iro-cubic-bezier(0.165, 0.84, 0.44, 1, $x);
373}
374
375///
376/// Quart easing function (in-out direction).
377///
378/// @param {number} $x - Progress between 0 and 1 inclusive
379///
380/// @return {number}
381///
382@function iro-ease-in-out-quart($x) {
383 @return iro-cubic-bezier(0.77, 0, 0.175, 1, $x);
384}
385
386///
387/// Quint easing function (in direction).
388///
389/// @param {number} $x - Progress between 0 and 1 inclusive
390///
391/// @return {number}
392///
393@function iro-ease-in-quint($x) {
394 @return iro-cubic-bezier(0.755, 0.05, 0.855, 0.06, $x);
395}
396
397///
398/// Quint easing function (out direction).
399///
400/// @param {number} $x - Progress between 0 and 1 inclusive
401///
402/// @return {number}
403///
404@function iro-ease-out-quint($x) {
405 @return iro-cubic-bezier(0.23, 1, 0.32, 1, $x);
406}
407
408///
409/// Quint easing function (in-out direction).
410///
411/// @param {number} $x - Progress between 0 and 1 inclusive
412///
413/// @return {number}
414///
415@function iro-ease-in-out-quint($x) {
416 @return iro-cubic-bezier(0.86, 0, 0.07, 1, $x);
417}
418
419///
420/// Exponential easing function (in direction).
421///
422/// @param {number} $x - Progress between 0 and 1 inclusive
423///
424/// @return {number}
425///
426@function iro-ease-in-expo($x) {
427 @return iro-cubic-bezier(0.95, 0.05, 0.795, 0.035, $x);
428}
429
430///
431/// Exponential easing function (out direction).
432///
433/// @param {number} $x - Progress between 0 and 1 inclusive
434///
435/// @return {number}
436///
437@function iro-ease-out-expo($x) {
438 @return iro-cubic-bezier(0.19, 1, 0.22, 1, $x);
439}
440
441///
442/// Exponential easing function (in-out direction).
443///
444/// @param {number} $x - Progress between 0 and 1 inclusive
445///
446/// @return {number}
447///
448@function iro-ease-in-out-expo($x) {
449 @return iro-cubic-bezier(1, 0, 0, 1, $x);
450}
451
452///
453/// Circular easing function (in direction).
454///
455/// @param {number} $x - Progress between 0 and 1 inclusive
456///
457/// @return {number}
458///
459@function iro-ease-in-circ($x) {
460 @return iro-cubic-bezier(0.6, 0.04, 0.98, 0.335, $x);
461}
462
463///
464/// Circular easing function (out direction).
465///
466/// @param {number} $x - Progress between 0 and 1 inclusive
467///
468/// @return {number}
469///
470@function iro-ease-out-circ($x) {
471 @return iro-cubic-bezier(0.075, 0.82, 0.165, 1, $x);
472}
473
474///
475/// Circular easing function (in-out direction).
476///
477/// @param {number} $x - Progress between 0 and 1 inclusive
478///
479/// @return {number}
480///
481@function iro-ease-in-out-circ($x) {
482 @return iro-cubic-bezier(0.785, 0.135, 0.15, 0.86, $x);
483}
diff --git a/src/_functions.scss b/src/_functions.scss
new file mode 100644
index 0000000..2f34dc4
--- /dev/null
+++ b/src/_functions.scss
@@ -0,0 +1,328 @@
1////
2/// Various functions.
3///
4/// This file contains various and mostly unrelated functions. Some of which
5/// are used in this framework, while others are just there and may be used.
6///
7/// @group Functions
8///
9/// @access public
10////
11
12///
13/// Replace a substring with a new string.
14///
15/// @param {string} $string - String to search
16/// @param {string} $search - Substring that gets replaced
17/// @param {string} $replace - String that replaces $search
18///
19/// @return {string} A string with all instances of $search replaced with $replace
20///
21@function iro-str-replace($string, $search, $replace) {
22 $index: str-index($string, $search);
23
24 @if $index {
25 @return str-slice($string, 1, $index - 1) + $replace + iro-str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
26 }
27
28 @return $string;
29}
30
31///
32/// Concatenate all items from $list.
33///
34/// @param {list} $list
35/// @param {number} $glue - Delimiter
36///
37/// @return {string}
38///
39@function iro-str-implode($list, $glue: '') {
40 $result: '';
41
42 @each $item in $list {
43 $result: $result + if(length($item) > 1, iro-str-implode($item, $glue), $item);
44
45 @if $item != nth($list, length($list)) {
46 $result: $result + $glue;
47 }
48 }
49
50 @return $result;
51}
52
53///
54/// Extract a subset from the given list.
55///
56/// @param {list} $list
57/// @param {number} $start [1] - Indices before this value will be discarded
58/// @param {number} $end [length($list)] - Indices starting after this value will be discarded
59///
60/// @return {list} A slice of the list
61///
62@function iro-list-slice($list, $start: 1, $end: length($list)) {
63 $result: ();
64
65 @for $i from $start through $end {
66 @if $i != 0 {
67 $result: append($result, nth($list, $i), list-separator($list));
68 }
69 }
70
71 @return $result;
72}
73
74///
75/// Add a new item to the beginning of a list.
76///
77/// @param {list} $list
78/// @param {number} $value
79///
80/// @return {list} A list with $value at the beginning, followed by the other items
81///
82@function iro-list-prepend($list, $value) {
83 $result: append((), $value, list-separator($list));
84
85 @if length($list) > 0 {
86 @for $i from 1 through length($list) {
87 $result: append($result, nth($list, $i), list-separator($list));
88 }
89 }
90
91 @return $result;
92}
93
94///
95/// Sort numeric items in a list.
96///
97/// The implementation is based on the algorithm on the German Wikipedia article
98/// about quicksort: https://de.wikipedia.org/wiki/Quicksort#Pseudocode
99///
100/// @param {list} $l
101///
102/// @return {list} Sorted list
103///
104@function iro-quicksort($l, $left: 1, $right: length($l)) {
105 @if $left < $right {
106 $pvr: iro-quicksort-partition($l, $left, $right);
107 $pivot: nth($pvr, 1);
108 $l: nth($pvr, 2);
109 $l: iro-quicksort($l, $left, $pivot);
110 $l: iro-quicksort($l, $pivot + 1, $right);
111 }
112
113 @return $l;
114}
115
116///
117/// @access private
118///
119@function iro-quicksort-partition($l, $left, $right) {
120 $start: true;
121 $i: $left;
122 $j: $right - 1;
123 $pivot: nth($l, $right);
124
125 @while ($i < $j) or $start {
126 @while (nth($l, $i) < $pivot) and ($i < $right - 1) {
127 $i: $i + 1;
128 }
129
130 @while (nth($l, $j)>= $pivot) and ($j > $left) {
131 $j: $j - 1;
132 }
133
134 @if $i < $j {
135 $i-val: nth($l, $i);
136 $l: set-nth($l, $i, nth($l, $j));
137 $l: set-nth($l, $j, $i-val);
138 }
139
140 $start: false;
141 }
142
143 @if nth($l, $i) > $pivot {
144 $i-val: nth($l, $i);
145 $l: set-nth($l, $i, nth($l, $right));
146 $l: set-nth($l, $right, $i-val);
147 }
148
149 @return $i $l;
150}
151
152///
153/// Try to get the value for the given key from the given map. If it doesn't contain that key,
154/// return the provided default value instead.
155///
156/// @param {map} $map
157/// @param {string} $key
158/// @param {any} $default
159///
160/// @return {any} Either the value assigned to $key or $default
161///
162@function iro-map-get-default($map, $key, $default) {
163 @return if(map-has-key($map, $key), map-get($map, $key), $default);
164}
165
166///
167/// Get the value for a map within a map (or deeper).
168///
169/// @param {map} $map
170/// @param {string | list} $key
171/// @param {any} $default [null]
172///
173/// @return {any} Either the value assigned to $key or $default
174///
175@function iro-map-get-deep($map, $key, $default: null) {
176 $value: null;
177
178 @if type-of($key) == list {
179 $value: $map;
180
181 @each $k in $key {
182 $value: map-get($value, $k);
183
184 @if $value == null {
185 @return $default;
186 }
187 }
188 } @else {
189 $value: map-get($map, $key);
190
191 @if $value == null {
192 @return $default;
193 }
194 }
195
196 @return $value;
197}
198
199///
200/// Merge two maps recursively.
201///
202/// @param {map} $map1
203/// @param {map} $map2
204///
205/// @return {map} The result of a recursive merge of $map1 and $map2
206///
207@function iro-map-merge-recursive($map1, $map2) {
208 @if type-of($map1) != map or type-of($map2) != map {
209 @error 'Two maps expected.';
210 }
211
212 $result: $map1;
213
214 @each $key, $value in $map2 {
215 @if type-of(map-get($result, $key)) == map and type-of($value) == map {
216 $result: map-merge($result, ($key: iro-map-merge-recursive(map-get($result, $key), $value)));
217 } @else {
218 $result: map-merge($result, ($key: $value));
219 }
220 }
221
222 @return $result;
223}
224
225///
226/// Get the contents of a map as a user-friendly string representation.
227///
228/// @param {map} $map
229///
230/// @return {string}
231///
232@function iro-map-print($map) {
233 $output: '';
234
235 @each $key, $value in $map {
236 $value-str: '';
237
238 @if type-of($value) == map {
239 $value-str: '[ ' + iro-map-print($value) + ' ]';
240 } @else if type-of($value) == list {
241 $value-str: '[ ' + iro-str-implode($value, ', ') + ' ]';
242 } @else if type-of($value) == string {
243 $value-str: '\'' + $value + '\'';
244 } @else {
245 $value-str: $value;
246 }
247
248 @if $output == '' {
249 $output: $key + ': ' + $value-str;
250 } @else {
251 $output: $output + ', ' + $key + ': ' + $value-str;
252 }
253 }
254
255 @return $output;
256}
257
258///
259/// Check if the given selector ends with one of the provided suffixes.
260///
261/// @param {selector} $selector
262/// @param {selector} $suffixes
263///
264/// @return {bool} `true` if the selector matches at least one suffix, otherwise `false`.
265///
266@function iro-selector-suffix-match($selector, $suffixes) {
267 $match: true;
268
269 @each $sel in $selector {
270 @if $match {
271 $sel-match: false;
272
273 @each $suffix in $suffixes {
274 @if not $sel-match {
275 $suf-match: true;
276
277 @for $i from 1 through length($suffix) {
278 @if $suf-match and (nth($sel, -$i) != nth($suffix, -$i)) {
279 $suf-match: false;
280 }
281 }
282
283 @if $suf-match {
284 $sel-match: true;
285 }
286 }
287 }
288
289 @if not $sel-match {
290 $match: false;
291 }
292 }
293 }
294
295 @return $match;
296}
297
298///
299/// Remove the unit from any variable.
300///
301/// @param {any} $n
302///
303/// @return {number} Unit-less variable
304///
305@function iro-strip-unit($n) {
306 @return $n / ($n * 0 + 1);
307}
308
309///
310/// Convert a pixel value to a rem value.
311///
312/// @param {number} $size - Pixel value to convert
313/// @param {number} $base [$iro-root-size] - Reference base font size used for conversion
314///
315/// @return {number} Pixel value converted to rem
316///
317@function iro-px-to-rem($size, $base: $iro-root-size) {
318 @return $size / $base * 1rem;
319}
320
321///
322/// A mixin with the sole purpose of letting you use temporary variables without polluting the global namespace.
323///
324/// @content
325///
326@mixin iro-execute {
327 @content;
328}
diff --git a/src/_gradients.scss b/src/_gradients.scss
new file mode 100644
index 0000000..7c52d63
--- /dev/null
+++ b/src/_gradients.scss
@@ -0,0 +1,600 @@
1////
2/// Smoother background gradients.
3///
4/// The default background gradients produced by any browser have a quite harsh transition between
5/// colors. This is especially apparent if you, for example, use a strong fade-out gradient to make
6/// text in front of a background more readable.
7///
8/// The function in this file generates smoother gradients by using easing functions of the user's
9/// choice.
10/// It's essentially a more flexible alternative to the PostCSS plugin "PostCSS Easing Gradients":
11/// https://github.com/larsenwork/postcss-easing-gradients
12///
13/// @group Background gradients
14///
15/// @access public
16////
17
18///
19/// Number of intermediate color stops generated to achieve easing.
20/// A higher value results in better quality, but also much more generated code.
21///
22/// @type number
23///
24$iro-easing-gradient-steps: 10 !default;
25
26///
27/// Generate a new easing background gradient.
28/// This function is intended to be as similar as possible to the newly proposed syntax for
29/// linear-gradient and radial-gradient which includes easing hints.
30///
31/// @param {string} $type - Either 'linear' or 'radial', which means the gradient will be either a linear-gradient or a radial-gradient.
32/// @param {string} $dir - The direction of the gradient. Depending on $type, this value must be a valid direction for linear-gradient or radial-gradient.
33/// @param {color | list} $stop - A color stop as used for linear-gradient or radial-gradient.
34/// @param {arglist} $stops - More color stops as used for linear-gradient or radial-gradient. Between two color stops, you may also define an easing hint such as `ease-in-out`, `cubic-bezier 0.42 0 0.58 1`, `steps 3 jump-end`, and so on.
35///
36/// @return {string} A linear-gradient or radial-gradient with an alternative transitioning behavior.
37///
38/// @throw If $type is invalid
39///
40/// @link https://github.com/w3c/csswg-drafts/issues/1332 The new CSSWG proposal
41///
42/// @example scss - A smoother linear gradient
43/// .background {
44/// background-image: iro-easing-gradient(
45/// linear,
46/// to top,
47/// #000,
48/// in-out-sine,
49/// transparent
50/// );
51/// }
52///
53/// // Generates:
54///
55/// .background {
56/// background-image: linear-gradient(
57/// to top,
58/// black 0%,
59/// rgba(0, 0, 0, 0.975528) 10%,
60/// rgba(0, 0, 0, 0.904508) 20%,
61/// rgba(0, 0, 0, 0.793893) 30%,
62/// rgba(0, 0, 0, 0.654508) 40%,
63/// rgba(0, 0, 0, 0.5) 50%,
64/// rgba(0, 0, 0, 0.345492) 60%,
65/// rgba(0, 0, 0, 0.206107) 70%,
66/// rgba(0, 0, 0, 0.0954915) 80%,
67/// rgba(0, 0, 0, 0.0244717) 90%,
68/// rgba(0, 0, 0, 3.78257e-11) 100%
69/// );
70/// }
71///
72/// @example scss - A smoother radial gradient
73/// .background {
74/// background-image: iro-easing-gradient(
75/// radial,
76/// 50em 16em at 0 0,
77/// #000,
78/// in-out-sine,
79/// transparent
80/// );
81/// }
82///
83/// // Generates:
84///
85/// .background {
86/// background-image: radial-gradient(
87/// 50em 16em at 0 0,
88/// black 0%,
89/// rgba(0, 0, 0, 0.975528) 10%,
90/// rgba(0, 0, 0, 0.904508) 20%,
91/// rgba(0, 0, 0, 0.793893) 30%,
92/// rgba(0, 0, 0, 0.654508) 40%,
93/// rgba(0, 0, 0, 0.5) 50%,
94/// rgba(0, 0, 0, 0.345492) 60%,
95/// rgba(0, 0, 0, 0.206107) 70%,
96/// rgba(0, 0, 0, 0.0954915) 80%,
97/// rgba(0, 0, 0, 0.0244717) 90%,
98/// rgba(0, 0, 0, 3.78257e-11) 100%
99/// );
100/// }
101///
102/// @example scss - A smoother linear gradient with complex color positions
103/// .background {
104/// background-image: iro-easing-gradient(
105/// linear,
106/// to top,
107/// #000 20%,
108/// in-out-sine,
109/// transparent calc(20% + 25em)
110/// );
111/// }
112///
113/// // Generates:
114///
115/// .background {
116/// background-image: linear-gradient(
117/// to top,
118/// black 20%,
119/// rgba(0, 0, 0, 0.975528) calc(20% + (20% + 25em - 20%) * 0.1),
120/// rgba(0, 0, 0, 0.904508) calc(20% + (20% + 25em - 20%) * 0.2),
121/// rgba(0, 0, 0, 0.793893) calc(20% + (20% + 25em - 20%) * 0.3),
122/// rgba(0, 0, 0, 0.654508) calc(20% + (20% + 25em - 20%) * 0.4),
123/// rgba(0, 0, 0, 0.5) calc(20% + (20% + 25em - 20%) * 0.5),
124/// rgba(0, 0, 0, 0.345492) calc(20% + (20% + 25em - 20%) * 0.6),
125/// rgba(0, 0, 0, 0.206107) calc(20% + (20% + 25em - 20%) * 0.7),
126/// rgba(0, 0, 0, 0.0954915) calc(20% + (20% + 25em - 20%) * 0.8),
127/// rgba(0, 0, 0, 0.0244717) calc(20% + (20% + 25em - 20%) * 0.9),
128/// transparent calc(20% + 25em))
129/// );
130/// }
131///
132@function iro-easing-gradient($type, $dir, $stop, $stops...) {
133 $pos-template: null;
134 $stops: iro-list-prepend($stops, $stop);
135
136 $last-positioned-stop: 1;
137 $generated-stops: ();
138
139 //
140 // Generate gradient
141 //
142
143 @for $i from 1 through length($stops) {
144 $stop: nth($stops, $i);
145
146 @if $i == 1 {
147 @if not iro-easing-gradient-is-color-stop($stop) {
148 @error 'The first color stop argument must be a color stop.';
149 }
150
151 @if type-of($stop) == color {
152 //
153 // The first color stop is unpositioned. The default position for the first
154 // color stop is 0, which is explicitly added for easier calculations.
155 //
156
157 $stop: $stop 0;
158 $stops: set-nth($stops, $i, $stop);
159 }
160
161 $generated-stops: append($generated-stops, iro-str-implode($stop, ' '));
162 } @else if iro-easing-gradient-is-positioned-color-stop($stop) or ($i == length($stops)) {
163 @if not iro-easing-gradient-is-color-stop($stop) {
164 @error 'The last color stop argument must be a color stop.';
165 }
166
167 //
168 // Either the current stops list item is a positioned color stop, or the end of
169 // the stops list has been reached.
170 //
171
172 @if (type-of($stop) == color) and ($i == length($stops)) {
173 //
174 // The current stop is an unpositioned color stop, which means this is the end
175 // of the stops list. The default position for the last color stop is 100%, which
176 // is explicitly added for easier calculations.
177 //
178
179 $stop: $stop 100%;
180 $stops: set-nth($stops, $i, $stop);
181 }
182
183 //
184 // Now the current color stop is guaranteed to be a positioned color stop.
185 //
186
187 @if $i > $last-positioned-stop + 1 {
188 //
189 // There is at least one stops list item (unpositioned color stop or easing function)
190 // between the last positioned color stop and the current stops list item. Interpolate
191 // the positions of all stops list items that are color stops.
192 //
193
194 $interpolated-stops: iro-easing-gradient-interpolate-stop-positions(
195 nth($stops, $last-positioned-stop),
196 iro-list-slice($stops, $last-positioned-stop + 1, $i - 1),
197 $stop
198 );
199
200 $new-stops: join(
201 iro-list-slice($stops, 1, $last-positioned-stop),
202 $interpolated-stops
203 );
204 $new-stops: join(
205 $new-stops,
206 iro-list-slice($stops, $i)
207 );
208 $stops: $new-stops;
209 }
210
211 //
212 // Now all color stops between this one and the last positioned one have
213 // interpolated positions.
214 // Next task is to perform an easing transition between all color stops that
215 // have an easing function specified. The rest can be left alone since the
216 // browser will automatically apply a linear transition between them.
217 //
218
219 $j: $last-positioned-stop + 1;
220 @while $j <= $i {
221 $easing: null;
222 $prev-stop: nth($stops, $j - 1);
223 $next-stop: nth($stops, $j);
224
225 @if not iro-easing-gradient-is-color-stop($next-stop) {
226 $j: $j + 1;
227
228 $easing: $next-stop;
229 $next-stop: nth($stops, $j);
230
231 @if not iro-easing-gradient-is-color-stop($next-stop) {
232 @error 'There can be at most one interpolation hint between to color stops.';
233 }
234 }
235
236 @if $easing != null {
237 @if type-of($easing) == number {
238 @error 'Midpoint shifts are not supported.';
239 }
240
241 $easing-func: null;
242 $easing-args: ();
243
244 @if type-of($easing) == list {
245 $easing-args: iro-list-slice($easing, 2);
246 $easing: nth($easing, 1);
247 }
248
249 $generated-stops: join(
250 $generated-stops,
251 iro-easing-gradient-ease-stops($prev-stop, $next-stop, $easing, $easing-args)
252 );
253 } @else {
254 $generated-stops: append($generated-stops, iro-str-implode($next-stop, ' '));
255 }
256
257 $j: $j + 1;
258 }
259
260 $last-positioned-stop: $i;
261 }
262 }
263
264 @if $type == 'linear' {
265 @return linear-gradient($dir, unquote(iro-str-implode($generated-stops, ', ')));
266 } @else if $type == 'radial' {
267 @return radial-gradient($dir, unquote(iro-str-implode($generated-stops, ', ')));
268 } @else {
269 @error 'Invalid gradient type: #{inspect($type)}.';
270 }
271}
272
273///
274/// Alias for iro-easing-gradient('linear',...)
275///
276/// @see {function} iro-easing-gradient
277///
278@function iro-easing-linear-gradient($dir, $stop, $stops...) {
279 @return iro-easing-gradient('linear', $dir, $stop, $stops...);
280}
281
282///
283/// Alias for iro-easing-gradient('radial',...)
284///
285/// @see {function} iro-easing-gradient
286///
287@function iro-easing-radial-gradient($dir, $stop, $stops...) {
288 @return iro-easing-gradient('radial', $dir, $stop, $stops...);
289}
290
291///
292/// Generate a smooth transition from one color stop to another using the provided easing function.
293///
294/// @access private
295///
296@function iro-easing-gradient-ease-stops($prev-stop, $next-stop, $easing, $easing-args: ()) {
297 @if $easing == 'steps' {
298 $steps: null;
299 $jump: null;
300
301 @if length($easing-args) > 1 {
302 $steps: nth($easing-args, 1);
303 $jump: nth($easing-args, 2);
304 } @else {
305 $steps: nth($easing-args, 1);
306 $jump: jump-end;
307 }
308
309 @return iro-easing-gradient-steps-stops($prev-stop, $next-stop, $steps, $jump);
310 } @else {
311 $easing-func: null;
312 @if function-exists('iro-' + $easing) {
313 $easing-func: get-function('iro-' + $easing);
314 } @else {
315 $easing-func: get-function($easing);
316 }
317
318 @return iro-easing-gradient-bezier-stops($prev-stop, $next-stop, $easing-func, $easing-args);
319 }
320}
321
322///
323/// Generate a smooth transition from one color stop to another using the provided cubic-bezier function.
324///
325/// @access private
326///
327@function iro-easing-gradient-bezier-stops($prev-stop, $next-stop, $easing-func, $easing-args: ()) {
328 $prev-stop-color: nth($prev-stop, 1);
329 $prev-stop-pos: nth($prev-stop, 2);
330 $next-stop-color: nth($next-stop, 1);
331 $next-stop-pos: nth($next-stop, 2);
332
333 $stops: ();
334
335 @if ((type-of($prev-stop-pos) == number) and (type-of($next-stop-pos) == number) and (unit($prev-stop-pos) == unit($next-stop-pos))) or ($prev-stop-pos == 0) or ($next-stop-pos == 0) {
336 //
337 // The transition color stop positions can be statically calculated.
338 //
339
340 $distance: $next-stop-pos - $prev-stop-pos;
341
342 @for $i from 1 through $iro-easing-gradient-steps {
343 $perc: $i / $iro-easing-gradient-steps;
344
345 $color: null;
346 $pos: $prev-stop-pos + $perc * $distance;
347 @if $perc == 1 {
348 $color: $next-stop-color;
349 } @else {
350 $color: mix($next-stop-color, $prev-stop-color, call($easing-func, append($easing-args, $perc)...) * 100%);
351 }
352
353 $stops: append($stops, $color + ' ' + $pos);
354 }
355 } @else {
356 //
357 // The transition color stop positions have to be dynamically calculated with the calc() function.
358 //
359
360 @if type-of($prev-stop-pos) != number {
361 // must be calc()
362 @if (type-of($prev-stop-pos) != string) or (str-index($prev-stop-pos, 'calc(') != 1) {
363 @error 'Invalid color stop position: #{inspect($prev-stop-pos)}';
364 }
365
366 $prev-stop-pos: str-slice($prev-stop-pos, 6, str-length($prev-stop-pos) - 1);
367 }
368
369 @if type-of($next-stop-pos) != number {
370 // must be calc()
371 @if (type-of($next-stop-pos) != string) or (str-index($next-stop-pos, 'calc(') != 1) {
372 @error 'Invalid color stop position: #{inspect($next-stop-pos)}';
373 }
374
375 $next-stop-pos: str-slice($next-stop-pos, 6, str-length($next-stop-pos) - 1);
376 }
377
378 @for $i from 1 through $iro-easing-gradient-steps {
379 $perc: $i / $iro-easing-gradient-steps;
380
381 $color: null;
382 $pos: null;
383 @if $perc == 1 {
384 $color: $next-stop-color;
385 $pos: calc(#{$next-stop-pos});
386 } @else {
387 $color: mix($next-stop-color, $prev-stop-color, call($easing-func, append($easing-args, $perc)...) * 100%);
388 $pos: calc(#{$prev-stop-pos} + (#{$next-stop-pos} - #{$prev-stop-pos}) * #{$perc});
389 }
390
391 $stops: append($stops, $color + ' ' + $pos);
392 }
393 }
394
395 @return $stops;
396}
397
398///
399/// Generate a step transition from one color stop to another.
400///
401/// @access private
402///
403@function iro-easing-gradient-steps-stops($prev-stop, $next-stop, $steps, $jump: jump-end) {
404 $prev-stop-color: nth($prev-stop, 1);
405 $prev-stop-pos: nth($prev-stop, 2);
406 $next-stop-color: nth($next-stop, 1);
407 $next-stop-pos: nth($next-stop, 2);
408
409 $stops: ();
410
411 @if ((type-of($prev-stop-pos) == number) and (type-of($next-stop-pos) == number) and (unit($prev-stop-pos) == unit($next-stop-pos))) or ($prev-stop-pos == 0) or ($next-stop-pos == 0) {
412 //
413 // The transition color stop positions can be statically calculated.
414 //
415
416 $distance: $next-stop-pos - $prev-stop-pos;
417
418 @for $i from 1 through $steps {
419 $x1: ($i - 1) / $steps;
420 $x2: $i / $steps;
421 $y: null;
422
423 @if $jump == jump-start {
424 $y: $i / $steps;
425 } @else if $jump == jump-end {
426 $y: ($i - 1) / $steps;
427 } @else if $jump == jump-both {
428 $y: $i / ($steps + 1);
429 } @else if $jump == jump-none {
430 $y: ($i - 1) / ($steps - 1);
431 } @else {
432 @error 'Invalid $jump: #{inspect($jump)}';
433 }
434
435 $color: null;
436 $pos1: if($x1 == 0, $prev-stop-pos, $prev-stop-pos + $x1 * $distance);
437 $pos2: if($x2 == 1, $next-stop-pos, $prev-stop-pos + $x2 * $distance);
438
439 @if $y == 0 {
440 $color: $prev-stop-color;
441 } @else if $y == 1 {
442 $color: $next-stop-color;
443 } @else {
444 $color: mix($next-stop-color, $prev-stop-color, $y * 100%);
445 }
446
447 $stops: append($stops, $color + ' ' + $pos1);
448 $stops: append($stops, $color + ' ' + $pos2);
449 }
450 } @else {
451 //
452 // The transition color stop positions have to be dynamically calculated with the calc() function.
453 //
454
455 @if type-of($prev-stop-pos) != number {
456 // must be calc()
457 @if (type-of($prev-stop-pos) != string) or (str-index($prev-stop-pos, 'calc(') != 1) {
458 @error 'Invalid color stop position: #{inspect($prev-stop-pos)}';
459 }
460
461 $prev-stop-pos: str-slice($prev-stop-pos, 6, str-length($prev-stop-pos) - 1);
462 }
463
464 @if type-of($next-stop-pos) != number {
465 // must be calc()
466 @if (type-of($next-stop-pos) != string) or (str-index($next-stop-pos, 'calc(') != 1) {
467 @error 'Invalid color stop position: #{inspect($next-stop-pos)}';
468 }
469
470 $next-stop-pos: str-slice($next-stop-pos, 6, str-length($next-stop-pos) - 1);
471 }
472
473 @for $i from 1 through $steps {
474 $x1: ($i - 1) / $steps;
475 $x2: $i / $steps;
476 $y: null;
477
478 @if $jump == jump-start {
479 $y: $i / $steps;
480 } @else if $jump == jump-end {
481 $y: ($i - 1) / $steps;
482 } @else if $jump == jump-both {
483 $y: $i / ($steps + 1);
484 } @else if $jump == jump-none {
485 $y: ($i - 1) / ($steps - 1);
486 } @else {
487 @error 'Invalid $jump: #{inspect($jump)}';
488 }
489
490 $color: null;
491 $pos1: if($x1 == 0, $prev-stop-pos, calc(#{$prev-stop-pos} + (#{$next-stop-pos} - #{$prev-stop-pos}) * #{$x1}));
492 $pos2: if($x2 == 1, $next-stop-pos, calc(#{$prev-stop-pos} + (#{$next-stop-pos} - #{$prev-stop-pos}) * #{$x2}));
493
494 @if $y == 0 {
495 $color: $prev-stop-color;
496 } @else if $y == 1 {
497 $color: $next-stop-color;
498 } @else {
499 $color: mix($next-stop-color, $prev-stop-color, $y * 100%);
500 }
501
502 $stops: append($stops, $color + ' ' + $pos1);
503 $stops: append($stops, $color + ' ' + $pos2);
504 }
505 }
506
507 @return $stops;
508}
509
510///
511/// Interpolate the positions of multiple color stops between two color stops whose positions are set.
512///
513/// @access private
514///
515@function iro-easing-gradient-interpolate-stop-positions($prev-stop, $stops, $next-stop) {
516 $prev-stop-pos: nth($prev-stop, 2);
517 $next-stop-pos: nth($next-stop, 2);
518
519 $stops-num: 0;
520 @for $i from 1 through length($stops) {
521 $stop: nth($stops, $i);
522 @if iro-easing-gradient-is-color-stop($stop) {
523 $stops-num: $stops-num + 1;
524 }
525 }
526
527 $i: 1;
528 $cur-stop-num: 1;
529
530 @if ((type-of($prev-stop-pos) == number) and (type-of($next-stop-pos) == number) and (unit($prev-stop-pos) == unit($next-stop-pos))) or ($prev-stop-pos == 0) or ($next-stop-pos == 0) {
531 //
532 // The color stop positions can be statically calculated.
533 //
534
535 $distance: $next-stop-pos - $prev-stop-pos;
536
537 @for $i from 1 through length($stops) {
538 $stop: nth($stops, $i);
539 @if iro-easing-gradient-is-color-stop($stop) {
540 $pos: $prev-stop-pos + $distance / ($stops-num + 1) * $cur-stop-num;
541 $stops: set-nth($stops, $i, $stop $pos);
542
543 $cur-stop-num: $cur-stop-num + 1;
544 }
545 }
546 } @else {
547 //
548 // The color stop positions have to be dynamically calculated with the calc() function.
549 //
550
551 @if type-of($prev-stop-pos) != number {
552 // must be calc()
553 @if (type-of($prev-stop-pos) != string) or (str-index($prev-stop-pos, 'calc(') != 1) {
554 @error 'Invalid color stop position: #{inspect($prev-stop-pos)}';
555 }
556
557 $prev-stop-pos: str-slice($prev-stop-pos, 6, str-length($prev-stop-pos) - 1);
558 }
559
560 @if type-of($next-stop-pos) != number {
561 // must be calc()
562 @if (type-of($next-stop-pos) != string) or (str-index($next-stop-pos, 'calc(') != 1) {
563 @error 'Invalid color stop position: #{inspect($next-stop-pos)}';
564 }
565
566 $next-stop-pos: str-slice($next-stop-pos, 6, str-length($next-stop-pos) - 1);
567 }
568
569 @for $i from 1 through length($stops) {
570 $stop: nth($stops, $i);
571 @if iro-easing-gradient-is-color-stop($stop) {
572 $perc: $cur-stop-num / ($stops-num + 1);
573 $pos: calc(#{$prev-stop-pos} + (#{$next-stop-pos} - #{$prev-stop-pos}) * #{$perc});
574 $stops: set-nth($stops, $i, $stop $pos);
575
576 $cur-stop-num: $cur-stop-num + 1;
577 }
578 }
579 }
580
581 @return $stops;
582}
583
584///
585/// Check if the input is a valid color stop.
586///
587/// @access private
588///
589@function iro-easing-gradient-is-color-stop($input) {
590 @return (type-of($input) == color) or iro-easing-gradient-is-positioned-color-stop($input);
591}
592
593///
594/// Check if the input is a valid positioned color stop.
595///
596/// @access private
597///
598@function iro-easing-gradient-is-positioned-color-stop($input) {
599 @return (type-of($input) == list) and (type-of(nth($input, 1)) == color);
600}
diff --git a/src/_harmony.scss b/src/_harmony.scss
new file mode 100644
index 0000000..c3c8633
--- /dev/null
+++ b/src/_harmony.scss
@@ -0,0 +1,94 @@
1////
2/// Harmony.
3///
4/// Contains functions to make a design appear more harmonic.
5///
6/// @group Harmony
7///
8/// @access public
9////
10
11///
12/// Adjust a value to a modular scale.
13///
14/// For a more sophisticated solution, check out [modularscale-sass](https://github.com/modularscale/modularscale-sass).
15///
16/// @link http://alistapart.com/article/more-meaningful-typography An article about modular scales by Tim Brown
17///
18/// @param {number} $times - Number of iterations. If positive, $base will be multiplied with $ratio. If negative, $base will be divided by $ratio.
19/// @param {number | list} $base - Single base value or, for a multi-stranded modular scale, a list of base values
20/// @param {number} $ratio - Ratio
21///
22/// @return {number}
23///
24@function iro-harmony-modular-scale($times, $base, $ratio) {
25 @if type-of($base) == number {
26 @return $base * iro-math-pow($ratio, $times);
27 }
28
29 $main-base: nth($base, 1);
30 $norm-bases: ();
31
32 @each $b in iro-list-slice($base, 2) {
33 @if $b > $main-base {
34 @while $b > $main-base {
35 $b: $b / $ratio;
36 }
37 $b: $b * $ratio;
38 } @else if $b < $main-base {
39 @while $b < $main-base {
40 $b: $b * $ratio;
41 }
42 }
43
44 $norm-bases: append($norm-bases, $b);
45 }
46
47 $all-bases: append($norm-bases, $main-base);
48 $all-bases: iro-quicksort($all-bases);
49
50 $base-index: $times % length($all-bases) + 1;
51 $exp: floor($times / length($all-bases));
52
53 @return nth($all-bases, $base-index) * iro-math-pow($ratio, $exp);
54}
55
56///
57/// Combine responsive properties with modular scales to achieve responsive modular scales.
58///
59/// @param {string | list} $props - Property or list of properties to set
60/// @param {number} $times - Number of iterations. See iro-harmony-modular-scale for more information.
61/// @param {number} $responsive-map - A map with keys = viewports and values = modular scales
62/// @param {bool} $fluid [true] - If enabled, property values will smoothly transition from one viewport to the next
63///
64/// @see {function} iro-harmony-modular-scale
65///
66/// @example scss - Responsive font sizes between 2 viewports based on modular scales
67/// $ms: (
68/// 320px: (1rem 2rem, 1.1),
69/// 640px: (1rem 2rem, 1.2)
70/// );
71///
72/// h1 {
73/// @include iro-responsive-modular-scale(font-size, 3, $ms);
74/// }
75///
76/// h2 {
77/// @include iro-responsive-modular-scale(font-size, 2, $ms);
78/// }
79///
80/// h3 {
81/// @include iro-responsive-modular-scale(font-size, 1, $ms);
82/// }
83///
84@mixin iro-responsive-modular-scale($props, $times, $responsive-map, $fluid: true) {
85 $new-map: ();
86
87 @each $key, $value in $responsive-map {
88 $new-map: map-merge($new-map, (
89 $key: iro-harmony-modular-scale($times, $value...)
90 ));
91 }
92
93 @include iro-responsive-property($props, $new-map, $fluid);
94}
diff --git a/src/_math.scss b/src/_math.scss
new file mode 100644
index 0000000..9b71bf6
--- /dev/null
+++ b/src/_math.scss
@@ -0,0 +1,62 @@
1////
2/// Basic mathematical functions.
3///
4/// @group Math functions
5///
6/// @access public
7////
8
9///
10/// Perform exponentiation. Only integer exponents are supported.
11///
12/// @param {number} $base
13/// @param {number} $exp
14///
15/// @return {number}
16///
17/// @example scss - Exponentiation with a positive exponent
18/// $result: iro-math-pow(3, 2); // The value of $result is 3^2 = 9
19///
20/// @example scss - Exponentiation with a negative exponent
21/// $result: iro-math-pow(2, -3); // The value of $result is 1/(2^3) = 1/8
22///
23@function iro-math-pow($base, $exp) {
24 $value: 1;
25
26 @if $exp > 0 {
27 @for $i from 1 through $exp {
28 $value: $value * $base;
29 }
30 } @else if $exp < 0 {
31 @for $i from 1 through -$exp {
32 $value: $value / $base;
33 }
34 }
35
36 @return $value;
37}
38
39///
40/// Clamp a number between a minimum and maximum value.
41///
42/// @param {number} $value - Value to clamp
43/// @param {number} $min - Minimum value
44/// @param {number} $max - Maximum value
45///
46/// @return {number}
47///
48/// @example scss
49/// $result: iro-math-clamp(20, 0, 10); // The value of $result is 10
50///
51/// @example scss
52/// $result: iro-math-clamp(50, 20, 100); // The value of $result is 50
53///
54@function iro-math-clamp($value, $min, $max) {
55 @if $value < $min {
56 @return $min;
57 }
58 @if $value > $max {
59 @return $max;
60 }
61 @return $value;
62}
diff --git a/src/_props.scss b/src/_props.scss
new file mode 100644
index 0000000..7377c88
--- /dev/null
+++ b/src/_props.scss
@@ -0,0 +1,281 @@
1////
2/// Property trees.
3///
4/// Property trees allow you to organize properties in a tree structure (internally nested maps).
5/// The intended use is to store all your properties at the beginning and for the rest of the
6/// stylesheet you just get them.
7///
8/// @group Property trees
9///
10/// @access public
11////
12
13///
14/// The maximum depth of resolved iro-prop-ref() references.
15///
16/// @type number
17///
18$iro-props-native-assing-max-depth: 2 !default;
19
20///
21/// Indicate if property names must start with two dashes (--).
22/// This is required if property trees are also used for native CSS custom properties.
23///
24/// @type bool
25///
26$iro-props-enforce-double-dashes: true !default;
27
28///
29/// Default tree name to use if no name is specified.
30///
31/// @type string
32///
33$iro-props-default-tree: 'default' !default;
34
35///
36/// List of all created property trees.
37///
38/// @type list
39///
40/// @access private
41///
42$iro-props-trees: ();
43
44///
45/// Save a property tree. If a tree with the sane name already exists, the trees
46/// will be merged.
47///
48/// @param {map} $map - Map containing properties
49/// @param {string} $tree [$iro-props-default-tree] - ID the map is saved as
50/// @param {bool} $merge [false] - If a tree named $tree already exists and this value is set to true, they will be merged. Otherwise an error will be emitted.
51///
52@mixin iro-props-save($map, $tree: $iro-props-default-tree, $merge: false) {
53 $noop: iro-props-save($map, $tree, $merge);
54}
55
56///
57/// Save a property tree.
58///
59/// @param {map} $map - Map containing properties
60/// @param {string} $tree [$iro-props-default-tree] - ID the map is saved as
61/// @param {bool} $merge [false] - If a tree named $tree already exists and this value is set to true, they will be merged. Otherwise an error will be emitted.
62///
63@function iro-props-save($map, $tree: $iro-props-default-tree, $merge: false) {
64 $prop-map: null;
65
66 @if $iro-props-enforce-double-dashes {
67 @if not iro-props-validate($map) {
68 @error 'Property tree keys must start with two dashes (--). If you don\'t use property trees for native CSS custom properties, set $iro-props-enforce-double-dashes to false.';
69 }
70 }
71
72 @if map-has-key($iro-props-trees, $tree) {
73 @if $merge {
74 $map: iro-map-merge-recursive(map-get($iro-props-trees, $tree), $map);
75 } @else {
76 @error 'Property tree #{inspect($tree)} does already exist.';
77 }
78 }
79
80 $iro-props-trees: map-merge($iro-props-trees, ($tree: $map)) !global;
81
82 @return null;
83}
84
85///
86/// Delete a property tree.
87///
88/// @param {string} $tree [$iro-props-default-tree] - ID of the tree to be deleted
89///
90@mixin iro-props-delete($tree: $iro-props-default-tree) {
91 $noop: iro-props-delete($tree);
92}
93
94///
95/// Unset a property tree.
96///
97/// @param {string} $tree [$iro-props-default-tree] - ID of the tree to be deleted
98///
99/// @throw If the property tree does not exist
100///
101@function iro-props-delete($tree: $iro-props-default-tree) {
102 @if not map-has-key($iro-props-trees, $tree) {
103 @error 'Property tree "#{inspect($tree)}" does not exist.';
104 }
105
106 $iro-props-trees: map-remove($iro-props-trees, $tree) !global;
107
108 @return null;
109}
110
111///
112/// Access a whole property or a subsection (i.e. value) of it.
113///
114/// @param {string | list} $key [null] - Key of the property to read. If this is a list of keys, the map will be traversed in that order.
115/// @param {string} $tree [$iro-props-default-tree] - ID of the property tree to use
116/// @param {any} $default [null] - Default value to return of no match was found. If null, this function will throw an error instead.
117///
118/// @return {any} Value assigned to property or $default
119///
120/// @throw If there was no match for $key and $default is null
121///
122@function iro-props-get($key: (), $tree: $iro-props-default-tree, $default: null) {
123 @if not map-has-key($iro-props-trees, $tree) {
124 @error 'Unknown tree "#{$tree}".';
125 }
126
127 $result: map-get($iro-props-trees, $tree);
128
129 @if type-of($key) == list {
130 $stop: false;
131
132 @each $k in $key {
133 @if map-has-key($result, $k) and not $stop {
134 $result: map-get($result, $k);
135
136 @if type-of($result) == list and nth($result, 1) == 'iro-prop-ref' {
137 @if length($result) == 2 {
138 $result: iro-props-get($tree: nth($result, 2));
139 } @else {
140 $result: iro-props-get(nth($result, 3), nth($result, 2));
141 }
142 }
143 } @else {
144 $stop: true;
145 }
146 }
147
148 @if $stop {
149 $result: null;
150 }
151 } @else {
152 $result: map-get($result, $key);
153
154 @if type-of($result) == list and nth($result, 1) == 'iro-prop-ref' {
155 @if length($result) == 2 {
156 $result: iro-props-get($tree: nth($result, 2));
157 } @else {
158 $result: iro-props-get(nth($result, 3), nth($result, 2));
159 }
160 }
161 }
162
163 @if $result == null {
164 @if $default == null {
165 @error '"#{$key}" is null.';
166 } @else {
167 @return $default;
168 }
169 }
170
171 @return $result;
172}
173
174///
175/// Generate a var() function call to get native CSS custom property.
176///
177/// @param {string | list} $key - Key of the property to read. If this is a list of keys, the map will be traversed in that order.
178/// @param {string | null} $tree [null] - Optional tree to check if the property actually exists.
179/// @param {any} $default [null] - Default value to return of no match was found.
180///
181/// @return {string} var()
182///
183@function iro-props-get-native($key, $tree: null, $default: null) {
184 @if $tree != null {
185 $noop: iro-props-get($key, $tree, $default);
186 }
187
188 $native-var: '';
189
190 @if type-of($key) == list {
191 @each $subkey in $key {
192 $native-var: $native-var + $subkey;
193 }
194 } @else {
195 $native-var: $key;
196 }
197
198 @if $default == null {
199 @return var(#{$native-var});
200 } @else {
201 @return var(#{$native-var}, #{$default});
202 }
203}
204
205///
206/// Generate assignments for native CSS custom properties with the values from the specified tree.
207///
208/// @param {string} $tree [$iro-props-default-tree] - ID of the property tree to use
209/// @param {string} $root [()] - Sub-tree to use for assignment
210///
211@mixin iro-props-assign-native($tree: $iro-props-default-tree, $root: (), $skip: ()) {
212 $map: iro-props-get($root, $tree);
213 $map: map-remove($map, $skip...);
214
215 @include iro-props-assign-native-internal($map);
216}
217
218///
219/// @access private
220///
221@mixin iro-props-assign-native-internal($map, $prefix: '', $ref-depth: $iro-props-native-assing-max-depth) {
222 @each $key, $value in $map {
223 $rd: $ref-depth;
224 @if type-of($value) == list and nth($value, 1) == 'iro-prop-ref' {
225 @if $ref-depth != 0 {
226 $rd: $rd - 1;
227 @if length($value) == 2 {
228 $value: iro-props-get($tree: nth($value, 2));
229 } @else {
230 $value: iro-props-get(nth($value, 3), nth($value, 2));
231 }
232 } @else {
233 $value: null;
234 }
235 }
236 @if type-of($value) != map {
237 #{$prefix + $key}: #{$value};
238 } @else {
239 @include iro-props-assign-native-internal($value, $prefix + $key, $rd);
240 }
241 }
242}
243
244///
245/// Validate property names.
246///
247/// @access private
248///
249@function iro-props-validate($map) {
250 @each $key, $value in $map {
251 @if str-index($key, '--') != 1 {
252 @return false;
253 }
254
255 @if type-of($value) == map {
256 @if not iro-props-validate($value) {
257 @return false;
258 }
259 }
260 }
261
262 @return true;
263}
264
265///
266/// Generate a reference to another tree. Dereferencing is lazy, so you may specify a tree that hasn't been created yet.
267///
268/// @param {string} $tree [$iro-props-default-tree] - ID of the property tree to use
269/// @param {string | list} $key - Key of the property to read. If this is a list of keys, the map will be traversed in that order.
270///
271/// @return {list} A special list that let's Ignis know that this is a lazy value.
272///
273/// @throw If there was no match for $key and $default is null
274///
275@function iro-props-ref($tree: $iro-props-default-tree, $key: null) {
276 @if $key == null {
277 @return ('iro-prop-ref' $tree);
278 } @else {
279 @return ('iro-prop-ref' $tree $key);
280 }
281}
diff --git a/src/_responsive.scss b/src/_responsive.scss
new file mode 100644
index 0000000..6f2a416
--- /dev/null
+++ b/src/_responsive.scss
@@ -0,0 +1,406 @@
1////
2/// responsive properties.
3///
4/// The mixins and functions in this file allow you to scale any px- or rem-based value depending on
5/// the available viewport width. One popular use case is the dynamic scaling of fonts.
6///
7/// The code in this file is based on an article by Niklas Postulart:
8/// http://niklaspostulart.de/2015/10/sass-responsive-type-mixin
9///
10/// The following adjustments were made:
11/// - Support any property passed by the user, not just font-size
12/// - Allow multiple target viewports / values
13/// - Provide a variant of the mixin which integrates include-media for media queries
14///
15/// @group Responsive
16///
17/// @access public
18////
19
20///
21/// If true, named viewports will be supported if a compatible $breakpoints map exists.
22/// This is the case for [include-media](https://include-media.com/), for example.
23///
24/// @type bool
25///
26$iro-responsive-support-named-viewports: true !default;
27
28///
29/// Context ID used for responsive environment-related mixins.
30///
31/// @type string
32///
33$iro-responsive-context-id: 'responsive' !default;
34
35///
36/// Scale a property uniformly between a specific set of target viewports / values.
37///
38/// @param {string | list} $props - Property or list of properties to set
39/// @param {number} $responsive-map - A map with keys = viewports and values = target value
40/// @param {bool} $fluid [true] - If enabled, property values will smoothly transition from one viewport to the next
41/// @param {bool} $vertical [false] - If enabled, property viewport height will be used instead of viewport width
42///
43/// @example scss - Responsive font-size between 2 viewports
44/// .something {
45/// @include iro-responsive-property(font-size, ( 320px: 20px, 720px: 30px ));
46/// }
47///
48/// // Generates:
49///
50/// @media (min-width: 320px) and (max-width: 720px) {
51/// .something {
52/// font-size: calc(20px + 10 * ((100vw - 20px) / 400));
53/// }
54/// }
55///
56/// @media (max-width: 320px) {
57/// .something {
58/// font-size: 20px;
59/// }
60/// }
61///
62/// @media (min-width: 720px) {
63/// .something {
64/// font-size: 30px;
65/// }
66/// }
67///
68/// @example scss - Responsive font-size between 3 viewports
69/// .something {
70/// @include iro-responsive-property(font-size, ( 320px: 20px, 720px: 30px, 1280px: 40px ));
71/// }
72///
73/// // Generates:
74///
75/// @media (min-width: 320px) and (max-width: 720px) {
76/// .something {
77/// font-size: calc(20px + 10 * ((100vw - 20px) / 400));
78/// }
79/// }
80///
81/// @media (min-width: 720px) and (max-width: 1280px) {
82/// .something {
83/// font-size: calc(30px + 10 * ((100vw - 30px) / 400));
84/// }
85/// }
86///
87/// @media (max-width: 320px) {
88/// .something {
89/// font-size: 20px;
90/// }
91/// }
92///
93/// @media (min-width: 720px) {
94/// .something {
95/// font-size: 30px;
96/// }
97/// }
98///
99@mixin iro-responsive-property($props, $responsive-map, $fluid: true, $vertical: false) {
100 @include iro-responsive-env(map-keys($responsive-map), $fluid, $vertical) {
101 @if type-of($props) == list {
102 @each $prop in $props {
103 #{$prop}: iro-responsive-set(map-values($responsive-map));
104 }
105 } @else {
106 #{$props}: iro-responsive-set(map-values($responsive-map));
107 }
108 }
109}
110
111///
112/// Create a new responsive environment by specifying a set of viewports.
113/// Inside a responsive environment, use the iro-responsive-set function to make a property scale automatically.
114///
115/// @param {list} $viewports - Viewports sorted in ascending order
116/// @param {bool} $fluid [true] - If enabled, property values will smoothly transition from one viewport to the next
117/// @param {bool} $vertical [false] - If enabled, property viewport height will be used instead of viewport width
118///
119/// @content
120///
121/// @see {function} iro-responsive-set
122///
123/// @example scss - Responsive font-size between 2 viewports
124/// .something {
125/// @include iro-responsive-env((320px, 720px)) {
126/// font-size: iro-responsive-set(20px, 30px);
127/// }
128/// }
129///
130/// // Generates:
131///
132/// @media (min-width: 320px) and (max-width: 720px) {
133/// .something {
134/// font-size: calc(20px + 10 * ((100vw - 20px) / 400));
135/// }
136/// }
137///
138/// @media (max-width: 320px) {
139/// .something {
140/// font-size: 20px;
141/// }
142/// }
143///
144/// @media (min-width: 720px) {
145/// .something {
146/// font-size: 30px;
147/// }
148/// }
149///
150@mixin iro-responsive-env($viewports, $fluid: true, $vertical: false) {
151 @if length($viewports) <= 1 {
152 @error '$viewports must contain at least two viewports.';
153 }
154
155 $new-viewports: ();
156
157 @each $viewport in $viewports {
158 @if $iro-responsive-support-named-viewports and global-variable-exists(breakpoints) {
159 @if map-has-key($breakpoints, $viewport) {
160 $viewport: map-get($breakpoints, $viewport);
161 }
162 }
163
164 @if (type-of($viewport) != number) or unitless($viewport) {
165 @error '$viewports contains invalid viewports.';
166 }
167
168 $new-viewports: append($new-viewports, $viewport);
169 }
170
171 $viewports: iro-quicksort($new-viewports);
172
173 @if $new-viewports != $viewports {
174 @error '$viewports was not sorted in ascending order.';
175 }
176
177 @if $fluid {
178 $first-vp: nth($viewports, 1);
179 $last-vp: nth($viewports, length($viewports));
180
181 @include iro-context-push($iro-responsive-context-id, 'env', (
182 'viewports': $viewports,
183 'mode': set,
184 'index': 1,
185 'fluid': $fluid,
186 'vertical': $vertical,
187 ));
188
189 @content;
190
191 @include iro-context-pop($iro-responsive-context-id);
192
193 @for $i from 1 to length($viewports) {
194 $prev-vp: nth($viewports, $i);
195 $next-vp: nth($viewports, $i + 1);
196
197 @if not $vertical {
198 @media (min-width: $prev-vp) and (max-width: $next-vp) {
199 @include iro-context-push($iro-responsive-context-id, 'env', (
200 'viewports': $viewports,
201 'mode': transition,
202 'index': $i,
203 'fluid': $fluid,
204 'vertical': $vertical,
205 ));
206
207 @content;
208
209 @include iro-context-pop($iro-responsive-context-id);
210 }
211 } @else {
212 @media (min-height: $prev-vp) and (max-height: $next-vp) {
213 @include iro-context-push($iro-responsive-context-id, 'env', (
214 'viewports': $viewports,
215 'mode': transition,
216 'index': $i,
217 'fluid': $fluid,
218 'vertical': $vertical,
219 ));
220
221 @content;
222
223 @include iro-context-pop($iro-responsive-context-id);
224 }
225 }
226 }
227
228 @if not $vertical {
229 @media (min-width: $last-vp) {
230 @include iro-context-push($iro-responsive-context-id, 'env', (
231 'viewports': $viewports,
232 'mode': set,
233 'index': length($viewports),
234 'fluid': $fluid,
235 'vertical': $vertical,
236 ));
237
238 @content;
239
240 @include iro-context-pop($iro-responsive-context-id);
241 }
242 } @else {
243 @media (min-height: $last-vp) {
244 @include iro-context-push($iro-responsive-context-id, 'env', (
245 'viewports': $viewports,
246 'mode': set,
247 'index': length($viewports),
248 'fluid': $fluid,
249 'vertical': $vertical,
250 ));
251
252 @content;
253
254 @include iro-context-pop($iro-responsive-context-id);
255 }
256 }
257 } @else {
258 @include iro-context-push($iro-responsive-context-id, 'env', (
259 'viewports': $viewports,
260 'mode': set,
261 'index': 1,
262 'fluid': $fluid,
263 'vertical': $vertical,
264 ));
265
266 @content;
267
268 @include iro-context-pop($iro-responsive-context-id);
269
270 @for $i from 2 through length($viewports) {
271 $vp: nth($viewports, $i);
272
273 @if not $vertical {
274 @media (min-width: $vp) {
275 @include iro-context-push($iro-responsive-context-id, 'env', (
276 'viewports': $viewports,
277 'mode': set,
278 'index': $i
279 ));
280
281 @content;
282
283 @include iro-context-pop($iro-responsive-context-id);
284 }
285 } @else {
286 @media (min-height: $vp) {
287 @include iro-context-push($iro-responsive-context-id, 'env', (
288 'viewports': $viewports,
289 'mode': set,
290 'index': $i
291 ));
292
293 @content;
294
295 @include iro-context-pop($iro-responsive-context-id);
296 }
297 }
298 }
299 }
300}
301
302///
303/// Make a property scale automatically inside a responsive environment.
304///
305/// @param {list} $values - Value for each viewport in the responsive environment. The first value will be used for the first viewport, the second value for the second viewport, and so on.
306///
307/// @return {number|string}
308///
309@function iro-responsive-set($values, $without-calc: false) {
310 $noop: iro-context-assert-stack-must-contain($iro-responsive-context-id, 'env');
311
312 $data: nth(iro-context-get($iro-responsive-context-id, 'env'), 2);
313 $viewports: map-get($data, 'viewports');
314 $mode: map-get($data, 'mode');
315 $fluid: map-get($data, 'fluid');
316 $vertical: map-get($data, 'vertical');
317
318 @if length($values) != length($viewports) {
319 @error '$values must contain the same number of items as the responsive environment\'s $viewports.';
320 }
321
322 @if $mode == set {
323 @return nth($values, map-get($data, 'index'));
324 } @else {
325 $index: map-get($data, 'index');
326 $prev-vp: nth($viewports, $index);
327 $next-vp: nth($viewports, $index + 1);
328 $prev-value: nth($values, $index);
329 $next-value: nth($values, $index + 1);
330
331 @return iro-responsive-fluid-calc($prev-value, $next-value, $prev-vp, $next-vp, $vertical, $without-calc);
332 }
333}
334
335///
336/// Generate the calc() function that uniformly scales a value from $min-value to $max-value depending
337/// on the viewport width.
338///
339/// @param {number} $min-value - Minimum value
340/// @param {number} $max-value - Maximum value
341/// @param {number} $min-viewport - Minimum viewport size
342/// @param {number} $max-viewport - Maximum viewport size
343/// @param {bool} $vertical [false] - If enabled, property viewport height will be used instead of viewport width
344///
345/// @access private
346///
347@function iro-responsive-fluid-calc($min-value, $max-value, $min-viewport, $max-viewport, $vertical: false, $without-calc: false) {
348 $value-unit: unit($min-value);
349 $max-value-unit: unit($max-value);
350 $viewport-unit: unit($min-viewport);
351 $max-viewport-unit: unit($max-viewport);
352
353 @if $min-value == 0 {
354 $value-unit: $max-value-unit;
355 }
356 @if $max-value == 0 {
357 $max-value-unit: $value-unit;
358 }
359 @if $min-viewport == 0 {
360 $viewport-unit: $max-viewport-unit;
361 }
362 @if $max-viewport == 0 {
363 $max-viewport-unit: $viewport-unit;
364 }
365
366 @if ($value-unit != $max-value-unit) or ($viewport-unit != $max-viewport-unit) {
367 @error 'Units of $min-value and $max-value, $min-viewport and $max-viewport must match.';
368 }
369
370 @if ($value-unit == rem) and ($viewport-unit == px) {
371 $min-viewport: iro-px-to-rem($min-viewport);
372 $max-viewport: iro-px-to-rem($max-viewport);
373 $viewport-unit: rem;
374 } @else if ($value-unit == px) and ($viewport-unit == rem) {
375 $min-value: iro-px-to-rem($min-value);
376 $max-value: iro-px-to-rem($max-value);
377 $value-unit: rem;
378 }
379
380 @if $value-unit != $viewport-unit {
381 @error 'This combination of units is not supported.';
382 }
383
384 $value-diff: iro-strip-unit($max-value - $min-value);
385 $viewport-diff: iro-strip-unit($max-viewport - $min-viewport);
386
387 $calc: '';
388
389 @if $min-value != 0 {
390 $calc: '#{$min-value} + ';
391 }
392
393 @if not $vertical {
394 $calc: unquote('#{$calc}#{$value-diff} * ((100vw - #{$min-viewport}) / #{$viewport-diff})');
395 } @else {
396 $calc: unquote('#{$calc}#{$value-diff} * ((100vh - #{$min-viewport}) / #{$viewport-diff})');
397 }
398
399 @if $without-calc {
400 @return $calc;
401 } @else {
402 @return calc(#{$calc});
403 }
404}
405
406@include iro-context-stack-create($iro-responsive-context-id);
diff --git a/src/_vars.scss b/src/_vars.scss
new file mode 100644
index 0000000..ce6efda
--- /dev/null
+++ b/src/_vars.scss
@@ -0,0 +1,16 @@
1////
2/// Variables.
3///
4/// Global variables that are used throughout the framework.
5///
6/// @group Global variables
7///
8/// @access public
9////
10
11///
12/// Reference root font size in px that is used for px -> rem conversions.
13///
14/// @type number
15///
16$iro-root-size: 16px !default;
diff --git a/src/bem-shortcodes.scss b/src/bem-shortcodes.scss
new file mode 100644
index 0000000..11abeed
--- /dev/null
+++ b/src/bem-shortcodes.scss
@@ -0,0 +1,349 @@
1////
2/// Shorter version of the bem-related mixins. Useful to reduce clutter.
3///
4/// @group BEM shortcodes
5///
6/// @access public
7////
8
9///
10/// @alias iro-bem-block
11///
12@mixin block($name, $type: null) {
13 @include iro-bem-block($name, $type: null) {
14 @content;
15 }
16}
17
18///
19/// @alias block
20///
21@mixin b($name, $type: null) {
22 @include block($name, $type: null) {
23 @content;
24 }
25}
26
27///
28/// @alias iro-bem-object
29///
30@mixin object($name) {
31 @include iro-bem-object($name) {
32 @content;
33 }
34}
35
36///
37/// @alias object
38///
39@mixin ob($name) {
40 @include object($name) {
41 @content;
42 }
43}
44
45///
46/// @alias iro-bem-component
47///
48@mixin component($name) {
49 @include iro-bem-component($name) {
50 @content;
51 }
52}
53
54///
55/// @alias component
56///
57@mixin cb($name) {
58 @include component($name) {
59 @content;
60 }
61}
62
63///
64/// @alias iro-bem-layout
65///
66@mixin layout($name) {
67 @include iro-bem-layout($name) {
68 @content;
69 }
70}
71
72///
73/// @alias layout
74///
75@mixin lb($name) {
76 @include layout($name) {
77 @content;
78 }
79}
80
81///
82/// @alias iro-bem-utility
83///
84@mixin utility($name) {
85 @include iro-bem-utility($name) {
86 @content;
87 }
88}
89
90///
91/// @alias utility
92///
93@mixin ub($name) {
94 @include utility($name) {
95 @content;
96 }
97}
98
99///
100/// @alias iro-bem-scope
101///
102@mixin scope($name) {
103 @include iro-bem-scope($name) {
104 @content;
105 }
106}
107
108///
109/// @alias scope
110///
111@mixin sb($name) {
112 @include scope($name) {
113 @content;
114 }
115}
116
117///
118/// @alias iro-bem-theme
119///
120@mixin theme($name) {
121 @include iro-bem-theme($name) {
122 @content;
123 }
124}
125
126///
127/// @alias theme
128///
129@mixin tb($name) {
130 @include theme($name) {
131 @content;
132 }
133}
134
135///
136/// @alias iro-bem-js
137///
138@mixin js($name) {
139 @include iro-bem-js($name) {
140 @content;
141 }
142}
143
144///
145/// @alias iro-bem-qa
146///
147@mixin qa($name) {
148 @include iro-bem-qa($name) {
149 @content;
150 }
151}
152
153///
154/// @alias iro-bem-hack
155///
156@mixin hack($name) {
157 @include iro-bem-hack($name) {
158 @content;
159 }
160}
161
162///
163/// @alias iro-bem-composed-of
164///
165@mixin composed-of($block, $blocks...) {
166 @include iro-bem-composed-of($block, $blocks...) {
167 @content;
168 }
169}
170
171///
172/// @alias composed-of
173///
174@mixin co($block, $blocks...) {
175 @include composed-of($block, $blocks...) {
176 @content;
177 }
178}
179
180///
181/// @alias iro-bem-element
182///
183@mixin element($name, $names...) {
184 @include iro-bem-element($name, $names...) {
185 @content;
186 }
187}
188
189///
190/// @alias element
191///
192@mixin e($name, $names...) {
193 @include element($name, $names...) {
194 @content;
195 }
196}
197
198///
199/// @alias iro-bem-related-element
200///
201@mixin related-element($sign, $name, $names...) {
202 @include iro-bem-related-element($sign, $name, $names...) {
203 @content;
204 }
205}
206
207///
208/// @alias related-element
209///
210@mixin re($sign, $name, $names...) {
211 @include related-element($sign, $name, $names...) {
212 @content;
213 }
214}
215
216///
217/// @alias iro-bem-sibling-element
218///
219@mixin sibling-element($name, $names...) {
220 @include iro-bem-sibling-element($name, $names...) {
221 @content;
222 }
223}
224
225///
226/// @alias sibling-element
227///
228@mixin se($name, $names...) {
229 @include sibling-element($name, $names...) {
230 @content;
231 }
232}
233
234///
235/// @alias iro-bem-next-element
236///
237@mixin next-element($name, $names...) {
238 @include iro-bem-next-element($name, $names...) {
239 @content;
240 }
241}
242
243///
244/// @alias next-element
245///
246@mixin ne($name, $names...) {
247 @include next-element($name, $names...) {
248 @content;
249 }
250}
251
252///
253/// @alias iro-bem-next-twin-element
254///
255@mixin next-twin-element {
256 @include iro-bem-next-twin-element {
257 @content;
258 }
259}
260
261///
262/// @alias next-twin-element
263///
264@mixin te {
265 @include next-twin-element {
266 @content;
267 }
268}
269
270///
271/// @alias iro-bem-modifier
272///
273@mixin modifier($name, $names...) {
274 @include iro-bem-modifier($name, $names...) {
275 @content;
276 }
277}
278
279///
280/// @alias modifier
281///
282@mixin m($name, $names...) {
283 @include modifier($name, $names...) {
284 @content;
285 }
286}
287
288///
289/// @alias iro-bem-suffix
290///
291@mixin suffix($name) {
292 @include iro-bem-suffix($name) {
293 @content;
294 }
295}
296
297///
298/// @alias suffix
299///
300@mixin s($name) {
301 @include suffix($name) {
302 @content;
303 }
304}
305
306///
307/// @alias iro-bem-is
308///
309@mixin is($state, $states...) {
310 @include iro-bem-is($state, $states...) {
311 @content;
312 }
313}
314
315///
316/// @alias iro-bem-has
317///
318@mixin has($state, $states...) {
319 @include iro-bem-has($state, $states...) {
320 @content;
321 }
322}
323
324///
325/// @alias iro-bem-at-theme
326///
327@mixin at-theme($name, $names...) {
328 @include iro-bem-at-theme($name, $names...) {
329 @content;
330 }
331}
332
333///
334/// @alias theme
335///
336@mixin at($name, $names...) {
337 @include at-theme($name, $names...) {
338 @content;
339 }
340}
341
342///
343/// @alias iro-bem-multi
344///
345@mixin multi($first, $others...) {
346 @include iro-bem-multi($first, $others...) {
347 @content;
348 }
349}
diff --git a/src/bem/_block.scss b/src/bem/_block.scss
new file mode 100644
index 0000000..d065891
--- /dev/null
+++ b/src/bem/_block.scss
@@ -0,0 +1,392 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Generate a new block.
9///
10/// This mixin simply creates a new block with the name {namespace}_{name},
11/// where {namespace} is the prefix assigned to $type and {name} is the
12/// block's name.
13///
14/// @param {string} $name - Block name
15/// @param {string} $type [null] - BEMIT namespace of the block
16///
17/// @content
18///
19/// @throw If $type is invalid
20/// @throw If the block is preceded by another block, element, modifier or suffix
21///
22/// @example scss - Creating a new block
23/// @include iro-bem-block('something', 'component') {
24/// /* some definitions */
25/// }
26///
27/// // Generates:
28///
29/// .c-something {
30/// /* some definitions */
31/// }
32///
33@mixin iro-bem-block($name, $type: null) {
34 $result: iro-bem-block($name, $type);
35 $selector: nth($result, 1);
36 $context: nth($result, 2);
37
38 @include iro-bem-validate(
39 'block',
40 (name: $name, type: $type),
41 $selector,
42 $context
43 );
44
45 @if $type != null {
46 $iro-bem-blocks: append($iro-bem-blocks, $name + '_' + $type) !global;
47 } @else {
48 $iro-bem-blocks: append($iro-bem-blocks, $name) !global;
49 }
50
51 @include iro-context-push($iro-bem-context-id, $context...);
52 @at-root #{$selector} {
53 @content;
54 }
55 @include iro-context-pop($iro-bem-context-id);
56}
57
58///
59/// Generate a new block. Check the respective mixin documentation for more information.
60///
61/// @return {list} A list with two items: 1. selector, 2. context or `null`
62///
63/// @see {mixin} iro-bem-block
64///
65@function iro-bem-block($name, $type: null) {
66 //
67 // Possible outcomes:
68 // - ({b,e,m,s}) block
69 //
70
71 $noop: iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth);
72
73 $selector: null;
74 $base-selector: null;
75
76 @if $type != null {
77 $namespace: map-get($iro-bem-namespaces, $type);
78
79 @if not $namespace {
80 @error '"#{$type}" is not a valid type.';
81 }
82
83 $base-selector: selector-parse('.' + $namespace + '-' + $name);
84
85 @if $type != 'theme' or & {
86 $selector: $base-selector;
87 } @else if not & {
88 $selector: iro-bem-theme-selector($name);
89 }
90 } @else {
91 $base-selector: selector-parse('.' + $name);
92 $selector: $base-selector;
93 }
94
95 @if & {
96 $selector: selector-nest(&, $selector);
97 }
98
99 $context: 'block', (
100 'name': $name,
101 'type': $type,
102 'selector': $selector,
103 'base-selector': $base-selector
104 );
105
106 @return $selector $context;
107}
108
109///
110/// Generate a new object block. It's a shorthand for iro-bem-block($name, 'object').
111///
112/// @param {string} $name - Object block name
113///
114/// @content
115///
116@mixin iro-bem-object($name) {
117 @include iro-bem-block($name, 'object') {
118 @content;
119 }
120}
121
122///
123/// Generate a new object block. Check the respective mixin documentation for more information.
124///
125/// @return {list} A list with two items: 1. selector, 2. context or `null`
126///
127/// @see {mixin} iro-bem-object
128///
129@function iro-bem-object($name) {
130 @return iro-bem-block($name, 'object');
131}
132
133///
134/// Generate a new component block. It's a shorthand for iro-bem-block($name, 'component').
135///
136/// @param {string} $name - Component block name
137///
138/// @content
139///
140@mixin iro-bem-component($name) {
141 @include iro-bem-block($name, 'component') {
142 @content;
143 }
144}
145
146///
147/// Generate a new component block. Check the respective mixin documentation for more information.
148///
149/// @return {list} A list with two items: 1. selector, 2. context or `null`
150///
151/// @see {mixin} iro-bem-component
152///
153@function iro-bem-component($name) {
154 @return iro-bem-block($name, 'component');
155}
156
157///
158/// Generate a new layout block. It's a shorthand for iro-bem-block($name, 'layout').
159///
160/// @param {string} $name - Layout block name
161///
162/// @content
163///
164@mixin iro-bem-layout($name) {
165 @include iro-bem-block($name, 'layout') {
166 @content;
167 }
168}
169
170///
171/// Generate a new layout block. Check the respective mixin documentation for more information.
172///
173/// @return {list} A list with two items: 1. selector, 2. context or `null`
174///
175/// @see {mixin} iro-bem-layout
176///
177@function iro-bem-layout($name) {
178 @return iro-bem-block($name, 'layout');
179}
180
181///
182/// Generate a new utility block. It's a shorthand for iro-bem-block($name, 'utility').
183///
184/// @param {string} $name - Utility block name
185///
186/// @content
187///
188@mixin iro-bem-utility($name) {
189 @include iro-bem-block($name, 'utility') {
190 @content;
191 }
192}
193
194///
195/// Generate a new utility block. Check the respective mixin documentation for more information.
196///
197/// @return {list} A list with two items: 1. selector, 2. context or `null`
198///
199/// @see {mixin} iro-bem-utility
200///
201@function iro-bem-utility($name) {
202 @return iro-bem-block($name, 'utility');
203}
204
205///
206/// Generate a new scope block. It's a shorthand for iro-bem-block($name, 'scope').
207///
208/// @param {string} $name - Scope block name
209///
210/// @content
211///
212@mixin iro-bem-scope($name) {
213 @include iro-bem-block($name, 'scope') {
214 @content;
215 }
216}
217
218///
219/// Generate a new scope block. Check the respective mixin documentation for more information.
220///
221/// @return {list} A list with two items: 1. selector, 2. context or `null`
222///
223/// @see {mixin} iro-bem-scope
224///
225@function iro-bem-scope($name) {
226 @return iro-bem-block($name, 'scope');
227}
228
229///
230/// Generate a new theme block. It's a shorthand for iro-bem-block($name, 'theme').
231///
232/// @param {string} $name - Theme block name
233///
234/// @content
235///
236@mixin iro-bem-theme($name) {
237 @include iro-bem-block($name, 'theme') {
238 @content;
239 }
240}
241
242///
243/// Generate a new theme block. Check the respective mixin documentation for more information.
244///
245/// @return {list} A list with two items: 1. selector, 2. context or `null`
246///
247/// @see {mixin} iro-bem-theme
248///
249@function iro-bem-theme($name) {
250 @return iro-bem-block($name, 'theme');
251}
252
253///
254/// Generate a new JS block. It's a shorthand for iro-bem-block($name, 'js').
255///
256/// @param {string} $name - JS block name
257///
258/// @content
259///
260@mixin iro-bem-js($name) {
261 @include iro-bem-block($name, 'js') {
262 @content;
263 }
264}
265
266///
267/// Generate a new JS block. Check the respective mixin documentation for more information.
268///
269/// @return {list} A list with two items: 1. selector, 2. context or `null`
270///
271/// @see {mixin} iro-bem-js
272///
273@function iro-bem-js($name) {
274 @return iro-bem-block($name, 'js');
275}
276
277///
278/// Generate a new QA block. It's a shorthand for iro-bem-block($name, 'qa').
279///
280/// @param {string} $name - QA block name
281///
282/// @content
283///
284@mixin iro-bem-qa($name) {
285 @include iro-bem-block($name, 'qa') {
286 @content;
287 }
288}
289
290///
291/// Generate a new QA block. Check the respective mixin documentation for more information.
292///
293/// @return {list} A list with two items: 1. selector, 2. context or `null`
294///
295/// @see {mixin} iro-bem-qa
296///
297@function iro-bem-qa($name) {
298 @return iro-bem-block($name, 'qa');
299}
300
301///
302/// Generate a new hack block. It's a shorthand for iro-bem-block($name, 'hack').
303///
304/// @param {string} $name - Hack block name
305///
306/// @content
307///
308@mixin iro-bem-hack($name) {
309 @include iro-bem-block($name, 'hack') {
310 @content;
311 }
312}
313
314///
315/// Generate a new hack block. Check the respective mixin documentation for more information.
316///
317/// @return {list} A list with two items: 1. selector, 2. context or `null`
318///
319/// @see {mixin} iro-bem-hack
320///
321@function iro-bem-hack($name) {
322 @return iro-bem-block($name, 'hack');
323}
324
325///
326/// Assert that a block or element is composed of another block. In BEM, such a relationship is referred to
327/// as a "mix": https://en.bem.info/methodology/key-concepts/#mix
328///
329/// Compilation will fail if the foreign block doesn't exist. This way, you can ensure that blocks are
330/// defined in the right order so that composed blocks/elements will actually override the foreign
331/// declarations without having to artificially increase the specificity.
332///
333/// @param {string | list} $block - Either first block name, or list with two items: 1. block name, 2. block type
334/// @param {string | list} $blocks - Either other block names, or list with two items: 1. block name, 2. block type
335///
336/// @throw If a block type is invalid
337/// @throw If a block doesn't exist
338///
339/// @example scss - Successful assertion
340/// @include iro-bem-component('someBlock') {
341/// /* some definitions */
342/// }
343///
344/// @include iro-bem-component('anotherBlock') {
345/// /* some definitions */
346///
347/// @include iro-bem-element('elem') {
348/// @include iro-bem-composed-of('someBlock' 'component');
349///
350/// /* some definitions */
351/// }
352/// }
353///
354/// // Intended use: <div class="c-anotherBlock__elem c-someBlock">...</div>
355///
356/// @example scss - Failing assertion
357/// @include iro-bem-component('anotherBlock') {
358/// /* some definitions */
359///
360/// @include iro-bem-element('elem') {
361/// @include iro-bem-composed-of('someBlock' 'component');
362///
363/// /* some definitions */
364/// }
365/// }
366///
367/// @include iro-bem-component('someBlock') {
368/// /* some definitions */
369/// }
370///
371/// // Compilation will fail because c-someBlock is defined after c-anotherBlock__elem
372///
373@mixin iro-bem-composed-of($block, $blocks...) {
374 @each $block in iro-list-prepend($blocks, $block) {
375 @if type-of($block) == string {
376 @if not index($iro-bem-blocks, $block) {
377 @error 'Block "#{$block}" does not exist.';
378 }
379 } @else {
380 $name: nth($block, 1);
381 $type: nth($block, 2);
382
383 @if not map-get($iro-bem-namespaces, $type) {
384 @error '"#{$type}" is not a valid type.';
385 }
386
387 @if not index($iro-bem-blocks, $name + '_' + $type) {
388 @error 'Block "#{$name}" does not exist.';
389 }
390 }
391 }
392}
diff --git a/src/bem/_debug.scss b/src/bem/_debug.scss
new file mode 100644
index 0000000..e69083c
--- /dev/null
+++ b/src/bem/_debug.scss
@@ -0,0 +1,16 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7@if $iro-bem-debug {
8 @each $type, $color in $iro-bem-debug-colors {
9 $namespace: map-get($iro-bem-namespaces, $type);
10
11 [class^='#{$namespace}-'],
12 [class*=' #{$namespace}-'] {
13 outline: 5px solid $color;
14 }
15 }
16}
diff --git a/src/bem/_element.scss b/src/bem/_element.scss
new file mode 100644
index 0000000..b3d2fee
--- /dev/null
+++ b/src/bem/_element.scss
@@ -0,0 +1,622 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Generate a new BEM element.
9///
10/// The element will be generated according to the BEM naming convention.
11/// If the parent selector doesn't match the block selector, the element will be
12/// nested inside the parent selector. This means, you may nest elements inside
13/// other elements, modifiers or any kind of selector such as &:hover.
14///
15/// @param {string} $name - First element name
16/// @param {string} $names - More element names
17///
18/// @content
19///
20/// @throw If the element is not preceded by a block, element, modifier or suffix.
21///
22/// @example scss - Element for a block
23/// @include iro-bem-component('block') {
24/// /* some block definitions */
25///
26/// @include iro-bem-element('elem') {
27/// /* some element definitions */
28/// }
29/// }
30///
31/// // Generates:
32///
33/// .c-block {
34/// /* some block definitions */
35/// }
36///
37/// .c-block__elem {
38/// /* some element definitions */
39/// }
40///
41/// @example scss - Element that is affected by the user hovering the block
42/// @include iro-bem-component('block') {
43/// /* some block definitions */
44///
45/// @include iro-bem-element('elem') {
46/// background-color: #eee;
47/// }
48///
49/// &:hover {
50/// @include iro-bem-element('elem') {
51/// background-color: #000;
52/// }
53/// }
54/// }
55///
56/// // Generates:
57///
58/// .c-block {
59/// /* some block definitions */
60/// }
61///
62/// .c-block__elem {
63/// background-color: #eee;
64/// }
65///
66/// .c-block:hover .c-block__elem {
67/// background-color: #000;
68/// }
69///
70/// @example scss - Multiple elements
71/// @include iro-bem-component('block') {
72/// /* some block definitions */
73///
74/// @include iro-bem-element('elem1', 'elem2') {
75/// /* some element definitions */
76/// }
77/// }
78///
79/// // Generates:
80///
81/// .c-block {
82/// /* some block definitions */
83/// }
84///
85/// .c-block__elem1, .c-block__elem2 {
86/// /* some element definitions */
87/// }
88///
89@mixin iro-bem-element($name, $names...) {
90 $result: iro-bem-element($name, $names...);
91 $selector: nth($result, 1);
92 $context: nth($result, 2);
93
94 @include iro-bem-validate(
95 'element',
96 (name: $name, names: $names),
97 $selector,
98 $context
99 );
100
101 @include iro-context-push($iro-bem-context-id, $context...);
102 @at-root #{$selector} {
103 @content;
104 }
105 @include iro-context-pop($iro-bem-context-id);
106}
107
108///
109/// Generate a new BEM element. Check the respective mixin documentation for more information.
110///
111/// @return {list} A list with two items: 1. selector, 2. context or `null`
112///
113/// @see {mixin} iro-bem-element
114///
115@function iro-bem-element($name, $names...) {
116 $noop: iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth);
117 $noop: iro-context-assert-stack-must-contain($iro-bem-context-id, 'block');
118
119 $parent-context: iro-context-get($iro-bem-context-id, 'block' 'element');
120
121 $selector: ();
122 $parts-data: ();
123
124 @if nth($parent-context, 1) == 'element' {
125 @if $iro-bem-element-nesting-policy == 'disallow' {
126 @error 'Element nesting is forbidden.';
127 }
128
129 @if $iro-bem-element-nesting-policy == 'append' {
130 $element-selector: map-get(nth($parent-context, 2), 'selector');
131
132 @if not iro-selector-suffix-match(&, $element-selector) {
133 @error 'A nested element must be an immediate children of the parent element.';
134 }
135
136 //
137 // Possible outcomes:
138 // - {e}__element
139 // - [manual selector] {e}__element
140 //
141
142 @each $name in join($name, $names) {
143 $sel: selector-append(&, $iro-bem-element-separator + $name);
144 $selector: join($selector, $sel, comma);
145 $parts-data: append($parts-data, (
146 'name': $name,
147 'selector': $sel
148 ));
149 }
150 }
151
152 $parent-context: iro-context-get($iro-bem-context-id, 'block');
153 }
154
155 @if length($selector) == 0 {
156 $parent-selector: map-get(nth($parent-context, 2), 'selector');
157
158 @if iro-selector-suffix-match(&, $parent-selector) {
159 //
160 // Possible outcomes:
161 // - {b}__element
162 // - [manual selector] {b}__element
163 //
164
165 @each $name in join($name, $names) {
166 $sel: selector-append(&, $iro-bem-element-separator + $name);
167 $selector: join($selector, $sel, comma);
168 $parts-data: append($parts-data, (
169 'name': $name,
170 'selector': $sel
171 ));
172 }
173 } @else {
174 //
175 // Possible outcomes:
176 // - {b} [manual selector] {b}__element
177 // - {e,m,s} ([manual selector]) {b}__element
178 //
179
180 @if nth($parent-context, 1) != 'block' {
181 $parent-context: iro-context-get($iro-bem-context-id, 'block');
182 }
183
184 $block-base-selector: map-get(nth($parent-context, 2), 'base-selector');
185
186 @each $name in join($name, $names) {
187 $sel: selector-nest(&, selector-append($block-base-selector, $iro-bem-element-separator + $name));
188 $selector: join($selector, $sel, comma);
189 $parts-data: append($parts-data, (
190 'name': $name,
191 'selector': $sel
192 ));
193 }
194 }
195 }
196
197 $context: 'element', (
198 'parts': $parts-data,
199 'selector': $selector
200 );
201
202 @return $selector $context;
203}
204
205///
206/// Generate a BEM element that is related to the current element.
207///
208/// The generated element selector is appended to the current element selector. The $sign
209/// determines the relationship.
210///
211/// @param {string} $sign - Relationshop sign, either '+' or '~'
212/// @param {string} $name - First element name
213/// @param {string} $names - More element names
214///
215/// @content
216///
217/// @throw If the element is not preceded by an element.
218///
219/// @example scss - A sibling element to a single element
220/// @include iro-bem-component('block') {
221/// @include iro-bem-element('elem') {
222/// /* some element definitions */
223///
224/// @include iro-bem-related-element('~', 'sibling') {
225/// /* some sibling element definitions */
226/// }
227/// }
228/// }
229///
230/// // Generates:
231///
232/// .c-block__elem {
233/// /* some element definitions */
234/// }
235///
236/// .c-block__elem ~ .c-block__sibling {
237/// /* some sibling element definitions */
238/// }
239///
240/// @example scss - A successor element to a single element
241/// @include iro-bem-component('block') {
242/// @include iro-bem-element('elem') {
243/// /* some element definitions */
244///
245/// @include iro-bem-related-element('+', 'successor') {
246/// /* some successor element definitions */
247/// }
248/// }
249/// }
250///
251/// // Generates:
252///
253/// .c-block__elem {
254/// /* some element definitions */
255/// }
256///
257/// .c-block__elem + .c-block__successor {
258/// /* some successor element definitions */
259/// }
260///
261/// @example scss - A successor element to multiple elements
262/// @include iro-bem-component('block') {
263/// @include iro-bem-element('elem1', 'elem2') {
264/// /* some element definitions */
265///
266/// @include iro-bem-related-element('+', 'successor') {
267/// /* some successor element definitions */
268/// }
269/// }
270/// }
271///
272/// // Generates:
273///
274/// .c-block__elem1, .c-block__elem2 {
275/// /* some element definitions */
276/// }
277///
278/// .c-block__elem1 + .c-block__successor, .c-block__elem2 + .c-block__successor {
279/// /* some successor element definitions */
280/// }
281///
282@mixin iro-bem-related-element($sign, $name, $names...) {
283 $result: iro-bem-related-element($sign, $name, $names...);
284 $selector: nth($result, 1);
285 $context: nth($result, 2);
286
287 @include iro-bem-validate(
288 'related-element',
289 (sign: $sign, name: $name, names: $names),
290 $selector,
291 $context
292 );
293
294 @include iro-context-push($iro-bem-context-id, $context...);
295 @at-root #{$selector} {
296 @content;
297 }
298 @include iro-context-pop($iro-bem-context-id);
299}
300
301///
302/// Generate a new BEM element that is related to the current element.
303/// Check the respective mixin documentation for more information.
304///
305/// @return {list} A list with two items: 1. selector, 2. context or `null`
306///
307/// @see {mixin} iro-bem-related-element
308///
309@function iro-bem-related-element($sign, $name, $names...) {
310 //
311 // Generating this selector is simple: Take the latest block context, use it
312 // to generate the element part, and insert it at the end of the current selector.
313 // Possible outcomes:
314 // - {e} ({m,s}) ([manual selector]) + {e}
315 // - {e} ({m,s}) ([manual selector]) ~ {e}
316 //
317
318 $noop: iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth);
319 $noop: iro-context-assert-stack-must-contain($iro-bem-context-id, 'element');
320
321 @if $sign != '+' and $sign != '~' {
322 @error 'Invalid relationship sign #{inspect($sign)}.';
323 }
324
325 $block-context: iro-context-get($iro-bem-context-id, 'block');
326 $block-base-selector: map-get(nth($block-context, 2), 'base-selector');
327
328 $selector: ();
329 $parts-data: ();
330
331 @each $name in join($name, $names) {
332 $sel: selector-nest(&, $sign, selector-append($block-base-selector, $iro-bem-element-separator + $name));
333 $selector: join($selector, $sel, comma);
334 $parts-data: append($parts-data, (
335 'name': $name,
336 'selector': $sel
337 ));
338 }
339
340 $context: 'element', (
341 'parts': $parts-data,
342 'selector': $selector
343 );
344
345 @return $selector $context;
346}
347
348///
349/// Generate a BEM element that is a sibling of the current element.
350///
351/// It's a shorthand for iro-bem-related-element('~', $name).
352///
353/// @param {string} $name - First element name
354/// @param {list} $names - List of more element names
355///
356/// @content
357///
358@mixin iro-bem-sibling-element($name, $names...) {
359 @include iro-bem-related-element('~', $name, $names...) {
360 @content;
361 }
362}
363
364///
365/// Generate a new BEM element that is a sibling of the current element.
366/// Check the respective mixin documentation for more information.
367///
368/// @return {list} A list with two items: 1. selector, 2. context or `null`
369///
370/// @see {mixin} iro-bem-sibling-element
371///
372@function iro-bem-sibling-element($name, $names...) {
373 @return iro-bem-related-element('~', $name, $names...);
374}
375
376///
377/// Generate a BEM element that is the successor of the current element.
378///
379/// It's a shorthand for iro-bem-related-element('+', $name).
380///
381/// @param {string} $name - First element name
382/// @param {string} $names - More element names
383///
384/// @content
385///
386@mixin iro-bem-next-element($name, $names...) {
387 @include iro-bem-related-element('+', $name, $names...) {
388 @content;
389 }
390}
391
392///
393/// Generate a new BEM element that is the successor of the current element.
394/// Check the respective mixin documentation for more information.
395///
396/// @return {list} A list with two items: 1. selector, 2. context or `null`
397///
398/// @see {mixin} iro-bem-next-element
399///
400@function iro-bem-next-element($name, $names...) {
401 @return iro-bem-related-element('+', $name, $names...);
402}
403
404///
405/// Generate the current BEM element as a successor of itself.
406///
407/// If this is applied to a single element, it behaves exactly the same as
408/// iro-bem-related-element('+', name);
409/// However, if it is applied to multiple elements, each twin element only will influence
410/// their other twin, which is not replicable with iro-bem-related-element.
411///
412/// @content
413///
414/// @example scss - Two twin elements
415/// @include iro-bem-component('block') {
416/// @include iro-bem-element('elem') {
417/// /* some element definitions */
418///
419/// @include iro-bem-next-twin-element {
420/// /* some twin element definitions */
421/// }
422/// }
423/// }
424///
425/// // Generates:
426///
427/// .c-block__elem {
428/// /* some element definitions */
429/// }
430///
431/// .c-block__elem + .c-block__elem {
432/// /* some twin element definitions */
433/// }
434///
435/// @example scss - Multiple twin elements
436/// @include iro-bem-component('block') {
437/// @include iro-bem-element('elem1', 'elem2') {
438/// /* some element definitions */
439///
440/// @include iro-bem-next-twin-element {
441/// /* some twin element definitions */
442/// }
443/// }
444/// }
445///
446/// // Generates:
447///
448/// .c-block__elem1, .c-block__elem2 {
449/// /* some element definitions */
450/// }
451///
452/// .c-block__elem1 + .c-block__elem1, .c-block__elem2 + .c-block__elem2 {
453/// /* some twin element definitions */
454/// }
455///
456@mixin iro-bem-related-twin-element($sign) {
457 $result: iro-bem-related-twin-element($sign);
458 $selector: nth($result, 1);
459 $context: nth($result, 2);
460
461 @include iro-bem-validate(
462 'next-twin-element',
463 (),
464 $selector,
465 $context
466 );
467
468 @include iro-context-push($iro-bem-context-id, $context...);
469 @at-root #{$selector} {
470 @content;
471 }
472 @include iro-context-pop($iro-bem-context-id);
473}
474
475///
476/// Generate the current BEM element as a successor of itself.
477/// Check the respective mixin documentation for more information.
478///
479/// @return {list} A list with two items: 1. selector, 2. context or `null`
480///
481/// @see {mixin} iro-bem-next-twin-element
482///
483@function iro-bem-related-twin-element($sign) {
484 $noop: iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth);
485 $noop: iro-context-assert-stack-must-contain($iro-bem-context-id, 'element');
486
487 $element-context: iro-context-get($iro-bem-context-id, 'element');
488 $element-selector: map-get(nth($element-context, 2), 'selector');
489
490 $block-context: iro-context-get($iro-bem-context-id, 'block');
491 $block-base-selector: map-get(nth($block-context, 2), 'base-selector');
492
493 $selector: ();
494 $parts-data: ();
495
496 //
497 // To determine the twin for each element, iterate the sub-selectors from the current selector
498 // and check if it contains the currently inspected element. This has to be done with string
499 // comparison since none of Sass selector functions is of use here.
500 // Finally, the current twin will be appended to the extracted sub-selector as a successor
501 // element.
502 //
503 @each $part-data in map-get(nth($element-context, 2), 'parts') {
504 $part-selector: map-get($part-data, 'selector');
505 $part-name: map-get($part-data, 'name');
506
507 $sel: ();
508 @if iro-selector-suffix-match(&, $element-selector) {
509 //
510 // This mixin is included in the selector the last element mixin created.
511 // Possible outcomes:
512 // - {e} + {e}
513 // - [manual selector] {e} + {e}
514 //
515
516 @each $s in & {
517 @each $ps in $part-selector {
518 @if nth($s, -1) == nth($ps, -1) {
519 $sel-ent: selector-nest($s, $sign, selector-append($block-base-selector, $iro-bem-element-separator + $part-name));
520 $sel: join($sel, $sel-ent, comma);
521 }
522 }
523 }
524 } @else {
525 //
526 // This mixin is NOT included in the selector the last element mixin created.
527 // Possible outcomes:
528 // - {e} {m,s} + {e}
529 // - {e} [manual selector] + {e}
530 // - {e} {m,s} [manual selector] + {e}
531 //
532
533 @each $s in & {
534 @each $ps in $part-selector {
535 @if str-index(inspect($s), inspect($ps)) {
536 $char-index: str-length(inspect($ps)) + 1;
537 $match: index(' ' ':' ',', str-slice(inspect($s), $char-index, $char-index)) != null;
538
539 @if not $match {
540 @each $separator in $iro-bem-element-separator $iro-bem-modifier-separator $iro-bem-suffix-separator {
541 @if str-slice(inspect($s), $char-index, $char-index + str-length($separator) - 1) == $separator {
542 $match: true;
543 }
544 }
545 }
546
547 @if $match {
548 $sel-ent: selector-nest($s, '+', selector-append($block-base-selector, $iro-bem-element-separator + $part-name));
549 $sel: join($sel, $sel-ent, comma);
550 }
551 }
552 }
553 }
554 }
555 @if length($sel) != length($part-selector) {
556 @error 'Could not generate twin element selector.';
557 }
558
559 $selector: join($selector, $sel, comma);
560 $parts-data: append($parts-data, (
561 'name': $part-name,
562 'selector': $sel
563 ));
564 }
565
566 $context: 'element', (
567 'parts': $parts-data,
568 'selector': $selector
569 );
570
571 @return $selector $context;
572}
573
574///
575/// Generate the current BEM element as a sibling of itself.
576///
577/// It's a shorthand for iro-bem-related-twin-element('~').
578///
579/// @content
580///
581@mixin iro-bem-sibling-twin-element {
582 @include iro-bem-related-twin-element('~') {
583 @content;
584 }
585}
586
587///
588/// Generate the current BEM element as a sibling of itself.
589/// Check the respective mixin documentation for more information.
590///
591/// @return {list} A list with two items: 1. selector, 2. context or `null`
592///
593/// @see {mixin} iro-bem-sibling-twin-element
594///
595@function iro-bem-sibling-twin-element() {
596 @return iro-bem-related-twin-element('~');
597}
598
599///
600/// Generate the current BEM element as a next sibling of itself.
601///
602/// It's a shorthand for iro-bem-related-twin-element('+', $name).
603///
604/// @content
605///
606@mixin iro-bem-next-twin-element {
607 @include iro-bem-related-twin-element('+') {
608 @content;
609 }
610}
611
612///
613/// Generate the current BEM element as a next sibling of itself.
614/// Check the respective mixin documentation for more information.
615///
616/// @return {list} A list with two items: 1. selector, 2. context or `null`
617///
618/// @see {mixin} iro-bem-next-twin-element
619///
620@function iro-bem-next-twin-element() {
621 @return iro-bem-related-twin-element('+');
622}
diff --git a/src/bem/_functions.scss b/src/bem/_functions.scss
new file mode 100644
index 0000000..4bb95c4
--- /dev/null
+++ b/src/bem/_functions.scss
@@ -0,0 +1,26 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// @access private
9///
10@function iro-bem-theme-selector($name, $names...) {
11 $namespace: map-get($iro-bem-namespaces, 'theme');
12 $selector: null;
13
14 @each $name in join($name, $names) {
15 $sel: '.' + $namespace + '-' + $name;
16
17 @if $selector == null {
18 $selector: join(selector-parse($sel), selector-parse('[class*=\' t-\'] ' + $sel), comma);
19 $selector: join($selector, selector-parse('[class^=\'t-\'] ' + $sel), comma);
20 } @else {
21 $selector: selector-nest($selector, $sel);
22 }
23 }
24
25 @return $selector;
26}
diff --git a/src/bem/_modifier.scss b/src/bem/_modifier.scss
new file mode 100644
index 0000000..e1f9507
--- /dev/null
+++ b/src/bem/_modifier.scss
@@ -0,0 +1,246 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Generate a new BEM modifier.
9///
10/// If the parent context is block or element, the modifier will modify said block or element according
11/// to the BEM naming convention.
12///
13/// If the parent context is a modifier or suffix, then the modifier will depend on said modifier or suffix.
14/// Depending on $extend, the meaning of this dependency (and the resulting selector) varies:
15/// If it's false (default), you signalize that the modifier also exists by itself, but it changes its
16/// behavior when the parent modifier or suffix is set.
17/// If it's true, you signalize that the modifier extends the parent modifier or suffix and can only be
18/// used in conjunction with it.
19///
20/// @param {string | list} $name - First element name or list with two items: 1. first element name, 2. bool indicating if the modifier is extending
21/// @param {string | list} $names - More element names or lists with two items: 1. element name, 2. bool indicating if the modifier is extending
22///
23/// @content
24///
25/// @throw If the element is not preceded by a block, element, modifier or suffix.
26///
27/// @example scss - Modifier that modifies a block or element
28/// @include iro-bem-component('block') {
29/// @include iro-bem-modifier('mod') {
30/// background-color: #eee;
31/// }
32///
33/// @include iro-bem-element('elem') {
34/// @include iro-bem-modifier('mod') {
35/// background-color: #222;
36/// }
37/// }
38/// }
39///
40/// // Generates:
41///
42/// .c-block--mod {
43/// background-color: #eee;
44/// }
45///
46/// .c-block__elem--mod {
47/// background-color: #222;
48/// }
49///
50/// @example scss - Modifier nested in another modifier, not extending
51/// @include iro-bem-component('block') {
52/// @include iro-bem-modifier('mod') {
53/// background-color: #eee;
54/// }
55///
56/// @include iro-bem-modifier('dark') {
57/// /* some definitions */
58///
59/// @include iro-bem-modifier('mod') {
60/// background-color: #222;
61/// }
62/// }
63/// }
64///
65/// // Generates:
66///
67/// .c-block--mod {
68/// background-color: #eee;
69/// }
70///
71/// .c-block--dark {
72/// /* some definitions */
73/// }
74///
75/// .c-block--dark.c-block--mod {
76/// background-color: #222;
77/// }
78///
79/// @example scss - Modifier nested in another modifier, extending
80/// @include iro-bem-component('block') {
81/// @include iro-bem-modifier('mod') {
82/// background-color: #eee;
83/// }
84///
85/// @include iro-bem-modifier('dark') {
86/// /* some definitions */
87///
88/// @include iro-bem-modifier('mod' true) {
89/// background-color: #222;
90/// }
91/// }
92/// }
93///
94/// // Generates:
95///
96/// .c-block--mod {
97/// background-color: #eee;
98/// }
99///
100/// .c-block--dark {
101/// /* some definitions */
102/// }
103///
104/// .c-block--dark--mod {
105/// background-color: #222;
106/// }
107///
108@mixin iro-bem-modifier($name, $names...) {
109 $result: iro-bem-modifier($name, $names...);
110 $selector: nth($result, 1);
111 $context: nth($result, 2);
112
113 @include iro-bem-validate(
114 'modifier',
115 (name: $name, names: $names),
116 $selector,
117 $context
118 );
119
120 @include iro-context-push($iro-bem-context-id, $context...);
121 @at-root #{$selector} {
122 @content;
123 }
124 @include iro-context-pop($iro-bem-context-id);
125}
126
127///
128/// Generate a new BEM modifier. Check the respective mixin documentation for more information.
129///
130/// @return {list} A list with two items: 1. selector, 2. context or `null`
131///
132/// @see {mixin} iro-bem-modifier
133///
134@function iro-bem-modifier($name, $names...) {
135 $noop: iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth);
136 $noop: iro-context-assert-stack-must-contain($iro-bem-context-id, 'block');
137
138 $parent-context: iro-context-get($iro-bem-context-id, 'block' 'element' 'modifier' 'suffix');
139 $parent-selector: map-get(nth($parent-context, 2), 'selector');
140 $selector: ();
141 $parts-data: ();
142
143 @if not iro-selector-suffix-match(&, $parent-selector) {
144 //
145 // The current selector doesn't match the parent selector.
146 // The user manually added a selector between parent context and this modifier call.
147 // This case is forbidden because any outcome semantically wouldn't make sense:
148 // - {b,e,m,s} [manual selector] {b,e,m,s}--modifier
149 // - {b,e,m,s}--modifier [manual selector]
150 // The first case would make the modifier behave like an element.
151 // The second case is unintuitive, the code would be more clear by nesting the manual
152 // selector in the modifier instead.
153 //
154
155 @error 'A modifier must be an immediate child of the parent context';
156 }
157
158 @each $name in iro-list-prepend($names, $name) {
159 $extend: false;
160 @if type-of($name) == list {
161 $extend: nth($name, 2);
162 $name: nth($name, 1);
163 }
164
165 @if index('block' 'element', nth($parent-context, 1)) or $extend == true {
166 //
167 // Either the parent context is block or element, or a modifier or suffix
168 // is to be extended. The modifier part can simply be appended.
169 // Possible outcomes:
170 // - {b,e,m,s}--modifier
171 //
172
173 $sel: selector-append(&, $iro-bem-modifier-separator + $name);
174 $selector: join($selector, $sel, comma);
175 $parts-data: append($parts-data, (
176 'name': $name,
177 'selector': $sel
178 ));
179 } @else {
180 //
181 // Parent context is modifier, suffix or state and $extend is false.
182 //
183
184 $be-context: iro-context-get($iro-bem-context-id, 'block' 'element');
185
186 @if nth($be-context, 1) == 'element' {
187 //
188 // Latest context is element. Since element contexts can consist of multiple single
189 // elements, inspect all elements and append its selector with the suffix "--$name".
190 // This has to be done with string comparison since none of Sass selector functions
191 // is of use here.
192 // Possible outcomes:
193 // - {m,s}.{e}--modifier
194 //
195
196 $nsel: ();
197
198 @each $elem-part-data in map-get(nth($be-context, 2), 'parts') {
199 $elem-part-selector: map-get($elem-part-data, 'selector');
200
201 $sel: ();
202 @each $s in & {
203 @each $ps in $elem-part-selector {
204 @if str-index(inspect($s), inspect($ps) + $iro-bem-modifier-separator) or str-index(inspect($s), inspect($ps) + $iro-bem-suffix-separator) {
205 $sel: join($sel, selector-unify($s, selector-append($ps, $iro-bem-modifier-separator + $name)), comma);
206 }
207 }
208 }
209 @if length($sel) == 0 {
210 @error 'Could not generate modifier selector.';
211 }
212
213 $nsel: join($nsel, $sel, comma);
214 }
215
216 $selector: join($selector, $nsel, comma);
217 $parts-data: append($parts-data, (
218 'name': $name,
219 'selector': $nsel
220 ));
221 } @else {
222 //
223 // Latest context is block. Just append the modifier part.
224 // Possible outcomes:
225 // - {m,s}.{b}--modifier
226 //
227
228 $block-base-selector: map-get(nth($be-context, 2), 'base-selector');
229
230 $sel: selector-append(&, $block-base-selector, $iro-bem-modifier-separator + $name);
231 $selector: join($selector, $sel, comma);
232 $parts-data: append($parts-data, (
233 'name': $name,
234 'selector': $sel
235 ));
236 }
237 }
238 }
239
240 $context: 'modifier', (
241 'parts': $parts-data,
242 'selector': $selector
243 );
244
245 @return $selector $context;
246}
diff --git a/src/bem/_multi.scss b/src/bem/_multi.scss
new file mode 100644
index 0000000..9e47ce4
--- /dev/null
+++ b/src/bem/_multi.scss
@@ -0,0 +1,131 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Generate multiple entities (BEM or not) at once.
9///
10/// NOTE: This mixin does not generate perfectly optimized selectors in order to keep track of contexts.
11///
12/// @param {string | list} $first - First selector. Either a string for a manual selector, or a list with the first items standing for a BEM selector function (optionally suffixed by a colon) and other items being passed as arguments to said function.
13/// @param {string | list} $others - Other selectors. Either a string for a manual selector, or a list with the first items standing for a BEM selector function (optionally suffixed by a colon) and other items being passed as arguments to said function.
14///
15/// @content
16///
17/// @example scss - Creating multiple elements, a modifier and an anchor
18/// @include iro-bem-object('buttonstrip') {
19/// display: none;
20///
21/// @include iro-bem-multi('modifier' 'mod', 'element' 'button' 'separator', '> a') {
22/// display: block;
23/// }
24/// }
25///
26/// // Generates:
27///
28/// .o-buttonstrip {
29/// display: none;
30/// }
31///
32/// .o-buttonstrip--mod {
33/// display: block;
34/// }
35///
36/// .o-buttonstrip__button, {
37/// .o-buttonstrip__separator {
38/// display: block;
39/// }
40///
41/// .o-buttonstrip > a {
42/// display: block;
43/// }
44///
45/// @example scss - Creating multiple elements, a modifier and an anchor - optional colons included
46/// @include iro-bem-object('buttonstrip') {
47/// display: none;
48///
49/// @include iro-bem-multi('modifier:' 'mod', 'element:' 'button' 'separator', '> a') {
50/// display: block;
51/// }
52/// }
53///
54/// // Generates:
55///
56/// .o-buttonstrip {
57/// display: none;
58/// }
59///
60/// .o-buttonstrip--mod {
61/// display: block;
62/// }
63///
64/// .o-buttonstrip__button, {
65/// .o-buttonstrip__separator {
66/// display: block;
67/// }
68///
69/// .o-buttonstrip > a {
70/// display: block;
71/// }
72///
73@mixin iro-bem-multi($first, $others...) {
74 @include iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth);
75
76 @each $entity in iro-list-prepend($others, $first) {
77 $is-manual-selector: false;
78
79 @if type-of($entity) == string and not function-exists('iro-bem-' + $entity) {
80 $is-manual-selector: true;
81 }
82
83 @if $is-manual-selector {
84 $sel: if(&, selector-nest(&, $entity), selector-parse($entity));
85
86 @at-root #{$sel} {
87 @content;
88 }
89 } @else {
90 $entity-func-id: null;
91
92 @if type-of($entity) == list {
93 $entity-func-id: nth($entity, 1);
94 $entity: iro-list-slice($entity, 2);
95 } @else {
96 $entity-func-id: $entity;
97 $entity: ();
98 }
99
100 @if str-slice($entity-func-id, str-length($entity-func-id)) == ':' {
101 $entity-func-id: str-slice($entity-func-id, 1, str-length($entity-func-id) - 1);
102 }
103
104 $sel-func: null;
105
106 @if function-exists('iro-bem-' + $entity-func-id) {
107 $sel-func: get-function('iro-bem-' + $entity-func-id);
108 } @else if function-exists($entity-func-id) {
109 $sel-func: get-function($entity-func-id);
110 }
111
112 @if $sel-func == null {
113 @error 'Function "#{inspect($entity-func-id)}" was not found.';
114 }
115
116 $entity-result: call($sel-func, $entity...);
117 $entity-result-selector: nth($entity-result, 1);
118 $entity-result-context: nth($entity-result, 2);
119
120 @if $entity-result-context != null {
121 @include iro-context-push($iro-bem-context-id, $entity-result-context...);
122 }
123 @at-root #{$entity-result-selector} {
124 @content;
125 }
126 @if $entity-result-context != null {
127 @include iro-context-pop($iro-bem-context-id);
128 }
129 }
130 }
131}
diff --git a/src/bem/_state.scss b/src/bem/_state.scss
new file mode 100644
index 0000000..4a85bbb
--- /dev/null
+++ b/src/bem/_state.scss
@@ -0,0 +1,146 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Create a new state rule.
9///
10/// @param {string} $state - First state name
11/// @param {list} $states - List of more state names
12///
13/// @content
14///
15/// @example scss - Using single is-state
16/// @include iro-bem-object('menu') {
17/// display: none;
18///
19/// @include iro-bem-state('is', open') {
20/// display: block;
21/// }
22/// }
23///
24/// // Generates:
25///
26/// .o-menu {
27/// display: none;
28/// }
29///
30/// .o-menu.is-open {
31/// display: block;
32/// }
33///
34/// @example scss - Using multiple is-states
35/// @include iro-bem-object('menu') {
36/// display: none;
37///
38/// @include iro-bem-state('is', open', 'visible') {
39/// display: block;
40/// }
41/// }
42///
43/// // Generates:
44///
45/// .o-menu {
46/// display: none;
47/// }
48///
49/// .o-menu.is-open,
50/// .o-menu.is-visible {
51/// display: block;
52/// }
53///
54@mixin iro-bem-state($prefix, $state, $states...) {
55 $result: iro-bem-state($prefix, $state, $states...);
56 $selector: nth($result, 1);
57 $context: nth($result, 2);
58
59 @include iro-bem-validate(
60 'state',
61 (prefix: $prefix, state: $state, states: $states),
62 $selector,
63 $context
64 );
65
66 @include iro-context-push($iro-bem-context-id, $context...);
67 @at-root #{$selector} {
68 @content;
69 }
70 @include iro-context-pop($iro-bem-context-id);
71}
72
73///
74/// Generate a new state.
75///
76/// @return {list} A list with two items: 1. selector, 2. context or `null`
77///
78/// @see {mixin} iro-bem-has
79///
80@function iro-bem-state($prefix, $state, $states...) {
81 $selector: ();
82 $parts-data: ();
83
84 @each $state in join($state, $states) {
85 $sel: selector-parse('.#{$prefix}-#{$state}');
86 @if & {
87 $sel: selector-append(&, $sel);
88 }
89 $selector: join($selector, $sel, comma);
90 $parts-data: append($parts-data, (
91 'name': $state,
92 'selector': $sel
93 ));
94 }
95
96 $context: 'state', (
97 'parts': $parts-data,
98 'selector': $selector
99 );
100
101 @return $selector $context;
102}
103
104///
105/// Create a new has-state modifier.
106///
107/// It's a shorthand for iro-bem-state('is', $state, $states...).
108///
109@mixin iro-bem-is($state, $states...) {
110 @include iro-bem-state('is', $state, $states...) {
111 @content;
112 }
113}
114
115///
116/// Generate a new is-state modifier. Check the respective mixin documentation for more information.
117///
118/// @return {list} A list with two items: 1. selector, 2. context or `null`
119///
120/// @see {mixin} iro-bem-is
121///
122@function iro-bem-is($state, $states...) {
123 @return iro-bem-state('is', $state, $states...);
124}
125
126///
127/// Create a new has-state modifier.
128///
129/// It's a shorthand for iro-bem-state('has', $state, $states...).
130///
131@mixin iro-bem-has($state, $states...) {
132 @include iro-bem-state('has', $state, $states...) {
133 @content;
134 }
135}
136
137///
138/// Generate a new has-state modifier. Check the respective mixin documentation for more information.
139///
140/// @return {list} A list with two items: 1. selector, 2. context or `null`
141///
142/// @see {mixin} iro-bem-has
143///
144@function iro-bem-has($state, $states...) {
145 @return iro-bem-state('has', $state, $states...);
146}
diff --git a/src/bem/_suffix.scss b/src/bem/_suffix.scss
new file mode 100644
index 0000000..b103c9f
--- /dev/null
+++ b/src/bem/_suffix.scss
@@ -0,0 +1,118 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Generate a new suffix.
9///
10/// @param {string} $name - Suffix name
11///
12/// @content
13///
14/// @throw If the element is not preceded by a block or modifier.
15///
16/// @example scss - Using a suffix
17/// @include iro-bem-utility('hidden') {
18/// display: none;
19///
20/// @media (max-width: 320px) {
21/// @include iro-bem-suffix('phone') {
22/// display: none;
23/// }
24/// }
25///
26/// @media (max-width: 768px) {
27/// @include iro-bem-suffix('tablet') {
28/// display: none;
29/// }
30/// }
31/// }
32///
33/// // Generates:
34///
35/// .u-hidden {
36/// display: none;
37/// }
38///
39/// @media (max-width: 320px) {
40/// .u-hidden@phone {
41/// display: none;
42/// }
43/// }
44///
45/// @media (max-width: 768px) {
46/// .u-hidden@tablet {
47/// display: none;
48/// }
49/// }
50///
51@mixin iro-bem-suffix($name) {
52 $result: iro-bem-suffix($name);
53 $selector: nth($result, 1);
54 $context: nth($result, 2);
55
56 @include iro-bem-validate(
57 'suffix',
58 (name: $name),
59 $selector,
60 $context
61 );
62
63 @include iro-context-push($iro-bem-context-id, $context...);
64 @at-root #{$selector} {
65 @content;
66 }
67 @include iro-context-pop($iro-bem-context-id);
68}
69
70///
71/// Generate a new suffix. Check the respective mixin documentation for more information.
72///
73/// @return {list} A list with two items: 1. selector, 2. context or `null`
74///
75/// @see {mixin} iro-bem-suffix
76///
77@function iro-bem-suffix($name) {
78 //
79 // Suffixes can be used on block, element and modifier.
80 //
81
82 $noop: iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth);
83 $noop: iro-context-assert-stack-must-contain($iro-bem-context-id, 'block');
84 $noop: iro-context-assert-stack-must-not-contain($iro-bem-context-id, 'suffix');
85
86 $parent-context: iro-context-get($iro-bem-context-id, 'block' 'element' 'modifier');
87 $parent-selector: map-get(nth($parent-context, 2), 'selector');
88
89 @if not iro-selector-suffix-match(&, $parent-selector) {
90 //
91 // The current selector doesn't match the parent selector.
92 // The user manually added a selector between parent context and this suffix call.
93 // This case is forbidden because any outcome semantically wouldn't make sense:
94 // - {b,e,m} [manual selector] {b,e,m}@suffix
95 // - {b,e,m}@suffix [manual selector]
96 // The first case would make the modifier behave like an element.
97 // The second case is unintuitive, the code would be more clear by nesting the manual
98 // selector in the suffix instead.
99 //
100
101 @error 'A suffix must be an immediate child of the parent context';
102 }
103
104 //
105 // The suffix part can simply be appended.
106 // Possible outcomes:
107 // - {b,e,m}@suffix
108 //
109
110 $selector: selector-append(&, $iro-bem-suffix-separator + $name);
111
112 $context: 'suffix', (
113 'name': $name,
114 'selector': $selector
115 );
116
117 @return $selector $context;
118}
diff --git a/src/bem/_theme.scss b/src/bem/_theme.scss
new file mode 100644
index 0000000..b4bcc76
--- /dev/null
+++ b/src/bem/_theme.scss
@@ -0,0 +1,61 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Declare new rules for the current block for when this theme is active.
9///
10/// @param {string} $name - First theme block name
11/// @param {string} $names - More theme block names
12///
13/// @content
14///
15@mixin iro-bem-at-theme($name, $names...) {
16 $result: iro-bem-at-theme($name, $names...);
17 $selector: nth($result, 1);
18 $context: nth($result, 2);
19
20 @include iro-bem-validate(
21 'at-theme',
22 (name: $name, names: $names),
23 $selector,
24 $context
25 );
26
27 @include iro-context-push($iro-bem-context-id, $context...);
28 @at-root #{$selector} {
29 @content;
30 }
31 @include iro-context-pop($iro-bem-context-id);
32}
33
34///
35/// Declare new rules for the current block for when this theme is active.
36/// Check the respective mixin documentation for more information.
37///
38/// @return {list} A list with two items: 1. selector, 2. context or `null`
39///
40/// @see {mixin} iro-bem-at-theme
41///
42@function iro-bem-at-theme($name, $names...) {
43 $noop: iro-context-assert-stack-must-contain($iro-bem-context-id, 'block');
44
45 $parent-context: iro-context-get($iro-bem-context-id, 'block');
46 $parent-selector: map-get(nth($parent-context, 2), 'selector');
47
48 @if not iro-selector-suffix-match(&, $parent-selector) {
49 @error 'An at-theme rule must be an immediate child of a block';
50 }
51
52 $selector: iro-bem-theme-selector($name, $names...);
53 $selector: selector-nest($selector, &);
54
55 $context: 'at-theme', (
56 'name': join($name, $names),
57 'selector': $selector
58 );
59
60 @return $selector $context;
61}
diff --git a/src/bem/_validators.scss b/src/bem/_validators.scss
new file mode 100644
index 0000000..eb09a60
--- /dev/null
+++ b/src/bem/_validators.scss
@@ -0,0 +1,176 @@
1////
2/// Validators are custom functions that will be called before a BEM entity is created.
3/// They check if the current mixin usage is valid or not and thus they are a flexible way to
4/// let you implement your own rules.
5///
6/// Validator functions receive the following information:
7/// - BEM entity type
8/// - Arguments passed to the mixin
9/// - The generated selector
10/// - The generated context, if any
11///
12/// Additionally, the context stack used by the BEM system can be examined.
13///
14/// @group BEM
15///
16/// @access public
17////
18
19///
20/// A list of validator functions.
21///
22/// @type list
23///
24/// @access private
25///
26$iro-bem-validators: ();
27
28///
29/// Register one or multiple validator functions.
30///
31/// A validator function is a function that accepts 4 arguments:
32/// 1. BEM entity type (string)
33/// 2. Arguments passed to the mixin (map)
34/// 3. The generated selector (selector)
35/// 4. The generated context (list, may be null)
36///
37/// The function must return a list with two items:
38/// 1. `true` if the mixin usage is valid, otherwise `false`,
39/// 2. a string with a rejection reason (empty if the usage is valid).
40///
41/// @param {string} $func-name - First function name.
42/// @param {string} $func-names - Other function names.
43///
44@mixin iro-bem-add-validator($func-name, $func-names...) {
45 $noop: iro-bem-add-validator($func-name, $func-names...);
46}
47
48///
49/// Register one or multiple validator functions. Check the respective mixin documentation for more information.
50///
51/// @see {mixin} iro-bem-add-validator
52///
53@function iro-bem-add-validator($func-name, $func-names...) {
54 @each $fn-name in join($func-name, $func-names) {
55 $fn: get-function($fn-name);
56 $iro-bem-validators: map-merge($iro-bem-validators, ($fn-name: $fn)) !global;
57 }
58 @return null;
59}
60
61///
62/// Unregister one or multiple validator functions.
63///
64/// @param {string} $func-name - First function name.
65/// @param {string} $func-names - Other function names.
66///
67@mixin iro-bem-remove-validator($func-name, $func-names...) {
68 $noop: iro-bem-remove-validator($func-name, $func-names...);
69}
70
71///
72/// Unregister one or multiple validator functions. Check the respective mixin documentation for more information.
73///
74/// @see {mixin} iro-bem-remove-validator
75///
76@function iro-bem-remove-validator($func-name, $func-names...) {
77 $iro-bem-validators: map-remove($iro-bem-validators, $func-name, $func-names...) !global;
78 @return null;
79}
80
81///
82/// @access private
83///
84@mixin iro-bem-validate($type, $args, $selector, $context) {
85 @each $id, $fn in $iro-bem-validators {
86 $result: call($fn, $type, $args, $selector, $context);
87 @if not nth($result, 1) {
88 @error 'A BEM validator rejected this mixin usage due to the following reason: #{nth($result, 2)}';
89 }
90 }
91}
92
93//
94// ---------------------------------------------------------------------------------------------------------
95// Built-in validators
96// ---------------------------------------------------------------------------------------------------------
97//
98
99///
100/// A validator that makes sure blocks are declared in the right order, determined by the
101/// namespace used.
102///
103@function iro-bem-validator--enforce-namespace-order($type, $args, $selector, $context) {
104 @if not global-variable-exists(iro-bem-namespace-order) {
105 $iro-bem-namespace-order: map-keys($iro-bem-namespaces) !global;
106 }
107 @if not global-variable-exists(iro-bem-cur-namespace-index) {
108 $iro-bem-cur-namespace-index: 1 !global;
109 }
110
111 @if $type == 'block' {
112 $block-type: map-get($args, 'type');
113
114 @if $block-type != null {
115 $ns-index: index($iro-bem-namespace-order, $block-type);
116
117 @if $ns-index != null {
118 @if $ns-index < $iro-bem-cur-namespace-index {
119 @return false 'Namespace "#{$block-type}" comes before current namespace #{nth($iro-bem-namespace-order, $iro-bem-cur-namespace-index)}';
120 }
121
122 $iro-bem-cur-namespace-index: $ns-index !global;
123 }
124 }
125 }
126
127 @return true '';
128}
129
130///
131/// A validator that makes all BEM entities immutable.
132///
133@function iro-bem-validator--immutable-entities($type, $args, $selector, $context) {
134 @if not global-variable-exists(iro-bem-generated-selectors) {
135 $iro-bem-generated-selectors: () !global;
136 }
137
138 $block-name: null;
139 $block-type: null;
140 $block-id: null;
141
142 @if $type == 'block' {
143 $block-name: map-get($args, 'name');
144 $block-type: map-get($args, 'type');
145 } @else {
146 $block-context: iro-context-get($iro-bem-context-id, 'block');
147 $block-name: map-get(nth($block-context, 2), 'name');
148 $block-type: map-get(nth($block-context, 2), 'type');
149 }
150
151 @if $block-type != null {
152 $block-id: $block-name + '_' + $block-type;
153 } @else {
154 $block-id: $block-name;
155 }
156
157 @if $type == 'block' {
158 @if map-has-key($iro-bem-generated-selectors, $block-id) {
159 @return false 'Entity "#{$type}" with arguments [ #{iro-map-print($args)} ] was already defined.';
160 }
161
162 $iro-bem-generated-selectors: map-merge($iro-bem-generated-selectors, ($block-id: ())) !global;
163 } @else {
164 $selectors: map-get($iro-bem-generated-selectors, $block-id);
165
166 @if index($selectors, $selector) {
167 @return false 'Entity "#{$type}" with arguments [ #{iro-map-print($args)} ] was already defined.';
168 }
169
170 $selectors: append($selectors, $selector);
171
172 $iro-bem-generated-selectors: map-merge($iro-bem-generated-selectors, ($block-id: $selectors)) !global;
173 }
174
175 @return true '';
176}
diff --git a/src/bem/_vars.scss b/src/bem/_vars.scss
new file mode 100644
index 0000000..5942d4f
--- /dev/null
+++ b/src/bem/_vars.scss
@@ -0,0 +1,108 @@
1////
2/// @group BEM
3///
4/// @access public
5////
6
7///
8/// Separating character sequence for elements.
9///
10/// @type string
11///
12$iro-bem-element-separator: '__' !default;
13
14///
15/// Separating character sequence for modifiers.
16///
17/// @type string
18///
19$iro-bem-modifier-separator: '--' !default;
20
21///
22/// Separating character sequence for BEMIT suffixes.
23///
24/// @type string
25///
26$iro-bem-suffix-separator: '\\@' !default;
27
28///
29/// Prefixes for all BEMIT namespaces.
30///
31/// @prop {string} utility ['u'] - Utility namespace
32/// @prop {string} object ['o'] - Object namespace
33/// @prop {string} component ['c'] - Component namespace
34/// @prop {string} layout ['l'] - Layout namespace
35/// @prop {string} scope ['s'] - Scope namespace
36/// @prop {string} theme ['t'] - Theme namespace
37/// @prop {string} js ['js'] - JS namespace
38/// @prop {string} qa ['qa'] - QA namespace
39/// @prop {string} hack ['_'] - Hack namespace
40///
41/// @type map
42///
43$iro-bem-namespaces: (
44 object: 'o',
45 component: 'c',
46 layout: 'l',
47 scope: 's',
48 theme: 't',
49 utility: 'u',
50 js: 'js',
51 qa: 'qa',
52 hack: '_'
53) !default;
54
55///
56/// A list of all generated blocks.
57///
58/// @type list
59///
60/// @access private
61///
62$iro-bem-blocks: ();
63
64///
65/// Maximum nesting depth of BEM mixins. The large default value means there is no effective limit.
66///
67/// @type number
68///
69$iro-bem-max-depth: 99 !default;
70
71///
72/// Indicates how nested elements should be handled.
73///
74/// 'allow' means elements will be nested, i.e. the result will be {e} {b}__element.
75/// 'disallow' means an error will be emitted.
76/// 'append' means the element name will be appended to the parent element, i.e. the result will be {e}__element.
77/// Any other value is treated as 'allow'.
78///
79/// @type string
80///
81$iro-bem-element-nesting-policy: 'allow' !default;
82
83///
84/// Context ID used for all BEM-related mixins.
85///
86/// @type string
87///
88$iro-bem-context-id: 'bem' !default;
89
90///
91/// Debug mode.
92///
93/// @type bool
94///
95$iro-bem-debug: false !default;
96
97///
98/// Colors assigned to namespaces.
99///
100/// @type map
101///
102$iro-bem-debug-colors: (
103 object: #ffa500,
104 component: #00f,
105 layout: #ff0,
106 utility: #008000,
107 hack: #f00
108) !default;
diff --git a/src/harmony-shortcodes.scss b/src/harmony-shortcodes.scss
new file mode 100644
index 0000000..3307a7e
--- /dev/null
+++ b/src/harmony-shortcodes.scss
@@ -0,0 +1,35 @@
1////
2/// Shorter version of the harmony-related functions. Useful to reduce clutter.
3///
4/// @group Harmony shortcodes
5///
6/// @access public
7////
8
9///
10/// @alias iro-harmony-modular-scale
11///
12@function modular-scale($times, $base, $ratio) {
13 @include iro-harmony-modular-scale($times, $base, $ratio);
14}
15
16///
17/// @alias modular-scale
18///
19@function ms($times, $base, $ratio) {
20 @include modular-scale($times, $base, $ratio);
21}
22
23///
24/// @alias iro-responsive-modular-scale
25///
26@mixin responsive-modular-scale($prop, $times, $responsive-map) {
27 @include iro-responsive-modular-scale($prop, $times, $responsive-map);
28}
29
30///
31/// @alias responsive-modular-scale
32///
33@mixin responsive-ms($prop, $times, $responsive-map) {
34 @include responsive-modular-scale($prop, $times, $responsive-map);
35}
diff --git a/src/main.scss b/src/main.scss
new file mode 100644
index 0000000..5b1b3d1
--- /dev/null
+++ b/src/main.scss
@@ -0,0 +1,10 @@
1@import 'functions';
2@import 'math';
3@import 'vars';
4@import 'contexts';
5@import 'bem';
6@import 'props';
7@import 'harmony';
8@import 'responsive';
9@import 'easing';
10@import 'gradients';
diff --git a/src/prep.scss b/src/prep.scss
new file mode 100644
index 0000000..616165d
--- /dev/null
+++ b/src/prep.scss
@@ -0,0 +1,2 @@
1@import 'functions';
2@import 'math';
diff --git a/src/responsive-shortcodes.scss b/src/responsive-shortcodes.scss
new file mode 100644
index 0000000..e43dfc0
--- /dev/null
+++ b/src/responsive-shortcodes.scss
@@ -0,0 +1,14 @@
1////
2/// Shorter version of the responsive-related mixins. Useful to reduce clutter.
3///
4/// @group Responsive shortcodes
5///
6/// @access public
7////
8
9///
10/// @alias iro-responsive-property
11///
12@mixin responsive($props, $responsive-map, $fluid: true, $vertical: false) {
13 @include iro-responsive-property($props, $responsive-map, $fluid, $vertical);
14}
diff --git a/test/_bem.scss b/test/_bem.scss
new file mode 100644
index 0000000..30ed131
--- /dev/null
+++ b/test/_bem.scss
@@ -0,0 +1,19 @@
1@include describe('BEM') {
2 //
3 // The following unit tests only test the BEM mixins.
4 // Since they are wrappers for the BEM functions, the latter are
5 // automatically covered.
6 //
7
8 @import 'bem/iro-bem-block';
9 @import 'bem/iro-bem-composed-of';
10 @import 'bem/iro-bem-at-theme';
11 @import 'bem/iro-bem-element';
12 @import 'bem/iro-bem-related-element';
13 @import 'bem/iro-bem-next-twin-element';
14 @import 'bem/iro-bem-modifier';
15 @import 'bem/iro-bem-suffix';
16 @import 'bem/iro-bem-state';
17 @import 'bem/iro-bem-multi';
18 @import 'bem/examples';
19}
diff --git a/test/_contexts.scss b/test/_contexts.scss
new file mode 100644
index 0000000..1b0e602
--- /dev/null
+++ b/test/_contexts.scss
@@ -0,0 +1,65 @@
1@include describe('Contexts') {
2 @include it('Creating / deleting context stacks') {
3 @include assert-equal(iro-context-stack-create('test'), null, 'Check if context stack was created');
4 @include assert-equal(iro-context-stack-delete('test'), null, 'Check if context stack was deleted');
5 }
6
7 @include it('Adding / removing contexts') {
8 @include assert-equal(iro-context-stack-create('test'), null, 'Check if context stack was created');
9
10 @include assert-equal(iro-context-push('test', 'ctx', 1234), 'ctx' 1234, 'Check if context 1 was pushed');
11 @include assert-equal(iro-context-push('test', 'another', 'text'), 'another' 'text', 'Check if context 2 was pushed');
12 @include assert-equal(iro-context-push('test', 'ctx', 56), 'ctx' 56, 'Check if context 3 was pushed');
13
14 @include assert-equal(iro-context-pop('test'), 'ctx' 56, 'Check if context 3 was popped');
15 @include assert-equal(iro-context-pop('test'), 'another' 'text', 'Check if context 2 was popped');
16 @include assert-equal(iro-context-pop('test'), 'ctx' 1234, 'Check if context 1 was popped');
17
18 @include assert-equal(iro-context-stack-delete('test'), null, 'Check if context stack was deleted');
19 }
20
21 @include it('Clearing / counting context stacks') {
22 @include assert-equal(iro-context-stack-create('test'), null, 'Check if context stack was created');
23
24 @include assert-equal(iro-context-push('test', 'ctx', 1234), 'ctx' 1234, 'Check if context 1 was pushed');
25 @include assert-equal(iro-context-push('test', 'another', 'text'), 'another' 'text', 'Check if context 2 was pushed');
26 @include assert-equal(iro-context-push('test', 'ctx', 56), 'ctx' 56, 'Check if context 3 was pushed');
27
28 @include assert-equal(iro-context-stack-count('test'), 3, 'Check if context stack contains 3 contexts');
29 @include assert-equal(iro-context-pop('test'), 'ctx' 56, 'Check if context 3 was popped');
30 @include assert-equal(iro-context-stack-count('test'), 2, 'Check if context stack contains 2 contexts');
31 @include assert-equal(iro-context-stack-clear('test'), null, 'Check if context stack was cleared');
32 @include assert-equal(iro-context-stack-count('test'), 0, 'Check if context stack contains no contexts');
33
34 @include assert-equal(iro-context-stack-delete('test'), null, 'Check if context stack was deleted');
35 }
36
37 @include it('Retrieving contexts') {
38 @include assert-equal(iro-context-stack-create('test'), null, 'Check if context stack was created');
39
40 @include assert-equal(iro-context-push('test', 'ctx', 1234), 'ctx' 1234, 'Check if context 1 was pushed');
41 @include assert-equal(iro-context-push('test', 'another', 'text'), 'another' 'text', 'Check if context 2 was pushed');
42 @include assert-equal(iro-context-push('test', 'ctx', 56), 'ctx' 56, 'Check if context 3 was pushed');
43
44 @include assert-equal(iro-context-get('test', 1), 'ctx' 56, 'Check if context at position 1 is context 3');
45 @include assert-equal(iro-context-get('test', 'ctx'), 'ctx' 56, 'Check if latest context with id "ctx" is context 3');
46 @include assert-equal(iro-context-get('test', 2), 'another' 'text', 'Check if latest context with id "another" is context 2');
47
48 @include assert-equal(iro-context-pop('test'), 'ctx' 56, 'Check if context 3 was popped');
49
50 @include assert-equal(iro-context-get('test', 1), 'another' 'text', 'Check if context at position 1 is context 2');
51 @include assert-equal(iro-context-get('test', -1), 'ctx' 1234, 'Check if latest context with id "ctx" is context 1');
52
53 @include assert-equal(iro-context-push('test', 'more', 'string'), 'more' 'string', 'Check if context 4 was pushed');
54
55 @include assert-equal(iro-context-get('test', 1), 'more' 'string', 'Check if context at position 1 is context 4');
56 @include assert-equal(iro-context-get('test', 'more'), 'more' 'string', 'Check if latest context with id "more" is context 4');
57
58 @include assert-equal(iro-context-pop('test'), 'more' 'string', 'Check if context 4 was popped');
59 @include assert-equal(iro-context-pop('test'), 'another' 'text', 'Check if context 2 was popped');
60
61 @include assert-equal(iro-context-get('test', 1), iro-context-get('test', -1), 'Check if first and last context are context 1');
62
63 @include assert-equal(iro-context-stack-delete('test'), null, 'Check if context stack was deleted');
64 }
65}
diff --git a/test/_functions.scss b/test/_functions.scss
new file mode 100644
index 0000000..54e37c5
--- /dev/null
+++ b/test/_functions.scss
@@ -0,0 +1,103 @@
1@include describe('Functions') {
2 @include it('iro-str-replace') {
3 $str: 'Hello world!';
4
5 @include assert-equal(iro-str-replace($str, 'world', 'neighbor'), 'Hello neighbor!', 'Replace "world" with "neighbor"');
6 @include assert-equal(iro-str-replace($str, 'neighbor', 'moon'), 'Hello world!', 'Replace "neighbor" with "moon"');
7 @include assert-equal(iro-str-replace($str, 'Hello', 'Bye'), 'Bye world!', 'Replace "Hello" with "Bye"');
8 }
9
10 @include it('iro-list-slice') {
11 $list: 'this' 'is' 'a' 'list';
12
13 @include assert-equal(iro-list-slice($list, 2), 'is' 'a' 'list', 'Discard first item');
14 @include assert-equal(iro-list-slice($list, 1, 3), 'this' 'is' 'a', 'Keep first 3 items');
15 @include assert-equal(iro-list-slice($list, 2, 3), 'is' 'a', 'Extract list from index 2 to 3');
16 @include assert-equal(iro-list-slice($list, -1, -1), join((), 'list'), 'Keep last item');
17 @include assert-equal(iro-list-slice($list, -1, 1), 'list' 'this', 'Extract first and last item');
18 }
19
20 @include it('iro-list-prepend') {
21 $list: 'this' 'is' 'a' 'list';
22
23 @include assert-equal(iro-list-prepend($list, 'and'), 'and' 'this' 'is' 'a' 'list', 'Prepend "and"');
24 @include assert-equal(iro-list-prepend($list, 2), 2 'this' 'is' 'a' 'list', 'Prepend 2');
25 }
26
27 @include it('iro-quicksort') {
28 @include assert-equal(iro-quicksort(1 2 3 4 5), 1 2 3 4 5, 'Already sorted list of 5 items');
29 @include assert-equal(iro-quicksort(1 3 2), 1 2 3, 'Random list of 3 items');
30 @include assert-equal(iro-quicksort(6 3 7 3 8 1 4), 1 3 3 4 6 7 8, 'Random list of 7 items, one duplicate');
31 @include assert-equal(iro-quicksort(1 1 1 1), 1 1 1 1, 'List of 4 identical items');
32 }
33
34 @include it('iro-map-get-default') {
35 $map: ('key': 'value', 'another': 'item');
36
37 @include assert-equal(iro-map-get-default($map, 'another', 0), map-get($map, 'another'), 'Get existing value');
38 @include assert-equal(iro-map-get-default($map, 'index', 'nothing'), 'nothing', 'Get missing value');
39 }
40
41 @include it('iro-map-get-deep') {
42 $map: (
43 'key': 'value',
44 'sub': (
45 'item1': 1,
46 'item2': 2,
47 'subsub': (
48 'item1': 11,
49 'item2': 12,
50 )
51 )
52 );
53
54 @include assert-equal(iro-map-get-deep($map, 'key'), map-get($map, 'key'), 'Get value in root level');
55 @include assert-equal(iro-map-get-deep($map, 'sub' 'item1'), map-get(map-get($map, 'sub'), 'item1'), 'Get value in first level');
56 @include assert-equal(iro-map-get-deep($map, 'sub' 'item2'), map-get(map-get($map, 'sub'), 'item2'), 'Get value in first level');
57 @include assert-equal(iro-map-get-deep($map, 'sub' 'subsub' 'item1'), map-get(map-get(map-get($map, 'sub'), 'subsub'), 'item1'), 'Get value in second level');
58 @include assert-equal(iro-map-get-deep($map, 'sub' 'subsub' 'item2'), map-get(map-get(map-get($map, 'sub'), 'subsub'), 'item2'), 'Get value in second level');
59 }
60
61 @include it('iro-map-merge-recursive') {
62 $map1: (
63 'key': 'value',
64 'sub': (
65 'item1': 1,
66 'item3': 2
67 )
68 );
69 $map2: (
70 'another': 'item',
71 'sub': (
72 'item1': 0,
73 'item2': 1
74 )
75 );
76
77 $expected: (
78 'key': 'value',
79 'another': 'item',
80 'sub': (
81 'item1': 0,
82 'item2': 1,
83 'item3': 2
84 )
85 );
86
87 @include assert-equal(iro-map-merge-recursive($map1, $map2), $expected);
88 }
89
90 @include it('iro-strip-unit') {
91 @include assert-true(unitless(iro-strip-unit(1em)), 'Remove unit from 1em');
92 @include assert-true(unitless(iro-strip-unit(2rem)), 'Remove unit from 2rem');
93 @include assert-true(unitless(iro-strip-unit(3px)), 'Remove unit from 3px');
94 @include assert-true(unitless(iro-strip-unit(4)), 'Remove unit from 4');
95 @include assert-true(unitless(iro-strip-unit(5pt)), 'Remove unit from 5pt');
96 }
97
98 @include it('iro-px-to-rem') {
99 @include assert-equal(iro-px-to-rem(16px, 16px), 1rem, 'Convert 16px');
100 @include assert-equal(iro-px-to-rem(32px, 16px), 2rem, 'Convert 16px');
101 @include assert-equal(iro-px-to-rem(8px, 16px), 0.5rem, 'Convert 16px');
102 }
103}
diff --git a/test/_gradients.scss b/test/_gradients.scss
new file mode 100644
index 0000000..c1145aa
--- /dev/null
+++ b/test/_gradients.scss
@@ -0,0 +1,264 @@
1// sass-lint:disable no-color-literals zero-unit
2
3@include describe('Gradients') {
4 @include it('iro-easing-gradient') {
5 $gradient1: iro-easing-gradient(
6 linear,
7 to right,
8 #000,
9 ease-in-quad,
10 transparent
11 );
12
13 $expected1: linear-gradient(
14 to right,
15 #000 0,
16 mix(transparent, #000, iro-ease-in-quad(0.25) * 100%) 25%,
17 mix(transparent, #000, iro-ease-in-quad(0.5) * 100%) 50%,
18 mix(transparent, #000, iro-ease-in-quad(0.75) * 100%) 75%,
19 transparent 100%
20 );
21
22 @include assert-equal($gradient1, $expected1, 'Simple linear gradient');
23
24 // ---------------------------------------------------------------------------
25
26 $gradient2: iro-easing-gradient(
27 radial,
28 1em 2em at 50% 60%,
29 #000,
30 ease-out-cubic,
31 transparent
32 );
33
34 $expected2: radial-gradient(
35 1em 2em at 50% 60%,
36 #000 0,
37 mix(transparent, #000, iro-ease-out-cubic(0.25) * 100%) 25%,
38 mix(transparent, #000, iro-ease-out-cubic(0.5) * 100%) 50%,
39 mix(transparent, #000, iro-ease-out-cubic(0.75) * 100%) 75%,
40 transparent 100%
41 );
42
43 @include assert-equal($gradient2, $expected2, 'Simple radial gradient');
44
45 // ---------------------------------------------------------------------------
46
47 $gradient3: iro-easing-gradient(
48 linear,
49 to right,
50 #000 2em,
51 ease-in-quad,
52 transparent 10em
53 );
54
55 $expected3: linear-gradient(
56 to right,
57 #000 2em,
58 mix(transparent, #000, iro-ease-in-quad(0.25) * 100%) 4em,
59 mix(transparent, #000, iro-ease-in-quad(0.5) * 100%) 6em,
60 mix(transparent, #000, iro-ease-in-quad(0.75) * 100%) 8em,
61 transparent 10em
62 );
63
64 @include assert-equal($gradient3, $expected3, 'Linear gradient with positioned color stops');
65
66 // ---------------------------------------------------------------------------
67
68 $gradient4: iro-easing-gradient(
69 linear,
70 to right,
71 #000 20%,
72 ease-in-quad,
73 transparent calc(20% + 10em)
74 );
75
76 $expected4: linear-gradient(
77 to right,
78 #000 20%,
79 mix(transparent, #000, iro-ease-in-quad(0.25) * 100%) calc(20% + (20% + 10em - 20%) * 0.25),
80 mix(transparent, #000, iro-ease-in-quad(0.5) * 100%) calc(20% + (20% + 10em - 20%) * 0.5),
81 mix(transparent, #000, iro-ease-in-quad(0.75) * 100%) calc(20% + (20% + 10em - 20%) * 0.75),
82 transparent calc(20% + 10em)
83 );
84
85 @include assert-equal($gradient4, $expected4, 'More advanced linear gradient with positioned color stops');
86
87 // ---------------------------------------------------------------------------
88
89 $gradient5: iro-easing-gradient(
90 linear,
91 to right,
92 #000 2em,
93 #f00 7em,
94 ease-in-quad,
95 transparent 10em
96 );
97
98 $expected5: linear-gradient(
99 to right,
100 #000 2em,
101 #f00 7em,
102 mix(transparent, #f00, iro-ease-in-quad(0.25) * 100%) 7em + 3em * 0.25,
103 mix(transparent, #f00, iro-ease-in-quad(0.5) * 100%) 7em + 3em * 0.5,
104 mix(transparent, #f00, iro-ease-in-quad(0.75) * 100%) 7em + 3em * 0.75,
105 transparent 10em
106 );
107
108 @include assert-equal($gradient5, $expected5, 'Linear gradient with 3 positioned color stops, 1 easing transitions');
109
110 // ---------------------------------------------------------------------------
111
112 $gradient6: iro-easing-gradient(
113 linear,
114 to right,
115 #000 2em,
116 ease-in-quad,
117 #f00 7em,
118 ease-in-quad,
119 transparent 10em
120 );
121
122 $expected6: linear-gradient(
123 to right,
124 #000 2em,
125 mix(#f00, #000, iro-ease-in-quad(0.25) * 100%) 2em + 5em * 0.25,
126 mix(#f00, #000, iro-ease-in-quad(0.5) * 100%) 2em + 5em * 0.5,
127 mix(#f00, #000, iro-ease-in-quad(0.75) * 100%) 2em + 5em * 0.75,
128 #f00 7em,
129 mix(transparent, #f00, iro-ease-in-quad(0.25) * 100%) 7em + 3em * 0.25,
130 mix(transparent, #f00, iro-ease-in-quad(0.5) * 100%) 7em + 3em * 0.5,
131 mix(transparent, #f00, iro-ease-in-quad(0.75) * 100%) 7em + 3em * 0.75,
132 transparent 10em
133 );
134
135 @include assert-equal($gradient6, $expected6, 'Linear gradient with 3 positioned color stops, 2 easing transitions');
136
137 // ---------------------------------------------------------------------------
138
139 $gradient7: iro-easing-gradient(
140 linear,
141 to right,
142 #000 2em,
143 ease-in-quad,
144 #f00,
145 ease-in-quad,
146 transparent 10em
147 );
148
149 $expected7: linear-gradient(
150 to right,
151 #000 2em,
152 mix(#f00, #000, iro-ease-in-quad(0.25) * 100%) 2em + 4em * 0.25,
153 mix(#f00, #000, iro-ease-in-quad(0.5) * 100%) 2em + 4em * 0.5,
154 mix(#f00, #000, iro-ease-in-quad(0.75) * 100%) 2em + 4em * 0.75,
155 #f00 6em,
156 mix(transparent, #f00, iro-ease-in-quad(0.25) * 100%) 6em + 4em * 0.25,
157 mix(transparent, #f00, iro-ease-in-quad(0.5) * 100%) 6em + 4em * 0.5,
158 mix(transparent, #f00, iro-ease-in-quad(0.75) * 100%) 6em + 4em * 0.75,
159 transparent 10em
160 );
161
162 @include assert-equal($gradient7, $expected7, 'Linear gradient with 2 / 3 positioned color stops, 2 easing transitions');
163
164 // ---------------------------------------------------------------------------
165
166 $gradient8: iro-easing-gradient(
167 linear,
168 to right,
169 #000,
170 ease-in-quad,
171 #f00,
172 ease-in-quad,
173 transparent
174 );
175
176 $expected8: linear-gradient(
177 to right,
178 #000 0,
179 mix(#f00, #000, iro-ease-in-quad(0.25) * 100%) 50% * 0.25,
180 mix(#f00, #000, iro-ease-in-quad(0.5) * 100%) 50% * 0.5,
181 mix(#f00, #000, iro-ease-in-quad(0.75) * 100%) 50% * 0.75,
182 #f00 50%,
183 mix(transparent, #f00, iro-ease-in-quad(0.25) * 100%) 50% + 50% * 0.25,
184 mix(transparent, #f00, iro-ease-in-quad(0.5) * 100%) 50% + 50% * 0.5,
185 mix(transparent, #f00, iro-ease-in-quad(0.75) * 100%) 50% + 50% * 0.75,
186 transparent 100%
187 );
188
189 @include assert-equal($gradient8, $expected8, 'Linear gradient with 0 / 3 positioned color stops, 2 easing transitions');
190
191 // ---------------------------------------------------------------------------
192
193 $gradient9: iro-easing-gradient(
194 linear,
195 to right,
196 #000,
197 ease-in-quad,
198 #f00,
199 ease-in-quad,
200 transparent 20em
201 );
202
203 $expected9: linear-gradient(
204 to right,
205 #000 0,
206 mix(#f00, #000, iro-ease-in-quad(0.25) * 100%) 10em * 0.25,
207 mix(#f00, #000, iro-ease-in-quad(0.5) * 100%) 10em * 0.5,
208 mix(#f00, #000, iro-ease-in-quad(0.75) * 100%) 10em * 0.75,
209 #f00 10em,
210 mix(transparent, #f00, iro-ease-in-quad(0.25) * 100%) 10em + 10em * 0.25,
211 mix(transparent, #f00, iro-ease-in-quad(0.5) * 100%) 10em + 10em * 0.5,
212 mix(transparent, #f00, iro-ease-in-quad(0.75) * 100%) 10em + 10em * 0.75,
213 transparent 20em
214 );
215
216 @include assert-equal($gradient9, $expected9, 'Linear gradient with 1 / 3 positioned color stops, 2 easing transitions');
217
218 // ---------------------------------------------------------------------------
219
220 $gradient10: iro-easing-gradient(
221 linear,
222 to right,
223 #000,
224 cubic-bezier 0.47 0 0.745 0.715,
225 transparent
226 );
227
228 $expected10: linear-gradient(
229 to right,
230 #000 0,
231 mix(transparent, #000, iro-cubic-bezier(0.47, 0, 0.745, 0.715, 0.25) * 100%) 25%,
232 mix(transparent, #000, iro-cubic-bezier(0.47, 0, 0.745, 0.715, 0.5) * 100%) 50%,
233 mix(transparent, #000, iro-cubic-bezier(0.47, 0, 0.745, 0.715, 0.75) * 100%) 75%,
234 transparent 100%
235 );
236
237 @include assert-equal($gradient10, $expected10, 'Simple linear gradient with custom cubic-bezier easing');
238
239 // ---------------------------------------------------------------------------
240
241 $gradient11: iro-easing-gradient(
242 linear,
243 to right,
244 #000,
245 steps 4 jump-start,
246 transparent
247 );
248
249 $expected11: linear-gradient(
250 to right,
251 #000 0,
252 mix(transparent, #000, 0.25 * 100%) 0,
253 mix(transparent, #000, 0.25 * 100%) 25%,
254 mix(transparent, #000, 0.5 * 100%) 25%,
255 mix(transparent, #000, 0.5 * 100%) 50%,
256 mix(transparent, #000, 0.75 * 100%) 50%,
257 mix(transparent, #000, 0.75 * 100%) 75%,
258 transparent 75%,
259 transparent 100%
260 );
261
262 @include assert-equal($gradient11, $expected11, 'Simple linear gradient with custom steps easing');
263 }
264}
diff --git a/test/_harmony.scss b/test/_harmony.scss
new file mode 100644
index 0000000..25560f0
--- /dev/null
+++ b/test/_harmony.scss
@@ -0,0 +1,249 @@
1@function _limit-decimals($n) {
2 @return floor($n * 1000) / 1000;
3}
4
5@include describe('Harmony') {
6 @include it('iro-harmony-modular-scale') {
7 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(0, 1em, 1.1)), 1em, 'Zero iterations, 1em base, 1.1 scale');
8 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(1, 1em, 1.1)), 1.1em, '1 iteration, 1em base, 1.1 scale');
9 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(2, 2px, 1.2)), 2.88px, '2 iterations, 2px base, 1.2 scale');
10 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(-1, 2rem, 2)), 1rem, '-1 iteration, 2rem base, 2 scale');
11 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(-2, 2rem, 2)), 0.5rem, '-2 iterations, 2rem base, 2 scale');
12
13 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(0, 1em 2em, 1.1)), 1em, 'Zero iterations, 1em 2em base, 1.1 scale');
14 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(1, 1em 2em, 1.1)), 1.026em, '1 iteration, 1em 2em base, 1.1 scale');
15 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(2, 1em 2em, 1.1)), 1.1em, '2 iterations, 1em 2em base, 1.1 scale');
16 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(-1, 1em 1.5em, 1.2)), 0.868em, '-1 iteration, 1em 2em base, 1.1 scale');
17 @include assert-equal(_limit-decimals(iro-harmony-modular-scale(-2, 1em 1.5em, 1.2)), 0.833em, '-2 iterations, 1em 2em base, 1.1 scale');
18 }
19
20 @include it('iro-responsive-modular-scale') {
21 @include assert('Single-stranded, fluid') {
22 $ms: (
23 320px: (1rem, 1.1),
24 640px: (1rem, 1.2)
25 );
26
27 $rem320px: iro-px-to-rem(320px);
28 $rem640px: iro-px-to-rem(640px);
29 $diff320px: iro-strip-unit($rem640px - $rem320px);
30
31 @include output {
32 h3 {
33 @include iro-responsive-modular-scale(font-size, 0, $ms);
34 }
35
36 h2 {
37 @include iro-responsive-modular-scale(font-size, 1, $ms);
38 }
39
40 h1 {
41 @include iro-responsive-modular-scale(font-size, 2, $ms);
42 }
43 }
44
45 @include expect {
46 h3 {
47 font-size: 1rem;
48
49 @media (min-width: 320px) and (max-width: 640px) {
50 font-size: calc(1rem + 0 * ((100vw - #{$rem320px}) / #{$diff320px}));
51 }
52
53 @media (min-width: 640px) {
54 font-size: 1rem;
55 }
56 }
57
58 h2 {
59 font-size: 1.1rem;
60
61 @media (min-width: 320px) and (max-width: 640px) {
62 font-size: calc(1.1rem + 0.1 * ((100vw - #{$rem320px}) / #{$diff320px}));
63 }
64
65 @media (min-width: 640px) {
66 font-size: 1.2rem;
67 }
68 }
69
70 h1 {
71 font-size: 1.21rem;
72
73 @media (min-width: 320px) and (max-width: 640px) {
74 font-size: calc(1.21rem + 0.23 * ((100vw - #{$rem320px}) / #{$diff320px}));
75 }
76
77 @media (min-width: 640px) {
78 font-size: 1.44rem;
79 }
80 }
81 }
82 }
83
84 @include assert('Single-stranded, non-fluid') {
85 $ms: (
86 320px: (1rem, 1.1),
87 640px: (1rem, 1.2)
88 );
89
90 $rem320px: iro-px-to-rem(320px);
91 $rem640px: iro-px-to-rem(640px);
92 $diff320px: iro-strip-unit($rem640px - $rem320px);
93
94 @include output {
95 h3 {
96 @include iro-responsive-modular-scale(font-size, 0, $ms, false);
97 }
98
99 h2 {
100 @include iro-responsive-modular-scale(font-size, 1, $ms, false);
101 }
102
103 h1 {
104 @include iro-responsive-modular-scale(font-size, 2, $ms, false);
105 }
106 }
107
108 @include expect {
109 h3 {
110 font-size: 1rem;
111
112 @media (min-width: 640px) {
113 font-size: 1rem;
114 }
115 }
116
117 h2 {
118 font-size: 1.1rem;
119
120 @media (min-width: 640px) {
121 font-size: 1.2rem;
122 }
123 }
124
125 h1 {
126 font-size: 1.21rem;
127
128 @media (min-width: 640px) {
129 font-size: 1.44rem;
130 }
131 }
132 }
133 }
134
135 @include assert('Double-stranded, fluid') {
136 $ms: (
137 320px: (1rem 2rem, 1.1),
138 640px: (1rem 2rem, 1.2)
139 );
140
141 $rem320px: iro-px-to-rem(320px);
142 $rem640px: iro-px-to-rem(640px);
143 $diff320px: iro-strip-unit($rem640px - $rem320px);
144
145 @include output {
146 h3 {
147 @include iro-responsive-modular-scale(font-size, 0, $ms);
148 }
149
150 h2 {
151 @include iro-responsive-modular-scale(font-size, 1, $ms);
152 }
153
154 h1 {
155 @include iro-responsive-modular-scale(font-size, 2, $ms);
156 }
157 }
158
159 @include expect {
160 h3 {
161 font-size: 1rem;
162
163 @media (min-width: 320px) and (max-width: 640px) {
164 font-size: calc(1rem + 0 * ((100vw - #{$rem320px}) / #{$diff320px}));
165 }
166
167 @media (min-width: 640px) {
168 font-size: 1rem;
169 }
170 }
171
172 h2 {
173 font-size: 1.0263162365rem;
174
175 @media (min-width: 320px) and (max-width: 640px) {
176 font-size: calc(1.0263162365rem + 0.1310911709 * ((100vw - #{$rem320px}) / #{$diff320px}));
177 }
178
179 @media (min-width: 640px) {
180 font-size: 1.1574074074rem;
181 }
182 }
183
184 h1 {
185 font-size: 1.1rem;
186
187 @media (min-width: 320px) and (max-width: 640px) {
188 font-size: calc(1.1rem + 0.1 * ((100vw - #{$rem320px}) / #{$diff320px}));
189 }
190
191 @media (min-width: 640px) {
192 font-size: 1.2rem;
193 }
194 }
195 }
196 }
197
198 @include assert('Double-stranded, non-fluid') {
199 $ms: (
200 320px: (1rem 2rem, 1.1),
201 640px: (1rem 2rem, 1.2)
202 );
203
204 $rem320px: iro-px-to-rem(320px);
205 $rem640px: iro-px-to-rem(640px);
206 $diff320px: iro-strip-unit($rem640px - $rem320px);
207
208 @include output {
209 h3 {
210 @include iro-responsive-modular-scale(font-size, 0, $ms, false);
211 }
212
213 h2 {
214 @include iro-responsive-modular-scale(font-size, 1, $ms, false);
215 }
216
217 h1 {
218 @include iro-responsive-modular-scale(font-size, 2, $ms, false);
219 }
220 }
221
222 @include expect {
223 h3 {
224 font-size: 1rem;
225
226 @media (min-width: 640px) {
227 font-size: 1rem;
228 }
229 }
230
231 h2 {
232 font-size: 1.0263162365rem;;
233
234 @media (min-width: 640px) {
235 font-size: 1.1574074074rem;;
236 }
237 }
238
239 h1 {
240 font-size: 1.1rem;
241
242 @media (min-width: 640px) {
243 font-size: 1.2rem;
244 }
245 }
246 }
247 }
248 }
249}
diff --git a/test/_math.scss b/test/_math.scss
new file mode 100644
index 0000000..5f40499
--- /dev/null
+++ b/test/_math.scss
@@ -0,0 +1,21 @@
1// sass-lint:disable empty-args
2
3@include describe('Math') {
4 @include it('iro-math-pow') {
5 @include assert-equal(iro-math-pow(2, 2), 2 * 2, '2^2');
6 @include assert-equal(iro-math-pow(2, 3), 2 * 2 * 2, '2^3');
7 @include assert-equal(iro-math-pow(4, 3), 4 * 4 * 4, '4^3');
8 @include assert-equal(iro-math-pow(3, -1), 1 / 3, '3^(-1)');
9 @include assert-equal(iro-math-pow(4, -2), 1 / (4 * 4), '4^(-2)');
10 @include assert-equal(iro-math-pow(3, 0), 1, '3^0');
11 }
12
13 @include it('iro-math-clamp') {
14 @include assert-equal(iro-math-clamp(0, 0, 10), 0, '0 in [0, 10]');
15 @include assert-equal(iro-math-clamp(10, 0, 10), 10, '10 in [0, 10]');
16 @include assert-equal(iro-math-clamp(20, 0, 10), 10, '20 in [0, 10]');
17 @include assert-equal(iro-math-clamp(3, 10, 20), 10, '3 in [10, 20]');
18 @include assert-equal(iro-math-clamp(-5, -30, -10), -10, '-5 in [-30, -10]');
19 @include assert-equal(iro-math-clamp(-5, -30, -2), -5, '-5 in [-30, -2]');
20 }
21}
diff --git a/test/_props.scss b/test/_props.scss
new file mode 100644
index 0000000..4e0a5b4
--- /dev/null
+++ b/test/_props.scss
@@ -0,0 +1,282 @@
1// sass-lint:disable empty-args
2
3@include describe('Property trees') {
4 @include it('Validate names') {
5 $map-valid: (
6 --background: #fff,
7 --text: #000,
8 --buttons: (
9 --primary: (
10 --background: #f00,
11 --text: #fff
12 )
13 )
14 );
15
16 $map-invalid: (
17 --background: #fff,
18 --text: #000,
19 --buttons: (
20 --primary: (
21 background: #f00,
22 text: #fff
23 )
24 )
25 );
26
27 @include assert-equal(iro-props-validate($map-valid), true, 'Check valid map');
28 @include assert-equal(iro-props-validate($map-invalid), false, 'Check invalid map');
29 }
30
31 @include it('Save / Delete') {
32 $map: (
33 --background: #fff,
34 --text: #000,
35 --buttons: (
36 --primary: (
37 --background: #f00,
38 --text: #fff
39 ),
40 --default: (
41 --background: #ddd,
42 --text: #000
43 )
44 )
45 );
46
47 @include assert-equal(iro-props-save($map), null, 'Save default tree');
48 @include assert-equal(iro-props-delete(), null, 'Delete default tree');
49 }
50
51 @include it('Read') {
52 $map1: (
53 --background: #fff,
54 --text: #000,
55 --buttons: (
56 --primary: (
57 --background: #f00,
58 --text: #fff
59 ),
60 --default: (
61 --background: #ddd,
62 --text: #000
63 )
64 )
65 );
66
67 $map2: (
68 --background: #222,
69 --text: #fff,
70 --buttons: (
71 --primary: (
72 --background: #f00,
73 --text: #fff
74 ),
75 --default: (
76 --background: #444,
77 --text: #fff
78 )
79 )
80 );
81
82 @include assert-equal(iro-props-save($map1), null, 'Save default tree');
83 @include assert-equal(iro-props-save($map2, 'test'), null, 'Save "test" tree');
84
85 @include assert-equal(iro-props-get(--background), map-get($map1, --background), 'Get --background in default');
86 @include assert-equal(iro-props-get(--buttons --primary --background), map-get(map-get(map-get($map1, --buttons), --primary), --background), 'Get --buttons --primary --background in default');
87 @include assert-equal(iro-props-get(--buttons --default --text), map-get(map-get(map-get($map1, --buttons), --default), --text), 'Get --buttons --default --text in default');
88 @include assert-equal(iro-props-get(--box, $default: false), false, 'Get nonexistent in default');
89
90 @include assert-equal(iro-props-get(--background, 'test'), map-get($map2, --background), 'Get --background in "test"');
91 @include assert-equal(iro-props-get(--buttons --primary --background, 'test'), map-get(map-get(map-get($map2, --buttons), --primary), --background), 'Get --buttons --primary --background in "test"');
92 @include assert-equal(iro-props-get(--buttons --default --text, 'test'), map-get(map-get(map-get($map2, --buttons), --default), --text), 'Get --buttons --default --text in "test"');
93 @include assert-equal(iro-props-get(--box, 'test', $default: false), false, 'Get nonexistent in "test"');
94
95 @include assert-equal(iro-props-delete(), null, 'Delete default tree');
96 @include assert-equal(iro-props-delete('test'), null, 'Delete "test" tree');
97 }
98
99 @include it('Overwrite') {
100 $map1: (
101 --background: #fff,
102 --text: #000,
103 --buttons: (
104 --primary: (
105 --background: #f00,
106 --text: #fff
107 )
108 )
109 );
110
111 $map2: (
112 --background: #eee,
113 --buttons: (
114 --primary: (
115 --background: #00f
116 ),
117 --default: (
118 --background: #444,
119 --text: #fff
120 )
121 )
122 );
123
124 @include assert-equal(iro-props-save($map1), null, 'Save default tree');
125
126 @include assert-equal(iro-props-get(), $map1, 'Before update, get whole map');
127 @include assert-equal(iro-props-get(--background), map-get($map1, --background), 'Before update, get --background');
128 @include assert-equal(iro-props-get(--text), map-get($map1, --text), 'Before update, get --text');
129 @include assert-equal(iro-props-get(--buttons --primary --background), map-get(map-get(map-get($map1, --buttons), --primary), --background), 'Before update, get --buttons --primary --background');
130 @include assert-equal(iro-props-get(--buttons --default --text, $default: false), false, 'Before update, get --buttons --default --text (returns default)');
131
132 @include assert-equal(iro-props-save($map2, $merge: true), null, 'Overwrite default tree');
133
134 @include assert-equal(iro-props-get(), iro-map-merge-recursive($map1, $map2), 'After update, get whole map');
135 @include assert-equal(iro-props-get(--background), map-get($map2, --background), 'After update, get --background');
136 @include assert-equal(iro-props-get(--text), map-get($map1, --text), 'After update, get --text');
137 @include assert-equal(iro-props-get(--buttons --primary --background), map-get(map-get(map-get($map2, --buttons), --primary), --background), 'After update, get --buttons --primary --background');
138 @include assert-equal(iro-props-get(--buttons --default --text), map-get(map-get(map-get($map2, --buttons), --default), --text), 'After update, get --buttons --default --text');
139
140 @include assert-equal(iro-props-delete(), null, 'Delete default tree');
141 }
142
143 @include it('Native assignment') {
144 @include assert('Simple') {
145 $map: (
146 --background: #fff,
147 --text: #000,
148 --buttons: (
149 --primary: (
150 --background: #f00,
151 --text: #fff
152 ),
153 --default: (
154 --background: #ddd,
155 --text: #000
156 )
157 )
158 );
159
160 @include iro-props-save($map);
161
162 @include output {
163 @include iro-props-assign-native;
164 }
165
166 @include expect {
167 --background: #{map-get($map, --background)};
168 --text: #{map-get($map, --text)};
169 --buttons--primary--background: #{map-get(map-get(map-get($map, --buttons), --primary), --background)};
170 --buttons--primary--text: #{map-get(map-get(map-get($map, --buttons), --primary), --text)};
171 --buttons--default--background: #{map-get(map-get(map-get($map, --buttons), --default), --background)};
172 --buttons--default--text: #{map-get(map-get(map-get($map, --buttons), --default), --text)};
173 }
174
175 @include iro-props-delete;
176 }
177
178 @include assert('Filtered') {
179 $map: (
180 --background: #fff,
181 --text: #000,
182 --buttons: (
183 --primary: (
184 --background: #f00,
185 --text: #fff
186 ),
187 --default: (
188 --background: #ddd,
189 --text: #000
190 )
191 )
192 );
193
194 @include iro-props-save($map);
195
196 @include output {
197 @include iro-props-assign-native($skip: --buttons);
198 }
199
200 @include expect {
201 --background: #{map-get($map, --background)};
202 --text: #{map-get($map, --text)};
203 }
204
205 @include iro-props-delete;
206 }
207 }
208
209 @include it('Native get') {
210 $map: (
211 --background: #fff,
212 --text: #000,
213 --buttons: (
214 --primary: (
215 --background: #f00,
216 --text: #fff
217 ),
218 --default: (
219 --background: #ddd,
220 --text: #000
221 )
222 )
223 );
224
225 @include assert-equal(iro-props-save($map), null, 'Save default tree');
226
227 @include assert-equal(iro-props-get-native(--background), var(--background), 'Get --background');
228 @include assert-equal(iro-props-get-native(--buttons --primary --text), var(--buttons--primary--text), 'Get --buttons --primary --text');
229 @include assert-equal(iro-props-get-native(--buttons --secondary --text, $default: false), var(--buttons--secondary--text, false), 'Get --buttons --secondary --text with default');
230
231 @include assert-equal(iro-props-delete(), null, 'Delete default tree');
232 }
233
234 @include it('References') {
235 $map1: (
236 --background: #fff,
237 --text: #000,
238 --buttons: (
239 --primary: (
240 --background: #f00,
241 --text: #fff
242 )
243 )
244 );
245
246 $map2: (
247 --background: #eee,
248 --buttons: (
249 --primary: (
250 --background: iro-props-ref($key: --background)
251 ),
252 --default: iro-props-ref($key: --buttons --primary)
253 )
254 );
255
256 @include assert-equal(iro-props-save($map1), null, 'Save default tree');
257 @include assert-equal(iro-props-save($map2, 'second'), null, 'Save "second" tree');
258
259 @include assert-equal(iro-props-get(--buttons --primary --background, 'second'), map-get($map1, --background), 'Get referenced value');
260 @include assert-equal(iro-props-get-native(--buttons --primary --background, 'second'), var(--buttons--primary--background), 'Get referenced value, native');
261
262 @include assert-equal(iro-props-get(--buttons --default, 'second'), map-get(map-get($map1, --buttons), --primary), 'Get referenced subtree, whole');
263 @include assert-equal(iro-props-get(--buttons --default --background, 'second'), map-get(map-get(map-get($map1, --buttons), --primary), --background), 'Get referenced subtree, inner value');
264 @include assert-equal(iro-props-get-native(--buttons --default --background, 'second'), var(--buttons--default--background), 'Get referenced subtree, native');
265
266 @include assert('Native assignment') {
267 @include output {
268 @include iro-props-assign-native('second');
269 }
270
271 @include expect {
272 --background: #{map-get($map2, --background)};
273 --buttons--primary--background: #{map-get($map1, --background)};
274 --buttons--default--background: #{map-get(map-get(map-get($map1, --buttons), --primary), --background)};
275 --buttons--default--text: #{map-get(map-get(map-get($map1, --buttons), --primary), --text)};
276 }
277 }
278
279 @include assert-equal(iro-props-delete(), null, 'Delete default tree');
280 @include assert-equal(iro-props-delete('second'), null, 'Delete "second" tree');
281 }
282}
diff --git a/test/_responsive.scss b/test/_responsive.scss
new file mode 100644
index 0000000..cdda40c
--- /dev/null
+++ b/test/_responsive.scss
@@ -0,0 +1,9 @@
1@include describe('Responsive') {
2 @include it('iro-responsive-fluid-calc') {
3 $rem600px: iro-px-to-rem(600px);
4 $rem800px: iro-px-to-rem(800px);
5
6 @include assert-equal(iro-responsive-fluid-calc(2rem, 4rem, 600px, 800px), 'calc(2rem + 2 * ((100vw - #{$rem600px}) / #{iro-strip-unit($rem800px - $rem600px)}))', 'Responsive value from 2rem to 4rem over 600px to 800px');
7 @include assert-equal(iro-responsive-fluid-calc(4px, 12px, 600px, 800px), 'calc(4px + 8 * ((100vw - 600px) / 200))', 'Responsive value from 4px to 12px over 600px to 800px');
8 }
9}
diff --git a/test/bem/_examples.scss b/test/bem/_examples.scss
new file mode 100644
index 0000000..243ee35
--- /dev/null
+++ b/test/bem/_examples.scss
@@ -0,0 +1,224 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations no-empty-rulesets
2
3//
4// Included test cases:
5// - /// 1 /// - Media object
6// - /// 2 /// - Tabs
7/// - /// 3 /// - Accordion
8//
9
10@include it('Examples') {
11 @include assert('Media object') { /// 1 ///
12 @include output {
13 @include iro-bem-object('media') {
14 display: flex;
15 align-items: flex-start;
16 justify-content: flex-start;
17
18 @include iro-bem-element('image') {
19 display: block;
20 flex: 0 0 auto;
21 order: 1;
22 overflow: hidden;
23 }
24
25 @include iro-bem-element('body') {
26 order: 2;
27 }
28
29 @include iro-bem-modifier('rtl') {
30 justify-content: flex-end;
31
32 @include iro-bem-element('image') {
33 order: 2;
34 }
35
36 @include iro-bem-element('body') {
37 order: 1;
38 }
39 }
40 }
41 }
42
43 @include expect {
44 .o-media {
45 display: flex;
46 align-items: flex-start;
47 justify-content: flex-start;
48 }
49
50 .o-media__image {
51 display: block;
52 flex: 0 0 auto;
53 order: 1;
54 overflow: hidden;
55 }
56
57 .o-media__body {
58 order: 2;
59 }
60
61 .o-media--rtl {
62 justify-content: flex-end;
63
64 .o-media__image {
65 order: 2;
66 }
67
68 .o-media__body {
69 order: 1;
70 }
71 }
72 }
73 }
74
75 @include assert('Tabs') { /// 2 ///
76 @include output {
77 @include iro-bem-component('tabs') {
78 position: relative;
79
80 @include iro-bem-element('tab') {
81 float: left;
82 }
83
84 @include iro-bem-element('tabRadio') {
85 position: absolute;
86 top: -9999px;
87 left: -9999px;
88
89 &:checked {
90 @include iro-bem-sibling-element('tabLabel') {
91 font-weight: bold;
92 }
93
94 @include iro-bem-sibling-element('tabContent') {
95 display: block;
96 }
97 }
98 }
99
100 @include iro-bem-element('tabLabel') {
101 cursor: pointer;
102
103 &:hover,
104 &:active {
105 text-decoration: underline;
106 }
107 }
108
109 @include iro-bem-element('tabContent') {
110 position: absolute;
111 left: 0;
112 display: none;
113 }
114 }
115 }
116
117 @include expect {
118 .c-tabs {
119 position: relative;
120 }
121
122 .c-tabs__tab {
123 float: left;
124 }
125
126 .c-tabs__tabRadio {
127 position: absolute;
128 top: -9999px;
129 left: -9999px;
130 }
131
132 .c-tabs__tabRadio:checked ~ .c-tabs__tabLabel {
133 font-weight: bold;
134 }
135
136 .c-tabs__tabRadio:checked ~ .c-tabs__tabContent {
137 display: block;
138 }
139
140 .c-tabs__tabLabel {
141 cursor: pointer;
142 }
143
144 .c-tabs__tabLabel:hover,
145 .c-tabs__tabLabel:active {
146 text-decoration: underline;
147 }
148
149 .c-tabs__tabContent {
150 position: absolute;
151 left: 0;
152 display: none;
153 }
154 }
155 }
156
157 @include assert('Accordion') { /// 3 ///
158 @include output {
159 @include iro-bem-component('accordion') {
160 @include iro-bem-element('section') {
161 // nothing to do
162 }
163
164 @include iro-bem-element('sectionCheckbox') {
165 position: absolute;
166 top: -9999px;
167 left: -9999px;
168
169 &:checked {
170 @include iro-bem-sibling-element('sectionLabel') {
171 font-weight: bold;
172 }
173
174 @include iro-bem-sibling-element('sectionContent') {
175 display: block;
176 }
177 }
178 }
179
180 @include iro-bem-element('sectionLabel') {
181 cursor: pointer;
182
183 &:hover,
184 &:active {
185 text-decoration: underline;
186 }
187 }
188
189 @include iro-bem-element('sectionContent') {
190 display: none;
191 }
192 }
193 }
194
195 @include expect {
196 .c-accordion__sectionCheckbox {
197 position: absolute;
198 top: -9999px;
199 left: -9999px;
200 }
201
202 .c-accordion__sectionCheckbox:checked ~ .c-accordion__sectionLabel {
203 font-weight: bold;
204 }
205
206 .c-accordion__sectionCheckbox:checked ~ .c-accordion__sectionContent {
207 display: block;
208 }
209
210 .c-accordion__sectionLabel {
211 cursor: pointer;
212 }
213
214 .c-accordion__sectionLabel:hover,
215 .c-accordion__sectionLabel:active {
216 text-decoration: underline;
217 }
218
219 .c-accordion__sectionContent {
220 display: none;
221 }
222 }
223 }
224}
diff --git a/test/bem/_iro-bem-at-theme.scss b/test/bem/_iro-bem-at-theme.scss
new file mode 100644
index 0000000..d2d0696
--- /dev/null
+++ b/test/bem/_iro-bem-at-theme.scss
@@ -0,0 +1,55 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - single theme
6// - /// 2 /// - with sub-theme
7//
8
9@include it('iro-bem-at-theme') {
10 @include assert('single theme') { /// 1 ///
11 @include output(false) {
12 @include iro-bem-block('something') {
13 @include iro-bem-at-theme('theme') {
14 font-size: 2em;
15 }
16 }
17 }
18
19 @include expect(false) {
20 .t-theme .something,
21 [class*=' t-'] .t-theme .something,
22 [class^='t-'] .t-theme .something {
23 font-size: 2em;
24 }
25 }
26 }
27
28 @include assert('with sub-theme') { /// 2 ///
29 @include output(false) {
30 @include iro-bem-block('something') {
31 @include iro-bem-at-theme('theme') {
32 font-size: 2em;
33 }
34
35 @include iro-bem-at-theme('theme', 'subtheme') {
36 font-size: 3em;
37 }
38 }
39 }
40
41 @include expect(false) {
42 .t-theme .something,
43 [class*=' t-'] .t-theme .something,
44 [class^='t-'] .t-theme .something {
45 font-size: 2em;
46 }
47
48 .t-theme .t-subtheme .something,
49 [class*=' t-'] .t-theme .t-subtheme .something,
50 [class^='t-'] .t-theme .t-subtheme .something {
51 font-size: 3em;
52 }
53 }
54 }
55}
diff --git a/test/bem/_iro-bem-block.scss b/test/bem/_iro-bem-block.scss
new file mode 100644
index 0000000..a93d803
--- /dev/null
+++ b/test/bem/_iro-bem-block.scss
@@ -0,0 +1,85 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - without namespace
6// - /// 2 /// - with namespace
7// - /// 3 /// - nested
8// - /// 4 /// - within selector
9//
10
11@include it('iro-bem-block') {
12 @include assert('without namespace') { /// 1 ///
13 @include output(false) {
14 @include iro-bem-block('something') {
15 font-size: 1em;
16 }
17 }
18
19 @include expect(false) {
20 .something {
21 font-size: 1em;
22 }
23 }
24 }
25
26 @each $ns in map-keys($iro-bem-namespaces) {
27 @include assert('with namespace "#{$ns}"') { /// 2 ///
28 @include output(false) {
29 @include iro-bem-block('something', $ns) {
30 font-size: 1em;
31 }
32 }
33
34 @include expect(false) {
35 @if $ns != 'theme' {
36 .#{map-get($iro-bem-namespaces, $ns)}-something {
37 font-size: 1em;
38 }
39 } @else {
40 .t-something,
41 [class*=' t-'] .t-something,
42 [class^='t-'] .t-something {
43 font-size: 1em;
44 }
45 }
46 }
47 }
48 }
49
50 @include assert('nested') { /// 3 ///
51 @include output(false) {
52 @include iro-bem-theme('theme') {
53 @include iro-bem-theme('subtheme') {
54 @include iro-bem-block('something') {
55 font-size: 2em;
56 }
57 }
58 }
59 }
60
61 @include expect(false) {
62 .t-theme .t-subtheme .something,
63 [class*=' t-'] .t-theme .t-subtheme .something,
64 [class^='t-'] .t-theme .t-subtheme .something {
65 font-size: 2em;
66 }
67 }
68 }
69
70 @include assert('within selector') { /// 4 ///
71 @include output(false) {
72 .sel {
73 @include iro-bem-block('something') {
74 font-size: 2em;
75 }
76 }
77 }
78
79 @include expect(false) {
80 .sel .something {
81 font-size: 2em;
82 }
83 }
84 }
85}
diff --git a/test/bem/_iro-bem-composed-of.scss b/test/bem/_iro-bem-composed-of.scss
new file mode 100644
index 0000000..e724eb8
--- /dev/null
+++ b/test/bem/_iro-bem-composed-of.scss
@@ -0,0 +1,149 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - without namespace, single
6// - /// 2 /// - with namespace, single
7// - /// 3 /// - without namespace, multiple
8// - /// 4 /// - with namespace, multiple
9//
10
11@include it('iro-bem-composed-of') {
12 @include assert('without namespace, single') { /// 1 ///
13 @include output(false) {
14 @include iro-bem-block('something') {
15 font-size: 1em;
16 }
17
18 @include iro-bem-block('another') {
19 @include iro-bem-composed-of('something');
20
21 font-size: 2em;
22 }
23 }
24
25 @include expect(false) {
26 .something {
27 font-size: 1em;
28 }
29
30 .another {
31 font-size: 2em;
32 }
33 }
34 }
35
36 @each $ns in map-keys($iro-bem-namespaces) {
37 @include assert('with namespace "#{$ns}", single') { /// 2 ///
38 @include output(false) {
39 @include iro-bem-block('something', $ns) {
40 font-size: 1em;
41 }
42
43 @include iro-bem-block('another') {
44 @include iro-bem-composed-of('something' $ns);
45
46 font-size: 2em;
47 }
48 }
49
50 @include expect(false) {
51 @if $ns != 'theme' {
52 .#{map-get($iro-bem-namespaces, $ns)}-something {
53 font-size: 1em;
54 }
55 } @else {
56 .t-something,
57 [class*=' t-'] .t-something,
58 [class^='t-'] .t-something {
59 font-size: 1em;
60 }
61 }
62
63 .another {
64 font-size: 2em;
65 }
66 }
67 }
68 }
69
70 @include assert('without namespace, multiple') { /// 3 ///
71 @include output(false) {
72 @include iro-bem-block('something') {
73 font-size: 1em;
74 }
75
76 @include iro-bem-block('somethingElse') {
77 font-size: 1em;
78 }
79
80 @include iro-bem-block('another') {
81 @include iro-bem-composed-of('something', 'somethingElse');
82
83 font-size: 2em;
84 }
85 }
86
87 @include expect(false) {
88 .something {
89 font-size: 1em;
90 }
91
92 .somethingElse {
93 font-size: 1em;
94 }
95
96 .another {
97 font-size: 2em;
98 }
99 }
100 }
101
102 @each $ns in map-keys($iro-bem-namespaces) {
103 @include assert('with namespace "#{$ns}", multiple') { /// 4 ///
104 @include output(false) {
105 @include iro-bem-block('something', $ns) {
106 font-size: 1em;
107 }
108
109 @include iro-bem-block('somethingElse', $ns) {
110 font-size: 1em;
111 }
112
113 @include iro-bem-block('another') {
114 @include iro-bem-composed-of('something' $ns, 'somethingElse' $ns);
115
116 font-size: 2em;
117 }
118 }
119
120 @include expect(false) {
121 @if $ns != 'theme' {
122 .#{map-get($iro-bem-namespaces, $ns)}-something {
123 font-size: 1em;
124 }
125
126 .#{map-get($iro-bem-namespaces, $ns)}-somethingElse {
127 font-size: 1em;
128 }
129 } @else {
130 .t-something,
131 [class*=' t-'] .t-something,
132 [class^='t-'] .t-something {
133 font-size: 1em;
134 }
135
136 .t-somethingElse,
137 [class*=' t-'] .t-somethingElse,
138 [class^='t-'] .t-somethingElse {
139 font-size: 1em;
140 }
141 }
142
143 .another {
144 font-size: 2em;
145 }
146 }
147 }
148 }
149}
diff --git a/test/bem/_iro-bem-element.scss b/test/bem/_iro-bem-element.scss
new file mode 100644
index 0000000..f69f133
--- /dev/null
+++ b/test/bem/_iro-bem-element.scss
@@ -0,0 +1,491 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - single element
6// - /// 2 /// - single element, manual selector in-between
7// - /// 3 /// - single element, modifier in-between
8// - /// 4 /// - single element, nested
9// - /// 5 /// - single element, nested, manual selector in-between
10// - /// 6 /// - single element, nested, modifier in-between
11// - /// 7 /// - single element, in at-theme
12// - /// 8 /// - multiple elements
13// - /// 9 /// - multiple elements, manual selector in-between
14// - /// 10 /// - multiple elements, modifier in-between
15// - /// 11 /// - multiple elements, nested
16// - /// 12 /// - multiple elements, nested, manual selector in-between
17// - /// 13 /// - multiple elements, nested, modifier in-between
18// - /// 14 /// - single element, in at-theme
19//
20
21@include it('iro-bem-element') {
22 @include assert('single element') { /// 1 ///
23 @include output {
24 @include iro-bem-block('something') {
25 @include iro-bem-element('child') {
26 font-size: 2em;
27 }
28 }
29 }
30
31 @include expect {
32 .something__child {
33 font-size: 2em;
34 }
35 }
36 }
37
38 @include assert('single element, manual selector in-between') { /// 2 ///
39 @include output(false) {
40 @include iro-bem-block('something') {
41 &:hover {
42 @include iro-bem-element('child1') {
43 font-size: 2em;
44 }
45 }
46
47 .test & {
48 @include iro-bem-element('child2') {
49 font-size: 2em;
50 }
51 }
52 }
53 }
54
55 @include expect(false) {
56 .something:hover .something__child1 {
57 font-size: 2em;
58 }
59
60 .test .something__child2 {
61 font-size: 2em;
62 }
63 }
64 }
65
66 @include assert('single element, modifier in-between') { /// 3 ///
67 @include output {
68 @include iro-bem-block('something') {
69 @include iro-bem-modifier('mod') {
70 @include iro-bem-element('child') {
71 font-size: 2em;
72 }
73 }
74 }
75 }
76
77 @include expect {
78 .something--mod .something__child {
79 font-size: 2em;
80 }
81 }
82 }
83
84 @include assert('single element, nested') { /// 4 ///
85 @include output {
86 @include iro-bem-block('something') {
87 @include iro-bem-element('child') {
88 font-size: 2em;
89
90 @include iro-bem-element('subchild') {
91 font-size: 3em;
92 }
93 }
94 }
95 }
96
97 @include expect {
98 .something__child {
99 font-size: 2em;
100 }
101
102 .something__child .something__subchild {
103 font-size: 3em;
104 }
105 }
106 }
107
108 @include assert('single element, nested, manual selector in-between') { /// 5 ///
109 @include output(false) {
110 @include iro-bem-block('something') {
111 &:hover {
112 @include iro-bem-element('child1') {
113 font-size: 2em;
114
115 @include iro-bem-element('subchild1') {
116 font-size: 3em;
117 }
118 }
119 }
120
121 .test & {
122 @include iro-bem-element('child2') {
123 font-size: 2em;
124
125 @include iro-bem-element('subchild2') {
126 font-size: 3em;
127 }
128 }
129 }
130
131 @include iro-bem-element('child3') {
132 font-size: 2em;
133
134 &:hover {
135 @include iro-bem-element('subchild3') {
136 font-size: 3em;
137 }
138 }
139
140 .test & {
141 @include iro-bem-element('subchild4') {
142 font-size: 3em;
143 }
144 }
145 }
146 }
147 }
148
149 @include expect(false) {
150 .something:hover .something__child1 {
151 font-size: 2em;
152 }
153
154 .something:hover .something__child1 .something__subchild1 {
155 font-size: 3em;
156 }
157
158 .test .something__child2 {
159 font-size: 2em;
160 }
161
162 .test .something__child2 .something__subchild2 {
163 font-size: 3em;
164 }
165
166 .something__child3 {
167 font-size: 2em;
168 }
169
170 .something__child3:hover .something__subchild3 {
171 font-size: 3em;
172 }
173
174 .test .something__child3 .something__subchild4 {
175 font-size: 3em;
176 }
177 }
178 }
179
180 @include assert('single element, nested, modifier in-between') { /// 6 ///
181 @include output {
182 @include iro-bem-block('something') {
183 @include iro-bem-modifier('mod') {
184 @include iro-bem-element('child') {
185 font-size: 2em;
186
187 @include iro-bem-element('subchild') {
188 font-size: 3em;
189 }
190 }
191 }
192
193 @include iro-bem-element('child') {
194 font-size: 2em;
195
196 @include iro-bem-modifier('mod') {
197 @include iro-bem-element('subchild') {
198 font-size: 3em;
199 }
200 }
201 }
202 }
203 }
204
205 @include expect {
206 .something--mod .something__child {
207 font-size: 2em;
208 }
209
210 .something--mod .something__child .something__subchild {
211 font-size: 3em;
212 }
213
214 .something__child {
215 font-size: 2em;
216 }
217
218 .something__child--mod .something__subchild {
219 font-size: 3em;
220 }
221 }
222 }
223
224 @include assert('single element, in at-theme') { /// 7 ///
225 @include output(false) {
226 @include iro-bem-block('something') {
227 @include iro-bem-at-theme('dark') {
228 @include iro-bem-element('child') {
229 font-size: 2em;
230 }
231 }
232 }
233 }
234
235 @include expect(false) {
236 .t-dark .something__child,
237 [class*=' t-'] .t-dark .something__child,
238 [class^='t-'] .t-dark .something__child {
239 font-size: 2em;
240 }
241 }
242 }
243
244 @include assert('multiple elements') { /// 8 ///
245 @include output {
246 @include iro-bem-block('something') {
247 @include iro-bem-element('child1', 'child2') {
248 font-size: 2em;
249 }
250 }
251 }
252
253 @include expect {
254 .something__child1,
255 .something__child2 {
256 font-size: 2em;
257 }
258 }
259 }
260
261 @include assert('multiple elements, manual selector in-between') { /// 9 ///
262 @include output(false) {
263 @include iro-bem-block('something') {
264 &:hover {
265 @include iro-bem-element('child1', 'child2') {
266 font-size: 2em;
267 }
268 }
269
270 .test & {
271 @include iro-bem-element('child3', 'child4') {
272 font-size: 2em;
273 }
274 }
275 }
276 }
277
278 @include expect(false) {
279 .something:hover .something__child1,
280 .something:hover .something__child2 {
281 font-size: 2em;
282 }
283
284 .test .something__child3,
285 .test .something__child4 {
286 font-size: 2em;
287 }
288 }
289 }
290
291 @include assert('multiple elements, modifier in-between') { /// 10 ///
292 @include output {
293 @include iro-bem-block('something') {
294 @include iro-bem-modifier('mod') {
295 @include iro-bem-element('child1', 'child2') {
296 font-size: 2em;
297 }
298 }
299 }
300 }
301
302 @include expect {
303 .something--mod .something__child1,
304 .something--mod .something__child2 {
305 font-size: 2em;
306 }
307 }
308 }
309
310 @include assert('multiple elements, nested') { /// 11 ///
311 @include output {
312 @include iro-bem-block('something') {
313 @include iro-bem-element('child1', 'child2') {
314 font-size: 2em;
315
316 @include iro-bem-element('subchild1') {
317 font-size: 3em;
318 }
319 }
320
321 @include iro-bem-element('child3') {
322 font-size: 2em;
323
324 @include iro-bem-element('subchild2', 'subchild3') {
325 font-size: 3em;
326 }
327 }
328 }
329 }
330
331 @include expect {
332 .something__child1,
333 .something__child2 {
334 font-size: 2em;
335 }
336
337 .something__child1 .something__subchild1,
338 .something__child2 .something__subchild1 {
339 font-size: 3em;
340 }
341
342 .something__child3 {
343 font-size: 2em;
344 }
345
346 .something__child3 .something__subchild2,
347 .something__child3 .something__subchild3 {
348 font-size: 3em;
349 }
350 }
351 }
352
353 @include assert('multiple elements, nested, manual selector in-between') { /// 12 ///
354 @include output(false) {
355 @include iro-bem-block('something') {
356 @include iro-bem-element('child1', 'child2') {
357 font-size: 2em;
358
359 &:hover {
360 @include iro-bem-element('subchild1') {
361 font-size: 3em;
362 }
363 }
364
365 .test & {
366 @include iro-bem-element('subchild2') {
367 font-size: 3em;
368 }
369 }
370 }
371
372 @include iro-bem-element('child3') {
373 font-size: 2em;
374
375 &:hover {
376 @include iro-bem-element('subchild3', 'subchild4') {
377 font-size: 3em;
378 }
379 }
380
381 .test & {
382 @include iro-bem-element('subchild5', 'subchild6') {
383 font-size: 3em;
384 }
385 }
386 }
387 }
388 }
389
390 @include expect(false) {
391 .something__child1,
392 .something__child2 {
393 font-size: 2em;
394 }
395
396 .something__child1:hover .something__subchild1,
397 .something__child2:hover .something__subchild1 {
398 font-size: 3em;
399 }
400
401 .test .something__child1 .something__subchild2,
402 .test .something__child2 .something__subchild2 {
403 font-size: 3em;
404 }
405
406 .something__child3 {
407 font-size: 2em;
408 }
409
410 .something__child3:hover .something__subchild3,
411 .something__child3:hover .something__subchild4 {
412 font-size: 3em;
413 }
414
415 .test .something__child3 .something__subchild5,
416 .test .something__child3 .something__subchild6 {
417 font-size: 3em;
418 }
419 }
420 }
421
422 @include assert('multiple elements, nested, modifier in-between') { /// 13 ///
423 @include output {
424 @include iro-bem-block('something') {
425 @include iro-bem-element('child1', 'child2') {
426 font-size: 2em;
427
428 @include iro-bem-modifier('mod') {
429 @include iro-bem-element('subchild1') {
430 font-size: 3em;
431 }
432 }
433 }
434
435 @include iro-bem-element('child3') {
436 font-size: 2em;
437
438 @include iro-bem-modifier('mod') {
439 @include iro-bem-element('subchild2', 'subchild3') {
440 font-size: 3em;
441 }
442 }
443 }
444 }
445 }
446
447 @include expect {
448 .something__child1,
449 .something__child2 {
450 font-size: 2em;
451 }
452
453 .something__child1--mod .something__subchild1,
454 .something__child2--mod .something__subchild1 {
455 font-size: 3em;
456 }
457
458 .something__child3 {
459 font-size: 2em;
460 }
461
462 .something__child3--mod .something__subchild2,
463 .something__child3--mod .something__subchild3 {
464 font-size: 3em;
465 }
466 }
467 }
468
469 @include assert('multiple elements, in at-theme') { /// 14 ///
470 @include output(false) {
471 @include iro-bem-block('something') {
472 @include iro-bem-at-theme('dark') {
473 @include iro-bem-element('child1', 'child2') {
474 font-size: 2em;
475 }
476 }
477 }
478 }
479
480 @include expect(false) {
481 .t-dark .something__child1,
482 [class*=' t-'] .t-dark .something__child1,
483 [class^='t-'] .t-dark .something__child1,
484 .t-dark .something__child2,
485 [class*=' t-'] .t-dark .something__child2,
486 [class^='t-'] .t-dark .something__child2 {
487 font-size: 2em;
488 }
489 }
490 }
491}
diff --git a/test/bem/_iro-bem-modifier.scss b/test/bem/_iro-bem-modifier.scss
new file mode 100644
index 0000000..60e2fe4
--- /dev/null
+++ b/test/bem/_iro-bem-modifier.scss
@@ -0,0 +1,654 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - block modifier
6// - /// 2 /// - block modifier, in at-theme
7// - /// 3 /// - element modifier, single element
8// - /// 4 /// - element modifier, multiple elements
9// - /// 5 /// - element modifier, single related element
10// - /// 6 /// - element modifier, multiple related elements
11// - /// 7 /// - element modifier, single element, manual selector before
12// - /// 8 /// - element modifier, multiple elements, manual selector before
13// - /// 9 /// - element modifier, single related element, manual selector before
14// - /// 10 /// - element modifier, multiple related elements, manual selector before
15// - /// 11 /// - element modifier, in at-theme
16// - /// 12 /// - nested block modifiers, extending
17// - /// 13 /// - nested element modifiers, extending
18// - /// 14 /// - block and element modifiers, single element
19// - /// 15 /// - block and element modifiers, multiple elements
20//
21
22@include it('iro-bem-modifier') {
23 @include assert('block modifier') { /// 1 ///
24 @include output {
25 @include iro-bem-block('something') {
26 @include iro-bem-modifier('mod') {
27 font-size: 1.5em;
28
29 @include iro-bem-modifier('submod') {
30 font-size: 1.75em;
31 }
32 }
33 }
34 }
35
36 @include expect {
37 .something--mod {
38 font-size: 1.5em;
39 }
40
41 .something--mod.something--submod {
42 font-size: 1.75em;
43 }
44 }
45 }
46
47 @include assert('block modifier, in at-theme') { /// 2 ///
48 @include output(false) {
49 @include iro-bem-block('something') {
50 @include iro-bem-at-theme('dark') {
51 @include iro-bem-modifier('mod') {
52 font-size: 1.5em;
53
54 @include iro-bem-modifier('submod') {
55 font-size: 1.75em;
56 }
57 }
58 }
59 }
60 }
61
62 @include expect(false) {
63 .t-dark .something--mod,
64 [class*=' t-'] .t-dark .something--mod,
65 [class^='t-'] .t-dark .something--mod {
66 font-size: 1.5em;
67 }
68
69 .t-dark .something--mod.something--submod,
70 [class*=' t-'] .t-dark .something--mod.something--submod,
71 [class^='t-'] .t-dark .something--mod.something--submod {
72 font-size: 1.75em;
73 }
74 }
75 }
76
77 @include assert('element modifier, single element') { /// 3 ///
78 @include output {
79 @include iro-bem-block('something') {
80 @include iro-bem-element('child') {
81 @include iro-bem-modifier('mod') {
82 font-size: 2.5em;
83
84 @include iro-bem-modifier('submod') {
85 font-size: 2.75em;
86 }
87 }
88 }
89 }
90 }
91
92 @include expect {
93 .something__child--mod {
94 font-size: 2.5em;
95 }
96
97 .something__child--mod.something__child--submod {
98 font-size: 2.75em;
99 }
100 }
101 }
102
103 @include assert('element modifier, multiple elements') { /// 4 ///
104 @include output {
105 @include iro-bem-block('something') {
106 @include iro-bem-element('child1', 'child2') {
107 @include iro-bem-modifier('mod') {
108 font-size: 2.5em;
109
110 @include iro-bem-modifier('submod') {
111 font-size: 2.75em;
112 }
113 }
114 }
115 }
116 }
117
118 @include expect {
119 .something__child1--mod,
120 .something__child2--mod {
121 font-size: 2.5em;
122 }
123
124 .something__child1--mod.something__child1--submod,
125 .something__child2--mod.something__child2--submod {
126 font-size: 2.75em;
127 }
128 }
129 }
130
131 @include assert('element modifier, single related element') { /// 5 ///
132 @include output {
133 @include iro-bem-block('something') {
134 @include iro-bem-element('child1') {
135 @include iro-bem-next-element('child2') {
136 @include iro-bem-modifier('mod') {
137 font-size: 2.5em;
138
139 @include iro-bem-modifier('submod') {
140 font-size: 2.75em;
141 }
142 }
143 }
144 }
145 }
146 }
147
148 @include expect {
149 .something__child1 + .something__child2--mod {
150 font-size: 2.5em;
151 }
152
153 .something__child1 + .something__child2--mod.something__child2--submod {
154 font-size: 2.75em;
155 }
156 }
157 }
158
159 @include assert('element modifier, multiple related elements') { /// 6 ///
160 @include output {
161 @include iro-bem-block('something') {
162 @include iro-bem-element('child1') {
163 @include iro-bem-next-element('child2', 'child3') {
164 @include iro-bem-modifier('mod') {
165 font-size: 2.5em;
166
167 @include iro-bem-modifier('submod') {
168 font-size: 2.75em;
169 }
170 }
171 }
172 }
173 }
174 }
175
176 @include expect {
177 .something__child1 + .something__child2--mod,
178 .something__child1 + .something__child3--mod {
179 font-size: 2.5em;
180 }
181
182 .something__child1 + .something__child2--mod.something__child2--submod,
183 .something__child1 + .something__child3--mod.something__child3--submod {
184 font-size: 2.75em;
185 }
186 }
187 }
188
189 @include assert('element modifier, single element, manual selector before') { /// 7 ///
190 @include output(false) {
191 @include iro-bem-block('something') {
192 &:hover {
193 @include iro-bem-element('child1') {
194 @include iro-bem-modifier('mod') {
195 font-size: 2.5em;
196
197 @include iro-bem-modifier('submod') {
198 font-size: 2.75em;
199 }
200 }
201 }
202 }
203
204 .test & {
205 @include iro-bem-element('child2') {
206 @include iro-bem-modifier('mod') {
207 font-size: 2.5em;
208
209 @include iro-bem-modifier('submod') {
210 font-size: 2.75em;
211 }
212 }
213 }
214 }
215 }
216 }
217
218 @include expect(false) {
219 .something:hover .something__child1--mod {
220 font-size: 2.5em;
221 }
222
223 .something:hover .something__child1--mod.something__child1--submod {
224 font-size: 2.75em;
225 }
226
227 .test .something__child2--mod {
228 font-size: 2.5em;
229 }
230
231 .test .something__child2--mod.something__child2--submod {
232 font-size: 2.75em;
233 }
234 }
235 }
236
237 @include assert('element modifier, multiple elements, manual selector before') { /// 8 ///
238 @include output(false) {
239 @include iro-bem-block('something') {
240 &:hover {
241 @include iro-bem-element('child1', 'child2') {
242 @include iro-bem-modifier('mod') {
243 font-size: 2.5em;
244
245 @include iro-bem-modifier('submod') {
246 font-size: 2.75em;
247 }
248 }
249 }
250 }
251
252 .test & {
253 @include iro-bem-element('child3', 'child4') {
254 @include iro-bem-modifier('mod') {
255 font-size: 2.5em;
256
257 @include iro-bem-modifier('submod') {
258 font-size: 2.75em;
259 }
260 }
261 }
262 }
263 }
264 }
265
266 @include expect(false) {
267 .something:hover .something__child1--mod,
268 .something:hover .something__child2--mod {
269 font-size: 2.5em;
270 }
271
272 .something:hover .something__child1--mod.something__child1--submod,
273 .something:hover .something__child2--mod.something__child2--submod {
274 font-size: 2.75em;
275 }
276
277 .test .something__child3--mod,
278 .test .something__child4--mod {
279 font-size: 2.5em;
280 }
281
282 .test .something__child3--mod.something__child3--submod,
283 .test .something__child4--mod.something__child4--submod {
284 font-size: 2.75em;
285 }
286 }
287 }
288
289 @include assert('element modifier, single related element, manual selector before') { /// 9 ///
290 @include output(false) {
291 @include iro-bem-block('something') {
292 &:hover {
293 @include iro-bem-element('child1') {
294 @include iro-bem-next-element('child2') {
295 @include iro-bem-modifier('mod1') {
296 font-size: 2.5em;
297
298 @include iro-bem-modifier('submod1') {
299 font-size: 2.75em;
300 }
301 }
302 }
303 }
304 }
305
306 .test & {
307 @include iro-bem-element('child3') {
308 @include iro-bem-next-element('child4') {
309 @include iro-bem-modifier('mod1') {
310 font-size: 2.5em;
311
312 @include iro-bem-modifier('submod1') {
313 font-size: 2.75em;
314 }
315 }
316 }
317 }
318 }
319
320 @include iro-bem-element('child5') {
321 &:hover {
322 @include iro-bem-next-element('child6') {
323 @include iro-bem-modifier('mod2') {
324 font-size: 2.5em;
325
326 @include iro-bem-modifier('submod2') {
327 font-size: 2.75em;
328 }
329 }
330 }
331 }
332
333 .test & {
334 @include iro-bem-next-element('child7') {
335 @include iro-bem-modifier('mod2') {
336 font-size: 2.5em;
337
338 @include iro-bem-modifier('submod2') {
339 font-size: 2.75em;
340 }
341 }
342 }
343 }
344 }
345 }
346 }
347
348 @include expect(false) {
349 .something:hover .something__child1 + .something__child2--mod1 {
350 font-size: 2.5em;
351 }
352
353 .something:hover .something__child1 + .something__child2--mod1.something__child2--submod1 {
354 font-size: 2.75em;
355 }
356
357 .test .something__child3 + .something__child4--mod1 {
358 font-size: 2.5em;
359 }
360
361 .test .something__child3 + .something__child4--mod1.something__child4--submod1 {
362 font-size: 2.75em;
363 }
364
365 .something__child5:hover + .something__child6--mod2 {
366 font-size: 2.5em;
367 }
368
369 .something__child5:hover + .something__child6--mod2.something__child6--submod2 {
370 font-size: 2.75em;
371 }
372
373 .test .something__child5 + .something__child7--mod2 {
374 font-size: 2.5em;
375 }
376
377 .test .something__child5 + .something__child7--mod2.something__child7--submod2 {
378 font-size: 2.75em;
379 }
380 }
381 }
382
383 @include assert('element modifier, multiple related elements, manual selector before') { /// 10 ///
384 @include output(false) {
385 @include iro-bem-block('something') {
386 &:hover {
387 @include iro-bem-element('child1') {
388 @include iro-bem-next-element('child2', 'child3') {
389 @include iro-bem-modifier('mod1') {
390 font-size: 2.5em;
391
392 @include iro-bem-modifier('submod1') {
393 font-size: 2.75em;
394 }
395 }
396 }
397 }
398 }
399
400 .test & {
401 @include iro-bem-element('child4') {
402 @include iro-bem-next-element('child5', 'child6') {
403 @include iro-bem-modifier('mod1') {
404 font-size: 2.5em;
405
406 @include iro-bem-modifier('submod1') {
407 font-size: 2.75em;
408 }
409 }
410 }
411 }
412 }
413
414 @include iro-bem-element('child7') {
415 &:hover {
416 @include iro-bem-next-element('child8', 'child9') {
417 @include iro-bem-modifier('mod2') {
418 font-size: 2.5em;
419
420 @include iro-bem-modifier('submod2') {
421 font-size: 2.75em;
422 }
423 }
424 }
425 }
426
427 .test & {
428 @include iro-bem-next-element('child10', 'child11') {
429 @include iro-bem-modifier('mod2') {
430 font-size: 2.5em;
431
432 @include iro-bem-modifier('submod2') {
433 font-size: 2.75em;
434 }
435 }
436 }
437 }
438 }
439 }
440 }
441
442 @include expect(false) {
443 .something:hover .something__child1 + .something__child2--mod1,
444 .something:hover .something__child1 + .something__child3--mod1 {
445 font-size: 2.5em;
446 }
447
448 .something:hover .something__child1 + .something__child2--mod1.something__child2--submod1,
449 .something:hover .something__child1 + .something__child3--mod1.something__child3--submod1 {
450 font-size: 2.75em;
451 }
452
453 .test .something__child4 + .something__child5--mod1,
454 .test .something__child4 + .something__child6--mod1 {
455 font-size: 2.5em;
456 }
457
458 .test .something__child4 + .something__child5--mod1.something__child5--submod1,
459 .test .something__child4 + .something__child6--mod1.something__child6--submod1 {
460 font-size: 2.75em;
461 }
462
463 .something__child7:hover + .something__child8--mod2,
464 .something__child7:hover + .something__child9--mod2 {
465 font-size: 2.5em;
466 }
467
468 .something__child7:hover + .something__child8--mod2.something__child8--submod2,
469 .something__child7:hover + .something__child9--mod2.something__child9--submod2 {
470 font-size: 2.75em;
471 }
472
473 .test .something__child7 + .something__child10--mod2,
474 .test .something__child7 + .something__child11--mod2 {
475 font-size: 2.5em;
476 }
477
478 .test .something__child7 + .something__child10--mod2.something__child10--submod2,
479 .test .something__child7 + .something__child11--mod2.something__child11--submod2 {
480 font-size: 2.75em;
481 }
482 }
483 }
484
485 /*
486 @include assert('element modifier, in at-theme') { /// 11 ///
487 @include output(false) {
488 @include iro-bem-block('something') {
489 @include iro-bem-at-theme('dark') {
490 @include iro-bem-element('child') {
491 @include iro-bem-modifier('mod') {
492 font-size: 2.5em;
493
494 @include iro-bem-modifier('submod') {
495 font-size: 2.75em;
496 }
497 }
498 }
499 }
500 }
501 }
502
503 @include expect(false) {
504 .t-dark .something__child--mod,
505 [class*=' t-'] .t-dark .something__child--mod,
506 [class^='t-'] .t-dark .something__child--mod {
507 font-size: 2.5em;
508 }
509
510 .t-dark .something__child--mod.something__child--submod,
511 [class*=' t-'] .t-dark .something__child--mod.something__child--submod,
512 [class^='t-'] .t-dark .something__child--mod.something__child--submod {
513 font-size: 2.75em;
514 }
515 }
516 }
517 */
518
519 @include assert('nested block modifiers, extending') { /// 12 ///
520 @include output {
521 @include iro-bem-block('something') {
522 @include iro-bem-modifier('mod') {
523 font-size: 1.5em;
524
525 @include iro-bem-modifier('submod' true) {
526 font-size: 1.75em;
527 }
528 }
529 }
530 }
531
532 @include expect {
533 .something--mod {
534 font-size: 1.5em;
535 }
536
537 .something--mod--submod {
538 font-size: 1.75em;
539 }
540 }
541 }
542
543 @include assert('nested element modifiers, extending') { /// 13 ///
544 @include output {
545 @include iro-bem-block('something') {
546 @include iro-bem-element('child') {
547 @include iro-bem-modifier('mod') {
548 font-size: 2.5em;
549
550 @include iro-bem-modifier('submod' true) {
551 font-size: 2.75em;
552 }
553 }
554 }
555 }
556 }
557
558 @include expect {
559 .something__child--mod {
560 font-size: 2.5em;
561 }
562
563 .something__child--mod--submod {
564 font-size: 2.75em;
565 }
566 }
567 }
568
569 @include assert('block and element modifiers, single element') { /// 14 ///
570 @include output {
571 @include iro-bem-block('something') {
572 @include iro-bem-modifier('mod1') {
573 font-size: 1.5em;
574
575 @include iro-bem-modifier('submod1') {
576 font-size: 1.75em;
577 }
578
579 @include iro-bem-element('child') {
580 @include iro-bem-modifier('mod2') {
581 font-size: 2.5em;
582
583 @include iro-bem-modifier('submod2') {
584 font-size: 2.75em;
585 }
586 }
587 }
588 }
589 }
590 }
591
592 @include expect {
593 .something--mod1 {
594 font-size: 1.5em;
595 }
596
597 .something--mod1.something--submod1 {
598 font-size: 1.75em;
599 }
600
601 .something--mod1 .something__child--mod2 {
602 font-size: 2.5em;
603 }
604
605 .something--mod1 .something__child--mod2.something__child--submod2 {
606 font-size: 2.75em;
607 }
608 }
609 }
610
611 @include assert('block and element modifiers, multiple elements') { /// 15 ///
612 @include output {
613 @include iro-bem-block('something') {
614 @include iro-bem-modifier('mod1') {
615 font-size: 1.5em;
616
617 @include iro-bem-modifier('submod') {
618 font-size: 1.75em;
619 }
620
621 @include iro-bem-element('child1', 'child2') {
622 @include iro-bem-modifier('mod2') {
623 font-size: 2.5em;
624
625 @include iro-bem-modifier('submod2') {
626 font-size: 2.75em;
627 }
628 }
629 }
630 }
631 }
632 }
633
634 @include expect {
635 .something--mod1 {
636 font-size: 1.5em;
637 }
638
639 .something--mod1.something--submod1 {
640 font-size: 1.75em;
641 }
642
643 .something--mod1 .something__child1--mod2,
644 .something--mod1 .something__child2--mod2 {
645 font-size: 2.5em;
646 }
647
648 .something--mod1 .something__child1--mod2.something__child1--submod2,
649 .something--mod1 .something__child2--mod2.something__child2--submod2 {
650 font-size: 2.75em;
651 }
652 }
653 }
654}
diff --git a/test/bem/_iro-bem-multi.scss b/test/bem/_iro-bem-multi.scss
new file mode 100644
index 0000000..84bbca2
--- /dev/null
+++ b/test/bem/_iro-bem-multi.scss
@@ -0,0 +1,591 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - in root, 2 blocks
6// - /// 2 /// - in root, 1 block, 1 manual selector
7// - /// 3 /// - in block, 2 elements
8// - /// 4 /// - in block, 1 element, 1 modifier
9// - /// 5 /// - in block, 1 element, 1 extending modifier
10// - /// 6 /// - in block, 1 element, 1 & selector
11// - /// 7 /// - in block, 1 element, 1 manual selector
12// - /// 8 /// - in element, 2 elements, 1 modifier
13// - /// 9 /// - in element, 1 element, 1 & selector
14// - /// 10 /// - in element in manual selector, 2 elements
15// - /// 11 /// - in element in manual selector, 1 element, 1 & selector
16// - /// 12 /// - in multiple elements, 2 elements, 1 modifier
17// - /// 13 /// - in multiple elements, 1 element, 1 & selector
18// - /// 14 /// - in related elements, 2 elements, 1 modifier
19// - /// 15 /// - in related elements, 1 element, 1 & selector
20// - /// 16 /// - in element, 2 related elements, 1 modifier
21// - /// 17 /// - in element, 1 twin element, 1 modifier
22// - /// 18 /// - in multiple elements, 1 twin element, 1 modifier
23//
24
25@include it('iro-bem-state') {
26 @include assert('in root, 2 blocks') { /// 1 ///
27 @include output {
28 @include iro-bem-multi('component:' 'block1', 'object:' 'block2') {
29 font-size: 1em;
30
31 @include iro-bem-element('child2') {
32 font-size: 2em;
33 }
34 }
35 }
36
37 @include expect {
38 .c-block1 {
39 font-size: 1em;
40 }
41
42 .c-block1__child2 {
43 font-size: 2em;
44 }
45
46 .o-block2 {
47 font-size: 1em;
48 }
49
50 .o-block2__child2 {
51 font-size: 2em;
52 }
53 }
54 }
55
56 @include assert('in root, 1 block, 1 manual selector') { /// 2 ///
57 @include output {
58 @include iro-bem-multi('component:' 'block1', 'a:hover') {
59 font-size: 1em;
60 }
61 }
62
63 @include expect {
64 .c-block1 {
65 font-size: 1em;
66 }
67
68 a:hover {
69 font-size: 1em;
70 }
71 }
72 }
73
74 @include assert('in block, 2 elements') { /// 3 ///
75 @include output {
76 @include iro-bem-block('something') {
77 @include iro-bem-multi('element:' 'child1' 'child2') {
78 font-size: 2em;
79
80 @include iro-bem-modifier('mod') {
81 font-size: 2.5em;
82 }
83 }
84 }
85 }
86
87 @include expect {
88 .something__child1,
89 .something__child2 {
90 font-size: 2em;
91 }
92
93 .something__child1--mod,
94 .something__child2--mod {
95 font-size: 2.5em;
96 }
97 }
98 }
99
100 @include assert('in block, 1 element, 1 modifier') { /// 4 ///
101 @include output {
102 @include iro-bem-block('something') {
103 @include iro-bem-multi('element:' 'child', 'modifier:' 'mod1') {
104 font-size: 2em;
105
106 @include iro-bem-modifier('mod2') {
107 font-size: 2.5em;
108 }
109 }
110 }
111 }
112
113 @include expect {
114 .something__child {
115 font-size: 2em;
116 }
117
118 .something__child--mod2 {
119 font-size: 2.5em;
120 }
121
122 .something--mod1 {
123 font-size: 2em;
124 }
125
126 .something--mod1.something--mod2 {
127 font-size: 2.5em;
128 }
129 }
130 }
131
132 @include assert('in block, 1 element, 1 extending modifier') { /// 5 ///
133 @include output {
134 @include iro-bem-block('something') {
135 @include iro-bem-multi('element:' 'child', 'modifier:' 'mod1') {
136 font-size: 2em;
137
138 @include iro-bem-modifier('mod2' true) {
139 font-size: 2.5em;
140 }
141 }
142 }
143 }
144
145 @include expect {
146 .something__child {
147 font-size: 2em;
148 }
149
150 .something__child--mod2 {
151 font-size: 2.5em;
152 }
153
154 .something--mod1 {
155 font-size: 2em;
156 }
157
158 .something--mod1--mod2 {
159 font-size: 2.5em;
160 }
161 }
162 }
163
164 @include assert('in block, 1 element, 1 & selector') { /// 6 ///
165 @include output {
166 @include iro-bem-block('something') {
167 @include iro-bem-multi('&', 'element:' 'child') {
168 font-size: 2em;
169
170 @include iro-bem-modifier('mod') {
171 font-size: 2.5em;
172 }
173 }
174 }
175 }
176
177 @include expect {
178 .something {
179 font-size: 2em;
180 }
181
182 .something--mod {
183 font-size: 2.5em;
184 }
185
186 .something__child {
187 font-size: 2em;
188 }
189
190 .something__child--mod {
191 font-size: 2.5em;
192 }
193 }
194 }
195
196 @include assert('in block, 1 element, 1 manual selector') { /// 7 ///
197 @include output {
198 @include iro-bem-block('something') {
199 @include iro-bem-multi('> a:hover', 'element:' 'child1') {
200 font-size: 2em;
201
202 @include iro-bem-element('child2') {
203 font-size: 3em;
204 }
205 }
206 }
207 }
208
209 @include expect {
210 .something > a:hover {
211 font-size: 2em;
212 }
213
214 .something > a:hover .something__child2 {
215 font-size: 3em;
216 }
217
218 .something__child1 {
219 font-size: 2em;
220 }
221
222 .something__child1 .something__child2 {
223 font-size: 3em;
224 }
225 }
226 }
227
228 @include assert('in element, 2 elements, 1 modifier') { /// 8 ///
229 @include output {
230 @include iro-bem-block('something') {
231 @include iro-bem-element('child') {
232 @include iro-bem-multi('element:' 'subchild1' 'subchild2', 'modifier:' 'mod1') {
233 font-size: 3em;
234
235 @include iro-bem-modifier('mod2') {
236 font-size: 3.5em;
237 }
238 }
239 }
240 }
241 }
242
243 @include expect {
244 .something__child .something__subchild1,
245 .something__child .something__subchild2 {
246 font-size: 3em;
247 }
248
249 .something__child .something__subchild1--mod2,
250 .something__child .something__subchild2--mod2 {
251 font-size: 3.5em;
252 }
253
254 .something__child--mod1 {
255 font-size: 3em;
256 }
257
258 .something__child--mod1.something__child--mod2 {
259 font-size: 3.5em;
260 }
261 }
262 }
263
264 @include assert('in element, 1 element, 1 & selector') { /// 9 ///
265 @include output {
266 @include iro-bem-block('something') {
267 @include iro-bem-element('child') {
268 @include iro-bem-multi('element:' 'subchild', '&') {
269 font-size: 3em;
270
271 @include iro-bem-modifier('mod') {
272 font-size: 3.5em;
273 }
274 }
275 }
276 }
277 }
278
279 @include expect {
280 .something__child .something__subchild {
281 font-size: 3em;
282 }
283
284 .something__child .something__subchild--mod {
285 font-size: 3.5em;
286 }
287
288 .something__child {
289 font-size: 3em;
290 }
291
292 .something__child--mod {
293 font-size: 3.5em;
294 }
295 }
296 }
297
298 @include assert('in element in manual selector, 2 elements') { /// 10 ///
299 @include output {
300 @include iro-bem-block('something') {
301 @include iro-bem-element('child') {
302 &:hover {
303 @include iro-bem-multi('element:' 'subchild1' 'subchild2') {
304 font-size: 3em;
305
306 @include iro-bem-modifier('mod2') {
307 font-size: 3.5em;
308 }
309 }
310 }
311 }
312 }
313 }
314
315 @include expect {
316 .something__child:hover .something__subchild1,
317 .something__child:hover .something__subchild2 {
318 font-size: 3em;
319 }
320
321 .something__child:hover .something__subchild1--mod2,
322 .something__child:hover .something__subchild2--mod2 {
323 font-size: 3.5em;
324 }
325 }
326 }
327
328 @include assert('in element in manual selector, 1 element, 1 & selector') { /// 11 ///
329 @include output {
330 @include iro-bem-block('something') {
331 @include iro-bem-element('child') {
332 &:hover {
333 @include iro-bem-multi('element:' 'subchild', '&') {
334 font-size: 3em;
335 }
336 }
337 }
338 }
339 }
340
341 @include expect {
342 .something__child:hover .something__subchild {
343 font-size: 3em;
344 }
345
346 .something__child:hover {
347 font-size: 3em;
348 }
349 }
350 }
351
352 @include assert('in multiple elements, 2 elements, 1 modifier') { /// 12 ///
353 @include output {
354 @include iro-bem-block('something') {
355 @include iro-bem-element('child1', 'child2') {
356 @include iro-bem-multi('element:' 'subchild1' 'subchild2', 'modifier:' 'mod') {
357 font-size: 3em;
358 }
359 }
360 }
361 }
362
363 @include expect {
364 .something__child1 .something__subchild1,
365 .something__child2 .something__subchild1,
366 .something__child1 .something__subchild2,
367 .something__child2 .something__subchild2 {
368 font-size: 3em;
369 }
370
371 .something__child1--mod,
372 .something__child2--mod {
373 font-size: 3em;
374 }
375 }
376 }
377
378 @include assert('in multiple elements, 1 element, 1 & selector') { /// 13 ///
379 @include output {
380 @include iro-bem-block('something') {
381 @include iro-bem-element('child1', 'child2') {
382 @include iro-bem-multi('element:' 'subchild', '&') {
383 font-size: 3em;
384
385 @include iro-bem-modifier('mod') {
386 font-size: 3.5em;
387 }
388 }
389 }
390 }
391 }
392
393 @include expect {
394 .something__child1 .something__subchild,
395 .something__child2 .something__subchild {
396 font-size: 3em;
397 }
398
399 .something__child1 .something__subchild--mod,
400 .something__child2 .something__subchild--mod {
401 font-size: 3.5em;
402 }
403
404 .something__child1,
405 .something__child2 {
406 font-size: 3em;
407 }
408
409 .something__child1--mod,
410 .something__child2--mod {
411 font-size: 3.5em;
412 }
413 }
414 }
415
416 @include assert('in related elements, 2 elements, 1 modifier') { /// 14 ///
417 @include output {
418 @include iro-bem-block('something') {
419 @include iro-bem-element('child1') {
420 @include iro-bem-next-element('child2', 'child3') {
421 @include iro-bem-multi('element:' 'subchild1' 'subchild2', 'modifier:' 'mod') {
422 font-size: 3em;
423 }
424 }
425 }
426 }
427 }
428
429 @include expect {
430 .something__child1 + .something__child2 .something__subchild1,
431 .something__child1 + .something__child3 .something__subchild1,
432 .something__child1 + .something__child2 .something__subchild2,
433 .something__child1 + .something__child3 .something__subchild2 {
434 font-size: 3em;
435 }
436
437 .something__child1 + .something__child2--mod,
438 .something__child1 + .something__child3--mod {
439 font-size: 3em;
440 }
441 }
442 }
443
444 @include assert('in related elements, 1 element, 1 & selector') { /// 15 ///
445 @include output {
446 @include iro-bem-block('something') {
447 @include iro-bem-element('child1') {
448 @include iro-bem-next-element('child2', 'child3') {
449 @include iro-bem-multi('element:' 'subchild', '&') {
450 font-size: 4em;
451
452 @include iro-bem-modifier('mod') {
453 font-size: 4.5em;
454 }
455 }
456 }
457 }
458 }
459 }
460
461 @include expect {
462 .something__child1 + .something__child2 .something__subchild,
463 .something__child1 + .something__child3 .something__subchild {
464 font-size: 4em;
465 }
466
467 .something__child1 + .something__child2 .something__subchild--mod,
468 .something__child1 + .something__child3 .something__subchild--mod {
469 font-size: 4.5em;
470 }
471
472 .something__child1 + .something__child2,
473 .something__child1 + .something__child3 {
474 font-size: 4em;
475 }
476
477 .something__child1 + .something__child2--mod,
478 .something__child1 + .something__child3--mod {
479 font-size: 4.5em;
480 }
481 }
482 }
483
484 @include assert('in element, 2 related elements, 1 modifier') { /// 16 ///
485 @include output {
486 @include iro-bem-block('something') {
487 @include iro-bem-element('child1') {
488 @include iro-bem-multi('next-element:' 'child2' 'child3', 'modifier:' 'mod1') {
489 font-size: 3em;
490
491 @include iro-bem-modifier('mod2') {
492 font-size: 3.5em;
493 }
494 }
495 }
496 }
497 }
498
499 @include expect {
500 .something__child1 + .something__child2,
501 .something__child1 + .something__child3 {
502 font-size: 3em;
503 }
504
505 .something__child1 + .something__child2--mod2,
506 .something__child1 + .something__child3--mod2 {
507 font-size: 3.5em;
508 }
509
510 .something__child1--mod1 {
511 font-size: 3em;
512 }
513
514 .something__child1--mod1.something__child1--mod2 {
515 font-size: 3.5em;
516 }
517 }
518 }
519
520 @include assert('in element, 1 twin element, 1 modifier') { /// 17 ///
521 @include output {
522 @include iro-bem-block('something') {
523 @include iro-bem-element('child') {
524 @include iro-bem-multi('next-twin-element', 'modifier:' 'mod1') {
525 font-size: 3em;
526
527 @include iro-bem-modifier('mod2') {
528 font-size: 3.5em;
529 }
530 }
531 }
532 }
533 }
534
535 @include expect {
536 .something__child + .something__child {
537 font-size: 3em;
538 }
539
540 .something__child + .something__child--mod2 {
541 font-size: 3.5em;
542 }
543
544 .something__child--mod1 {
545 font-size: 3em;
546 }
547
548 .something__child--mod1.something__child--mod2 {
549 font-size: 3.5em;
550 }
551 }
552 }
553
554 @include assert('in multiple elements, 1 twin element, 1 modifier') { /// 18 ///
555 @include output {
556 @include iro-bem-block('something') {
557 @include iro-bem-element('child1', 'child2') {
558 @include iro-bem-multi('next-twin-element', 'modifier:' 'mod1') {
559 font-size: 3em;
560
561 @include iro-bem-modifier('mod2') {
562 font-size: 3.5em;
563 }
564 }
565 }
566 }
567 }
568
569 @include expect {
570 .something__child1 + .something__child1,
571 .something__child2 + .something__child2 {
572 font-size: 3em;
573 }
574
575 .something__child1 + .something__child1--mod2,
576 .something__child2 + .something__child2--mod2 {
577 font-size: 3.5em;
578 }
579
580 .something__child1--mod1,
581 .something__child2--mod1 {
582 font-size: 3em;
583 }
584
585 .something__child1--mod1.something__child1--mod2,
586 .something__child2--mod1.something__child2--mod2 {
587 font-size: 3.5em;
588 }
589 }
590 }
591}
diff --git a/test/bem/_iro-bem-next-twin-element.scss b/test/bem/_iro-bem-next-twin-element.scss
new file mode 100644
index 0000000..96fc3a9
--- /dev/null
+++ b/test/bem/_iro-bem-next-twin-element.scss
@@ -0,0 +1,153 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - single element
6// - /// 2 /// - single element, manual selector in-between
7// - /// 3 /// - single element, modifier in-between
8// - /// 4 /// - multiple elements
9// - /// 5 /// - multiple elements, manual selector in-between
10// - /// 6 /// - multiple elements, modifier in-between
11//
12
13@include it('iro-bem-next-twin-element') {
14 @include assert('single element') { /// 1 ///
15 @include output {
16 @include iro-bem-block('something') {
17 @include iro-bem-element('child') {
18 @include iro-bem-next-twin-element {
19 font-size: 2em;
20 }
21 }
22 }
23 }
24
25 @include expect {
26 .something__child + .something__child {
27 font-size: 2em;
28 }
29 }
30 }
31
32 @include assert('single element, manual selector in-between') { /// 2 ///
33 @include output(false) {
34 @include iro-bem-block('something') {
35 @include iro-bem-element('child') {
36 &:hover {
37 @include iro-bem-next-twin-element {
38 font-size: 2em;
39 }
40 }
41
42 .test & {
43 @include iro-bem-next-twin-element {
44 font-size: 2em;
45 }
46 }
47 }
48 }
49 }
50
51 @include expect(false) {
52 .something__child:hover + .something__child {
53 font-size: 2em;
54 }
55
56 .test .something__child + .something__child {
57 font-size: 2em;
58 }
59 }
60 }
61
62 @include assert('single element, modifier in-between') { /// 3 ///
63 @include output {
64 @include iro-bem-block('something') {
65 @include iro-bem-element('child') {
66 @include iro-bem-modifier('mod') {
67 @include iro-bem-next-twin-element {
68 font-size: 2.5em;
69 }
70 }
71 }
72 }
73 }
74
75 @include expect {
76 .something__child--mod + .something__child {
77 font-size: 2.5em;
78 }
79 }
80 }
81
82 @include assert('multiple elements') { /// 4 ///
83 @include output {
84 @include iro-bem-block('something') {
85 @include iro-bem-element('child1', 'child2') {
86 @include iro-bem-next-twin-element {
87 font-size: 2em;
88 }
89 }
90 }
91 }
92
93 @include expect {
94 .something__child1 + .something__child1,
95 .something__child2 + .something__child2 {
96 font-size: 2em;
97 }
98 }
99 }
100
101 @include assert('multiple elements, manual selector in-between') { /// 5 ///
102 @include output(false) {
103 @include iro-bem-block('something') {
104 @include iro-bem-element('child1', 'child2') {
105 &:hover {
106 @include iro-bem-next-twin-element {
107 font-size: 2em;
108 }
109 }
110
111 .test & {
112 @include iro-bem-next-twin-element {
113 font-size: 2em;
114 }
115 }
116 }
117 }
118 }
119
120 @include expect(false) {
121 .something__child1:hover + .something__child1,
122 .something__child2:hover + .something__child2 {
123 font-size: 2em;
124 }
125
126 .test .something__child1 + .something__child1,
127 .test .something__child2 + .something__child2 {
128 font-size: 2em;
129 }
130 }
131 }
132
133 @include assert('multiple elements, modifier in-between') { /// 6 ///
134 @include output {
135 @include iro-bem-block('something') {
136 @include iro-bem-element('child1', 'child2') {
137 @include iro-bem-modifier('mod') {
138 @include iro-bem-next-twin-element {
139 font-size: 2.5em;
140 }
141 }
142 }
143 }
144 }
145
146 @include expect {
147 .something__child1--mod + .something__child1,
148 .something__child2--mod + .something__child2 {
149 font-size: 2.5em;
150 }
151 }
152 }
153}
diff --git a/test/bem/_iro-bem-related-element.scss b/test/bem/_iro-bem-related-element.scss
new file mode 100644
index 0000000..b0c6b94
--- /dev/null
+++ b/test/bem/_iro-bem-related-element.scss
@@ -0,0 +1,459 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - single element, single related element
6// - /// 2 /// - single element, single related element, manual selector in-between
7// - /// 3 /// - single element, single related element, modifier in-between
8// - /// 4 /// - single element, multiple related elements
9// - /// 5 /// - single element, multiple related elements, manual selector in-between
10// - /// 6 /// - single element, multiple related elements, modifier in-between
11// - /// 7 /// - multiple elements, single related element
12// - /// 8 /// - multiple elements, single related element, manual selector in-between
13// - /// 9 /// - multiple elements, single related element, modifier in-between
14// - /// 10 /// - multiple elements, multiple related elements
15// - /// 11 /// - multiple elements, multiple related elements, manual selector in-between
16// - /// 12 /// - multiple elements, multiple related elements, modifier in-between
17//
18
19@include it('iro-bem-related-element') {
20 @include assert('single element, single related element') { /// 1 ///
21 @include output {
22 @include iro-bem-block('something') {
23 @include iro-bem-element('child') {
24 @include iro-bem-related-element('+', 'subchild1') {
25 font-size: 2em;
26 }
27
28 @include iro-bem-related-element('~', 'subchild2') {
29 font-size: 2em;
30 }
31 }
32 }
33 }
34
35 @include expect {
36 .something__child + .something__subchild1 {
37 font-size: 2em;
38 }
39
40 .something__child ~ .something__subchild2 {
41 font-size: 2em;
42 }
43 }
44 }
45
46 @include assert('single element, single related element, manual selector in-between') { /// 2 ///
47 @include output(false) {
48 @include iro-bem-block('something') {
49 @include iro-bem-element('child') {
50 &:hover {
51 @include iro-bem-related-element('+', 'subchild1') {
52 font-size: 2em;
53 }
54
55 @include iro-bem-related-element('~', 'subchild2') {
56 font-size: 2em;
57 }
58 }
59
60 .test & {
61 @include iro-bem-related-element('+', 'subchild3') {
62 font-size: 2em;
63 }
64
65 @include iro-bem-related-element('~', 'subchild4') {
66 font-size: 2em;
67 }
68 }
69 }
70 }
71 }
72
73 @include expect(false) {
74 .something__child:hover + .something__subchild1 {
75 font-size: 2em;
76 }
77
78 .something__child:hover ~ .something__subchild2 {
79 font-size: 2em;
80 }
81
82 .test .something__child + .something__subchild3 {
83 font-size: 2em;
84 }
85
86 .test .something__child ~ .something__subchild4 {
87 font-size: 2em;
88 }
89 }
90 }
91
92 @include assert('single element, single related element, modifier in-between') { /// 3 ///
93 @include output {
94 @include iro-bem-block('something') {
95 @include iro-bem-element('child') {
96 @include iro-bem-modifier('mod') {
97 @include iro-bem-related-element('+', 'subchild1') {
98 font-size: 2.5em;
99 }
100
101 @include iro-bem-related-element('~', 'subchild2') {
102 font-size: 2.5em;
103 }
104 }
105 }
106 }
107 }
108
109 @include expect {
110 .something__child--mod + .something__subchild1 {
111 font-size: 2.5em;
112 }
113
114 .something__child--mod ~ .something__subchild2 {
115 font-size: 2.5em;
116 }
117 }
118 }
119
120 @include assert('single element, multiple related elements') { /// 4 ///
121 @include output {
122 @include iro-bem-block('something') {
123 @include iro-bem-element('child') {
124 @include iro-bem-related-element('+', 'subchild1', 'subchild2') {
125 font-size: 2.5em;
126 }
127
128 @include iro-bem-related-element('~', 'subchild3', 'subchild4') {
129 font-size: 2.5em;
130 }
131 }
132 }
133 }
134
135 @include expect {
136 .something__child + .something__subchild1,
137 .something__child + .something__subchild2 {
138 font-size: 2.5em;
139 }
140
141 .something__child ~ .something__subchild3,
142 .something__child ~ .something__subchild4 {
143 font-size: 2.5em;
144 }
145 }
146 }
147
148 @include assert('single element, multiple related elements, manual selector in-between') { /// 5 ///
149 @include output(false) {
150 @include iro-bem-block('something') {
151 @include iro-bem-element('child') {
152 &:hover {
153 @include iro-bem-related-element('+', 'subchild1', 'subchild2') {
154 font-size: 2.5em;
155 }
156
157 @include iro-bem-related-element('~', 'subchild3', 'subchild4') {
158 font-size: 2.5em;
159 }
160 }
161
162 .test & {
163 @include iro-bem-related-element('+', 'subchild5', 'subchild6') {
164 font-size: 2.5em;
165 }
166
167 @include iro-bem-related-element('~', 'subchild7', 'subchild8') {
168 font-size: 2.5em;
169 }
170 }
171 }
172 }
173 }
174
175 @include expect(false) {
176 .something__child:hover + .something__subchild1,
177 .something__child:hover + .something__subchild2 {
178 font-size: 2.5em;
179 }
180
181 .something__child:hover ~ .something__subchild3,
182 .something__child:hover ~ .something__subchild4 {
183 font-size: 2.5em;
184 }
185
186 .test .something__child + .something__subchild5,
187 .test .something__child + .something__subchild6 {
188 font-size: 2.5em;
189 }
190
191 .test .something__child ~ .something__subchild7,
192 .test .something__child ~ .something__subchild8 {
193 font-size: 2.5em;
194 }
195 }
196 }
197
198 @include assert('single element, multiple related elements, modifier in-between') { /// 6 ///
199 @include output {
200 @include iro-bem-block('something') {
201 @include iro-bem-element('child') {
202 @include iro-bem-modifier('mod') {
203 @include iro-bem-related-element('+', 'subchild1', 'subchild2') {
204 font-size: 2.5em;
205 }
206
207 @include iro-bem-related-element('~', 'subchild3', 'subchild4') {
208 font-size: 2.5em;
209 }
210 }
211 }
212 }
213 }
214
215 @include expect {
216 .something__child--mod + .something__subchild1,
217 .something__child--mod + .something__subchild2 {
218 font-size: 2.5em;
219 }
220
221 .something__child--mod ~ .something__subchild3,
222 .something__child--mod ~ .something__subchild4 {
223 font-size: 2.5em;
224 }
225 }
226 }
227
228 @include assert('multiple elements, single related element') { /// 7 ///
229 @include output {
230 @include iro-bem-block('something') {
231 @include iro-bem-element('child1', 'child2') {
232 @include iro-bem-related-element('+', 'subchild1') {
233 font-size: 2em;
234 }
235
236 @include iro-bem-related-element('~', 'subchild2') {
237 font-size: 2em;
238 }
239 }
240 }
241 }
242
243 @include expect {
244 .something__child1 + .something__subchild1,
245 .something__child2 + .something__subchild1 {
246 font-size: 2em;
247 }
248
249 .something__child1 ~ .something__subchild2,
250 .something__child2 ~ .something__subchild2 {
251 font-size: 2em;
252 }
253 }
254 }
255
256 @include assert('multiple elements, single related element, manual selector in-between') { /// 8 ///
257 @include output(false) {
258 @include iro-bem-block('something') {
259 @include iro-bem-element('child1', 'child2') {
260 &:hover {
261 @include iro-bem-related-element('+', 'subchild1') {
262 font-size: 2em;
263 }
264
265 @include iro-bem-related-element('~', 'subchild2') {
266 font-size: 2em;
267 }
268 }
269
270 .test & {
271 @include iro-bem-related-element('+', 'subchild3') {
272 font-size: 2em;
273 }
274
275 @include iro-bem-related-element('~', 'subchild4') {
276 font-size: 2em;
277 }
278 }
279 }
280 }
281 }
282
283 @include expect(false) {
284 .something__child1:hover + .something__subchild1,
285 .something__child2:hover + .something__subchild1 {
286 font-size: 2em;
287 }
288
289 .something__child1:hover ~ .something__subchild2,
290 .something__child2:hover ~ .something__subchild2 {
291 font-size: 2em;
292 }
293
294 .test .something__child1 + .something__subchild3,
295 .test .something__child2 + .something__subchild3 {
296 font-size: 2em;
297 }
298
299 .test .something__child1 ~ .something__subchild4,
300 .test .something__child2 ~ .something__subchild4 {
301 font-size: 2em;
302 }
303 }
304 }
305
306 @include assert('multiple elements, single related element, modifier in-between') { /// 9 ///
307 @include output {
308 @include iro-bem-block('something') {
309 @include iro-bem-element('child1', 'child2') {
310 @include iro-bem-modifier('mod') {
311 @include iro-bem-related-element('+', 'subchild1') {
312 font-size: 2.5em;
313 }
314
315 @include iro-bem-related-element('~', 'subchild2') {
316 font-size: 2.5em;
317 }
318 }
319 }
320 }
321 }
322
323 @include expect {
324 .something__child1--mod + .something__subchild1,
325 .something__child2--mod + .something__subchild1 {
326 font-size: 2.5em;
327 }
328
329 .something__child1--mod ~ .something__subchild2,
330 .something__child2--mod ~ .something__subchild2 {
331 font-size: 2.5em;
332 }
333 }
334 }
335
336 @include assert('multiple elements, multiple related elements') { /// 10 ///
337 @include output {
338 @include iro-bem-block('something') {
339 @include iro-bem-element('child1', 'child2') {
340 @include iro-bem-related-element('+', 'subchild1', 'subchild2') {
341 font-size: 2em;
342 }
343
344 @include iro-bem-related-element('~', 'subchild3', 'subchild4') {
345 font-size: 2em;
346 }
347 }
348 }
349 }
350
351 @include expect {
352 .something__child1 + .something__subchild1,
353 .something__child2 + .something__subchild1,
354 .something__child1 + .something__subchild2,
355 .something__child2 + .something__subchild2 {
356 font-size: 2em;
357 }
358
359 .something__child1 ~ .something__subchild3,
360 .something__child2 ~ .something__subchild3,
361 .something__child1 ~ .something__subchild4,
362 .something__child2 ~ .something__subchild4 {
363 font-size: 2em;
364 }
365 }
366 }
367
368 @include assert('multiple elements, multiple related elements, manual selector in-between') { /// 11 ///
369 @include output(false) {
370 @include iro-bem-block('something') {
371 @include iro-bem-element('child1', 'child2') {
372 &:hover {
373 @include iro-bem-related-element('+', 'subchild1', 'subchild2') {
374 font-size: 2em;
375 }
376
377 @include iro-bem-related-element('~', 'subchild3', 'subchild4') {
378 font-size: 2em;
379 }
380 }
381
382 .test & {
383 @include iro-bem-related-element('+', 'subchild5', 'subchild6') {
384 font-size: 2em;
385 }
386
387 @include iro-bem-related-element('~', 'subchild7', 'subchild8') {
388 font-size: 2em;
389 }
390 }
391 }
392 }
393 }
394
395 @include expect(false) {
396 .something__child1:hover + .something__subchild1,
397 .something__child2:hover + .something__subchild1,
398 .something__child1:hover + .something__subchild2,
399 .something__child2:hover + .something__subchild2 {
400 font-size: 2em;
401 }
402
403 .something__child1:hover ~ .something__subchild3,
404 .something__child2:hover ~ .something__subchild3,
405 .something__child1:hover ~ .something__subchild4,
406 .something__child2:hover ~ .something__subchild4 {
407 font-size: 2em;
408 }
409
410 .test .something__child1 + .something__subchild5,
411 .test .something__child2 + .something__subchild5,
412 .test .something__child1 + .something__subchild6,
413 .test .something__child2 + .something__subchild6 {
414 font-size: 2em;
415 }
416
417 .test .something__child1 ~ .something__subchild7,
418 .test .something__child2 ~ .something__subchild7,
419 .test .something__child1 ~ .something__subchild8,
420 .test .something__child2 ~ .something__subchild8 {
421 font-size: 2em;
422 }
423 }
424 }
425
426 @include assert('multiple elements, multiple related elements, modifier in-between') { /// 12 ///
427 @include output {
428 @include iro-bem-block('something') {
429 @include iro-bem-element('child1', 'child2') {
430 @include iro-bem-modifier('mod') {
431 @include iro-bem-related-element('+', 'subchild1', 'subchild2') {
432 font-size: 2em;
433 }
434
435 @include iro-bem-related-element('~', 'subchild3', 'subchild4') {
436 font-size: 2em;
437 }
438 }
439 }
440 }
441 }
442
443 @include expect {
444 .something__child1--mod + .something__subchild1,
445 .something__child2--mod + .something__subchild1,
446 .something__child1--mod + .something__subchild2,
447 .something__child2--mod + .something__subchild2 {
448 font-size: 2em;
449 }
450
451 .something__child1--mod ~ .something__subchild3,
452 .something__child2--mod ~ .something__subchild3,
453 .something__child1--mod ~ .something__subchild4,
454 .something__child2--mod ~ .something__subchild4 {
455 font-size: 2em;
456 }
457 }
458 }
459}
diff --git a/test/bem/_iro-bem-state.scss b/test/bem/_iro-bem-state.scss
new file mode 100644
index 0000000..57eb233
--- /dev/null
+++ b/test/bem/_iro-bem-state.scss
@@ -0,0 +1,177 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - single block, single state
6// - /// 2 /// - single element, single state
7// - /// 3 /// - single block, multiple states
8// - /// 4 /// - single element, multiple states
9// - /// 5 /// - multiple elements, single state
10// - /// 6 /// - multiple elements, multiple states
11//
12
13@include it('iro-bem-state') {
14 @include assert('single block, single state') { /// 1 ///
15 @include output {
16 @include iro-bem-block('something') {
17 @include iro-bem-is('active') {
18 font-size: 1.25em;
19 }
20
21 @include iro-bem-has('state') {
22 font-size: 1.75em;
23 }
24 }
25 }
26
27 @include expect {
28 .something.is-active {
29 font-size: 1.25em;
30 }
31
32 .something.has-state {
33 font-size: 1.75em;
34 }
35 }
36 }
37
38 @include assert('single element, single state') { /// 2 ///
39 @include output {
40 @include iro-bem-block('something') {
41 @include iro-bem-element('child') {
42 @include iro-bem-is('active') {
43 font-size: 2.25em;
44 }
45
46 @include iro-bem-has('state') {
47 font-size: 2.75em;
48 }
49 }
50 }
51 }
52
53 @include expect {
54 .something__child.is-active {
55 font-size: 2.25em;
56 }
57
58 .something__child.has-state {
59 font-size: 2.75em;
60 }
61 }
62 }
63
64 @include assert('single block, multiple states') { /// 3 ///
65 @include output {
66 @include iro-bem-block('something') {
67 @include iro-bem-is('active', 'primary') {
68 font-size: 1.25em;
69 }
70
71 @include iro-bem-has('state', 'indicator') {
72 font-size: 1.75em;
73 }
74 }
75 }
76
77 @include expect {
78 .something.is-active,
79 .something.is-primary {
80 font-size: 1.25em;
81 }
82
83 .something.has-state,
84 .something.has-indicator {
85 font-size: 1.75em;
86 }
87 }
88 }
89
90 @include assert('single element, multiple states') { /// 4 ///
91 @include output {
92 @include iro-bem-block('something') {
93 @include iro-bem-element('child') {
94 @include iro-bem-is('active', 'primary') {
95 font-size: 2.25em;
96 }
97
98 @include iro-bem-has('state', 'indicator') {
99 font-size: 2.75em;
100 }
101 }
102 }
103 }
104
105 @include expect {
106 .something__child.is-active,
107 .something__child.is-primary {
108 font-size: 2.25em;
109 }
110
111 .something__child.has-state,
112 .something__child.has-indicator {
113 font-size: 2.75em;
114 }
115 }
116 }
117
118 @include assert('multiple elements, single state') { /// 5 ///
119 @include output {
120 @include iro-bem-block('something') {
121 @include iro-bem-element('child1', 'child2') {
122 @include iro-bem-is('active') {
123 font-size: 2.25em;
124 }
125
126 @include iro-bem-has('state') {
127 font-size: 2.75em;
128 }
129 }
130 }
131 }
132
133 @include expect {
134 .something__child1.is-active,
135 .something__child2.is-active {
136 font-size: 2.25em;
137 }
138
139 .something__child1.has-state,
140 .something__child2.has-state {
141 font-size: 2.75em;
142 }
143 }
144 }
145
146 @include assert('multiple elements, multiple states') { /// 6 ///
147 @include output {
148 @include iro-bem-block('something') {
149 @include iro-bem-element('child1', 'child2') {
150 @include iro-bem-is('active', 'primary') {
151 font-size: 2.25em;
152 }
153
154 @include iro-bem-has('state', 'indicator') {
155 font-size: 2.75em;
156 }
157 }
158 }
159 }
160
161 @include expect {
162 .something__child1.is-active,
163 .something__child2.is-active,
164 .something__child1.is-primary,
165 .something__child2.is-primary {
166 font-size: 2.25em;
167 }
168
169 .something__child1.has-state,
170 .something__child2.has-state,
171 .something__child1.has-indicator,
172 .something__child2.has-indicator {
173 font-size: 2.75em;
174 }
175 }
176 }
177}
diff --git a/test/bem/_iro-bem-suffix.scss b/test/bem/_iro-bem-suffix.scss
new file mode 100644
index 0000000..c6ca787
--- /dev/null
+++ b/test/bem/_iro-bem-suffix.scss
@@ -0,0 +1,94 @@
1// sass-lint:disable class-name-format force-element-nesting force-pseudo-nesting mixins-before-declarations
2
3//
4// Included test cases:
5// - /// 1 /// - block suffix
6// - /// 2 /// - element suffix
7// - /// 3 /// - modifier suffix
8// - /// 4 /// - multiple element suffix
9//
10
11@include it('iro-bem-suffix') {
12 @include assert('block suffix') { /// 1 ///
13 @include output {
14 @include iro-bem-block('something') {
15 @include iro-bem-suffix('sm') {
16 font-size: 1.5em;
17 }
18 }
19 }
20
21 @include expect {
22 .something\@sm {
23 font-size: 1.5em;
24 }
25 }
26 }
27
28 @include assert('element suffix') { /// 2 ///
29 @include output {
30 @include iro-bem-block('something') {
31 @include iro-bem-element('child') {
32 @include iro-bem-suffix('sm') {
33 font-size: 2.5em;
34 }
35 }
36 }
37 }
38
39 @include expect {
40 .something__child\@sm {
41 font-size: 2.5em;
42 }
43 }
44 }
45
46 @include assert('modifier suffix') { /// 3 ///
47 @include output {
48 @include iro-bem-block('something') {
49 @include iro-bem-modifier('mod1') {
50 @include iro-bem-suffix('sm') {
51 font-size: 1.75em;
52 }
53 }
54
55 @include iro-bem-element('child') {
56 @include iro-bem-modifier('mod2') {
57 @include iro-bem-suffix('sm') {
58 font-size: 2.75em;
59 }
60 }
61 }
62 }
63 }
64
65 @include expect {
66 .something--mod1\@sm {
67 font-size: 1.75em;
68 }
69
70 .something__child--mod2\@sm {
71 font-size: 2.75em;
72 }
73 }
74 }
75
76 @include assert('multiple element suffix') { /// 4 ///
77 @include output {
78 @include iro-bem-block('something') {
79 @include iro-bem-element('child1', 'child2') {
80 @include iro-bem-suffix('sm') {
81 font-size: 2.5em;
82 }
83 }
84 }
85 }
86
87 @include expect {
88 .something__child1\@sm,
89 .something__child2\@sm {
90 font-size: 2.5em;
91 }
92 }
93 }
94}
diff --git a/test/test.js b/test/test.js
new file mode 100644
index 0000000..94d16da
--- /dev/null
+++ b/test/test.js
@@ -0,0 +1,4 @@
1const path = require("path");
2const sassTrue = require("sass-true");
3
4sassTrue.runSass({ file: path.join(__dirname, "test.scss") }, { describe, it });
diff --git a/test/test.scss b/test/test.scss
new file mode 100644
index 0000000..9e3cf6b
--- /dev/null
+++ b/test/test.scss
@@ -0,0 +1,16 @@
1@import '../src/main';
2
3@import 'true';
4
5$iro-easing-gradient-steps: 4;
6
7@import 'functions';
8@import 'math';
9@import 'contexts';
10@import 'bem';
11@import 'responsive';
12@import 'harmony';
13@import 'gradients';
14@import 'props';
15
16@include report;
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..e8623cd
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,3842 @@
1# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2# yarn lockfile v1
3
4
5"@sindresorhus/is@^0.14.0":
6 version "0.14.0"
7 resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
8 integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
9
10"@szmarczak/http-timer@^1.1.2":
11 version "1.1.2"
12 resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
13 integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
14 dependencies:
15 defer-to-connect "^1.0.1"
16
17"@types/color-name@^1.1.1":
18 version "1.1.1"
19 resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
20 integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
21
22"@ungap/promise-all-settled@1.1.2":
23 version "1.1.2"
24 resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
25 integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
26
27a-sync-waterfall@^1.0.0:
28 version "1.0.1"
29 resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7"
30 integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==
31
32abbrev@1:
33 version "1.1.1"
34 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
35
36acorn-jsx@^3.0.0:
37 version "3.0.1"
38 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
39 dependencies:
40 acorn "^3.0.4"
41
42acorn@^3.0.4:
43 version "3.3.0"
44 resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
45
46acorn@^5.2.1:
47 version "5.3.0"
48 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822"
49
50ajv-keywords@^1.0.0:
51 version "1.5.1"
52 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
53
54ajv@^4.7.0:
55 version "4.11.8"
56 resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
57 dependencies:
58 co "^4.6.0"
59 json-stable-stringify "^1.0.1"
60
61ansi-align@^3.0.0:
62 version "3.0.0"
63 resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
64 integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
65 dependencies:
66 string-width "^3.0.0"
67
68ansi-colors@4.1.1:
69 version "4.1.1"
70 resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
71 integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
72
73ansi-escapes@^1.1.0:
74 version "1.4.0"
75 resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
76
77ansi-regex@^2.0.0:
78 version "2.1.1"
79 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
80
81ansi-regex@^3.0.0:
82 version "3.0.0"
83 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
84
85ansi-regex@^4.1.0:
86 version "4.1.0"
87 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
88 integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
89
90ansi-regex@^5.0.0:
91 version "5.0.0"
92 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
93 integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
94
95ansi-styles@^2.2.1:
96 version "2.2.1"
97 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
98
99ansi-styles@^3.2.0, ansi-styles@^3.2.1:
100 version "3.2.1"
101 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
102 dependencies:
103 color-convert "^1.9.0"
104
105ansi-styles@^4.1.0:
106 version "4.2.1"
107 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
108 integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
109 dependencies:
110 "@types/color-name" "^1.1.1"
111 color-convert "^2.0.1"
112
113ansi-styles@^4.2.1:
114 version "4.3.0"
115 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
116 integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
117 dependencies:
118 color-convert "^2.0.1"
119
120anymatch@^2.0.0:
121 version "2.0.0"
122 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
123 dependencies:
124 micromatch "^3.1.4"
125 normalize-path "^2.1.1"
126
127anymatch@~3.1.1:
128 version "3.1.1"
129 resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
130 integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
131 dependencies:
132 normalize-path "^3.0.0"
133 picomatch "^2.0.4"
134
135append-buffer@^1.0.2:
136 version "1.0.2"
137 resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
138 integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=
139 dependencies:
140 buffer-equal "^1.0.0"
141
142aproba@^1.0.3:
143 version "1.2.0"
144 resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
145
146are-we-there-yet@~1.1.2:
147 version "1.1.5"
148 resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
149 dependencies:
150 delegates "^1.0.0"
151 readable-stream "^2.0.6"
152
153argparse@^1.0.7:
154 version "1.0.9"
155 resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
156 dependencies:
157 sprintf-js "~1.0.2"
158
159arr-diff@^4.0.0:
160 version "4.0.0"
161 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
162
163arr-flatten@^1.1.0:
164 version "1.1.0"
165 resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
166
167arr-union@^3.1.0:
168 version "3.1.0"
169 resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
170
171array-union@^1.0.1:
172 version "1.0.2"
173 resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
174 dependencies:
175 array-uniq "^1.0.1"
176
177array-uniq@^1.0.1:
178 version "1.0.3"
179 resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
180
181array-unique@^0.3.2:
182 version "0.3.2"
183 resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
184
185arrify@^1.0.0:
186 version "1.0.1"
187 resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
188
189asap@^2.0.3:
190 version "2.0.6"
191 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
192 integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
193
194assign-symbols@^1.0.0:
195 version "1.0.0"
196 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
197
198async-each@^1.0.1:
199 version "1.0.1"
200 resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
201 integrity sha1-GdOGodntxufByF04iu28xW0zYC0=
202
203atob@^2.1.1:
204 version "2.1.1"
205 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
206
207atob@^2.1.2:
208 version "2.1.2"
209 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
210 integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
211
212babel-runtime@^6.22.0, babel-runtime@^6.26.0:
213 version "6.26.0"
214 resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
215 dependencies:
216 core-js "^2.4.0"
217 regenerator-runtime "^0.11.0"
218
219balanced-match@^1.0.0:
220 version "1.0.0"
221 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
222
223base@^0.11.1:
224 version "0.11.2"
225 resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
226 dependencies:
227 cache-base "^1.0.1"
228 class-utils "^0.3.5"
229 component-emitter "^1.2.1"
230 define-property "^1.0.0"
231 isobject "^3.0.1"
232 mixin-deep "^1.2.0"
233 pascalcase "^0.1.1"
234
235binary-extensions@^1.0.0:
236 version "1.11.0"
237 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
238
239binary-extensions@^2.0.0:
240 version "2.0.0"
241 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
242 integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
243
244boxen@^4.2.0:
245 version "4.2.0"
246 resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
247 integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==
248 dependencies:
249 ansi-align "^3.0.0"
250 camelcase "^5.3.1"
251 chalk "^3.0.0"
252 cli-boxes "^2.2.0"
253 string-width "^4.1.0"
254 term-size "^2.1.0"
255 type-fest "^0.8.1"
256 widest-line "^3.1.0"
257
258brace-expansion@^1.1.7:
259 version "1.1.11"
260 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
261 dependencies:
262 balanced-match "^1.0.0"
263 concat-map "0.0.1"
264
265braces@^2.3.1, braces@^2.3.2:
266 version "2.3.2"
267 resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
268 dependencies:
269 arr-flatten "^1.1.0"
270 array-unique "^0.3.2"
271 extend-shallow "^2.0.1"
272 fill-range "^4.0.0"
273 isobject "^3.0.1"
274 repeat-element "^1.1.2"
275 snapdragon "^0.8.1"
276 snapdragon-node "^2.0.1"
277 split-string "^3.0.2"
278 to-regex "^3.0.1"
279
280braces@~3.0.2:
281 version "3.0.2"
282 resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
283 integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
284 dependencies:
285 fill-range "^7.0.1"
286
287browser-stdout@1.3.1:
288 version "1.3.1"
289 resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
290
291buffer-equal@^1.0.0:
292 version "1.0.0"
293 resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
294 integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
295
296buffer-from@^1.0.0:
297 version "1.0.0"
298 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
299
300cache-base@^1.0.1:
301 version "1.0.1"
302 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
303 dependencies:
304 collection-visit "^1.0.0"
305 component-emitter "^1.2.1"
306 get-value "^2.0.6"
307 has-value "^1.0.0"
308 isobject "^3.0.1"
309 set-value "^2.0.0"
310 to-object-path "^0.3.0"
311 union-value "^1.0.0"
312 unset-value "^1.0.0"
313
314cacheable-request@^6.0.0:
315 version "6.1.0"
316 resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
317 integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
318 dependencies:
319 clone-response "^1.0.2"
320 get-stream "^5.1.0"
321 http-cache-semantics "^4.0.0"
322 keyv "^3.0.0"
323 lowercase-keys "^2.0.0"
324 normalize-url "^4.1.0"
325 responselike "^1.0.2"
326
327call-bind@^1.0.0:
328 version "1.0.0"
329 resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce"
330 integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==
331 dependencies:
332 function-bind "^1.1.1"
333 get-intrinsic "^1.0.0"
334
335caller-path@^0.1.0:
336 version "0.1.0"
337 resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
338 dependencies:
339 callsites "^0.2.0"
340
341callsites@^0.2.0:
342 version "0.2.0"
343 resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
344
345camel-case@3.0.x:
346 version "3.0.0"
347 resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
348 dependencies:
349 no-case "^2.2.0"
350 upper-case "^1.1.1"
351
352camelcase@^2.0.1:
353 version "2.1.1"
354 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
355
356camelcase@^5.0.0, camelcase@^5.3.1:
357 version "5.3.1"
358 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
359 integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
360
361camelcase@^6.0.0:
362 version "6.2.0"
363 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
364 integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
365
366cdocparser@^0.13.0:
367 version "0.13.0"
368 resolved "https://registry.yarnpkg.com/cdocparser/-/cdocparser-0.13.0.tgz#1ba98a1e1e1668e2bfb35d41761e9e4645d731ba"
369 dependencies:
370 escape-string-regexp "^1.0.2"
371 lodash.assign "^2.4.1"
372 strip-indent "^1.0.0"
373
374chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
375 version "1.1.3"
376 resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
377 dependencies:
378 ansi-styles "^2.2.1"
379 escape-string-regexp "^1.0.2"
380 has-ansi "^2.0.0"
381 strip-ansi "^3.0.0"
382 supports-color "^2.0.0"
383
384chalk@^2.4.2:
385 version "2.4.2"
386 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
387 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
388 dependencies:
389 ansi-styles "^3.2.1"
390 escape-string-regexp "^1.0.5"
391 supports-color "^5.3.0"
392
393chalk@^3.0.0:
394 version "3.0.0"
395 resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
396 integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
397 dependencies:
398 ansi-styles "^4.1.0"
399 supports-color "^7.1.0"
400
401chalk@^4.0.0, chalk@^4.1.0:
402 version "4.1.0"
403 resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
404 integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
405 dependencies:
406 ansi-styles "^4.1.0"
407 supports-color "^7.1.0"
408
409chokidar@3.4.3, "chokidar@>=2.0.0 <4.0.0":
410 version "3.4.3"
411 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b"
412 integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==
413 dependencies:
414 anymatch "~3.1.1"
415 braces "~3.0.2"
416 glob-parent "~5.1.0"
417 is-binary-path "~2.1.0"
418 is-glob "~4.0.1"
419 normalize-path "~3.0.0"
420 readdirp "~3.5.0"
421 optionalDependencies:
422 fsevents "~2.1.2"
423
424chokidar@^2.0.0:
425 version "2.1.6"
426 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5"
427 integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==
428 dependencies:
429 anymatch "^2.0.0"
430 async-each "^1.0.1"
431 braces "^2.3.2"
432 glob-parent "^3.1.0"
433 inherits "^2.0.3"
434 is-binary-path "^1.0.0"
435 is-glob "^4.0.0"
436 normalize-path "^3.0.0"
437 path-is-absolute "^1.0.0"
438 readdirp "^2.2.1"
439 upath "^1.1.1"
440 optionalDependencies:
441 fsevents "^1.2.7"
442
443chokidar@^3.2.2:
444 version "3.3.1"
445 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
446 integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==
447 dependencies:
448 anymatch "~3.1.1"
449 braces "~3.0.2"
450 glob-parent "~5.1.0"
451 is-binary-path "~2.1.0"
452 is-glob "~4.0.1"
453 normalize-path "~3.0.0"
454 readdirp "~3.3.0"
455 optionalDependencies:
456 fsevents "~2.1.2"
457
458chownr@^1.0.1:
459 version "1.0.1"
460 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
461
462chroma-js@^1.2.2:
463 version "1.3.6"
464 resolved "https://registry.yarnpkg.com/chroma-js/-/chroma-js-1.3.6.tgz#22dd7220ef6b55dcfcb8ef92982baaf55dced45d"
465
466ci-info@^2.0.0:
467 version "2.0.0"
468 resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
469 integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
470
471circular-json@^0.3.1:
472 version "0.3.3"
473 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
474
475class-utils@^0.3.5:
476 version "0.3.6"
477 resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
478 dependencies:
479 arr-union "^3.1.0"
480 define-property "^0.2.5"
481 isobject "^3.0.0"
482 static-extend "^0.1.1"
483
484clean-css@4.2.x:
485 version "4.2.1"
486 resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
487 integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==
488 dependencies:
489 source-map "~0.6.0"
490
491cli-boxes@^2.2.0:
492 version "2.2.0"
493 resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
494 integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
495
496cli-cursor@^1.0.1:
497 version "1.0.2"
498 resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
499 dependencies:
500 restore-cursor "^1.0.1"
501
502cli-width@^2.0.0:
503 version "2.2.0"
504 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
505
506cliui@^3.0.3:
507 version "3.2.0"
508 resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
509 dependencies:
510 string-width "^1.0.1"
511 strip-ansi "^3.0.1"
512 wrap-ansi "^2.0.0"
513
514cliui@^5.0.0:
515 version "5.0.0"
516 resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
517 integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
518 dependencies:
519 string-width "^3.1.0"
520 strip-ansi "^5.2.0"
521 wrap-ansi "^5.1.0"
522
523clone-buffer@^1.0.0:
524 version "1.0.0"
525 resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
526 integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
527
528clone-response@^1.0.2:
529 version "1.0.2"
530 resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
531 integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
532 dependencies:
533 mimic-response "^1.0.0"
534
535clone-stats@^0.0.1:
536 version "0.0.1"
537 resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
538
539clone-stats@^1.0.0:
540 version "1.0.0"
541 resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
542 integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=
543
544clone@^0.2.0:
545 version "0.2.0"
546 resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
547
548clone@^1.0.0:
549 version "1.0.4"
550 resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
551
552clone@^2.1.1:
553 version "2.1.2"
554 resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
555 integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
556
557cloneable-readable@^1.0.0:
558 version "1.1.3"
559 resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
560 integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
561 dependencies:
562 inherits "^2.0.1"
563 process-nextick-args "^2.0.0"
564 readable-stream "^2.3.5"
565
566co@^4.6.0:
567 version "4.6.0"
568 resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
569
570code-point-at@^1.0.0:
571 version "1.1.0"
572 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
573
574collection-visit@^1.0.0:
575 version "1.0.0"
576 resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
577 dependencies:
578 map-visit "^1.0.0"
579 object-visit "^1.0.0"
580
581color-convert@^1.9.0:
582 version "1.9.2"
583 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
584 dependencies:
585 color-name "1.1.1"
586
587color-convert@^2.0.1:
588 version "2.0.1"
589 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
590 integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
591 dependencies:
592 color-name "~1.1.4"
593
594color-name@1.1.1:
595 version "1.1.1"
596 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
597
598color-name@~1.1.4:
599 version "1.1.4"
600 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
601 integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
602
603commander@2.17.x, commander@~2.17.1:
604 version "2.17.1"
605 resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
606 integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
607
608commander@^2.8.1:
609 version "2.12.2"
610 resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
611
612component-emitter@^1.2.1:
613 version "1.2.1"
614 resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
615
616concat-map@0.0.1:
617 version "0.0.1"
618 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
619
620concat-stream@^1.4.6:
621 version "1.6.0"
622 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
623 dependencies:
624 inherits "^2.0.3"
625 readable-stream "^2.2.2"
626 typedarray "^0.0.6"
627
628concat-stream@^1.4.7:
629 version "1.6.2"
630 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
631 dependencies:
632 buffer-from "^1.0.0"
633 inherits "^2.0.3"
634 readable-stream "^2.2.2"
635 typedarray "^0.0.6"
636
637concat-stream@^2.0.0:
638 version "2.0.0"
639 resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1"
640 integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==
641 dependencies:
642 buffer-from "^1.0.0"
643 inherits "^2.0.3"
644 readable-stream "^3.0.2"
645 typedarray "^0.0.6"
646
647configstore@^5.0.1:
648 version "5.0.1"
649 resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
650 integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
651 dependencies:
652 dot-prop "^5.2.0"
653 graceful-fs "^4.1.2"
654 make-dir "^3.0.0"
655 unique-string "^2.0.0"
656 write-file-atomic "^3.0.0"
657 xdg-basedir "^4.0.0"
658
659console-control-strings@^1.0.0, console-control-strings@~1.1.0:
660 version "1.1.0"
661 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
662
663convert-source-map@^1.5.0:
664 version "1.7.0"
665 resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
666 integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
667 dependencies:
668 safe-buffer "~5.1.1"
669
670copy-descriptor@^0.1.0:
671 version "0.1.1"
672 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
673
674core-js@^2.4.0:
675 version "2.5.5"
676 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b"
677
678core-util-is@~1.0.0:
679 version "1.0.2"
680 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
681
682crypto-random-string@^2.0.0:
683 version "2.0.0"
684 resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
685 integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
686
687css@^3.0.0:
688 version "3.0.0"
689 resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d"
690 integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==
691 dependencies:
692 inherits "^2.0.4"
693 source-map "^0.6.1"
694 source-map-resolve "^0.6.0"
695
696d@1:
697 version "1.0.0"
698 resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
699 dependencies:
700 es5-ext "^0.10.9"
701
702dargs@^4.0.0:
703 version "4.1.0"
704 resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
705 dependencies:
706 number-is-nan "^1.0.0"
707
708debug@4.2.0:
709 version "4.2.0"
710 resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
711 integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==
712 dependencies:
713 ms "2.1.2"
714
715debug@^2.1.1, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
716 version "2.6.9"
717 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
718 dependencies:
719 ms "2.0.0"
720
721debug@^3.2.6:
722 version "3.2.6"
723 resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
724 integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
725 dependencies:
726 ms "^2.1.1"
727
728decamelize@^1.1.1, decamelize@^1.2.0:
729 version "1.2.0"
730 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
731 integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
732
733decamelize@^4.0.0:
734 version "4.0.0"
735 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
736 integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
737
738decode-uri-component@^0.2.0:
739 version "0.2.0"
740 resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
741
742decompress-response@^3.3.0:
743 version "3.3.0"
744 resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
745 integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
746 dependencies:
747 mimic-response "^1.0.0"
748
749deep-extend@^0.6.0:
750 version "0.6.0"
751 resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
752
753deep-is@~0.1.3:
754 version "0.1.3"
755 resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
756
757defer-to-connect@^1.0.1:
758 version "1.1.3"
759 resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
760 integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
761
762define-properties@^1.1.3:
763 version "1.1.3"
764 resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
765 integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
766 dependencies:
767 object-keys "^1.0.12"
768
769define-property@^0.2.5:
770 version "0.2.5"
771 resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
772 dependencies:
773 is-descriptor "^0.1.0"
774
775define-property@^1.0.0:
776 version "1.0.0"
777 resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
778 dependencies:
779 is-descriptor "^1.0.0"
780
781define-property@^2.0.2:
782 version "2.0.2"
783 resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
784 dependencies:
785 is-descriptor "^1.0.2"
786 isobject "^3.0.1"
787
788del@^2.0.2:
789 version "2.2.2"
790 resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
791 dependencies:
792 globby "^5.0.0"
793 is-path-cwd "^1.0.0"
794 is-path-in-cwd "^1.0.0"
795 object-assign "^4.0.1"
796 pify "^2.0.0"
797 pinkie-promise "^2.0.0"
798 rimraf "^2.2.8"
799
800delegates@^1.0.0:
801 version "1.0.0"
802 resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
803
804detect-libc@^1.0.2:
805 version "1.0.3"
806 resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
807
808diff@4.0.2:
809 version "4.0.2"
810 resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
811 integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
812
813docopt@^0.6.1:
814 version "0.6.2"
815 resolved "https://registry.yarnpkg.com/docopt/-/docopt-0.6.2.tgz#b28e9e2220da5ec49f7ea5bb24a47787405eeb11"
816
817doctrine@^1.2.2:
818 version "1.5.0"
819 resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
820 dependencies:
821 esutils "^2.0.2"
822 isarray "^1.0.0"
823
824dot-prop@^5.2.0:
825 version "5.2.0"
826 resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
827 integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
828 dependencies:
829 is-obj "^2.0.0"
830
831duplexer2@^0.1.2:
832 version "0.1.4"
833 resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
834 dependencies:
835 readable-stream "^2.0.2"
836
837duplexer3@^0.1.4:
838 version "0.1.4"
839 resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
840
841duplexify@^3.6.0:
842 version "3.7.1"
843 resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
844 integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
845 dependencies:
846 end-of-stream "^1.0.0"
847 inherits "^2.0.1"
848 readable-stream "^2.0.0"
849 stream-shift "^1.0.0"
850
851emoji-regex@^7.0.1:
852 version "7.0.3"
853 resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
854 integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
855
856emoji-regex@^8.0.0:
857 version "8.0.0"
858 resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
859 integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
860
861end-of-stream@^1.0.0:
862 version "1.4.1"
863 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
864 integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
865 dependencies:
866 once "^1.4.0"
867
868end-of-stream@^1.1.0:
869 version "1.4.4"
870 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
871 integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
872 dependencies:
873 once "^1.4.0"
874
875ends-with@^0.2.0:
876 version "0.2.0"
877 resolved "https://registry.yarnpkg.com/ends-with/-/ends-with-0.2.0.tgz#2f9da98d57a50cfda4571ce4339000500f4e6b8a"
878
879es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
880 version "0.10.37"
881 resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3"
882 dependencies:
883 es6-iterator "~2.0.1"
884 es6-symbol "~3.1.1"
885
886es6-denodeify@^0.1.0:
887 version "0.1.5"
888 resolved "https://registry.yarnpkg.com/es6-denodeify/-/es6-denodeify-0.1.5.tgz#31d4d5fe9c5503e125460439310e16a2a3f39c1f"
889
890es6-iterator@^2.0.1, es6-iterator@~2.0.1:
891 version "2.0.3"
892 resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
893 dependencies:
894 d "1"
895 es5-ext "^0.10.35"
896 es6-symbol "^3.1.1"
897
898es6-map@^0.1.3:
899 version "0.1.5"
900 resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
901 dependencies:
902 d "1"
903 es5-ext "~0.10.14"
904 es6-iterator "~2.0.1"
905 es6-set "~0.1.5"
906 es6-symbol "~3.1.1"
907 event-emitter "~0.3.5"
908
909es6-promise@^3.0.2:
910 version "3.3.1"
911 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
912
913es6-promise@^4.2.6:
914 version "4.2.6"
915 resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f"
916 integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==
917
918es6-set@~0.1.5:
919 version "0.1.5"
920 resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
921 dependencies:
922 d "1"
923 es5-ext "~0.10.14"
924 es6-iterator "~2.0.1"
925 es6-symbol "3.1.1"
926 event-emitter "~0.3.5"
927
928es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
929 version "3.1.1"
930 resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
931 dependencies:
932 d "1"
933 es5-ext "~0.10.14"
934
935es6-weak-map@^2.0.1:
936 version "2.0.2"
937 resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
938 dependencies:
939 d "1"
940 es5-ext "^0.10.14"
941 es6-iterator "^2.0.1"
942 es6-symbol "^3.1.1"
943
944escape-goat@^2.0.0:
945 version "2.1.1"
946 resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
947 integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
948
949escape-string-regexp@4.0.0:
950 version "4.0.0"
951 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
952 integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
953
954escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
955 version "1.0.5"
956 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
957
958escope@^3.6.0:
959 version "3.6.0"
960 resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
961 dependencies:
962 es6-map "^0.1.3"
963 es6-weak-map "^2.0.1"
964 esrecurse "^4.1.0"
965 estraverse "^4.1.1"
966
967eslint@^2.7.0:
968 version "2.13.1"
969 resolved "https://registry.yarnpkg.com/eslint/-/eslint-2.13.1.tgz#e4cc8fa0f009fb829aaae23855a29360be1f6c11"
970 dependencies:
971 chalk "^1.1.3"
972 concat-stream "^1.4.6"
973 debug "^2.1.1"
974 doctrine "^1.2.2"
975 es6-map "^0.1.3"
976 escope "^3.6.0"
977 espree "^3.1.6"
978 estraverse "^4.2.0"
979 esutils "^2.0.2"
980 file-entry-cache "^1.1.1"
981 glob "^7.0.3"
982 globals "^9.2.0"
983 ignore "^3.1.2"
984 imurmurhash "^0.1.4"
985 inquirer "^0.12.0"
986 is-my-json-valid "^2.10.0"
987 is-resolvable "^1.0.0"
988 js-yaml "^3.5.1"
989 json-stable-stringify "^1.0.0"
990 levn "^0.3.0"
991 lodash "^4.0.0"
992 mkdirp "^0.5.0"
993 optionator "^0.8.1"
994 path-is-absolute "^1.0.0"
995 path-is-inside "^1.0.1"
996 pluralize "^1.2.1"
997 progress "^1.1.8"
998 require-uncached "^1.0.2"
999 shelljs "^0.6.0"
1000 strip-json-comments "~1.0.1"
1001 table "^3.7.8"
1002 text-table "~0.2.0"
1003 user-home "^2.0.0"
1004
1005espree@^3.1.6:
1006 version "3.5.2"
1007 resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca"
1008 dependencies:
1009 acorn "^5.2.1"
1010 acorn-jsx "^3.0.0"
1011
1012esprima@^4.0.0:
1013 version "4.0.0"
1014 resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
1015
1016esrecurse@^4.1.0:
1017 version "4.2.0"
1018 resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
1019 dependencies:
1020 estraverse "^4.1.0"
1021 object-assign "^4.0.1"
1022
1023estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
1024 version "4.2.0"
1025 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
1026
1027esutils@^2.0.2:
1028 version "2.0.2"
1029 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
1030
1031event-emitter@~0.3.5:
1032 version "0.3.5"
1033 resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
1034 dependencies:
1035 d "1"
1036 es5-ext "~0.10.14"
1037
1038exit-hook@^1.0.0:
1039 version "1.1.1"
1040 resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
1041
1042expand-brackets@^2.1.4:
1043 version "2.1.4"
1044 resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
1045 dependencies:
1046 debug "^2.3.3"
1047 define-property "^0.2.5"
1048 extend-shallow "^2.0.1"
1049 posix-character-classes "^0.1.0"
1050 regex-not "^1.0.0"
1051 snapdragon "^0.8.1"
1052 to-regex "^3.0.1"
1053
1054extend-shallow@^2.0.1:
1055 version "2.0.1"
1056 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
1057 dependencies:
1058 is-extendable "^0.1.0"
1059
1060extend-shallow@^3.0.0, extend-shallow@^3.0.2:
1061 version "3.0.2"
1062 resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
1063 dependencies:
1064 assign-symbols "^1.0.0"
1065 is-extendable "^1.0.1"
1066
1067extend@^3.0.0:
1068 version "3.0.1"
1069 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
1070
1071extend@^3.0.2:
1072 version "3.0.2"
1073 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
1074 integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
1075
1076extglob@^2.0.4:
1077 version "2.0.4"
1078 resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
1079 dependencies:
1080 array-unique "^0.3.2"
1081 define-property "^1.0.0"
1082 expand-brackets "^2.1.4"
1083 extend-shallow "^2.0.1"
1084 fragment-cache "^0.2.1"
1085 regex-not "^1.0.0"
1086 snapdragon "^0.8.1"
1087 to-regex "^3.0.1"
1088
1089fast-levenshtein@~2.0.4:
1090 version "2.0.6"
1091 resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
1092
1093figures@^1.3.5:
1094 version "1.7.0"
1095 resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
1096 dependencies:
1097 escape-string-regexp "^1.0.5"
1098 object-assign "^4.1.0"
1099
1100file-entry-cache@^1.1.1:
1101 version "1.3.1"
1102 resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8"
1103 dependencies:
1104 flat-cache "^1.2.1"
1105 object-assign "^4.0.1"
1106
1107fill-range@^4.0.0:
1108 version "4.0.0"
1109 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
1110 dependencies:
1111 extend-shallow "^2.0.1"
1112 is-number "^3.0.0"
1113 repeat-string "^1.6.1"
1114 to-regex-range "^2.1.0"
1115
1116fill-range@^7.0.1:
1117 version "7.0.1"
1118 resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
1119 integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
1120 dependencies:
1121 to-regex-range "^5.0.1"
1122
1123find-index@^0.1.1:
1124 version "0.1.1"
1125 resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"
1126
1127find-up@5.0.0:
1128 version "5.0.0"
1129 resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
1130 integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
1131 dependencies:
1132 locate-path "^6.0.0"
1133 path-exists "^4.0.0"
1134
1135find-up@^3.0.0:
1136 version "3.0.0"
1137 resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
1138 integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
1139 dependencies:
1140 locate-path "^3.0.0"
1141
1142flat-cache@^1.2.1:
1143 version "1.3.0"
1144 resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
1145 dependencies:
1146 circular-json "^0.3.1"
1147 del "^2.0.2"
1148 graceful-fs "^4.1.2"
1149 write "^0.2.1"
1150
1151flat@^5.0.2:
1152 version "5.0.2"
1153 resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
1154 integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
1155
1156flush-write-stream@^1.0.2:
1157 version "1.1.1"
1158 resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
1159 integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
1160 dependencies:
1161 inherits "^2.0.3"
1162 readable-stream "^2.3.6"
1163
1164for-in@^1.0.2:
1165 version "1.0.2"
1166 resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
1167
1168fragment-cache@^0.2.1:
1169 version "0.2.1"
1170 resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
1171 dependencies:
1172 map-cache "^0.2.2"
1173
1174front-matter@2.1.2:
1175 version "2.1.2"
1176 resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-2.1.2.tgz#f75983b9f2f413be658c93dfd7bd8ce4078f5cdb"
1177 dependencies:
1178 js-yaml "^3.4.6"
1179
1180fs-extra@^2.0.0:
1181 version "2.1.2"
1182 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35"
1183 dependencies:
1184 graceful-fs "^4.1.2"
1185 jsonfile "^2.1.0"
1186
1187fs-extra@^3.0.1:
1188 version "3.0.1"
1189 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
1190 dependencies:
1191 graceful-fs "^4.1.2"
1192 jsonfile "^3.0.0"
1193 universalify "^0.1.0"
1194
1195fs-minipass@^1.2.5:
1196 version "1.2.5"
1197 resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
1198 dependencies:
1199 minipass "^2.2.1"
1200
1201fs-mkdirp-stream@^1.0.0:
1202 version "1.0.0"
1203 resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
1204 integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=
1205 dependencies:
1206 graceful-fs "^4.1.11"
1207 through2 "^2.0.3"
1208
1209fs.realpath@^1.0.0:
1210 version "1.0.0"
1211 resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
1212
1213fsevents@^1.2.7:
1214 version "1.2.7"
1215 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4"
1216 integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==
1217 dependencies:
1218 nan "^2.9.2"
1219 node-pre-gyp "^0.10.0"
1220
1221fsevents@~2.1.2:
1222 version "2.1.2"
1223 resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
1224 integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
1225
1226function-bind@^1.1.1:
1227 version "1.1.1"
1228 resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
1229 integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
1230
1231gauge@~2.7.3:
1232 version "2.7.4"
1233 resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
1234 dependencies:
1235 aproba "^1.0.3"
1236 console-control-strings "^1.0.0"
1237 has-unicode "^2.0.0"
1238 object-assign "^4.1.0"
1239 signal-exit "^3.0.0"
1240 string-width "^1.0.1"
1241 strip-ansi "^3.0.1"
1242 wide-align "^1.1.0"
1243
1244generate-function@^2.0.0:
1245 version "2.0.0"
1246 resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
1247
1248generate-object-property@^1.1.0:
1249 version "1.2.0"
1250 resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
1251 dependencies:
1252 is-property "^1.0.0"
1253
1254get-caller-file@^2.0.1:
1255 version "2.0.5"
1256 resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
1257 integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
1258
1259get-intrinsic@^1.0.0:
1260 version "1.0.1"
1261 resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be"
1262 integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==
1263 dependencies:
1264 function-bind "^1.1.1"
1265 has "^1.0.3"
1266 has-symbols "^1.0.1"
1267
1268get-stdin@^4.0.1:
1269 version "4.0.1"
1270 resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
1271
1272get-stream@^4.1.0:
1273 version "4.1.0"
1274 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
1275 integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
1276 dependencies:
1277 pump "^3.0.0"
1278
1279get-stream@^5.1.0:
1280 version "5.1.0"
1281 resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
1282 integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
1283 dependencies:
1284 pump "^3.0.0"
1285
1286get-value@^2.0.3, get-value@^2.0.6:
1287 version "2.0.6"
1288 resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
1289
1290glob-parent@^3.1.0:
1291 version "3.1.0"
1292 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
1293 dependencies:
1294 is-glob "^3.1.0"
1295 path-dirname "^1.0.0"
1296
1297glob-parent@~5.1.0:
1298 version "5.1.1"
1299 resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
1300 integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
1301 dependencies:
1302 is-glob "^4.0.1"
1303
1304glob-stream@^6.1.0:
1305 version "6.1.0"
1306 resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
1307 integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=
1308 dependencies:
1309 extend "^3.0.0"
1310 glob "^7.1.1"
1311 glob-parent "^3.1.0"
1312 is-negated-glob "^1.0.0"
1313 ordered-read-streams "^1.0.0"
1314 pumpify "^1.3.5"
1315 readable-stream "^2.1.5"
1316 remove-trailing-separator "^1.0.1"
1317 to-absolute-glob "^2.0.0"
1318 unique-stream "^2.0.2"
1319
1320glob2base@0.0.12:
1321 version "0.0.12"
1322 resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
1323 dependencies:
1324 find-index "^0.1.1"
1325
1326glob@7.1.6, glob@^7.1.1, glob@^7.1.3, glob@^7.1.6:
1327 version "7.1.6"
1328 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
1329 integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
1330 dependencies:
1331 fs.realpath "^1.0.0"
1332 inflight "^1.0.4"
1333 inherits "2"
1334 minimatch "^3.0.4"
1335 once "^1.3.0"
1336 path-is-absolute "^1.0.0"
1337
1338glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1:
1339 version "7.1.2"
1340 resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
1341 integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
1342 dependencies:
1343 fs.realpath "^1.0.0"
1344 inflight "^1.0.4"
1345 inherits "2"
1346 minimatch "^3.0.4"
1347 once "^1.3.0"
1348 path-is-absolute "^1.0.0"
1349
1350global-dirs@^2.0.1:
1351 version "2.0.1"
1352 resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
1353 integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==
1354 dependencies:
1355 ini "^1.3.5"
1356
1357globals@^9.2.0:
1358 version "9.18.0"
1359 resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
1360
1361globby@^5.0.0:
1362 version "5.0.0"
1363 resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
1364 dependencies:
1365 array-union "^1.0.1"
1366 arrify "^1.0.0"
1367 glob "^7.0.3"
1368 object-assign "^4.0.1"
1369 pify "^2.0.0"
1370 pinkie-promise "^2.0.0"
1371
1372globule@^1.0.0:
1373 version "1.2.1"
1374 resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d"
1375 dependencies:
1376 glob "~7.1.1"
1377 lodash "~4.17.10"
1378 minimatch "~3.0.2"
1379
1380gonzales-pe-sl@^4.2.3:
1381 version "4.2.3"
1382 resolved "https://registry.yarnpkg.com/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz#6a868bc380645f141feeb042c6f97fcc71b59fe6"
1383 dependencies:
1384 minimist "1.1.x"
1385
1386got@^9.6.0:
1387 version "9.6.0"
1388 resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
1389 integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
1390 dependencies:
1391 "@sindresorhus/is" "^0.14.0"
1392 "@szmarczak/http-timer" "^1.1.2"
1393 cacheable-request "^6.0.0"
1394 decompress-response "^3.3.0"
1395 duplexer3 "^0.1.4"
1396 get-stream "^4.1.0"
1397 lowercase-keys "^1.0.1"
1398 mimic-response "^1.0.1"
1399 p-cancelable "^1.0.0"
1400 to-readable-stream "^1.0.0"
1401 url-parse-lax "^3.0.0"
1402
1403graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
1404 version "4.1.11"
1405 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1406
1407growl@1.10.5:
1408 version "1.10.5"
1409 resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
1410
1411has-ansi@^2.0.0:
1412 version "2.0.0"
1413 resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
1414 dependencies:
1415 ansi-regex "^2.0.0"
1416
1417has-flag@^3.0.0:
1418 version "3.0.0"
1419 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
1420
1421has-flag@^4.0.0:
1422 version "4.0.0"
1423 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
1424 integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
1425
1426has-symbols@^1.0.1:
1427 version "1.0.1"
1428 resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
1429 integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
1430
1431has-unicode@^2.0.0:
1432 version "2.0.1"
1433 resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
1434
1435has-value@^0.3.1:
1436 version "0.3.1"
1437 resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
1438 dependencies:
1439 get-value "^2.0.3"
1440 has-values "^0.1.4"
1441 isobject "^2.0.0"
1442
1443has-value@^1.0.0:
1444 version "1.0.0"
1445 resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
1446 dependencies:
1447 get-value "^2.0.6"
1448 has-values "^1.0.0"
1449 isobject "^3.0.0"
1450
1451has-values@^0.1.4:
1452 version "0.1.4"
1453 resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
1454
1455has-values@^1.0.0:
1456 version "1.0.0"
1457 resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
1458 dependencies:
1459 is-number "^3.0.0"
1460 kind-of "^4.0.0"
1461
1462has-yarn@^2.1.0:
1463 version "2.1.0"
1464 resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
1465 integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
1466
1467has@^1.0.3:
1468 version "1.0.3"
1469 resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
1470 integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
1471 dependencies:
1472 function-bind "^1.1.1"
1473
1474he@1.2.0, he@1.2.x:
1475 version "1.2.0"
1476 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
1477 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
1478
1479html-minifier@^3.5.21:
1480 version "3.5.21"
1481 resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
1482 integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
1483 dependencies:
1484 camel-case "3.0.x"
1485 clean-css "4.2.x"
1486 commander "2.17.x"
1487 he "1.2.x"
1488 param-case "2.1.x"
1489 relateurl "0.2.x"
1490 uglify-js "3.4.x"
1491
1492http-cache-semantics@^4.0.0:
1493 version "4.1.0"
1494 resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
1495 integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
1496
1497iconv-lite@^0.4.4:
1498 version "0.4.23"
1499 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
1500 dependencies:
1501 safer-buffer ">= 2.1.2 < 3"
1502
1503ignore-by-default@^1.0.1:
1504 version "1.0.1"
1505 resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
1506
1507ignore-walk@^3.0.1:
1508 version "3.0.1"
1509 resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
1510 dependencies:
1511 minimatch "^3.0.4"
1512
1513ignore@^3.1.2:
1514 version "3.3.7"
1515 resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
1516
1517import-lazy@^2.1.0:
1518 version "2.1.0"
1519 resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
1520
1521imurmurhash@^0.1.4:
1522 version "0.1.4"
1523 resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
1524
1525inflight@^1.0.4:
1526 version "1.0.6"
1527 resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
1528 dependencies:
1529 once "^1.3.0"
1530 wrappy "1"
1531
1532inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
1533 version "2.0.3"
1534 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
1535
1536inherits@2.0.1:
1537 version "2.0.1"
1538 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
1539
1540inherits@^2.0.4:
1541 version "2.0.4"
1542 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
1543 integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
1544
1545ini@^1.3.5, ini@~1.3.0:
1546 version "1.3.5"
1547 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
1548
1549inquirer@^0.12.0:
1550 version "0.12.0"
1551 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
1552 dependencies:
1553 ansi-escapes "^1.1.0"
1554 ansi-regex "^2.0.0"
1555 chalk "^1.0.0"
1556 cli-cursor "^1.0.1"
1557 cli-width "^2.0.0"
1558 figures "^1.3.5"
1559 lodash "^4.3.0"
1560 readline2 "^1.0.1"
1561 run-async "^0.1.0"
1562 rx-lite "^3.1.2"
1563 string-width "^1.0.1"
1564 strip-ansi "^3.0.0"
1565 through "^2.3.6"
1566
1567invert-kv@^1.0.0:
1568 version "1.0.0"
1569 resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
1570
1571is-absolute@^1.0.0:
1572 version "1.0.0"
1573 resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
1574 integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
1575 dependencies:
1576 is-relative "^1.0.0"
1577 is-windows "^1.0.1"
1578
1579is-accessor-descriptor@^0.1.6:
1580 version "0.1.6"
1581 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
1582 dependencies:
1583 kind-of "^3.0.2"
1584
1585is-accessor-descriptor@^1.0.0:
1586 version "1.0.0"
1587 resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
1588 dependencies:
1589 kind-of "^6.0.0"
1590
1591is-binary-path@^1.0.0:
1592 version "1.0.1"
1593 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
1594 dependencies:
1595 binary-extensions "^1.0.0"
1596
1597is-binary-path@~2.1.0:
1598 version "2.1.0"
1599 resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
1600 integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
1601 dependencies:
1602 binary-extensions "^2.0.0"
1603
1604is-buffer@^1.1.5:
1605 version "1.1.6"
1606 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
1607
1608is-ci@^2.0.0:
1609 version "2.0.0"
1610 resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
1611 integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
1612 dependencies:
1613 ci-info "^2.0.0"
1614
1615is-data-descriptor@^0.1.4:
1616 version "0.1.4"
1617 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
1618 dependencies:
1619 kind-of "^3.0.2"
1620
1621is-data-descriptor@^1.0.0:
1622 version "1.0.0"
1623 resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
1624 dependencies:
1625 kind-of "^6.0.0"
1626
1627is-descriptor@^0.1.0:
1628 version "0.1.6"
1629 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
1630 dependencies:
1631 is-accessor-descriptor "^0.1.6"
1632 is-data-descriptor "^0.1.4"
1633 kind-of "^5.0.0"
1634
1635is-descriptor@^1.0.0, is-descriptor@^1.0.2:
1636 version "1.0.2"
1637 resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
1638 dependencies:
1639 is-accessor-descriptor "^1.0.0"
1640 is-data-descriptor "^1.0.0"
1641 kind-of "^6.0.2"
1642
1643is-extendable@^0.1.0, is-extendable@^0.1.1:
1644 version "0.1.1"
1645 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
1646
1647is-extendable@^1.0.1:
1648 version "1.0.1"
1649 resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
1650 dependencies:
1651 is-plain-object "^2.0.4"
1652
1653is-extglob@^2.1.0, is-extglob@^2.1.1:
1654 version "2.1.1"
1655 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
1656
1657is-fullwidth-code-point@^1.0.0:
1658 version "1.0.0"
1659 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
1660 dependencies:
1661 number-is-nan "^1.0.0"
1662
1663is-fullwidth-code-point@^2.0.0:
1664 version "2.0.0"
1665 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
1666
1667is-fullwidth-code-point@^3.0.0:
1668 version "3.0.0"
1669 resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
1670 integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
1671
1672is-glob@^3.1.0:
1673 version "3.1.0"
1674 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
1675 dependencies:
1676 is-extglob "^2.1.0"
1677
1678is-glob@^4.0.0:
1679 version "4.0.0"
1680 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
1681 dependencies:
1682 is-extglob "^2.1.1"
1683
1684is-glob@^4.0.1, is-glob@~4.0.1:
1685 version "4.0.1"
1686 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
1687 integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
1688 dependencies:
1689 is-extglob "^2.1.1"
1690
1691is-installed-globally@^0.3.1:
1692 version "0.3.2"
1693 resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
1694 integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
1695 dependencies:
1696 global-dirs "^2.0.1"
1697 is-path-inside "^3.0.1"
1698
1699is-my-json-valid@^2.10.0:
1700 version "2.17.1"
1701 resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471"
1702 dependencies:
1703 generate-function "^2.0.0"
1704 generate-object-property "^1.1.0"
1705 jsonpointer "^4.0.0"
1706 xtend "^4.0.0"
1707
1708is-negated-glob@^1.0.0:
1709 version "1.0.0"
1710 resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
1711 integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=
1712
1713is-npm@^4.0.0:
1714 version "4.0.0"
1715 resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
1716 integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
1717
1718is-number@^3.0.0:
1719 version "3.0.0"
1720 resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
1721 dependencies:
1722 kind-of "^3.0.2"
1723
1724is-number@^7.0.0:
1725 version "7.0.0"
1726 resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
1727 integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
1728
1729is-obj@^2.0.0:
1730 version "2.0.0"
1731 resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
1732 integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
1733
1734is-path-cwd@^1.0.0:
1735 version "1.0.0"
1736 resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
1737
1738is-path-in-cwd@^1.0.0:
1739 version "1.0.0"
1740 resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
1741 dependencies:
1742 is-path-inside "^1.0.0"
1743
1744is-path-inside@^1.0.0:
1745 version "1.0.1"
1746 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
1747 dependencies:
1748 path-is-inside "^1.0.1"
1749
1750is-path-inside@^3.0.1:
1751 version "3.0.2"
1752 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
1753 integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
1754
1755is-plain-obj@^2.1.0:
1756 version "2.1.0"
1757 resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
1758 integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
1759
1760is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
1761 version "2.0.4"
1762 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
1763 dependencies:
1764 isobject "^3.0.1"
1765
1766is-property@^1.0.0:
1767 version "1.0.2"
1768 resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
1769
1770is-relative@^1.0.0:
1771 version "1.0.0"
1772 resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
1773 integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
1774 dependencies:
1775 is-unc-path "^1.0.0"
1776
1777is-resolvable@^1.0.0:
1778 version "1.0.1"
1779 resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4"
1780
1781is-typedarray@^1.0.0:
1782 version "1.0.0"
1783 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
1784
1785is-unc-path@^1.0.0:
1786 version "1.0.0"
1787 resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
1788 integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
1789 dependencies:
1790 unc-path-regex "^0.1.2"
1791
1792is-utf8@^0.2.1:
1793 version "0.2.1"
1794 resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
1795
1796is-valid-glob@^1.0.0:
1797 version "1.0.0"
1798 resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
1799 integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=
1800
1801is-windows@^1.0.1, is-windows@^1.0.2:
1802 version "1.0.2"
1803 resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
1804
1805is-yarn-global@^0.3.0:
1806 version "0.3.0"
1807 resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
1808 integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
1809
1810isarray@0.0.1:
1811 version "0.0.1"
1812 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
1813
1814isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
1815 version "1.0.0"
1816 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
1817
1818isexe@^2.0.0:
1819 version "2.0.0"
1820 resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
1821
1822isobject@^2.0.0:
1823 version "2.1.0"
1824 resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
1825 dependencies:
1826 isarray "1.0.0"
1827
1828isobject@^3.0.0, isobject@^3.0.1:
1829 version "3.0.1"
1830 resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
1831
1832js-yaml@3.14.0, js-yaml@^3.14.0:
1833 version "3.14.0"
1834 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
1835 integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
1836 dependencies:
1837 argparse "^1.0.7"
1838 esprima "^4.0.0"
1839
1840js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4:
1841 version "3.10.0"
1842 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
1843 dependencies:
1844 argparse "^1.0.7"
1845 esprima "^4.0.0"
1846
1847json-buffer@3.0.0:
1848 version "3.0.0"
1849 resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
1850 integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
1851
1852json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
1853 version "1.0.1"
1854 resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
1855 dependencies:
1856 jsonify "~0.0.0"
1857
1858jsonfile@^2.1.0:
1859 version "2.4.0"
1860 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
1861 optionalDependencies:
1862 graceful-fs "^4.1.6"
1863
1864jsonfile@^3.0.0:
1865 version "3.0.1"
1866 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66"
1867 optionalDependencies:
1868 graceful-fs "^4.1.6"
1869
1870jsonify@~0.0.0:
1871 version "0.0.0"
1872 resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
1873
1874jsonpointer@^4.0.0:
1875 version "4.0.1"
1876 resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
1877
1878keyv@^3.0.0:
1879 version "3.1.0"
1880 resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
1881 integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
1882 dependencies:
1883 json-buffer "3.0.0"
1884
1885kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
1886 version "3.2.2"
1887 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
1888 dependencies:
1889 is-buffer "^1.1.5"
1890
1891kind-of@^4.0.0:
1892 version "4.0.0"
1893 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
1894 dependencies:
1895 is-buffer "^1.1.5"
1896
1897kind-of@^5.0.0:
1898 version "5.1.0"
1899 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
1900
1901kind-of@^6.0.0, kind-of@^6.0.2:
1902 version "6.0.2"
1903 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
1904
1905known-css-properties@^0.3.0:
1906 version "0.3.0"
1907 resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.3.0.tgz#a3d135bbfc60ee8c6eacf2f7e7e6f2d4755e49a4"
1908
1909latest-version@^5.0.0:
1910 version "5.1.0"
1911 resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
1912 integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
1913 dependencies:
1914 package-json "^6.3.0"
1915
1916lazystream@^1.0.0:
1917 version "1.0.0"
1918 resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
1919 dependencies:
1920 readable-stream "^2.0.5"
1921
1922lcid@^1.0.0:
1923 version "1.0.0"
1924 resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
1925 dependencies:
1926 invert-kv "^1.0.0"
1927
1928lead@^1.0.0:
1929 version "1.0.0"
1930 resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
1931 integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=
1932 dependencies:
1933 flush-write-stream "^1.0.2"
1934
1935levn@^0.3.0, levn@~0.3.0:
1936 version "0.3.0"
1937 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
1938 dependencies:
1939 prelude-ls "~1.1.2"
1940 type-check "~0.3.2"
1941
1942locate-path@^3.0.0:
1943 version "3.0.0"
1944 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
1945 integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
1946 dependencies:
1947 p-locate "^3.0.0"
1948 path-exists "^3.0.0"
1949
1950locate-path@^6.0.0:
1951 version "6.0.0"
1952 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
1953 integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
1954 dependencies:
1955 p-locate "^5.0.0"
1956
1957lodash._basebind@~2.4.1:
1958 version "2.4.1"
1959 resolved "https://registry.yarnpkg.com/lodash._basebind/-/lodash._basebind-2.4.1.tgz#e940b9ebdd27c327e0a8dab1b55916c5341e9575"
1960 dependencies:
1961 lodash._basecreate "~2.4.1"
1962 lodash._setbinddata "~2.4.1"
1963 lodash._slice "~2.4.1"
1964 lodash.isobject "~2.4.1"
1965
1966lodash._basecreate@~2.4.1:
1967 version "2.4.1"
1968 resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz#f8e6f5b578a9e34e541179b56b8eeebf4a287e08"
1969 dependencies:
1970 lodash._isnative "~2.4.1"
1971 lodash.isobject "~2.4.1"
1972 lodash.noop "~2.4.1"
1973
1974lodash._basecreatecallback@~2.4.1:
1975 version "2.4.1"
1976 resolved "https://registry.yarnpkg.com/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz#7d0b267649cb29e7a139d0103b7c11fae84e4851"
1977 dependencies:
1978 lodash._setbinddata "~2.4.1"
1979 lodash.bind "~2.4.1"
1980 lodash.identity "~2.4.1"
1981 lodash.support "~2.4.1"
1982
1983lodash._basecreatewrapper@~2.4.1:
1984 version "2.4.1"
1985 resolved "https://registry.yarnpkg.com/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz#4d31f2e7de7e134fbf2803762b8150b32519666f"
1986 dependencies:
1987 lodash._basecreate "~2.4.1"
1988 lodash._setbinddata "~2.4.1"
1989 lodash._slice "~2.4.1"
1990 lodash.isobject "~2.4.1"
1991
1992lodash._createwrapper@~2.4.1:
1993 version "2.4.1"
1994 resolved "https://registry.yarnpkg.com/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz#51d6957973da4ed556e37290d8c1a18c53de1607"
1995 dependencies:
1996 lodash._basebind "~2.4.1"
1997 lodash._basecreatewrapper "~2.4.1"
1998 lodash._slice "~2.4.1"
1999 lodash.isfunction "~2.4.1"
2000
2001lodash._isnative@~2.4.1:
2002 version "2.4.1"
2003 resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c"
2004
2005lodash._objecttypes@~2.4.1:
2006 version "2.4.1"
2007 resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11"
2008
2009lodash._setbinddata@~2.4.1:
2010 version "2.4.1"
2011 resolved "https://registry.yarnpkg.com/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz#f7c200cd1b92ef236b399eecf73c648d17aa94d2"
2012 dependencies:
2013 lodash._isnative "~2.4.1"
2014 lodash.noop "~2.4.1"
2015
2016lodash._shimkeys@~2.4.1:
2017 version "2.4.1"
2018 resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203"
2019 dependencies:
2020 lodash._objecttypes "~2.4.1"
2021
2022lodash._slice@~2.4.1:
2023 version "2.4.1"
2024 resolved "https://registry.yarnpkg.com/lodash._slice/-/lodash._slice-2.4.1.tgz#745cf41a53597b18f688898544405efa2b06d90f"
2025
2026lodash.assign@^2.4.1:
2027 version "2.4.1"
2028 resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-2.4.1.tgz#84c39596dd71181a97b0652913a7c9675e49b1aa"
2029 dependencies:
2030 lodash._basecreatecallback "~2.4.1"
2031 lodash._objecttypes "~2.4.1"
2032 lodash.keys "~2.4.1"
2033
2034lodash.bind@~2.4.1:
2035 version "2.4.1"
2036 resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-2.4.1.tgz#5d19fa005c8c4d236faf4742c7b7a1fcabe29267"
2037 dependencies:
2038 lodash._createwrapper "~2.4.1"
2039 lodash._slice "~2.4.1"
2040
2041lodash.capitalize@^4.1.0:
2042 version "4.2.1"
2043 resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
2044
2045lodash.difference@^4.5.0:
2046 version "4.5.0"
2047 resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
2048
2049lodash.identity@~2.4.1:
2050 version "2.4.1"
2051 resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.4.1.tgz#6694cffa65fef931f7c31ce86c74597cf560f4f1"
2052
2053lodash.isfunction@~2.4.1:
2054 version "2.4.1"
2055 resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz#2cfd575c73e498ab57e319b77fa02adef13a94d1"
2056
2057lodash.isobject@~2.4.1:
2058 version "2.4.1"
2059 resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5"
2060 dependencies:
2061 lodash._objecttypes "~2.4.1"
2062
2063lodash.kebabcase@^4.0.0:
2064 version "4.1.1"
2065 resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
2066
2067lodash.keys@~2.4.1:
2068 version "2.4.1"
2069 resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727"
2070 dependencies:
2071 lodash._isnative "~2.4.1"
2072 lodash._shimkeys "~2.4.1"
2073 lodash.isobject "~2.4.1"
2074
2075lodash.noop@~2.4.1:
2076 version "2.4.1"
2077 resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-2.4.1.tgz#4fb54f816652e5ae10e8f72f717a388c7326538a"
2078
2079lodash.support@~2.4.1:
2080 version "2.4.1"
2081 resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.4.1.tgz#320e0b67031673c28d7a2bb5d9e0331a45240515"
2082 dependencies:
2083 lodash._isnative "~2.4.1"
2084
2085lodash.uniq@^4.5.0:
2086 version "4.5.0"
2087 resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
2088
2089lodash@^4.0.0, lodash@~4.17.10:
2090 version "4.17.10"
2091 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
2092
2093lodash@^4.17.19:
2094 version "4.17.20"
2095 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
2096 integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
2097
2098lodash@^4.3.0:
2099 version "4.17.4"
2100 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
2101
2102log-symbols@4.0.0:
2103 version "4.0.0"
2104 resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
2105 integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==
2106 dependencies:
2107 chalk "^4.0.0"
2108
2109lower-case@^1.1.1:
2110 version "1.1.4"
2111 resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
2112
2113lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
2114 version "1.0.1"
2115 resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
2116
2117lowercase-keys@^2.0.0:
2118 version "2.0.0"
2119 resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
2120 integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
2121
2122make-dir@^3.0.0:
2123 version "3.0.2"
2124 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392"
2125 integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==
2126 dependencies:
2127 semver "^6.0.0"
2128
2129map-cache@^0.2.2:
2130 version "0.2.2"
2131 resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
2132
2133map-visit@^1.0.0:
2134 version "1.0.0"
2135 resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
2136 dependencies:
2137 object-visit "^1.0.0"
2138
2139marked@^0.6.2:
2140 version "0.6.3"
2141 resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946"
2142 integrity sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ==
2143
2144memoize-decorator@^1.0.2:
2145 version "1.0.2"
2146 resolved "https://registry.yarnpkg.com/memoize-decorator/-/memoize-decorator-1.0.2.tgz#605a41715c4171db192a90098b00ab8d6e1102f5"
2147
2148merge@^1.2.0:
2149 version "1.2.0"
2150 resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
2151
2152micromatch@^3.1.10, micromatch@^3.1.4:
2153 version "3.1.10"
2154 resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
2155 integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
2156 dependencies:
2157 arr-diff "^4.0.0"
2158 array-unique "^0.3.2"
2159 braces "^2.3.1"
2160 define-property "^2.0.2"
2161 extend-shallow "^3.0.2"
2162 extglob "^2.0.4"
2163 fragment-cache "^0.2.1"
2164 kind-of "^6.0.2"
2165 nanomatch "^1.2.9"
2166 object.pick "^1.3.0"
2167 regex-not "^1.0.0"
2168 snapdragon "^0.8.1"
2169 to-regex "^3.0.2"
2170
2171mimic-response@^1.0.0, mimic-response@^1.0.1:
2172 version "1.0.1"
2173 resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
2174 integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
2175
2176min-indent@^1.0.0:
2177 version "1.0.1"
2178 resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
2179 integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
2180
2181minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
2182 version "3.0.4"
2183 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
2184 dependencies:
2185 brace-expansion "^1.1.7"
2186
2187minimist@0.0.8:
2188 version "0.0.8"
2189 resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
2190
2191minimist@1.1.x:
2192 version "1.1.3"
2193 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8"
2194
2195minimist@^1.2.0:
2196 version "1.2.0"
2197 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
2198
2199minipass@^2.2.1, minipass@^2.3.3:
2200 version "2.3.3"
2201 resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
2202 dependencies:
2203 safe-buffer "^5.1.2"
2204 yallist "^3.0.0"
2205
2206minizlib@^1.1.0:
2207 version "1.1.0"
2208 resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
2209 dependencies:
2210 minipass "^2.2.1"
2211
2212mixin-deep@^1.2.0:
2213 version "1.3.1"
2214 resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
2215 dependencies:
2216 for-in "^1.0.2"
2217 is-extendable "^1.0.1"
2218
2219mkdirp@^0.5.0, mkdirp@^0.5.1:
2220 version "0.5.1"
2221 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
2222 dependencies:
2223 minimist "0.0.8"
2224
2225mkdirp@^1.0.4:
2226 version "1.0.4"
2227 resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
2228 integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
2229
2230mocha@^8.2.0:
2231 version "8.2.0"
2232 resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.0.tgz#f8aa79110b4b5a6580c65d4dd8083c425282624e"
2233 integrity sha512-lEWEMq2LMfNJMKeuEwb5UELi+OgFDollXaytR5ggQcHpzG3NP/R7rvixAvF+9/lLsTWhWG+4yD2M70GsM06nxw==
2234 dependencies:
2235 "@ungap/promise-all-settled" "1.1.2"
2236 ansi-colors "4.1.1"
2237 browser-stdout "1.3.1"
2238 chokidar "3.4.3"
2239 debug "4.2.0"
2240 diff "4.0.2"
2241 escape-string-regexp "4.0.0"
2242 find-up "5.0.0"
2243 glob "7.1.6"
2244 growl "1.10.5"
2245 he "1.2.0"
2246 js-yaml "3.14.0"
2247 log-symbols "4.0.0"
2248 minimatch "3.0.4"
2249 ms "2.1.2"
2250 nanoid "3.1.12"
2251 serialize-javascript "5.0.1"
2252 strip-json-comments "3.1.1"
2253 supports-color "7.2.0"
2254 which "2.0.2"
2255 wide-align "1.1.3"
2256 workerpool "6.0.2"
2257 yargs "13.3.2"
2258 yargs-parser "13.1.2"
2259 yargs-unparser "2.0.0"
2260
2261ms@2.0.0:
2262 version "2.0.0"
2263 resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
2264
2265ms@2.1.2:
2266 version "2.1.2"
2267 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
2268 integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
2269
2270ms@^2.1.1:
2271 version "2.1.1"
2272 resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
2273 integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
2274
2275multipipe@1.0.2:
2276 version "1.0.2"
2277 resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-1.0.2.tgz#cc13efd833c9cda99f224f868461b8e1a3fd939d"
2278 integrity sha1-zBPv2DPJzamfIk+GhGG44aP9k50=
2279 dependencies:
2280 duplexer2 "^0.1.2"
2281 object-assign "^4.1.0"
2282
2283mute-stream@0.0.5:
2284 version "0.0.5"
2285 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
2286
2287nan@^2.9.2:
2288 version "2.10.0"
2289 resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
2290
2291nanoid@3.1.12:
2292 version "3.1.12"
2293 resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654"
2294 integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==
2295
2296nanomatch@^1.2.9:
2297 version "1.2.13"
2298 resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
2299 dependencies:
2300 arr-diff "^4.0.0"
2301 array-unique "^0.3.2"
2302 define-property "^2.0.2"
2303 extend-shallow "^3.0.2"
2304 fragment-cache "^0.2.1"
2305 is-windows "^1.0.2"
2306 kind-of "^6.0.2"
2307 object.pick "^1.3.0"
2308 regex-not "^1.0.0"
2309 snapdragon "^0.8.1"
2310 to-regex "^3.0.1"
2311
2312needle@^2.2.1:
2313 version "2.2.1"
2314 resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
2315 dependencies:
2316 debug "^2.1.2"
2317 iconv-lite "^0.4.4"
2318 sax "^1.2.4"
2319
2320no-case@^2.2.0:
2321 version "2.3.2"
2322 resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
2323 dependencies:
2324 lower-case "^1.1.1"
2325
2326node-pre-gyp@^0.10.0:
2327 version "0.10.3"
2328 resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
2329 dependencies:
2330 detect-libc "^1.0.2"
2331 mkdirp "^0.5.1"
2332 needle "^2.2.1"
2333 nopt "^4.0.1"
2334 npm-packlist "^1.1.6"
2335 npmlog "^4.0.2"
2336 rc "^1.2.7"
2337 rimraf "^2.6.1"
2338 semver "^5.3.0"
2339 tar "^4"
2340
2341nodemon@^2.0.6:
2342 version "2.0.6"
2343 resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.6.tgz#1abe1937b463aaf62f0d52e2b7eaadf28cc2240d"
2344 integrity sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==
2345 dependencies:
2346 chokidar "^3.2.2"
2347 debug "^3.2.6"
2348 ignore-by-default "^1.0.1"
2349 minimatch "^3.0.4"
2350 pstree.remy "^1.1.7"
2351 semver "^5.7.1"
2352 supports-color "^5.5.0"
2353 touch "^3.1.0"
2354 undefsafe "^2.0.3"
2355 update-notifier "^4.1.0"
2356
2357nopt@^4.0.1:
2358 version "4.0.1"
2359 resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
2360 dependencies:
2361 abbrev "1"
2362 osenv "^0.1.4"
2363
2364nopt@~1.0.10:
2365 version "1.0.10"
2366 resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
2367 dependencies:
2368 abbrev "1"
2369
2370normalize-path@^2.1.1:
2371 version "2.1.1"
2372 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
2373 dependencies:
2374 remove-trailing-separator "^1.0.1"
2375
2376normalize-path@^3.0.0, normalize-path@~3.0.0:
2377 version "3.0.0"
2378 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
2379 integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
2380
2381normalize-url@^4.1.0:
2382 version "4.5.0"
2383 resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
2384 integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
2385
2386now-and-later@^2.0.0:
2387 version "2.0.1"
2388 resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c"
2389 integrity sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==
2390 dependencies:
2391 once "^1.3.2"
2392
2393npm-bundled@^1.0.1:
2394 version "1.0.3"
2395 resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
2396
2397npm-packlist@^1.1.6:
2398 version "1.1.10"
2399 resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a"
2400 dependencies:
2401 ignore-walk "^3.0.1"
2402 npm-bundled "^1.0.1"
2403
2404npmlog@^4.0.2:
2405 version "4.1.2"
2406 resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
2407 dependencies:
2408 are-we-there-yet "~1.1.2"
2409 console-control-strings "~1.1.0"
2410 gauge "~2.7.3"
2411 set-blocking "~2.0.0"
2412
2413number-is-nan@^1.0.0:
2414 version "1.0.1"
2415 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
2416
2417nunjucks@^3.1.7:
2418 version "3.2.0"
2419 resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.2.0.tgz#53e95f43c9555e822e8950008a201b1002d49933"
2420 integrity sha512-YS/qEQ6N7qCnUdm6EoYRBfJUdWNT0PpKbbRnogV2XyXbBm2STIP1O6yrdZHgwMVK7fIYUx7i8+yatEixnXSB1w==
2421 dependencies:
2422 a-sync-waterfall "^1.0.0"
2423 asap "^2.0.3"
2424 yargs "^3.32.0"
2425 optionalDependencies:
2426 chokidar "^2.0.0"
2427
2428object-assign@^3.0.0:
2429 version "3.0.0"
2430 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
2431
2432object-assign@^4.0.1, object-assign@^4.1.0:
2433 version "4.1.1"
2434 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
2435
2436object-copy@^0.1.0:
2437 version "0.1.0"
2438 resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
2439 dependencies:
2440 copy-descriptor "^0.1.0"
2441 define-property "^0.2.5"
2442 kind-of "^3.0.3"
2443
2444object-keys@^1.0.12, object-keys@^1.1.1:
2445 version "1.1.1"
2446 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
2447 integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
2448
2449object-visit@^1.0.0:
2450 version "1.0.1"
2451 resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
2452 dependencies:
2453 isobject "^3.0.0"
2454
2455object.assign@^4.0.4:
2456 version "4.1.2"
2457 resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
2458 integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
2459 dependencies:
2460 call-bind "^1.0.0"
2461 define-properties "^1.1.3"
2462 has-symbols "^1.0.1"
2463 object-keys "^1.1.1"
2464
2465object.pick@^1.3.0:
2466 version "1.3.0"
2467 resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
2468 dependencies:
2469 isobject "^3.0.1"
2470
2471once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
2472 version "1.4.0"
2473 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
2474 dependencies:
2475 wrappy "1"
2476
2477onetime@^1.0.0:
2478 version "1.1.0"
2479 resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
2480
2481optionator@^0.8.1:
2482 version "0.8.2"
2483 resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
2484 dependencies:
2485 deep-is "~0.1.3"
2486 fast-levenshtein "~2.0.4"
2487 levn "~0.3.0"
2488 prelude-ls "~1.1.2"
2489 type-check "~0.3.2"
2490 wordwrap "~1.0.0"
2491
2492ordered-read-streams@^1.0.0:
2493 version "1.0.1"
2494 resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
2495 integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=
2496 dependencies:
2497 readable-stream "^2.0.1"
2498
2499os-homedir@^1.0.0:
2500 version "1.0.2"
2501 resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
2502
2503os-locale@^1.4.0:
2504 version "1.4.0"
2505 resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
2506 dependencies:
2507 lcid "^1.0.0"
2508
2509os-tmpdir@^1.0.0:
2510 version "1.0.2"
2511 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
2512
2513osenv@^0.1.4:
2514 version "0.1.5"
2515 resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
2516 dependencies:
2517 os-homedir "^1.0.0"
2518 os-tmpdir "^1.0.0"
2519
2520p-cancelable@^1.0.0:
2521 version "1.1.0"
2522 resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
2523 integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
2524
2525p-limit@^2.0.0:
2526 version "2.3.0"
2527 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
2528 integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
2529 dependencies:
2530 p-try "^2.0.0"
2531
2532p-limit@^3.0.2:
2533 version "3.0.2"
2534 resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe"
2535 integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==
2536 dependencies:
2537 p-try "^2.0.0"
2538
2539p-locate@^3.0.0:
2540 version "3.0.0"
2541 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
2542 integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
2543 dependencies:
2544 p-limit "^2.0.0"
2545
2546p-locate@^5.0.0:
2547 version "5.0.0"
2548 resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
2549 integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
2550 dependencies:
2551 p-limit "^3.0.2"
2552
2553p-try@^2.0.0:
2554 version "2.2.0"
2555 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
2556 integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
2557
2558package-json@^6.3.0:
2559 version "6.5.0"
2560 resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
2561 integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
2562 dependencies:
2563 got "^9.6.0"
2564 registry-auth-token "^4.0.0"
2565 registry-url "^5.0.0"
2566 semver "^6.2.0"
2567
2568param-case@2.1.x:
2569 version "2.1.1"
2570 resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
2571 dependencies:
2572 no-case "^2.2.0"
2573
2574pascalcase@^0.1.1:
2575 version "0.1.1"
2576 resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
2577
2578path-dirname@^1.0.0:
2579 version "1.0.2"
2580 resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
2581
2582path-exists@^3.0.0:
2583 version "3.0.0"
2584 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
2585 integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
2586
2587path-exists@^4.0.0:
2588 version "4.0.0"
2589 resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
2590 integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
2591
2592path-is-absolute@^1.0.0:
2593 version "1.0.1"
2594 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
2595
2596path-is-inside@^1.0.1:
2597 version "1.0.2"
2598 resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
2599
2600picomatch@^2.0.4, picomatch@^2.0.7, picomatch@^2.2.1:
2601 version "2.2.2"
2602 resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
2603 integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
2604
2605pify@^2.0.0:
2606 version "2.3.0"
2607 resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
2608
2609pinkie-promise@^2.0.0:
2610 version "2.0.1"
2611 resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
2612 dependencies:
2613 pinkie "^2.0.0"
2614
2615pinkie@^2.0.0:
2616 version "2.0.4"
2617 resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
2618
2619pluralize@^1.2.1:
2620 version "1.2.1"
2621 resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
2622
2623posix-character-classes@^0.1.0:
2624 version "0.1.1"
2625 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
2626
2627prelude-ls@~1.1.2:
2628 version "1.1.2"
2629 resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
2630
2631prepend-http@^2.0.0:
2632 version "2.0.0"
2633 resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
2634 integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
2635
2636process-nextick-args@^2.0.0:
2637 version "2.0.1"
2638 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
2639 integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
2640
2641process-nextick-args@~1.0.6:
2642 version "1.0.7"
2643 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
2644
2645process-nextick-args@~2.0.0:
2646 version "2.0.0"
2647 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
2648
2649progress@^1.1.8:
2650 version "1.1.8"
2651 resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
2652
2653pstree.remy@^1.1.7:
2654 version "1.1.7"
2655 resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3"
2656 integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==
2657
2658pump@^2.0.0:
2659 version "2.0.1"
2660 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
2661 integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
2662 dependencies:
2663 end-of-stream "^1.1.0"
2664 once "^1.3.1"
2665
2666pump@^3.0.0:
2667 version "3.0.0"
2668 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
2669 integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
2670 dependencies:
2671 end-of-stream "^1.1.0"
2672 once "^1.3.1"
2673
2674pumpify@^1.3.5:
2675 version "1.5.1"
2676 resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
2677 integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
2678 dependencies:
2679 duplexify "^3.6.0"
2680 inherits "^2.0.3"
2681 pump "^2.0.0"
2682
2683pupa@^2.0.1:
2684 version "2.0.1"
2685 resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726"
2686 integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==
2687 dependencies:
2688 escape-goat "^2.0.0"
2689
2690q@1.*:
2691 version "1.5.1"
2692 resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
2693
2694randombytes@^2.1.0:
2695 version "2.1.0"
2696 resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
2697 integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
2698 dependencies:
2699 safe-buffer "^5.1.0"
2700
2701rc@^1.2.7, rc@^1.2.8:
2702 version "1.2.8"
2703 resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
2704 dependencies:
2705 deep-extend "^0.6.0"
2706 ini "~1.3.0"
2707 minimist "^1.2.0"
2708 strip-json-comments "~2.0.1"
2709
2710"readable-stream@>=1.1.13-1 <1.2.0-0":
2711 version "1.1.14"
2712 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
2713 dependencies:
2714 core-util-is "~1.0.0"
2715 inherits "~2.0.1"
2716 isarray "0.0.1"
2717 string_decoder "~0.10.x"
2718
2719readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5:
2720 version "2.3.6"
2721 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
2722 dependencies:
2723 core-util-is "~1.0.0"
2724 inherits "~2.0.3"
2725 isarray "~1.0.0"
2726 process-nextick-args "~2.0.0"
2727 safe-buffer "~5.1.1"
2728 string_decoder "~1.1.1"
2729 util-deprecate "~1.0.1"
2730
2731readable-stream@^2.2.2:
2732 version "2.3.3"
2733 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
2734 dependencies:
2735 core-util-is "~1.0.0"
2736 inherits "~2.0.3"
2737 isarray "~1.0.0"
2738 process-nextick-args "~1.0.6"
2739 safe-buffer "~5.1.1"
2740 string_decoder "~1.0.3"
2741 util-deprecate "~1.0.1"
2742
2743readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6:
2744 version "2.3.7"
2745 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
2746 integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
2747 dependencies:
2748 core-util-is "~1.0.0"
2749 inherits "~2.0.3"
2750 isarray "~1.0.0"
2751 process-nextick-args "~2.0.0"
2752 safe-buffer "~5.1.1"
2753 string_decoder "~1.1.1"
2754 util-deprecate "~1.0.1"
2755
2756readable-stream@^3.0.2:
2757 version "3.6.0"
2758 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
2759 integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
2760 dependencies:
2761 inherits "^2.0.3"
2762 string_decoder "^1.1.1"
2763 util-deprecate "^1.0.1"
2764
2765readdirp@^2.2.1:
2766 version "2.2.1"
2767 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
2768 integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
2769 dependencies:
2770 graceful-fs "^4.1.11"
2771 micromatch "^3.1.10"
2772 readable-stream "^2.0.2"
2773
2774readdirp@~3.3.0:
2775 version "3.3.0"
2776 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17"
2777 integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==
2778 dependencies:
2779 picomatch "^2.0.7"
2780
2781readdirp@~3.5.0:
2782 version "3.5.0"
2783 resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
2784 integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
2785 dependencies:
2786 picomatch "^2.2.1"
2787
2788readline2@^1.0.1:
2789 version "1.0.1"
2790 resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
2791 dependencies:
2792 code-point-at "^1.0.0"
2793 is-fullwidth-code-point "^1.0.0"
2794 mute-stream "0.0.5"
2795
2796regenerator-runtime@^0.11.0:
2797 version "0.11.1"
2798 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
2799
2800regex-not@^1.0.0, regex-not@^1.0.2:
2801 version "1.0.2"
2802 resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
2803 dependencies:
2804 extend-shallow "^3.0.2"
2805 safe-regex "^1.1.0"
2806
2807registry-auth-token@^4.0.0:
2808 version "4.1.1"
2809 resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479"
2810 integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==
2811 dependencies:
2812 rc "^1.2.8"
2813
2814registry-url@^5.0.0:
2815 version "5.1.0"
2816 resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
2817 integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
2818 dependencies:
2819 rc "^1.2.8"
2820
2821relateurl@0.2.x:
2822 version "0.2.7"
2823 resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
2824
2825remove-bom-buffer@^3.0.0:
2826 version "3.0.0"
2827 resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
2828 integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==
2829 dependencies:
2830 is-buffer "^1.1.5"
2831 is-utf8 "^0.2.1"
2832
2833remove-bom-stream@^1.2.0:
2834 version "1.2.0"
2835 resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
2836 integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=
2837 dependencies:
2838 remove-bom-buffer "^3.0.0"
2839 safe-buffer "^5.1.0"
2840 through2 "^2.0.3"
2841
2842remove-trailing-separator@^1.0.1:
2843 version "1.1.0"
2844 resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
2845
2846repeat-element@^1.1.2:
2847 version "1.1.2"
2848 resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
2849
2850repeat-string@^1.6.1:
2851 version "1.6.1"
2852 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
2853
2854replace-ext@0.0.1:
2855 version "0.0.1"
2856 resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
2857
2858replace-ext@^1.0.0:
2859 version "1.0.1"
2860 resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
2861 integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
2862
2863require-directory@^2.1.1:
2864 version "2.1.1"
2865 resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
2866
2867require-main-filename@^2.0.0:
2868 version "2.0.0"
2869 resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
2870 integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
2871
2872require-uncached@^1.0.2:
2873 version "1.0.3"
2874 resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
2875 dependencies:
2876 caller-path "^0.1.0"
2877 resolve-from "^1.0.0"
2878
2879resolve-from@^1.0.0:
2880 version "1.0.1"
2881 resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
2882
2883resolve-options@^1.1.0:
2884 version "1.1.0"
2885 resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
2886 integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=
2887 dependencies:
2888 value-or-function "^3.0.0"
2889
2890resolve-url@^0.2.1:
2891 version "0.2.1"
2892 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
2893
2894responselike@^1.0.2:
2895 version "1.0.2"
2896 resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
2897 integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
2898 dependencies:
2899 lowercase-keys "^1.0.0"
2900
2901restore-cursor@^1.0.1:
2902 version "1.0.1"
2903 resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
2904 dependencies:
2905 exit-hook "^1.0.0"
2906 onetime "^1.0.0"
2907
2908ret@~0.1.10:
2909 version "0.1.15"
2910 resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
2911
2912rimraf@2.*, rimraf@^2.2.8, rimraf@^2.6.1:
2913 version "2.6.2"
2914 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
2915 dependencies:
2916 glob "^7.0.5"
2917
2918rimraf@^3.0.2:
2919 version "3.0.2"
2920 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
2921 integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
2922 dependencies:
2923 glob "^7.1.3"
2924
2925run-async@^0.1.0:
2926 version "0.1.0"
2927 resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
2928 dependencies:
2929 once "^1.3.0"
2930
2931rx-lite@^3.1.2:
2932 version "3.1.2"
2933 resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
2934
2935safe-buffer@^5.1.0, safe-buffer@~5.2.0:
2936 version "5.2.1"
2937 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
2938 integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
2939
2940safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
2941 version "5.1.2"
2942 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
2943
2944safe-regex@^1.1.0:
2945 version "1.1.0"
2946 resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
2947 dependencies:
2948 ret "~0.1.10"
2949
2950safe-wipe@0.2.5:
2951 version "0.2.5"
2952 resolved "https://registry.yarnpkg.com/safe-wipe/-/safe-wipe-0.2.5.tgz#dbb331be98d32fee660372999ee5d1ae89ab2fdd"
2953 integrity sha512-MwTNf4YrRqCHsB5jUzOVdXoRbW4jkhgTvhlyfiaxox8EP7cOCiD4ydMOQCxDPR9KpvwdBSM2dQHScV1m85k8wQ==
2954 dependencies:
2955 extend "^3.0.2"
2956 q "1.*"
2957 rimraf "2.*"
2958
2959"safer-buffer@>= 2.1.2 < 3":
2960 version "2.1.2"
2961 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
2962
2963sass-convert@^0.5.0:
2964 version "0.5.2"
2965 resolved "https://registry.yarnpkg.com/sass-convert/-/sass-convert-0.5.2.tgz#b1ed42b0e8d6fe98ec7ed6e78a38e26564860f06"
2966 dependencies:
2967 concat-stream "^1.4.7"
2968 dargs "^4.0.0"
2969 ends-with "^0.2.0"
2970 es6-denodeify "^0.1.0"
2971 es6-promise "^3.0.2"
2972 memoize-decorator "^1.0.2"
2973 object-assign "^3.0.0"
2974 semver "^5.0.1"
2975 semver-regex "^1.0.0"
2976 through2 "^2.0.0"
2977 which "^1.0.5"
2978
2979sass-lint@^1.12.1:
2980 version "1.13.1"
2981 resolved "https://registry.yarnpkg.com/sass-lint/-/sass-lint-1.13.1.tgz#5fd2b2792e9215272335eb0f0dc607f61e8acc8f"
2982 integrity sha512-DSyah8/MyjzW2BWYmQWekYEKir44BpLqrCFsgs9iaWiVTcwZfwXHF586hh3D1n+/9ihUNMfd8iHAyb9KkGgs7Q==
2983 dependencies:
2984 commander "^2.8.1"
2985 eslint "^2.7.0"
2986 front-matter "2.1.2"
2987 fs-extra "^3.0.1"
2988 glob "^7.0.0"
2989 globule "^1.0.0"
2990 gonzales-pe-sl "^4.2.3"
2991 js-yaml "^3.5.4"
2992 known-css-properties "^0.3.0"
2993 lodash.capitalize "^4.1.0"
2994 lodash.kebabcase "^4.0.0"
2995 merge "^1.2.0"
2996 path-is-absolute "^1.0.0"
2997 util "^0.10.3"
2998
2999sass-true@^6.0.1:
3000 version "6.0.1"
3001 resolved "https://registry.yarnpkg.com/sass-true/-/sass-true-6.0.1.tgz#c159fa27df2f9ee22bb624a851144a8af7dc8a32"
3002 integrity sha512-Ow72fStIgw+qRRUc0r77emeWry06a3e1hXtadPEzDL/GFiEjtQKZel5fr+gu85zC8JYmLkZofMn6x9b/sq+wfg==
3003 dependencies:
3004 chalk "^4.1.0"
3005 css "^3.0.0"
3006 lodash "^4.17.19"
3007
3008sass@^1.28.0:
3009 version "1.28.0"
3010 resolved "https://registry.yarnpkg.com/sass/-/sass-1.28.0.tgz#546f1308ff74cc4ec2ad735fd35dc18bc3f51f72"
3011 integrity sha512-9FWX/0wuE1KxwfiP02chZhHaPzu6adpx9+wGch7WMOuHy5npOo0UapRI3FNSHva2CczaYJu2yNUBN8cCSqHz/A==
3012 dependencies:
3013 chokidar ">=2.0.0 <4.0.0"
3014
3015sassdoc-extras@^2.5.0:
3016 version "2.5.1"
3017 resolved "https://registry.yarnpkg.com/sassdoc-extras/-/sassdoc-extras-2.5.1.tgz#4365a0463c9a085d588c213a06c82beb85966400"
3018 integrity sha512-/+ilEnk1H1hG9nympL1GIFWhAczzoclyDzgzfphIg46nsT/dWJuzWYHyzIpduc/nTVwKeQfmTz0ZVvy12QMkrQ==
3019 dependencies:
3020 marked "^0.6.2"
3021
3022sassdoc-theme-default@^2.8.3:
3023 version "2.8.3"
3024 resolved "https://registry.yarnpkg.com/sassdoc-theme-default/-/sassdoc-theme-default-2.8.3.tgz#092854a5654aa5c2820983fbe669dfbff2ef7bd1"
3025 integrity sha512-KEl1ghIAwkkBGiYvkwVFepOA8IDEqgKsm0fGHUIcepcXiIp2SoHA0ZC5TZFjwaTrs296K1QK5WL4QtjNhS76+g==
3026 dependencies:
3027 babel-runtime "^6.22.0"
3028 chroma-js "^1.2.2"
3029 es6-denodeify "^0.1.0"
3030 es6-promise "^4.2.6"
3031 extend "^3.0.2"
3032 fs-extra "^2.0.0"
3033 html-minifier "^3.5.21"
3034 nunjucks "^3.1.7"
3035 sassdoc-extras "^2.5.0"
3036
3037sassdoc@^2.7.3:
3038 version "2.7.3"
3039 resolved "https://registry.yarnpkg.com/sassdoc/-/sassdoc-2.7.3.tgz#dfde10e6cc090c28578298f985f92df7d4c6ddbc"
3040 integrity sha512-ccHlaOVoyGHF41xzj09n9WrECRHSGesFVq2EwX6DGMQdG0+avrxaLiuMLD26QfGyF2qcXVt07w5ifP5KZqy1Qw==
3041 dependencies:
3042 ansi-styles "^4.2.1"
3043 babel-runtime "^6.26.0"
3044 chalk "^2.4.2"
3045 concat-stream "^2.0.0"
3046 docopt "^0.6.1"
3047 glob "^7.1.6"
3048 glob2base "0.0.12"
3049 js-yaml "^3.14.0"
3050 lodash.difference "^4.5.0"
3051 lodash.uniq "^4.5.0"
3052 minimatch "^3.0.4"
3053 mkdirp "^1.0.4"
3054 multipipe "1.0.2"
3055 rimraf "^3.0.2"
3056 safe-wipe "0.2.5"
3057 sass-convert "^0.5.0"
3058 sassdoc-theme-default "^2.8.3"
3059 scss-comment-parser "^0.8.4"
3060 strip-indent "^3.0.0"
3061 through2 "1.1.1"
3062 update-notifier "^4.1.0"
3063 vinyl-fs "^3.0.3"
3064 vinyl-source-stream "1.1.2"
3065 vinyl-string "^1.0.2"
3066
3067sax@^1.2.4:
3068 version "1.2.4"
3069 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
3070
3071scss-comment-parser@^0.8.4:
3072 version "0.8.4"
3073 resolved "https://registry.yarnpkg.com/scss-comment-parser/-/scss-comment-parser-0.8.4.tgz#8e82c3fcf7fdbbb7f172f8955e2aa88b685f86d8"
3074 integrity sha512-ERw4BODvM22n8Ke8hJxuH3fKXLm0Q4chfUNHwDSOAExCths2ZXq8PT32vms4R9Om6dffRSXzzGZS1p38UU4EAg==
3075 dependencies:
3076 cdocparser "^0.13.0"
3077
3078semver-diff@^3.1.1:
3079 version "3.1.1"
3080 resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
3081 integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
3082 dependencies:
3083 semver "^6.3.0"
3084
3085semver-regex@^1.0.0:
3086 version "1.0.0"
3087 resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9"
3088
3089semver@^5.0.1, semver@^5.3.0:
3090 version "5.5.0"
3091 resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
3092
3093semver@^5.7.1:
3094 version "5.7.1"
3095 resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
3096 integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
3097
3098semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
3099 version "6.3.0"
3100 resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
3101 integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
3102
3103serialize-javascript@5.0.1:
3104 version "5.0.1"
3105 resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
3106 integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
3107 dependencies:
3108 randombytes "^2.1.0"
3109
3110set-blocking@^2.0.0, set-blocking@~2.0.0:
3111 version "2.0.0"
3112 resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
3113
3114set-value@^0.4.3:
3115 version "0.4.3"
3116 resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
3117 dependencies:
3118 extend-shallow "^2.0.1"
3119 is-extendable "^0.1.1"
3120 is-plain-object "^2.0.1"
3121 to-object-path "^0.3.0"
3122
3123set-value@^2.0.0:
3124 version "2.0.0"
3125 resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
3126 dependencies:
3127 extend-shallow "^2.0.1"
3128 is-extendable "^0.1.1"
3129 is-plain-object "^2.0.3"
3130 split-string "^3.0.1"
3131
3132shelljs@^0.6.0:
3133 version "0.6.1"
3134 resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.6.1.tgz#ec6211bed1920442088fe0f70b2837232ed2c8a8"
3135
3136signal-exit@^3.0.0, signal-exit@^3.0.2:
3137 version "3.0.2"
3138 resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
3139
3140slice-ansi@0.0.4:
3141 version "0.0.4"
3142 resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
3143
3144snapdragon-node@^2.0.1:
3145 version "2.1.1"
3146 resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
3147 dependencies:
3148 define-property "^1.0.0"
3149 isobject "^3.0.0"
3150 snapdragon-util "^3.0.1"
3151
3152snapdragon-util@^3.0.1:
3153 version "3.0.1"
3154 resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
3155 dependencies:
3156 kind-of "^3.2.0"
3157
3158snapdragon@^0.8.1:
3159 version "0.8.2"
3160 resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
3161 dependencies:
3162 base "^0.11.1"
3163 debug "^2.2.0"
3164 define-property "^0.2.5"
3165 extend-shallow "^2.0.1"
3166 map-cache "^0.2.2"
3167 source-map "^0.5.6"
3168 source-map-resolve "^0.5.0"
3169 use "^3.1.0"
3170
3171source-map-resolve@^0.5.0:
3172 version "0.5.2"
3173 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
3174 dependencies:
3175 atob "^2.1.1"
3176 decode-uri-component "^0.2.0"
3177 resolve-url "^0.2.1"
3178 source-map-url "^0.4.0"
3179 urix "^0.1.0"
3180
3181source-map-resolve@^0.6.0:
3182 version "0.6.0"
3183 resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2"
3184 integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==
3185 dependencies:
3186 atob "^2.1.2"
3187 decode-uri-component "^0.2.0"
3188
3189source-map-url@^0.4.0:
3190 version "0.4.0"
3191 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
3192
3193source-map@^0.5.6:
3194 version "0.5.7"
3195 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
3196
3197source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
3198 version "0.6.1"
3199 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
3200 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
3201
3202split-string@^3.0.1, split-string@^3.0.2:
3203 version "3.1.0"
3204 resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
3205 dependencies:
3206 extend-shallow "^3.0.0"
3207
3208sprintf-js@~1.0.2:
3209 version "1.0.3"
3210 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
3211
3212static-extend@^0.1.1:
3213 version "0.1.2"
3214 resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
3215 dependencies:
3216 define-property "^0.2.5"
3217 object-copy "^0.1.0"
3218
3219stream-shift@^1.0.0:
3220 version "1.0.0"
3221 resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
3222
3223string-width@^1.0.1:
3224 version "1.0.2"
3225 resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
3226 dependencies:
3227 code-point-at "^1.0.0"
3228 is-fullwidth-code-point "^1.0.0"
3229 strip-ansi "^3.0.0"
3230
3231"string-width@^1.0.2 || 2", string-width@^2.0.0:
3232 version "2.1.1"
3233 resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
3234 dependencies:
3235 is-fullwidth-code-point "^2.0.0"
3236 strip-ansi "^4.0.0"
3237
3238string-width@^3.0.0, string-width@^3.1.0:
3239 version "3.1.0"
3240 resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
3241 integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
3242 dependencies:
3243 emoji-regex "^7.0.1"
3244 is-fullwidth-code-point "^2.0.0"
3245 strip-ansi "^5.1.0"
3246
3247string-width@^4.0.0, string-width@^4.1.0:
3248 version "4.2.0"
3249 resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
3250 integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
3251 dependencies:
3252 emoji-regex "^8.0.0"
3253 is-fullwidth-code-point "^3.0.0"
3254 strip-ansi "^6.0.0"
3255
3256string_decoder@^1.1.1:
3257 version "1.3.0"
3258 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
3259 integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
3260 dependencies:
3261 safe-buffer "~5.2.0"
3262
3263string_decoder@~0.10.x:
3264 version "0.10.31"
3265 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
3266
3267string_decoder@~1.0.3:
3268 version "1.0.3"
3269 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
3270 dependencies:
3271 safe-buffer "~5.1.0"
3272
3273string_decoder@~1.1.1:
3274 version "1.1.1"
3275 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
3276 dependencies:
3277 safe-buffer "~5.1.0"
3278
3279strip-ansi@^3.0.0, strip-ansi@^3.0.1:
3280 version "3.0.1"
3281 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
3282 dependencies:
3283 ansi-regex "^2.0.0"
3284
3285strip-ansi@^4.0.0:
3286 version "4.0.0"
3287 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
3288 dependencies:
3289 ansi-regex "^3.0.0"
3290
3291strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
3292 version "5.2.0"
3293 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
3294 integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
3295 dependencies:
3296 ansi-regex "^4.1.0"
3297
3298strip-ansi@^6.0.0:
3299 version "6.0.0"
3300 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
3301 integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
3302 dependencies:
3303 ansi-regex "^5.0.0"
3304
3305strip-indent@^1.0.0:
3306 version "1.0.1"
3307 resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
3308 dependencies:
3309 get-stdin "^4.0.1"
3310
3311strip-indent@^3.0.0:
3312 version "3.0.0"
3313 resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
3314 integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
3315 dependencies:
3316 min-indent "^1.0.0"
3317
3318strip-json-comments@3.1.1:
3319 version "3.1.1"
3320 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
3321 integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
3322
3323strip-json-comments@~1.0.1:
3324 version "1.0.4"
3325 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
3326
3327strip-json-comments@~2.0.1:
3328 version "2.0.1"
3329 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
3330 integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
3331
3332supports-color@7.2.0:
3333 version "7.2.0"
3334 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
3335 integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
3336 dependencies:
3337 has-flag "^4.0.0"
3338
3339supports-color@^2.0.0:
3340 version "2.0.0"
3341 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
3342
3343supports-color@^5.3.0:
3344 version "5.4.0"
3345 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
3346 integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
3347 dependencies:
3348 has-flag "^3.0.0"
3349
3350supports-color@^5.5.0:
3351 version "5.5.0"
3352 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
3353 integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
3354 dependencies:
3355 has-flag "^3.0.0"
3356
3357supports-color@^7.1.0:
3358 version "7.1.0"
3359 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
3360 integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
3361 dependencies:
3362 has-flag "^4.0.0"
3363
3364table@^3.7.8:
3365 version "3.8.3"
3366 resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
3367 dependencies:
3368 ajv "^4.7.0"
3369 ajv-keywords "^1.0.0"
3370 chalk "^1.1.1"
3371 lodash "^4.0.0"
3372 slice-ansi "0.0.4"
3373 string-width "^2.0.0"
3374
3375tar@^4:
3376 version "4.4.4"
3377 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
3378 dependencies:
3379 chownr "^1.0.1"
3380 fs-minipass "^1.2.5"
3381 minipass "^2.3.3"
3382 minizlib "^1.1.0"
3383 mkdirp "^0.5.0"
3384 safe-buffer "^5.1.2"
3385 yallist "^3.0.2"
3386
3387term-size@^2.1.0:
3388 version "2.2.0"
3389 resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
3390 integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==
3391
3392text-table@~0.2.0:
3393 version "0.2.0"
3394 resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
3395
3396through2-filter@^2.0.0:
3397 version "2.0.0"
3398 resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
3399 dependencies:
3400 through2 "~2.0.0"
3401 xtend "~4.0.0"
3402
3403through2@1.1.1:
3404 version "1.1.1"
3405 resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545"
3406 dependencies:
3407 readable-stream ">=1.1.13-1 <1.2.0-0"
3408 xtend ">=4.0.0 <4.1.0-0"
3409
3410through2@^2.0.0, through2@^2.0.3, through2@~2.0.0:
3411 version "2.0.3"
3412 resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
3413 dependencies:
3414 readable-stream "^2.1.5"
3415 xtend "~4.0.1"
3416
3417through@^2.3.6:
3418 version "2.3.8"
3419 resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
3420
3421to-absolute-glob@^2.0.0:
3422 version "2.0.2"
3423 resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
3424 integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=
3425 dependencies:
3426 is-absolute "^1.0.0"
3427 is-negated-glob "^1.0.0"
3428
3429to-object-path@^0.3.0:
3430 version "0.3.0"
3431 resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
3432 dependencies:
3433 kind-of "^3.0.2"
3434
3435to-readable-stream@^1.0.0:
3436 version "1.0.0"
3437 resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
3438 integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
3439
3440to-regex-range@^2.1.0:
3441 version "2.1.1"
3442 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
3443 dependencies:
3444 is-number "^3.0.0"
3445 repeat-string "^1.6.1"
3446
3447to-regex-range@^5.0.1:
3448 version "5.0.1"
3449 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
3450 integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
3451 dependencies:
3452 is-number "^7.0.0"
3453
3454to-regex@^3.0.1, to-regex@^3.0.2:
3455 version "3.0.2"
3456 resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
3457 dependencies:
3458 define-property "^2.0.2"
3459 extend-shallow "^3.0.2"
3460 regex-not "^1.0.2"
3461 safe-regex "^1.1.0"
3462
3463to-through@^2.0.0:
3464 version "2.0.0"
3465 resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
3466 integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=
3467 dependencies:
3468 through2 "^2.0.3"
3469
3470touch@^3.1.0:
3471 version "3.1.0"
3472 resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
3473 dependencies:
3474 nopt "~1.0.10"
3475
3476type-check@~0.3.2:
3477 version "0.3.2"
3478 resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
3479 dependencies:
3480 prelude-ls "~1.1.2"
3481
3482type-fest@^0.8.1:
3483 version "0.8.1"
3484 resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
3485 integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
3486
3487typedarray-to-buffer@^3.1.5:
3488 version "3.1.5"
3489 resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
3490 integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
3491 dependencies:
3492 is-typedarray "^1.0.0"
3493
3494typedarray@^0.0.6:
3495 version "0.0.6"
3496 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
3497
3498uglify-js@3.4.x:
3499 version "3.4.9"
3500 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
3501 integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==
3502 dependencies:
3503 commander "~2.17.1"
3504 source-map "~0.6.1"
3505
3506unc-path-regex@^0.1.2:
3507 version "0.1.2"
3508 resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
3509 integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
3510
3511undefsafe@^2.0.3:
3512 version "2.0.3"
3513 resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
3514 integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==
3515 dependencies:
3516 debug "^2.2.0"
3517
3518union-value@^1.0.0:
3519 version "1.0.0"
3520 resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
3521 dependencies:
3522 arr-union "^3.1.0"
3523 get-value "^2.0.6"
3524 is-extendable "^0.1.1"
3525 set-value "^0.4.3"
3526
3527unique-stream@^2.0.2:
3528 version "2.2.1"
3529 resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369"
3530 dependencies:
3531 json-stable-stringify "^1.0.0"
3532 through2-filter "^2.0.0"
3533
3534unique-string@^2.0.0:
3535 version "2.0.0"
3536 resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
3537 integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
3538 dependencies:
3539 crypto-random-string "^2.0.0"
3540
3541universalify@^0.1.0:
3542 version "0.1.1"
3543 resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
3544
3545unset-value@^1.0.0:
3546 version "1.0.0"
3547 resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
3548 dependencies:
3549 has-value "^0.3.1"
3550 isobject "^3.0.0"
3551
3552upath@^1.1.1:
3553 version "1.1.2"
3554 resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
3555 integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
3556
3557update-notifier@^4.1.0:
3558 version "4.1.3"
3559 resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3"
3560 integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==
3561 dependencies:
3562 boxen "^4.2.0"
3563 chalk "^3.0.0"
3564 configstore "^5.0.1"
3565 has-yarn "^2.1.0"
3566 import-lazy "^2.1.0"
3567 is-ci "^2.0.0"
3568 is-installed-globally "^0.3.1"
3569 is-npm "^4.0.0"
3570 is-yarn-global "^0.3.0"
3571 latest-version "^5.0.0"
3572 pupa "^2.0.1"
3573 semver-diff "^3.1.1"
3574 xdg-basedir "^4.0.0"
3575
3576upper-case@^1.1.1:
3577 version "1.1.3"
3578 resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
3579
3580urix@^0.1.0:
3581 version "0.1.0"
3582 resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
3583
3584url-parse-lax@^3.0.0:
3585 version "3.0.0"
3586 resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
3587 integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
3588 dependencies:
3589 prepend-http "^2.0.0"
3590
3591use@^3.1.0:
3592 version "3.1.1"
3593 resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
3594
3595user-home@^2.0.0:
3596 version "2.0.0"
3597 resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
3598 dependencies:
3599 os-homedir "^1.0.0"
3600
3601util-deprecate@^1.0.1, util-deprecate@~1.0.1:
3602 version "1.0.2"
3603 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
3604
3605util@^0.10.3:
3606 version "0.10.3"
3607 resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
3608 dependencies:
3609 inherits "2.0.1"
3610
3611value-or-function@^3.0.0:
3612 version "3.0.0"
3613 resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
3614 integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
3615
3616vinyl-fs@^3.0.3:
3617 version "3.0.3"
3618 resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
3619 integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
3620 dependencies:
3621 fs-mkdirp-stream "^1.0.0"
3622 glob-stream "^6.1.0"
3623 graceful-fs "^4.0.0"
3624 is-valid-glob "^1.0.0"
3625 lazystream "^1.0.0"
3626 lead "^1.0.0"
3627 object.assign "^4.0.4"
3628 pumpify "^1.3.5"
3629 readable-stream "^2.3.3"
3630 remove-bom-buffer "^3.0.0"
3631 remove-bom-stream "^1.2.0"
3632 resolve-options "^1.1.0"
3633 through2 "^2.0.0"
3634 to-through "^2.0.0"
3635 value-or-function "^3.0.0"
3636 vinyl "^2.0.0"
3637 vinyl-sourcemap "^1.1.0"
3638
3639vinyl-source-stream@1.1.2:
3640 version "1.1.2"
3641 resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz#62b53a135610a896e98ca96bee3a87f008a8e780"
3642 integrity sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=
3643 dependencies:
3644 through2 "^2.0.3"
3645 vinyl "^0.4.3"
3646
3647vinyl-sourcemap@^1.1.0:
3648 version "1.1.0"
3649 resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
3650 integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=
3651 dependencies:
3652 append-buffer "^1.0.2"
3653 convert-source-map "^1.5.0"
3654 graceful-fs "^4.1.6"
3655 normalize-path "^2.1.1"
3656 now-and-later "^2.0.0"
3657 remove-bom-buffer "^3.0.0"
3658 vinyl "^2.0.0"
3659
3660vinyl-string@^1.0.2:
3661 version "1.0.2"
3662 resolved "https://registry.yarnpkg.com/vinyl-string/-/vinyl-string-1.0.2.tgz#3a249efeb0d36c4cb0a5e59e30d68e54f739d8e3"
3663 dependencies:
3664 vinyl "^1.1.1"
3665
3666vinyl@^0.4.3:
3667 version "0.4.6"
3668 resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847"
3669 dependencies:
3670 clone "^0.2.0"
3671 clone-stats "^0.0.1"
3672
3673vinyl@^1.1.1:
3674 version "1.2.0"
3675 resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
3676 dependencies:
3677 clone "^1.0.0"
3678 clone-stats "^0.0.1"
3679 replace-ext "0.0.1"
3680
3681vinyl@^2.0.0:
3682 version "2.2.1"
3683 resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974"
3684 integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==
3685 dependencies:
3686 clone "^2.1.1"
3687 clone-buffer "^1.0.0"
3688 clone-stats "^1.0.0"
3689 cloneable-readable "^1.0.0"
3690 remove-trailing-separator "^1.0.1"
3691 replace-ext "^1.0.0"
3692
3693which-module@^2.0.0:
3694 version "2.0.0"
3695 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
3696 integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
3697
3698which@2.0.2:
3699 version "2.0.2"
3700 resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
3701 integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
3702 dependencies:
3703 isexe "^2.0.0"
3704
3705which@^1.0.5:
3706 version "1.3.0"
3707 resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
3708 dependencies:
3709 isexe "^2.0.0"
3710
3711wide-align@1.1.3, wide-align@^1.1.0:
3712 version "1.1.3"
3713 resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
3714 integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
3715 dependencies:
3716 string-width "^1.0.2 || 2"
3717
3718widest-line@^3.1.0:
3719 version "3.1.0"
3720 resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
3721 integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
3722 dependencies:
3723 string-width "^4.0.0"
3724
3725window-size@^0.1.4:
3726 version "0.1.4"
3727 resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
3728 integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=
3729
3730wordwrap@~1.0.0:
3731 version "1.0.0"
3732 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
3733
3734workerpool@6.0.2:
3735 version "6.0.2"
3736 resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438"
3737 integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==
3738
3739wrap-ansi@^2.0.0:
3740 version "2.1.0"
3741 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
3742 dependencies:
3743 string-width "^1.0.1"
3744 strip-ansi "^3.0.1"
3745
3746wrap-ansi@^5.1.0:
3747 version "5.1.0"
3748 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
3749 integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
3750 dependencies:
3751 ansi-styles "^3.2.0"
3752 string-width "^3.0.0"
3753 strip-ansi "^5.0.0"
3754
3755wrappy@1:
3756 version "1.0.2"
3757 resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
3758
3759write-file-atomic@^3.0.0:
3760 version "3.0.3"
3761 resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
3762 integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
3763 dependencies:
3764 imurmurhash "^0.1.4"
3765 is-typedarray "^1.0.0"
3766 signal-exit "^3.0.2"
3767 typedarray-to-buffer "^3.1.5"
3768
3769write@^0.2.1:
3770 version "0.2.1"
3771 resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
3772 dependencies:
3773 mkdirp "^0.5.1"
3774
3775xdg-basedir@^4.0.0:
3776 version "4.0.0"
3777 resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
3778 integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
3779
3780"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
3781 version "4.0.1"
3782 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
3783
3784y18n@^3.2.0:
3785 version "3.2.1"
3786 resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
3787
3788y18n@^4.0.0:
3789 version "4.0.0"
3790 resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
3791 integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
3792
3793yallist@^3.0.0, yallist@^3.0.2:
3794 version "3.0.2"
3795 resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
3796
3797yargs-parser@13.1.2, yargs-parser@^13.1.2:
3798 version "13.1.2"
3799 resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
3800 integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
3801 dependencies:
3802 camelcase "^5.0.0"
3803 decamelize "^1.2.0"
3804
3805yargs-unparser@2.0.0:
3806 version "2.0.0"
3807 resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
3808 integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
3809 dependencies:
3810 camelcase "^6.0.0"
3811 decamelize "^4.0.0"
3812 flat "^5.0.2"
3813 is-plain-obj "^2.1.0"
3814
3815yargs@13.3.2:
3816 version "13.3.2"
3817 resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
3818 integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
3819 dependencies:
3820 cliui "^5.0.0"
3821 find-up "^3.0.0"
3822 get-caller-file "^2.0.1"
3823 require-directory "^2.1.1"
3824 require-main-filename "^2.0.0"
3825 set-blocking "^2.0.0"
3826 string-width "^3.0.0"
3827 which-module "^2.0.0"
3828 y18n "^4.0.0"
3829 yargs-parser "^13.1.2"
3830
3831yargs@^3.32.0:
3832 version "3.32.0"
3833 resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
3834 integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=
3835 dependencies:
3836 camelcase "^2.0.1"
3837 cliui "^3.0.3"
3838 decamelize "^1.1.1"
3839 os-locale "^1.4.0"
3840 string-width "^1.0.1"
3841 window-size "^0.1.4"
3842 y18n "^3.2.0"