Bower => NPM (#972)

no issue

- Convert validator to an npm dependency
  - clean up validator imports
  - fix validator function imports
  - remove unused validator extensions
- Convert devicejs to an npm dependency
- Convert remaining used bower deps to npm deps
- 🔥 Remove bower & unused bower dependencies
- remove globals imports in favor of direct module imports where possible
This commit is contained in:
Austin Burdine 2018-03-19 13:56:09 -04:00 committed by Kevin Ansfield
parent ff44c3f66c
commit fd6f2551bb
32 changed files with 127 additions and 134 deletions

View File

@ -10,8 +10,5 @@ module.exports = {
rules: {
// disable linting of `this.get` until there's a reliable autofix
'ghost/ember/use-ember-get-and-set': 'off'
},
globals: {
validator: false
}
};

View File

@ -30,9 +30,7 @@ before_install:
- export PATH=$HOME/.yarn/bin:$PATH
install:
- yarn global add bower
- yarn
- bower install
before_script:
- export DISPLAY=:99; sh -e /etc/init.d/xvfb start; sleep 3;

View File

@ -9,15 +9,10 @@ module.exports = function (grunt) {
grunt.initConfig({
clean: {
built: {
src: [
'dist/**'
]
src: ['dist/**']
},
dependencies: {
src: [
'bower_components/**',
'node_modules/**'
]
src: ['node_modules/**']
},
tmp: {
src: ['tmp/**']
@ -36,10 +31,6 @@ module.exports = function (grunt) {
command: 'yarn install'
},
'bower-install': {
command: 'bower install'
},
ember: {
command: function (mode) {
let liveReloadBaseUrl = grunt.option('live-reload-base-url') || '/ghost/';
@ -74,6 +65,6 @@ module.exports = function (grunt) {
});
grunt.registerTask('init', 'Install the client dependencies',
['shell:npm-install', 'shell:bower-install']
['shell:npm-install']
);
};

View File

@ -1,4 +1,5 @@
import TextField from '@ember/component/text-field';
import validator from 'npm:validator';
import {InvokeActionMixin} from 'ember-invoke-action';
import {computed} from '@ember/object';
import {run} from '@ember/runloop';

View File

@ -1,6 +1,8 @@
import $ from 'jquery';
import Component from '@ember/component';
import md5 from 'npm:blueimp-md5';
import request from 'ember-ajax/request';
import validator from 'npm:validator';
import {htmlSafe} from '@ember/string';
import {inject as service} from '@ember/service';
import {task, timeout} from 'ember-concurrency';
@ -120,9 +122,9 @@ export default Component.extend({
let email = this.get('email');
if (validator.isEmail(email)) {
if (validator.isEmail(email || '')) {
let size = this.get('size');
let gravatarUrl = `//www.gravatar.com/avatar/${window.md5(email)}?s=${size}&d=404`;
let gravatarUrl = `//www.gravatar.com/avatar/${md5(email)}?s=${size}&d=404`;
try {
// HEAD request is needed otherwise jquery attempts to process

View File

@ -2,6 +2,7 @@
import $ from 'jquery';
import Controller from '@ember/controller';
import randomPassword from 'ghost-admin/utils/random-password';
import validator from 'npm:validator';
import {
IMAGE_EXTENSIONS,
IMAGE_MIME_TYPES

View File

@ -2,6 +2,7 @@
import Controller, {inject as controller} from '@ember/controller';
import DS from 'ember-data';
import RSVP from 'rsvp';
import validator from 'npm:validator';
import {alias} from '@ember/object/computed';
import {computed} from '@ember/object';
import {A as emberA} from '@ember/array';
@ -43,14 +44,14 @@ export default Controller.extend({
let ownerEmail = this.get('ownerEmail');
return this.get('usersArray').filter(function (user) {
return validator.isEmail(user) && user !== ownerEmail;
return validator.isEmail(user || '') && user !== ownerEmail;
});
}),
invalidUsersArray: computed('usersArray', 'ownerEmail', function () {
let ownerEmail = this.get('ownerEmail');
return this.get('usersArray').reject(user => validator.isEmail(user) || user === ownerEmail);
return this.get('usersArray').reject(user => validator.isEmail(user || '') || user === ownerEmail);
}),
validationResult: computed('invalidUsersArray', function () {

View File

@ -2,6 +2,7 @@ import Controller from '@ember/controller';
import Ember from 'ember';
import boundOneWay from 'ghost-admin/utils/bound-one-way';
import isNumber from 'ghost-admin/utils/isNumber';
import validator from 'npm:validator';
import windowProxy from 'ghost-admin/utils/window-proxy';
import {alias, and, not, or, readOnly} from '@ember/object/computed';
import {computed} from '@ember/object';

View File

@ -1,5 +1,5 @@
/* global device */
import Mixin from '@ember/object/mixin';
import device from 'npm:current-device';
import {computed} from '@ember/object';
const keyCodes = {

View File

@ -14,14 +14,10 @@ import SlackIntegrationValidator from 'ghost-admin/validators/slack-integration'
import SubscriberValidator from 'ghost-admin/validators/subscriber';
import TagSettingsValidator from 'ghost-admin/validators/tag-settings';
import UserValidator from 'ghost-admin/validators/user';
import ValidatorExtensions from 'ghost-admin/utils/validator-extensions';
import {A as emberA, isArray as isEmberArray} from '@ember/array';
const {Errors} = DS;
// our extensions to the validator library
ValidatorExtensions.init();
/**
* The class that gets this mixin will receive these properties and functions.
* It will be able to validate any properties on itself (or the model it passes to validate())

View File

@ -1,8 +1,3 @@
/* Stop: Normalize.
/* ---------------------------------------------------------- */
@import "../../bower_components/normalize.css/normalize.css";
/* Patterns: Groups of Styles
/* ---------------------------------------------------------- */
@import "patterns/global.css";

View File

@ -1,8 +1,3 @@
/* Stop: Normalize.
/* ---------------------------------------------------------- */
@import "../../bower_components/normalize.css/normalize.css";
/* Patterns: Groups of Styles
/* ---------------------------------------------------------- */
@import "patterns/global.css";

View File

@ -1,4 +1,4 @@
/* global generatePassword */
import generatePassword from 'npm:password-generator';
export default function () {
let word = generatePassword(6);

View File

@ -1,17 +0,0 @@
import {isBlank} from '@ember/utils';
function init() {
// Provide a few custom validators
//
validator.extend('empty', function (str) {
return isBlank(str);
});
validator.extend('notContains', function (str, badString) {
return str.indexOf(badString) === -1;
});
}
export default {
init
};

View File

@ -1,4 +1,6 @@
import BaseValidator from './base';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default BaseValidator.create({
properties: ['email'],
@ -6,7 +8,7 @@ export default BaseValidator.create({
email(model) {
let email = model.get('email');
if (validator.empty(email)) {
if (isBlank(email)) {
model.get('errors').add('email', 'Please enter an email.');
this.invalidate();
} else if (!validator.isEmail(email)) {

View File

@ -1,4 +1,6 @@
import BaseValidator from './base';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default BaseValidator.create({
properties: ['label', 'url'],
@ -7,7 +9,7 @@ export default BaseValidator.create({
let label = model.get('label');
let hasValidated = model.get('hasValidated');
if (validator.empty(label)) {
if (isBlank(label)) {
model.get('errors').add('label', 'You must specify a label');
this.invalidate();
}
@ -23,7 +25,7 @@ export default BaseValidator.create({
/* eslint-enable camelcase */
let urlRegex = new RegExp(/^(\/|#|[a-zA-Z0-9-]+:)/);
if (validator.empty(url)) {
if (isBlank(url)) {
model.get('errors').add('url', 'You must specify a URL or relative path');
this.invalidate();
} else if (url.match(/\s/) || (!validator.isURL(url, validatorOptions) && !url.match(urlRegex))) {

View File

@ -1,4 +1,6 @@
import PasswordValidator from 'ghost-admin/validators/password';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default PasswordValidator.extend({
init() {
@ -9,7 +11,7 @@ export default PasswordValidator.extend({
name(model) {
let name = model.get('name');
if (!validator.isLength(name, 1)) {
if (!validator.isLength(name || '', 1)) {
model.get('errors').add('name', 'Please enter a name.');
this.invalidate();
}
@ -18,7 +20,7 @@ export default PasswordValidator.extend({
email(model) {
let email = model.get('email');
if (validator.empty(email)) {
if (isBlank(email)) {
model.get('errors').add('email', 'Please enter an email.');
this.invalidate();
} else if (!validator.isEmail(email)) {

View File

@ -1,4 +1,5 @@
import BaseValidator from './base';
import validator from 'npm:validator';
const BAD_PASSWORDS = [
'1234567890',
@ -63,7 +64,7 @@ export default BaseValidator.extend({
blogTitle = blogTitle ? blogTitle.trim().toLowerCase() : blogTitle;
// password must be longer than 10 characters
if (!validator.isLength(password, 10)) {
if (!validator.isLength(password || '', 10)) {
model.get('errors').add(errorTarget, 'Password must be at least 10 characters long');
return this.invalidate();
}

View File

@ -1,6 +1,7 @@
import BaseValidator from './base';
import moment from 'moment';
import {isEmpty, isPresent} from '@ember/utils';
import validator from 'npm:validator';
import {isBlank, isEmpty, isPresent} from '@ember/utils';
export default BaseValidator.create({
properties: [
@ -21,12 +22,12 @@ export default BaseValidator.create({
title(model) {
let title = model.get('title');
if (validator.empty(title)) {
if (isBlank(title)) {
model.get('errors').add('title', 'You must specify a title for the post.');
this.invalidate();
}
if (!validator.isLength(title, 0, 255)) {
if (!validator.isLength(title || '', 0, 255)) {
model.get('errors').add('title', 'Title cannot be longer than 255 characters.');
this.invalidate();
}
@ -35,7 +36,7 @@ export default BaseValidator.create({
customExcerpt(model) {
let customExcerpt = model.get('customExcerpt');
if (!validator.isLength(customExcerpt, 0, 300)) {
if (!validator.isLength(customExcerpt || '', 0, 300)) {
model.get('errors').add('customExcerpt', 'Excerpt cannot be longer than 300 characters.');
this.invalidate();
}
@ -53,7 +54,7 @@ export default BaseValidator.create({
codeinjectionHead(model) {
let codeinjectionHead = model.get('codeinjectionHead');
if (!validator.isLength(codeinjectionHead, 0, 65535)) {
if (!validator.isLength(codeinjectionHead || '', 0, 65535)) {
model.get('errors').add('codeinjectionHead', 'Header code cannot be longer than 65535 characters.');
this.invalidate();
}
@ -62,7 +63,7 @@ export default BaseValidator.create({
metaTitle(model) {
let metaTitle = model.get('metaTitle');
if (!validator.isLength(metaTitle, 0, 300)) {
if (!validator.isLength(metaTitle || '', 0, 300)) {
model.get('errors').add('metaTitle', 'Meta Title cannot be longer than 300 characters.');
this.invalidate();
}
@ -71,7 +72,7 @@ export default BaseValidator.create({
metaDescription(model) {
let metaDescription = model.get('metaDescription');
if (!validator.isLength(metaDescription, 0, 500)) {
if (!validator.isLength(metaDescription || '', 0, 500)) {
model.get('errors').add('metaDescription', 'Meta Description cannot be longer than 500 characters.');
this.invalidate();
}
@ -80,7 +81,7 @@ export default BaseValidator.create({
ogTitle(model) {
let ogTitle = model.get('ogTitle');
if (!validator.isLength(ogTitle, 0, 300)) {
if (!validator.isLength(ogTitle || '', 0, 300)) {
model.get('errors').add('ogTitle', 'Facebook Title cannot be longer than 300 characters.');
this.invalidate();
}
@ -89,7 +90,7 @@ export default BaseValidator.create({
ogDescription(model) {
let ogDescription = model.get('ogDescription');
if (!validator.isLength(ogDescription, 0, 500)) {
if (!validator.isLength(ogDescription || '', 0, 500)) {
model.get('errors').add('ogDescription', 'Facebook Description cannot be longer than 500 characters.');
this.invalidate();
}
@ -98,7 +99,7 @@ export default BaseValidator.create({
twitterTitle(model) {
let twitterTitle = model.get('twitterTitle');
if (!validator.isLength(twitterTitle, 0, 300)) {
if (!validator.isLength(twitterTitle || '', 0, 300)) {
model.get('errors').add('twitterTitle', 'Twitter Title cannot be longer than 300 characters.');
this.invalidate();
}
@ -107,7 +108,7 @@ export default BaseValidator.create({
twitterDescription(model) {
let twitterDescription = model.get('twitterDescription');
if (!validator.isLength(twitterDescription, 0, 500)) {
if (!validator.isLength(twitterDescription || '', 0, 500)) {
model.get('errors').add('twitterDescription', 'Twitter Description cannot be longer than 500 characters.');
this.invalidate();
}
@ -149,7 +150,7 @@ export default BaseValidator.create({
}
// we have a time string but no date string
if (validator.empty(publishedAtBlogDate) && !validator.empty(publishedAtBlogTime)) {
if (isBlank(publishedAtBlogDate) && !isBlank(publishedAtBlogTime)) {
model.get('errors').add('publishedAtBlogDate', 'Can\'t be blank');
return this.invalidate();
}

View File

@ -1,4 +1,6 @@
import PasswordValidator from 'ghost-admin/validators/password';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default PasswordValidator.create({
properties: ['newPassword'],
@ -7,10 +9,10 @@ export default PasswordValidator.create({
let p1 = model.get('newPassword');
let p2 = model.get('ne2Password');
if (validator.empty(p1)) {
if (isBlank(p1)) {
model.get('errors').add('newPassword', 'Please enter a password.');
this.invalidate();
} else if (!validator.equals(p1, p2)) {
} else if (!validator.equals(p1, p2 || '')) {
model.get('errors').add('ne2Password', 'The two new passwords don\'t match.');
this.invalidate();
}

View File

@ -1,11 +1,12 @@
import BaseValidator from './base';
import validator from 'npm:validator';
export default BaseValidator.create({
properties: ['title', 'description', 'password'],
title(model) {
let title = model.get('title');
if (!validator.isLength(title, 0, 150)) {
if (!validator.isLength(title || '', 0, 150)) {
model.get('errors').add('title', 'Title is too long');
this.invalidate();
}
@ -14,7 +15,7 @@ export default BaseValidator.create({
description(model) {
let desc = model.get('description');
if (!validator.isLength(desc, 0, 200)) {
if (!validator.isLength(desc || '', 0, 200)) {
model.get('errors').add('description', 'Description is too long');
this.invalidate();
}

View File

@ -1,4 +1,5 @@
import NewUserValidator from 'ghost-admin/validators/new-user';
import validator from 'npm:validator';
export default NewUserValidator.create({
properties: ['name', 'email', 'password', 'blogTitle'],
@ -6,12 +7,12 @@ export default NewUserValidator.create({
blogTitle(model) {
let blogTitle = model.get('blogTitle');
if (!validator.isLength(blogTitle, 1)) {
if (!validator.isLength(blogTitle || '', 1)) {
model.get('errors').add('blogTitle', 'Please enter a blog title.');
this.invalidate();
}
if (!validator.isLength(blogTitle, 0, 150)) {
if (!validator.isLength(blogTitle || '', 0, 150)) {
model.get('errors').add('blogTitle', 'Title is too long');
this.invalidate();
}

View File

@ -1,4 +1,6 @@
import BaseValidator from './base';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default BaseValidator.create({
properties: ['identification', 'signin', 'forgotPassword'],
@ -7,7 +9,7 @@ export default BaseValidator.create({
identification(model) {
let id = model.get('identification');
if (!validator.empty(id) && !validator.isEmail(id)) {
if (!isBlank(id) && !validator.isEmail(id)) {
model.get('errors').add('identification', this.get('invalidMessage'));
this.invalidate();
}
@ -19,17 +21,17 @@ export default BaseValidator.create({
model.get('errors').clear();
if (validator.empty(id)) {
if (isBlank(id)) {
model.get('errors').add('identification', 'Please enter an email');
this.invalidate();
}
if (!validator.empty(id) && !validator.isEmail(id)) {
if (!isBlank(id) && !validator.isEmail(id)) {
model.get('errors').add('identification', this.get('invalidMessage'));
this.invalidate();
}
if (validator.empty(password)) {
if (isBlank(password)) {
model.get('errors').add('password', 'Please enter a password');
this.invalidate();
}
@ -40,7 +42,7 @@ export default BaseValidator.create({
model.get('errors').clear();
if (validator.empty(id) || !validator.isEmail(id)) {
if (isBlank(id) || !validator.isEmail(id)) {
model.get('errors').add('identification', this.get('invalidMessage'));
this.invalidate();
}

View File

@ -1,4 +1,5 @@
import BaseValidator from './base';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default BaseValidator.create({

View File

@ -1,4 +1,6 @@
import BaseValidator from './base';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default BaseValidator.create({
properties: ['email'],
@ -6,7 +8,7 @@ export default BaseValidator.create({
email(model) {
let email = model.get('email');
if (validator.empty(email)) {
if (isBlank(email)) {
model.get('errors').add('email', 'Please enter an email.');
model.get('hasValidated').pushObject('email');
this.invalidate();

View File

@ -1,4 +1,6 @@
import BaseValidator from './base';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default BaseValidator.create({
properties: ['name', 'slug', 'description', 'metaTitle', 'metaDescription'],
@ -6,7 +8,7 @@ export default BaseValidator.create({
name(model) {
let name = model.get('name');
if (validator.empty(name)) {
if (isBlank(name)) {
model.get('errors').add('name', 'You must specify a name for the tag.');
this.invalidate();
} else if (name.match(/^,/)) {
@ -21,7 +23,7 @@ export default BaseValidator.create({
slug(model) {
let slug = model.get('slug');
if (!validator.isLength(slug, 0, 191)) {
if (!validator.isLength(slug || '', 0, 191)) {
model.get('errors').add('slug', 'URL cannot be longer than 191 characters.');
this.invalidate();
}
@ -30,7 +32,7 @@ export default BaseValidator.create({
description(model) {
let description = model.get('description');
if (!validator.isLength(description, 0, 500)) {
if (!validator.isLength(description || '', 0, 500)) {
model.get('errors').add('description', 'Description cannot be longer than 500 characters.');
this.invalidate();
}
@ -39,7 +41,7 @@ export default BaseValidator.create({
metaTitle(model) {
let metaTitle = model.get('metaTitle');
if (!validator.isLength(metaTitle, 0, 300)) {
if (!validator.isLength(metaTitle || '', 0, 300)) {
model.get('errors').add('metaTitle', 'Meta Title cannot be longer than 300 characters.');
this.invalidate();
}
@ -48,7 +50,7 @@ export default BaseValidator.create({
metaDescription(model) {
let metaDescription = model.get('metaDescription');
if (!validator.isLength(metaDescription, 0, 500)) {
if (!validator.isLength(metaDescription || '', 0, 500)) {
model.get('errors').add('metaDescription', 'Meta Description cannot be longer than 500 characters.');
this.invalidate();
}

View File

@ -1,4 +1,5 @@
import PasswordValidator from 'ghost-admin/validators/password';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';
export default PasswordValidator.create({
@ -12,7 +13,7 @@ export default PasswordValidator.create({
let name = model.get('name');
if (this.isActive(model)) {
if (validator.empty(name)) {
if (isBlank(name)) {
model.get('errors').add('name', 'Please enter a name.');
this.invalidate();
} else if (!validator.isLength(name, 0, 191)) {
@ -26,7 +27,7 @@ export default PasswordValidator.create({
let bio = model.get('bio');
if (this.isActive(model)) {
if (!validator.isLength(bio, 0, 200)) {
if (!validator.isLength(bio || '', 0, 200)) {
model.get('errors').add('bio', 'Bio is too long');
this.invalidate();
}
@ -36,12 +37,12 @@ export default PasswordValidator.create({
email(model) {
let email = model.get('email');
if (!validator.isEmail(email)) {
if (!validator.isEmail(email || '')) {
model.get('errors').add('email', 'Please supply a valid email address');
this.invalidate();
}
if (!validator.isLength(email, 0, 191)) {
if (!validator.isLength(email || '', 0, 191)) {
model.get('errors').add('email', 'Email is too long');
this.invalidate();
}
@ -51,7 +52,7 @@ export default PasswordValidator.create({
let location = model.get('location');
if (this.isActive(model)) {
if (!validator.isLength(location, 0, 150)) {
if (!validator.isLength(location || '', 0, 150)) {
model.get('errors').add('location', 'Location is too long');
this.invalidate();
}
@ -61,11 +62,11 @@ export default PasswordValidator.create({
website(model) {
let website = model.get('website');
// eslint-disable-next-line camelcase
let isInvalidWebsite = !validator.isURL(website, {require_protocol: false})
|| !validator.isLength(website, 0, 2000);
let isInvalidWebsite = !validator.isURL(website || '', {require_protocol: false})
|| !validator.isLength(website || '', 0, 2000);
if (this.isActive(model)) {
if (!validator.empty(website) && isInvalidWebsite) {
if (!isBlank(website) && isInvalidWebsite) {
model.get('errors').add('website', 'Website is not a valid url');
this.invalidate();
}
@ -96,7 +97,7 @@ export default PasswordValidator.create({
model.get('errors').add('newPassword', 'Sorry, passwords can\'t be blank');
this.invalidate();
} else {
if (!validator.equals(newPassword, ne2Password)) {
if (!validator.equals(newPassword, ne2Password || '')) {
model.get('errors').add('ne2Password', 'Your new passwords do not match');
this.invalidate();
}

View File

@ -1,11 +0,0 @@
{
"name": "ghost-admin",
"dependencies": {
"devicejs": "0.2.7",
"google-caja": "6005.0.0",
"keymaster": "1.6.3",
"normalize.css": "3.0.3",
"rangyinputs": "1.2.0",
"validator-js": "3.39.0"
}
}

View File

@ -143,20 +143,7 @@ module.exports = function (defaults) {
}
},
nodeAssets: {
'blueimp-md5': {
import: ['js/md5.js']
},
codemirror: codemirrorAssets(),
'mobiledoc-kit': {
import: ['dist/amd/mobiledoc-kit.js', 'dist/amd/mobiledoc-kit.map']
},
'password-generator': {
import: ['lib/password-generator.js']
},
simplemde: {
srcDir: 'debug',
import: ['simplemde.js', 'simplemde.css']
}
codemirror: codemirrorAssets()
},
svgJar: {
strategy: 'inline',
@ -181,12 +168,16 @@ module.exports = function (defaults) {
}
});
// Stop: Normalize
app.import('node_modules/normalize.css/normalize.css');
app.import('node_modules/simplemde/debug/simplemde.css');
// 'dem Scripts
app.import('bower_components/validator-js/validator.js');
app.import('bower_components/rangyinputs/rangyinputs-jquery-src.js');
app.import('bower_components/keymaster/keymaster.js');
app.import('bower_components/devicejs/lib/device.js');
app.import('bower_components/google-caja/html-css-sanitizer-bundle.js');
app.import('node_modules/google-caja-bower/html-css-sanitizer-bundle.js');
app.import('node_modules/keymaster/keymaster.js');
app.import('node_modules/mobiledoc-kit/dist/amd/mobiledoc-kit.js');
app.import('node_modules/mobiledoc-kit/dist/amd/mobiledoc-kit.map');
app.import('node_modules/simplemde/debug/simplemde.js');
// pull things we rely on via lazy-loading into the test-support.js file so
// that tests don't break when running via http://localhost:4200/tests

View File

@ -29,7 +29,6 @@
"@html-next/vertical-collection": "1.0.0-beta.8",
"autoprefixer": "8.1.0",
"blueimp-md5": "2.10.0",
"bower": "1.8.2",
"broccoli-asset-rev": "2.6.0",
"broccoli-clean-css": "^2.0.1",
"broccoli-concat": "3.2.2",
@ -41,6 +40,7 @@
"coveralls": "3.0.0",
"csscomb": "4.2.0",
"cssnano": "4.0.0-rc.2",
"current-device": "0.7.2",
"deparam": "1.0.5",
"ember-ajax": "3.1.0",
"ember-assign-helper": "0.1.2",
@ -99,8 +99,10 @@
"eslint-plugin-ghost": "0.0.23",
"fs-extra": "4.0.3",
"glob": "7.1.2",
"google-caja-bower": "https://github.com/acburdine/google-caja-bower#ghost",
"grunt": "1.0.2",
"grunt-shell": "2.1.0",
"keymaster": "1.6.2",
"liquid-fire": "0.29.2",
"liquid-tether": "2.0.6",
"liquid-wormhole": "2.1.1",
@ -111,6 +113,7 @@
"markdown-it-mark": "2.0.0",
"matchdep": "2.0.0",
"mobiledoc-kit": "0.10.21",
"normalize.css": "3.0.3",
"password-generator": "2.2.0",
"postcss-color-function": "4.0.1",
"postcss-custom-properties": "6.2.0",
@ -118,6 +121,7 @@
"simplemde": "https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost",
"testem": "2.0.0",
"top-gh-contribs": "2.0.4",
"validator": "7.2.0",
"walk-sync": "0.3.2"
},
"ember-addon": {

View File

@ -1,7 +1,7 @@
/* global md5 */
import Pretender from 'pretender';
import Service from '@ember/service';
import hbs from 'htmlbars-inline-precompile';
import md5 from 'npm:blueimp-md5';
import wait from 'ember-test-helpers/wait';
import {describe, it} from 'mocha';
import {expect} from 'chai';

View File

@ -1236,10 +1236,6 @@ bower-endpoint-parser@0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz#00b565adbfab6f2d35addde977e97962acbcb3f6"
bower@1.8.2:
version "1.8.2"
resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.2.tgz#adf53529c8d4af02ef24fb8d5341c1419d33e2f7"
brace-expansion@^1.0.0, brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -2760,6 +2756,10 @@ cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0":
dependencies:
cssom "0.3.x"
current-device@0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/current-device/-/current-device-0.7.2.tgz#22eaf35181673e693d5679c34b6f5a08f097b5b8"
currently-unhandled@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
@ -5076,6 +5076,10 @@ gonzales-pe@^3.4.7:
dependencies:
minimist "1.1.x"
"google-caja-bower@https://github.com/acburdine/google-caja-bower#ghost":
version "6011.0.0"
resolved "https://github.com/acburdine/google-caja-bower#275cb75249f038492094a499756a73719ae071fd"
graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
@ -6066,6 +6070,22 @@ just-extend@^1.1.27:
version "1.1.27"
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905"
<<<<<<< HEAD
=======
jxLoader@*:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jxLoader/-/jxLoader-0.1.1.tgz#0134ea5144e533b594fc1ff25ff194e235c53ecd"
dependencies:
js-yaml "0.3.x"
moo-server "1.3.x"
promised-io "*"
walker "1.x"
>>>>>>> 🔥 Remove bower & unused bower dependencies
keymaster@1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/keymaster/-/keymaster-1.6.2.tgz#e1ae54d0ea9488f9f60b66b668f02e9a1946c6eb"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@ -7177,6 +7197,10 @@ normalize-url@^1.0.0:
query-string "^4.1.0"
sort-keys "^1.0.0"
normalize.css@3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-3.0.3.tgz#acc00262e235a2caa91363a2e5e3bfa4f8ad05c6"
npm-git-info@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5"
@ -9641,6 +9665,10 @@ validate-npm-package-name@^3.0.0:
dependencies:
builtins "^1.0.3"
validator@7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-7.2.0.tgz#a63dcbaba51d4350bf8df20988e0d5a54d711791"
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"