0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-03-11 02:12:21 -05:00

Added ghost browser ESLint config and fixed errors

- added eslint-plugin-ghost, extended ghost/browser config & fixed all the issues
- did this because basic things like indent, quotes and semi-colons weren't being enforced resulting in inconsistencies
- we can customise this or create a ghost/react if desired
This commit is contained in:
Hannah Wolfe 2020-04-10 16:32:37 +01:00
parent 4f1c95edb8
commit 4c358d2cec
10 changed files with 173 additions and 105 deletions

View file

@ -24,7 +24,8 @@
"posttest": "yarn lint"
},
"eslintConfig": {
"extends": "react-app"
"extends": ["react-app", "plugin:ghost/browser"],
"plugins": ["ghost"]
},
"browserslist": {
"production": [
@ -39,6 +40,7 @@
]
},
"devDependencies": {
"eslint-plugin-ghost": "1.1.0",
"rewire": "^5.0.0",
"webpack-cli": "^3.3.11"
}

View file

@ -3,11 +3,11 @@ import './App.css';
import ParentContainer from './components/ParentContainer';
function App(props) {
return (
<div className="App">
<ParentContainer name="MembersJS" data={props.data} />
</div>
);
return (
<div className="App">
<ParentContainer name="MembersJS" data={props.data} />
</div>
);
}
export default App;

View file

@ -1,9 +1,9 @@
import React from 'react';
import { render } from '@testing-library/react';
import {render} from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
const { getByText } = render(<App />);
const linkElement = getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
const {getByText} = render(<App />);
const linkElement = getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});

View file

@ -1,30 +1,29 @@
import React, { Component } from 'react'
import { createPortal } from 'react-dom'
import React, {Component} from 'react';
import {createPortal} from 'react-dom';
export default class Frame extends Component {
componentDidMount() {
this.iframeHtml = this.node.contentDocument.documentElement;
this.iframeHtml.style.fontSize = '62.5%';
this.iframeHtml = this.node.contentDocument.documentElement;
this.iframeHtml.style.fontSize = "62.5%";
this.iframeHead = this.node.contentDocument.head;
this.iframeRoot = this.node.contentDocument.body;
this.iframeRoot.style.margin = '0px';
this.iframeRoot.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif';
this.iframeRoot.style.fontSize = '1.6rem';
this.iframeRoot.style.lineHeight = '1.6em';
this.iframeRoot.style.fontWeight = '400';
this.iframeRoot.style.fontStyle = 'normal';
this.forceUpdate()
this.iframeHead = this.node.contentDocument.head;
this.iframeRoot = this.node.contentDocument.body;
this.iframeRoot.style.margin = '0px';
this.iframeRoot.style.fontFamily = '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif';
this.iframeRoot.style.fontSize = '1.6rem';
this.iframeRoot.style.lineHeight = '1.6em';
this.iframeRoot.style.fontWeight = '400';
this.iframeRoot.style.fontStyle = 'normal';
this.forceUpdate();
}
render() {
const { children, head, title="", style={}, ...rest } = this.props
return (
<iframe {...rest} ref={node => (this.node = node)} title={title} style={style} frameBorder="0">
{this.iframeHead && createPortal(head, this.iframeHead)}
{this.iframeRoot && createPortal(children, this.iframeRoot)}
</iframe>
)
const {children, head, title = '', style = {}, ...rest} = this.props;
return (
<iframe {...rest} ref={node => (this.node = node)} title={title} style={style} frameBorder="0">
{this.iframeHead && createPortal(head, this.iframeHead)}
{this.iframeRoot && createPortal(children, this.iframeRoot)}
</iframe>
);
}
}
}

View file

@ -1,23 +1,23 @@
import TriggerComponent from './TriggerComponent';
import PopupMenuComponent from './PopupMenuComponent';
const setupMembersApi = require('../utils/api');
const React = require("react");
const PropTypes = require("prop-types");
const React = require('react');
const PropTypes = require('prop-types');
export default class ParentContainer extends React.Component {
static propTypes = {
name: PropTypes.string,
name: PropTypes.string
};
constructor(props) {
super(props);
console.log("Initialized script with data", props.data);
console.log('Initialized script with data', props.data);
// Setup Members API with blog/admin URLs
const {blogUrl, adminUrl} = props.data.site;
this.MembersAPI = setupMembersApi({blogUrl, adminUrl});
// Setup custom trigger button handling
this.customTriggerButton = document.querySelector('[data-members-trigger-button]')
this.customTriggerButton = document.querySelector('[data-members-trigger-button]');
this.setupCustomTriggerButton(this.customTriggerButton);
this.state = {
@ -34,7 +34,7 @@ export default class ParentContainer extends React.Component {
customTriggerButton.classList.add(elAddClass);
customTriggerButton.classList.remove(elRemoveClass);
this.onTriggerToggle();
}
};
customTriggerButton.classList.add('popup-close');
customTriggerButton.addEventListener('click', clickHandler);
}
@ -61,8 +61,8 @@ export default class ParentContainer extends React.Component {
<PopupMenuComponent
name={this.props.name}
data={this.props.data}
onSignout={(e) => this.onSignout()}
onSignin={(data) => this.onSignin(data)}
onSignout={e => this.onSignout()}
onSignin={data => this.onSignin(data)}
/>
);
}
@ -74,11 +74,11 @@ export default class ParentContainer extends React.Component {
return (
<TriggerComponent
name={this.props.name}
onToggle= {(e) => this.onTriggerToggle()}
onToggle= {e => this.onTriggerToggle()}
isPopupOpen={this.state.showPopup}
data={this.props.data}
/>
)
);
}
return null;
@ -92,4 +92,4 @@ export default class ParentContainer extends React.Component {
</div>
);
}
}
}

View file

@ -1,10 +1,10 @@
import FrameComponent from './FrameComponent';
const React = require("react");
const PropTypes = require("prop-types");
const React = require('react');
const PropTypes = require('prop-types');
export default class PopupMenuComponent extends React.Component {
static propTypes = {
name: PropTypes.string,
name: PropTypes.string
};
constructor(props) {
@ -13,7 +13,7 @@ export default class PopupMenuComponent extends React.Component {
inputVal: '',
isLoading: false,
showSuccess: false
}
};
}
handleSignout(e) {
@ -33,8 +33,8 @@ export default class PopupMenuComponent extends React.Component {
this.setState({
isLoading: false,
showSuccess: true
})
}, 3000)
});
}, 3000);
}
handleInput(e) {
@ -42,7 +42,7 @@ export default class PopupMenuComponent extends React.Component {
inputVal: e.target.value,
showSuccess: false,
isLoading: false
})
});
}
isMemberLoggedIn() {
@ -76,18 +76,20 @@ export default class PopupMenuComponent extends React.Component {
const blogTitle = (this.props.data.site && this.props.data.site.title) || 'Site Title';
const blogDescription = (this.props.data.site && this.props.data.site.description) || 'Site Description';
return (
<div style={{ display: 'flex', flexDirection: 'column', color: '#313131' }}>
<div style={{ paddingLeft: '16px', paddingRight: '16px', paddingTop: '12px', cursor: 'pointer' }}>
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: '12px' }}>
<div style={{display: 'flex', flexDirection: 'column', color: '#313131'}}>
<div style={{paddingLeft: '16px', paddingRight: '16px', paddingTop: '12px', cursor: 'pointer'}}>
<div style={{display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: '12px'}}>
<div style={{fontSize: '18px', fontWeight: 'bold'}}> Signup/Signin to {blogTitle}</div>
<div>{blogDescription} </div>
</div>
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: '12px' }}>
<div style={{display: 'flex', flexDirection: 'column', alignItems: 'center', marginBottom: '12px'}}>
<input
type="email"
placeholder="Type your email..."
value={this.state.inputVal}
onChange={(e) => { this.handleInput(e) }}
onChange={(e) => {
this.handleInput(e);
}}
style={inputStyle}
/>
{this.renderSubmitButton()}
@ -103,7 +105,7 @@ export default class PopupMenuComponent extends React.Component {
if (!this.state.isLoading && this.state.showSuccess) {
return (
<div> Please check your email for magic link! </div>
)
);
}
return null;
}
@ -127,36 +129,39 @@ export default class PopupMenuComponent extends React.Component {
backgroundColor: '#3eb0ef',
boxShadow: 'none',
userSelect: 'none'
}
};
const label = this.state.isLoading ? 'Sending' : 'Continue';
const disabled = this.state.isLoading ? true : false;
return (
<button onClick={(e) => { this.handleSignin(e) }} style={buttonStyle} disabled={disabled}>
<button onClick={(e) => {
this.handleSignin(e);
}} style={buttonStyle} disabled={disabled}>
{label}
</button>
)
);
}
renderSignedinContent() {
const memberEmail = (this.props.data.member && this.props.data.member.email) || "test@test.com";
const memberEmail = (this.props.data.member && this.props.data.member.email) || 'test@test.com';
return (
<div style={{ display: 'flex', flexDirection: 'column', color: '#313131' }}>
<div style={{ paddingLeft: '16px', paddingRight: '16px', color: '#A6A6A6', fontSize: '1.2rem', lineHeight: '1.0em' }}>
<div style={{display: 'flex', flexDirection: 'column', color: '#313131'}}>
<div style={{paddingLeft: '16px', paddingRight: '16px', color: '#A6A6A6', fontSize: '1.2rem', lineHeight: '1.0em'}}>
Signed in as
</div>
<div style={{ paddingLeft: '16px', paddingRight: '16px', paddingBottom: '9px' }}>
<div style={{paddingLeft: '16px', paddingRight: '16px', paddingBottom: '9px'}}>
{memberEmail}
</div>
<div style={{ paddingLeft: '16px', paddingRight: '16px', paddingTop: '12px', borderTop: '1px solid #EFEFEF', cursor: 'pointer' }}>
<div onClick={(e) => { this.handleSignout(e) }}> Logout </div>
<div style={{paddingLeft: '16px', paddingRight: '16px', paddingTop: '12px', borderTop: '1px solid #EFEFEF', cursor: 'pointer'}}>
<div onClick={(e) => {
this.handleSignout(e);
}}> Logout </div>
</div>
</div>
);
}
renderPopupContent() {
const launcherStyle = {
width: '100%',
height: '100%',
@ -212,8 +217,8 @@ export default class PopupMenuComponent extends React.Component {
...hoverStyle,
width: '450px',
minHeight: '200px',
maxHeight: '220px',
}
maxHeight: '220px'
};
}
return (
@ -222,4 +227,4 @@ export default class PopupMenuComponent extends React.Component {
</FrameComponent>
);
}
}
}

View file

@ -1,13 +1,12 @@
import FrameComponent from './FrameComponent';
import {ReactComponent as UserIcon} from '../images/icons/user.svg'
import {ReactComponent as CloseIcon} from '../images/icons/close.svg'
const React = require("react");
const PropTypes = require("prop-types");
import {ReactComponent as UserIcon} from '../images/icons/user.svg';
import {ReactComponent as CloseIcon} from '../images/icons/close.svg';
const React = require('react');
const PropTypes = require('prop-types');
export default class TriggerComponent extends React.Component {
static propTypes = {
name: PropTypes.string,
name: PropTypes.string
};
onToggle() {
@ -19,29 +18,29 @@ export default class TriggerComponent extends React.Component {
width: '24px',
height: '24px',
color: '#fff'
}
};
const closeIconStyle = {
width: '20px',
height: '20px',
color: '#fff'
}
};
if (this.props.isPopupOpen) {
return (
<CloseIcon style={closeIconStyle} />
// <img src={closeIcon} className="trigger-icon" alt="Close" style={{ height: '30px', userSelect: 'none' }} />
)
);
}
return (
<UserIcon style={userIconStyle} />
// <img src={userIcon} className="trigger-icon" alt="Account" style={{ height: '20px', userSelect: 'none' }} />
)
);
}
render() {
const backgroundColor = this.props.isPopupOpen ? "#3EB0EF" : "#3EB0EF";
const backgroundColor = this.props.isPopupOpen ? '#3EB0EF' : '#3EB0EF';
const hoverStyle = {
zIndex: '2147483000',
position: 'fixed',
@ -53,7 +52,7 @@ export default class TriggerComponent extends React.Component {
borderRadius: '50%',
backgroundColor: backgroundColor,
animation: '250ms ease 0s 1 normal none running animation-bhegco',
transition: 'opacity 0.3s ease 0s',
transition: 'opacity 0.3s ease 0s'
};
const launcherStyle = {
@ -67,7 +66,7 @@ export default class TriggerComponent extends React.Component {
backfaceVisibility: 'hidden',
WebkitFontSmoothing: 'antialiased',
borderRadius: '50%',
overflow: 'hidden',
overflow: 'hidden'
};
const buttonStyle = {
@ -82,12 +81,12 @@ export default class TriggerComponent extends React.Component {
width: '100%',
opacity: '1',
transform: 'rotate(0deg) scale(1)',
transition: 'transform 0.16s linear 0s, opacity 0.08s linear 0s',
transition: 'transform 0.16s linear 0s, opacity 0.08s linear 0s'
};
return (
<FrameComponent style={hoverStyle} title="membersjs-trigger">
<div style={launcherStyle} onClick={(e) => this.onToggle(e)} id="membersjs-trigger-component">
<div style={launcherStyle} onClick={e => this.onToggle(e)} id="membersjs-trigger-component">
<div style={buttonStyle}>
{this.renderTriggerIcon()}
</div>
@ -95,4 +94,4 @@ export default class TriggerComponent extends React.Component {
</FrameComponent>
);
}
}
}

View file

@ -4,17 +4,17 @@ import './index.css';
import App from './App';
function initMembersJS(data) {
ReactDOM.render(
<React.StrictMode>
<App data={data} />
</React.StrictMode>,
document.getElementById('root')
);
ReactDOM.render(
<React.StrictMode>
<App data={data} />
</React.StrictMode>,
document.getElementById('root')
);
}
// Uncomment for local UI testing
// initMembersJS({site: {blogUrl: "", adminUrl: ""}});
window.GhostMembers = {
initMembersJS: initMembersJS
}
initMembersJS: initMembersJS
};

View file

@ -1,20 +1,20 @@
function createSignoutApi(blogUrl) {
return function() {
return function () {
fetch(`${blogUrl}/members/ssr`, {
method: 'DELETE'
}).then(function (res) {
if (res.ok) {
window.location.reload();
return "Success";
return 'Success';
} else {
console.log("Failed to signout!", res);
console.log('Failed to signout!', res);
}
});
}
};
}
function createSendMagicLinkApi(adminUrl) {
return function({email, emailType = 'signup', labels = []}) {
return function ({email, emailType = 'signup', labels = []}) {
fetch(`${adminUrl}/api/canary/members/send-magic-link/`, {
method: 'POST',
headers: {
@ -27,16 +27,16 @@ function createSendMagicLinkApi(adminUrl) {
})
}).then(function (res) {
if (res.ok) {
return "Success";
return 'Success';
} else {
console.log("Failed to send magic link!", res);
console.log('Failed to send magic link!', res);
}
});
}
};
}
function createCheckoutPlanApi(blogUrl) {
return function({plan, checkoutCancelUrl, checkoutSuccessUrl}) {
return function ({plan, checkoutCancelUrl, checkoutSuccessUrl}) {
fetch(`${blogUrl}/members/ssr`, {
credentials: 'same-origin'
}).then(function (res) {
@ -74,7 +74,7 @@ function createCheckoutPlanApi(blogUrl) {
}).catch(function (err) {
throw err;
});
}
};
}
/** blogUrl and adminUrl are being passed by theme */
@ -83,7 +83,7 @@ function setupMembersApi({blogUrl, adminUrl}) {
sendMagicLink: createSendMagicLinkApi(adminUrl),
signout: createSignoutApi(blogUrl),
checkoutPlan: createCheckoutPlanApi(blogUrl)
}
};
}
module.exports = setupMembersApi;

View file

@ -963,6 +963,11 @@
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18"
integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==
"@ember-data/rfc395-data@^0.0.4":
version "0.0.4"
resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843"
integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==
"@hapi/address@2.x.x":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@ -3716,6 +3721,11 @@ elliptic@^6.0.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
ember-rfc176-data@^0.3.12:
version "0.3.12"
resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2"
integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g==
emoji-regex@^7.0.1, emoji-regex@^7.0.2:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@ -3903,6 +3913,15 @@ eslint-module-utils@^2.4.1:
debug "^2.6.9"
pkg-dir "^2.0.0"
eslint-plugin-ember@7.10.1:
version "7.10.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-7.10.1.tgz#9ec731f158fc76a293bfb8055eaceb6b978ae0e7"
integrity sha512-3iOrcUsqZXsri6krYw+8fEH20Es8A2QEkog8fCw/Ldr54SR2/IEO41F7ldOrr0X3h8w9z1W1/v97IlMiGJhXkg==
dependencies:
"@ember-data/rfc395-data" "^0.0.4"
ember-rfc176-data "^0.3.12"
snake-case "^3.0.3"
eslint-plugin-flowtype@4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-4.6.0.tgz#82b2bd6f21770e0e5deede0228e456cb35308451"
@ -3910,6 +3929,15 @@ eslint-plugin-flowtype@4.6.0:
dependencies:
lodash "^4.17.15"
eslint-plugin-ghost@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-ghost/-/eslint-plugin-ghost-1.1.0.tgz#c8aba0287ea4b41e4c6ca93c6c2098f2c497e265"
integrity sha512-5Q/fnEQVdVvLz+Q4XVSqTBLBACMwNCxajsOnPFPsLHfcgS/m118t/p36HxvDmAge6Gc8jH7W5ouAJT8SpHWJcg==
dependencies:
eslint-plugin-ember "7.10.1"
eslint-plugin-mocha "6.3.0"
eslint-plugin-sort-imports-es6-autofix "0.5.0"
eslint-plugin-import@2.20.1:
version "2.20.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz#802423196dcb11d9ce8435a5fc02a6d3b46939b3"
@ -3943,6 +3971,14 @@ eslint-plugin-jsx-a11y@6.2.3:
has "^1.0.3"
jsx-ast-utils "^2.2.1"
eslint-plugin-mocha@6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz#72bfd06a5c4323e17e30ef41cd726030e8cdb8fd"
integrity sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==
dependencies:
eslint-utils "^2.0.0"
ramda "^0.27.0"
eslint-plugin-react-hooks@^1.6.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz#6210b6d5a37205f0b92858f895a4e827020a7d04"
@ -3966,6 +4002,13 @@ eslint-plugin-react@7.19.0:
string.prototype.matchall "^4.0.2"
xregexp "^4.3.0"
eslint-plugin-sort-imports-es6-autofix@0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-sort-imports-es6-autofix/-/eslint-plugin-sort-imports-es6-autofix-0.5.0.tgz#dabae09a457eac6e95c52d8edd7855f576d014b6"
integrity sha512-KEX2Uz6bAs67jDYiH/OT1xz1E7AzIJJOIRg1F7OnFAfUVlpws3ldSZj5oZySRHfoVkWqDX9GGExYxckdLrWhwg==
dependencies:
eslint "^6.2.2"
eslint-scope@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
@ -3989,12 +4032,19 @@ eslint-utils@^1.4.3:
dependencies:
eslint-visitor-keys "^1.1.0"
eslint-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd"
integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==
dependencies:
eslint-visitor-keys "^1.1.0"
eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@^6.6.0, eslint@^6.8.0:
eslint@^6.2.2, eslint@^6.6.0, eslint@^6.8.0:
version "6.8.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
@ -8432,6 +8482,11 @@ raf@^3.4.1:
dependencies:
performance-now "^2.1.0"
ramda@^0.27.0:
version "0.27.0"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.0.tgz#915dc29865c0800bf3f69b8fd6c279898b59de43"
integrity sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==
randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
version "2.1.0"
resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@ -9328,6 +9383,14 @@ slice-ansi@^2.1.0:
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
snake-case@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.3.tgz#c598b822ab443fcbb145ae8a82c5e43526d5bbee"
integrity sha512-WM1sIXEO+rsAHBKjGf/6R1HBBcgbncKS08d2Aqec/mrDSpU80SiOU41hO7ny6DToHSyrlwTYzQBIK1FPSx4Y3Q==
dependencies:
dot-case "^3.0.3"
tslib "^1.10.0"
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"