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:
parent
ff44c3f66c
commit
fd6f2551bb
|
@ -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
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
15
Gruntfile.js
15
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']
|
||||
);
|
||||
};
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 () {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
/* Stop: Normalize.
|
||||
/* ---------------------------------------------------------- */
|
||||
@import "../../bower_components/normalize.css/normalize.css";
|
||||
|
||||
|
||||
/* Patterns: Groups of Styles
|
||||
/* ---------------------------------------------------------- */
|
||||
@import "patterns/global.css";
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
/* Stop: Normalize.
|
||||
/* ---------------------------------------------------------- */
|
||||
@import "../../bower_components/normalize.css/normalize.css";
|
||||
|
||||
|
||||
/* Patterns: Groups of Styles
|
||||
/* ---------------------------------------------------------- */
|
||||
@import "patterns/global.css";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* global generatePassword */
|
||||
import generatePassword from 'npm:password-generator';
|
||||
|
||||
export default function () {
|
||||
let word = generatePassword(6);
|
||||
|
|
|
@ -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
|
||||
};
|
|
@ -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)) {
|
||||
|
|
|
@ -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))) {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import BaseValidator from './base';
|
||||
import validator from 'npm:validator';
|
||||
import {isBlank} from '@ember/utils';
|
||||
|
||||
export default BaseValidator.create({
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
11
bower.json
11
bower.json
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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';
|
||||
|
|
36
yarn.lock
36
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"
|
||||
|
|
Loading…
Reference in New Issue