Merge branch 'master' into refactor-configure

Conflicts:
	client/coral-admin/src/routes/Configure/components/Configure.css
	client/coral-admin/src/routes/Moderation/components/Moderation.js
This commit is contained in:
Chi Vinh Le
2017-10-11 14:17:36 +07:00
26 changed files with 829 additions and 211 deletions
+12
View File
@@ -0,0 +1,12 @@
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
version: v1.7.1
ignore: {}
# patches apply the minimum changes required to fix a vulnerability
patch:
'npm:marked:20170112':
- marked:
patched: '2017-10-11T02:07:15.455Z'
- graphql-docs > marked:
patched: '2017-10-11T02:07:15.455Z'
- simplemde > marked:
patched: '2017-10-11T02:07:15.455Z'
@@ -0,0 +1,13 @@
@custom-media --table-viewport (max-width: 1024px);
:global {
.mdl-layout__drawer-button {
visibility: hidden;
}
@media (--table-viewport) {
.mdl-layout__drawer-button {
visibility: visible;
}
}
}
@@ -6,8 +6,8 @@ import styles from './Drawer.css';
import t from 'coral-framework/services/i18n';
import {can} from 'coral-framework/services/perms';
const CoralDrawer = ({handleLogout, auth}) => (
<Drawer className={styles.header}>
const CoralDrawer = ({handleLogout, auth = {}}) => (
<Drawer className={styles.drawer}>
{ auth && auth.user && can(auth.user, 'ACCESS_ADMIN') ?
<div>
<Navigation className={styles.nav}>
@@ -57,7 +57,8 @@ const CoralDrawer = ({handleLogout, auth}) => (
CoralDrawer.propTypes = {
handleLogout: PropTypes.func.isRequired,
restricted: PropTypes.bool // hide app elements from a logged out user
restricted: PropTypes.bool, // hide app elements from a logged out user
auth: PropTypes.object
};
export default CoralDrawer;
@@ -21,7 +21,6 @@
.callToAction {
position: fixed;
left: 10px;
bottom: 10px;
width: 280px;
height: 200px;
@@ -29,6 +28,7 @@
padding: 15px;
box-sizing: border-box;
box-shadow: 0px 3px 5px 0px rgba(0,0,0,0.15);
z-index: 10;
.ctaHeader {
font-size: 16px;
@@ -15,10 +15,16 @@
}
}
.headerWrapper {
background-color: #696969;
}
.header {
box-shadow: none;
min-height: 58px;
display: block;
max-width: 1280px;
margin: 0 auto;
background-color: #696969;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
}
@@ -26,7 +32,7 @@
.header > div {
position: relative;
padding: 0;
width: 1280px;
max-width: 1280px;
margin: 0 auto;
height: 58px;
}
+86 -84
View File
@@ -15,93 +15,95 @@ const CoralHeader = ({
root
}) => {
return (
<Header className={styles.header}>
<Logo className={styles.logo} />
<div>
{
auth && auth.user && can(auth.user, 'ACCESS_ADMIN') ?
<Navigation className={styles.nav}>
<IndexLink
id='dashboardNav'
className={styles.navLink}
to="/admin/dashboard"
activeClassName={styles.active}>
{t('configure.dashboard')}
</IndexLink>
{
can(auth.user, 'MODERATE_COMMENTS') && (
<Link
id='moderateNav'
className={styles.navLink}
to="/admin/moderate"
activeClassName={styles.active}>
{t('configure.moderate')}
{(root.premodCount !== 0 || root.reportedCount !== 0) && <Indicator />}
</Link>
)
}
<Link
id='streamsNav'
className={styles.navLink}
to="/admin/stories"
activeClassName={styles.active}>
{t('configure.stories')}
</Link>
<div className={styles.headerWrapper}>
<Header className={styles.header}>
<Logo className={styles.logo} />
<div>
{
auth && auth.user && can(auth.user, 'ACCESS_ADMIN') ?
<Navigation className={styles.nav}>
<IndexLink
id='dashboardNav'
className={styles.navLink}
to="/admin/dashboard"
activeClassName={styles.active}>
{t('configure.dashboard')}
</IndexLink>
{
can(auth.user, 'MODERATE_COMMENTS') && (
<Link
id='moderateNav'
className={styles.navLink}
to="/admin/moderate"
activeClassName={styles.active}>
{t('configure.moderate')}
{(root.premodCount !== 0 || root.reportedCount !== 0) && <Indicator />}
</Link>
)
}
<Link
id='streamsNav'
className={styles.navLink}
to="/admin/stories"
activeClassName={styles.active}>
{t('configure.stories')}
</Link>
<Link
id='communityNav'
className={styles.navLink}
to="/admin/community"
activeClassName={styles.active}>
{t('configure.community')}
{root.flaggedUsernamesCount !== 0 && <Indicator />}
</Link>
<Link
id='communityNav'
className={styles.navLink}
to="/admin/community"
activeClassName={styles.active}>
{t('configure.community')}
{root.flaggedUsernamesCount !== 0 && <Indicator />}
</Link>
{
can(auth.user, 'UPDATE_CONFIG') && (
<Link
id='configureNav'
className={styles.navLink}
to="/admin/configure"
activeClassName={styles.active}>
{t('configure.configure')}
</Link>
)
}
</Navigation>
:
null
}
<div className={styles.rightPanel}>
<ul>
<li className={styles.settings}>
<div>
<IconButton name="settings" id="menu-settings"/>
<Menu target="menu-settings" align="right">
<MenuItem onClick={() => showShortcuts(true)}>{t('configure.shortcuts')}</MenuItem>
<MenuItem>
<a href="https://github.com/coralproject/talk/releases" target="_blank" rel="noopener noreferrer">
View latest version
</a>
</MenuItem>
<MenuItem>
<a href="https://coralproject.net/contribute.html#other-ideas-and-bug-reports" target="_blank" rel="noopener noreferrer">
Report a bug or give feedback
</a>
</MenuItem>
<MenuItem onClick={handleLogout}>
{t('configure.sign_out')}
</MenuItem>
</Menu>
</div>
</li>
<li>
{`v${process.env.VERSION}`}
</li>
</ul>
{
can(auth.user, 'UPDATE_CONFIG') && (
<Link
id='configureNav'
className={styles.navLink}
to="/admin/configure"
activeClassName={styles.active}>
{t('configure.configure')}
</Link>
)
}
</Navigation>
:
null
}
<div className={styles.rightPanel}>
<ul>
<li className={styles.settings}>
<div>
<IconButton name="settings" id="menu-settings"/>
<Menu target="menu-settings" align="right">
<MenuItem onClick={() => showShortcuts(true)}>{t('configure.shortcuts')}</MenuItem>
<MenuItem>
<a href="https://github.com/coralproject/talk/releases" target="_blank" rel="noopener noreferrer">
View latest version
</a>
</MenuItem>
<MenuItem>
<a href="https://coralproject.net/contribute.html#other-ideas-and-bug-reports" target="_blank" rel="noopener noreferrer">
Report a bug or give feedback
</a>
</MenuItem>
<MenuItem onClick={handleLogout}>
{t('configure.sign_out')}
</MenuItem>
</Menu>
</div>
</li>
<li>
{`v${process.env.VERSION}`}
</li>
</ul>
</div>
</div>
</div>
</Header>
</Header>
</div>
);
};
@@ -1,4 +1,4 @@
.layout {
margin: 0 auto;
background-color: #FAFAFA;
margin: 0 auto;
background-color: #FAFAFA;
}
@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import {Layout as LayoutMDL} from 'react-mdl';
import Header from '../../containers/Header';
import Drawer from './Drawer';
import Drawer from '../Drawer';
import styles from './Layout.css';
const Layout = ({
@@ -21,6 +21,7 @@ const Layout = ({
<Drawer
handleLogout={handleLogout}
restricted={restricted}
auth={auth}
/>
<div className={styles.layout}>
{children}
@@ -20,7 +20,6 @@
background: #696969;
height: 100%;
width: 128px;
z-index: 10;
border-right: 1px #757575 solid;
}
@@ -0,0 +1,13 @@
@custom-media --desktop (max-width: 1280px);
.container {
max-width: 1280px;
position: relative;
margin: 0 auto;
@media (--desktop) {
padding-right: 20px;
padding-left: 20px;
}
}
@@ -1,13 +1,15 @@
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import key from 'keymaster';
import cn from 'classnames';
import styles from './Moderation.css';
import ModerationQueue from './ModerationQueue';
import ModerationMenu from './ModerationMenu';
import ModerationHeader from './ModerationHeader';
import ModerationKeysModal from '../../../components/ModerationKeysModal';
import StorySearch from '../containers/StorySearch';
import Slot from 'coral-framework/components/Slot';
import ViewOptions from './ViewOptions';
class Moderation extends Component {
constructor(props) {
@@ -244,43 +246,44 @@ class Moderation extends Component {
asset={asset}
getModPath={getModPath}
items={menuItems}
selectSort={this.props.setSortOrder}
sort={this.props.moderation.sortOrder}
activeTab={activeTab}
/>
<ModerationQueue
key={`${activeTab}_${this.props.moderation.sortOrder}`}
data={this.props.data}
root={this.props.root}
currentAsset={asset}
comments={comments.nodes}
activeTab={activeTab}
singleView={moderation.singleView}
selectedCommentId={this.state.selectedCommentId}
showBanUserDialog={props.showBanUserDialog}
showSuspendUserDialog={props.showSuspendUserDialog}
acceptComment={props.acceptComment}
rejectComment={props.rejectComment}
loadMore={this.loadMore}
assetId={assetId}
sort={this.props.moderation.sortOrder}
commentCount={activeTabCount}
currentUserId={this.props.auth.user.id}
viewUserDetail={viewUserDetail}
/>
<ModerationKeysModal
hideShortcutsNote={props.hideShortcutsNote}
shortcutsNoteVisible={moderation.shortcutsNoteVisible}
open={moderation.modalOpen}
onClose={this.onClose}/>
<div className={cn(styles.container, 'talk-admin-moderation-container')}>
<ViewOptions
selectSort={this.props.setSortOrder}
sort={this.props.moderation.sortOrder}
/>
<ModerationQueue
key={`${activeTab}_${this.props.moderation.sortOrder}`}
data={this.props.data}
root={this.props.root}
currentAsset={asset}
comments={comments.nodes}
activeTab={activeTab}
singleView={moderation.singleView}
selectedCommentId={this.state.selectedCommentId}
showBanUserDialog={props.showBanUserDialog}
showSuspendUserDialog={props.showSuspendUserDialog}
acceptComment={props.acceptComment}
rejectComment={props.rejectComment}
loadMore={this.loadMore}
commentCount={activeTabCount}
currentUserId={this.props.auth.user.id}
viewUserDetail={viewUserDetail}
/>
<ModerationKeysModal
hideShortcutsNote={props.hideShortcutsNote}
shortcutsNoteVisible={moderation.shortcutsNoteVisible}
open={moderation.modalOpen}
onClose={this.onClose}
/>
</div>
<StorySearch
assetId={assetId}
moderation={this.props.moderation}
closeSearch={this.closeSearch}
storySearchChange={this.props.storySearchChange}
/>
<Slot
data={data}
queryData={{root, asset}}
@@ -313,6 +316,7 @@ Moderation.propTypes = {
activeTab: PropTypes.string.isRequired,
data: PropTypes.object.isRequired,
root: PropTypes.object.isRequired,
router: PropTypes.object.isRequired,
};
export default Moderation;
@@ -7,12 +7,7 @@
justify-content: space-between;
}
.tabBarPadding {
width: 150px;
}
.tab {
flex: 1;
color: #BDBDBD;
text-transform: capitalize;
font-weight: 100;
@@ -22,9 +17,9 @@
transition: color 200ms;
padding: 0px 10px;
margin-right: 20px;
&:hover {
color: white;
/*border-bottom: solid 2px #F36451;*/
box-sizing: border-box;
}
}
@@ -48,55 +43,12 @@
background: transparent !important;
}
.selectField {
position: relative;
width: 140px;
height: 36px;
top: 5px;
margin-right: 10px;
background: #FFF;
padding: 10px 15px;
box-sizing: border-box;
border-radius: 2px;
bor
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
> div {
padding: 0;
}
i {
position: absolute;
top: 7px;
right: 7px;
}
input {
padding: 0;
font-size: 13px;
letter-spacing: 0.7px;
font-weight: 400;
border-bottom: 0px;
}
label {
top: -4px;
}
&:hover {
cursor: pointer;
}
}
.tabIcon {
position: relative;
top: 3px;
font-size: 16px;
}
@media (--big-viewport) {
.tab {
flex: none;
}
}
.tabBarContainer {
margin: 0 auto;
}
@@ -2,26 +2,20 @@ import React from 'react';
import PropTypes from 'prop-types';
import CountBadge from '../../../components/CountBadge';
import styles from './ModerationMenu.css';
import {SelectField, Option} from 'react-mdl-selectfield';
import {Icon} from 'coral-ui';
import {Link} from 'react-router';
import cn from 'classnames';
import t from 'coral-framework/services/i18n';
const ModerationMenu = ({
asset = {},
items,
selectSort,
sort,
getModPath,
activeTab
}) => {
return (
<div className="mdl-tabs">
<div className={`mdl-tabs__tab-bar ${styles.tabBar}`}>
<div className={styles.tabBarPadding} />
<div>
<div className={cn('mdl-tabs__tab-bar', styles.tabBar, 'talk-admin-moderation-menu-tabbar')}>
<div className={cn(styles.tabBarContainer, 'talk-admin-moderation-menu-tabbar-container')}>
{items.map((queue) =>
<Link
key={queue.key}
@@ -32,14 +26,6 @@ const ModerationMenu = ({
</Link>
)}
</div>
<SelectField
className={styles.selectField}
label="Sort"
value={sort}
onChange={(sort) => selectSort(sort)}>
<Option value={'DESC'}>{t('modqueue.newest_first')}</Option>
<Option value={'ASC'}>{t('modqueue.oldest_first')}</Option>
</SelectField>
</div>
</div>
);
@@ -50,8 +36,6 @@ ModerationMenu.propTypes = {
asset: PropTypes.shape({
id: PropTypes.string
}),
selectSort: PropTypes.func.isRequired,
sort: PropTypes.string.isRequired,
getModPath: PropTypes.func.isRequired,
activeTab: PropTypes.string.isRequired,
};
@@ -0,0 +1,97 @@
@custom-media --tablet (max-width: 1180px);
.viewOptions {
display: inline-block;
width: 220px;
position: absolute;
padding: 0;
overflow: visible;
height: 144px;
min-height: auto;
z-index: 10;
@media (--tablet) {
width: 650px;
margin: 0 auto;
position: relative;
display: flex;
flex-direction: row;
margin-top: 10px;
height: 60px;
}
}
.headline {
margin: 0;
font-size: 1.1rem;
border-bottom: 1px solid rgba(0,0,0,.1);
padding: 0 20px;
@media (--tablet) {
flex: 1;
display: inline-block;
border-bottom: none;
line-height: 60px;
}
}
.viewOptionsContent {
padding: 10px 20px;
@media (--tablet) {
display: inline-block;
}
}
.viewOptionsList {
padding: 0;
margin: 0;
color: rgba(0,0,0,.54);
}
.viewOptionsItem {
list-style: none;
}
.selectField {
position: relative;
width: 140px;
height: 36px;
top: 5px;
margin-right: 10px;
background: #7B7B7B;
color: white;
padding: 6px 15px;
box-sizing: border-box;
border-radius: 2px;
box-shadow: 0 2px 2px 0 rgba(0,0,0,.14), 0 3px 1px -2px rgba(0,0,0,.2), 0 1px 5px 0 rgba(0,0,0,.12);
@media (--tablet) {
display: inline-block;
margin-left: 10px;
}
> div {
padding: 0;
}
i {
position: absolute;
top: 7px;
right: 7px;
}
input {
font-size: 1rem;
border-bottom: 0px;
font-family: inherit;
}
label {
top: -4px;
}
&:hover {
cursor: pointer;
}
}
@@ -0,0 +1,47 @@
import React from 'react';
import PropTypes from 'prop-types';
import styles from './ViewOptions.css';
import {Card} from 'coral-ui';
import cn from 'classnames';
import {SelectField, Option} from 'react-mdl-selectfield';
import t from 'coral-framework/services/i18n';
class ViewOptions extends React.Component {
render() {
const {
selectSort,
sort
} = this.props;
return (
<Card className={cn(styles.viewOptions, 'talk-admin-moderation-view-options')}>
<h2 className={cn(styles.headline, 'talk-admin-moderation-view-options-headline')}>
View Options
</h2>
<div className={styles.viewOptionsContent}>
<ul className={styles.viewOptionsList}>
<li className={styles.viewOptionsItem}>
Sort Comments
<SelectField
className={styles.selectField}
label="Sort"
value={sort}
onChange={(sort) => selectSort(sort)}>
<Option value={'DESC'}>{t('modqueue.newest_first')}</Option>
<Option value={'ASC'}>{t('modqueue.oldest_first')}</Option>
</SelectField>
</li>
</ul>
</div>
</Card>
);
}
}
ViewOptions.propTypes = {
selectSort: PropTypes.func.isRequired,
sort: PropTypes.string.isRequired
};
export default ViewOptions;
@@ -76,6 +76,7 @@
display: flex;
justify-content: center;
flex-direction: column;
width: 100%;
}
.editCommentForm .buttonContainerLeft .editWindowRemaining {
+8 -4
View File
@@ -3,10 +3,13 @@ import has from 'lodash/has';
import get from 'lodash/get';
import merge from 'lodash/merge';
import esTA from '../../../node_modules/timeago.js/locales/es';
import frTA from '../../../node_modules/timeago.js/locales/fr';
import pt_BRTA from '../../../node_modules/timeago.js/locales/pt_BR';
import daTA from 'timeago.js/locales/da';
import esTA from 'timeago.js/locales/es';
import frTA from 'timeago.js/locales/fr';
import pt_BRTA from 'timeago.js/locales/pt_BR';
import en from '../../../locales/en.yml';
import da from '../../../locales/da.yml';
import es from '../../../locales/es.yml';
import fr from '../../../locales/fr.yml';
import pt_BR from '../../../locales/pt_BR.yml';
@@ -14,7 +17,7 @@ import pt_BR from '../../../locales/pt_BR.yml';
// Translations are happening at https://translate.lingohub.com/the-coral-project/dashboard
const defaultLanguage = process.env.TALK_DEFAULT_LANG;
const translations = {...en, ...es, ...fr, ...pt_BR};
const translations = {...en, ...da, ...es, ...fr, ...pt_BR};
let lang;
let timeagoInstance;
@@ -44,6 +47,7 @@ function init() {
}
ta.register('es', esTA);
ta.register('da', daTA);
ta.register('fr', frTA);
ta.register('pt_BR', pt_BRTA);
timeagoInstance = ta();
-2
View File
@@ -30,5 +30,3 @@
.shadow--3 {
box-shadow: 0 3px 4px 0 rgba(0,0,0,.14), 0 3px 3px -2px rgba(0,0,0,.2), 0 1px 8px 0 rgba(0,0,0,.12);
}
+10 -1
View File
@@ -1,8 +1,17 @@
import React from 'react';
import PropTypes from 'prop-types';
import styles from './Card.css';
export default ({children, className, shadow = 2, ...props}) => (
const Card = ({children, className, shadow = 2, ...props}) => (
<div className={`${styles.base} ${className} ${styles[`shadow--${shadow}`]}`} {...props}>
{children}
</div>
);
Card.propTypes = {
children: PropTypes.node,
className: PropTypes.string,
shadow: PropTypes.number,
};
export default Card;
@@ -8,6 +8,8 @@ import ClickOutside from 'coral-framework/components/ClickOutside';
import cn from 'classnames';
import styles from './styles.css';
import {getErrorMessages} from 'coral-framework/utils';
const name = 'talk-plugin-flags';
export default class FlagButton extends Component {
@@ -99,6 +101,7 @@ export default class FlagButton extends Component {
}
})
.catch((err) => {
this.props.notify('error', getErrorMessages(err));
console.error(err);
});
} else {
@@ -109,6 +112,7 @@ export default class FlagButton extends Component {
}
})
.catch((err) => {
this.props.notify('error', getErrorMessages(err));
console.error(err);
});
}
+395
View File
@@ -0,0 +1,395 @@
da:
your_account_has_been_suspended: "Din konto er midlertidigt suspenderet"
your_account_has_been_banned: "Din konto er blevet banned."
your_username_has_been_rejected: "Din konto er blevet suspenderet fordi dit brugernavn er blevet anset for upassende. For at gendanne din konto, venligst indtast et nyt brugernavn."
embed_comments_tab: "Kommentarer"
bandialog:
are_you_sure: "Er du sikker på du vil banne {0}?"
ban_user: "Ban Bruger?"
banned_user: "Bannet Bruger"
cancel: "Afbryd"
note: "Note: {0}"
note_reject_comment: "Hvis du banner denne bruger vil det også placere denne kommentar i den afviste kø"
note_ban_user: "Hvis du banner denne bruger vil det forhindre dem i at redigere kommentarer eller fjerne noget"
yes_ban_user: "Ja, Ban Bruger"
bio_offensive: "Denne biografi er stødende"
cancel: "Afbryd"
characters_remaining: "tegn tilbage"
comment:
anon: "Anonym"
ban_user: "Ban Bruger"
comment: "Skriv en kommentar"
edited: "Redigeret"
flagged: "markeret"
view_context: "Vis kontekst"
comment_box:
post: "Send"
cancel: "Afbryd"
reply: "Svar"
comment: "Skriv en kommentar"
name: "Navn"
comment_post_notif: "Din kommentar er blevet sendt"
comment_post_notif_premod: "Tak for at skrive en kommentar. Vores moderatorer vil gennemgå din kommentar inden for kort tid."
comment_post_banned_word: "Din kommentar indeholder et eller flere ord, der ikke er tilladt, derfor vil den ikke bliver offentliggjort. Hvis du mener, at denne besked er forkert, bedes du kontakte vores moderatorer"
characters_remaining: "tegn tilbage"
comment_offensive: "Denne kommentar er stødende"
comment_singular: "Kommentar"
comment_plural: "Kommentarer"
comment_post_banned_word: "Din kommentyar indeholder et eller flere ord, der ikke er tilladt, derfor vil den ikke bliver offentliggjort. Hvis du mener, at denne besked er forkert, bedes du kontakte vores moderatorer"
comment_post_notif: "Din kommentar er blevet offentliggjort"
comment_post_notif_premod: "Tak for at skrive en kommentar. Vores moderatorer vil gennemgå din kommentar inden for kort tid."
common:
copy: "Kopier"
error: "Der er sket en fejl."
reply: "svar"
replies: "svar"
reaction: "reaktion"
reactions: "reaktioner"
story: "Historie"
community:
account_creation_date: "Oprettelsedato for konto"
active: "Aktive"
admin: "Administrator"
ads_marketing: "Dette ligner en annonce/markedsføring"
are_you_sure: "Er du sikker på at du vil banne {0}?"
ban_user: "Ban Bruger?"
banned: "Bannet"
banned_user: "Bannet Bruger"
cancel: "Afbryd"
dont_like_username: "Synses ikke om brugernavnet"
flaggedaccounts: "Flagged Brugernavne"
flags: "Flags"
impersonating: "Personefterligning"
loading: "Indlæser resultater"
moderator: "Moderator"
newsroom_role: "Nyhedsrum Rolle"
no_flagged_accounts: "Køen for flagget kontoer er tom i øjeblikket"
no_results: "Igen brugere fundet med det brugernavn eller email-adresse. De gemmer sig!"
offensive: "Offensiv"
other: "Andre"
people: "Mennesker"
role: "Vælg rolle..."
select_status: "Vælg status..."
spam_ads: "Spam/Reklamer"
staff: "Personale"
status: "Status"
username_and_email: "Brugernavn eller email-adresse"
yes_ban_user: "Ja Ban Bruger"
configure:
apply: "Anvend"
banned_word_text: "Kommentarer, der indeholder disse ord eller sætninger (Ikke følsom over for store eller små bogstaver) fjernes automatisk fra kommentarstrømmen. Indtast et ord og tryk på Enter eller Tab for at tilføje. Indsæt eventuelt en kommasepareret liste."
banned_words_title: "Bannet ord liste"
close: "Luk"
close_after: "Luk kommentarene efter"
close_stream: "Luk strømmen"
close_stream_configuration: "Denne kommentarstrøm er lukket i øjeblikket. Ved at åbne denne kommentarstrøm kan nye kommentarer indsendes og vises."
closed_comments_desc: "Skriv en besked, der skal vises når, din kommentarstrøm er lukket og ikke længere accepterer kommentarer."
closed_comments_label: "Skriv en besked..."
closed_stream_settings: "Lukket strøm besked"
comment_count_error: "Indtæst venligst et gyldigt numemr."
comment_count_header: "Begræns kommentar længde"
comment_count_text_post: "tegn"
comment_count_text_pre: "Kommentarer vil være begrænset til"
comment_settings: "Indstillinger"
comment_stream: "Kommentarstrøm"
comment_stream_will_close: "Denne kommentarstrøm vil blive lukkes"
community: "Fællesskab"
configure: "Konfigurer"
copy_and_paste: "Kopier og indsæt kode nedenfor i dit CMS system for at indlejre din kommentarboks i dine artiker."
custom_css_url: "Brugerdefineret CSS URL"
custom_css_url_desc: "URL til et CSS stylesheet der tilsidesætter den alimdelige strøms stilart. Kan være internt eller externt"
dashboard: "Instrumentbræt"
days: "Dage"
description: "Som administrator kan du tilpasse indstillingerne til kommentarstrømmen for denne historie:"
domain_list_text: "Indtast de domæner du gerne vil tillade til Talk. f.eks. Dit lokale udviklings miljø (fx. localhost:3000 staging.domain.com domain.com)."
domain_list_title: "Tilladte domæner."
edit_comment_timeframe_heading: "Rediger kommentar tidsramme"
edit_comment_timeframe_text_pre: "Kommentatorer vil have"
edit_comment_timeframe_text_post: "sekunder for at redigere deres kommentarer."
embed_comment_stream: "Indlejre strøm"
enable_premod_links_text: "Moderatorer skal godkende enhver kommentar, der indeholder et link før det bliver offentliggjort."
enable_pre_moderation: "Aktiver forud moderering"
enable_pre_moderation_text: "Moderatorer skal godkende enhver kommentar før den offentliggøres."
enable_premod_links: "Forud moderer kommentarer der indeholder links"
enable_premod: "Aktiver forud moderering"
enable_premod_description: "Moderatorer skal godkende enhver kommentar før den offentliggøres"
enable_premod_links_description: "Moderatorer skal godkende enhver kommentar, der indeholder et link før det bliver offentliggjort."
enable_questionbox: "Stil et spørgsmål til læserne"
enable_questionbox_description: "Dette spørgsmål vises øverst i denne kommentarstrøm. Stil et spørgsmål til læserne om et bestemt problem i artiklen eller stil spørgsmål til diskussion mv."
hours: "Timer"
include_comment_stream: "Inkluder kommentarstrømmens beskrivelse for læsere"
include_comment_stream_desc: "Skriv en besked, der skal tilføjes øverst i din kommentarstrøm. Indsæt et emne der omfatter fællesskabsretningslinjer mv."
include_text: "Medtag din tekst her."
include_question_here: "Stil dit spørgsmål her:"
moderate: "Moderat"
moderation_settings: "Moderator indstillinger"
open: "Åben"
open_stream: "Åben strøm"
open_stream_configuration: "Denne kommentarstrøm er i øjeblikket åben. Ved at lukke denne kommentarstrøm kan der ikke indsendes nye kommentarer, og alle tidligere kommentarer vil stadig blive vist."
require_email_verification: "Kræv email verifikation"
require_email_verification_text: "Nye brugere skal verificere deres email før de kan kommenterer"
save_changes: "Gem ændringer"
shortcuts: "Genveje"
sign_out: "Log ud"
stories: "Historier"
stream_settings: "Strøm indstillinger"
suspect_word_title: "Mistænkte ord liste"
suspect_word_text: "Kommentarer der indeholder disse ord eller sætninger (Ikke følsom over for store eller små bogstaver) vil blive fremhævet i kommentarstrømmen. Indtast et ord, og tryk på Enter eller Tab for at tilføje. Indsæt eventuelt en kommasepareret liste."
tech_settings: "Tekniske indstillinger"
title: "Konfigurer kommentarstrøm"
weeks: "Uger"
wordlist: "Forbudte ord"
continue: "Fortsæt"
createdisplay:
check_the_form: "Ugyldig formular. Tjek venligst felterne"
continue: "Fprtsæt med det samme Facebook brugernavn"
error_create: "Fejl ved ændring af brugernavn"
fake_comment_body: "Dette er et eksempel på en kommentar. Læsere kan dele deres tanker og meninger med nyhedsrummet i kommentarfeltet"
fake_comment_date: "1 minut siden"
if_you_dont_change_your_name: "Hvis du ikke ændrer dit brugernavn på dette trin, vil dit Facebook brugernavn vises sammen med alle dine kommentarer"
required_field: "Påkrævet felt"
save: "Gem"
special_characters: "Brugernavne kan kun indeholde bogstaver og _"
username: "Brugernavn"
write_your_username: "Rediger dit brugernavn"
your_username: "Dit brugernavn vises på hver kommentar du sender."
dashboard:
auto_update: "Data opdateres automatisk hvert femte minut, eller når du genindlæser."
comment_count: "kommentarer"
flags: "Flags"
most_flags: "Historier med de fleste flags"
most_conversations: "Historier med de fleste samtaler"
next_update: "{0} minutter indtil næste opdatering."
no_activity: "Der har ikke været nogen kommentarer i løbet af de sidste fem minutter."
no_flags: "Der har ikke været nogle flag i de sidste 5 minutter! Hurra!"
no_likes: "Der har ikke været nogen der syntes godt om noget i de sidste 5 minutter. Helt stille"
done: "Færdig"
edit_comment:
body_input_label: "Rediger denne kommentar"
save_button: "Gem ændringer"
edit_window_expired: "Du kan ikke længere redigere denne kommentar. Tidsvinduet for at gøre det er udløbet. Hvorfor skriver du ikke en ny?"
edit_window_expired_close: "Luk"
edit_window_timer_prefix: "Luk vindue: "
second: "sekund"
seconds_plural: "sekunder"
email:
confirm:
has_been_requested: "Der er anmodet om en e-mail bekræftelse for følgende konto:"
to_confirm: "For at bekræfte kontoen, skal du besøge følgende link:"
confirm_email: "Bekræft Email"
if_you_did_not: "Hvis du ikke har anmodet om dette, kan du med sikkerhed ignorere denne email."
subject: "Email Bekræftelse"
password_reset:
we_received_a_request: "Vi har modtaget en anmodning om at nulstille din adgangskode. Hvis du ikke har anmodet om denne ændring, kan du ignoere denne email."
if_you_did: "Hvis du gjorde,"
please_click: "venligst klik her for at nulstille adgangskoden"
embedlink:
copy: "Kopier til udklipsholder"
error:
COMMENT_TOO_SHORT: "Din kommentar skal indeholde noget"
NOT_AUTHORIZED: "Du har ikke tilladelse til at udføre denne handling."
NO_SPECIAL_CHARACTERS: "Brugernavne kan kun indeholder bogstaver og _"
PASSWORD_LENGTH: "Adgangskoden er for kort"
PROFANITY_ERROR: "Brugernavne må ikke inholde stødende indhold. Kontakt venligst administratoren, hvis du mener at dette er en fejl."
USERNAME_IN_USE: "Brugernavnet er allerede i brug"
USERNAME_REQUIRED: "Du skal indtaste et brugernavn"
EDIT_WINDOW_ENDED: "Du kan ikke længere redigere denne kommentar. Tidsvinduet for at gøre det er udløbet."
EDIT_USERNAME_NOT_AUTHORIZED: "Du har ikke tilladelse til at opdatere dit brugernavn."
SAME_USERNAME_PROVIDED: "Du skal indsende et andet brugernavn."
EMAIL_IN_USE: "Email adressen er allerede i brug"
EMAIL_REQUIRED: "En email adresse er påkrævet"
LOGIN_MAXIMUM_EXCEEDED: "Du har lavet for mange mislykkede adgangskodeforsøg. Vent venligst."
PASSWORD_REQUIRED: "Du skal indtaste et kodeord"
COMMENTING_CLOSED: "Kommentering er allerede lukket"
NOT_FOUND: "Ressource ikke fundet"
ALREADY_EXISTS: "Ressource eksisterer allerede"
INVALID_ASSET_URL: "Aktivitetswebadresse er ugyldig"
email: "Ikke en gylding e-mail"
confirm_password: "Kodeordene matcher ikke. Tjek venligst igen."
network_error: "Det lykkedes ikke at oprette forbindelse til serveren. Tjek din internetforbindelse og prøv igen."
email_not_verified: "E-mail adresse {0} ikke bekræftet."
email_password: "E-mail og/eller kodeord er forkert."
organization_name: "Organisationsnavn må kun indeholde bogstaver og tal."
password: "Adgangskoden skal være mindst 8 tegn"
username: "Brugernavne kan kun indeholde bogstaver og _"
unexpected: "Der opstod en uventet fejl. Undskyld!"
flag_comment: "Rapportér kommentar"
flag_reason: "Årsag til rapportering (Valgfrit)"
flag_username: "Rapporter brugernavn"
framework:
banned_account_header: "Din konto er i øjeblikket bannet"
banned_account_body: "Det betyder at du ikke kan synes godt om, rapportere eller skrive kommentarer."
comment: "kommentar"
comment_is_ignored: "Denne kommentar er skjult, fordi du ignoerede denne bruger."
comment_is_rejected: "Du har afvist denne kommentar."
comment_is_hidden: "Denne kommentar er ikke tilgængelig"
comments: "kommentarer"
configure_stream: "Konfigurer"
content_not_available: "Dette indhold er ikke tilgængeligt"
edit_name:
button: "Indsend"
error: "Brugernavne kan kun indeholde bogstaver og _"
label: "Nyt brugernavn"
msg: "Din konto er midlertidigt suspenderet, fordi dit brugernavn er blevet anset for upassende. For at gendanne din konto skal du indtaste et nyt brugernavn. Kontakt os venligst, hvis du har spørgsmål."
my_comments: "Mine kommentarer"
my_profile: "Min profil"
new_count: "Se {0} mere {1}"
profile: "Profil"
show_all_comments: "Vis alle kommentarer"
success_bio_update: "Din biografi er blevet opdateret"
success_name_update: "Dit brugernavn er blevet opdateret"
success_update_settings: "De ændringer du har foretaget, er blevet anvendt til kommentarstrømmen på denne artikel."
show_all_replies: "Vis alle svar"
show_more_replies: "Vis flere svar"
view_more_comments: "se flere kommentarer"
view_reply: "vis svar"
from_settings_page: "Fra profilsiden kan du se din kommentarhistorie."
like: "Synes godt om"
loading_results: "Indlæser resultater"
marketing: "Dette ligner en annonce/markedsføring"
moderate_this_stream: "Moderer denne strøm"
modqueue:
account: "konto flag"
actions: "Handlinger"
all: "alle"
all_streams: "Alle Strømme"
notify_edited: "{0} redigeret kommentar {1}"
notify_accepted: "{0} accepteret kommentar {1}"
notify_rejected: "{0} afvist kommentar {1}"
notify_flagged: "{0} flagget kommentar {1}"
approve: "Godkend"
approved: "Godkendt"
ban_user: "Ban"
billion: "M"
close: "Close"
empty_queue: "Ikke flere kommentarer til at moderer! Du har indhentet det hele. Gå ud og tag noget ☕️"
flagged: "flagged"
reported: "Rapporteret"
less_detail: "Færre detajler"
likes: "Syntes godt om"
million: "M"
mod_faster: "Moderer hurtigere med tastaturgenveje"
moderate: "Moderer →"
more_detail: "Flere detaljer"
new: "Ny"
newest_first: "Nyeste først"
navigation: "Navigation"
next_comment: "Gå til næste kommentar"
oldest_first: "Ældste Først"
premod: "pre-mod"
prev_comment: "Gå til den forrige kommentar"
reject: "Afvis"
rejected: "Afvist"
reply: "Svar"
select_stream: "Vælg strøm"
shift_key: "⇧"
shortcuts: "Genveje"
show_shortcuts: "Vis genveje"
singleview: "Skift enkeltkommentar redigerings visning"
thismenu: "Åben denne menu"
thousand: "k"
try_these: "Prøv disse"
view_more_shortcuts: "Se flere genveje"
my_comment_history: "Min kommentar Historie"
name: "Navn"
no_agree_comment: "Jeg er ikke enig med denne kommentar"
no_like_bio: "Jeg kan ikke lide denne biografi"
no_like_username: "Jeg kan ikke lide dette brugernavn"
other: "Andet"
permalink: "Link"
personal_info: "Denne kommentar afslører personligt identificerbare oplysninger"
post: "Post"
profile: "Profil"
profile_settings: "Profilindstillinger"
reply: "Svar"
report: "Rapporter"
report_notif: "Tak fordi du rapporterede denne kommentar. Vores modereringsteam har fået besked, og vil gennemgå det inden for kort tid."
report_notif_remove: "Din rapport er blevet fjernet"
reported: "Rapporteret"
settings:
from_settings_page: "Fra profilsiden kan du se din kommentarhistorie."
my_comment_history: "Min kommentarhistorie"
profile: "Profil"
profile_settings: "Profilindstillinger"
sign_in: "Log ind"
to_access: "for at tilgå din profil"
user_no_comment: "Du har aldrig efterladt en kommentar. Deltag i samtalen!"
stream:
all_comments: "Alle kommentarer"
temporarily_suspended: "I overensstemmelse med {0}'s retningslinjer for fællesskabet er din konto midlertidigt suspenderet. Venligst tilslut dig samtalen {1}."
comment_not_found: "Kommentar blev ikke fundet"
step_1_header: "Rapportér et problem"
step_2_header: "Hjælp os med at forstå"
step_3_header: "Tak for din indsats"
streams:
all: "Alle"
article: "Historie"
closed: "Lukket"
empty_result: "Ingen egenskaber matcher denne søgning. Måske prøv og forsøge at udvide din søgning?"
filter_streams: "Filtrer strømme"
newest: "Nyeste"
oldest: "Ældste"
open: "Åben"
pubdate: "Udgivelsedato"
search: "Søg"
sort_by: "Sorter efter"
status: "Strøm status"
stream_status: "Strøm Status"
suspenduser:
title_suspend: "Suspendere bruger"
description_suspend: "Du suspenderer {0}. Denne kommentar vil gå til den afviste kø, og {0} vil ikke kunne synes godt om, rapportere, svare eller indsende indtil suspenderings tiden er færdig."
select_duration: "Vælg suspenderings tid"
one_hour: "1 time"
hours: "{0} timer"
days: "{0} dage"
cancel: "Afbryd"
suspend_user: "Suspender bruger"
email_message_suspend: "Kære {0},\n\nI overensstemmelse med {1}'s retningslinjer for fællesskabet er din konto midlertidigt suspenderet. Under suspensionen vil du ikke kunne kommentere, flagge eller engagere dig med andre kommentarer. Venligst tilslut dig til samtalen{2}.'"
title_notify: "Underret bruygeren om deres midlertidige suspension"
notify_suspend_until: "Bruger {0} er midlertidigt suspenderet. Denne suspension ophører automatisk om {1}."
description_notify: "Suspendering af denne bruger vil midlertidigt deaktivere deres konto og skjule alle deres kommentarer på webstedet."
write_message: "Skriv en besked"
send: "Send"
reject_username:
username: "brugernavn"
no_cancel: "Nej Afbryd"
description_reject: "Vil du midlertidigt forbyde denne bruger på grund af deres {0}? Hvis du gør det, vil det midlertidigt skjule deres kommentarer, indtil de omskriver deres {0}."
title_notify: "Underret brugeren om deres midlertidige suspension"
description_notify: "Suspendering af denne bruger vil midlertidigt deaktivere deres konto, og skjule alle deres kommentarer på webstedet."
title_reject: "Vi har bemærket at du afviste et brugernavn."
suspend_user: "Suspender bruger"
yes_suspend: "Ja suspender"
email_message_reject: "Et andet medlem af samfundet har for nylig flagget dit brugernavn til anmeldelse. På grund af indholdet blev din bruger afvist. Det betyder, at du ikke længere kan kommentere, synes godt om eller flagge indhold, før du omskriver dit brugernavn. Venligst send os en e-mail, hvis du har spørgsmål eller bekymringer."
write_message: "Skriv en besked"
send: "Send"
thank_you: "Vi sætter pris på din sikkerhed og feedback. En moderator vil gennemgå din rapport"
user:
bio_flags: "flag for denne bio"
user_bio: "Bruger Biografi"
username_flags: "flag for dette brugernavn"
user_impersonating: "Denne bruger efterligner"
user_no_comment: "Du har aldrig efterladt en kommentar. Deltag i samtalen"
username_offensive: "Dette brugernavn er stødende"
view_conversation: "Vis samtale"
install:
initial:
description: "Lad os oprette dit Talk-fællesskab på bare nogle få korte trin"
submit: "Kom igang"
add_organization:
description: "Fortæl os navnet på din organisation. Dette vises i emails, når du inviterer nye teammedlemmer."
label: "Organisationens navn"
save: "Gem"
create:
email: "Email adresse"
username: "Brugernavn"
password: "Kodeord"
confirm_password: "Bekræft kodeord"
save: "Gem"
permitted_domains:
title: "Tilladte domæner"
description: "Indtast de domæner, du gerne vil tillade til Talk. f.eks. dine lokale, og produktionsmiljøer. (fx. localhost:3000, staging.domain.com, domain.com)."
submit: "Afslut installationen"
final:
description: "Tak fordi du installerede Talk! Vi sendte en email for at bekræfte din e-mail-adresse. Mens du færdigøre oprettelsen af kontoen, kan du begynde at engagere med dine læsere."
launch: "Lancere Talk"
close: "Luk dette installations program"
+11 -6
View File
@@ -12,13 +12,15 @@
"build": "WEBPACK=TRUE NODE_ENV=production webpack -p --config webpack.config.js --bail",
"prebuild-watch": "yarn generate-introspection",
"build-watch": "WEBPACK=TRUE NODE_ENV=development webpack --progress --config webpack.config.js --watch",
"lint": "eslint --ext=.js --ext=.json bin/* .",
"lint": "yamllint locales/*.yml && eslint --ext=.js --ext=.json bin/* .",
"lint-fix": "yarn lint --fix",
"jest-watch": "TEST_MODE=unit NODE_ENV=test jest --watch",
"test": "TEST_MODE=unit NODE_ENV=test jest && TEST_MODE=unit NODE_ENV=test mocha -R ${MOCHA_REPORTER:-spec}",
"test-cover": "TEST_MODE=unit NODE_ENV=test istanbul cover _mocha --report text --check-coverage -- -R spec",
"heroku-postbuild": "./bin/cli plugins reconcile && yarn build",
"generate-introspection": "WEBPACK=TRUE NODE_ENV=test ./scripts/generateIntrospectionResult.js"
"generate-introspection": "WEBPACK=TRUE NODE_ENV=test ./scripts/generateIntrospectionResult.js",
"snyk-protect": "snyk protect",
"prepublish": "npm run snyk-protect"
},
"talk": {
"migration": {
@@ -177,13 +179,14 @@
"timekeeper": "^1.0.0",
"tlds": "^1.196.0",
"url-join": "^2.0.2",
"url-loader": "^0.5.9",
"url-loader": "^0.6.0",
"url-search-params": "^0.9.0",
"uuid": "^3.1.0",
"webpack": "^2.3.1",
"webpack-sources": "^1.0.1",
"yaml-loader": "^0.4.0",
"yamljs": "^0.2.10"
"yamljs": "^0.2.10",
"snyk": "^1.42.5"
},
"devDependencies": {
"@coralproject/eslint-config-talk": "^0.0.4",
@@ -204,12 +207,14 @@
"nodemon": "^1.11.0",
"pre-git": "^3.15.3",
"sinon": "^3.2.1",
"sinon-chai": "^2.13.0"
"sinon-chai": "^2.13.0",
"yaml-lint": "^1.0.0"
},
"engines": {
"node": "^8"
},
"release": {
"analyzeCommits": "simple-commit-message"
}
},
"snyk": true
}
+3 -2
View File
@@ -3,6 +3,7 @@ const get = require('lodash/get');
const yaml = require('yamljs');
const da = yaml.load('./locales/da.yml');
const es = yaml.load('./locales/es.yml');
const en = yaml.load('./locales/en.yml');
const fr = yaml.load('./locales/fr.yml');
@@ -13,9 +14,9 @@ const accepts = require('accepts');
// default language
let defaultLanguage = 'en';
let language = defaultLanguage;
const languages = ['en', 'es', 'fr', 'pt_BR'];
const languages = ['en', 'da', 'es', 'fr', 'pt_BR'];
const translations = Object.assign(en, es, fr, pt_BR);
const translations = Object.assign(en, es, fr, pt_BR, da);
/**
* Exposes a service object to allow translations.
+1
View File
@@ -14,6 +14,7 @@
margin-left:auto;
margin-right:auto;
max-width:500px;
display: block;
}
</style>
<title><%= title %></title>
+72 -3
View File
@@ -1093,6 +1093,10 @@ bluebird@^2.10.2:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
bluebird@^3.5.0:
version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
version "4.11.6"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
@@ -1289,6 +1293,10 @@ camelcase@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
camelcase@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
@@ -1547,7 +1555,7 @@ cliui@^2.1.0:
right-align "^0.1.1"
wordwrap "0.0.2"
cliui@^3.2.0:
cliui@^3.0.3, cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
dependencies:
@@ -3738,7 +3746,7 @@ inherits@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
ini@~1.3.0:
ini@^1.3.0, ini@~1.3.0:
version "1.3.4"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
@@ -4765,6 +4773,12 @@ lcid@^1.0.0:
dependencies:
invert-kv "^1.0.0"
leprechaun@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/leprechaun/-/leprechaun-0.0.2.tgz#8b96514a9e634c53fbe59a8094f3378c8fb2084d"
dependencies:
log-symbols "^1.0.2"
leven@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
@@ -5001,6 +5015,10 @@ lodash.memoize@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
lodash.merge@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
lodash.noop@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c"
@@ -5033,6 +5051,10 @@ lodash.shuffle@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b"
lodash.snakecase@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
lodash.toarray@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
@@ -5057,6 +5079,12 @@ lodash@4.17.4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lod
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
log-symbols@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
dependencies:
chalk "^1.0.0"
lolex@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6"
@@ -5412,6 +5440,15 @@ natural@^0.2.0:
sylvester ">= 0.0.12"
underscore ">=1.3.1"
nconf@^0.8.4:
version "0.8.5"
resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.8.5.tgz#f2941e1561952fa906bbb32328cf88d4c635e794"
dependencies:
async "^1.4.0"
ini "^1.3.0"
secure-keys "^1.0.0"
yargs "^3.19.0"
nearley@^2.7.10:
version "2.11.0"
resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.11.0.tgz#5e626c79a6cd2f6ab9e7e5d5805e7668967757ae"
@@ -7387,6 +7424,10 @@ sax@^1.1.4, sax@^1.2.1, sax@~1.2.1:
version "1.2.2"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828"
secure-keys@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca"
select@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
@@ -8438,6 +8479,10 @@ window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
window-size@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
window-size@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
@@ -8534,7 +8579,7 @@ xtend@^4.0.0, xtend@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
y18n@^3.2.1:
y18n@^3.2.0, y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
@@ -8542,6 +8587,18 @@ yallist@^2.0.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
yaml-lint@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/yaml-lint/-/yaml-lint-1.0.0.tgz#655068f583263eec7e2a0ded8f5b1895dd667e1c"
dependencies:
bluebird "^3.5.0"
glob "^7.1.2"
js-yaml "^3.9.1"
leprechaun "0.0.2"
lodash.merge "^4.6.0"
lodash.snakecase "^4.1.1"
nconf "^0.8.4"
yaml-loader@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/yaml-loader/-/yaml-loader-0.4.0.tgz#4aae447d13c1aa73a989d8a2a5309b0b1a3ca353"
@@ -8581,6 +8638,18 @@ yargs-parser@^7.0.0:
dependencies:
camelcase "^4.1.0"
yargs@^3.19.0:
version "3.32.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
dependencies:
camelcase "^2.0.1"
cliui "^3.0.3"
decamelize "^1.1.1"
os-locale "^1.4.0"
string-width "^1.0.1"
window-size "^0.1.4"
y18n "^3.2.0"
yargs@^4.0.0:
version "4.8.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"