From fd6f2551bb3414556757a6d99c54cdd09440e151 Mon Sep 17 00:00:00 2001 From: Austin Burdine Date: Mon, 19 Mar 2018 13:56:09 -0400 Subject: [PATCH] Bower => NPM (#972) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .eslintrc.js | 3 -- .travis.yml | 2 -- Gruntfile.js | 15 ++------ app/components/gh-navitem-url-input.js | 1 + app/components/gh-profile-image.js | 6 ++-- app/controllers/settings/general.js | 1 + app/controllers/setup/three.js | 5 +-- app/controllers/team/user.js | 1 + app/mixins/text-input.js | 2 +- app/mixins/validation-engine.js | 4 --- app/styles/app-dark.css | 5 --- app/styles/app.css | 5 --- app/utils/random-password.js | 2 +- app/utils/validator-extensions.js | 17 --------- app/validators/invite-user.js | 4 ++- app/validators/nav-item.js | 6 ++-- app/validators/new-user.js | 6 ++-- app/validators/password.js | 3 +- app/validators/post.js | 25 ++++++------- app/validators/reset.js | 6 ++-- app/validators/setting.js | 5 +-- app/validators/setup.js | 5 +-- app/validators/signin.js | 12 ++++--- app/validators/slack-integration.js | 1 + app/validators/subscriber.js | 4 ++- app/validators/tag-settings.js | 12 ++++--- app/validators/user.js | 19 +++++----- bower.json | 11 ------ ember-cli-build.js | 29 ++++++--------- package.json | 6 +++- .../components/gh-profile-image-test.js | 2 +- yarn.lock | 36 ++++++++++++++++--- 32 files changed, 127 insertions(+), 134 deletions(-) delete mode 100644 app/utils/validator-extensions.js delete mode 100644 bower.json diff --git a/.eslintrc.js b/.eslintrc.js index a4b521d04..bffb8f433 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -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 } }; diff --git a/.travis.yml b/.travis.yml index f5c4a7e83..ff952d456 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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; diff --git a/Gruntfile.js b/Gruntfile.js index 6252da0d7..f4eb1027f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -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'] ); }; diff --git a/app/components/gh-navitem-url-input.js b/app/components/gh-navitem-url-input.js index 0ab4c334a..569c63e8e 100644 --- a/app/components/gh-navitem-url-input.js +++ b/app/components/gh-navitem-url-input.js @@ -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'; diff --git a/app/components/gh-profile-image.js b/app/components/gh-profile-image.js index 9328da4bf..c8e364042 100644 --- a/app/components/gh-profile-image.js +++ b/app/components/gh-profile-image.js @@ -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 diff --git a/app/controllers/settings/general.js b/app/controllers/settings/general.js index 85af777df..d16545e51 100644 --- a/app/controllers/settings/general.js +++ b/app/controllers/settings/general.js @@ -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 diff --git a/app/controllers/setup/three.js b/app/controllers/setup/three.js index 63638f639..022b3a03b 100644 --- a/app/controllers/setup/three.js +++ b/app/controllers/setup/three.js @@ -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 () { diff --git a/app/controllers/team/user.js b/app/controllers/team/user.js index 849bd6be8..f0dddf006 100644 --- a/app/controllers/team/user.js +++ b/app/controllers/team/user.js @@ -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'; diff --git a/app/mixins/text-input.js b/app/mixins/text-input.js index 765e0db83..fe2630d49 100644 --- a/app/mixins/text-input.js +++ b/app/mixins/text-input.js @@ -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 = { diff --git a/app/mixins/validation-engine.js b/app/mixins/validation-engine.js index b18b2aa38..8a0766296 100644 --- a/app/mixins/validation-engine.js +++ b/app/mixins/validation-engine.js @@ -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()) diff --git a/app/styles/app-dark.css b/app/styles/app-dark.css index 0ab549fd0..560d3b0bc 100644 --- a/app/styles/app-dark.css +++ b/app/styles/app-dark.css @@ -1,8 +1,3 @@ -/* Stop: Normalize. -/* ---------------------------------------------------------- */ -@import "../../bower_components/normalize.css/normalize.css"; - - /* Patterns: Groups of Styles /* ---------------------------------------------------------- */ @import "patterns/global.css"; diff --git a/app/styles/app.css b/app/styles/app.css index f5cce9e0e..3bc719d2f 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -1,8 +1,3 @@ -/* Stop: Normalize. -/* ---------------------------------------------------------- */ -@import "../../bower_components/normalize.css/normalize.css"; - - /* Patterns: Groups of Styles /* ---------------------------------------------------------- */ @import "patterns/global.css"; diff --git a/app/utils/random-password.js b/app/utils/random-password.js index 3e308984b..e6613d295 100644 --- a/app/utils/random-password.js +++ b/app/utils/random-password.js @@ -1,4 +1,4 @@ -/* global generatePassword */ +import generatePassword from 'npm:password-generator'; export default function () { let word = generatePassword(6); diff --git a/app/utils/validator-extensions.js b/app/utils/validator-extensions.js deleted file mode 100644 index 44e5ccec7..000000000 --- a/app/utils/validator-extensions.js +++ /dev/null @@ -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 -}; diff --git a/app/validators/invite-user.js b/app/validators/invite-user.js index a43b88aba..de92dae04 100644 --- a/app/validators/invite-user.js +++ b/app/validators/invite-user.js @@ -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)) { diff --git a/app/validators/nav-item.js b/app/validators/nav-item.js index cb782de2c..a398f1827 100644 --- a/app/validators/nav-item.js +++ b/app/validators/nav-item.js @@ -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))) { diff --git a/app/validators/new-user.js b/app/validators/new-user.js index c5b9f45a3..622916451 100644 --- a/app/validators/new-user.js +++ b/app/validators/new-user.js @@ -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)) { diff --git a/app/validators/password.js b/app/validators/password.js index 46f87f9fe..ad346992f 100644 --- a/app/validators/password.js +++ b/app/validators/password.js @@ -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(); } diff --git a/app/validators/post.js b/app/validators/post.js index c7a2b77d3..d47135b34 100644 --- a/app/validators/post.js +++ b/app/validators/post.js @@ -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(); } diff --git a/app/validators/reset.js b/app/validators/reset.js index 7d04bdea8..8d3c45405 100644 --- a/app/validators/reset.js +++ b/app/validators/reset.js @@ -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(); } diff --git a/app/validators/setting.js b/app/validators/setting.js index 807bbc6a3..d85649dd3 100644 --- a/app/validators/setting.js +++ b/app/validators/setting.js @@ -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(); } diff --git a/app/validators/setup.js b/app/validators/setup.js index b6497e268..751b2dc27 100644 --- a/app/validators/setup.js +++ b/app/validators/setup.js @@ -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(); } diff --git a/app/validators/signin.js b/app/validators/signin.js index 46dd6aaaa..dc1e7188a 100644 --- a/app/validators/signin.js +++ b/app/validators/signin.js @@ -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(); } diff --git a/app/validators/slack-integration.js b/app/validators/slack-integration.js index b4af70791..da2b7bb12 100644 --- a/app/validators/slack-integration.js +++ b/app/validators/slack-integration.js @@ -1,4 +1,5 @@ import BaseValidator from './base'; +import validator from 'npm:validator'; import {isBlank} from '@ember/utils'; export default BaseValidator.create({ diff --git a/app/validators/subscriber.js b/app/validators/subscriber.js index 56ab659b7..b41ded2cc 100644 --- a/app/validators/subscriber.js +++ b/app/validators/subscriber.js @@ -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(); diff --git a/app/validators/tag-settings.js b/app/validators/tag-settings.js index 6943d2f3b..769f5cf5c 100644 --- a/app/validators/tag-settings.js +++ b/app/validators/tag-settings.js @@ -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(); } diff --git a/app/validators/user.js b/app/validators/user.js index be8de838c..a23e4f9b8 100644 --- a/app/validators/user.js +++ b/app/validators/user.js @@ -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(); } diff --git a/bower.json b/bower.json deleted file mode 100644 index b9865de00..000000000 --- a/bower.json +++ /dev/null @@ -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" - } -} diff --git a/ember-cli-build.js b/ember-cli-build.js index d5478e29e..47f716d4e 100644 --- a/ember-cli-build.js +++ b/ember-cli-build.js @@ -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 diff --git a/package.json b/package.json index 8287276a2..327ebc683 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/tests/integration/components/gh-profile-image-test.js b/tests/integration/components/gh-profile-image-test.js index 72eadce69..814fb1602 100644 --- a/tests/integration/components/gh-profile-image-test.js +++ b/tests/integration/components/gh-profile-image-test.js @@ -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'; diff --git a/yarn.lock b/yarn.lock index f30e5078a..36c29bac2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"