Skip to content

Commit

Permalink
Bower => NPM (TryGhost#972)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
acburdine authored and kevinansfield committed Mar 19, 2018
1 parent ff44c3f commit fd6f255
Show file tree
Hide file tree
Showing 32 changed files with 127 additions and 134 deletions.
3 changes: 0 additions & 3 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
};
2 changes: 0 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
15 changes: 3 additions & 12 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -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/**']
Expand All @@ -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/';
Expand Down Expand Up @@ -74,6 +65,6 @@ module.exports = function (grunt) {
});

grunt.registerTask('init', 'Install the client dependencies',
['shell:npm-install', 'shell:bower-install']
['shell:npm-install']
);
};
1 change: 1 addition & 0 deletions app/components/gh-navitem-url-input.js
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
6 changes: 4 additions & 2 deletions app/components/gh-profile-image.js
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions app/controllers/settings/general.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions app/controllers/setup/three.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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 () {
Expand Down
1 change: 1 addition & 0 deletions app/controllers/team/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
2 changes: 1 addition & 1 deletion app/mixins/text-input.js
Original file line number Diff line number Diff line change
@@ -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 = {
Expand Down
4 changes: 0 additions & 4 deletions app/mixins/validation-engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
5 changes: 0 additions & 5 deletions app/styles/app-dark.css
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/* Stop: Normalize.
/* ---------------------------------------------------------- */
@import "../../bower_components/normalize.css/normalize.css";


/* Patterns: Groups of Styles
/* ---------------------------------------------------------- */
@import "patterns/global.css";
Expand Down
5 changes: 0 additions & 5 deletions app/styles/app.css
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
/* Stop: Normalize.
/* ---------------------------------------------------------- */
@import "../../bower_components/normalize.css/normalize.css";


/* Patterns: Groups of Styles
/* ---------------------------------------------------------- */
@import "patterns/global.css";
Expand Down
2 changes: 1 addition & 1 deletion app/utils/random-password.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* global generatePassword */
import generatePassword from 'npm:password-generator';

export default function () {
let word = generatePassword(6);
Expand Down
17 changes: 0 additions & 17 deletions app/utils/validator-extensions.js

This file was deleted.

4 changes: 3 additions & 1 deletion app/validators/invite-user.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import BaseValidator from './base';
import validator from 'npm:validator';
import {isBlank} from '@ember/utils';

export default BaseValidator.create({
properties: ['email'],

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)) {
Expand Down
6 changes: 4 additions & 2 deletions app/validators/nav-item.js
Original file line number Diff line number Diff line change
@@ -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'],
Expand All @@ -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();
}
Expand All @@ -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))) {
Expand Down
6 changes: 4 additions & 2 deletions app/validators/new-user.js
Original file line number Diff line number Diff line change
@@ -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() {
Expand All @@ -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();
}
Expand All @@ -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)) {
Expand Down
3 changes: 2 additions & 1 deletion app/validators/password.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import BaseValidator from './base';
import validator from 'npm:validator';

const BAD_PASSWORDS = [
'1234567890',
Expand Down Expand Up @@ -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();
}
Expand Down
25 changes: 13 additions & 12 deletions app/validators/post.js
Original file line number Diff line number Diff line change
@@ -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: [
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand All @@ -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();
}
Expand Down Expand Up @@ -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();
}
Expand Down
6 changes: 4 additions & 2 deletions app/validators/reset.js
Original file line number Diff line number Diff line change
@@ -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'],
Expand All @@ -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();
}
Expand Down
Loading

0 comments on commit fd6f255

Please sign in to comment.