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:
parent
4f1c95edb8
commit
4c358d2cec
10 changed files with 173 additions and 105 deletions
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Add table
Reference in a new issue