mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-04 08:54:36 +03:00
cb59388c5b
no issue - adds `eslint-plugin-sort-imports-es6-autofix` dependency - implements ESLint's base `sort-imports` rule but has a distinction in that `import {foo} from 'bar';` is considered `multiple` rather than `single` - fixes ESLint's autofix behaviour so `eslint --fix` will actually fix the sort order - updates all unordered import rules by using `eslint --fix` With the increased number of `import` statements since Ember+ecosystem started moving towards es6 modules I've found it frustrating at times trying to search through randomly ordered import statements. Recently I've been sorting imports manually when I've added new code or touched old code so I thought I'd add an ESLint rule to codify it.
109 lines
3.1 KiB
JavaScript
109 lines
3.1 KiB
JavaScript
import Ember from 'ember';
|
|
import RSVP from 'rsvp';
|
|
import Service from 'ember-service';
|
|
import computed from 'ember-computed';
|
|
import injectService from 'ember-service/inject';
|
|
import set from 'ember-metal/set';
|
|
|
|
// ember-cli-shims doesn't export Error
|
|
const {Error: EmberError} = Ember;
|
|
|
|
export function feature(name, user = false) {
|
|
let watchedProps = user ? [`accessibility.${name}`] : [`config.${name}`, `labs.${name}`];
|
|
|
|
return computed.apply(Ember, watchedProps.concat({
|
|
get() {
|
|
if (user) {
|
|
return this.get(`accessibility.${name}`);
|
|
}
|
|
|
|
if (this.get(`config.${name}`)) {
|
|
return this.get(`config.${name}`);
|
|
}
|
|
|
|
return this.get(`labs.${name}`) || false;
|
|
},
|
|
set(key, value) {
|
|
this.update(key, value, user);
|
|
return value;
|
|
}
|
|
}));
|
|
}
|
|
|
|
export default Service.extend({
|
|
store: injectService(),
|
|
config: injectService(),
|
|
session: injectService(),
|
|
settings: injectService(),
|
|
notifications: injectService(),
|
|
|
|
publicAPI: feature('publicAPI'),
|
|
subscribers: feature('subscribers'),
|
|
nightShift: feature('nightShift', true),
|
|
|
|
_user: null,
|
|
|
|
labs: computed('settings.labs', function () {
|
|
let labs = this.get('settings.labs');
|
|
|
|
try {
|
|
return JSON.parse(labs) || {};
|
|
} catch (e) {
|
|
return {};
|
|
}
|
|
}),
|
|
|
|
accessibility: computed('_user.accessibility', function () {
|
|
let accessibility = this.get('_user.accessibility');
|
|
|
|
try {
|
|
return JSON.parse(accessibility) || {};
|
|
} catch (e) {
|
|
return {};
|
|
}
|
|
}),
|
|
|
|
fetch() {
|
|
return RSVP.hash({
|
|
settings: this.get('settings').fetch(),
|
|
user: this.get('session.user')
|
|
}).then(({user}) => {
|
|
this.set('_user', user);
|
|
|
|
return true;
|
|
});
|
|
},
|
|
|
|
update(key, value, user = false) {
|
|
let serviceProperty = user ? 'accessibility' : 'labs';
|
|
let model = this.get(user ? '_user' : 'settings');
|
|
let featureObject = this.get(serviceProperty);
|
|
|
|
// set the new key value for either the labs property or the accessibility property
|
|
set(featureObject, key, value);
|
|
|
|
// update the 'labs' or 'accessibility' key of the model
|
|
model.set(serviceProperty, JSON.stringify(featureObject));
|
|
|
|
return model.save().then(() => {
|
|
// return the labs key value that we get from the server
|
|
this.notifyPropertyChange(serviceProperty);
|
|
return this.get(`${serviceProperty}.${key}`);
|
|
|
|
}).catch((error) => {
|
|
model.rollbackAttributes();
|
|
this.notifyPropertyChange(serviceProperty);
|
|
|
|
// we'll always have an errors object unless we hit a
|
|
// validation error
|
|
if (!error) {
|
|
throw new EmberError(`Validation of the feature service ${user ? 'user' : 'settings'} model failed when updating ${serviceProperty}.`);
|
|
}
|
|
|
|
this.get('notifications').showAPIError(error);
|
|
|
|
return this.get(`${serviceProperty}.${key}`);
|
|
});
|
|
}
|
|
});
|