├── .editorconfig
├── .eslintignore
├── .eslintrc.json
├── .gitattributes
├── .gitignore
├── .travis.yml
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── demo
├── CNAME
├── component
│ ├── body.css
│ ├── buttons.css
│ ├── click-demo.css
│ └── downloads.css
├── index.html
├── media
│ ├── github.png
│ ├── github@2x.png
│ └── github@3x.png
└── style.css
├── package-lock.json
├── package.json
├── rollup.config.js
└── src
├── CJSSError.js
├── PluginHelpers.js
├── Stage.js
├── cjss.js
├── defaultPlugins.js
├── getProperty.js
├── index.js
├── plugins
├── html.js
├── js.js
└── json.js
├── registerPlugin.js
└── ruleList.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*]
2 | indent_style = space
3 | indent_size = 2
4 |
5 | [*.js]
6 | quote_type = single
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | demo
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "airbnb-base",
3 | "parser": "babel-eslint",
4 | "env": {
5 | "browser": true
6 | },
7 | "rules": {
8 | "no-console": "off",
9 | "no-restricted-syntax": ["error", "ForInStatement", "LabeledStatement", "WithStatement"],
10 | "no-cond-assign": ["error", "except-parens"],
11 | "no-param-reassign": ["error", { "props": false }],
12 | "no-continue": "off",
13 | "no-new-func": "off"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | .vscode
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js: node
3 |
4 | script:
5 | - npm run eslint
6 | - npm run build
7 |
8 | deploy:
9 | - provider: pages
10 | skip_cleanup: true
11 | github_token: $GH_KEY # Set in the settings page of your repository as a secure variable
12 | keep_history: true
13 | committer_from_gh: true
14 | local_dir: ./demo
15 | on:
16 | branch: master
17 |
18 | - provider: releases
19 | api_key: $GH_KEY
20 | file:
21 | - "demo/dist/*.js"
22 | skip_cleanup: true
23 | on:
24 | tags: true
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, sex characteristics, gender identity and expression,
9 | level of experience, education, socio-economic status, nationality, personal
10 | appearance, race, religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team at scott@scottkellum.com. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
75 | For answers to common questions about this code of conduct, see
76 | https://www.contributor-covenant.org/faq
77 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Scott Kellum
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CJSS
2 |
3 | ## A CSS based web framework
4 |
5 | **Also, don’t use this project, especially not for anything serious. This is a joke and thought experiment. I won’t help you work through bugs.**
6 |
7 | To install CJSS, add the [JavaScript](https://github.com/scottkellum/CJSS/blob/master/dist/cjss.min.js) to your website.
8 |
9 | ### Development
10 |
11 | - `npm install`: Install the dependencies needed for the project
12 | - `npm run eslint`: Check code quality
13 | - `npm run fix`: Fix certain code issues automatically
14 | - `npm run build`: Compile the output file
15 | - `npm run dev`: Keep compiling the output file
16 |
17 | Your editor probably has [a plugin](https://eslint.org/docs/user-guide/integrations) for automatically linting as you type.
18 |
19 | The demo website can be built by leaving `npm run dev` running, and opening `demo/index.html` in your web browser.
20 |
21 | ## Using CJSS
22 |
23 | First off, everything happens in your CSS file. You can layer this into your websites as you see fit. You can use this to layer on just a little bit more functionality in your CSS here and there or construct an entire page. It’s up to you!
24 |
25 | ### HTML
26 |
27 | To add markup to an element, select it in your CSS file, then use `--body: html(your markup here);` to add your HTML. This markup will appear everywhere that matches your CSS selector and overwrite whatever was there before.
28 |
29 | ```css
30 | h1 {
31 | --body: html(
32 | This is a headline
33 | );
34 | }
35 | ```
36 |
37 | If you wish to pass content through a component, use `${yield}`.
38 |
39 | ```html
40 | My Component
41 | ```
42 |
43 | ```css
44 | component {
45 | --html:(
46 |
${yield}
47 | This is a component
48 | );
49 | }
50 | ```
51 |
52 | This will render as:
53 |
54 | ```html
55 |
56 | My Component
57 | This is a component
58 |
59 | ```
60 |
61 | ### JavaScript
62 |
63 | You can use JavaScript to define the behavior of things right from your HTML. You want something to happen when you click on an element, but don’t want to go into your JS file? Do it right from your CSS file. If you are selecting the `script` element it will assume you are writing a global script, but everywhere else, the keyword `this` will map to the selector you are in.
64 |
65 | ```css
66 | .item {
67 | cursor: pointer;
68 | --script: js(
69 | function toggle() {
70 | this.classList.toggle('active');
71 | }
72 | this.addEventListener('click', toggle );
73 | );
74 | }
75 | ```
76 |
77 | ### Data
78 |
79 | You can add data to your project. This is probably useful for something. Do it using the `--data` attribute. It should be formatted as JSON.
80 |
81 | ```css
82 | nav {
83 | --data: json({
84 | "name": ["one", "two", "three"],
85 | "link": ["#one", "#two", "#three"]
86 | });
87 | --body: html(
88 | ${data.name[0]}
89 | ${data.name[1]}
90 | ${data.name[2]}
91 | );
92 | --script: js(console.log(data));
93 | }
94 | ```
95 |
96 | ## Reference
97 |
98 | ### Users
99 |
100 | There are four stages to each build: `data`, `prepare`, `body` and `element`. The return value is used as the following stage’s data (if anything is returned at all), except for the body stage, when the return value is used as the new child structure of the element.
101 |
102 | Not all stages have to be used, but only one script can exist at each level.
103 |
104 | #### `json`
105 |
106 | JSON: only for the data stage. The code given will be wrapped in curly braces and parsed as JSON without interpolation.
107 |
108 | #### `html`
109 |
110 | This can only be used for the *body* stage. The code given will be treated as a JavaScript template string, so interpolation is possible with ${}.
111 |
112 | You have access to the variables `data` (as set in previous build steps) and `yield` (the HTML code of the contents). Note that this mode will destroy any event listeners previously bound to the children of the element.
113 |
114 | #### `javascript`, `json`
115 |
116 | JavaScript: for any stage. There are two modes: `js` and `js-expr`.
117 |
118 | - `js` evaluates as a block of code, and so return values need the return keyword.
119 | - `js-expr` evaluates as a single expression.
120 |
121 | You always have access to the variable `data` (as set in previous build steps), and during the body stage you also have `yield` (an array of node contents). This means that events and other properties remain bound, unlike in HTML, which goes via innerHTML.
122 |
123 | In the body stage, the return value is used to replace the contents of the element. If the return value is undefined, no changes are made, otherwise the existing contents are removed. If a string is provided, it is parsed as HTML. If a node is returned, it is added directly as the only child. If an array is returned, its elements are recursively added as nodes or text nodes.
124 |
125 | In any other stage, the return value is assigned as `data` for the use of the future build phases. If no object is returned, the value of `data` is not updated.
126 |
127 | ### Plugin developers
128 |
129 | To use this project, either import the root folder (`import * as CJSS from 'cjss'`), or load the minified script in your HTML. Both ways will achieve the same effect: a new object CJSS with the following methods and properties:
130 |
131 | - `CJSS.render()`
132 |
133 | Render all CJSS code in all the linked CSS stylesheets.
134 |
135 | - `CJSS.registerPlugin(modeName, plugin, ...stages)`
136 |
137 | Register a new mode.
138 |
139 | - The mode name is any valid css identifier.
140 | - The plugin is a function of type `(body) => (htmlElement, data) => data`, so it takes the code given to it, and returns a function taking an htmlElement target and the previous data, returning the updated data. If nothing (undefined) is returned, data is not changed.
141 | - The stages (e.g. `CJSS.Stage.DATA`) are used to specify which stages the plugin applies to. If this argument is omitted, this definition of a plugin will be the fallback: it will only be used when no definition specific to the current stage exists.
142 |
143 | Note that it is the responsibility of the plugin to edit the element, especially in the body stage. The function `CJSS.PluginHelpers.assignBody` (see below) should help with this.
144 |
145 | See ./plugins/{html.js, json.js, js.js} for some examples of how to use this function.
146 |
147 | - `CJSS.Stage.{DATA, PREPARE, BODY, SCRIPT}`
148 |
149 | These represent the stages of a build.
150 |
151 | - `CJSS.Error(message, originalError)`
152 |
153 | An error to throw when you encounter an exception while parsing or running the user’s code. The message, original error and the source location will be logged.
154 |
155 | - `CJSS.PluginHelpers.assignBody(element, contents)`
156 |
157 | assigns a string, node or an array of nodes and/or text as the child(ren) of an element, which is useful for the body stage. A single string will be rendered as HTML code, whereas strings in an array will be rendered as text.
158 | };
159 |
160 | ## Examples
161 |
162 | [What to watch carousel by Richard Ekwonye](https://codepen.io/ekwonye/full/QXEzZv)
163 |
164 | [Fork CJSS and play with it yourself on Codepen](https://codepen.io/scottkellum/pen/WqwjLm)
165 |
--------------------------------------------------------------------------------
/demo/CNAME:
--------------------------------------------------------------------------------
1 | cjss.js.org
2 |
--------------------------------------------------------------------------------
/demo/component/body.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');
2 |
3 | body {
4 | /* Data */
5 | --data: js-expr({
6 | name: 'world',
7 | });
8 |
9 | /* Markup */
10 | --body: html(
11 |
12 | cjss-group/CJSS
13 |
14 |
15 |
16 |
17 | Hello ${data.name}!
18 | This page was constructed entirely within CSS files. That includes all the data, markup, scripts, and also styles.
19 |
20 | Click the items below to toggle.
21 | {nav}
22 | Use CJSS in your own project (please don’t!)
23 |
25 | {downloads}
26 |
27 |
29 | {links}
30 |
31 |
32 |
33 |
34 | );
35 |
36 | /* Just some regular old CSS */
37 | font-family: Roboto, sans-serif;
38 | margin: 0;
39 | background-image: linear-gradient( 70.6deg, rgba(172,30,255,1) 0.3%, rgba(65,35,251,1) 55.8%, rgba(35,251,224,1) 105.1% );
40 | color: white;
41 | display: flex;
42 | align-items: center;
43 | justify-content: center;
44 | min-height: 100%;
45 | flex-direction: column;
46 | flex: 1;
47 | background-size: cover;
48 | background-attachment: fixed;
49 | }
50 |
51 | body > .github-link {
52 | padding: 1rem;
53 | align-self: flex-end;
54 | text-decoration: none;
55 | color: inherit;
56 | font-size: 1.5em;
57 | display: flex;
58 | align-items: center;
59 | }
60 |
61 | body > .github-link > span {
62 | overflow: hidden;
63 | margin-right: -5px;
64 | }
65 | body > .github-link > img {
66 | position: relative;
67 | z-index: 1;
68 | width: 64px;
69 | }
70 |
71 | body > .github-link > span > code {
72 | padding: 1rem;
73 | display: inline-block;
74 | transition: transform 0.5s ease-out;
75 | }
76 |
77 | body > .github-link:not(:hover) > span > code {
78 | transform: translateX(100%);
79 | transition-timing-function: ease-in;
80 | }
81 |
82 | body > .spacer {
83 | flex: 1;
84 | display: flex;
85 | align-items: center;
86 | padding: 0 5em;
87 | }
88 |
89 | html {
90 | height: 100%;
91 | }
92 |
93 | body h1 {
94 | font-size: 50px;
95 | margin: 0;
96 | }
97 |
98 | body h3 {
99 | opacity: 0.6;
100 | margin: 30px 0 20px 0;
101 | }
102 |
103 | .center {
104 | text-align: center;
105 | }
106 |
107 | recursion {
108 | border: 1.5px solid;
109 | padding: 3px;
110 | padding-left: 6px;
111 | position: relative;
112 | display: inline-block;
113 | font-size: 0;
114 |
115 | --data: js-expr({
116 | depth: this.dataset.depth,
117 | });
118 | --body: js-expr(
119 | data.depth > 0 ? ` ` : ''
120 | );
121 | }
122 |
--------------------------------------------------------------------------------
/demo/component/buttons.css:
--------------------------------------------------------------------------------
1 | .buttons {
2 | display: flex;
3 | justify-content: center;
4 | margin: 0.6em 0;
5 | }
6 |
7 | .buttons > * {
8 | padding: 0.3em 0.5em;
9 | margin: 0 0.3em;
10 | color: white;
11 | text-decoration: none;
12 | font-size: 1.2em;
13 | border-radius: 0.2em;
14 | box-shadow: 0 0 0 1px white;
15 | }
--------------------------------------------------------------------------------
/demo/component/click-demo.css:
--------------------------------------------------------------------------------
1 | @import url('buttons.css');
2 |
3 | .click-demo {
4 | --data: json({
5 | "name": ["one", "two", "three"],
6 | "link": []
7 | });
8 |
9 | --prepare: js(
10 | this.classList.add('buttons');
11 | data.link = data.name.map((name, index) => (`#${name}-${index + 1}`));
12 | );
13 |
14 | --body: js-expr(
15 | [0, 1, 2].map(i => `
16 | ${data.name[i]}
17 | `).join('')
18 | );
19 |
20 | --script: js(
21 | console.log(this, data)
22 | );
23 | }
24 |
25 | .click-demo > * {
26 | --script: js(
27 | function toggle() {
28 | this.classList.toggle('active');
29 | }
30 |
31 | this.addEventListener('click', toggle);
32 | );
33 | }
34 |
35 | .click-demo > .active {
36 | outline: none;
37 | text-shadow: 0 0 5px white;
38 | box-shadow: 0 0 5px white;
39 | }
--------------------------------------------------------------------------------
/demo/component/downloads.css:
--------------------------------------------------------------------------------
1 | @import url('buttons.css');
2 |
3 | .downloads {
4 | display: flex;
5 | justify-content: center;
6 | --data: js-expr(
7 | JSON.parse(this.dataset.links)
8 | );
9 |
10 | --prepare: js(
11 | this.classList.add('buttons');
12 | );
13 |
14 | --body: js-expr(
15 | data.map(({ title, name, href }) => `
16 |
18 | ${title}${name ? ` (${name}
)` : ''}
19 |
20 | `).join('')
21 | );
22 | }
23 |
24 | .downloads > * {
25 | --script: js(
26 | function toggle() {
27 | this.classList.toggle('active');
28 | }
29 |
30 | this.addEventListener('click', toggle);
31 | );
32 | }
33 |
34 | .downloads > :hover {
35 | outline: none;
36 | text-shadow: 0 0 5px white;
37 | box-shadow: 0 0 5px white;
38 | }
--------------------------------------------------------------------------------
/demo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | CJSS
9 |
10 |
11 |
12 |
13 |
14 | JS is required to view this page
15 |
16 |
17 |
--------------------------------------------------------------------------------
/demo/media/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cjss-group/CJSS/f947d8d7473d1a4094da9328b86cbd721ca47b1d/demo/media/github.png
--------------------------------------------------------------------------------
/demo/media/github@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cjss-group/CJSS/f947d8d7473d1a4094da9328b86cbd721ca47b1d/demo/media/github@2x.png
--------------------------------------------------------------------------------
/demo/media/github@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cjss-group/CJSS/f947d8d7473d1a4094da9328b86cbd721ca47b1d/demo/media/github@3x.png
--------------------------------------------------------------------------------
/demo/style.css:
--------------------------------------------------------------------------------
1 | @import url('component/body.css');
2 | @import url('component/click-demo.css');
3 | @import url('component/downloads.css');
4 |
5 | /* Run a global script */
6 | script {
7 | --data: json({
8 | "say": "Hello world!"
9 | });
10 |
11 | --script: js(
12 | console.log(data.say);
13 | );
14 | }
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cjss",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.0.0",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.0.0"
14 | }
15 | },
16 | "@babel/generator": {
17 | "version": "7.4.4",
18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz",
19 | "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==",
20 | "dev": true,
21 | "requires": {
22 | "@babel/types": "^7.4.4",
23 | "jsesc": "^2.5.1",
24 | "lodash": "^4.17.11",
25 | "source-map": "^0.5.0",
26 | "trim-right": "^1.0.1"
27 | }
28 | },
29 | "@babel/helper-function-name": {
30 | "version": "7.1.0",
31 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
32 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
33 | "dev": true,
34 | "requires": {
35 | "@babel/helper-get-function-arity": "^7.0.0",
36 | "@babel/template": "^7.1.0",
37 | "@babel/types": "^7.0.0"
38 | }
39 | },
40 | "@babel/helper-get-function-arity": {
41 | "version": "7.0.0",
42 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
43 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
44 | "dev": true,
45 | "requires": {
46 | "@babel/types": "^7.0.0"
47 | }
48 | },
49 | "@babel/helper-split-export-declaration": {
50 | "version": "7.4.4",
51 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
52 | "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
53 | "dev": true,
54 | "requires": {
55 | "@babel/types": "^7.4.4"
56 | }
57 | },
58 | "@babel/highlight": {
59 | "version": "7.0.0",
60 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
61 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
62 | "dev": true,
63 | "requires": {
64 | "chalk": "^2.0.0",
65 | "esutils": "^2.0.2",
66 | "js-tokens": "^4.0.0"
67 | }
68 | },
69 | "@babel/parser": {
70 | "version": "7.4.5",
71 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz",
72 | "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==",
73 | "dev": true
74 | },
75 | "@babel/template": {
76 | "version": "7.4.4",
77 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
78 | "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
79 | "dev": true,
80 | "requires": {
81 | "@babel/code-frame": "^7.0.0",
82 | "@babel/parser": "^7.4.4",
83 | "@babel/types": "^7.4.4"
84 | }
85 | },
86 | "@babel/traverse": {
87 | "version": "7.4.5",
88 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz",
89 | "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==",
90 | "dev": true,
91 | "requires": {
92 | "@babel/code-frame": "^7.0.0",
93 | "@babel/generator": "^7.4.4",
94 | "@babel/helper-function-name": "^7.1.0",
95 | "@babel/helper-split-export-declaration": "^7.4.4",
96 | "@babel/parser": "^7.4.5",
97 | "@babel/types": "^7.4.4",
98 | "debug": "^4.1.0",
99 | "globals": "^11.1.0",
100 | "lodash": "^4.17.11"
101 | }
102 | },
103 | "@babel/types": {
104 | "version": "7.4.4",
105 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz",
106 | "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==",
107 | "dev": true,
108 | "requires": {
109 | "esutils": "^2.0.2",
110 | "lodash": "^4.17.11",
111 | "to-fast-properties": "^2.0.0"
112 | }
113 | },
114 | "@types/estree": {
115 | "version": "0.0.39",
116 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
117 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
118 | "dev": true
119 | },
120 | "@types/node": {
121 | "version": "12.0.10",
122 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz",
123 | "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==",
124 | "dev": true
125 | },
126 | "@types/normalize-package-data": {
127 | "version": "2.4.0",
128 | "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
129 | "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
130 | "dev": true
131 | },
132 | "acorn": {
133 | "version": "6.4.1",
134 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
135 | "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
136 | "dev": true
137 | },
138 | "acorn-jsx": {
139 | "version": "5.0.1",
140 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
141 | "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
142 | "dev": true
143 | },
144 | "ajv": {
145 | "version": "6.10.0",
146 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
147 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
148 | "dev": true,
149 | "requires": {
150 | "fast-deep-equal": "^2.0.1",
151 | "fast-json-stable-stringify": "^2.0.0",
152 | "json-schema-traverse": "^0.4.1",
153 | "uri-js": "^4.2.2"
154 | }
155 | },
156 | "ansi-escapes": {
157 | "version": "3.2.0",
158 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
159 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
160 | "dev": true
161 | },
162 | "ansi-regex": {
163 | "version": "3.0.0",
164 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
165 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
166 | "dev": true
167 | },
168 | "ansi-styles": {
169 | "version": "3.2.1",
170 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
171 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
172 | "dev": true,
173 | "requires": {
174 | "color-convert": "^1.9.0"
175 | }
176 | },
177 | "argparse": {
178 | "version": "1.0.10",
179 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
180 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
181 | "dev": true,
182 | "requires": {
183 | "sprintf-js": "~1.0.2"
184 | }
185 | },
186 | "array-includes": {
187 | "version": "3.0.3",
188 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
189 | "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
190 | "dev": true,
191 | "requires": {
192 | "define-properties": "^1.1.2",
193 | "es-abstract": "^1.7.0"
194 | }
195 | },
196 | "astral-regex": {
197 | "version": "1.0.0",
198 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
199 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
200 | "dev": true
201 | },
202 | "babel-eslint": {
203 | "version": "10.0.2",
204 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.2.tgz",
205 | "integrity": "sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q==",
206 | "dev": true,
207 | "requires": {
208 | "@babel/code-frame": "^7.0.0",
209 | "@babel/parser": "^7.0.0",
210 | "@babel/traverse": "^7.0.0",
211 | "@babel/types": "^7.0.0",
212 | "eslint-scope": "3.7.1",
213 | "eslint-visitor-keys": "^1.0.0"
214 | }
215 | },
216 | "balanced-match": {
217 | "version": "1.0.0",
218 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
219 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
220 | "dev": true
221 | },
222 | "brace-expansion": {
223 | "version": "1.1.11",
224 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
225 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
226 | "dev": true,
227 | "requires": {
228 | "balanced-match": "^1.0.0",
229 | "concat-map": "0.0.1"
230 | }
231 | },
232 | "buffer-from": {
233 | "version": "1.1.1",
234 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
235 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
236 | "dev": true
237 | },
238 | "caller-callsite": {
239 | "version": "2.0.0",
240 | "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
241 | "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
242 | "dev": true,
243 | "requires": {
244 | "callsites": "^2.0.0"
245 | },
246 | "dependencies": {
247 | "callsites": {
248 | "version": "2.0.0",
249 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
250 | "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
251 | "dev": true
252 | }
253 | }
254 | },
255 | "caller-path": {
256 | "version": "2.0.0",
257 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
258 | "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
259 | "dev": true,
260 | "requires": {
261 | "caller-callsite": "^2.0.0"
262 | }
263 | },
264 | "callsites": {
265 | "version": "3.1.0",
266 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
267 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
268 | "dev": true
269 | },
270 | "chalk": {
271 | "version": "2.4.2",
272 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
273 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
274 | "dev": true,
275 | "requires": {
276 | "ansi-styles": "^3.2.1",
277 | "escape-string-regexp": "^1.0.5",
278 | "supports-color": "^5.3.0"
279 | }
280 | },
281 | "chardet": {
282 | "version": "0.7.0",
283 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
284 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
285 | "dev": true
286 | },
287 | "ci-info": {
288 | "version": "2.0.0",
289 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
290 | "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
291 | "dev": true
292 | },
293 | "cli-cursor": {
294 | "version": "2.1.0",
295 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
296 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
297 | "dev": true,
298 | "requires": {
299 | "restore-cursor": "^2.0.0"
300 | }
301 | },
302 | "cli-width": {
303 | "version": "2.2.0",
304 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
305 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
306 | "dev": true
307 | },
308 | "color-convert": {
309 | "version": "1.9.3",
310 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
311 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
312 | "dev": true,
313 | "requires": {
314 | "color-name": "1.1.3"
315 | }
316 | },
317 | "color-name": {
318 | "version": "1.1.3",
319 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
320 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
321 | "dev": true
322 | },
323 | "commander": {
324 | "version": "2.20.0",
325 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
326 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
327 | "dev": true
328 | },
329 | "concat-map": {
330 | "version": "0.0.1",
331 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
332 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
333 | "dev": true
334 | },
335 | "contains-path": {
336 | "version": "0.1.0",
337 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
338 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
339 | "dev": true
340 | },
341 | "core-util-is": {
342 | "version": "1.0.2",
343 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
344 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
345 | "dev": true
346 | },
347 | "cosmiconfig": {
348 | "version": "5.2.1",
349 | "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
350 | "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
351 | "dev": true,
352 | "requires": {
353 | "import-fresh": "^2.0.0",
354 | "is-directory": "^0.3.1",
355 | "js-yaml": "^3.13.1",
356 | "parse-json": "^4.0.0"
357 | },
358 | "dependencies": {
359 | "import-fresh": {
360 | "version": "2.0.0",
361 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
362 | "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
363 | "dev": true,
364 | "requires": {
365 | "caller-path": "^2.0.0",
366 | "resolve-from": "^3.0.0"
367 | }
368 | },
369 | "parse-json": {
370 | "version": "4.0.0",
371 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
372 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
373 | "dev": true,
374 | "requires": {
375 | "error-ex": "^1.3.1",
376 | "json-parse-better-errors": "^1.0.1"
377 | }
378 | },
379 | "resolve-from": {
380 | "version": "3.0.0",
381 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
382 | "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
383 | "dev": true
384 | }
385 | }
386 | },
387 | "cross-spawn": {
388 | "version": "6.0.5",
389 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
390 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
391 | "dev": true,
392 | "requires": {
393 | "nice-try": "^1.0.4",
394 | "path-key": "^2.0.1",
395 | "semver": "^5.5.0",
396 | "shebang-command": "^1.2.0",
397 | "which": "^1.2.9"
398 | }
399 | },
400 | "debug": {
401 | "version": "4.1.1",
402 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
403 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
404 | "dev": true,
405 | "requires": {
406 | "ms": "^2.1.1"
407 | }
408 | },
409 | "deep-is": {
410 | "version": "0.1.3",
411 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
412 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
413 | "dev": true
414 | },
415 | "define-properties": {
416 | "version": "1.1.3",
417 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
418 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
419 | "dev": true,
420 | "requires": {
421 | "object-keys": "^1.0.12"
422 | }
423 | },
424 | "doctrine": {
425 | "version": "3.0.0",
426 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
427 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
428 | "dev": true,
429 | "requires": {
430 | "esutils": "^2.0.2"
431 | }
432 | },
433 | "emoji-regex": {
434 | "version": "7.0.3",
435 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
436 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
437 | "dev": true
438 | },
439 | "end-of-stream": {
440 | "version": "1.4.1",
441 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
442 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
443 | "dev": true,
444 | "requires": {
445 | "once": "^1.4.0"
446 | }
447 | },
448 | "error-ex": {
449 | "version": "1.3.2",
450 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
451 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
452 | "dev": true,
453 | "requires": {
454 | "is-arrayish": "^0.2.1"
455 | }
456 | },
457 | "es-abstract": {
458 | "version": "1.13.0",
459 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
460 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
461 | "dev": true,
462 | "requires": {
463 | "es-to-primitive": "^1.2.0",
464 | "function-bind": "^1.1.1",
465 | "has": "^1.0.3",
466 | "is-callable": "^1.1.4",
467 | "is-regex": "^1.0.4",
468 | "object-keys": "^1.0.12"
469 | }
470 | },
471 | "es-to-primitive": {
472 | "version": "1.2.0",
473 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
474 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
475 | "dev": true,
476 | "requires": {
477 | "is-callable": "^1.1.4",
478 | "is-date-object": "^1.0.1",
479 | "is-symbol": "^1.0.2"
480 | }
481 | },
482 | "escape-string-regexp": {
483 | "version": "1.0.5",
484 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
485 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
486 | "dev": true
487 | },
488 | "eslint": {
489 | "version": "5.16.0",
490 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
491 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
492 | "dev": true,
493 | "requires": {
494 | "@babel/code-frame": "^7.0.0",
495 | "ajv": "^6.9.1",
496 | "chalk": "^2.1.0",
497 | "cross-spawn": "^6.0.5",
498 | "debug": "^4.0.1",
499 | "doctrine": "^3.0.0",
500 | "eslint-scope": "^4.0.3",
501 | "eslint-utils": "^1.3.1",
502 | "eslint-visitor-keys": "^1.0.0",
503 | "espree": "^5.0.1",
504 | "esquery": "^1.0.1",
505 | "esutils": "^2.0.2",
506 | "file-entry-cache": "^5.0.1",
507 | "functional-red-black-tree": "^1.0.1",
508 | "glob": "^7.1.2",
509 | "globals": "^11.7.0",
510 | "ignore": "^4.0.6",
511 | "import-fresh": "^3.0.0",
512 | "imurmurhash": "^0.1.4",
513 | "inquirer": "^6.2.2",
514 | "js-yaml": "^3.13.0",
515 | "json-stable-stringify-without-jsonify": "^1.0.1",
516 | "levn": "^0.3.0",
517 | "lodash": "^4.17.11",
518 | "minimatch": "^3.0.4",
519 | "mkdirp": "^0.5.1",
520 | "natural-compare": "^1.4.0",
521 | "optionator": "^0.8.2",
522 | "path-is-inside": "^1.0.2",
523 | "progress": "^2.0.0",
524 | "regexpp": "^2.0.1",
525 | "semver": "^5.5.1",
526 | "strip-ansi": "^4.0.0",
527 | "strip-json-comments": "^2.0.1",
528 | "table": "^5.2.3",
529 | "text-table": "^0.2.0"
530 | },
531 | "dependencies": {
532 | "eslint-scope": {
533 | "version": "4.0.3",
534 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
535 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
536 | "dev": true,
537 | "requires": {
538 | "esrecurse": "^4.1.0",
539 | "estraverse": "^4.1.1"
540 | }
541 | }
542 | }
543 | },
544 | "eslint-config-airbnb-base": {
545 | "version": "13.1.0",
546 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz",
547 | "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==",
548 | "dev": true,
549 | "requires": {
550 | "eslint-restricted-globals": "^0.1.1",
551 | "object.assign": "^4.1.0",
552 | "object.entries": "^1.0.4"
553 | }
554 | },
555 | "eslint-import-resolver-node": {
556 | "version": "0.3.2",
557 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
558 | "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
559 | "dev": true,
560 | "requires": {
561 | "debug": "^2.6.9",
562 | "resolve": "^1.5.0"
563 | },
564 | "dependencies": {
565 | "debug": {
566 | "version": "2.6.9",
567 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
568 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
569 | "dev": true,
570 | "requires": {
571 | "ms": "2.0.0"
572 | }
573 | },
574 | "ms": {
575 | "version": "2.0.0",
576 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
577 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
578 | "dev": true
579 | }
580 | }
581 | },
582 | "eslint-module-utils": {
583 | "version": "2.4.0",
584 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz",
585 | "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==",
586 | "dev": true,
587 | "requires": {
588 | "debug": "^2.6.8",
589 | "pkg-dir": "^2.0.0"
590 | },
591 | "dependencies": {
592 | "debug": {
593 | "version": "2.6.9",
594 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
595 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
596 | "dev": true,
597 | "requires": {
598 | "ms": "2.0.0"
599 | }
600 | },
601 | "ms": {
602 | "version": "2.0.0",
603 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
604 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
605 | "dev": true
606 | }
607 | }
608 | },
609 | "eslint-plugin-import": {
610 | "version": "2.17.3",
611 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.17.3.tgz",
612 | "integrity": "sha512-qeVf/UwXFJbeyLbxuY8RgqDyEKCkqV7YC+E5S5uOjAp4tOc8zj01JP3ucoBM8JcEqd1qRasJSg6LLlisirfy0Q==",
613 | "dev": true,
614 | "requires": {
615 | "array-includes": "^3.0.3",
616 | "contains-path": "^0.1.0",
617 | "debug": "^2.6.9",
618 | "doctrine": "1.5.0",
619 | "eslint-import-resolver-node": "^0.3.2",
620 | "eslint-module-utils": "^2.4.0",
621 | "has": "^1.0.3",
622 | "lodash": "^4.17.11",
623 | "minimatch": "^3.0.4",
624 | "read-pkg-up": "^2.0.0",
625 | "resolve": "^1.11.0"
626 | },
627 | "dependencies": {
628 | "debug": {
629 | "version": "2.6.9",
630 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
631 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
632 | "dev": true,
633 | "requires": {
634 | "ms": "2.0.0"
635 | }
636 | },
637 | "doctrine": {
638 | "version": "1.5.0",
639 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
640 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
641 | "dev": true,
642 | "requires": {
643 | "esutils": "^2.0.2",
644 | "isarray": "^1.0.0"
645 | }
646 | },
647 | "ms": {
648 | "version": "2.0.0",
649 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
650 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
651 | "dev": true
652 | }
653 | }
654 | },
655 | "eslint-restricted-globals": {
656 | "version": "0.1.1",
657 | "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz",
658 | "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=",
659 | "dev": true
660 | },
661 | "eslint-scope": {
662 | "version": "3.7.1",
663 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
664 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
665 | "dev": true,
666 | "requires": {
667 | "esrecurse": "^4.1.0",
668 | "estraverse": "^4.1.1"
669 | }
670 | },
671 | "eslint-utils": {
672 | "version": "1.4.3",
673 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
674 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
675 | "dev": true,
676 | "requires": {
677 | "eslint-visitor-keys": "^1.1.0"
678 | },
679 | "dependencies": {
680 | "eslint-visitor-keys": {
681 | "version": "1.1.0",
682 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
683 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
684 | "dev": true
685 | }
686 | }
687 | },
688 | "eslint-visitor-keys": {
689 | "version": "1.0.0",
690 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
691 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
692 | "dev": true
693 | },
694 | "espree": {
695 | "version": "5.0.1",
696 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
697 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
698 | "dev": true,
699 | "requires": {
700 | "acorn": "^6.0.7",
701 | "acorn-jsx": "^5.0.0",
702 | "eslint-visitor-keys": "^1.0.0"
703 | }
704 | },
705 | "esprima": {
706 | "version": "4.0.1",
707 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
708 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
709 | "dev": true
710 | },
711 | "esquery": {
712 | "version": "1.0.1",
713 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
714 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
715 | "dev": true,
716 | "requires": {
717 | "estraverse": "^4.0.0"
718 | }
719 | },
720 | "esrecurse": {
721 | "version": "4.2.1",
722 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
723 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
724 | "dev": true,
725 | "requires": {
726 | "estraverse": "^4.1.0"
727 | }
728 | },
729 | "estraverse": {
730 | "version": "4.2.0",
731 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
732 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
733 | "dev": true
734 | },
735 | "esutils": {
736 | "version": "2.0.2",
737 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
738 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
739 | "dev": true
740 | },
741 | "execa": {
742 | "version": "1.0.0",
743 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
744 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
745 | "dev": true,
746 | "requires": {
747 | "cross-spawn": "^6.0.0",
748 | "get-stream": "^4.0.0",
749 | "is-stream": "^1.1.0",
750 | "npm-run-path": "^2.0.0",
751 | "p-finally": "^1.0.0",
752 | "signal-exit": "^3.0.0",
753 | "strip-eof": "^1.0.0"
754 | }
755 | },
756 | "external-editor": {
757 | "version": "3.0.3",
758 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
759 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
760 | "dev": true,
761 | "requires": {
762 | "chardet": "^0.7.0",
763 | "iconv-lite": "^0.4.24",
764 | "tmp": "^0.0.33"
765 | }
766 | },
767 | "fast-deep-equal": {
768 | "version": "2.0.1",
769 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
770 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
771 | "dev": true
772 | },
773 | "fast-json-stable-stringify": {
774 | "version": "2.0.0",
775 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
776 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
777 | "dev": true
778 | },
779 | "fast-levenshtein": {
780 | "version": "2.0.6",
781 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
782 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
783 | "dev": true
784 | },
785 | "figures": {
786 | "version": "2.0.0",
787 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
788 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
789 | "dev": true,
790 | "requires": {
791 | "escape-string-regexp": "^1.0.5"
792 | }
793 | },
794 | "file-entry-cache": {
795 | "version": "5.0.1",
796 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
797 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
798 | "dev": true,
799 | "requires": {
800 | "flat-cache": "^2.0.1"
801 | }
802 | },
803 | "find-up": {
804 | "version": "2.1.0",
805 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
806 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
807 | "dev": true,
808 | "requires": {
809 | "locate-path": "^2.0.0"
810 | }
811 | },
812 | "flat-cache": {
813 | "version": "2.0.1",
814 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
815 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
816 | "dev": true,
817 | "requires": {
818 | "flatted": "^2.0.0",
819 | "rimraf": "2.6.3",
820 | "write": "1.0.3"
821 | }
822 | },
823 | "flatted": {
824 | "version": "2.0.0",
825 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
826 | "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
827 | "dev": true
828 | },
829 | "fs.realpath": {
830 | "version": "1.0.0",
831 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
832 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
833 | "dev": true
834 | },
835 | "function-bind": {
836 | "version": "1.1.1",
837 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
838 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
839 | "dev": true
840 | },
841 | "functional-red-black-tree": {
842 | "version": "1.0.1",
843 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
844 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
845 | "dev": true
846 | },
847 | "get-stdin": {
848 | "version": "7.0.0",
849 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
850 | "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
851 | "dev": true
852 | },
853 | "get-stream": {
854 | "version": "4.1.0",
855 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
856 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
857 | "dev": true,
858 | "requires": {
859 | "pump": "^3.0.0"
860 | }
861 | },
862 | "glob": {
863 | "version": "7.1.4",
864 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
865 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
866 | "dev": true,
867 | "requires": {
868 | "fs.realpath": "^1.0.0",
869 | "inflight": "^1.0.4",
870 | "inherits": "2",
871 | "minimatch": "^3.0.4",
872 | "once": "^1.3.0",
873 | "path-is-absolute": "^1.0.0"
874 | }
875 | },
876 | "globals": {
877 | "version": "11.12.0",
878 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
879 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
880 | "dev": true
881 | },
882 | "graceful-fs": {
883 | "version": "4.1.15",
884 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
885 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
886 | "dev": true
887 | },
888 | "has": {
889 | "version": "1.0.3",
890 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
891 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
892 | "dev": true,
893 | "requires": {
894 | "function-bind": "^1.1.1"
895 | }
896 | },
897 | "has-flag": {
898 | "version": "3.0.0",
899 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
900 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
901 | "dev": true
902 | },
903 | "has-symbols": {
904 | "version": "1.0.0",
905 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
906 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
907 | "dev": true
908 | },
909 | "hosted-git-info": {
910 | "version": "2.7.1",
911 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
912 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
913 | "dev": true
914 | },
915 | "husky": {
916 | "version": "2.4.1",
917 | "resolved": "https://registry.npmjs.org/husky/-/husky-2.4.1.tgz",
918 | "integrity": "sha512-ZRwMWHr7QruR22dQ5l3rEGXQ7rAQYsJYqaeCd+NyOsIFczAtqaApZQP3P4HwLZjCtFbm3SUNYoKuoBXX3AYYfw==",
919 | "dev": true,
920 | "requires": {
921 | "cosmiconfig": "^5.2.0",
922 | "execa": "^1.0.0",
923 | "find-up": "^3.0.0",
924 | "get-stdin": "^7.0.0",
925 | "is-ci": "^2.0.0",
926 | "pkg-dir": "^4.1.0",
927 | "please-upgrade-node": "^3.1.1",
928 | "read-pkg": "^5.1.1",
929 | "run-node": "^1.0.0",
930 | "slash": "^3.0.0"
931 | },
932 | "dependencies": {
933 | "find-up": {
934 | "version": "3.0.0",
935 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
936 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
937 | "dev": true,
938 | "requires": {
939 | "locate-path": "^3.0.0"
940 | }
941 | },
942 | "locate-path": {
943 | "version": "3.0.0",
944 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
945 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
946 | "dev": true,
947 | "requires": {
948 | "p-locate": "^3.0.0",
949 | "path-exists": "^3.0.0"
950 | }
951 | },
952 | "p-limit": {
953 | "version": "2.2.0",
954 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
955 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
956 | "dev": true,
957 | "requires": {
958 | "p-try": "^2.0.0"
959 | }
960 | },
961 | "p-locate": {
962 | "version": "3.0.0",
963 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
964 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
965 | "dev": true,
966 | "requires": {
967 | "p-limit": "^2.0.0"
968 | }
969 | },
970 | "p-try": {
971 | "version": "2.2.0",
972 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
973 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
974 | "dev": true
975 | },
976 | "parse-json": {
977 | "version": "4.0.0",
978 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
979 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
980 | "dev": true,
981 | "requires": {
982 | "error-ex": "^1.3.1",
983 | "json-parse-better-errors": "^1.0.1"
984 | }
985 | },
986 | "pkg-dir": {
987 | "version": "4.2.0",
988 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
989 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
990 | "dev": true,
991 | "requires": {
992 | "find-up": "^4.0.0"
993 | },
994 | "dependencies": {
995 | "find-up": {
996 | "version": "4.1.0",
997 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
998 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
999 | "dev": true,
1000 | "requires": {
1001 | "locate-path": "^5.0.0",
1002 | "path-exists": "^4.0.0"
1003 | }
1004 | },
1005 | "locate-path": {
1006 | "version": "5.0.0",
1007 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
1008 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
1009 | "dev": true,
1010 | "requires": {
1011 | "p-locate": "^4.1.0"
1012 | }
1013 | },
1014 | "p-locate": {
1015 | "version": "4.1.0",
1016 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
1017 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
1018 | "dev": true,
1019 | "requires": {
1020 | "p-limit": "^2.2.0"
1021 | }
1022 | },
1023 | "path-exists": {
1024 | "version": "4.0.0",
1025 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1026 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1027 | "dev": true
1028 | }
1029 | }
1030 | },
1031 | "read-pkg": {
1032 | "version": "5.1.1",
1033 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.1.1.tgz",
1034 | "integrity": "sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==",
1035 | "dev": true,
1036 | "requires": {
1037 | "@types/normalize-package-data": "^2.4.0",
1038 | "normalize-package-data": "^2.5.0",
1039 | "parse-json": "^4.0.0",
1040 | "type-fest": "^0.4.1"
1041 | }
1042 | }
1043 | }
1044 | },
1045 | "iconv-lite": {
1046 | "version": "0.4.24",
1047 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1048 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1049 | "dev": true,
1050 | "requires": {
1051 | "safer-buffer": ">= 2.1.2 < 3"
1052 | }
1053 | },
1054 | "ignore": {
1055 | "version": "4.0.6",
1056 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
1057 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
1058 | "dev": true
1059 | },
1060 | "import-fresh": {
1061 | "version": "3.0.0",
1062 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz",
1063 | "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==",
1064 | "dev": true,
1065 | "requires": {
1066 | "parent-module": "^1.0.0",
1067 | "resolve-from": "^4.0.0"
1068 | }
1069 | },
1070 | "imurmurhash": {
1071 | "version": "0.1.4",
1072 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1073 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1074 | "dev": true
1075 | },
1076 | "inflight": {
1077 | "version": "1.0.6",
1078 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1079 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1080 | "dev": true,
1081 | "requires": {
1082 | "once": "^1.3.0",
1083 | "wrappy": "1"
1084 | }
1085 | },
1086 | "inherits": {
1087 | "version": "2.0.4",
1088 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1089 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1090 | "dev": true
1091 | },
1092 | "inquirer": {
1093 | "version": "6.4.1",
1094 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.4.1.tgz",
1095 | "integrity": "sha512-/Jw+qPZx4EDYsaT6uz7F4GJRNFMRdKNeUZw3ZnKV8lyuUgz/YWRCSUAJMZSVhSq4Ec0R2oYnyi6b3d4JXcL5Nw==",
1096 | "dev": true,
1097 | "requires": {
1098 | "ansi-escapes": "^3.2.0",
1099 | "chalk": "^2.4.2",
1100 | "cli-cursor": "^2.1.0",
1101 | "cli-width": "^2.0.0",
1102 | "external-editor": "^3.0.3",
1103 | "figures": "^2.0.0",
1104 | "lodash": "^4.17.11",
1105 | "mute-stream": "0.0.7",
1106 | "run-async": "^2.2.0",
1107 | "rxjs": "^6.4.0",
1108 | "string-width": "^2.1.0",
1109 | "strip-ansi": "^5.1.0",
1110 | "through": "^2.3.6"
1111 | },
1112 | "dependencies": {
1113 | "ansi-regex": {
1114 | "version": "4.1.0",
1115 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1116 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1117 | "dev": true
1118 | },
1119 | "strip-ansi": {
1120 | "version": "5.2.0",
1121 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1122 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1123 | "dev": true,
1124 | "requires": {
1125 | "ansi-regex": "^4.1.0"
1126 | }
1127 | }
1128 | }
1129 | },
1130 | "is-arrayish": {
1131 | "version": "0.2.1",
1132 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
1133 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
1134 | "dev": true
1135 | },
1136 | "is-callable": {
1137 | "version": "1.1.4",
1138 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
1139 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
1140 | "dev": true
1141 | },
1142 | "is-ci": {
1143 | "version": "2.0.0",
1144 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
1145 | "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
1146 | "dev": true,
1147 | "requires": {
1148 | "ci-info": "^2.0.0"
1149 | }
1150 | },
1151 | "is-date-object": {
1152 | "version": "1.0.1",
1153 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
1154 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
1155 | "dev": true
1156 | },
1157 | "is-directory": {
1158 | "version": "0.3.1",
1159 | "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
1160 | "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
1161 | "dev": true
1162 | },
1163 | "is-fullwidth-code-point": {
1164 | "version": "2.0.0",
1165 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1166 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1167 | "dev": true
1168 | },
1169 | "is-promise": {
1170 | "version": "2.1.0",
1171 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1172 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
1173 | "dev": true
1174 | },
1175 | "is-regex": {
1176 | "version": "1.0.4",
1177 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
1178 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
1179 | "dev": true,
1180 | "requires": {
1181 | "has": "^1.0.1"
1182 | }
1183 | },
1184 | "is-stream": {
1185 | "version": "1.1.0",
1186 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1187 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
1188 | "dev": true
1189 | },
1190 | "is-symbol": {
1191 | "version": "1.0.2",
1192 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
1193 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
1194 | "dev": true,
1195 | "requires": {
1196 | "has-symbols": "^1.0.0"
1197 | }
1198 | },
1199 | "isarray": {
1200 | "version": "1.0.0",
1201 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1202 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1203 | "dev": true
1204 | },
1205 | "isexe": {
1206 | "version": "2.0.0",
1207 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1208 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1209 | "dev": true
1210 | },
1211 | "jest-worker": {
1212 | "version": "24.6.0",
1213 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz",
1214 | "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==",
1215 | "dev": true,
1216 | "requires": {
1217 | "merge-stream": "^1.0.1",
1218 | "supports-color": "^6.1.0"
1219 | },
1220 | "dependencies": {
1221 | "supports-color": {
1222 | "version": "6.1.0",
1223 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
1224 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
1225 | "dev": true,
1226 | "requires": {
1227 | "has-flag": "^3.0.0"
1228 | }
1229 | }
1230 | }
1231 | },
1232 | "js-tokens": {
1233 | "version": "4.0.0",
1234 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1235 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1236 | "dev": true
1237 | },
1238 | "js-yaml": {
1239 | "version": "3.13.1",
1240 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1241 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1242 | "dev": true,
1243 | "requires": {
1244 | "argparse": "^1.0.7",
1245 | "esprima": "^4.0.0"
1246 | }
1247 | },
1248 | "jsesc": {
1249 | "version": "2.5.2",
1250 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
1251 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
1252 | "dev": true
1253 | },
1254 | "json-parse-better-errors": {
1255 | "version": "1.0.2",
1256 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
1257 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
1258 | "dev": true
1259 | },
1260 | "json-schema-traverse": {
1261 | "version": "0.4.1",
1262 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1263 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1264 | "dev": true
1265 | },
1266 | "json-stable-stringify-without-jsonify": {
1267 | "version": "1.0.1",
1268 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1269 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1270 | "dev": true
1271 | },
1272 | "levn": {
1273 | "version": "0.3.0",
1274 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1275 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
1276 | "dev": true,
1277 | "requires": {
1278 | "prelude-ls": "~1.1.2",
1279 | "type-check": "~0.3.2"
1280 | }
1281 | },
1282 | "load-json-file": {
1283 | "version": "2.0.0",
1284 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
1285 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
1286 | "dev": true,
1287 | "requires": {
1288 | "graceful-fs": "^4.1.2",
1289 | "parse-json": "^2.2.0",
1290 | "pify": "^2.0.0",
1291 | "strip-bom": "^3.0.0"
1292 | }
1293 | },
1294 | "locate-path": {
1295 | "version": "2.0.0",
1296 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
1297 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
1298 | "dev": true,
1299 | "requires": {
1300 | "p-locate": "^2.0.0",
1301 | "path-exists": "^3.0.0"
1302 | }
1303 | },
1304 | "lodash": {
1305 | "version": "4.17.15",
1306 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1307 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
1308 | "dev": true
1309 | },
1310 | "merge-stream": {
1311 | "version": "1.0.1",
1312 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
1313 | "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
1314 | "dev": true,
1315 | "requires": {
1316 | "readable-stream": "^2.0.1"
1317 | }
1318 | },
1319 | "mimic-fn": {
1320 | "version": "1.2.0",
1321 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
1322 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
1323 | "dev": true
1324 | },
1325 | "minimatch": {
1326 | "version": "3.0.4",
1327 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1328 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1329 | "dev": true,
1330 | "requires": {
1331 | "brace-expansion": "^1.1.7"
1332 | }
1333 | },
1334 | "minimist": {
1335 | "version": "0.0.8",
1336 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1337 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1338 | "dev": true
1339 | },
1340 | "mkdirp": {
1341 | "version": "0.5.1",
1342 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1343 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1344 | "dev": true,
1345 | "requires": {
1346 | "minimist": "0.0.8"
1347 | }
1348 | },
1349 | "ms": {
1350 | "version": "2.1.2",
1351 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1352 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1353 | "dev": true
1354 | },
1355 | "mute-stream": {
1356 | "version": "0.0.7",
1357 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
1358 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
1359 | "dev": true
1360 | },
1361 | "natural-compare": {
1362 | "version": "1.4.0",
1363 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1364 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1365 | "dev": true
1366 | },
1367 | "nice-try": {
1368 | "version": "1.0.5",
1369 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
1370 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
1371 | "dev": true
1372 | },
1373 | "normalize-package-data": {
1374 | "version": "2.5.0",
1375 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
1376 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
1377 | "dev": true,
1378 | "requires": {
1379 | "hosted-git-info": "^2.1.4",
1380 | "resolve": "^1.10.0",
1381 | "semver": "2 || 3 || 4 || 5",
1382 | "validate-npm-package-license": "^3.0.1"
1383 | }
1384 | },
1385 | "npm-run-path": {
1386 | "version": "2.0.2",
1387 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
1388 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
1389 | "dev": true,
1390 | "requires": {
1391 | "path-key": "^2.0.0"
1392 | }
1393 | },
1394 | "object-keys": {
1395 | "version": "1.1.1",
1396 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1397 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1398 | "dev": true
1399 | },
1400 | "object.assign": {
1401 | "version": "4.1.0",
1402 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1403 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1404 | "dev": true,
1405 | "requires": {
1406 | "define-properties": "^1.1.2",
1407 | "function-bind": "^1.1.1",
1408 | "has-symbols": "^1.0.0",
1409 | "object-keys": "^1.0.11"
1410 | }
1411 | },
1412 | "object.entries": {
1413 | "version": "1.1.0",
1414 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz",
1415 | "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==",
1416 | "dev": true,
1417 | "requires": {
1418 | "define-properties": "^1.1.3",
1419 | "es-abstract": "^1.12.0",
1420 | "function-bind": "^1.1.1",
1421 | "has": "^1.0.3"
1422 | }
1423 | },
1424 | "once": {
1425 | "version": "1.4.0",
1426 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1427 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1428 | "dev": true,
1429 | "requires": {
1430 | "wrappy": "1"
1431 | }
1432 | },
1433 | "onetime": {
1434 | "version": "2.0.1",
1435 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
1436 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
1437 | "dev": true,
1438 | "requires": {
1439 | "mimic-fn": "^1.0.0"
1440 | }
1441 | },
1442 | "optionator": {
1443 | "version": "0.8.2",
1444 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
1445 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
1446 | "dev": true,
1447 | "requires": {
1448 | "deep-is": "~0.1.3",
1449 | "fast-levenshtein": "~2.0.4",
1450 | "levn": "~0.3.0",
1451 | "prelude-ls": "~1.1.2",
1452 | "type-check": "~0.3.2",
1453 | "wordwrap": "~1.0.0"
1454 | }
1455 | },
1456 | "os-tmpdir": {
1457 | "version": "1.0.2",
1458 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1459 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1460 | "dev": true
1461 | },
1462 | "p-finally": {
1463 | "version": "1.0.0",
1464 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
1465 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
1466 | "dev": true
1467 | },
1468 | "p-limit": {
1469 | "version": "1.3.0",
1470 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
1471 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
1472 | "dev": true,
1473 | "requires": {
1474 | "p-try": "^1.0.0"
1475 | }
1476 | },
1477 | "p-locate": {
1478 | "version": "2.0.0",
1479 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
1480 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
1481 | "dev": true,
1482 | "requires": {
1483 | "p-limit": "^1.1.0"
1484 | }
1485 | },
1486 | "p-try": {
1487 | "version": "1.0.0",
1488 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
1489 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
1490 | "dev": true
1491 | },
1492 | "parent-module": {
1493 | "version": "1.0.1",
1494 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1495 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1496 | "dev": true,
1497 | "requires": {
1498 | "callsites": "^3.0.0"
1499 | }
1500 | },
1501 | "parse-json": {
1502 | "version": "2.2.0",
1503 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
1504 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
1505 | "dev": true,
1506 | "requires": {
1507 | "error-ex": "^1.2.0"
1508 | }
1509 | },
1510 | "path-exists": {
1511 | "version": "3.0.0",
1512 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1513 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1514 | "dev": true
1515 | },
1516 | "path-is-absolute": {
1517 | "version": "1.0.1",
1518 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1519 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1520 | "dev": true
1521 | },
1522 | "path-is-inside": {
1523 | "version": "1.0.2",
1524 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1525 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
1526 | "dev": true
1527 | },
1528 | "path-key": {
1529 | "version": "2.0.1",
1530 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1531 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1532 | "dev": true
1533 | },
1534 | "path-parse": {
1535 | "version": "1.0.6",
1536 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1537 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1538 | "dev": true
1539 | },
1540 | "path-type": {
1541 | "version": "2.0.0",
1542 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
1543 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
1544 | "dev": true,
1545 | "requires": {
1546 | "pify": "^2.0.0"
1547 | }
1548 | },
1549 | "pify": {
1550 | "version": "2.3.0",
1551 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1552 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
1553 | "dev": true
1554 | },
1555 | "pkg-dir": {
1556 | "version": "2.0.0",
1557 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
1558 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
1559 | "dev": true,
1560 | "requires": {
1561 | "find-up": "^2.1.0"
1562 | }
1563 | },
1564 | "please-upgrade-node": {
1565 | "version": "3.1.1",
1566 | "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz",
1567 | "integrity": "sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ==",
1568 | "dev": true,
1569 | "requires": {
1570 | "semver-compare": "^1.0.0"
1571 | }
1572 | },
1573 | "prelude-ls": {
1574 | "version": "1.1.2",
1575 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1576 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
1577 | "dev": true
1578 | },
1579 | "process-nextick-args": {
1580 | "version": "2.0.1",
1581 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1582 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1583 | "dev": true
1584 | },
1585 | "progress": {
1586 | "version": "2.0.3",
1587 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
1588 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
1589 | "dev": true
1590 | },
1591 | "pump": {
1592 | "version": "3.0.0",
1593 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1594 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1595 | "dev": true,
1596 | "requires": {
1597 | "end-of-stream": "^1.1.0",
1598 | "once": "^1.3.1"
1599 | }
1600 | },
1601 | "punycode": {
1602 | "version": "2.1.1",
1603 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1604 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1605 | "dev": true
1606 | },
1607 | "read-pkg": {
1608 | "version": "2.0.0",
1609 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
1610 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
1611 | "dev": true,
1612 | "requires": {
1613 | "load-json-file": "^2.0.0",
1614 | "normalize-package-data": "^2.3.2",
1615 | "path-type": "^2.0.0"
1616 | }
1617 | },
1618 | "read-pkg-up": {
1619 | "version": "2.0.0",
1620 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
1621 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
1622 | "dev": true,
1623 | "requires": {
1624 | "find-up": "^2.0.0",
1625 | "read-pkg": "^2.0.0"
1626 | }
1627 | },
1628 | "readable-stream": {
1629 | "version": "2.3.6",
1630 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1631 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1632 | "dev": true,
1633 | "requires": {
1634 | "core-util-is": "~1.0.0",
1635 | "inherits": "~2.0.3",
1636 | "isarray": "~1.0.0",
1637 | "process-nextick-args": "~2.0.0",
1638 | "safe-buffer": "~5.1.1",
1639 | "string_decoder": "~1.1.1",
1640 | "util-deprecate": "~1.0.1"
1641 | }
1642 | },
1643 | "regexpp": {
1644 | "version": "2.0.1",
1645 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
1646 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
1647 | "dev": true
1648 | },
1649 | "resolve": {
1650 | "version": "1.11.1",
1651 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
1652 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
1653 | "dev": true,
1654 | "requires": {
1655 | "path-parse": "^1.0.6"
1656 | }
1657 | },
1658 | "resolve-from": {
1659 | "version": "4.0.0",
1660 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1661 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1662 | "dev": true
1663 | },
1664 | "restore-cursor": {
1665 | "version": "2.0.0",
1666 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
1667 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
1668 | "dev": true,
1669 | "requires": {
1670 | "onetime": "^2.0.0",
1671 | "signal-exit": "^3.0.2"
1672 | }
1673 | },
1674 | "rimraf": {
1675 | "version": "2.6.3",
1676 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1677 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1678 | "dev": true,
1679 | "requires": {
1680 | "glob": "^7.1.3"
1681 | }
1682 | },
1683 | "rollup": {
1684 | "version": "1.16.1",
1685 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.16.1.tgz",
1686 | "integrity": "sha512-cq2HT0OQF7sStRZpoiWgGorExkCxs7asewKtQcEkEam+xGDwT2QlF1P0J6OjKiqNj8bFzggfizPhEcI3mEUIfQ==",
1687 | "dev": true,
1688 | "requires": {
1689 | "@types/estree": "0.0.39",
1690 | "@types/node": "^12.0.8",
1691 | "acorn": "^6.1.1"
1692 | }
1693 | },
1694 | "rollup-plugin-terser": {
1695 | "version": "5.0.0",
1696 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.0.0.tgz",
1697 | "integrity": "sha512-W+jJ4opYnlmNyVW0vtRufs+EGf68BIJ7bnOazgz8mgz8pA9lUyrEifAhPs5y9M16wFeAyBGaRjKip4dnFBtXaw==",
1698 | "dev": true,
1699 | "requires": {
1700 | "@babel/code-frame": "^7.0.0",
1701 | "jest-worker": "^24.6.0",
1702 | "serialize-javascript": "^1.7.0",
1703 | "terser": "^4.0.0"
1704 | }
1705 | },
1706 | "run-async": {
1707 | "version": "2.3.0",
1708 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
1709 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
1710 | "dev": true,
1711 | "requires": {
1712 | "is-promise": "^2.1.0"
1713 | }
1714 | },
1715 | "run-node": {
1716 | "version": "1.0.0",
1717 | "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz",
1718 | "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==",
1719 | "dev": true
1720 | },
1721 | "rxjs": {
1722 | "version": "6.5.2",
1723 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
1724 | "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
1725 | "dev": true,
1726 | "requires": {
1727 | "tslib": "^1.9.0"
1728 | }
1729 | },
1730 | "safe-buffer": {
1731 | "version": "5.1.2",
1732 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1733 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1734 | "dev": true
1735 | },
1736 | "safer-buffer": {
1737 | "version": "2.1.2",
1738 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1739 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1740 | "dev": true
1741 | },
1742 | "semver": {
1743 | "version": "5.7.0",
1744 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
1745 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
1746 | "dev": true
1747 | },
1748 | "semver-compare": {
1749 | "version": "1.0.0",
1750 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
1751 | "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
1752 | "dev": true
1753 | },
1754 | "serialize-javascript": {
1755 | "version": "1.7.0",
1756 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz",
1757 | "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==",
1758 | "dev": true
1759 | },
1760 | "shebang-command": {
1761 | "version": "1.2.0",
1762 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1763 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1764 | "dev": true,
1765 | "requires": {
1766 | "shebang-regex": "^1.0.0"
1767 | }
1768 | },
1769 | "shebang-regex": {
1770 | "version": "1.0.0",
1771 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1772 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1773 | "dev": true
1774 | },
1775 | "signal-exit": {
1776 | "version": "3.0.2",
1777 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1778 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1779 | "dev": true
1780 | },
1781 | "slash": {
1782 | "version": "3.0.0",
1783 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
1784 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
1785 | "dev": true
1786 | },
1787 | "slice-ansi": {
1788 | "version": "2.1.0",
1789 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
1790 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
1791 | "dev": true,
1792 | "requires": {
1793 | "ansi-styles": "^3.2.0",
1794 | "astral-regex": "^1.0.0",
1795 | "is-fullwidth-code-point": "^2.0.0"
1796 | }
1797 | },
1798 | "source-map": {
1799 | "version": "0.5.7",
1800 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1801 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
1802 | "dev": true
1803 | },
1804 | "source-map-support": {
1805 | "version": "0.5.12",
1806 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
1807 | "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
1808 | "dev": true,
1809 | "requires": {
1810 | "buffer-from": "^1.0.0",
1811 | "source-map": "^0.6.0"
1812 | },
1813 | "dependencies": {
1814 | "source-map": {
1815 | "version": "0.6.1",
1816 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1817 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1818 | "dev": true
1819 | }
1820 | }
1821 | },
1822 | "spdx-correct": {
1823 | "version": "3.1.0",
1824 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
1825 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
1826 | "dev": true,
1827 | "requires": {
1828 | "spdx-expression-parse": "^3.0.0",
1829 | "spdx-license-ids": "^3.0.0"
1830 | }
1831 | },
1832 | "spdx-exceptions": {
1833 | "version": "2.2.0",
1834 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
1835 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
1836 | "dev": true
1837 | },
1838 | "spdx-expression-parse": {
1839 | "version": "3.0.0",
1840 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
1841 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
1842 | "dev": true,
1843 | "requires": {
1844 | "spdx-exceptions": "^2.1.0",
1845 | "spdx-license-ids": "^3.0.0"
1846 | }
1847 | },
1848 | "spdx-license-ids": {
1849 | "version": "3.0.4",
1850 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
1851 | "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
1852 | "dev": true
1853 | },
1854 | "sprintf-js": {
1855 | "version": "1.0.3",
1856 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1857 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1858 | "dev": true
1859 | },
1860 | "string-width": {
1861 | "version": "2.1.1",
1862 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1863 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1864 | "dev": true,
1865 | "requires": {
1866 | "is-fullwidth-code-point": "^2.0.0",
1867 | "strip-ansi": "^4.0.0"
1868 | }
1869 | },
1870 | "string_decoder": {
1871 | "version": "1.1.1",
1872 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1873 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1874 | "dev": true,
1875 | "requires": {
1876 | "safe-buffer": "~5.1.0"
1877 | }
1878 | },
1879 | "strip-ansi": {
1880 | "version": "4.0.0",
1881 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1882 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1883 | "dev": true,
1884 | "requires": {
1885 | "ansi-regex": "^3.0.0"
1886 | }
1887 | },
1888 | "strip-bom": {
1889 | "version": "3.0.0",
1890 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
1891 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
1892 | "dev": true
1893 | },
1894 | "strip-eof": {
1895 | "version": "1.0.0",
1896 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
1897 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
1898 | "dev": true
1899 | },
1900 | "strip-json-comments": {
1901 | "version": "2.0.1",
1902 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1903 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1904 | "dev": true
1905 | },
1906 | "supports-color": {
1907 | "version": "5.5.0",
1908 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1909 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1910 | "dev": true,
1911 | "requires": {
1912 | "has-flag": "^3.0.0"
1913 | }
1914 | },
1915 | "table": {
1916 | "version": "5.4.1",
1917 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz",
1918 | "integrity": "sha512-E6CK1/pZe2N75rGZQotFOdmzWQ1AILtgYbMAbAjvms0S1l5IDB47zG3nCnFGB/w+7nB3vKofbLXCH7HPBo864w==",
1919 | "dev": true,
1920 | "requires": {
1921 | "ajv": "^6.9.1",
1922 | "lodash": "^4.17.11",
1923 | "slice-ansi": "^2.1.0",
1924 | "string-width": "^3.0.0"
1925 | },
1926 | "dependencies": {
1927 | "ansi-regex": {
1928 | "version": "4.1.0",
1929 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1930 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1931 | "dev": true
1932 | },
1933 | "string-width": {
1934 | "version": "3.1.0",
1935 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1936 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1937 | "dev": true,
1938 | "requires": {
1939 | "emoji-regex": "^7.0.1",
1940 | "is-fullwidth-code-point": "^2.0.0",
1941 | "strip-ansi": "^5.1.0"
1942 | }
1943 | },
1944 | "strip-ansi": {
1945 | "version": "5.2.0",
1946 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1947 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1948 | "dev": true,
1949 | "requires": {
1950 | "ansi-regex": "^4.1.0"
1951 | }
1952 | }
1953 | }
1954 | },
1955 | "terser": {
1956 | "version": "4.0.0",
1957 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz",
1958 | "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==",
1959 | "dev": true,
1960 | "requires": {
1961 | "commander": "^2.19.0",
1962 | "source-map": "~0.6.1",
1963 | "source-map-support": "~0.5.10"
1964 | },
1965 | "dependencies": {
1966 | "source-map": {
1967 | "version": "0.6.1",
1968 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1969 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1970 | "dev": true
1971 | }
1972 | }
1973 | },
1974 | "text-table": {
1975 | "version": "0.2.0",
1976 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1977 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1978 | "dev": true
1979 | },
1980 | "through": {
1981 | "version": "2.3.8",
1982 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1983 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1984 | "dev": true
1985 | },
1986 | "tmp": {
1987 | "version": "0.0.33",
1988 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1989 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1990 | "dev": true,
1991 | "requires": {
1992 | "os-tmpdir": "~1.0.2"
1993 | }
1994 | },
1995 | "to-fast-properties": {
1996 | "version": "2.0.0",
1997 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
1998 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
1999 | "dev": true
2000 | },
2001 | "trim-right": {
2002 | "version": "1.0.1",
2003 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
2004 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
2005 | "dev": true
2006 | },
2007 | "tslib": {
2008 | "version": "1.10.0",
2009 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
2010 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
2011 | "dev": true
2012 | },
2013 | "type-check": {
2014 | "version": "0.3.2",
2015 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
2016 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
2017 | "dev": true,
2018 | "requires": {
2019 | "prelude-ls": "~1.1.2"
2020 | }
2021 | },
2022 | "type-fest": {
2023 | "version": "0.4.1",
2024 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz",
2025 | "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==",
2026 | "dev": true
2027 | },
2028 | "uri-js": {
2029 | "version": "4.2.2",
2030 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
2031 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
2032 | "dev": true,
2033 | "requires": {
2034 | "punycode": "^2.1.0"
2035 | }
2036 | },
2037 | "util-deprecate": {
2038 | "version": "1.0.2",
2039 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2040 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2041 | "dev": true
2042 | },
2043 | "validate-npm-package-license": {
2044 | "version": "3.0.4",
2045 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
2046 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
2047 | "dev": true,
2048 | "requires": {
2049 | "spdx-correct": "^3.0.0",
2050 | "spdx-expression-parse": "^3.0.0"
2051 | }
2052 | },
2053 | "which": {
2054 | "version": "1.3.1",
2055 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2056 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2057 | "dev": true,
2058 | "requires": {
2059 | "isexe": "^2.0.0"
2060 | }
2061 | },
2062 | "wordwrap": {
2063 | "version": "1.0.0",
2064 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
2065 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
2066 | "dev": true
2067 | },
2068 | "wrappy": {
2069 | "version": "1.0.2",
2070 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2071 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2072 | "dev": true
2073 | },
2074 | "write": {
2075 | "version": "1.0.3",
2076 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
2077 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
2078 | "dev": true,
2079 | "requires": {
2080 | "mkdirp": "^0.5.1"
2081 | }
2082 | }
2083 | }
2084 | }
2085 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cjss",
3 | "version": "1.0.0",
4 | "description": "A CSS based web framework",
5 | "main": "cjss.js",
6 | "directories": {
7 | "example": "example"
8 | },
9 | "scripts": {
10 | "build": "rollup -c",
11 | "dev": "rollup -c -w",
12 | "eslint": "eslint src",
13 | "precommit": "npm run eslint",
14 | "tidy": "eslint --fix src",
15 | "test": "echo \"Error: no test specified\" && exit 1"
16 | },
17 | "repository": {
18 | "type": "git",
19 | "url": "git+https://github.com/scottkellum/CJSS.git"
20 | },
21 | "keywords": [
22 | "css",
23 | "cjss",
24 | "web",
25 | "framework"
26 | ],
27 | "author": "",
28 | "license": "MIT",
29 | "bugs": {
30 | "url": "https://github.com/scottkellum/CJSS/issues"
31 | },
32 | "homepage": "https://github.com/scottkellum/CJSS#readme",
33 | "devDependencies": {
34 | "babel-eslint": "^10.0.2",
35 | "eslint": "^5.16.0",
36 | "eslint-config-airbnb-base": "^13.1.0",
37 | "eslint-plugin-import": "^2.17.3",
38 | "husky": "^2.4.1",
39 | "rollup": "^1.15.6",
40 | "rollup-plugin-terser": "^5.0.0"
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import { terser } from 'rollup-plugin-terser';
2 |
3 | export default [
4 | {
5 | input: './src/index.js',
6 | plugins: [terser()],
7 | output: {
8 | file: './demo/dist/cjss.min.js',
9 | sourcemap: process.argv.includes('-w') ? 'inline' : false,
10 | format: 'iife',
11 | name: 'CJSS',
12 | },
13 | },
14 | ];
15 |
--------------------------------------------------------------------------------
/src/CJSSError.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Provide a custom error class for any errors caused by the user within CJSS.
3 | *
4 | * These are used interally for throwing and catching, and should never reach
5 | * the end user other than in the console.
6 | *
7 | * @property {Error} original The original error thrown while parsing/running
8 | * the script.
9 | */
10 | export default class CJSSError extends Error {
11 | constructor(message, original) {
12 | super(message);
13 | this.name = 'CJSSError';
14 | /**
15 | * The original error thrown while parsing/running the script.
16 | * @type {Error}
17 | */
18 | this.original = original;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/PluginHelpers.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable import/prefer-default-export */
2 |
3 | /**
4 | * Replace the children of an element.
5 | *
6 | * - If `body` is undefined, no replacement occurs.
7 | * - If body is `null` or `[]`, the children are removed, so the element
8 | * becomes empty.
9 | * - If a string is given, it is rendered as HTML code.
10 | * - If a `Node` is given, it is set as the only child.
11 | * - If an array is given, each child is added as a child, having been
12 | * converted to a text node if necessary.
13 | *
14 | * @param {Node} element The element in question.
15 | * @param {any} body The child or children to add to the element.
16 | */
17 | export function assignBody(element, body) {
18 | const isIterable = x => x instanceof Object && Symbol.iterator in x;
19 | if (typeof body === 'string' || body instanceof String) {
20 | element.innerHTML = body;
21 | return;
22 | }
23 | if (body === undefined) return;
24 | while (element.firstChild) element.firstChild.remove();
25 | const addElement = (b) => {
26 | if (b === null) return;
27 | if (isIterable(b)) for (const child of b) addElement(child);
28 | else if (b instanceof Node) element.appendChild(b);
29 | else element.appendChild(document.createTextNode(b));
30 | };
31 | addElement(body);
32 | }
33 |
--------------------------------------------------------------------------------
/src/Stage.js:
--------------------------------------------------------------------------------
1 | /** @typedef {{defaultMode?: String, fallback?: String}} StageEntry */
2 |
3 | /**
4 | * Prepare a stage enum element.
5 | * @param {string} name The name of the stage, as returned by `.toString()`.
6 | * @param {string} defaultMode The default mode to fall back to if no mode is given.
7 | * @param {string?} fallback Any previous names to go by, for backwards compatibility.
8 | */
9 | function makeStage(name, defaultMode, fallback) {
10 | return Object.freeze({
11 | toString: () => name,
12 | defaultMode,
13 | fallback,
14 | });
15 | }
16 |
17 | /**
18 | * The different stages of rendering.
19 | * @enum {StageEntry}
20 | */
21 | const Stage = {
22 | DATA: makeStage('data', 'json'),
23 | PREPARE: makeStage('prepare', 'js'),
24 | BODY: makeStage('body', 'html', 'html'),
25 | SCRIPT: makeStage('script', 'js', 'js'),
26 | /** @type {Stage[]} */
27 | ordered: [],
28 | };
29 | Stage.ordered = Object.freeze([Stage.DATA, Stage.PREPARE, Stage.BODY, Stage.SCRIPT]);
30 | Object.freeze(Stage);
31 |
32 | export default Stage;
33 |
--------------------------------------------------------------------------------
/src/cjss.js:
--------------------------------------------------------------------------------
1 | import getProperty from './getProperty';
2 | import ruleList from './ruleList';
3 | import { getPlugin } from './registerPlugin';
4 | import Stage from './Stage';
5 | import CJSSError from './CJSSError';
6 |
7 | /** @typedef {import('./registerPlugin').Renderer} Renderer */
8 | /** @typedef {import('./Stage').default} Stage */
9 | /** @typedef {(e: CJSSError, element?: HTMLElement) => void} ErrorLogger */
10 | /** @typedef {{logError: () => ErrorLogger, run: Renderer, stage: Stage}} CompiledStage */
11 | /** @typedef {{selector: string, stages: CompiledStage[], processed: Set}} CompiledRule */
12 |
13 | /**
14 | * Prepare one CJSS rule, handling the properties `--html`, `--js` and `--data`.
15 | *
16 | * @param {CSSRule} rule The rule to parse.
17 | * @returns {CompiledRule[]} Zero or one compiled rule, depending on whethere any CJSS code is
18 | * present.
19 | */
20 | function compileRule(rule) {
21 | const selector = rule.style.parentRule.selectorText;
22 |
23 | /** @type {CompiledStage[]} */
24 | const stages = [];
25 | const compiledRule = { selector, stages, processed: new Set() };
26 |
27 | /**
28 | * Create a function for logging a parse error, providing contextual information too.
29 | * @param {string} stage The current build stage.
30 | * @param {string} mode The current build mode.
31 | * @param {string} body The source code being run.
32 | * @returns {ErrorLogger} an error logger that takes an error object and optionally an element.
33 | */
34 | const buildErrorLogger = (stage, mode, body) => (e, element = null) => {
35 | console.error(e.message, e.original);
36 | if (element) console.error(`at selector '${selector}' and element`, element);
37 | else console.error(`at selector '${selector}'`);
38 | console.error(`in script ${stage}: ${mode}(${body})`);
39 | };
40 |
41 | for (const stage of Stage.ordered) {
42 | const property = getProperty(rule, stage)
43 | || (stage.fallback && getProperty(rule, stage.fallback));
44 | if (!property) continue;
45 | const { mode, body } = property;
46 | const logError = buildErrorLogger(stage, mode, body);
47 | try {
48 | stages.push({
49 | logError, selector, run: getPlugin(stage, mode)(body), stage,
50 | });
51 | } catch (e) {
52 | if (e instanceof CJSSError) {
53 | logError(e);
54 | // TODO: in the case of an error, should we skip this element or every element?
55 | break;
56 | } throw e;
57 | }
58 | }
59 |
60 | return stages.length ? [compiledRule] : [];
61 | }
62 |
63 | /**
64 | * Transform an array by replacing each item with zero or more items.
65 | *
66 | * @param {ArrayLike} arrayLike The iterable to start with.
67 | * @param {(x: A) => B} f A function to turn an item into an array.
68 | * @template A, B
69 | */
70 | const flatMap = (arrayLike, f) => [].concat(...Array.from(arrayLike).map(f));
71 |
72 | /**
73 | * Compile all rules in the given stylesheet.
74 | *
75 | * This function recurses when a CSS `@import` declaration is found.
76 | *
77 | * @param {CSSStyleSheet} styleSheet The stylesheet to compile the rules in.
78 | * @returns {CompiledStage[]} The compiled form of all rules, ready to be run.
79 | */
80 | export function compileRules(styleSheet) {
81 | const rules = ruleList(styleSheet);
82 | return flatMap(rules, (rule) => {
83 | if (rule instanceof CSSImportRule) return compileRules(rule.styleSheet);
84 | if (rule instanceof CSSStyleRule) return compileRule(rule);
85 | return [];
86 | });
87 | }
88 |
89 | /**
90 | * Compile all rules in all loaded stylesheets,.
91 | * @returns {CompiledStage[]} The compiled form of all rules, ready to be run.
92 | */
93 | export function compileAllRules() {
94 | return flatMap(document.styleSheets, compileRules);
95 | }
96 |
97 | /**
98 | * Run all the compiled rules, marking each element with the rule number to avoid confusion.
99 | * @param {CompiledRule[]} rules
100 | * @param {number?} limit
101 | * @param {Node} subtree
102 | */
103 | export function runRules(rules, limit = Infinity, subtree = document) {
104 | for (const [i, rule] of rules.entries()) {
105 | if (i > limit) break;
106 | /** @type {Iterable} */
107 | const elements = rule.selector === 'script' ? [null] : subtree.querySelectorAll(rule.selector);
108 |
109 | for (const element of elements) {
110 | rule.processed = rule.processed || new Set();
111 | if (rule.processed.has(element)) continue;
112 | rule.processed.add(element);
113 |
114 | const updatesBody = rule.stages.some(stage => stage.stage === Stage.BODY);
115 |
116 | let data = {};
117 | for (const stage of rule.stages) {
118 | try {
119 | const newData = stage.run(element, data);
120 | if (newData !== undefined) data = newData;
121 | } catch (e) {
122 | if (e instanceof CJSSError) {
123 | stage.logError(e, element);
124 | // TODO: in the case of an error, should we skip this element or every element?
125 | break;
126 | } throw e;
127 | }
128 | }
129 | if (updatesBody) runRules(rules, i, element);
130 | }
131 | }
132 | }
133 |
134 | /**
135 | * Compile and run all rules in all loaded stylesheets.
136 | */
137 | export default function cjss() {
138 | const compiledRules = compileAllRules();
139 | runRules(compiledRules);
140 | }
141 |
--------------------------------------------------------------------------------
/src/defaultPlugins.js:
--------------------------------------------------------------------------------
1 | import './plugins/json';
2 | import './plugins/js';
3 | import './plugins/html';
4 |
--------------------------------------------------------------------------------
/src/getProperty.js:
--------------------------------------------------------------------------------
1 | /** @typedef {{ mode?: string, body: string }} CJSSProperty */
2 |
3 | /**
4 | * Get the value of a rule's CJSS property.
5 | *
6 | * @param {CSSStyleRule} rule The CSS rule from which to extract the property.
7 | * @param {String} propertyName The key to look for, without the leading `--`.
8 | * @returns {CJSSProperty?} The pair of the mode and the body.
9 | */
10 | export default function getProperty(rule, propertyName) {
11 | const raw = rule.style.getPropertyValue(`--${propertyName}`).trim();
12 | if (!raw) return null;
13 | let match;
14 | // an optional JavaScript identifier, followed a body in parentheses.
15 | if ((match = raw.match(/^([-0-9A-Z_$]*)\s*\(([\s\S]*)\)$/i))) {
16 | return { mode: match[1], body: match[2] };
17 | }
18 | // If the parentheses are not found, just return the raw string.
19 | return { body: raw };
20 | }
21 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import cjss from './cjss';
2 | import Stage from './Stage';
3 | import CJSSError from './CJSSError';
4 | import registerPlugin from './registerPlugin';
5 | import * as PluginHelpers from './PluginHelpers';
6 | import './defaultPlugins';
7 |
8 | const documentReady = new Promise((resolve) => {
9 | if (['complete', 'interactive', 'loaded'].includes(document.readyState)) resolve();
10 | else document.addEventListener('DOMContentLoaded', resolve);
11 | }).then(() => document);
12 |
13 | documentReady.then(() => cjss());
14 |
15 | export {
16 | /** `CJSS.render()` runs all the CJSS rewrite rules. */
17 | cjss as render,
18 |
19 | /** Use `CJSS.Stage.{DATA, PREPARE, BODY, SCRIPT}` to specify the scope of the stage. */
20 | Stage,
21 |
22 | /**
23 | * Throw `CJSS.Error(message, originalError)` when you encounter an exception while parsing or
24 | * running the user’s code. The message, original error and the source location will be logged.
25 | */
26 | CJSSError as Error,
27 |
28 | /**
29 | * `CJSS.registerPlugin(modeName, plugin, ...stages)` can be used to register a new mode.
30 | * The mode name is any valid css identifier.
31 | * The plugin is a function of type body => (htmlElement, data) => data, so it takes the code
32 | * given to it, and returns a function taking an htmlElement target and the previous data,
33 | * returning the updated data. If nothing (undefined) is returned, data is not changed.
34 | * The stages (e.g. CJSS.Stage.DATA) are used to specify which stages the plugin applies to.
35 | * If this argument is omitted, this definition of a plugin will be the fallback: it will
36 | * only be used when no definition specific to the current stage exists.
37 | *
38 | * Note that it is the responsibility of the plugin to edit the element, especially in the body
39 | * stage.
40 | *
41 | * See ./plugins/{html.js, json.js, js.js} for some examples of how to use this function.
42 | */
43 | registerPlugin,
44 |
45 | /**
46 | * E.g. `CJSS.PluginHelpers.assignBody(element, contents)`
47 | * assigns a node, text or an array thereof to an element, useful as a return value for the
48 | * body stage.
49 | */
50 | PluginHelpers,
51 | };
52 |
--------------------------------------------------------------------------------
/src/plugins/html.js:
--------------------------------------------------------------------------------
1 | import Stage from '../Stage';
2 | import CJSSError from '../CJSSError';
3 | import registerPlugin from '../registerPlugin';
4 |
5 | /**
6 | * HTML: only for the body stage. The code given will be treated as a
7 | * JavaScript template string, so interpolation is possible with ${}.
8 | *
9 | * You have access to the variables `data` (as set in previous build steps)
10 | * and `yield` (the HTML code for the contents). Note that this will destroy
11 | * any event listeners previously bound to the children.
12 | */
13 | registerPlugin('html', (body) => {
14 | const code = `return \`${body}\``;
15 | try {
16 | const render = new Function('data', 'yield', code);
17 |
18 | return (element, data) => {
19 | try {
20 | element.innerHTML = render.call(element, data, element.innerHTML);
21 | } catch (e) {
22 | throw new CJSSError(`CJSS: ${e.name} in HTML evaluation:`, e);
23 | }
24 | };
25 | } catch (e) {
26 | if (e instanceof SyntaxError) {
27 | throw new CJSSError(`CJSS: ${e.name} in HTML string parsing:`, e);
28 | } throw e;
29 | }
30 | }, Stage.BODY);
31 |
--------------------------------------------------------------------------------
/src/plugins/js.js:
--------------------------------------------------------------------------------
1 | import CJSSError from '../CJSSError';
2 | import { assignBody } from '../PluginHelpers';
3 | import registerPlugin from '../registerPlugin';
4 | import Stage from '../Stage';
5 |
6 | /**
7 | * Prepare a JavaScript plugin, with custom preprocessing and optional input/output of the body.
8 | *
9 | * @param {Boolean} isBody Whether this function is being used to generate the body, and so has
10 | * access to `yield`, and gives the new children as a return value.
11 | * @param {*} jsTransformer How to prepare the given JavaScript snippet for execution
12 | */
13 | const javascriptPlugin = (isBody, jsTransformer = x => x) => (js) => {
14 | try {
15 | const f = new Function('data', isBody ? 'yield' : undefined, jsTransformer(js));
16 |
17 | return (element, data) => {
18 | try {
19 | if (!isBody) return f.call(element, data);
20 | return assignBody(element,
21 | f.call(element, data, [...element.childNodes]));
22 | } catch (e) {
23 | throw new CJSSError(`CJSS: ${e.name} in JS:`, e);
24 | }
25 | };
26 | } catch (e) {
27 | if (e instanceof SyntaxError) {
28 | throw new CJSSError(`CJSS: ${e.name} in JavaScript parsing:`, e);
29 | } throw e;
30 | }
31 | };
32 |
33 | /**
34 | * JavaScript: for any stage. There are three modes: `js` and `js-expr`.
35 | *
36 | * - `js` evaluates as a block of code, and so return values need the return keyword.
37 | * - `js-expr` evaluates as a single expression.
38 | *
39 | * You always have access to the variable `data` (as set in previous build steps), and during the
40 | * body stage you also have `yield` (an array of node contents). This means that events and other
41 | * properties remain bound, unlike in HTML, which goes via innerHTML.
42 | *
43 | * In the body stage, the return value is used to replace the contents of the element. If the
44 | * return value is undefined, no changes are made, otherwise the existing contents are removed. If
45 | * a string is provided, it is parsed as HTML. If a node is returned, it is added directly as the
46 | * only child. If an array is returned, its elements are recursively added as nodes or text nodes.
47 | *
48 | * In any other stage, the return value is assigned as `data` for the use of the future build
49 | * phases. If no object is returned, the value of `data` is not updated.
50 | */
51 | registerPlugin('js', javascriptPlugin(false));
52 | registerPlugin('js', javascriptPlugin(true), Stage.BODY);
53 |
54 | registerPlugin('js-expr', javascriptPlugin(false, js => `return (${js});`));
55 | registerPlugin('js-expr', javascriptPlugin(true, js => `return (${js});`), Stage.BODY);
56 |
--------------------------------------------------------------------------------
/src/plugins/json.js:
--------------------------------------------------------------------------------
1 | import registerPlugin from '../registerPlugin';
2 | import CJSSError from '../CJSSError';
3 | import Stage from '../Stage';
4 |
5 | /**
6 | * JSON: only for the data stage. The code given will be wrapped in curly
7 | * braces and parsed as JSON without interpolation.
8 | */
9 | registerPlugin('json', body => () => {
10 | try {
11 | return JSON.parse(body);
12 | } catch (e) {
13 | if (e instanceof SyntaxError) {
14 | throw new CJSSError(`CJSS: ${e.name} in JSON:`, e);
15 | } throw e;
16 | }
17 | }, Stage.DATA);
18 |
--------------------------------------------------------------------------------
/src/registerPlugin.js:
--------------------------------------------------------------------------------
1 | /** @typedef {import('./Stage').default} Stage */
2 | /** @typedef {(element: HTMLElement, data: any) => any} Renderer */
3 | /** @typedef {(body: String) => Renderer} Compiler */
4 |
5 | /** @typedef {{[stages: Stage]: Compiler} Plugin */
6 |
7 | /** @type {Plugin[]} */
8 | const plugins = [];
9 |
10 | /**
11 | * Add a plugin to CJSS, so that a new syntax can be used for processing the
12 | * CSS.
13 | *
14 | * @param {String} mode The identifier for this plugin’s mode.
15 | * @param {Compiler} method The curried function for compiling and then running
16 | * code in this mode. Firstly the compiler receives the string, so it can be
17 | * compiled once for each element. Secondly, the compiler receives the
18 | * element to apply the code to, as well as the data passed from previous
19 | * steps. You should then return the updated data attribute.
20 | * @param {Stage[]?} includedStages The list of stages that this plugin
21 | * supports. Omit this argument to support all stages. You can overload the
22 | * plugin for multiple stages, and it does not matter whether you set the
23 | * default case first or last.
24 | */
25 | export default function registerPlugin(mode, method, ...includedStages) {
26 | if (!plugins[mode]) plugins[mode] = {};
27 | const plugin = plugins[mode];
28 | const stages = [].concat(...includedStages);
29 | if (stages.length) for (const stage of stages) plugin[stage] = method;
30 | else plugin.fallback = method;
31 | }
32 |
33 | /**
34 | * Fetch the plugin for the given mode and stage.
35 | * @param {Stage} stage The rendering stage we are currently in.
36 | * @param {String} mode The mode to use. If this is omitted, the default for
37 | * the stage is used.
38 | * @returns {Compiler}
39 | */
40 | export function getPlugin(stage, mode) {
41 | const plugin = plugins[mode || stage.defaultMode];
42 | if (!plugin) {
43 | throw new Error(`CJSS: Unknown Plugin ${mode || `${stage.defaultMode} for mode ${mode}`}`);
44 | }
45 | const method = plugin[stage] || plugin.fallback;
46 | if (!method) throw new Error(`CJSS: Plugin ${mode} does not support stage ${stage}.`);
47 | return method;
48 | }
49 |
--------------------------------------------------------------------------------
/src/ruleList.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Get the rule list for a given stylesheet
3 | *
4 | * @param {CSSStyleSheet} styleSheet The stylesheet to get the rules from.
5 | * @returns {CSSRuleList | CSSRule[]} The rules of this stylesheet.
6 | */
7 | export default function ruleList(styleSheet) {
8 | try {
9 | return styleSheet.rules || styleSheet.cssRules || [];
10 | } catch (e) {
11 | if (e.name !== 'SecurityError') throw e;
12 | return [];
13 | }
14 | }
15 |
--------------------------------------------------------------------------------