├── .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 | 22 |

Use CJSS in your own project (please don’t!)

23 | 27 | 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 | --------------------------------------------------------------------------------