diff --git a/.changeset/sweet-eggs-joke.md b/.changeset/sweet-eggs-joke.md new file mode 100644 index 00000000000..1e3e2eaf238 --- /dev/null +++ b/.changeset/sweet-eggs-joke.md @@ -0,0 +1,5 @@ +--- +"@tryghost/adapter-base-scheduling": patch +--- + +Update dependency Sinon to v22.1.0 diff --git a/.github/scripts/i18n-review/eslint.config.mjs b/.github/scripts/i18n-review/eslint.config.mjs index f8a93cc5f78..9f500998f5a 100644 --- a/.github/scripts/i18n-review/eslint.config.mjs +++ b/.github/scripts/i18n-review/eslint.config.mjs @@ -27,6 +27,7 @@ export default defineConfig([ // ESLint 9 flipped the caughtErrors default to 'all'; keep unused // catch bindings tolerated, as the rest of the repo does. 'no-unused-vars': ['error', { caughtErrors: 'none' }], + 'prefer-const': ['error', { destructuring: 'all' }], }, }, ]); diff --git a/apps/admin-toolbar/src/index.js b/apps/admin-toolbar/src/index.js index bcc643cc01e..f391880ba02 100644 --- a/apps/admin-toolbar/src/index.js +++ b/apps/admin-toolbar/src/index.js @@ -12,8 +12,6 @@ const AUTH_FRAME_LOAD_TIMEOUT = 5000; function waitForFrameLoad(frame) { return new Promise((resolve, reject) => { - let timeout; - function cleanup() { window.clearTimeout(timeout); frame.removeEventListener('load', handleLoad); @@ -30,7 +28,7 @@ function waitForFrameLoad(frame) { reject(new Error('auth_frame_load_error')); } - timeout = window.setTimeout(() => { + const timeout = window.setTimeout(() => { cleanup(); reject(new Error('auth_frame_load_timeout')); }, AUTH_FRAME_LOAD_TIMEOUT); diff --git a/apps/announcement-bar/src/components/announcement-bar.jsx b/apps/announcement-bar/src/components/announcement-bar.jsx index 15dfe7e4251..043e45ecb32 100644 --- a/apps/announcement-bar/src/components/announcement-bar.jsx +++ b/apps/announcement-bar/src/components/announcement-bar.jsx @@ -29,7 +29,7 @@ export function AnnouncementBar({ settings = {} }) { return null; } - let className = 'gh-announcement-bar ' + settings.announcement_background; + const className = 'gh-announcement-bar ' + settings.announcement_background; return (
{ - let { announcement } = await api.announcementSettings.browse(); + const { announcement } = await api.announcementSettings.browse(); return announcement[0]; }; diff --git a/apps/ember-admin/app/adapters/api-key.js b/apps/ember-admin/app/adapters/api-key.js index ab8dbeb3464..9066b584359 100644 --- a/apps/ember-admin/app/adapters/api-key.js +++ b/apps/ember-admin/app/adapters/api-key.js @@ -6,7 +6,7 @@ export default class ApiKey extends ApplicationAdapter { return super.queryRecord(...arguments); } - let url = `${this.buildURL('users', 'me')}token/`; + const url = `${this.buildURL('users', 'me')}token/`; return this.ajax(url, 'GET', {data: {}}).then((data) => { return data; }); diff --git a/apps/ember-admin/app/adapters/base.js b/apps/ember-admin/app/adapters/base.js index 57a5dafd9ef..9696de0a952 100644 --- a/apps/ember-admin/app/adapters/base.js +++ b/apps/ember-admin/app/adapters/base.js @@ -33,8 +33,8 @@ export default RESTAdapter.extend(AjaxServiceSupport, { buildURL() { // Ensure trailing slashes - let url = this._super(...arguments); - let parsedUrl = new URL(url); + const url = this._super(...arguments); + const parsedUrl = new URL(url); if (!parsedUrl.pathname.endsWith('/')) { parsedUrl.pathname += '/'; diff --git a/apps/ember-admin/app/adapters/collection.js b/apps/ember-admin/app/adapters/collection.js index bcc31689729..f6440dc885d 100644 --- a/apps/ember-admin/app/adapters/collection.js +++ b/apps/ember-admin/app/adapters/collection.js @@ -3,7 +3,7 @@ import SlugUrl from 'ghost-admin/utils/slug-url'; export default class Tag extends ApplicationAdapter { buildURL(_modelName, _id, _snapshot, _requestType, query) { - let url = super.buildURL(...arguments); + const url = super.buildURL(...arguments); return SlugUrl(url, query); } diff --git a/apps/ember-admin/app/adapters/email.js b/apps/ember-admin/app/adapters/email.js index 0e26d9c786f..659d7b07cb0 100644 --- a/apps/ember-admin/app/adapters/email.js +++ b/apps/ember-admin/app/adapters/email.js @@ -2,7 +2,7 @@ import ApplicationAdapter from './application'; export default class Email extends ApplicationAdapter { retry(model) { - let url = `${this.buildURL('email', model.get('id'))}retry/`; + const url = `${this.buildURL('email', model.get('id'))}retry/`; return this.ajax(url, 'PUT', {data: {}}).then((data) => { this.store.pushPayload(data); diff --git a/apps/ember-admin/app/adapters/embedded-relation-adapter.js b/apps/ember-admin/app/adapters/embedded-relation-adapter.js index 2a4ef2e5fc0..0f6d093891a 100644 --- a/apps/ember-admin/app/adapters/embedded-relation-adapter.js +++ b/apps/ember-admin/app/adapters/embedded-relation-adapter.js @@ -24,13 +24,13 @@ export default class EmbeddedRelationAdapter extends BaseAdapter { } findAll(store, type, sinceToken) { - let query, url; + let query; if (sinceToken) { query = {since: sinceToken}; } - url = this.buildIncludeURL(store, type.modelName, null, null, 'findAll'); + const url = this.buildIncludeURL(store, type.modelName, null, null, 'findAll'); return this.ajax(url, 'GET', {data: query}); } @@ -137,7 +137,7 @@ export default class EmbeddedRelationAdapter extends BaseAdapter { } updateRecord(store, type, snapshot) { - let options = { + const options = { method: 'PUT', id: get(snapshot, 'id') }; @@ -149,9 +149,9 @@ export default class EmbeddedRelationAdapter extends BaseAdapter { } saveRecord(store, type, snapshot, options, requestType) { - let _options = options || {}; - let url = this.buildIncludeURL(store, type.modelName, _options.id, snapshot, requestType); - let payload = this.preparePayload(store, type, snapshot); + const _options = options || {}; + const url = this.buildIncludeURL(store, type.modelName, _options.id, snapshot, requestType); + const payload = this.preparePayload(store, type, snapshot); return this.ajax(url, _options.method, payload); } @@ -164,8 +164,8 @@ export default class EmbeddedRelationAdapter extends BaseAdapter { } preparePayload(store, type, snapshot) { - let serializer = store.serializerFor(type.modelName); - let payload = {}; + const serializer = store.serializerFor(type.modelName); + const payload = {}; serializer.serializeIntoHash(payload, type, snapshot); @@ -173,9 +173,9 @@ export default class EmbeddedRelationAdapter extends BaseAdapter { } buildIncludeURL(store, modelName, id, snapshot, requestType, query) { - let includes = this.getEmbeddedRelations(store, modelName); - let url = this.buildURL(modelName, id, snapshot, requestType, query); - let parsedUrl = new URL(url); + const includes = this.getEmbeddedRelations(store, modelName); + const url = this.buildURL(modelName, id, snapshot, requestType, query); + const parsedUrl = new URL(url); if (includes.length) { parsedUrl.searchParams.append('include', includes.map(underscore).join(',')); @@ -185,7 +185,7 @@ export default class EmbeddedRelationAdapter extends BaseAdapter { } buildQuery(store, modelName, options) { - let deDupe = {}; + const deDupe = {}; let toInclude = this.getEmbeddedRelations(store, modelName); let query = options || {}; @@ -215,9 +215,9 @@ export default class EmbeddedRelationAdapter extends BaseAdapter { } getEmbeddedRelations(store, modelName) { - let model = store.modelFor(modelName); - let ret = []; - let embedded = []; + const model = store.modelFor(modelName); + const ret = []; + const embedded = []; // Iterate through the model's relationships and build a list // of those that need to be pulled in via "include" from the API diff --git a/apps/ember-admin/app/adapters/label.js b/apps/ember-admin/app/adapters/label.js index e0d423a6159..e109095ad55 100644 --- a/apps/ember-admin/app/adapters/label.js +++ b/apps/ember-admin/app/adapters/label.js @@ -3,7 +3,7 @@ import SlugUrl from 'ghost-admin/utils/slug-url'; export default class Label extends ApplicationAdapter { buildURL(_modelName, _id, _snapshot, _requestType, query) { - let url = super.buildURL(...arguments); + const url = super.buildURL(...arguments); return SlugUrl(url, query); } diff --git a/apps/ember-admin/app/adapters/member.js b/apps/ember-admin/app/adapters/member.js index b9f5b6c1d31..b26f5bdc48b 100644 --- a/apps/ember-admin/app/adapters/member.js +++ b/apps/ember-admin/app/adapters/member.js @@ -3,9 +3,9 @@ import ApplicationAdapter from 'ghost-admin/adapters/application'; export default class Member extends ApplicationAdapter { queryRecord(store, type, query) { if (query && query.id) { - let {id} = query; + const {id} = query; delete query.id; - let url = this.buildURL(type.modelName, id, query, 'findRecord'); + const url = this.buildURL(type.modelName, id, query, 'findRecord'); return this.ajax(url, 'GET', {data: query}); } @@ -13,8 +13,8 @@ export default class Member extends ApplicationAdapter { } urlForDeleteRecord(id, modelName, snapshot) { - let url = super.urlForDeleteRecord(...arguments); - let parsedUrl = new URL(url); + const url = super.urlForDeleteRecord(...arguments); + const parsedUrl = new URL(url); if (snapshot && snapshot.adapterOptions && snapshot.adapterOptions.cancel) { parsedUrl.searchParams.set('cancel', 'true'); diff --git a/apps/ember-admin/app/adapters/setting.js b/apps/ember-admin/app/adapters/setting.js index 74137b46fc8..2b443cceff1 100644 --- a/apps/ember-admin/app/adapters/setting.js +++ b/apps/ember-admin/app/adapters/setting.js @@ -3,8 +3,8 @@ import {pluralize} from 'ember-inflector'; export default class Setting extends ApplicationAdapter { updateRecord(store, type, record) { - let data = {}; - let serializer = store.serializerFor(type.modelName); + const data = {}; + const serializer = store.serializerFor(type.modelName); // remove the fake id that we added onto the model. delete record.id; @@ -16,7 +16,7 @@ export default class Setting extends ApplicationAdapter { // Do not send empty data to the API // This can probably be removed then this is fixed: // https://github.com/TryGhost/Ghost/blob/main/ghost/api-framework/lib/validators/input/all.js#L128 - let root = pluralize(type.modelName); + const root = pluralize(type.modelName); if (data[root].length === 0) { return Promise.resolve(); } diff --git a/apps/ember-admin/app/adapters/tag.js b/apps/ember-admin/app/adapters/tag.js index bcc31689729..f6440dc885d 100644 --- a/apps/ember-admin/app/adapters/tag.js +++ b/apps/ember-admin/app/adapters/tag.js @@ -3,7 +3,7 @@ import SlugUrl from 'ghost-admin/utils/slug-url'; export default class Tag extends ApplicationAdapter { buildURL(_modelName, _id, _snapshot, _requestType, query) { - let url = super.buildURL(...arguments); + const url = super.buildURL(...arguments); return SlugUrl(url, query); } diff --git a/apps/ember-admin/app/adapters/theme.js b/apps/ember-admin/app/adapters/theme.js index 09f49ac261c..c56236771e5 100644 --- a/apps/ember-admin/app/adapters/theme.js +++ b/apps/ember-admin/app/adapters/theme.js @@ -2,7 +2,7 @@ import ApplicationAdapter from './application'; export default class Theme extends ApplicationAdapter { activate(model) { - let url = `${this.buildURL('theme', model.get('id'))}activate/`; + const url = `${this.buildURL('theme', model.get('id'))}activate/`; return this.ajax(url, 'PUT', {data: {}}).then((data) => { this.store.pushPayload(data); @@ -11,7 +11,7 @@ export default class Theme extends ApplicationAdapter { } active() { - let url = `${this.buildURL('theme', 'active')}`; + const url = `${this.buildURL('theme', 'active')}`; return this.ajax(url, 'GET', {data: {}}).then((data) => { this.store.pushPayload('theme', data); diff --git a/apps/ember-admin/app/adapters/tier.js b/apps/ember-admin/app/adapters/tier.js index c237aceda30..5b8e2850df8 100644 --- a/apps/ember-admin/app/adapters/tier.js +++ b/apps/ember-admin/app/adapters/tier.js @@ -3,9 +3,9 @@ import ApplicationAdapter from 'ghost-admin/adapters/application'; export default class Tier extends ApplicationAdapter { queryRecord(store, type, query) { if (query && query.id) { - let {id} = query; + const {id} = query; delete query.id; - let url = this.buildURL(type.modelName, id, query, 'findRecord'); + const url = this.buildURL(type.modelName, id, query, 'findRecord'); return this.ajax(url, 'GET', {data: query}); } @@ -13,8 +13,8 @@ export default class Tier extends ApplicationAdapter { } urlForDeleteRecord() { - let url = super.urlForDeleteRecord(...arguments); - let parsedUrl = new URL(url); + const url = super.urlForDeleteRecord(...arguments); + const parsedUrl = new URL(url); return parsedUrl.toString(); } diff --git a/apps/ember-admin/app/adapters/user.js b/apps/ember-admin/app/adapters/user.js index 3d3bc4e2413..326a3f3b8f9 100644 --- a/apps/ember-admin/app/adapters/user.js +++ b/apps/ember-admin/app/adapters/user.js @@ -3,7 +3,7 @@ import SlugUrl from 'ghost-admin/utils/slug-url'; export default class User extends ApplicationAdapter { buildURL(_modelName, _id, _snapshot, _requestType, query) { - let url = super.buildURL(...arguments); + const url = super.buildURL(...arguments); return SlugUrl(url, query); } @@ -13,7 +13,7 @@ export default class User extends ApplicationAdapter { return super.queryRecord(...arguments); } - let url = this.buildURL(type.modelName, 'me', null, 'findRecord'); + const url = this.buildURL(type.modelName, 'me', null, 'findRecord'); return this.ajax(url, 'GET', {data: {include: 'roles'}}); } diff --git a/apps/ember-admin/app/app.js b/apps/ember-admin/app/app.js index 7d305d71101..9a8a2f8f8bc 100755 --- a/apps/ember-admin/app/app.js +++ b/apps/ember-admin/app/app.js @@ -35,7 +35,7 @@ const App = Application.extend({ // TODO: remove once the validations refactor is complete registerWarnHandler((message, options, next) => { - let skip = [ + const skip = [ 'ds.errors.add', 'ds.errors.remove', 'ds.errors.clear' diff --git a/apps/ember-admin/app/components/editor/modals/preview/email.js b/apps/ember-admin/app/components/editor/modals/preview/email.js index 6e7cdefa187..d686ca38707 100644 --- a/apps/ember-admin/app/components/editor/modals/preview/email.js +++ b/apps/ember-admin/app/components/editor/modals/preview/email.js @@ -138,7 +138,7 @@ export default class ModalPostPreviewEmailComponent extends Component { async _fetchEmailData() { let {html, subject, newsletter} = this; - let {post} = this.args; + const {post} = this.args; const {memberStatus, memberTier} = this.args; if (html && subject && memberStatus === this._lastMemberStatus && memberTier === this._lastMemberTier && newsletter.slug === this._lastNewsletterSlug) { @@ -159,23 +159,23 @@ export default class ModalPostPreviewEmailComponent extends Component { subject = post.email.subject; // model is a post, fetch email preview } else { - let url = new URL(this.ghostPaths.url.api('/email_previews/posts', post.id), window.location.href); + const url = new URL(this.ghostPaths.url.api('/email_previews/posts', post.id), window.location.href); for (const [param, value] of Object.entries(this._audienceParams)) { url.searchParams.set(param, value); } url.searchParams.set('newsletter', this.newsletter.slug); - let response = await this.ajax.request(url.href); - let [emailPreview] = response.email_previews; + const response = await this.ajax.request(url.href); + const [emailPreview] = response.email_previews; html = emailPreview.html; subject = emailPreview.subject; } // inject extra CSS so the preview behaves consistently inside the iframe - let domParser = new DOMParser(); - let htmlDoc = domParser.parseFromString(html, 'text/html'); - let stylesheet = htmlDoc.querySelector('style'); - let originalCss = stylesheet.innerHTML; + const domParser = new DOMParser(); + const htmlDoc = domParser.parseFromString(html, 'text/html'); + const stylesheet = htmlDoc.querySelector('style'); + const originalCss = stylesheet.innerHTML; stylesheet.innerHTML = `${originalCss}\n\n${INJECTED_CSS}`; const doctype = new XMLSerializer().serializeToString(htmlDoc.doctype); diff --git a/apps/ember-admin/app/components/editor/modals/preview/email/email-subject.js b/apps/ember-admin/app/components/editor/modals/preview/email/email-subject.js index d81705c4375..ac4c1070704 100644 --- a/apps/ember-admin/app/components/editor/modals/preview/email/email-subject.js +++ b/apps/ember-admin/app/components/editor/modals/preview/email/email-subject.js @@ -17,9 +17,9 @@ export default class EmailSubject extends Component { } // Grab the post and current stored email subject - let emailSubject = event.target.value; - let post = this.args.post; - let currentEmailSubject = post.get('emailSubject'); + const emailSubject = event.target.value; + const post = this.args.post; + const currentEmailSubject = post.get('emailSubject'); // If the subject entered matches the stored email subject, do nothing if (currentEmailSubject === emailSubject) { diff --git a/apps/ember-admin/app/components/editor/modals/re-authenticate.js b/apps/ember-admin/app/components/editor/modals/re-authenticate.js index dabb1d9d966..d1a2a4aad29 100644 --- a/apps/ember-admin/app/components/editor/modals/re-authenticate.js +++ b/apps/ember-admin/app/components/editor/modals/re-authenticate.js @@ -70,7 +70,7 @@ export default class ReAuthenticateModal extends Component { } if (isTwoFactorTokenRequiredError(error)) { - let errorCode = error.payload?.errors[0]?.code; + const errorCode = error.payload?.errors[0]?.code; // login was successful, but 2FA verification is required this.session.set('errorCode', errorCode); yield this.modals.open('editor/modals/re-verify'); diff --git a/apps/ember-admin/app/components/gh-cm-editor.js b/apps/ember-admin/app/components/gh-cm-editor.js index 80d05088923..85770d8e4f6 100644 --- a/apps/ember-admin/app/components/gh-cm-editor.js +++ b/apps/ember-admin/app/components/gh-cm-editor.js @@ -61,7 +61,7 @@ class CmEditorComponent extends Component { // an error that occurs if codemirror hasn't finished loading before // the component is destroyed. if (this._editor) { - let editor = this._editor.getWrapperElement(); + const editor = this._editor.getWrapperElement(); editor.parentNode.removeChild(editor); this._editor = null; } @@ -73,7 +73,7 @@ class CmEditorComponent extends Component { } @task(function* () { - let loader = this.lazyLoader; + const loader = this.lazyLoader; yield loader.loadScript('codemirror', 'assets/codemirror/codemirror.js'); scheduleOnce('afterRender', this, this._initCodeMirror); @@ -81,10 +81,10 @@ class CmEditorComponent extends Component { initCodeMirror; _initCodeMirror() { - let options = this.getProperties('lineNumbers', 'lineWrapping', 'indentUnit', 'mode', 'theme', 'autofocus'); + const options = this.getProperties('lineNumbers', 'lineWrapping', 'indentUnit', 'mode', 'theme', 'autofocus'); assign(options, {value: this._value}); - let textarea = this.element.querySelector('textarea'); + const textarea = this.element.querySelector('textarea'); if (textarea && textarea === document.activeElement) { options.autofocus = true; } @@ -104,7 +104,7 @@ class CmEditorComponent extends Component { } _setupCodeMirrorEventHandler(event, target, method) { - let callback = bind(target, method); + const callback = bind(target, method); this._editor.on(event, callback); diff --git a/apps/ember-admin/app/components/gh-context-menu.js b/apps/ember-admin/app/components/gh-context-menu.js index 69f8c077e68..3bbeed12447 100644 --- a/apps/ember-admin/app/components/gh-context-menu.js +++ b/apps/ember-admin/app/components/gh-context-menu.js @@ -179,7 +179,7 @@ export default class GhContextMenu extends Component { @task *confirmWrapperTask(...args) { this.setState('loading'); - let result = yield this.#originalConfirm.perform(...args); + const result = yield this.#originalConfirm.perform(...args); this.#originalConfirm = null; this.setState('default'); return result; diff --git a/apps/ember-admin/app/components/gh-date-time-picker.js b/apps/ember-admin/app/components/gh-date-time-picker.js index 54d47e015c8..09728ca118f 100644 --- a/apps/ember-admin/app/components/gh-date-time-picker.js +++ b/apps/ember-admin/app/components/gh-date-time-picker.js @@ -61,7 +61,7 @@ export default class GhDateTimePicker extends Component { @computed('blogTimezone') get timezone() { - let blogTimezone = this.blogTimezone; + const blogTimezone = this.blogTimezone; return moment.utc().tz(blogTimezone).format('z'); } @@ -71,8 +71,8 @@ export default class GhDateTimePicker extends Component { return this._scratchDateError; } - let errors = this.errors; - let property = this.dateErrorProperty; + const errors = this.errors; + const property = this.dateErrorProperty; if (errors && !isEmpty(errors.errorsFor(property))) { return errors.errorsFor(property).get('firstObject').message; @@ -83,8 +83,8 @@ export default class GhDateTimePicker extends Component { @computed('errors.[]', 'timeErrorProperty') get timeError() { - let errors = this.errors; - let property = this.timeErrorProperty; + const errors = this.errors; + const property = this.timeErrorProperty; if (errors && !isEmpty(errors.errorsFor(property))) { return errors.errorsFor(property).get('firstObject').message; @@ -96,11 +96,11 @@ export default class GhDateTimePicker extends Component { didReceiveAttrs() { super.didReceiveAttrs(...arguments); - let date = this.date; - let time = this.time; - let minDate = this.minDate; - let maxDate = this.maxDate; - let blogTimezone = this.blogTimezone; + const date = this.date; + const time = this.time; + const minDate = this.minDate; + const maxDate = this.maxDate; + const blogTimezone = this.blogTimezone; if (!isBlank(date)) { // Note: input date as a string is expected to be in the blog's timezone @@ -206,7 +206,7 @@ export default class GhDateTimePicker extends Component { @action onDateInput(datepicker, event) { - let skipFocus = true; + const skipFocus = true; datepicker.actions.close(event, skipFocus); this.set('_scratchDate', event.target.value); } @@ -260,7 +260,7 @@ export default class GhDateTimePicker extends Component { // capture a Ctrl/Cmd+S combo to make sure that the model value is updated // before the save occurs or we abort the save if the value is invalid if (event.key === 's' && (event.ctrlKey || event.metaKey)) { - let wasValid = this._setDate(event.target.value); + const wasValid = this._setDate(event.target.value); if (!wasValid) { event.stopImmediatePropagation(); event.preventDefault(); @@ -281,7 +281,7 @@ export default class GhDateTimePicker extends Component { return false; } - let date = moment.tz(dateStr, DATE_FORMAT, this.blogTimezone); + const date = moment.tz(dateStr, DATE_FORMAT, this.blogTimezone); if (!date.isValid()) { this._setScratchDateError('Invalid date'); return false; diff --git a/apps/ember-admin/app/components/gh-dropdown.js b/apps/ember-admin/app/components/gh-dropdown.js index 95473894211..980add157c6 100644 --- a/apps/ember-admin/app/components/gh-dropdown.js +++ b/apps/ember-admin/app/components/gh-dropdown.js @@ -32,7 +32,7 @@ export default class GhDropdown extends Component.extend(DropdownMixin) { didInsertElement() { super.didInsertElement(...arguments); - let dropdownService = this.dropdown; + const dropdownService = this.dropdown; dropdownService.on('close', this, this.close); dropdownService.on('toggle', this, this.toggle); @@ -50,7 +50,7 @@ export default class GhDropdown extends Component.extend(DropdownMixin) { willDestroyElement() { super.willDestroyElement(...arguments); - let dropdownService = this.dropdown; + const dropdownService = this.dropdown; dropdownService.off('close', this, this.close); dropdownService.off('toggle', this, this.toggle); @@ -72,10 +72,10 @@ export default class GhDropdown extends Component.extend(DropdownMixin) { // Called by the dropdown service when any dropdown button is clicked. toggle(options) { - let isClosing = this.closing; - let isOpen = this.isOpen; - let name = this.name; - let targetDropdownName = options.target; + const isClosing = this.closing; + const isOpen = this.isOpen; + const name = this.name; + const targetDropdownName = options.target; let button = this.button; if (name === targetDropdownName && (!isOpen || isClosing)) { diff --git a/apps/ember-admin/app/components/gh-editor-feature-image.js b/apps/ember-admin/app/components/gh-editor-feature-image.js index a8a3897a968..2991f88fb2a 100644 --- a/apps/ember-admin/app/components/gh-editor-feature-image.js +++ b/apps/ember-admin/app/components/gh-editor-feature-image.js @@ -118,7 +118,7 @@ export default class GhEditorFeatureImageComponent extends Component { // this is needed to work around inconsistencies with dropping files // from Chrome's downloads bar if (navigator.userAgent.indexOf('Chrome') > -1) { - let eA = event.dataTransfer.effectAllowed; + const eA = event.dataTransfer.effectAllowed; event.dataTransfer.dropEffect = (eA === 'move' || eA === 'linkMove') ? 'move' : 'copy'; } diff --git a/apps/ember-admin/app/components/gh-editor.js b/apps/ember-admin/app/components/gh-editor.js index 114812e1bc0..ce394ac2c9e 100644 --- a/apps/ember-admin/app/components/gh-editor.js +++ b/apps/ember-admin/app/components/gh-editor.js @@ -36,7 +36,7 @@ export default class GhEditor extends Component { uploadImages(fileList, resetInput) { // convert FileList to an array so that resetting the input doesn't // clear the file references before upload actions can be triggered - let files = Array.from(fileList); + const files = Array.from(fileList); this.set('droppedFiles', files); resetInput(); } @@ -54,7 +54,7 @@ export default class GhEditor extends Component { _setHeaderHeight() { if (this.headerClass && this._editorTitleElement) { - let height = this._editorTitleElement.offsetHeight; + const height = this._editorTitleElement.offsetHeight; return this.set('headerHeight', height); } @@ -70,7 +70,7 @@ export default class GhEditor extends Component { // this is needed to work around inconsistencies with dropping files // from Chrome's downloads bar if (navigator.userAgent.indexOf('Chrome') > -1) { - let eA = event.dataTransfer.effectAllowed; + const eA = event.dataTransfer.effectAllowed; event.dataTransfer.dropEffect = (eA === 'move' || eA === 'linkMove') ? 'move' : 'copy'; } diff --git a/apps/ember-admin/app/components/gh-error-message.js b/apps/ember-admin/app/components/gh-error-message.js index 3b3c4fd7f38..17403b499fc 100644 --- a/apps/ember-admin/app/components/gh-error-message.js +++ b/apps/ember-admin/app/components/gh-error-message.js @@ -11,8 +11,8 @@ import {isEmpty} from '@ember/utils'; */ export default class GhErrorMessage extends Component { get message() { - let {property, errors} = this.args; - let messages = []; + const {property, errors} = this.args; + const messages = []; let index; if (!isEmpty(errors) && errors.get(property)) { diff --git a/apps/ember-admin/app/components/gh-fullscreen-modal.js b/apps/ember-admin/app/components/gh-fullscreen-modal.js index 356854740a3..1a0fcbe4b12 100644 --- a/apps/ember-admin/app/components/gh-fullscreen-modal.js +++ b/apps/ember-admin/app/components/gh-fullscreen-modal.js @@ -17,13 +17,13 @@ const FullScreenModalComponent = Component.extend({ }), modalClasses: computed('modifier', function () { - let modalClass = 'fullscreen-modal'; - let modifiers = (this.modifier || '').split(' '); - let modalClasses = emberA([modalClass]); + const modalClass = 'fullscreen-modal'; + const modifiers = (this.modifier || '').split(' '); + const modalClasses = emberA([modalClass]); modifiers.forEach((modifier) => { if (!isBlank(modifier)) { - let className = `${modalClass}-${modifier}`; + const className = `${modalClass}-${modifier}`; modalClasses.push(className); } }); diff --git a/apps/ember-admin/app/components/gh-image-uploader.js b/apps/ember-admin/app/components/gh-image-uploader.js index 6da150ecfe6..b796eaf6693 100644 --- a/apps/ember-admin/app/components/gh-image-uploader.js +++ b/apps/ember-admin/app/components/gh-image-uploader.js @@ -70,8 +70,8 @@ export default Component.extend({ // TODO: this wouldn't be necessary if the server could accept direct // file uploads formData: computed('file', function () { - let file = this.file; - let formData = new FormData(); + const file = this.file; + const formData = new FormData(); formData.append(this.paramName, file); @@ -83,13 +83,13 @@ export default Component.extend({ }), description: computed('text', 'altText', function () { - let altText = this.altText; + const altText = this.altText; return this.text || (altText ? `Upload image of "${altText}"` : 'Upload an image'); }), progressStyle: computed('uploadPercentage', function () { - let percentage = this.uploadPercentage; + const percentage = this.uploadPercentage; let width = ''; if (percentage > 0) { @@ -121,7 +121,7 @@ export default Component.extend({ didReceiveAttrs() { this._super(...arguments); - let image = this.image; + const image = this.image; this.set('url', image); }, @@ -129,8 +129,8 @@ export default Component.extend({ fileSelected(fileList, resetInput) { // can't use array destructuring here as FileList is not a strict // array and fails in Safari - let file = fileList[0]; - let validationResult = this._validate(file); + const file = fileList[0]; + const validationResult = this._validate(file); this.set('file', file); this.fileSelected(file); @@ -163,7 +163,7 @@ export default Component.extend({ }, saveUrl() { - let url = this.url; + const url = this.url; this.update(url); } }, @@ -176,7 +176,7 @@ export default Component.extend({ // this is needed to work around inconsistencies with dropping files // from Chrome's downloads bar if (navigator.userAgent.indexOf('Chrome') > -1) { - let eA = event.dataTransfer.effectAllowed; + const eA = event.dataTransfer.effectAllowed; event.dataTransfer.dropEffect = (eA === 'move' || eA === 'linkMove') ? 'move' : 'copy'; } @@ -204,7 +204,7 @@ export default Component.extend({ _uploadProgress(event) { if (event.lengthComputable) { run(() => { - let percentage = Math.round((event.loaded / event.total) * 100); + const percentage = Math.round((event.loaded / event.total) * 100); if (!this.isDestroyed && !this.isDestroying) { this.set('uploadPercentage', percentage); } @@ -225,7 +225,7 @@ export default Component.extend({ } if (uploadResponse) { - let resource = get(uploadResponse, this.resourceName); + const resource = get(uploadResponse, this.resourceName); if (resource && isArray(resource) && resource[0]) { responseUrl = get(resource[0], 'url'); } @@ -263,11 +263,11 @@ export default Component.extend({ }, generateRequest() { - let ajax = this.ajax; - let formData = this.formData; - let uploadUrl = this.uploadUrl; + const ajax = this.ajax; + const formData = this.formData; + const uploadUrl = this.uploadUrl; // CASE: we want to upload an icon and we have to POST it to a different endpoint, expecially for icons - let url = `${ghostPaths().apiRoot}${uploadUrl}`; + const url = `${ghostPaths().apiRoot}${uploadUrl}`; this.uploadStarted(); @@ -277,7 +277,7 @@ export default Component.extend({ contentType: false, dataType: 'text', xhr: () => { - let xhr = new window.XMLHttpRequest(); + const xhr = new window.XMLHttpRequest(); xhr.upload.addEventListener('progress', (event) => { this._uploadProgress(event); @@ -304,7 +304,7 @@ export default Component.extend({ _defaultValidator(file) { let extensions = this.extensions; - let [, extension] = (/(?:\.([^.]+))?$/).exec(file.name); + const [, extension] = (/(?:\.([^.]+))?$/).exec(file.name); if (!isArray(extensions)) { extensions = extensions.split(','); diff --git a/apps/ember-admin/app/components/gh-input-with-select/index.js b/apps/ember-admin/app/components/gh-input-with-select/index.js index 024c036ffaf..8c97ec7bb17 100644 --- a/apps/ember-admin/app/components/gh-input-with-select/index.js +++ b/apps/ember-admin/app/components/gh-input-with-select/index.js @@ -39,7 +39,7 @@ export default class GhInputWithSelectComponent extends Component { return newOptions; } - let searchAction = this.args.search; + const searchAction = this.args.search; if (searchAction) { return resolve(searchAction(term, select)).then((results) => { if (results.toArray) { diff --git a/apps/ember-admin/app/components/gh-input-with-select/trigger.js b/apps/ember-admin/app/components/gh-input-with-select/trigger.js index 6ba455c4688..c8d2be5cc5a 100644 --- a/apps/ember-admin/app/components/gh-input-with-select/trigger.js +++ b/apps/ember-admin/app/components/gh-input-with-select/trigger.js @@ -34,7 +34,7 @@ export default class GhSearchInputTrigger extends Component { @action handleInput(event) { - let term = event.target.value; + const term = event.target.value; // open dropdown if not open and term is present // close dropdown if open and term is blank diff --git a/apps/ember-admin/app/components/gh-koenig-editor-lexical.js b/apps/ember-admin/app/components/gh-koenig-editor-lexical.js index 6df6311644f..b00901bff24 100644 --- a/apps/ember-admin/app/components/gh-koenig-editor-lexical.js +++ b/apps/ember-admin/app/components/gh-koenig-editor-lexical.js @@ -247,8 +247,8 @@ export default class GhKoenigEditorLexical extends Component { // In the future, we'd like to use `focusKoenigEditorOnBottomClick` // from `admin-x-framework`, but we can't import it without more // changes. - let editorCanvas = this.editorAPI.editorInstance.getRootElement(); - let {bottom} = editorCanvas.getBoundingClientRect(); + const editorCanvas = this.editorAPI.editorInstance.getRootElement(); + const {bottom} = editorCanvas.getBoundingClientRect(); // if a mousedown and subsequent mouseup occurs below the editor // canvas, focus the editor and put the cursor at the end of the document diff --git a/apps/ember-admin/app/components/gh-member-avatar.js b/apps/ember-admin/app/components/gh-member-avatar.js index 8bca6534d2a..0be3c98fb62 100644 --- a/apps/ember-admin/app/components/gh-member-avatar.js +++ b/apps/ember-admin/app/components/gh-member-avatar.js @@ -13,20 +13,20 @@ const stringToHslColor = function (str, saturation, lightness) { export default class GhMemberAvatarComponent extends Component { get memberName() { - let {member, name} = this.args; + const {member, name} = this.args; return member?.name || member?.email || name || 'NM'; } get avatarImage() { - let {member} = this.args; + const {member} = this.args; // to cover both ways avatar image is returned depending on where member data comes from return member?.avatar_image || member?.avatarImage || null; } get backgroundStyle() { - let color = stringToHslColor(this.memberName, 45, 55); + const color = stringToHslColor(this.memberName, 45, 55); return htmlSafe(`background-color: ${color}`); } @@ -35,8 +35,8 @@ export default class GhMemberAvatarComponent extends Component { return 'NM'; } - let names = this.memberName.split(' '); - let intials = names.length > 1 ? [names[0][0], names[names.length - 1][0]] : [names[0][0]]; + const names = this.memberName.split(' '); + const intials = names.length > 1 ? [names[0][0], names[names.length - 1][0]] : [names[0][0]]; return intials.join('').toUpperCase(); } } diff --git a/apps/ember-admin/app/components/gh-post-settings-menu.js b/apps/ember-admin/app/components/gh-post-settings-menu.js index 6734fb534fd..12d56a91544 100644 --- a/apps/ember-admin/app/components/gh-post-settings-menu.js +++ b/apps/ember-admin/app/components/gh-post-settings-menu.js @@ -176,8 +176,8 @@ export default class GhPostSettingsMenu extends Component { willDestroyElement() { super.willDestroyElement(...arguments); - let post = this.post; - let errors = post.get('errors'); + const post = this.post; + const errors = post.get('errors'); // reset the publish date if it has an error if (errors.has('publishedAtBlogDate') || errors.has('publishedAtBlogTime')) { @@ -263,8 +263,8 @@ export default class GhPostSettingsMenu extends Component { @action setPublishedAtBlogDate(date) { // date is a Date object that contains the correct date string in the blog timezone - let post = this.post; - let dateString = moment.tz(date, this.settings.get('timezone')).format('YYYY-MM-DD'); + const post = this.post; + const dateString = moment.tz(date, this.settings.get('timezone')).format('YYYY-MM-DD'); post.get('errors').remove('publishedAtBlogDate'); @@ -297,7 +297,7 @@ export default class GhPostSettingsMenu extends Component { @action setPublishedAtBlogTime(time) { - let post = this.post; + const post = this.post; post.get('errors').remove('publishedAtBlogDate'); @@ -311,8 +311,8 @@ export default class GhPostSettingsMenu extends Component { @action setCustomExcerpt(excerpt) { - let post = this.post; - let currentExcerpt = post.get('customExcerpt'); + const post = this.post; + const currentExcerpt = post.get('customExcerpt'); if (excerpt === currentExcerpt) { return; @@ -325,8 +325,8 @@ export default class GhPostSettingsMenu extends Component { @action setHeaderInjection(code) { - let post = this.post; - let currentCode = post.get('codeinjectionHead'); + const post = this.post; + const currentCode = post.get('codeinjectionHead'); if (code === currentCode) { return; @@ -339,8 +339,8 @@ export default class GhPostSettingsMenu extends Component { @action setFooterInjection(code) { - let post = this.post; - let currentCode = post.get('codeinjectionFoot'); + const post = this.post; + const currentCode = post.get('codeinjectionFoot'); if (code === currentCode) { return; @@ -354,8 +354,8 @@ export default class GhPostSettingsMenu extends Component { @action setMetaTitle(metaTitle) { // Grab the post and current stored meta title - let post = this.post; - let currentTitle = post.get('metaTitle'); + const post = this.post; + const currentTitle = post.get('metaTitle'); // If the title entered matches the stored meta title, do nothing if (currentTitle === metaTitle) { @@ -378,8 +378,8 @@ export default class GhPostSettingsMenu extends Component { @action setMetaDescription(metaDescription) { // Grab the post and current stored meta description - let post = this.post; - let currentDescription = post.get('metaDescription'); + const post = this.post; + const currentDescription = post.get('metaDescription'); // If the title entered matches the stored meta title, do nothing if (currentDescription === metaDescription) { @@ -402,8 +402,8 @@ export default class GhPostSettingsMenu extends Component { @action setCanonicalUrl(value) { // Grab the post and current stored meta description - let post = this.post; - let currentCanonicalUrl = post.canonicalUrl; + const post = this.post; + const currentCanonicalUrl = post.canonicalUrl; // If the value entered matches the stored value, do nothing if (currentCanonicalUrl === value) { @@ -426,8 +426,8 @@ export default class GhPostSettingsMenu extends Component { @action setOgTitle(ogTitle) { // Grab the post and current stored facebook title - let post = this.post; - let currentTitle = post.get('ogTitle'); + const post = this.post; + const currentTitle = post.get('ogTitle'); // If the title entered matches the stored facebook title, do nothing if (currentTitle === ogTitle) { @@ -450,8 +450,8 @@ export default class GhPostSettingsMenu extends Component { @action setOgDescription(ogDescription) { // Grab the post and current stored facebook description - let post = this.post; - let currentDescription = post.get('ogDescription'); + const post = this.post; + const currentDescription = post.get('ogDescription'); // If the title entered matches the stored facebook description, do nothing if (currentDescription === ogDescription) { @@ -474,8 +474,8 @@ export default class GhPostSettingsMenu extends Component { @action setTwitterTitle(twitterTitle) { // Grab the post and current stored twitter title - let post = this.post; - let currentTitle = post.get('twitterTitle'); + const post = this.post; + const currentTitle = post.get('twitterTitle'); // If the title entered matches the stored twitter title, do nothing if (currentTitle === twitterTitle) { @@ -498,8 +498,8 @@ export default class GhPostSettingsMenu extends Component { @action setTwitterDescription(twitterDescription) { // Grab the post and current stored twitter description - let post = this.post; - let currentDescription = post.get('twitterDescription'); + const post = this.post; + const currentDescription = post.get('twitterDescription'); // If the description entered matches the stored twitter description, do nothing if (currentDescription === twitterDescription) { @@ -605,7 +605,7 @@ export default class GhPostSettingsMenu extends Component { @action changeAuthors(newAuthors) { - let post = this.post; + const post = this.post; // return if nothing changed if (newAuthors.mapBy('id').join() === post.get('authors').mapBy('id').join()) { diff --git a/apps/ember-admin/app/components/gh-post-settings-menu/visibility-segment-select.js b/apps/ember-admin/app/components/gh-post-settings-menu/visibility-segment-select.js index 9c2ef46bfae..9eb6d227b24 100644 --- a/apps/ember-admin/app/components/gh-post-settings-menu/visibility-segment-select.js +++ b/apps/ember-admin/app/components/gh-post-settings-menu/visibility-segment-select.js @@ -53,8 +53,8 @@ export default class VisibilitySegmentSelect extends Component { @action setSegment(options) { - let ids = options.mapBy('id').map((id) => { - let tier = this.tiers.find((p) => { + const ids = options.mapBy('id').map((id) => { + const tier = this.tiers.find((p) => { return p.id === id; }); return { diff --git a/apps/ember-admin/app/components/gh-progress-bar.js b/apps/ember-admin/app/components/gh-progress-bar.js index 90382cd34d2..a3867fa3377 100644 --- a/apps/ember-admin/app/components/gh-progress-bar.js +++ b/apps/ember-admin/app/components/gh-progress-bar.js @@ -17,8 +17,8 @@ export default class GhProgressBar extends Component { didReceiveAttrs() { super.didReceiveAttrs(...arguments); - let percentage = this.percentage; - let width = (percentage > 0) ? `${percentage}%` : '0'; + const percentage = this.percentage; + const width = (percentage > 0) ? `${percentage}%` : '0'; this.set('progressStyle', htmlSafe(`width: ${width}`)); } diff --git a/apps/ember-admin/app/components/gh-psm-template-select.js b/apps/ember-admin/app/components/gh-psm-template-select.js index 5bec64c7ec3..c81932deda6 100644 --- a/apps/ember-admin/app/components/gh-psm-template-select.js +++ b/apps/ember-admin/app/components/gh-psm-template-select.js @@ -22,8 +22,8 @@ export default class GhPsmTemplateSelect extends Component { // computed properties @computed('activeTheme.customTemplates.[]') get customTemplates() { - let templates = this.get('activeTheme.customTemplates') || []; - let defaultTemplate = { + const templates = this.get('activeTheme.customTemplates') || []; + const defaultTemplate = { filename: '', name: 'Default' }; @@ -33,10 +33,10 @@ export default class GhPsmTemplateSelect extends Component { @computed('post.{page,slug}', 'activeTheme.slugTemplates.[]') get matchedSlugTemplate() { - let slug = this.get('post.slug'); - let type = this.post.constructor.modelName; + const slug = this.get('post.slug'); + const type = this.post.constructor.modelName; - let [matchedTemplate] = this.get('activeTheme.slugTemplates').filter(function (template) { + const [matchedTemplate] = this.get('activeTheme.slugTemplates').filter(function (template) { return template.for.includes(type) && template.slug === slug; }); @@ -45,8 +45,8 @@ export default class GhPsmTemplateSelect extends Component { @computed('post.customTemplate', 'customTemplates.[]') get selectedTemplate() { - let templates = this.customTemplates; - let filename = this.get('post.customTemplate'); + const templates = this.customTemplates; + const filename = this.get('post.customTemplate'); return templates.findBy('filename', filename); } @@ -64,14 +64,14 @@ export default class GhPsmTemplateSelect extends Component { // tasks @task(function* () { - let store = this.store; + const store = this.store; let themes = yield store.peekAll('theme'); if (isEmpty(themes)) { themes = yield store.findAll('theme'); } - let activeTheme = themes.filterBy('active', true).get('firstObject'); + const activeTheme = themes.filterBy('active', true).get('firstObject'); this.set('activeTheme', activeTheme); }) diff --git a/apps/ember-admin/app/components/gh-scroll-trigger.js b/apps/ember-admin/app/components/gh-scroll-trigger.js index e9287750288..935720dea5f 100644 --- a/apps/ember-admin/app/components/gh-scroll-trigger.js +++ b/apps/ember-admin/app/components/gh-scroll-trigger.js @@ -21,13 +21,13 @@ export default class GhScrollTrigger extends Component { }; } - let options = { + const options = { viewportSpy: true, viewportTolerance, scrollableArea: this.args.scrollable || getScrollParent(element) }; - let {onEnter, onExit} = this.inViewport.watchElement(element, options); + const {onEnter, onExit} = this.inViewport.watchElement(element, options); onEnter(this.didEnterViewport.bind(this)); onExit(this.didExitViewport.bind(this)); diff --git a/apps/ember-admin/app/components/gh-search-input.js b/apps/ember-admin/app/components/gh-search-input.js index 0fc099ce561..eb641b6f5f2 100644 --- a/apps/ember-admin/app/components/gh-search-input.js +++ b/apps/ember-admin/app/components/gh-search-input.js @@ -38,22 +38,22 @@ export default class GhSearchInputComponent extends Component { } if (selected.groupName === 'Posts') { - let id = selected.id.replace('post.', ''); + const id = selected.id.replace('post.', ''); this.router.transitionTo('lexical-editor.edit', 'post', id); } if (selected.groupName === 'Pages') { - let id = selected.id.replace('page.', ''); + const id = selected.id.replace('page.', ''); this.router.transitionTo('lexical-editor.edit', 'page', id); } if (selected.groupName === 'Staff') { - let id = selected.id.replace('user.', ''); + const id = selected.id.replace('user.', ''); this.router.transitionTo(`/settings/staff/${id}`); } if (selected.groupName === 'Tags') { - let id = selected.id.replace('tag.', ''); + const id = selected.id.replace('tag.', ''); this.router.transitionTo('tag', id); } } diff --git a/apps/ember-admin/app/components/gh-skip-link.js b/apps/ember-admin/app/components/gh-skip-link.js index 04e8efe9fc0..f0ff3e90b79 100644 --- a/apps/ember-admin/app/components/gh-skip-link.js +++ b/apps/ember-admin/app/components/gh-skip-link.js @@ -14,14 +14,14 @@ export default Component.extend({ href: htmlSafe('javascript:;'), click() { - let el = document.querySelector(this.anchor); + const el = document.querySelector(this.anchor); if (el) { // Scrolls to the top of main content or whatever // is passed to the anchor attribute document.body.scrollTop = el.getBoundingClientRect().top; - let removeTabindex = function () { + const removeTabindex = function () { el.removeAttribute('tabindex'); }; diff --git a/apps/ember-admin/app/components/gh-tags-token-input.js b/apps/ember-admin/app/components/gh-tags-token-input.js index 73ee186915b..f20a4eeb8e3 100644 --- a/apps/ember-admin/app/components/gh-tags-token-input.js +++ b/apps/ember-admin/app/components/gh-tags-token-input.js @@ -48,7 +48,7 @@ export default class GhTagsTokenInput extends Component { @action updateTags(newTags) { - let currentTags = this.args.selected || []; + const currentTags = this.args.selected || []; // destroy new+unsaved tags that are no longer selected currentTags.forEach(function (tag) { @@ -65,8 +65,8 @@ export default class GhTagsTokenInput extends Component { @action createTag(tagNameAttr) { - let currentTags = this.args.selected || []; - let currentTagNames = currentTags.map(tag => tag.get('name').toLowerCase()); + const currentTags = this.args.selected || []; + const currentTagNames = currentTags.map(tag => tag.get('name').toLowerCase()); let tagToAdd; tagNameAttr = tagNameAttr.trim(); @@ -102,7 +102,7 @@ export default class GhTagsTokenInput extends Component { // methods _findTagByName(name) { - let withMatchingName = function (tag) { + const withMatchingName = function (tag) { if (tag.__isSuggestion__) { return false; } diff --git a/apps/ember-admin/app/components/gh-task-button.js b/apps/ember-admin/app/components/gh-task-button.js index a08ef711b96..66b8707fb00 100644 --- a/apps/ember-admin/app/components/gh-task-button.js +++ b/apps/ember-admin/app/components/gh-task-button.js @@ -66,8 +66,8 @@ const GhTaskButton = Component.extend({ }), isRunning: computed('task.last.isRunning', 'hasRun', 'showSuccess', function () { - let taskName = this.get('task.name'); - let lastTaskName = this.get('task.last.task.name'); + const taskName = this.get('task.name'); + const lastTaskName = this.get('task.last.task.name'); let isRunning = (taskName === lastTaskName) && this.get('task.last.isRunning'); if (this.hasRun && (taskName === lastTaskName) && this.get('task.last.value') && !this.showSuccess) { @@ -82,14 +82,14 @@ const GhTaskButton = Component.extend({ }), isSuccess: computed('hasRun', 'isRunning', 'task.last.value', function () { - let taskName = this.get('task.name'); - let lastTaskName = this.get('task.last.task.name'); + const taskName = this.get('task.name'); + const lastTaskName = this.get('task.last.task.name'); if (!this.hasRun || this.isRunning || !this.showSuccess) { return false; } - let value = this.get('task.last.value'); + const value = this.get('task.last.value'); return (taskName === lastTaskName) && !isBlank(value) && value !== false && value !== 'canceled'; }), @@ -98,8 +98,8 @@ const GhTaskButton = Component.extend({ }), isFailure: computed('hasRun', 'isRunning', 'isSuccess', 'task.last.{value,error}', function () { - let taskName = this.get('task.name'); - let lastTaskName = this.get('task.last.task.name'); + const taskName = this.get('task.name'); + const lastTaskName = this.get('task.last.task.name'); const lastTaskValue = this.task?.last?.value; if (!this.hasRun || this.isRunning || this.isSuccess) { @@ -148,8 +148,8 @@ const GhTaskButton = Component.extend({ return false; } - let taskName = this.get('task.name'); - let lastTaskName = this.get('task.last.task.name'); + const taskName = this.get('task.name'); + const lastTaskName = this.get('task.last.task.name'); // task-buttons are never disabled whilst running so that clicks when a // taskGroup is running don't get dropped BUT that means we need to check @@ -185,7 +185,7 @@ const GhTaskButton = Component.extend({ // so we want to restart the retry spinner animation to show something // has happened when the button is clicked _restartAnimation: task(function* () { - let elem = this.element.querySelector('.retry-animated'); + const elem = this.element.querySelector('.retry-animated'); if (elem) { elem.classList.remove('retry-animated'); yield timeout(10); diff --git a/apps/ember-admin/app/components/gh-textarea.js b/apps/ember-admin/app/components/gh-textarea.js index dca8ef93d32..3de6c008c71 100644 --- a/apps/ember-admin/app/components/gh-textarea.js +++ b/apps/ember-admin/app/components/gh-textarea.js @@ -50,7 +50,7 @@ export default class GhTextarea extends TextArea.extend(TextInputMixin) { } _autoExpand() { - let el = this.element; + const el = this.element; // collapse the element first so that we can shrink as well as expand // then set the height to match the text height diff --git a/apps/ember-admin/app/components/gh-token-input.js b/apps/ember-admin/app/components/gh-token-input.js index 50589bbf2bb..a9e8ca2933b 100644 --- a/apps/ember-admin/app/components/gh-token-input.js +++ b/apps/ember-admin/app/components/gh-token-input.js @@ -28,10 +28,10 @@ export default class GhTokenInput extends Component { } get optionsWithoutSelected() { - let options = this.args.options; - let selected = this.args.selected; + const options = this.args.options; + const selected = this.args.selected; - let optionsWithoutSelected = []; + const optionsWithoutSelected = []; function filterSelectedOptions(opts, result) { opts.forEach((o) => { @@ -67,7 +67,7 @@ export default class GhTokenInput extends Component { // On backspace with empty text, remove the last token but deviate // from default behaviour by not updating search to match last token if (event.keyCode === BACKSPACE && isBlank(event.target.value)) { - let lastSelection = select.selected[select.selected.length - 1]; + const lastSelection = select.selected[select.selected.length - 1]; if (lastSelection) { this.args.onChange(select.selected.slice(0, -1), select); @@ -136,7 +136,7 @@ export default class GhTokenInput extends Component { return; } - let suggestion = selection.find(option => option.__isSuggestion__); + const suggestion = selection.find(option => option.__isSuggestion__); if (suggestion) { // abort creating if we're still searching otherwise we could create duplicates @@ -162,9 +162,9 @@ export default class GhTokenInput extends Component { return newOptions; } - let searchAction = this.args.search; + const searchAction = this.args.search; if (searchAction) { - let results = yield searchAction(term, select); + const results = yield searchAction(term, select); this._addCreateOption(term, results); return results; @@ -181,7 +181,7 @@ export default class GhTokenInput extends Component { // always select the first item in the list that isn't the "Add x" option @action defaultHighlighted(select) { - let {results} = select; + const {results} = select; let option = advanceSelectableOption(results, undefined, 1); if (results.length > 1 && option.__isSuggestion__) { @@ -220,7 +220,7 @@ export default class GhTokenInput extends Component { } _hideCreateOptionOnSameTerm(term, options) { - let existingOption = options.findBy(this.searchField, term); + const existingOption = options.findBy(this.searchField, term); return !existingOption; } diff --git a/apps/ember-admin/app/components/gh-token-input/trigger.js b/apps/ember-admin/app/components/gh-token-input/trigger.js index 8ad14879c09..ab4df99a9d7 100644 --- a/apps/ember-admin/app/components/gh-token-input/trigger.js +++ b/apps/ember-admin/app/components/gh-token-input/trigger.js @@ -11,7 +11,7 @@ export default class Trigger extends EmberPowerSelectMultipleTrigger { this.args.select.actions.close(); if (!event.target.closest('[data-selected-index]')) { - let optionMouseDown = this.args.extra.optionMouseDown; + const optionMouseDown = this.args.extra.optionMouseDown; if (optionMouseDown) { return optionMouseDown(event); } @@ -22,7 +22,7 @@ export default class Trigger extends EmberPowerSelectMultipleTrigger { @action handleOptionTouchStart(event) { - let optionTouchStart = this.args.extra.optionTouchStart; + const optionTouchStart = this.args.extra.optionTouchStart; if (optionTouchStart) { return optionTouchStart(event); } @@ -33,7 +33,7 @@ export default class Trigger extends EmberPowerSelectMultipleTrigger { // ember-drag-drop's sortable-objects has two-way bindings and will // update EPS' selected value directly. We have to create a copy // after sorting in order to force the onchange action to be triggered - let selectedCopy = this.args.select.selected.slice(); + const selectedCopy = this.args.select.selected.slice(); this.args.select.actions.select(selectedCopy); } @@ -48,13 +48,13 @@ export default class Trigger extends EmberPowerSelectMultipleTrigger { if (e.keyCode === 8) { e.stopPropagation(); if (isBlank(e.target.value)) { - let lastSelection = this.args.select.selected[this.args.select.selected.length - 1]; + const lastSelection = this.args.select.selected[this.args.select.selected.length - 1]; if (lastSelection) { this.args.select.actions.select(this.args.buildSelection(lastSelection, this.args.select), e); if (typeof lastSelection === 'string') { this.args.select.actions.search(lastSelection); } else { - let searchField = this.searchField; + const searchField = this.searchField; assert('`{{power-select-multiple}}` requires a `searchField` when the options are not strings to remove options using backspace', searchField); this.args.select.actions.search(get(lastSelection, searchField)); } diff --git a/apps/ember-admin/app/components/gh-trim-focus-input.js b/apps/ember-admin/app/components/gh-trim-focus-input.js index d4167600102..1f017439489 100644 --- a/apps/ember-admin/app/components/gh-trim-focus-input.js +++ b/apps/ember-admin/app/components/gh-trim-focus-input.js @@ -24,7 +24,7 @@ class TrimFocusInputComponent extends GhostTextInput { this.element.value = value; this._elementValueDidChange(event); - let inputMethod = this.input; + const inputMethod = this.input; if (inputMethod) { inputMethod(event); } diff --git a/apps/ember-admin/app/components/gh-unsplash.js b/apps/ember-admin/app/components/gh-unsplash.js index a742f1d9bfc..48d36b22831 100644 --- a/apps/ember-admin/app/components/gh-unsplash.js +++ b/apps/ember-admin/app/components/gh-unsplash.js @@ -64,7 +64,7 @@ export default class GhUnsplash extends Component { select(photo) { this.unsplash.triggerDownload(photo); - let selectParams = { + const selectParams = { src: photo.urls.regular.replace(/&w=1080/, '&w=2000'), width: photo.width, height: photo.height, @@ -95,7 +95,7 @@ export default class GhUnsplash extends Component { @action handleResize(element) { - let width = element.clientWidth; + const width = element.clientWidth; let columns = 3; if (width <= ONE_COLUMN_WIDTH) { diff --git a/apps/ember-admin/app/components/gh-uploader.js b/apps/ember-admin/app/components/gh-uploader.js index 1f22fb36a4f..0ac2379df64 100644 --- a/apps/ember-admin/app/components/gh-uploader.js +++ b/apps/ember-admin/app/components/gh-uploader.js @@ -166,16 +166,16 @@ export default Component.extend({ }, _validate() { - let files = this.files; - let validate = this.validate || this._defaultValidator.bind(this); - let ok = []; - let errors = []; + const files = this.files; + const validate = this.validate || this._defaultValidator.bind(this); + const ok = []; + const errors = []; // NOTE: for...of loop results in a transpilation that errors in Edge, // once we drop IE11 support we should be able to use native for...of for (let i = 0; i < files.length; i += 1) { - let file = files[i]; - let result = validate(file); + const file = files[i]; + const result = validate(file); if (result === true) { ok.push(file); } else { @@ -196,7 +196,7 @@ export default Component.extend({ // expose the mime-type, we'll rely on the API for final validation _defaultValidator(file) { let extensions = this.extensions; - let [, extension] = (/(?:\.([^.]+))?$/).exec(file.name); + const [, extension] = (/(?:\.([^.]+))?$/).exec(file.name); // if extensions is falsy exit early and accept all files if (!extensions) { @@ -208,7 +208,7 @@ export default Component.extend({ } if (!extension || extensions.indexOf(extension.toLowerCase()) === -1) { - let validExtensions = `.${extensions.join(', .').toUpperCase()}`; + const validExtensions = `.${extensions.join(', .').toUpperCase()}`; return `The file type you uploaded is not supported. Please use ${validExtensions}`; } @@ -216,7 +216,7 @@ export default Component.extend({ }, _uploadFiles: task(function* (files) { - let uploads = []; + const uploads = []; this._reset(); this.onStart(files); @@ -224,8 +224,8 @@ export default Component.extend({ // NOTE: for...of loop results in a transpilation that errors in Edge, // once we drop IE11 support we should be able to use native for...of for (let i = 0; i < files.length; i += 1) { - let file = files[i]; - let tracker = UploadTracker.create({file}); + const file = files[i]; + const tracker = UploadTracker.create({file}); this._uploadTrackers.pushObject(tracker); uploads.push(this._uploadFile.perform(tracker, file, i)); @@ -243,21 +243,21 @@ export default Component.extend({ // eslint-disable-next-line ghost/ember/order-in-components _uploadFile: task(function* (tracker, file, index) { - let ajax = this.ajax; - let formData = this._getFormData(file); - let url = `${ghostPaths().apiRoot}${this.uploadUrl}`; + const ajax = this.ajax; + const formData = this._getFormData(file); + const url = `${ghostPaths().apiRoot}${this.uploadUrl}`; let metadata = null; try { metadata = yield Promise.resolve(this.onUploadStart(file)); - let response = yield ajax[this.requestMethod](url, { + const response = yield ajax[this.requestMethod](url, { data: formData, processData: false, contentType: false, dataType: 'text', xhr: () => { - let xhr = new window.XMLHttpRequest(); + const xhr = new window.XMLHttpRequest(); xhr.upload.addEventListener('progress', (event) => { run(() => { @@ -287,13 +287,13 @@ export default Component.extend({ } if (uploadResponse) { - let resource = get(uploadResponse, this.resourceName); + const resource = get(uploadResponse, this.resourceName); if (resource && isArray(resource) && resource[0]) { responseUrl = get(resource[0], 'url'); } } - let result = { + const result = { url: responseUrl, fileName: file.name }; @@ -305,14 +305,14 @@ export default Component.extend({ } catch (error) { // grab custom error message if present let message = error.payload && error.payload.errors && error.payload.errors[0].message || ''; - let context = error.payload && error.payload.errors && error.payload.errors[0].context || ''; + const context = error.payload && error.payload.errors && error.payload.errors[0].context || ''; // fall back to EmberData/ember-ajax default message for error type if (!message) { message = error.message; } - let result = { + const result = { message, context, fileName: file.name @@ -326,7 +326,7 @@ export default Component.extend({ // NOTE: this is necessary because the API doesn't accept direct file uploads _getFormData(file) { - let formData = new FormData(); + const formData = new FormData(); formData.append(this.paramName, file, file.name); Object.keys(this.paramsHash || {}).forEach((key) => { @@ -344,9 +344,9 @@ export default Component.extend({ return; } - let trackers = this._uploadTrackers; - let totalSize = trackers.reduce((total, tracker) => total + tracker.get('total'), 0); - let uploadedSize = trackers.reduce((total, tracker) => total + tracker.get('loaded'), 0); + const trackers = this._uploadTrackers; + const totalSize = trackers.reduce((total, tracker) => total + tracker.get('total'), 0); + const uploadedSize = trackers.reduce((total, tracker) => total + tracker.get('loaded'), 0); this.set('totalSize', totalSize); this.set('uploadedSize', uploadedSize); @@ -355,7 +355,7 @@ export default Component.extend({ return; } - let uploadPercentage = Math.round((uploadedSize / totalSize) * 100); + const uploadPercentage = Math.round((uploadedSize / totalSize) * 100); this.set('uploadPercentage', uploadPercentage); }, diff --git a/apps/ember-admin/app/components/gh-url-preview.js b/apps/ember-admin/app/components/gh-url-preview.js index 4df035ec311..488c57ed6c0 100644 --- a/apps/ember-admin/app/components/gh-url-preview.js +++ b/apps/ember-admin/app/components/gh-url-preview.js @@ -19,16 +19,16 @@ export default class GhUrlPreview extends Component { @computed('slug') get url() { // Get the blog URL and strip the scheme - let blogUrl = this.config.blogUrl; + const blogUrl = this.config.blogUrl; // Remove `http[s]://` - let noSchemeBlogUrl = blogUrl.substr(blogUrl.indexOf('://') + 3); + const noSchemeBlogUrl = blogUrl.substr(blogUrl.indexOf('://') + 3); // Get the prefix and slug values - let prefix = this.prefix ? `${this.prefix}/` : ''; - let slug = this.slug ? `${this.slug}/` : ''; + const prefix = this.prefix ? `${this.prefix}/` : ''; + const slug = this.slug ? `${this.slug}/` : ''; // Join parts of the URL together with slashes - let theUrl = `${noSchemeBlogUrl}/${prefix}${slug}`; + const theUrl = `${noSchemeBlogUrl}/${prefix}${slug}`; return theUrl; } diff --git a/apps/ember-admin/app/components/koenig-image-editor.js b/apps/ember-admin/app/components/koenig-image-editor.js index 1ab92083b24..c3a7f7cef25 100644 --- a/apps/ember-admin/app/components/koenig-image-editor.js +++ b/apps/ember-admin/app/components/koenig-image-editor.js @@ -97,18 +97,18 @@ export default class KoenigImageEditor extends Component { } loadImageEditorCSS() { - let cssUrl = this.getImageEditorCSSUrl(); + const cssUrl = this.getImageEditorCSSUrl(); if (!cssUrl) { return; } try { // Check if the CSS file is already present in the document's head - let cssLink = document.querySelector(`link[href="${cssUrl}"]`); + const cssLink = document.querySelector(`link[href="${cssUrl}"]`); if (cssLink) { this.cssLoaded = true; } else { - let link = document.createElement('link'); + const link = document.createElement('link'); link.rel = 'stylesheet'; link.type = 'text/css'; link.href = cssUrl; diff --git a/apps/ember-admin/app/components/koenig-lexical-editor.js b/apps/ember-admin/app/components/koenig-lexical-editor.js index e61cfda5cc1..778228e3dc3 100644 --- a/apps/ember-admin/app/components/koenig-lexical-editor.js +++ b/apps/ember-admin/app/components/koenig-lexical-editor.js @@ -340,8 +340,8 @@ export default class KoenigLexicalEditor extends Component { ReactComponent = (props) => { const fetchEmbed = async (url, {type}) => { - let oembedEndpoint = this.ghostPaths.url.api('oembed'); - let response = await this.ajax.request(oembedEndpoint, { + const oembedEndpoint = this.ghostPaths.url.api('oembed'); + const response = await this.ajax.request(oembedEndpoint, { data: {url, type} }); return response; diff --git a/apps/ember-admin/app/components/modal-members-label-form.js b/apps/ember-admin/app/components/modal-members-label-form.js index fa12c91150c..9fb6a042a86 100644 --- a/apps/ember-admin/app/components/modal-members-label-form.js +++ b/apps/ember-admin/app/components/modal-members-label-form.js @@ -36,15 +36,15 @@ export default ModalComponent.extend({ }, saveTask: task(function* () { - let label = this.model && this.model.label; - let availableLabels = (this.model && this.model.labels) || []; + const label = this.model && this.model.label; + const availableLabels = (this.model && this.model.labels) || []; if (!label) { return false; } try { yield label.validate(); - let duplicateLabel = availableLabels.find((existingLabel) => { + const duplicateLabel = availableLabels.find((existingLabel) => { return existingLabel.name.trim().toLowerCase() === label.name.trim().toLowerCase() && existingLabel.slug !== label.slug; }); @@ -57,7 +57,7 @@ export default ModalComponent.extend({ return false; } - let savedLabel = yield label.save(); + const savedLabel = yield label.save(); this.notifications.showNotification('Label saved'); this.send('closeModal'); return savedLabel; @@ -69,14 +69,14 @@ export default ModalComponent.extend({ }), deleteLabel: task(function * () { - let label = this.model && this.model.label; + const label = this.model && this.model.label; if (!label) { return false; } try { yield label.destroyRecord(); this.labelsManager.removeLabel(label); - let routeName = this.router.currentRouteName; + const routeName = this.router.currentRouteName; this.notifications.showNotification('Label deleted'); this.send('closeModal'); this.router.transitionTo(routeName, {queryParams: resetQueryParams(routeName)}); diff --git a/apps/ember-admin/app/components/modal-post-history.js b/apps/ember-admin/app/components/modal-post-history.js index d0b61b7fbc1..841024d10ba 100644 --- a/apps/ember-admin/app/components/modal-post-history.js +++ b/apps/ember-admin/app/components/modal-post-history.js @@ -9,7 +9,7 @@ import {waitFor} from '@ember/test-waiters'; function checkFinishedRendering(element, done) { let last = element.innerHTML; function check() { - let html = element.innerHTML; + const html = element.innerHTML; if (html === last) { done(); } else { @@ -162,16 +162,16 @@ export default class ModalPostHistory extends Component { updateSelectedHTML() { return new Promise((resolve) => { if (this.selectedEditor) { - let selectedState = this.selectedEditor.editorInstance.parseEditorState(this.selectedRevision.lexical); + const selectedState = this.selectedEditor.editorInstance.parseEditorState(this.selectedRevision.lexical); this.selectedEditor.editorInstance.setEditorState(selectedState); } - let current = document.querySelector('.gh-post-history-hidden-lexical.current'); + const current = document.querySelector('.gh-post-history-hidden-lexical.current'); let currentDone = false; - let updateIfDone = () => { + const updateIfDone = () => { if (currentDone) { this.selectedHTML = this.stripInitialPlaceholder(current.innerHTML); } diff --git a/apps/ember-admin/app/components/modals/email-preview.js b/apps/ember-admin/app/components/modals/email-preview.js index 29c1e0d5fd0..9019673dcd3 100644 --- a/apps/ember-admin/app/components/modals/email-preview.js +++ b/apps/ember-admin/app/components/modals/email-preview.js @@ -82,18 +82,18 @@ export default class EmailPreviewModal extends Component { // data is a post or has no html, try fetching email preview } else { const id = this.args.data.post_id || this.args.data.id; - let url = this.ghostPaths.url.api('/email_previews/posts', id); - let response = await this.ajax.request(url); - let [emailPreview] = response.email_previews; + const url = this.ghostPaths.url.api('/email_previews/posts', id); + const response = await this.ajax.request(url); + const [emailPreview] = response.email_previews; html = emailPreview.html; subject = emailPreview.subject; } // inject extra CSS into the html for disabling links and scrollbars etc - let domParser = new DOMParser(); - let htmlDoc = domParser.parseFromString(html, 'text/html'); - let stylesheet = htmlDoc.querySelector('style'); - let originalCss = stylesheet.innerHTML; + const domParser = new DOMParser(); + const htmlDoc = domParser.parseFromString(html, 'text/html'); + const stylesheet = htmlDoc.querySelector('style'); + const originalCss = stylesheet.innerHTML; stylesheet.innerHTML = `${originalCss}\n\n${INJECTED_CSS}`; const doctype = new XMLSerializer().serializeToString(htmlDoc.doctype); diff --git a/apps/ember-admin/app/components/modals/new-custom-integration.js b/apps/ember-admin/app/components/modals/new-custom-integration.js index 3010d1da57d..7073fadacd3 100644 --- a/apps/ember-admin/app/components/modals/new-custom-integration.js +++ b/apps/ember-admin/app/components/modals/new-custom-integration.js @@ -40,8 +40,8 @@ export default class NewCustomIntegrationModal extends Component { // TODO: server-side validation errors should be serialized // properly so that errors are added to model.errors automatically if (error && isInvalidError(error)) { - let [firstError] = error.payload.errors; - let {message} = firstError; + const [firstError] = error.payload.errors; + const {message} = firstError; if (message && message.match(/name/i)) { this.integration.errors.add('name', message); diff --git a/apps/ember-admin/app/components/posts-list/content-filter.js b/apps/ember-admin/app/components/posts-list/content-filter.js index 5d9011d5456..854be9c82bf 100644 --- a/apps/ember-admin/app/components/posts-list/content-filter.js +++ b/apps/ember-admin/app/components/posts-list/content-filter.js @@ -8,10 +8,10 @@ export default class PostsListContentFilter extends Component { @service router; get showCustomViewManagement() { - let isAdmin = get(this.args.currentUser || {}, 'isAdmin'); - let onPostsScreen = this.router.currentRouteName === 'posts'; - let isDefaultView = this.customViews?.activeView?.isDefault; - let hasFilter = this.args.selectedType.value + const isAdmin = get(this.args.currentUser || {}, 'isAdmin'); + const onPostsScreen = this.router.currentRouteName === 'posts'; + const isDefaultView = this.customViews?.activeView?.isDefault; + const hasFilter = this.args.selectedType.value || this.args.selectedVisibility.value || this.args.selectedAuthor.slug || this.args.selectedTag.slug @@ -21,11 +21,11 @@ export default class PostsListContentFilter extends Component { } calculateActionsDropdownPosition(trigger, content) { - let {top, left, width, height} = trigger.getBoundingClientRect(); + const {top, left, width, height} = trigger.getBoundingClientRect(); // content.firstElementChild is required because we use .dropdown-menu which is absolute positioned - let {width: contentWidth} = content.firstElementChild.getBoundingClientRect(); + const {width: contentWidth} = content.firstElementChild.getBoundingClientRect(); - let style = { + const style = { left: left + width - contentWidth, top: top + height + 5 }; diff --git a/apps/ember-admin/app/components/posts-list/context-menu.js b/apps/ember-admin/app/components/posts-list/context-menu.js index 277058350f0..172e8274ea5 100644 --- a/apps/ember-admin/app/components/posts-list/context-menu.js +++ b/apps/ember-admin/app/components/posts-list/context-menu.js @@ -473,13 +473,13 @@ export default class PostsContextMenu extends Component { async performBulkDestroy() { const filter = this.selectionList.filter; - let bulkUpdateUrl = this.ghostPaths.url.api(this.type === 'post' ? 'posts' : 'pages') + `?filter=${encodeURIComponent(filter)}`; + const bulkUpdateUrl = this.ghostPaths.url.api(this.type === 'post' ? 'posts' : 'pages') + `?filter=${encodeURIComponent(filter)}`; return await this.ajax.delete(bulkUpdateUrl); } async performBulkEdit(_action, meta = {}) { const filter = this.selectionList.filter; - let bulkUpdateUrl = this.ghostPaths.url.api(this.type === 'post' ? 'posts/bulk' : 'pages/bulk') + `?filter=${encodeURIComponent(filter)}`; + const bulkUpdateUrl = this.ghostPaths.url.api(this.type === 'post' ? 'posts/bulk' : 'pages/bulk') + `?filter=${encodeURIComponent(filter)}`; return await this.ajax.put(bulkUpdateUrl, { data: { bulk: { diff --git a/apps/ember-admin/app/components/posts-list/list-item-analytics.js b/apps/ember-admin/app/components/posts-list/list-item-analytics.js index 7163ce21bfc..73590c373ea 100644 --- a/apps/ember-admin/app/components/posts-list/list-item-analytics.js +++ b/apps/ember-admin/app/components/posts-list/list-item-analytics.js @@ -29,9 +29,9 @@ export default class PostsListItemClicks extends Component { } get scheduledText() { - let text = []; + const text = []; - let formattedTime = formatPostTime( + const formattedTime = formatPostTime( this.post.publishedAtUTC, {timezone: this.settings.timezone, scheduled: true} ); diff --git a/apps/ember-admin/app/components/posts-list/list-item.js b/apps/ember-admin/app/components/posts-list/list-item.js index 9c12e66ca2c..1874f88cb90 100644 --- a/apps/ember-admin/app/components/posts-list/list-item.js +++ b/apps/ember-admin/app/components/posts-list/list-item.js @@ -27,9 +27,9 @@ export default class PostsListItemClicks extends Component { } get scheduledText() { - let text = []; + const text = []; - let formattedTime = formatPostTime( + const formattedTime = formatPostTime( this.post.publishedAtUTC, {timezone: this.settings.timezone, scheduled: true} ); diff --git a/apps/ember-admin/app/components/posts/debug.js b/apps/ember-admin/app/components/posts/debug.js index 1efc5586cfc..7ea9e07f1c3 100644 --- a/apps/ember-admin/app/components/posts/debug.js +++ b/apps/ember-admin/app/components/posts/debug.js @@ -42,13 +42,13 @@ export default class Debug extends Component { get emailError() { // get failed batches count - let failedBatches = this.emailBatchesData?.filter((batch) => { + const failedBatches = this.emailBatchesData?.filter((batch) => { return batch.statusClass === 'failed'; }).length || 0; // get total batch count - let totalBatches = this.emailBatchesData?.length || 0; + const totalBatches = this.emailBatchesData?.length || 0; - let details = (this.loading || !totalBatches) ? '' : `${failedBatches} of ${ghPluralize(totalBatches, 'batch')} failed to send, check below for more details.`; + const details = (this.loading || !totalBatches) ? '' : `${failedBatches} of ${ghPluralize(totalBatches, 'batch')} failed to send, check below for more details.`; return { message: this.post.email?.error || 'Failed to send email.', details @@ -155,8 +155,8 @@ export default class Debug extends Component { if (!name) { return 'U'; } - let names = name.split(' '); - let intials = names.length > 1 ? [names[0][0], names[names.length - 1][0]] : [names[0][0]]; + const names = name.split(' '); + const intials = names.length > 1 ? [names[0][0], names[names.length - 1][0]] : [names[0][0]]; return intials.join('').toUpperCase(); } @@ -205,8 +205,8 @@ export default class Debug extends Component { order: 'status asc, created_at desc' }; - let statsUrl = this.ghostPaths.url.api(`emails/${this.post.email.id}/batches`); - let result = yield this.ajax.request(statsUrl, {data}); + const statsUrl = this.ghostPaths.url.api(`emails/${this.post.email.id}/batches`); + const result = yield this.ajax.request(statsUrl, {data}); this.emailBatches = result.batches; this.loading = false; } @@ -258,15 +258,15 @@ export default class Debug extends Component { include: 'member,email_recipient', limit: 'all' }; - let statsUrl = this.ghostPaths.url.api(`/emails/${this.post.email.id}/recipient-failures`); - let result = yield this.ajax.request(statsUrl, {data}); + const statsUrl = this.ghostPaths.url.api(`/emails/${this.post.email.id}/recipient-failures`); + const result = yield this.ajax.request(statsUrl, {data}); this.recipientFailures = result.failures; } @task *_fetchAnalyticsStatus() { - let statsUrl = this.ghostPaths.url.api(`/emails/${this.post.email.id}/analytics`); - let result = yield this.ajax.request(statsUrl); + const statsUrl = this.ghostPaths.url.api(`/emails/${this.post.email.id}/analytics`); + const result = yield this.ajax.request(statsUrl); this.analyticsStatus = result; // Parse dates @@ -382,7 +382,7 @@ export default class Debug extends Component { @task *_cancelScheduleAnalytics() { - let statsUrl = this.ghostPaths.url.api(`/emails/analytics`); + const statsUrl = this.ghostPaths.url.api(`/emails/analytics`); yield this.ajax.delete(statsUrl, {}); yield this.fetchAnalyticsStatus(); } diff --git a/apps/ember-admin/app/components/tags/tag-form.js b/apps/ember-admin/app/components/tags/tag-form.js index b08df779c2b..982ed575db5 100644 --- a/apps/ember-admin/app/components/tags/tag-form.js +++ b/apps/ember-admin/app/components/tags/tag-form.js @@ -164,7 +164,7 @@ export default class TagForm extends Component { const {tag} = this.args; let newUrl = tag.canonicalUrl; - let [oldUrl] = tag.changedAttributes().canonicalUrl; + const [oldUrl] = tag.changedAttributes().canonicalUrl; let errMessage = ''; tag.errors.remove('canonicalUrl'); diff --git a/apps/ember-admin/app/controllers/application.js b/apps/ember-admin/app/controllers/application.js index 212cb4c908e..5dc128d9847 100644 --- a/apps/ember-admin/app/controllers/application.js +++ b/apps/ember-admin/app/controllers/application.js @@ -41,7 +41,7 @@ export default class ApplicationController extends Controller { } get ownerUserNameOrEmail() { - let user = this.store.peekAll('user').findBy('isOwnerOnly', true); + const user = this.store.peekAll('user').findBy('isOwnerOnly', true); if (user) { if (user.name) { diff --git a/apps/ember-admin/app/controllers/lexical-editor.js b/apps/ember-admin/app/controllers/lexical-editor.js index 0298c5f1dce..eab04c00bf6 100644 --- a/apps/ember-admin/app/controllers/lexical-editor.js +++ b/apps/ember-admin/app/controllers/lexical-editor.js @@ -43,7 +43,7 @@ const TK_REGEX = new RegExp(/(^|.)([^\p{L}\p{N}\s]*(TK)+[^\p{L}\p{N}\s]*)(.)?/u) const WORD_CHAR_REGEX = new RegExp(/\p{L}|\p{N}/u); // this array will hold properties we need to watch for this.hasDirtyAttributes -let watchedProps = [ +const watchedProps = [ 'post.lexicalScratch', 'post.titleScratch', 'post.hasDirtyAttributes', @@ -264,7 +264,7 @@ export default class LexicalEditorController extends Controller { @computed('session.user.{isAdmin,isEitherEditor}') get canManageSnippets() { - let {user} = this.session; + const {user} = this.session; if (user.get('isAdmin') || user.get('isEitherEditor')) { return true; } @@ -273,8 +273,8 @@ export default class LexicalEditorController extends Controller { @computed('_autosaveTask.isRunning', '_timedSaveTask.isRunning') get _autosaveRunning() { - let autosave = this.get('_autosaveTask.isRunning'); - let timedsave = this.get('_timedSaveTask.isRunning'); + const autosave = this.get('_autosaveTask.isRunning'); + const timedsave = this.get('_timedSaveTask.isRunning'); return autosave || timedsave; } @@ -394,7 +394,7 @@ export default class LexicalEditorController extends Controller { // called by the "are you sure?" modal @action leaveEditor() { - let transition = this.leaveEditorTransition; + const transition = this.leaveEditorTransition; if (!transition) { this.notifications.showAlert(GENERIC_ERROR_MESSAGE, {type: 'error'}); @@ -594,8 +594,8 @@ export default class LexicalEditorController extends Controller { return; } - let prevStatus = this.get('post.status'); - let isNew = this.get('post.isNew'); + const prevStatus = this.get('post.status'); + const isNew = this.get('post.isNew'); const adapterOptions = {}; this.cancelAutosave(); @@ -646,7 +646,7 @@ export default class LexicalEditorController extends Controller { yield this.beforeSaveTask.perform(options); try { - let post = yield this._savePostTask.perform({...options, adapterOptions}); + const post = yield this._savePostTask.perform({...options, adapterOptions}); // Clear any error notification (if any) this.notifications.clearAll(); @@ -713,7 +713,7 @@ export default class LexicalEditorController extends Controller { } if (!options.silent) { - let errorOrMessages = error || this.get('post.errors.messages'); + const errorOrMessages = error || this.get('post.errors.messages'); this._showErrorAlert(prevStatus, this.get('post.status'), errorOrMessages); return; } @@ -773,8 +773,8 @@ export default class LexicalEditorController extends Controller { */ @task({group: 'saveTasks'}) *updateSlugTask(_newSlug) { - let slug = this.get('post.slug'); - let newSlug, serverSlug; + const slug = this.get('post.slug'); + let newSlug; newSlug = _newSlug || slug; newSlug = newSlug && newSlug.trim(); @@ -786,7 +786,7 @@ export default class LexicalEditorController extends Controller { return; } - serverSlug = yield this.slugGenerator.generateSlug('post', newSlug, this.get('post.id')); + const serverSlug = yield this.slugGenerator.generateSlug('post', newSlug, this.get('post.id')); // If after getting the sanitized and unique slug back from the API // we end up with a slug that matches the existing slug, abort the change if (serverSlug === slug) { @@ -800,8 +800,8 @@ export default class LexicalEditorController extends Controller { // the trailing incrementor (e.g., this-is-a-slug and this-is-a-slug-2) // get the last token out of the slug candidate and see if it's a number - let slugTokens = serverSlug.split('-'); - let check = Number(slugTokens.pop()); + const slugTokens = serverSlug.split('-'); + const check = Number(slugTokens.pop()); // if the candidate slug is the same as the existing slug except // for the incrementor then the existing slug should be used @@ -837,7 +837,7 @@ export default class LexicalEditorController extends Controller { } if (error) { - let status = this.get('post.status'); + const status = this.get('post.status'); this._showErrorAlert(status, status, error); } @@ -848,7 +848,7 @@ export default class LexicalEditorController extends Controller { // convenience method for saving the post and performing post-save cleanup @task *_savePostTask(options = {}) { - let {post} = this; + const {post} = this; const previousEmailOnlyValue = this.post.emailOnly; @@ -908,8 +908,8 @@ export default class LexicalEditorController extends Controller { // if the two "scratch" properties (title and content) match the post, // then it's ok to set hasDirtyAttributes to false // TODO: why is this necessary? - let titlesMatch = post.get('titleScratch') === post.get('title'); - let bodiesMatch = post.get('lexicalScratch') === post.get('lexical'); + const titlesMatch = post.get('titleScratch') === post.get('title'); + const bodiesMatch = post.get('lexicalScratch') === post.get('lexical'); if (titlesMatch && bodiesMatch) { this.set('hasDirtyAttributes', false); @@ -918,9 +918,9 @@ export default class LexicalEditorController extends Controller { @task *saveTitleTask() { - let post = this.post; - let currentTitle = post.get('title'); - let newTitle = post.get('titleScratch').trim(); + const post = this.post; + const currentTitle = post.get('title'); + const newTitle = post.get('titleScratch').trim(); if ((currentTitle && newTitle && newTitle === currentTitle) || (!currentTitle && !newTitle)) { return; @@ -1117,7 +1117,7 @@ export default class LexicalEditorController extends Controller { // logic to _confirmLeave via the unsaved-changes service so that // intercepted hash link clicks follow exactly the same code path. async willTransition(transition) { - let post = this.post; + const post = this.post; // exit early and allow transition if we have no post, occurs if reset // has already been called @@ -1137,7 +1137,7 @@ export default class LexicalEditorController extends Controller { && transition.targetName === 'lexical-editor.edit' && transition.intent.contexts?.[0]?.id === post.id; - let leaveState = this._getLeaveTransitionState({fromNewToEdit}); + const leaveState = this._getLeaveTransitionState({fromNewToEdit}); if (leaveState.shouldAbort) { transition.abort(); @@ -1186,8 +1186,8 @@ export default class LexicalEditorController extends Controller { // autosave handling, and the "are you sure?" modal. Returns true if leaving // should proceed, false if the user chose to stay. async _confirmLeave() { - let {fromNewToEdit = false} = this._confirmLeaveContext || {}; - let post = this.post; + const {fromNewToEdit = false} = this._confirmLeaveContext || {}; + const post = this.post; if (!post) { return true; } @@ -1274,7 +1274,7 @@ export default class LexicalEditorController extends Controller { } _getLeaveTransitionState({fromNewToEdit = false} = {}) { - let post = this.post; + const post = this.post; if (!post) { return { @@ -1285,7 +1285,7 @@ export default class LexicalEditorController extends Controller { } let hasDirtyAttributes = this.hasDirtyAttributes; - let state = post.getProperties('isDeleted', 'isSaving', 'hasDirtyAttributes', 'isNew'); + const state = post.getProperties('isDeleted', 'isSaving', 'hasDirtyAttributes', 'isNew'); if (state.isDeleted) { // if the post is deleted, we don't need to save it @@ -1293,20 +1293,20 @@ export default class LexicalEditorController extends Controller { } // Check if anything has changed since the last revision - let postRevisions = post.get('postRevisions').toArray(); - let latestRevision = postRevisions[postRevisions.length - 1]; - let hasChangedSinceLastRevision = !latestRevision || (!post.isNew && post.lexical.replaceAll(this.config.blogUrl, '') !== latestRevision.lexical.replaceAll(this.config.blogUrl, '')); + const postRevisions = post.get('postRevisions').toArray(); + const latestRevision = postRevisions[postRevisions.length - 1]; + const hasChangedSinceLastRevision = !latestRevision || (!post.isNew && post.lexical.replaceAll(this.config.blogUrl, '') !== latestRevision.lexical.replaceAll(this.config.blogUrl, '')); - let deletedWithoutChanges = state.isDeleted + const deletedWithoutChanges = state.isDeleted && (state.isSaving || !state.hasDirtyAttributes); - let shouldSaveOnLeave = !this._saveOnLeavePerformed + const shouldSaveOnLeave = !this._saveOnLeavePerformed && hasChangedSinceLastRevision && hasDirtyAttributes && !state.isDeleted && post.get('status') === 'draft'; - let shouldConfirmFlow = !this._leaveConfirmed + const shouldConfirmFlow = !this._leaveConfirmed && !fromNewToEdit && !deletedWithoutChanges && hasDirtyAttributes; @@ -1327,7 +1327,7 @@ export default class LexicalEditorController extends Controller { // called when the editor route is left or the post model is swapped reset() { - let post = this.post; + const post = this.post; // make sure the save tasks aren't still running in the background // after leaving the edit route @@ -1412,7 +1412,7 @@ export default class LexicalEditorController extends Controller { diff.forEach((change) => { if (change.path) { // use path array to fill in node types from parsedScratch when path shows an index - let humanPath = []; + const humanPath = []; change.path.forEach((child, i) => { if (typeof child === 'number') { const partialPath = diff.path.slice(0, i + 1); @@ -1442,7 +1442,7 @@ export default class LexicalEditorController extends Controller { } _hasDirtyAttributes() { - let post = this.post; + const post = this.post; if (!post) { return false; @@ -1460,8 +1460,8 @@ export default class LexicalEditorController extends Controller { // post.tags is an array so hasDirtyAttributes doesn't pick up // changes unless the array ref is changed - let currentTags = (this._tagNames || []).join(', '); - let previousTags = (this._previousTagNames || []).join(', '); + const currentTags = (this._tagNames || []).join(', '); + const previousTags = (this._previousTagNames || []).join(', '); if (currentTags !== previousTags) { this._leaveModalReason = { reason: 'tags are different', @@ -1482,13 +1482,13 @@ export default class LexicalEditorController extends Controller { } // Lexical and scratch comparison - let lexical = post.get('lexical'); - let scratch = post.get('lexicalScratch'); - let secondaryLexical = post.get('secondaryLexicalState'); + const lexical = post.get('lexical'); + const scratch = post.get('lexicalScratch'); + const secondaryLexical = post.get('secondaryLexicalState'); - let lexicalChildNodes = lexical ? JSON.parse(lexical).root?.children : []; - let scratchChildNodes = scratch ? JSON.parse(scratch).root?.children : []; - let secondaryLexicalChildNodes = secondaryLexical ? JSON.parse(secondaryLexical).root?.children : []; + const lexicalChildNodes = lexical ? JSON.parse(lexical).root?.children : []; + const scratchChildNodes = scratch ? JSON.parse(scratch).root?.children : []; + const secondaryLexicalChildNodes = secondaryLexical ? JSON.parse(secondaryLexical).root?.children : []; lexicalChildNodes.forEach(child => child.direction = null); scratchChildNodes.forEach(child => child.direction = null); @@ -1520,7 +1520,7 @@ export default class LexicalEditorController extends Controller { // New+unsaved posts always return `hasDirtyAttributes: true` // so we need a manual check to see if any if (post.get('isNew')) { - let changedAttributes = Object.keys(post.changedAttributes() || {}); + const changedAttributes = Object.keys(post.changedAttributes() || {}); if (changedAttributes.length) { this._leaveModalReason = { reason: 'post.changedAttributes.length > 0', @@ -1533,7 +1533,7 @@ export default class LexicalEditorController extends Controller { // We've covered all the non-tracked cases we care about so fall // back on Ember Data's default dirty attribute checks - let {hasDirtyAttributes} = post; + const {hasDirtyAttributes} = post; if (hasDirtyAttributes) { this._leaveModalReason = { reason: 'post.hasDirtyAttributes === true', @@ -1552,10 +1552,10 @@ export default class LexicalEditorController extends Controller { return this._showScheduledNotification(delayed); } - let notifications = this.notifications; + const notifications = this.notifications; let message = messageMap.success.post[prevStatus][status]; - let actions, type, path; - type = this.get('post.displayName'); + let actions, path; + const type = this.get('post.displayName'); if (status === 'published' || status === 'scheduled') { path = this.get('post.url'); @@ -1568,16 +1568,16 @@ export default class LexicalEditorController extends Controller { } async _showScheduledNotification(delayed) { - let { + const { publishedAtUTC, previewUrl, emailOnly, newsletter, displayName } = this.post; - let publishedAtBlogTZ = moment.tz(publishedAtUTC, this.settings.timezone); + const publishedAtBlogTZ = moment.tz(publishedAtUTC, this.settings.timezone); - let title = capitalizeFirstLetter(displayName) + ' scheduled'; + const title = capitalizeFirstLetter(displayName) + ' scheduled'; let description = emailOnly ? ['Will be sent'] : ['Will be published']; if (newsletter) { @@ -1596,14 +1596,14 @@ export default class LexicalEditorController extends Controller { description = htmlSafe(description.join(' ')); - let actions = htmlSafe(`Show preview`); + const actions = htmlSafe(`Show preview`); return this.notifications.showNotification(title, {description, actions, type: 'success', delayed}); } _showErrorAlert(prevStatus, status, error, delay) { let message = messageMap.errors.post[prevStatus][status]; - let notifications = this.notifications; + const notifications = this.notifications; let errorMessage; function isString(str) { diff --git a/apps/ember-admin/app/controllers/reset.js b/apps/ember-admin/app/controllers/reset.js index 761da4a0292..a888c2929f9 100644 --- a/apps/ember-admin/app/controllers/reset.js +++ b/apps/ember-admin/app/controllers/reset.js @@ -57,7 +57,7 @@ export default class ResetController extends Controller.extend(ValidationEngine) try { yield this.validate(); try { - let {password_reset: [{message, emailVerificationToken: legacyEmailVerificationToken}]} = yield this.ajax.put(authUrl, { + const {password_reset: [{message, emailVerificationToken: legacyEmailVerificationToken}]} = yield this.ajax.put(authUrl, { data: { password_reset: [{newPassword, ne2Password, token}] } diff --git a/apps/ember-admin/app/controllers/setup.js b/apps/ember-admin/app/controllers/setup.js index af49839374e..82e52b23ffd 100644 --- a/apps/ember-admin/app/controllers/setup.js +++ b/apps/ember-admin/app/controllers/setup.js @@ -88,16 +88,16 @@ export default class SetupController extends Controller.extend(ValidationEngine) authenticate; _passwordSetup() { - let setupProperties = ['blogTitle', 'name', 'email', 'password']; - let data = this.getProperties(setupProperties); - let method = this.blogCreated ? 'put' : 'post'; + const setupProperties = ['blogTitle', 'name', 'email', 'password']; + const data = this.getProperties(setupProperties); + const method = this.blogCreated ? 'put' : 'post'; this.set('flowErrors', ''); this.hasValidated.addObjects(setupProperties); return this.validate().then(() => { - let authUrl = this.get('ghostPaths.url').api('authentication', 'setup'); + const authUrl = this.get('ghostPaths.url').api('authentication', 'setup'); return this.ajax[method](authUrl, { data: { @@ -135,7 +135,7 @@ export default class SetupController extends Controller.extend(ValidationEngine) _handleSaveError(resp) { if (isInvalidError(resp)) { - let [error] = resp.payload.errors; + const [error] = resp.payload.errors; this.set('flowErrors', [error.message, error.context].join(' ')); } else { this.notifications.showAPIError(resp, {key: 'setup.blog-details'}); @@ -144,7 +144,7 @@ export default class SetupController extends Controller.extend(ValidationEngine) _handleAuthenticationError(error) { if (error && error.payload && error.payload.errors) { - let [apiError] = error.payload.errors; + const [apiError] = error.payload.errors; this.set('flowErrors', [apiError.message, apiError.context].join(' ')); } else { // ignore React onboarding handoff diff --git a/apps/ember-admin/app/controllers/signin.js b/apps/ember-admin/app/controllers/signin.js index f3220f3d305..f08ad628702 100644 --- a/apps/ember-admin/app/controllers/signin.js +++ b/apps/ember-admin/app/controllers/signin.js @@ -57,7 +57,7 @@ export default class SigninController extends Controller.extend(ValidationEngine return SUCCESS; } catch (error) { if (isTwoFactorTokenRequiredError(error)) { - let errorCode = error.payload?.errors[0]?.code; + const errorCode = error.payload?.errors[0]?.code; // login was successful, but 2FA verification is required this.session.set('errorCode', errorCode); this.router.transitionTo('signin-verify'); @@ -72,7 +72,7 @@ export default class SigninController extends Controller.extend(ValidationEngine this.signin.errors.clear(); if (error && error.payload && error.payload.errors) { - let [mainError] = error.payload.errors; + const [mainError] = error.payload.errors; mainError.message = htmlSafe(mainError.message || ''); mainError.context = htmlSafe(mainError.context || ''); @@ -129,9 +129,9 @@ export default class SigninController extends Controller.extend(ValidationEngine @task *forgotPasswordTask() { - let email = this.signin.identification; - let forgottenUrl = this.ghostPaths.url.api('authentication', 'password_reset'); - let notifications = this.notifications; + const email = this.signin.identification; + const forgottenUrl = this.ghostPaths.url.api('authentication', 'password_reset'); + const notifications = this.notifications; this.flowErrors = ''; this.flowNotification = ''; @@ -156,7 +156,7 @@ export default class SigninController extends Controller.extend(ValidationEngine } if (error && error.payload && error.payload.errors && isEmberArray(error.payload.errors)) { - let [{message}] = error.payload.errors; + const [{message}] = error.payload.errors; this.flowErrors = message; diff --git a/apps/ember-admin/app/controllers/tag.js b/apps/ember-admin/app/controllers/tag.js index b933f31a1fe..ab95d11608e 100644 --- a/apps/ember-admin/app/controllers/tag.js +++ b/apps/ember-admin/app/controllers/tag.js @@ -39,7 +39,7 @@ export default class TagController extends Controller { @task({drop: true}) *saveTask() { - let {tag} = this; + const {tag} = this; try { if (tag.get('errors').length !== 0) { diff --git a/apps/ember-admin/app/decorators/inject.js b/apps/ember-admin/app/decorators/inject.js index 8de6018670b..45672df6796 100644 --- a/apps/ember-admin/app/decorators/inject.js +++ b/apps/ember-admin/app/decorators/inject.js @@ -2,7 +2,7 @@ import {computed, defineProperty} from '@ember/object'; import {getOwner} from '@ember/application'; function isElementDescriptor(args) { - let [maybeTarget, maybeKey, maybeDesc] = args; + const [maybeTarget, maybeKey, maybeDesc] = args; return ( // Ensure we have the right number of args diff --git a/apps/ember-admin/app/helpers/background-image-style.js b/apps/ember-admin/app/helpers/background-image-style.js index d9ab8d40d05..3bbcbb7f9c4 100644 --- a/apps/ember-admin/app/helpers/background-image-style.js +++ b/apps/ember-admin/app/helpers/background-image-style.js @@ -3,7 +3,7 @@ import {htmlSafe} from '@ember/template'; export function backgroundImageStyle([url]/*, hash*/) { if (url) { - let safeUrl = encodeURI(decodeURI(url)); + const safeUrl = encodeURI(decodeURI(url)); return htmlSafe(`background-image: url(${safeUrl});`); } diff --git a/apps/ember-admin/app/helpers/event-name.js b/apps/ember-admin/app/helpers/event-name.js index 35c656a85fa..b62656a74f9 100644 --- a/apps/ember-admin/app/helpers/event-name.js +++ b/apps/ember-admin/app/helpers/event-name.js @@ -38,7 +38,7 @@ export const AVAILABLE_EVENTS = [ ]; export function eventName([event]/*, hash*/) { - let match = AVAILABLE_EVENTS.findBy('event', event); + const match = AVAILABLE_EVENTS.findBy('event', event); return match ? match.name : event; } diff --git a/apps/ember-admin/app/helpers/gh-count-characters.js b/apps/ember-admin/app/helpers/gh-count-characters.js index 393dc9045e0..74e3072b4d7 100644 --- a/apps/ember-admin/app/helpers/gh-count-characters.js +++ b/apps/ember-admin/app/helpers/gh-count-characters.js @@ -6,12 +6,12 @@ export function countCharacters(params) { return; } - let el = document.createElement('span'); - let content = params[0] || ''; + const el = document.createElement('span'); + const content = params[0] || ''; // convert to array so that we get accurate symbol counts for multibyte chars // this will still count emoji+modifer as two chars - let {length} = Array.from(content); + const {length} = Array.from(content); el.className = 'word-count'; diff --git a/apps/ember-admin/app/helpers/gh-count-down-characters.js b/apps/ember-admin/app/helpers/gh-count-down-characters.js index 6f02bfd12e9..1b93673f100 100644 --- a/apps/ember-admin/app/helpers/gh-count-down-characters.js +++ b/apps/ember-admin/app/helpers/gh-count-down-characters.js @@ -6,12 +6,12 @@ export function countDownCharacters(params) { return; } - let el = document.createElement('span'); - let [content, maxCharacters] = params; + const el = document.createElement('span'); + const [content, maxCharacters] = params; // convert to array so that we get accurate symbol counts for multibyte chars // this will still count emoji+modifer as two chars - let {length} = Array.from(content || ''); + const {length} = Array.from(content || ''); el.className = 'word-count'; diff --git a/apps/ember-admin/app/helpers/gh-format-post-time.js b/apps/ember-admin/app/helpers/gh-format-post-time.js index c2a499b75dd..d7d09406190 100644 --- a/apps/ember-admin/app/helpers/gh-format-post-time.js +++ b/apps/ember-admin/app/helpers/gh-format-post-time.js @@ -9,13 +9,13 @@ export function formatPostTime(timeago, {timezone = 'etc/UTC', format, relative, return moment(timeago).from(moment.utc()); } - let time = moment.tz(timeago, timezone); + const time = moment.tz(timeago, timezone); if (format) { return time.format(format); } - let now = moment.tz(moment.utc(), timezone); + const now = moment.tz(moment.utc(), timezone); let utcOffset; if (time.utcOffset() === 0) { @@ -33,7 +33,7 @@ export function formatPostTime(timeago, {timezone = 'etc/UTC', format, relative, // If scheduled for or published on the same day, render the time + Today if (time.isSame(now, 'day')) { - let formatted = time.format(`HH:mm [${utcOffset}] [Today]`); + const formatted = time.format(`HH:mm [${utcOffset}] [Today]`); return scheduled ? `at ${formatted}` : formatted; } @@ -55,7 +55,7 @@ export function formatPostTime(timeago, {timezone = 'etc/UTC', format, relative, } // Else, render just the date if edited or published, or the time & date if scheduled - let f = scheduled ? `[at] HH:mm [${utcOffset}] [on] DD MMM YYYY` : (short ? `DD MMM YYYY` : `HH:mm [${utcOffset}] DD MMM YYYY`); + const f = scheduled ? `[at] HH:mm [${utcOffset}] [on] DD MMM YYYY` : (short ? `DD MMM YYYY` : `HH:mm [${utcOffset}] DD MMM YYYY`); return time.format(f); } diff --git a/apps/ember-admin/app/helpers/gh-pluralize.js b/apps/ember-admin/app/helpers/gh-pluralize.js index 09d6f617caa..734cf19bf2f 100644 --- a/apps/ember-admin/app/helpers/gh-pluralize.js +++ b/apps/ember-admin/app/helpers/gh-pluralize.js @@ -4,7 +4,7 @@ import {isBlank} from '@ember/utils'; import {pluralize} from 'ember-inflector'; export function ghPluralize(number, word, {withoutCount} = {}) { - let output = []; + const output = []; if (!isBlank(number) && withoutCount !== true) { output.push(formatNumber(number)); diff --git a/apps/ember-admin/app/helpers/gh-price-amount.js b/apps/ember-admin/app/helpers/gh-price-amount.js index 0bdcf8accc7..e0e6ed3c187 100644 --- a/apps/ember-admin/app/helpers/gh-price-amount.js +++ b/apps/ember-admin/app/helpers/gh-price-amount.js @@ -3,7 +3,7 @@ import {helper} from '@ember/component/helper'; export function ghPriceAmount(amount, {cents = true} = {}) { if (amount) { - let price = cents ? amount / 100 : Math.round(amount / 100); + const price = cents ? amount / 100 : Math.round(amount / 100); if (price % 1 === 0) { return formatNumber(price); } else { diff --git a/apps/ember-admin/app/helpers/highlighted-text.js b/apps/ember-admin/app/helpers/highlighted-text.js index f2512cc57ff..3050d8cda13 100644 --- a/apps/ember-admin/app/helpers/highlighted-text.js +++ b/apps/ember-admin/app/helpers/highlighted-text.js @@ -6,11 +6,11 @@ const {Handlebars} = Ember; export function highlightedText([text, termToHighlight]) { // replace any non-word character with an escaped character - let sanitisedTerm = termToHighlight.replace(new RegExp(/\W/ig), '\\$&'); - let termMatcher = new RegExp(sanitisedTerm, 'ig'); + const sanitisedTerm = termToHighlight.replace(new RegExp(/\W/ig), '\\$&'); + const termMatcher = new RegExp(sanitisedTerm, 'ig'); - let matches = text.match(termMatcher) || []; - let nonMatches = text.split(termMatcher); + const matches = text.match(termMatcher) || []; + const nonMatches = text.split(termMatcher); let htmlSafeResult = ''; diff --git a/apps/ember-admin/app/helpers/history-event-filter.js b/apps/ember-admin/app/helpers/history-event-filter.js index 2b09acdaace..e3760862998 100644 --- a/apps/ember-admin/app/helpers/history-event-filter.js +++ b/apps/ember-admin/app/helpers/history-event-filter.js @@ -19,7 +19,7 @@ export default class HistoryEventFilter extends Helper { excludedResources.forEach(type => excludedResourcesSet.add(type)); } - let filterParts = []; + const filterParts = []; const excludedEventsArray = Array.from(excludedEventsSet).reject(isBlank); if (excludedEventsArray.length > 0) { diff --git a/apps/ember-admin/app/helpers/humanize-recipient-filter.js b/apps/ember-admin/app/helpers/humanize-recipient-filter.js index 8b4d6a09417..0485cf81bde 100644 --- a/apps/ember-admin/app/helpers/humanize-recipient-filter.js +++ b/apps/ember-admin/app/helpers/humanize-recipient-filter.js @@ -11,7 +11,7 @@ export default helper(function humanizeRecipientFilter([filter = '']/*, hash*/) return 'All subscribers'; } - let outputParts = []; + const outputParts = []; if (parts.includes('status:free')) { outputParts.push('Free subscribers'); diff --git a/apps/ember-admin/app/helpers/integration-icon-style.js b/apps/ember-admin/app/helpers/integration-icon-style.js index 18a769e8893..627d3e493a6 100644 --- a/apps/ember-admin/app/helpers/integration-icon-style.js +++ b/apps/ember-admin/app/helpers/integration-icon-style.js @@ -3,7 +3,7 @@ import {htmlSafe} from '@ember/template'; export function integrationLogoStyle([integration]/*, hash*/) { if (integration.iconImage) { - let style = `background-image:url(${integration.iconImage});background-size:36px;`; + const style = `background-image:url(${integration.iconImage});background-size:36px;`; return htmlSafe(style); } } diff --git a/apps/ember-admin/app/helpers/members-event-filter.js b/apps/ember-admin/app/helpers/members-event-filter.js index 15dc531204a..2fca1ccf9a6 100644 --- a/apps/ember-admin/app/helpers/members-event-filter.js +++ b/apps/ember-admin/app/helpers/members-event-filter.js @@ -32,7 +32,7 @@ export default class MembersEventFilter extends Helper { excludedEvents.forEach(type => excludedEventsSet.add(type)); } - let filterParts = []; + const filterParts = []; const excludedEventsArray = Array.from(excludedEventsSet).reject(isBlank); diff --git a/apps/ember-admin/app/helpers/parse-member-event.js b/apps/ember-admin/app/helpers/parse-member-event.js index ef128e54ecc..040f9dddf82 100644 --- a/apps/ember-admin/app/helpers/parse-member-event.js +++ b/apps/ember-admin/app/helpers/parse-member-event.js @@ -390,7 +390,7 @@ export default class ParseMemberEventHelper extends Helper { getInfo(event) { if (event.type === 'subscription_event') { - let mrrDelta = getNonDecimal(event.data.mrr_delta, event.data.currency); + const mrrDelta = getNonDecimal(event.data.mrr_delta, event.data.currency); if (mrrDelta === 0) { return; } diff --git a/apps/ember-admin/app/helpers/split-number.js b/apps/ember-admin/app/helpers/split-number.js index 27c5d0bda75..95b2b6d2c1e 100644 --- a/apps/ember-admin/app/helpers/split-number.js +++ b/apps/ember-admin/app/helpers/split-number.js @@ -7,12 +7,12 @@ export function splitNumber([number, previousNumber]) { return 0; } - let formattedNewNumber = formatNumber(number); - let formattedOldNumber = formatNumber(previousNumber); + const formattedNewNumber = formatNumber(number); + const formattedOldNumber = formatNumber(previousNumber); - let oldChars = formattedOldNumber.split('').map(char => `${char}`).join(''); + const oldChars = formattedOldNumber.split('').map(char => `${char}`).join(''); - let newChars = formattedNewNumber.split('').map(char => `${char}`).join(''); + const newChars = formattedNewNumber.split('').map(char => `${char}`).join(''); return htmlSafe(`
${oldChars}
diff --git a/apps/ember-admin/app/initializers/ember-simple-auth.js b/apps/ember-admin/app/initializers/ember-simple-auth.js index be5c8b35d9e..72fc26b36a5 100644 --- a/apps/ember-admin/app/initializers/ember-simple-auth.js +++ b/apps/ember-admin/app/initializers/ember-simple-auth.js @@ -6,7 +6,7 @@ import setupSession from 'ember-simple-auth/initializers/setup-session'; export default { name: 'ember-simple-auth', initialize(registry) { - let config = ENV['ember-simple-auth'] || {}; + const config = ENV['ember-simple-auth'] || {}; config.rootURL = ghostPaths().adminRoot; Configuration.load(config); diff --git a/apps/ember-admin/app/initializers/trailing-hash.js b/apps/ember-admin/app/initializers/trailing-hash.js index e2b2dcc3bb9..70222ae222d 100644 --- a/apps/ember-admin/app/initializers/trailing-hash.js +++ b/apps/ember-admin/app/initializers/trailing-hash.js @@ -1,11 +1,11 @@ import HashLocation from '@ember/routing/hash-location'; import {inject as service} from '@ember/service'; -let trailingHash = HashLocation.extend({ +const trailingHash = HashLocation.extend({ unsavedChanges: service('unsaved-changes'), formatURL() { - let url = this._super(...arguments); + const url = this._super(...arguments); if (url.indexOf('?') > 0) { return url.replace(/([^/])\?/, '$1/?'); @@ -28,7 +28,7 @@ let trailingHash = HashLocation.extend({ return; } - let target = event.target.closest?.('a[href^="#/"]'); + const target = event.target.closest?.('a[href^="#/"]'); if (!target) { return; } @@ -36,7 +36,7 @@ let trailingHash = HashLocation.extend({ event.preventDefault(); event.stopPropagation(); - let href = target.getAttribute('href'); + const href = target.getAttribute('href'); this.unsavedChanges.confirmLeave().then((confirmed) => { if (confirmed) { diff --git a/apps/ember-admin/app/mixins/shortcuts.js b/apps/ember-admin/app/mixins/shortcuts.js index 8b5cdfe78b5..9dcab33952d 100644 --- a/apps/ember-admin/app/mixins/shortcuts.js +++ b/apps/ember-admin/app/mixins/shortcuts.js @@ -48,10 +48,10 @@ key.setScope('default'); export default Mixin.create({ registerShortcuts() { - let shortcuts = this.shortcuts; + const shortcuts = this.shortcuts; Object.keys(shortcuts).forEach((shortcut) => { - let scope = shortcuts[shortcut].scope || 'default'; + const scope = shortcuts[shortcut].scope || 'default'; let action = shortcuts[shortcut]; let options; @@ -73,10 +73,10 @@ export default Mixin.create({ }, removeShortcuts() { - let shortcuts = this.shortcuts; + const shortcuts = this.shortcuts; Object.keys(shortcuts).forEach((shortcut) => { - let scope = shortcuts[shortcut].scope || 'default'; + const scope = shortcuts[shortcut].scope || 'default'; shortcutsCache.unregister(shortcut); key.unbind(shortcut, scope); }); diff --git a/apps/ember-admin/app/mixins/text-input.js b/apps/ember-admin/app/mixins/text-input.js index e434ab805e7..7f4f33abd35 100644 --- a/apps/ember-admin/app/mixins/text-input.js +++ b/apps/ember-admin/app/mixins/text-input.js @@ -70,8 +70,8 @@ export default Mixin.create({ keyUp(event) { if (event.keyCode) { - let methodName = this._getMethodFromKeyCode(event.keyCode); - let method = this.get(`keyEvents.${methodName}`); + const methodName = this._getMethodFromKeyCode(event.keyCode); + const method = this.get(`keyEvents.${methodName}`); if (method) { method(event.target.value); } @@ -87,7 +87,7 @@ export default Mixin.create({ }, _getMethodFromKeyCode(keyCode) { - let methodName = keyCodes[keyCode.toString()]; + const methodName = keyCodes[keyCode.toString()]; return methodName; } }); diff --git a/apps/ember-admin/app/mixins/validation-engine.js b/apps/ember-admin/app/mixins/validation-engine.js index 1ba33f81362..d3a5d4aba6c 100644 --- a/apps/ember-admin/app/mixins/validation-engine.js +++ b/apps/ember-admin/app/mixins/validation-engine.js @@ -90,9 +90,6 @@ export default Mixin.create({ */ validate(opts) { let model = this; - let hasValidated, - type, - validator; opts = opts || {}; @@ -104,14 +101,13 @@ export default Mixin.create({ model = this.model; } - type = this.validationType || model.validationType; - validator = this.get(`validators.${type}`) || model.validators[type]; - hasValidated = this.hasValidated; + const type = this.validationType || model.validationType; + const validator = this.get(`validators.${type}`) || model.validators[type]; + const hasValidated = this.hasValidated; opts.validationType = type; return new RSVP.Promise((resolve, reject) => { - let passed; if (!type || !validator) { return reject([`The validator specified, "${type}", did not exist!`]); @@ -125,7 +121,7 @@ export default Mixin.create({ model.errors.clear(); } - passed = validator.check(model, opts.property); + const passed = validator.check(model, opts.property); return (passed) ? resolve() : reject(); }); @@ -137,7 +133,7 @@ export default Mixin.create({ * You can supply options to be passed into the `validate` method, since the ED `save` method takes no options. */ save(options) { - let {_super} = this; + const {_super} = this; options = options || {}; options.wasSave = true; diff --git a/apps/ember-admin/app/mixins/validation-state.js b/apps/ember-admin/app/mixins/validation-state.js index c7df1c07327..fe9493ff926 100644 --- a/apps/ember-admin/app/mixins/validation-state.js +++ b/apps/ember-admin/app/mixins/validation-state.js @@ -19,9 +19,9 @@ export default Mixin.create({ hasError: false, setHasError() { - let property = this.property; - let errors = this.errors; - let hasValidated = this.hasValidated; + const property = this.property; + const errors = this.errors; + const hasValidated = this.hasValidated; // if we aren't looking at a specific property we always want an error class if (!property && errors && !errors.get('isEmpty')) { diff --git a/apps/ember-admin/app/models/email.js b/apps/ember-admin/app/models/email.js index 4a3a390d7ae..40664fa98da 100644 --- a/apps/ember-admin/app/models/email.js +++ b/apps/ember-admin/app/models/email.js @@ -32,7 +32,7 @@ export default Model.extend({ isFailure: equal('status', 'failed'), openRate: computed('emailCount', 'openedCount', function () { - let {emailCount, openedCount} = this; + const {emailCount, openedCount} = this; if (emailCount === 0) { return 0; diff --git a/apps/ember-admin/app/models/invite.js b/apps/ember-admin/app/models/invite.js index 57ac9947dea..979e3632d9d 100644 --- a/apps/ember-admin/app/models/invite.js +++ b/apps/ember-admin/app/models/invite.js @@ -15,12 +15,12 @@ export default Model.extend({ ghostPaths: service(), resend() { - let inviteData = { + const inviteData = { email: this.email, role_id: this.role.id }; - let inviteUrl = this.get('ghostPaths.url').api('invites'); + const inviteUrl = this.get('ghostPaths.url').api('invites'); return this.ajax.del(`${inviteUrl}${this.id}`) .then(() => { diff --git a/apps/ember-admin/app/models/member.js b/apps/ember-admin/app/models/member.js index a1cccccc0ee..9e8ab9202cd 100644 --- a/apps/ember-admin/app/models/member.js +++ b/apps/ember-admin/app/models/member.js @@ -38,23 +38,23 @@ export default Model.extend(ValidationEngine, { // when returned from the server with ids. // https://github.com/emberjs/data/issues/1829 updateLabels() { - let labels = this.labels; - let oldLabels = labels.filterBy('id', null); + const labels = this.labels; + const oldLabels = labels.filterBy('id', null); labels.removeObjects(oldLabels); oldLabels.invoke('deleteRecord'); }, fetchSigninUrl: task(function* () { - let url = this.get('ghostPaths.url').api('members', this.id, 'signin_urls'); + const url = this.get('ghostPaths.url').api('members', this.id, 'signin_urls'); - let response = yield this.ajax.request(url); + const response = yield this.ajax.request(url); return response.member_signin_urls[0]; }).drop(), logoutAllDevices: task(function* () { - let url = this.get('ghostPaths.url').api('members', this.id, 'signout'); + const url = this.get('ghostPaths.url').api('members', this.id, 'signout'); yield this.ajax.post(url); }).drop() }); diff --git a/apps/ember-admin/app/models/navigation-item.js b/apps/ember-admin/app/models/navigation-item.js index 3c14db87c8c..958f64b81f5 100644 --- a/apps/ember-admin/app/models/navigation-item.js +++ b/apps/ember-admin/app/models/navigation-item.js @@ -13,13 +13,13 @@ export default EmberObject.extend(ValidationEngine, { validationType: 'navItem', isComplete: computed('label', 'url', 'icon', function () { - let {label, url, icon} = this; + const {label, url, icon} = this; return (!isBlank(label) || !isBlank(icon)) && !isBlank(url); }), isBlank: computed('label', 'url', 'icon', function () { - let {label, url, icon} = this; + const {label, url, icon} = this; return isBlank(label) && isBlank(url) && isBlank(icon); }) diff --git a/apps/ember-admin/app/models/post.js b/apps/ember-admin/app/models/post.js index b61faa128cf..d7dcf2c353c 100644 --- a/apps/ember-admin/app/models/post.js +++ b/apps/ember-admin/app/models/post.js @@ -17,8 +17,8 @@ const SEARCH_INDEXED_FIELDS = ['title', 'slug', 'status', 'visibility', 'publish const {Comparable} = Ember; function statusCompare(postA, postB) { - let status1 = postA.get('status'); - let status2 = postB.get('status'); + const status1 = postA.get('status'); + const status2 = postB.get('status'); // if any of those is empty if (!status1 && !status2) { @@ -49,8 +49,8 @@ function statusCompare(postA, postB) { } function publishedAtCompare(postA, postB) { - let published1 = postA.get('publishedAtUTC'); - let published2 = postB.get('publishedAtUTC'); + const published1 = postA.get('publishedAtUTC'); + const published2 = postB.get('publishedAtUTC'); if (!published1 && !published2) { return 0; @@ -229,10 +229,10 @@ export default Model.extend(Comparable, ValidationEngine, { }), previewUrl: computed('uuid', 'ghostPaths.url', 'config.blogUrl', function () { - let blogUrl = this.config.blogUrl; - let uuid = this.uuid; + const blogUrl = this.config.blogUrl; + const uuid = this.uuid; // routeKeywords.preview: 'p' - let previewKeyword = 'p'; + const previewKeyword = 'p'; // New posts don't have a preview if (!uuid) { return ''; @@ -257,7 +257,7 @@ export default Model.extend(Comparable, ValidationEngine, { return 'status:-free'; } if (this.visibility === 'tiers' && this.tiers) { - let filter = this.tiers.map((tier) => { + const filter = this.tiers.map((tier) => { return `tier:${tier.slug}`; }).join(','); return filter; @@ -278,9 +278,9 @@ export default Model.extend(Comparable, ValidationEngine, { // will only re-compute if this property is being observed elsewhere pastScheduledTime: computed('isScheduled', 'publishedAtUTC', 'clock.second', function () { if (this.isScheduled) { - let now = moment.utc(); - let publishedAtUTC = this.publishedAtUTC || now; - let pastScheduledTime = publishedAtUTC.diff(now, 'hours', true) < 0; + const now = moment.utc(); + const publishedAtUTC = this.publishedAtUTC || now; + const pastScheduledTime = publishedAtUTC.diff(now, 'hours', true) < 0; // force a recompute this.get('clock.second'); @@ -296,7 +296,7 @@ export default Model.extend(Comparable, ValidationEngine, { return this._getPublishedAtBlogTZ(); }, set(key, value) { - let momentValue = value ? moment(value) : null; + const momentValue = value ? moment(value) : null; this._setPublishedAtBlogStrings(momentValue); return this._getPublishedAtBlogTZ(); } @@ -314,17 +314,17 @@ export default Model.extend(Comparable, ValidationEngine, { }), _getPublishedAtBlogTZ() { - let publishedAtUTC = this.publishedAtUTC; - let publishedAtBlogDate = this.publishedAtBlogDate; - let publishedAtBlogTime = this.publishedAtBlogTime; - let blogTimezone = this.settings.timezone; + const publishedAtUTC = this.publishedAtUTC; + const publishedAtBlogDate = this.publishedAtBlogDate; + const publishedAtBlogTime = this.publishedAtBlogTime; + const blogTimezone = this.settings.timezone; if (!publishedAtUTC && isBlank(publishedAtBlogDate) && isBlank(publishedAtBlogTime)) { return null; } if (publishedAtBlogDate && publishedAtBlogTime) { - let publishedAtBlog = moment.tz(`${publishedAtBlogDate} ${publishedAtBlogTime}`, blogTimezone); + const publishedAtBlog = moment.tz(`${publishedAtBlogDate} ${publishedAtBlogTime}`, blogTimezone); /** * Note: @@ -352,14 +352,14 @@ export default Model.extend(Comparable, ValidationEngine, { // TODO: is there a better way to handle this? // eslint-disable-next-line ghost/ember/no-observers _setPublishedAtBlogTZ: on('init', observer('publishedAtUTC', 'settings.timezone', function () { - let publishedAtUTC = this.publishedAtUTC; + const publishedAtUTC = this.publishedAtUTC; this._setPublishedAtBlogStrings(publishedAtUTC); })), _setPublishedAtBlogStrings(momentDate) { if (momentDate) { - let blogTimezone = this.settings.timezone; - let publishedAtBlog = moment.tz(momentDate, blogTimezone); + const blogTimezone = this.settings.timezone; + const publishedAtBlog = moment.tz(momentDate, blogTimezone); this.set('publishedAtBlogDate', publishedAtBlog.format('YYYY-MM-DD')); this.set('publishedAtBlogTime', publishedAtBlog.format('HH:mm')); @@ -374,8 +374,8 @@ export default Model.extend(Comparable, ValidationEngine, { // when returned from the server with ids. // https://github.com/emberjs/data/issues/1829 updateTags() { - let tags = this.tags; - let oldTags = tags.filterBy('id', null); + const tags = this.tags; + const oldTags = tags.filterBy('id', null); tags.removeObjects(oldTags); oldTags.invoke('deleteRecord'); @@ -391,12 +391,8 @@ export default Model.extend(Comparable, ValidationEngine, { // updatedAt: DESC // id: DESC compare(postA, postB) { - let updated1 = postA.get('updatedAtUTC'); - let updated2 = postB.get('updatedAtUTC'); - let idResult, - publishedAtResult, - statusResult, - updatedAtResult; + const updated1 = postA.get('updatedAtUTC'); + const updated2 = postB.get('updatedAtUTC'); // when `updatedAt` is undefined, the model is still // being written to with the results from the server @@ -409,10 +405,10 @@ export default Model.extend(Comparable, ValidationEngine, { } // TODO: revisit the ID sorting because we no longer have auto-incrementing IDs - idResult = compare(postA.get('id'), postB.get('id')); - statusResult = statusCompare(postA, postB); - updatedAtResult = compare(updated1.valueOf(), updated2.valueOf()); - publishedAtResult = publishedAtCompare(postA, postB); + const idResult = compare(postA.get('id'), postB.get('id')); + const statusResult = statusCompare(postA, postB); + const updatedAtResult = compare(updated1.valueOf(), updated2.valueOf()); + const publishedAtResult = publishedAtCompare(postA, postB); if (statusResult === 0) { if (publishedAtResult === 0) { @@ -436,8 +432,8 @@ export default Model.extend(Comparable, ValidationEngine, { // the publishedAtBlog{Date/Time} strings are set separately so they can be // validated, grab that time if it exists and set the publishedAtUTC beforeSave() { - let publishedAtBlogTZ = this.publishedAtBlogTZ; - let publishedAtUTC = publishedAtBlogTZ ? publishedAtBlogTZ.utc() : null; + const publishedAtBlogTZ = this.publishedAtBlogTZ; + const publishedAtUTC = publishedAtBlogTZ ? publishedAtBlogTZ.utc() : null; this.set('publishedAtUTC', publishedAtUTC); }, diff --git a/apps/ember-admin/app/models/tag.js b/apps/ember-admin/app/models/tag.js index ac3257171a0..2fe0ceb241e 100644 --- a/apps/ember-admin/app/models/tag.js +++ b/apps/ember-admin/app/models/tag.js @@ -36,7 +36,7 @@ export default Model.extend(ValidationEngine, { feature: service(), updateVisibility() { - let internalRegex = /^#.?/; + const internalRegex = /^#.?/; this.set('visibility', internalRegex.test(this.name) ? 'internal' : 'public'); }, diff --git a/apps/ember-admin/app/models/theme.js b/apps/ember-admin/app/models/theme.js index 4797d8f2af3..80bb12eff3d 100644 --- a/apps/ember-admin/app/models/theme.js +++ b/apps/ember-admin/app/models/theme.js @@ -11,7 +11,7 @@ export default Model.extend({ warnings: attr('raw', {defaultValue: () => []}), customTemplates: computed('templates.[]', function () { - let templates = this.templates || []; + const templates = this.templates || []; return templates.filter(function (template) { return isBlank(template.slug); @@ -19,7 +19,7 @@ export default Model.extend({ }), slugTemplates: computed('templates.[]', function () { - let templates = this.templates || []; + const templates = this.templates || []; return templates.filter(function (template) { return !isBlank(template.slug); diff --git a/apps/ember-admin/app/models/tier-benefit-item.js b/apps/ember-admin/app/models/tier-benefit-item.js index 8303d8f2aad..ac38926c26f 100644 --- a/apps/ember-admin/app/models/tier-benefit-item.js +++ b/apps/ember-admin/app/models/tier-benefit-item.js @@ -9,13 +9,13 @@ export default EmberObject.extend(ValidationEngine, { validationType: 'tierBenefitItem', isComplete: computed('name', function () { - let {name} = this; + const {name} = this; return !isBlank(name); }), isBlank: computed('name', function () { - let {name} = this; + const {name} = this; return isBlank(name); }) diff --git a/apps/ember-admin/app/models/user.js b/apps/ember-admin/app/models/user.js index 1690681a937..15d7f123dc9 100644 --- a/apps/ember-admin/app/models/user.js +++ b/apps/ember-admin/app/models/user.js @@ -98,15 +98,15 @@ export default BaseModel.extend(ValidationEngine, { profileImageUrl: computed('profileImage', function () { // keep path separate so asset rewriting correctly picks it up - let defaultImage = '/img/user-image.png'; - let defaultPath = prefixAssetUrl(`assets${defaultImage}`); + const defaultImage = '/img/user-image.png'; + const defaultPath = prefixAssetUrl(`assets${defaultImage}`); return this.profileImage || defaultPath; }), coverImageUrl: computed('coverImage', function () { // keep path separate so asset rewriting correctly picks it up - let defaultImage = '/img/user-cover.png'; - let defaultPath = prefixAssetUrl(`assets${defaultImage}`); + const defaultImage = '/img/user-cover.png'; + const defaultPath = prefixAssetUrl(`assets${defaultImage}`); return this.coverImage || defaultPath; }), @@ -121,7 +121,7 @@ export default BaseModel.extend(ValidationEngine, { } try { - let url = this.ghostPaths.url.api('users', 'password'); + const url = this.ghostPaths.url.api('users', 'password'); yield this.ajax.put(url, { data: { diff --git a/apps/ember-admin/app/modifiers/ratio-zoom.js b/apps/ember-admin/app/modifiers/ratio-zoom.js index 97d85f82d16..36ce4981b02 100644 --- a/apps/ember-admin/app/modifiers/ratio-zoom.js +++ b/apps/ember-admin/app/modifiers/ratio-zoom.js @@ -33,12 +33,12 @@ export default class RatioZoom extends Modifier { const offsets = element.getBoundingClientRect(); - let maxHeight = { + const maxHeight = { width: offsets.height / ratio, height: offsets.height }; - let maxWidth = { + const maxWidth = { width: offsets.width, height: offsets.width * ratio }; diff --git a/apps/ember-admin/app/routes/application.js b/apps/ember-admin/app/routes/application.js index 68d59a2de1a..c0ec9863380 100644 --- a/apps/ember-admin/app/routes/application.js +++ b/apps/ember-admin/app/routes/application.js @@ -36,7 +36,6 @@ function isAutomationsUrl(url) { } function setupAutomationsSessionReplay(replay, shouldStartRecording) { - let initialRouteCheck; let removeNavigationListener; let recordingStarted = false; @@ -95,12 +94,12 @@ function setupAutomationsSessionReplay(replay, shouldStartRecording) { // Replay defers its sampling initialization during Sentry.init(). Queue the // initial route check behind it to avoid starting a second rrweb recorder. - initialRouteCheck = setTimeout(() => maybeStartRecording(window.location.href)); + const initialRouteCheck = setTimeout(() => maybeStartRecording(window.location.href)); return teardown; } -let shortcuts = {}; +const shortcuts = {}; shortcuts.esc = {action: 'closeMenus', scope: 'default'}; shortcuts[`${ctrlOrCmd}+s`] = {action: 'save', scope: 'all'}; diff --git a/apps/ember-admin/app/routes/lexical-editor.js b/apps/ember-admin/app/routes/lexical-editor.js index 2e7a4311a52..bed69359a57 100644 --- a/apps/ember-admin/app/routes/lexical-editor.js +++ b/apps/ember-admin/app/routes/lexical-editor.js @@ -9,7 +9,7 @@ import {inject as service} from '@ember/service'; * @returns {string} Query string including the leading `?`, or an empty string. */ function buildQueryString(queryParams = {}) { - let searchParams = new URLSearchParams(); + const searchParams = new URLSearchParams(); Object.entries(queryParams).forEach(([key, value]) => { if (value === undefined || value === null || value === '') { @@ -26,7 +26,7 @@ function buildQueryString(queryParams = {}) { searchParams.append(key, `${value}`); }); - let queryString = searchParams.toString(); + const queryString = searchParams.toString(); return queryString ? `?${queryString}` : ''; } @@ -37,24 +37,24 @@ function buildQueryString(queryParams = {}) { * @returns {string|false} Analytics path when available, otherwise `false`. */ function buildAnalyticsSourcePath(transition, model) { - let fromPath = transition?.from?.params?.path; - let queryString = buildQueryString(transition?.from?.queryParams); + const fromPath = transition?.from?.params?.path; + const queryString = buildQueryString(transition?.from?.queryParams); - let postMatch = fromPath?.match(/^posts\/analytics\/([^/]+)(?:\/(.+))?$/); + const postMatch = fromPath?.match(/^posts\/analytics\/([^/]+)(?:\/(.+))?$/); if (postMatch) { - let postId = postMatch[1] || model?.id; + const postId = postMatch[1] || model?.id; if (!postId) { return false; } - let sub = postMatch[2]; - let basePath = sub ? `/posts/analytics/${postId}/${sub}` : `/posts/analytics/${postId}`; + const sub = postMatch[2]; + const basePath = sub ? `/posts/analytics/${postId}/${sub}` : `/posts/analytics/${postId}`; return `${basePath}${queryString}`; } - let statsMatch = fromPath?.match(/^analytics(?:\/(.+))?$/); + const statsMatch = fromPath?.match(/^analytics(?:\/(.+))?$/); if (statsMatch) { - let sub = statsMatch[1]; - let basePath = sub ? `/analytics/${sub}` : '/analytics'; + const sub = statsMatch[1]; + const basePath = sub ? `/analytics/${sub}` : '/analytics'; return `${basePath}${queryString}`; } @@ -218,7 +218,7 @@ export default AuthenticatedRoute.extend({ }, _blurAndScheduleAction(func) { - let selectedElement = $(document.activeElement); + const selectedElement = $(document.activeElement); // TODO: we should trigger a blur for textareas as well as text inputs if (selectedElement.is('input[type="text"]')) { diff --git a/apps/ember-admin/app/routes/lexical-editor/edit.js b/apps/ember-admin/app/routes/lexical-editor/edit.js index ee84312433c..b777320804f 100644 --- a/apps/ember-admin/app/routes/lexical-editor/edit.js +++ b/apps/ember-admin/app/routes/lexical-editor/edit.js @@ -12,7 +12,7 @@ export default class EditRoute extends AuthenticatedRoute { // if the transition is not new->edit, reset the post on the controller // so that the editor view is cleared before showing the loading state if (transition.urlMethod !== 'replace') { - let editor = this.controllerFor('lexical-editor'); + const editor = this.controllerFor('lexical-editor'); editor.set('post', null); editor.reset(); } @@ -20,13 +20,13 @@ export default class EditRoute extends AuthenticatedRoute { async model(params) { // eslint-disable-next-line camelcase - let {type: modelName, post_id} = params; + const {type: modelName, post_id} = params; if (!['post', 'page'].includes(modelName)) { throw new NotFoundError(); } - let query = { + const query = { // eslint-disable-next-line camelcase id: post_id, // we need to explicitly request post_revisions which means we need @@ -74,7 +74,7 @@ export default class EditRoute extends AuthenticatedRoute { // there's no specific controller for this route, instead all editor // handling is done on the editor route/controller setupController(controller, post) { - let editor = this.controllerFor('lexical-editor'); + const editor = this.controllerFor('lexical-editor'); editor.setPost(post); } } diff --git a/apps/ember-admin/app/routes/lexical-editor/new.js b/apps/ember-admin/app/routes/lexical-editor/new.js index a655849c91b..f95b50d943a 100644 --- a/apps/ember-admin/app/routes/lexical-editor/new.js +++ b/apps/ember-admin/app/routes/lexical-editor/new.js @@ -7,7 +7,7 @@ import {scheduleOnce} from '@ember/runloop'; export default class NewRoute extends AuthenticatedRoute { model(params) { - let {type: modelName} = params; + const {type: modelName} = params; if (!['post','page'].includes(modelName)) { throw new NotFoundError(); @@ -25,7 +25,7 @@ export default class NewRoute extends AuthenticatedRoute { console.error('New post route did not generate a new model'); // eslint-disable-line no-console } - let editor = this.controllerFor('lexical-editor'); + const editor = this.controllerFor('lexical-editor'); editor.setPost(newPost); } diff --git a/apps/ember-admin/app/routes/posts.js b/apps/ember-admin/app/routes/posts.js index 19052b2ea73..56204aab0ef 100644 --- a/apps/ember-admin/app/routes/posts.js +++ b/apps/ember-admin/app/routes/posts.js @@ -63,7 +63,7 @@ export default class PostsRoute extends AuthenticatedRoute { // see https://github.com/TryGhost/Ghost/issues/11057 this.router.on('routeWillChange', (transition) => { if (transition.to && (this.routeName === 'posts' || this.routeName === 'pages')) { - let toThisRoute = transition.to.find(route => route.name === this.routeName); + const toThisRoute = transition.to.find(route => route.name === this.routeName); if (transition.from && transition.from.name === this.routeName && toThisRoute) { transition.method('replace'); } @@ -187,8 +187,8 @@ export default class PostsRoute extends AuthenticatedRoute { } const user = this.session.user; - let filterParams = {tag: params.tag, visibility: params.visibility}; - let paginationParams = { + const filterParams = {tag: params.tag, visibility: params.visibility}; + const paginationParams = { perPageParam: 'limit', totalPagesParam: 'meta.pagination.pages' }; @@ -210,18 +210,18 @@ export default class PostsRoute extends AuthenticatedRoute { filterParams.authors = params.author; } - let perPage = this.perPage; + const perPage = this.perPage; const filterStatuses = filterParams.status; - let queryParams = {allFilter: this._filterString({...filterParams})}; // pass along the parent filter so it's easier to apply the params filter to each infinity model - let models = {}; + const queryParams = {allFilter: this._filterString({...filterParams})}; // pass along the parent filter so it's easier to apply the params filter to each infinity model + const models = {}; if (filterStatuses.includes('scheduled')) { - let scheduledInfinityModelParams = {...queryParams, order: params.order || 'published_at desc', filter: this._filterString({...filterParams, status: 'scheduled'})}; + const scheduledInfinityModelParams = {...queryParams, order: params.order || 'published_at desc', filter: this._filterString({...filterParams, status: 'scheduled'})}; models.scheduledInfinityModel = this.infinity.model(this.modelName, assign({perPage, startingPage: 1}, paginationParams, scheduledInfinityModelParams)); } if (filterStatuses.includes('draft')) { - let draftInfinityModelParams = {...queryParams, order: params.order || 'updated_at desc', filter: this._filterString({...filterParams, status: 'draft'})}; + const draftInfinityModelParams = {...queryParams, order: params.order || 'updated_at desc', filter: this._filterString({...filterParams, status: 'draft'})}; models.draftInfinityModel = this.infinity.model(this.modelName, assign({perPage, startingPage: 1}, paginationParams, draftInfinityModelParams)); } if (filterStatuses.includes('published') || filterStatuses.includes('sent')) { @@ -302,7 +302,7 @@ export default class PostsRoute extends AuthenticatedRoute { @action queryParamsDidChange() { // scroll back to the top - let contentList = document.querySelector('.content-list'); + const contentList = document.querySelector('.content-list'); if (contentList) { contentList.scrollTop = 0; } @@ -347,7 +347,7 @@ export default class PostsRoute extends AuthenticatedRoute { _filterString(filter) { return Object.keys(filter).map((key) => { - let value = filter[key]; + const value = filter[key]; if (!isBlank(value)) { return `${key}:${filter[key]}`; diff --git a/apps/ember-admin/app/routes/posts/debug.js b/apps/ember-admin/app/routes/posts/debug.js index 38a4f061665..305e87e0985 100644 --- a/apps/ember-admin/app/routes/posts/debug.js +++ b/apps/ember-admin/app/routes/posts/debug.js @@ -3,9 +3,9 @@ import {pluralize} from 'ember-inflector'; export default class Debug extends AuthenticatedRoute { model(params) { - let {post_id: id} = params; + const {post_id: id} = params; - let query = { + const query = { id, include: [ 'tags', diff --git a/apps/ember-admin/app/routes/pro.js b/apps/ember-admin/app/routes/pro.js index 92905a8d31d..b79569f38ca 100644 --- a/apps/ember-admin/app/routes/pro.js +++ b/apps/ember-admin/app/routes/pro.js @@ -34,7 +34,7 @@ export default class ProRoute extends AuthenticatedRoute { let isBillingTransition = false; if (transition) { - let destinationUrl = (typeof transition.to === 'string') + const destinationUrl = (typeof transition.to === 'string') ? transition.to : (transition.intent ? transition.intent.url diff --git a/apps/ember-admin/app/routes/setup.js b/apps/ember-admin/app/routes/setup.js index 1b19c9482a8..681c42838e2 100644 --- a/apps/ember-admin/app/routes/setup.js +++ b/apps/ember-admin/app/routes/setup.js @@ -18,17 +18,17 @@ export default class SetupRoute extends Route { return this.transitionTo('index'); } - let authUrl = this.ghostPaths.url.api('authentication', 'setup'); + const authUrl = this.ghostPaths.url.api('authentication', 'setup'); // check the state of the setup process via the API return this.ajax.request(authUrl) .then((result) => { - let [setup] = result.setup; + const [setup] = result.setup; if (setup.status) { return this.transitionTo('signin'); } else { - let controller = this.controllerFor('setup'); + const controller = this.controllerFor('setup'); if (setup.title) { controller.set('blogTitle', setup.title.replace(/'/gim, '\'')); } diff --git a/apps/ember-admin/app/routes/signup.js b/apps/ember-admin/app/routes/signup.js index e875c1dc601..6ffffe146a6 100644 --- a/apps/ember-admin/app/routes/signup.js +++ b/apps/ember-admin/app/routes/signup.js @@ -36,8 +36,8 @@ export default class SignupRoute extends UnauthenticatedRoute { } model(params) { - let signupDetails = SignupDetails.create(); - let re = /^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2}|[A-Za-z0-9_-]{3})?$/; + const signupDetails = SignupDetails.create(); + const re = /^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2}|[A-Za-z0-9_-]{3})?$/; let email, tokenText; @@ -55,7 +55,7 @@ export default class SignupRoute extends UnauthenticatedRoute { signupDetails.email = email; signupDetails.token = params.token; - let authUrl = this.ghostPaths.url.api('authentication', 'invitation'); + const authUrl = this.ghostPaths.url.api('authentication', 'invitation'); this.ajax.request(authUrl, { dataType: 'json', diff --git a/apps/ember-admin/app/routes/unauthenticated.js b/apps/ember-admin/app/routes/unauthenticated.js index e02ac4269f9..afc42d1de9c 100644 --- a/apps/ember-admin/app/routes/unauthenticated.js +++ b/apps/ember-admin/app/routes/unauthenticated.js @@ -7,11 +7,11 @@ export default class UnauthenticatedRoute extends Route { @service session; beforeModel() { - let authUrl = this.ghostPaths.url.api('authentication', 'setup'); + const authUrl = this.ghostPaths.url.api('authentication', 'setup'); // check the state of the setup process via the API return this.ajax.request(authUrl).then((result) => { - let [setup] = result.setup; + const [setup] = result.setup; if (setup.status !== true) { this.transitionTo('setup'); diff --git a/apps/ember-admin/app/serializers/application.js b/apps/ember-admin/app/serializers/application.js index d671258b534..1b1d65bb3a0 100644 --- a/apps/ember-admin/app/serializers/application.js +++ b/apps/ember-admin/app/serializers/application.js @@ -8,7 +8,7 @@ export default class Application extends RESTSerializer { // TODO: review once the record links and meta RFC lands // https://github.com/emberjs/rfcs/blob/master/text/0332-ember-data-record-links-and-meta.md extractMeta(store, typeClass) { - let meta = super.extractMeta(...arguments); + const meta = super.extractMeta(...arguments); typeClass.___meta = meta; return meta; } @@ -19,8 +19,8 @@ export default class Application extends RESTSerializer { options.includeId = true; // We have a plural root in the API - let root = pluralize(type.modelName); - let data = this.serialize(record, options); + const root = pluralize(type.modelName); + const data = this.serialize(record, options); hash[root] = [data]; } @@ -30,10 +30,10 @@ export default class Application extends RESTSerializer { } keyForRelationship(key, typeClass, method) { - let transform = method === 'serialize' ? underscore : camelize; + const transform = method === 'serialize' ? underscore : camelize; if (typeClass === 'belongsTo' && !key.match(/(Id|By)$/)) { - let transformed = `${transform(key)}_id`; + const transformed = `${transform(key)}_id`; return transformed; } diff --git a/apps/ember-admin/app/serializers/label.js b/apps/ember-admin/app/serializers/label.js index 4373a0806c8..57613fa4449 100644 --- a/apps/ember-admin/app/serializers/label.js +++ b/apps/ember-admin/app/serializers/label.js @@ -8,7 +8,7 @@ export default class LabelSerializer extends ApplicationSerializer { }; serialize(/*snapshot, options*/) { - let json = super.serialize(...arguments); + const json = super.serialize(...arguments); // Properties that exist on the model but we don't want sent in the payload delete json.count; @@ -20,8 +20,8 @@ export default class LabelSerializer extends ApplicationSerializer { // DS.SERIALIZER.REST.QUERYRECORD-ARRAY-RESPONSE deprecations normalizeResponse(store, primaryModelClass, payload, id, requestType) { if (requestType === 'queryRecord') { - let singular = primaryModelClass.modelName; - let plural = pluralize(singular); + const singular = primaryModelClass.modelName; + const plural = pluralize(singular); if (payload[plural]) { payload[singular] = payload[plural][0]; diff --git a/apps/ember-admin/app/serializers/member.js b/apps/ember-admin/app/serializers/member.js index 5eb2b2082dc..d9d1ace4e12 100644 --- a/apps/ember-admin/app/serializers/member.js +++ b/apps/ember-admin/app/serializers/member.js @@ -10,7 +10,7 @@ export default class MemberSerializer extends ApplicationSerializer.extend(Embed }; serialize(/*snapshot, options*/) { - let json = super.serialize(...arguments); + const json = super.serialize(...arguments); // Properties that exist on the model but we don't want sent in the payload delete json.stripe; diff --git a/apps/ember-admin/app/serializers/page.js b/apps/ember-admin/app/serializers/page.js index 0d45ebfe29a..aa6d7604e41 100644 --- a/apps/ember-admin/app/serializers/page.js +++ b/apps/ember-admin/app/serializers/page.js @@ -2,7 +2,7 @@ import PostSerializer from './post'; export default class Page extends PostSerializer { serialize() { - let json = super.serialize(...arguments); + const json = super.serialize(...arguments); // Properties that exist on the model but we don't want sent in the payload delete json.email_subject; diff --git a/apps/ember-admin/app/serializers/post.js b/apps/ember-admin/app/serializers/post.js index d5686a1ee18..e4a815e6346 100644 --- a/apps/ember-admin/app/serializers/post.js +++ b/apps/ember-admin/app/serializers/post.js @@ -15,7 +15,7 @@ export default class PostSerializer extends ApplicationSerializer.extend(Embedde }; serialize(snapshot/*, options*/) { - let json = super.serialize(...arguments); + const json = super.serialize(...arguments); // Inserted locally as a convenience. delete json.author_id; diff --git a/apps/ember-admin/app/serializers/setting.js b/apps/ember-admin/app/serializers/setting.js index 1e0b3d873bf..716e4014957 100644 --- a/apps/ember-admin/app/serializers/setting.js +++ b/apps/ember-admin/app/serializers/setting.js @@ -7,10 +7,10 @@ export default class Setting extends ApplicationSerializer { options = options || {}; options.includeId = false; - let root = pluralize(type.modelName); - let data = Object.keys(record.record.changedAttributes()).length > 0 ? + const root = pluralize(type.modelName); + const data = Object.keys(record.record.changedAttributes()).length > 0 ? this.serialize(record, options) : []; - let payload = []; + const payload = []; delete data.id; delete data._meta; @@ -37,17 +37,17 @@ export default class Setting extends ApplicationSerializer { } normalizeArrayResponse(store, primaryModelClass, _payload, id, requestType) { - let payload = {settings: [this._extractObjectFromArrayPayload(_payload)]}; + const payload = {settings: [this._extractObjectFromArrayPayload(_payload)]}; return super.normalizeArrayResponse(store, primaryModelClass, payload, id, requestType); } normalizeSingleResponse(store, primaryModelClass, _payload, id, requestType) { - let payload = {setting: this._extractObjectFromArrayPayload(_payload)}; + const payload = {setting: this._extractObjectFromArrayPayload(_payload)}; return super.normalizeSingleResponse(store, primaryModelClass, payload, id, requestType); } _extractObjectFromArrayPayload(_payload) { - let payload = {id: '0'}; + const payload = {id: '0'}; _payload.settings.forEach((setting) => { payload[setting.key] = setting.value; diff --git a/apps/ember-admin/app/serializers/tag.js b/apps/ember-admin/app/serializers/tag.js index 01a9ae82fbb..95f6d9ca40b 100644 --- a/apps/ember-admin/app/serializers/tag.js +++ b/apps/ember-admin/app/serializers/tag.js @@ -8,7 +8,7 @@ export default class TagSerializer extends ApplicationSerializer { }; serialize(/*snapshot, options*/) { - let json = super.serialize(...arguments); + const json = super.serialize(...arguments); // Properties that exist on the model but we don't want sent in the payload delete json.count; @@ -21,8 +21,8 @@ export default class TagSerializer extends ApplicationSerializer { // DS.SERIALIZER.REST.QUERYRECORD-ARRAY-RESPONSE deprecations normalizeResponse(store, primaryModelClass, payload, id, requestType) { if (requestType === 'queryRecord') { - let singular = primaryModelClass.modelName; - let plural = pluralize(singular); + const singular = primaryModelClass.modelName; + const plural = pluralize(singular); if (payload[plural]) { payload[singular] = payload[plural][0]; diff --git a/apps/ember-admin/app/serializers/tier.js b/apps/ember-admin/app/serializers/tier.js index e4d07463c94..cf3f3d48d04 100644 --- a/apps/ember-admin/app/serializers/tier.js +++ b/apps/ember-admin/app/serializers/tier.js @@ -2,7 +2,7 @@ import ApplicationSerializer from './application'; export default class TierSerializer extends ApplicationSerializer { serialize() { - let json = super.serialize(...arguments); + const json = super.serialize(...arguments); if (json?.monthly_price) { json.monthly_price = Math.round(json.monthly_price); diff --git a/apps/ember-admin/app/serializers/user.js b/apps/ember-admin/app/serializers/user.js index bd7bde45694..8d5bfc8bf29 100644 --- a/apps/ember-admin/app/serializers/user.js +++ b/apps/ember-admin/app/serializers/user.js @@ -11,8 +11,8 @@ export default class UserSerializer extends ApplicationSerializer.extend(Embedde }; extractSingle(store, primaryType, payload) { - let root = this.keyForAttribute(primaryType.modelName); - let pluralizedRoot = pluralize(primaryType.modelName); + const root = this.keyForAttribute(primaryType.modelName); + const pluralizedRoot = pluralize(primaryType.modelName); payload[root] = payload[pluralizedRoot][0]; delete payload[pluralizedRoot]; diff --git a/apps/ember-admin/app/services/ajax.js b/apps/ember-admin/app/services/ajax.js index dd29de4bca7..58578b27240 100644 --- a/apps/ember-admin/app/services/ajax.js +++ b/apps/ember-admin/app/services/ajax.js @@ -275,7 +275,7 @@ class ajaxService extends AjaxService { let success = false; let errorName = null; let attempts = 0; - let startTime = new Date(); + const startTime = new Date(); let retryingMs = 0; const maxRetryingMs = 15_000; const retryPeriods = [500, 1000]; @@ -361,10 +361,10 @@ class ajaxService extends AjaxService { return new AcceptedResponse(payload); } - let isGhostRequest = GHOST_REQUEST.test(request.url); - let isAuthenticated = this.get('session.isAuthenticated'); - let isUnauthorized = this.isUnauthorizedError(status, headers, payload); - let isForbidden = isForbiddenError(status, headers, payload); + const isGhostRequest = GHOST_REQUEST.test(request.url); + const isAuthenticated = this.get('session.isAuthenticated'); + const isUnauthorized = this.isUnauthorizedError(status, headers, payload); + const isForbidden = isForbiddenError(status, headers, payload); // used when reporting connection errors, helps distinguish CDN if (isGhostRequest) { diff --git a/apps/ember-admin/app/services/clock.js b/apps/ember-admin/app/services/clock.js index bbbfe70fc02..d6ed80fd5a0 100644 --- a/apps/ember-admin/app/services/clock.js +++ b/apps/ember-admin/app/services/clock.js @@ -20,7 +20,7 @@ export default class ClockService extends Service { } tick() { - let now = moment().utc(); + const now = moment().utc(); this.setProperties({ second: now.seconds(), diff --git a/apps/ember-admin/app/services/config-manager.js b/apps/ember-admin/app/services/config-manager.js index dd6c6da2746..534fb60cbbc 100644 --- a/apps/ember-admin/app/services/config-manager.js +++ b/apps/ember-admin/app/services/config-manager.js @@ -15,7 +15,7 @@ export default class ConfigManagerService extends Service { isConfigLoaded = false; fetch() { - let promises = []; + const promises = []; promises.push(this.fetchUnauthenticated()); diff --git a/apps/ember-admin/app/services/custom-views.js b/apps/ember-admin/app/services/custom-views.js index 865e203c90a..8161b1075ea 100644 --- a/apps/ember-admin/app/services/custom-views.js +++ b/apps/ember-admin/app/services/custom-views.js @@ -77,16 +77,16 @@ const DEFAULT_VIEWS = [{ return CustomView.create(Object.assign({}, view, {isDefault: true})); }); -let isFilterEqual = function (filterA, filterB) { - let aProps = Object.getOwnPropertyNames(filterA); - let bProps = Object.getOwnPropertyNames(filterB); +const isFilterEqual = function (filterA, filterB) { + const aProps = Object.getOwnPropertyNames(filterA); + const bProps = Object.getOwnPropertyNames(filterB); if (aProps.length !== bProps.length) { return false; } for (let i = 0; i < aProps.length; i++) { - let key = aProps[i]; + const key = aProps[i]; if (filterA[key] !== filterB[key]) { return false; } @@ -95,7 +95,7 @@ let isFilterEqual = function (filterA, filterB) { return true; }; -let isViewEqual = function (viewA, viewB) { +const isViewEqual = function (viewA, viewB) { return viewA.route === viewB.route && isFilterEqual(viewA.filter, viewB.filter); }; @@ -107,7 +107,7 @@ export default class CustomViewsService extends Service { @service settings; get viewList() { - let {settings, session} = this; + const {settings, session} = this; // avoid fetching user before authenticated otherwise the 403 can fire // during authentication and cause errors during setup/signin @@ -140,7 +140,7 @@ export default class CustomViewsService extends Service { const {viewList} = this; // perform some ad-hoc validation of duplicate names because ValidationEngine doesn't support it - let duplicateView = viewList.find((existingView) => { + const duplicateView = viewList.find((existingView) => { return existingView.route === view.route && existingView.name.trim().toLowerCase() === view.name.trim().toLowerCase() && !isFilterEqual(existingView.filter, view.filter); @@ -155,7 +155,7 @@ export default class CustomViewsService extends Service { // remove an older version of the view from our views list // - we don't allow editing the filter and route+filter combos are unique // - we create a new instance of a view from an existing one when editing to act as a "scratch" view - let matchingView = viewList.find(existingView => isViewEqual(existingView, view)); + const matchingView = viewList.find(existingView => isViewEqual(existingView, view)); if (matchingView) { viewList.replace(viewList.indexOf(matchingView), 1, [view]); } else { @@ -172,7 +172,7 @@ export default class CustomViewsService extends Service { @task *deleteViewTask(view) { const {viewList} = this; - let matchingView = viewList.find(existingView => isViewEqual(existingView, view)); + const matchingView = viewList.find(existingView => isViewEqual(existingView, view)); if (matchingView && !matchingView.isDefault) { viewList.removeObject(matchingView); yield this._saveViewSettings(viewList); @@ -201,7 +201,7 @@ export default class CustomViewsService extends Service { } findView(routeName, queryParams) { - let _routeName = routeName.replace(/_loading$/, ''); + const _routeName = routeName.replace(/_loading$/, ''); return this.viewList.find((view) => { return view.route === _routeName && isFilterEqual(this.cleanFilter(view.filter), queryParams); @@ -244,7 +244,7 @@ export default class CustomViewsService extends Service { } async _saveViewSettings(viewList) { - let sharedViews = viewList.reject(view => view.isDefault).map(view => view.toJSON()); + const sharedViews = viewList.reject(view => view.isDefault).map(view => view.toJSON()); this.settings.sharedViews = JSON.stringify(sharedViews); return this.settings.save(); } diff --git a/apps/ember-admin/app/services/dropdown.js b/apps/ember-admin/app/services/dropdown.js index e8b5122873d..29d346d475f 100644 --- a/apps/ember-admin/app/services/dropdown.js +++ b/apps/ember-admin/app/services/dropdown.js @@ -9,7 +9,7 @@ import {action} from '@ember/object'; @classic export default class DropdownService extends Service.extend(Evented, BodyEventListener) { bodyClick(event) { - let dropdownSelector = '.ember-basic-dropdown-trigger, .ember-basic-dropdown-content'; + const dropdownSelector = '.ember-basic-dropdown-trigger, .ember-basic-dropdown-content'; if ($(event.target).closest(dropdownSelector).length <= 0) { this.closeDropdowns(); diff --git a/apps/ember-admin/app/services/feature.js b/apps/ember-admin/app/services/feature.js index ccfa42b589e..393b1df792f 100644 --- a/apps/ember-admin/app/services/feature.js +++ b/apps/ember-admin/app/services/feature.js @@ -19,8 +19,8 @@ function getStoredFeatureFlagOverrides() { } export function feature(name, options = {}) { - let {user, onChange} = options; - let watchedProps = user + const {user, onChange} = options; + const watchedProps = user ? [`accessibility.${name}`] : [`config.${name}`, `labs.${name}`, '_featureFlagOverridesRevision']; @@ -79,7 +79,7 @@ export default class FeatureService extends Service { @computed('_nightShiftPref', '_osPrefersDark') get nightShift() { - let preference = this._nightShiftPref; + const preference = this._nightShiftPref; if (preference === 'system') { return this._osPrefersDark; @@ -115,7 +115,7 @@ export default class FeatureService extends Service { @computed('settings.labs') get labs() { - let labs = this.settings.labs; + const labs = this.settings.labs; try { return JSON.parse(labs) || {}; @@ -126,7 +126,7 @@ export default class FeatureService extends Service { @computed('_user.accessibility') get accessibility() { - let accessibility = this.get('_user.accessibility'); + const accessibility = this.get('_user.accessibility'); try { return JSON.parse(accessibility) || {}; @@ -143,9 +143,9 @@ export default class FeatureService extends Service { } update(key, value, options = {}) { - let serviceProperty = options.user ? 'accessibility' : 'labs'; - let model = this.get(options.user ? '_user' : 'settings'); - let featureObject = this.get(serviceProperty); + const serviceProperty = options.user ? 'accessibility' : 'labs'; + const model = this.get(options.user ? '_user' : 'settings'); + const featureObject = this.get(serviceProperty); // set the new key value for either the labs property or the accessibility property set(featureObject, key, value); @@ -213,7 +213,7 @@ export default class FeatureService extends Service { }; if (mode === 'system') { - let mediaQuery = this._getSystemThemeMediaQuery(); + const mediaQuery = this._getSystemThemeMediaQuery(); isDark = mediaQuery?.matches ?? false; set(this, '_osPrefersDark', isDark); diff --git a/apps/ember-admin/app/services/lazy-loader.js b/apps/ember-admin/app/services/lazy-loader.js index 31cee7d56a9..fb929afe505 100644 --- a/apps/ember-admin/app/services/lazy-loader.js +++ b/apps/ember-admin/app/services/lazy-loader.js @@ -31,13 +31,13 @@ export default class LazyLoaderService extends Service { return this.scriptPromises[key]; } - let scriptPromise = new RSVP.Promise((resolve, reject) => { - let script = document.createElement('script'); + const scriptPromise = new RSVP.Promise((resolve, reject) => { + const script = document.createElement('script'); script.type = 'text/javascript'; script.async = true; script.src = prefixAssetUrl(url); - let el = document.getElementsByTagName('script')[0]; + const el = document.getElementsByTagName('script')[0]; el.parentNode.insertBefore(script, el); script.addEventListener('load', () => { @@ -60,7 +60,7 @@ export default class LazyLoaderService extends Service { } return new RSVP.Promise((resolve, reject) => { - let link = document.createElement('link'); + const link = document.createElement('link'); link.id = `${key}-styles`; link.rel = alternate ? 'alternate stylesheet' : 'stylesheet'; link.href = prefixAssetUrl(url); diff --git a/apps/ember-admin/app/services/limit.js b/apps/ember-admin/app/services/limit.js index cab5a728d32..4585d68715a 100644 --- a/apps/ember-admin/app/services/limit.js +++ b/apps/ember-admin/app/services/limit.js @@ -43,7 +43,7 @@ export default class LimitsService extends Service { } loadLimits() { - let limits = this.config.hostSettings?.limits; + const limits = this.config.hostSettings?.limits; if (!limits) { return; diff --git a/apps/ember-admin/app/services/local-revisions.js b/apps/ember-admin/app/services/local-revisions.js index 93219db427c..b946ab5ade7 100644 --- a/apps/ember-admin/app/services/local-revisions.js +++ b/apps/ember-admin/app/services/local-revisions.js @@ -225,14 +225,14 @@ export default class LocalRevisionsService extends Service { async restore(key) { try { const revision = this.find(key); - let authors = []; + const authors = []; if (revision.authors) { for (const author of revision.authors) { const authorModel = await this.store.queryRecord('user', {id: author.id}); authors.push(authorModel); } } - let post = this.store.createRecord('post', { + const post = this.store.createRecord('post', { title: `(Restored) ${revision.title}`, lexical: revision.lexical, authors, diff --git a/apps/ember-admin/app/services/members-stats.js b/apps/ember-admin/app/services/members-stats.js index adce6ae9b03..e1530188e4d 100644 --- a/apps/ember-admin/app/services/members-stats.js +++ b/apps/ember-admin/app/services/members-stats.js @@ -19,7 +19,7 @@ export default class MembersStatsService extends Service { @tracked totalMemberCount = null; get memberCount() { - let stats = this.totalMemberCount; + const stats = this.totalMemberCount; if (!stats) { return 0; } @@ -29,8 +29,8 @@ export default class MembersStatsService extends Service { } fetch() { - let daysChanged = this._lastFetchedDays !== this.days; - let staleData = this._lastFetched && (new Date() - this._lastFetched) > ONE_MINUTE; + const daysChanged = this._lastFetchedDays !== this.days; + const staleData = this._lastFetched && (new Date() - this._lastFetched) > ONE_MINUTE; // return existing stats unless data is > 1 min old or days param has changed if (this.stats && !this._forceRefresh && !daysChanged && !staleData && this._fetchTask.last) { @@ -41,7 +41,7 @@ export default class MembersStatsService extends Service { } fetchCounts() { - let staleData = this._lastFetchedCounts && (new Date() - this._lastFetchedCounts) > ONE_MINUTE; + const staleData = this._lastFetchedCounts && (new Date() - this._lastFetchedCounts) > ONE_MINUTE; // return existing stats unless data is > 1 min old if (this.countStats && !this._forceRefresh && !staleData && this._fetchCountsTask.last) { @@ -58,7 +58,7 @@ export default class MembersStatsService extends Service { } // return existing stats unless data is > 1 min old - let staleData = this._lastFetchedMemberCounts && (new Date() - this._lastFetchedMemberCounts) > ONE_MINUTE; + const staleData = this._lastFetchedMemberCounts && (new Date() - this._lastFetchedMemberCounts) > ONE_MINUTE; if (this.totalMemberCount && !this._forceRefresh && !staleData && this._fetchMemberCountsTask.last) { return this._fetchMemberCountsTask.last; } @@ -67,7 +67,7 @@ export default class MembersStatsService extends Service { } fetchNewsletterStats() { - let staleData = this._lastFetchedNewsletterStats && (new Date() - this._lastFetchedNewsletterStats) > ONE_MINUTE; + const staleData = this._lastFetchedNewsletterStats && (new Date() - this._lastFetchedNewsletterStats) > ONE_MINUTE; // return existing stats unless data is > 1 min old if (this.newsletterStats && !this._forceRefresh && !staleData && this._fetchNewsletterStatsTask.last) { @@ -80,7 +80,7 @@ export default class MembersStatsService extends Service { fillDates(data = []) { let currentRangeDate = moment().subtract(30, 'days'); - let endDate = moment().add(1, 'hour'); + const endDate = moment().add(1, 'hour'); const output = {}; const firstDateInRangeIndex = data.findIndex((val) => { @@ -96,7 +96,7 @@ export default class MembersStatsService extends Service { let lastVal = initialDateInRangeVal ? initialDateInRangeVal.value : 0; while (currentRangeDate.isBefore(endDate)) { - let dateStr = currentRangeDate.format('YYYY-MM-DD'); + const dateStr = currentRangeDate.format('YYYY-MM-DD'); const dataOnDate = data.find(d => d.date === dateStr); output[dateStr] = dataOnDate ? dataOnDate.value : lastVal; lastVal = output[dateStr]; @@ -108,7 +108,7 @@ export default class MembersStatsService extends Service { fillCountDates(data = {}) { let currentRangeDate = moment().subtract(30, 'days'); - let endDate = moment().add(1, 'hour'); + const endDate = moment().add(1, 'hour'); const output = {}; const firstDateInRangeIndex = data.findIndex((val) => { return moment(val.date).isAfter(currentRangeDate); @@ -128,7 +128,7 @@ export default class MembersStatsService extends Service { total: initialDateInRangeVal ? (initialDateInRangeVal.paid + initialDateInRangeVal.free + initialDateInRangeVal.comped + initialDateInRangeVal.gift) : 0 }; while (currentRangeDate.isBefore(endDate)) { - let dateStr = currentRangeDate.format('YYYY-MM-DD'); + const dateStr = currentRangeDate.format('YYYY-MM-DD'); const dataOnDate = data.find(d => d.date === dateStr); output[dateStr] = dataOnDate ? { paid: dataOnDate.paid, @@ -144,7 +144,7 @@ export default class MembersStatsService extends Service { } fetchMRR() { - let staleData = this._lastFetchedMRR && (new Date() - this._lastFetchedMRR) > ONE_MINUTE; + const staleData = this._lastFetchedMRR && (new Date() - this._lastFetchedMRR) > ONE_MINUTE; // return existing stats unless data is > 1 min old if (this.mrrStats && !this._forceRefresh && !staleData && this._fetchMRRTask) { @@ -161,7 +161,7 @@ export default class MembersStatsService extends Service { @task *_fetchNewsletterStatsTask() { const limit = 5; - let query = { + const query = { filter: 'email_count:-0', order: 'submitted_at desc', limit: limit @@ -198,8 +198,8 @@ export default class MembersStatsService extends Service { *_fetchCountsTask() { this._lastFetchedCounts = new Date(); - let statsUrl = this.ghostPaths.url.api('members/stats/count'); - let stats = yield this.ajax.request(statsUrl); + const statsUrl = this.ghostPaths.url.api('members/stats/count'); + const stats = yield this.ajax.request(statsUrl); this.countStats = stats; return stats; } @@ -208,8 +208,8 @@ export default class MembersStatsService extends Service { *_fetchMemberCountsTask() { this._lastFetchedMemberCounts = new Date(); - let statsUrl = this.ghostPaths.url.api('stats/member_count/'); - let stats = yield this.ajax.request(statsUrl); + const statsUrl = this.ghostPaths.url.api('stats/member_count/'); + const stats = yield this.ajax.request(statsUrl); this.totalMemberCount = stats; return stats; } @@ -218,22 +218,22 @@ export default class MembersStatsService extends Service { *_fetchMRRTask() { this._lastFetchedMRR = new Date(); - let statsUrl = this.ghostPaths.url.api('members/stats/mrr'); - let stats = yield this.ajax.request(statsUrl); + const statsUrl = this.ghostPaths.url.api('members/stats/mrr'); + const stats = yield this.ajax.request(statsUrl); this.mrrStats = stats; return stats; } @task *_fetchTask() { - let {days} = this; + const {days} = this; this._lastFetchedDays = days; this._lastFetched = new Date(); this._forceRefresh = false; - let statsUrl = this.ghostPaths.url.api('members/stats'); - let stats = yield this.ajax.request(statsUrl, {data: {days}}); + const statsUrl = this.ghostPaths.url.api('members/stats'); + const stats = yield this.ajax.request(statsUrl, {data: {days}}); this.stats = stats; return stats; } diff --git a/apps/ember-admin/app/services/migrate.js b/apps/ember-admin/app/services/migrate.js index 7d080487c04..7c21e5f830d 100644 --- a/apps/ember-admin/app/services/migrate.js +++ b/apps/ember-admin/app/services/migrate.js @@ -45,7 +45,7 @@ export default class MigrateService extends Service { const theKey = await this.apiKey(); const theOwner = await this.billing.getOwnerUser(); - let payload = { + const payload = { apiUrl: this.apiUrl, apiKey: theKey, stripe: this.isStripeConnected, diff --git a/apps/ember-admin/app/services/notifications.js b/apps/ember-admin/app/services/notifications.js index 2393826a54d..72134cffe7a 100644 --- a/apps/ember-admin/app/services/notifications.js +++ b/apps/ember-admin/app/services/notifications.js @@ -83,9 +83,9 @@ export default class NotificationsService extends Service { } // close existing alerts/notifications which have the same text to avoid stacking - let newText = message.message.string || message.message; + const newText = message.message.string || message.message; this.content = new TrackedArray(this.content.reject((notification) => { - let existingText = notification.message.string || notification.message; + const existingText = notification.message.string || notification.message; return existingText === newText; })); @@ -225,7 +225,7 @@ export default class NotificationsService extends Service { } closeNotification(notification) { - let content = this.content; + const content = this.content; if (notification.constructor.modelName === 'notification') { notification.deleteRecord(); @@ -251,15 +251,15 @@ export default class NotificationsService extends Service { _removeItems(status, key) { if (key) { - let keyBase = this._getKeyBase(key); + const keyBase = this._getKeyBase(key); // TODO: keys should only have . special char but we should // probably use a better regexp escaping function/polyfill - let escapedKeyBase = keyBase.replace('.', '\\.'); - let keyRegex = new RegExp(`^${escapedKeyBase}`); + const escapedKeyBase = keyBase.replace('.', '\\.'); + const keyRegex = new RegExp(`^${escapedKeyBase}`); this.content = new TrackedArray(this.content.reject((item) => { - let itemKey = item.key; - let itemStatus = item.status; + const itemKey = item.key; + const itemStatus = item.status; return itemStatus === status && (itemKey && itemKey.match(keyRegex)); })); diff --git a/apps/ember-admin/app/services/session.js b/apps/ember-admin/app/services/session.js index 54570743e28..10ca02f2615 100644 --- a/apps/ember-admin/app/services/session.js +++ b/apps/ember-admin/app/services/session.js @@ -157,7 +157,7 @@ export default class SessionService extends ESASessionService { } handleInvalidation() { - let transition = this.appLoadTransition; + const transition = this.appLoadTransition; if (transition) { transition.send('authorizationFailed'); diff --git a/apps/ember-admin/app/services/slug-generator.js b/apps/ember-admin/app/services/slug-generator.js index e77481274a1..fb4e1ddb16f 100644 --- a/apps/ember-admin/app/services/slug-generator.js +++ b/apps/ember-admin/app/services/slug-generator.js @@ -18,7 +18,7 @@ export default class SlugGeneratorService extends Service { } // We already do a partial slugify at the client side to prevent issues with Pro returning a 404 page because of invalid (encoded) characters (a newline, %0A, for example) - let name = encodeURIComponent(slugify(textToSlugify)); + const name = encodeURIComponent(slugify(textToSlugify)); if (modelId) { url = this.get('ghostPaths.url').api('slugs', slugType, name, modelId); } else { @@ -26,8 +26,8 @@ export default class SlugGeneratorService extends Service { } return this.ajax.request(url).then((response) => { - let [firstSlug] = response.slugs; - let {slug} = firstSlug; + const [firstSlug] = response.slugs; + const {slug} = firstSlug; return slug; }); diff --git a/apps/ember-admin/app/services/state-bridge.js b/apps/ember-admin/app/services/state-bridge.js index f815f14bad3..3c405a69afe 100644 --- a/apps/ember-admin/app/services/state-bridge.js +++ b/apps/ember-admin/app/services/state-bridge.js @@ -316,7 +316,7 @@ export default class StateBridgeService extends Service.extend(Evented) { @action isRouteActive(routeNames, queryParams) { - let currentRouteName = this.router.currentRouteName?.replace(/_loading$/, '') || ''; + const currentRouteName = this.router.currentRouteName?.replace(/_loading$/, '') || ''; // Normalize routeNames to an array const routes = Array.isArray(routeNames) ? routeNames : routeNames.split(' '); @@ -363,7 +363,7 @@ export default class StateBridgeService extends Service.extend(Evented) { } const params = {}; - for (let param of controller.queryParams) { + for (const param of controller.queryParams) { let controllerKey, urlKey; if (typeof param === 'string') { diff --git a/apps/ember-admin/app/services/ui.js b/apps/ember-admin/app/services/ui.js index 916667c8463..d247841d6c2 100644 --- a/apps/ember-admin/app/services/ui.js +++ b/apps/ember-admin/app/services/ui.js @@ -27,8 +27,8 @@ function collectMetadataClasses(transition, prop) { } function updateBodyClasses(transition) { - let {body} = document; - let {oldClasses, newClasses} = collectMetadataClasses(transition, 'bodyClasses'); + const {body} = document; + const {oldClasses, newClasses} = collectMetadataClasses(transition, 'bodyClasses'); oldClasses.forEach((oldClass) => { body.classList.remove(oldClass); @@ -95,7 +95,7 @@ export default class UiService extends Service { this.updateDocumentTitle(); - let {newClasses: mainClasses} = collectMetadataClasses(transition, 'mainClasses'); + const {newClasses: mainClasses} = collectMetadataClasses(transition, 'mainClasses'); this.mainClass = mainClasses.join(' '); }); } @@ -113,7 +113,7 @@ export default class UiService extends Service { @action updateDocumentTitle() { let {currentRoute} = this.router; - let tokens = []; + const tokens = []; while (currentRoute) { let titleToken = get(currentRoute, 'metadata.titleToken'); @@ -129,7 +129,7 @@ export default class UiService extends Service { currentRoute = currentRoute.parent; } - let blogTitle = this.config.blogTitle; + const blogTitle = this.config.blogTitle; window.document.title = `Ghost Admin - ${blogTitle}`; } diff --git a/apps/ember-admin/app/services/unsaved-changes.js b/apps/ember-admin/app/services/unsaved-changes.js index c52c89ad7fc..f883e2e1fa6 100644 --- a/apps/ember-admin/app/services/unsaved-changes.js +++ b/apps/ember-admin/app/services/unsaved-changes.js @@ -15,7 +15,7 @@ export default class UnsavedChangesService extends Service { } register({isDirty, confirmLeave}) { - let token = Symbol('unsaved-changes'); + const token = Symbol('unsaved-changes'); this._registration = {token, isDirty, confirmLeave}; this._confirmPromise = null; diff --git a/apps/ember-admin/app/services/unsplash.js b/apps/ember-admin/app/services/unsplash.js index cdd1d3ba09a..c0ebbabe80c 100644 --- a/apps/ember-admin/app/services/unsplash.js +++ b/apps/ember-admin/app/services/unsplash.js @@ -97,7 +97,7 @@ export default Service.extend({ _loadingTasks: taskGroup().drop(), _loadNew: task(function* () { - let url = `${API_URL}/photos?per_page=30`; + const url = `${API_URL}/photos?per_page=30`; yield this._makeRequest(url); }).group('_loadingTasks'), @@ -112,7 +112,7 @@ export default Service.extend({ _search: task(function* (term) { yield timeout(DEBOUNCE_MS); - let url = `${API_URL}/search/photos?query=${term}&per_page=30`; + const url = `${API_URL}/search/photos?query=${term}&per_page=30`; yield this._makeRequest(url, {searchTermAtRequest: term}); }).restartable(), @@ -123,7 +123,7 @@ export default Service.extend({ return; } - let photos = response.results || response; + const photos = response.results || response; photos.forEach(photo => this._addPhoto(photo)); }, @@ -140,8 +140,8 @@ export default Service.extend({ }, _addPhotoToColumns(photo) { - let min = Math.min(...this._columnHeights); - let columnIndex = this._columnHeights.indexOf(min); + const min = Math.min(...this._columnHeights); + const columnIndex = this._columnHeights.indexOf(min); // use a fixed width when calculating height to compensate for different // overall image sizes @@ -156,8 +156,8 @@ export default Service.extend({ }, _resetColumns() { - let columns = []; - let columnHeights = []; + const columns = []; + const columnHeights = []; // pre-fill column arrays based on columnCount for (let i = 0; i < this.columnCount; i += 1) { @@ -176,9 +176,9 @@ export default Service.extend({ }, _makeRequest(url, _options = {}) { - let defaultOptions = {ignoreErrors: false}; - let headers = {}; - let options = {}; + const defaultOptions = {ignoreErrors: false}; + const headers = {}; + const options = {}; assign(options, defaultOptions, _options); @@ -233,7 +233,7 @@ export default Service.extend({ this.set('error', errorText); // throw error to prevent further processing - let error = new Error(errorText); + const error = new Error(errorText); error.response = response; throw error; }); @@ -244,13 +244,13 @@ export default Service.extend({ return response; } - let pagination = {}; - let linkRegex = new RegExp('<(.*)>; rel="(.*)"'); - let {link: links} = response.headers.map; + const pagination = {}; + const linkRegex = new RegExp('<(.*)>; rel="(.*)"'); + const {link: links} = response.headers.map; if (links) { links.split(',').forEach((link) => { - let [, url, rel] = linkRegex.exec(link); + const [, url, rel] = linkRegex.exec(link); pagination[rel] = url; }); diff --git a/apps/ember-admin/app/services/upgrade-status.js b/apps/ember-admin/app/services/upgrade-status.js index 9cec9691368..46f782512ee 100644 --- a/apps/ember-admin/app/services/upgrade-status.js +++ b/apps/ember-admin/app/services/upgrade-status.js @@ -13,7 +13,7 @@ export default class UpgradeStatusService extends Service { // called when notifications are fetched during app boot for notifications // where the `location` is not 'top' and `custom` is false handleUpgradeNotification(notification) { - let message = get(notification, 'message'); + const message = get(notification, 'message'); set(this, 'message', htmlSafe(message)); } diff --git a/apps/ember-admin/app/session-stores/application.js b/apps/ember-admin/app/session-stores/application.js index d47001d6042..3f7d0b17eff 100644 --- a/apps/ember-admin/app/session-stores/application.js +++ b/apps/ember-admin/app/session-stores/application.js @@ -15,7 +15,7 @@ export default class ApplicationStore extends EphemeralStore { return this.session.populateUser().then(() => { // provide the necessary data for internal-session to mark the // session as authenticated - let data = {authenticated: {authenticator: 'authenticator:cookie'}}; + const data = {authenticated: {authenticator: 'authenticator:cookie'}}; this.persist(data); return data; }).catch(() => { diff --git a/apps/ember-admin/app/transforms/facebook-url-user.js b/apps/ember-admin/app/transforms/facebook-url-user.js index 93200e6dd9b..20f835655c5 100644 --- a/apps/ember-admin/app/transforms/facebook-url-user.js +++ b/apps/ember-admin/app/transforms/facebook-url-user.js @@ -3,7 +3,7 @@ import Transform from '@ember-data/serializer/transform'; export default class FacebookUrlUser extends Transform { deserialize(serialized) { if (serialized) { - let [, user] = serialized.match(/(\S+)/) || []; + const [, user] = serialized.match(/(\S+)/) || []; return `https://www.facebook.com/${user}`; } @@ -12,7 +12,7 @@ export default class FacebookUrlUser extends Transform { serialize(deserialized) { if (deserialized) { - let [, user] = deserialized.match(/(?:https:\/\/)(?:www\.)(?:facebook\.com)\/(?:#!\/)?(\w+\/?\S+)/mi) || []; + const [, user] = deserialized.match(/(?:https:\/\/)(?:www\.)(?:facebook\.com)\/(?:#!\/)?(\w+\/?\S+)/mi) || []; return user; } diff --git a/apps/ember-admin/app/transforms/json-string.js b/apps/ember-admin/app/transforms/json-string.js index f20dc04e35a..8ab92184141 100644 --- a/apps/ember-admin/app/transforms/json-string.js +++ b/apps/ember-admin/app/transforms/json-string.js @@ -2,7 +2,7 @@ import Transform from '@ember-data/serializer/transform'; export default class JsonString extends Transform { deserialize(serialized) { - let _serialized = serialized === '' ? null : serialized; + const _serialized = serialized === '' ? null : serialized; return JSON.parse(_serialized); } diff --git a/apps/ember-admin/app/transforms/member-subscription.js b/apps/ember-admin/app/transforms/member-subscription.js index 2093078c051..9790915f93a 100644 --- a/apps/ember-admin/app/transforms/member-subscription.js +++ b/apps/ember-admin/app/transforms/member-subscription.js @@ -4,11 +4,10 @@ import {A as emberA, isArray as isEmberArray} from '@ember/array'; export default class MemberSubscriptionTransform extends Transform { deserialize(serialized) { - let subscriptions, subscriptionArray; - subscriptionArray = serialized || []; + const subscriptionArray = serialized || []; - subscriptions = subscriptionArray.map(itemDetails => MemberSubscription.create(itemDetails)); + const subscriptions = subscriptionArray.map(itemDetails => MemberSubscription.create(itemDetails)); return emberA(subscriptions); } diff --git a/apps/ember-admin/app/transforms/member-tier.js b/apps/ember-admin/app/transforms/member-tier.js index 3e38eb44466..02f449edc6d 100644 --- a/apps/ember-admin/app/transforms/member-tier.js +++ b/apps/ember-admin/app/transforms/member-tier.js @@ -4,11 +4,10 @@ import {A as emberA, isArray as isEmberArray} from '@ember/array'; export default class MemberTierTransform extends Transform { deserialize(serialized) { - let subscriptions, subscriptionArray; - subscriptionArray = serialized || []; + const subscriptionArray = serialized || []; - subscriptions = subscriptionArray.map(itemDetails => MemberTier.create(itemDetails)); + const subscriptions = subscriptionArray.map(itemDetails => MemberTier.create(itemDetails)); return emberA(subscriptions); } diff --git a/apps/ember-admin/app/transforms/navigation-settings.js b/apps/ember-admin/app/transforms/navigation-settings.js index 0c84465fb63..4fcf85e36df 100644 --- a/apps/ember-admin/app/transforms/navigation-settings.js +++ b/apps/ember-admin/app/transforms/navigation-settings.js @@ -4,7 +4,7 @@ import {A as emberA, isArray as isEmberArray} from '@ember/array'; export default class NavigationSettings extends Transform { deserialize(serialized, options) { - let navItems, settingsArray; + let settingsArray; try { settingsArray = JSON.parse(serialized) || []; @@ -12,7 +12,7 @@ export default class NavigationSettings extends Transform { settingsArray = []; } - navItems = settingsArray.map((itemDetails) => { + const navItems = settingsArray.map((itemDetails) => { itemDetails.isSecondary = options && options.isSecondary || false; return NavigationItem.create(itemDetails); }); @@ -25,10 +25,10 @@ export default class NavigationSettings extends Transform { if (isEmberArray(deserialized)) { settingsArray = deserialized.map((item) => { - let label = item.label.trim(); - let url = item.url.trim(); - let icon = item.icon && item.icon.trim(); - let visibility = item.visibility || 'public'; + const label = item.label.trim(); + const url = item.url.trim(); + const icon = item.icon && item.icon.trim(); + const visibility = item.visibility || 'public'; return { label, diff --git a/apps/ember-admin/app/transforms/tier-benefits.js b/apps/ember-admin/app/transforms/tier-benefits.js index 7b19a959d68..4ddffe78d27 100644 --- a/apps/ember-admin/app/transforms/tier-benefits.js +++ b/apps/ember-admin/app/transforms/tier-benefits.js @@ -4,11 +4,10 @@ import {A as emberA, isArray as isEmberArray} from '@ember/array'; export default class TierBenefits extends Transform { deserialize(serialized) { - let benefitsItems, benefitsArray; - benefitsArray = serialized || []; + const benefitsArray = serialized || []; - benefitsItems = benefitsArray.map((itemDetails) => { + const benefitsItems = benefitsArray.map((itemDetails) => { return TierBenefitItem.create({name: itemDetails}); }); @@ -20,7 +19,7 @@ export default class TierBenefits extends Transform { if (isEmberArray(deserialized)) { benefitsArray = deserialized.map((item) => { - let name = item.get('name').trim(); + const name = item.get('name').trim(); return name; }).compact(); } else { diff --git a/apps/ember-admin/app/transforms/twitter-url-user.js b/apps/ember-admin/app/transforms/twitter-url-user.js index f9ce35fb343..a86d511ad93 100644 --- a/apps/ember-admin/app/transforms/twitter-url-user.js +++ b/apps/ember-admin/app/transforms/twitter-url-user.js @@ -3,7 +3,7 @@ import Transform from '@ember-data/serializer/transform'; export default class TwitterUrlUser extends Transform { deserialize(serialized) { if (serialized) { - let [, user] = serialized.match(/@?([^/]*)/) || []; + const [, user] = serialized.match(/@?([^/]*)/) || []; return `https://twitter.com/${user}`; } @@ -12,7 +12,7 @@ export default class TwitterUrlUser extends Transform { serialize(deserialized) { if (deserialized) { - let [, user] = deserialized.match(/(?:https:\/\/)(?:twitter\.com)\/(?:#!\/)?@?([^/]*)/) || []; + const [, user] = deserialized.match(/(?:https:\/\/)(?:twitter\.com)\/(?:#!\/)?@?([^/]*)/) || []; return `@${user}`; } diff --git a/apps/ember-admin/app/transitions/wormhole.js b/apps/ember-admin/app/transitions/wormhole.js index 80dc07a4e87..9b436328ab0 100644 --- a/apps/ember-admin/app/transitions/wormhole.js +++ b/apps/ember-admin/app/transitions/wormhole.js @@ -12,7 +12,7 @@ export default function () { return wormhole.apply(this, arguments).finally(() => { if (this.newElement && newWormholeElement) { - let autofocusElem = newWormholeElement[0].querySelector('[autofocus]'); + const autofocusElem = newWormholeElement[0].querySelector('[autofocus]'); if (autofocusElem) { autofocusElem.focus(); } diff --git a/apps/ember-admin/app/utils/caja-sanitizers.js b/apps/ember-admin/app/utils/caja-sanitizers.js index 5ba2e7afbab..42200f63944 100644 --- a/apps/ember-admin/app/utils/caja-sanitizers.js +++ b/apps/ember-admin/app/utils/caja-sanitizers.js @@ -7,7 +7,7 @@ * URLs are allowed if they start with http://, https://, or /. * NOTE: # urls are not allowed as clicking them will break the editor when clicked */ -let allowedUrl = function (url) { +const allowedUrl = function (url) { url = url.toString().replace(/['"]+/g, ''); if (/^https?:\/\//.test(url) || /^\//.test(url)) { return url; @@ -18,7 +18,7 @@ let allowedUrl = function (url) { * Check if ID is allowed * All ids are allowed at the moment. */ -let allowedId = function (id) { +const allowedId = function (id) { return id; }; diff --git a/apps/ember-admin/app/utils/ghost-paths.js b/apps/ember-admin/app/utils/ghost-paths.js index 2f2315b37d1..e724b8e9a86 100644 --- a/apps/ember-admin/app/utils/ghost-paths.js +++ b/apps/ember-admin/app/utils/ghost-paths.js @@ -1,7 +1,7 @@ -let makeRoute = function (root, args) { - let slashAtStart = /^\//; - let slashAtEnd = /\/$/; - let parts = Array.prototype.slice.call(args, 0); +const makeRoute = function (root, args) { + const slashAtStart = /^\//; + const slashAtEnd = /\/$/; + const parts = Array.prototype.slice.call(args, 0); let route = root.replace(slashAtEnd, ''); parts.forEach((part) => { @@ -14,12 +14,12 @@ let makeRoute = function (root, args) { }; export default function () { - let path = window.location.pathname; - let subdir = path.substr(0, path.search('/ghost/')); - let adminRoot = `${subdir}/ghost/`; - let assetRoot = `${subdir}/ghost/assets/`; - let apiRoot = `${subdir}/ghost/api/admin`; - let assetRootWithHost = `${window.location.protocol}//${window.location.host}${assetRoot}`; + const path = window.location.pathname; + const subdir = path.substr(0, path.search('/ghost/')); + const adminRoot = `${subdir}/ghost/`; + const assetRoot = `${subdir}/ghost/assets/`; + const apiRoot = `${subdir}/ghost/api/admin`; + const assetRootWithHost = `${window.location.protocol}//${window.location.host}${assetRoot}`; return { assetRootWithHost, @@ -42,7 +42,7 @@ export default function () { if (arguments.length > 1) { return makeRoute(arguments[0], Array.prototype.slice.call(arguments, 1)); } else if (arguments.length === 1) { - let [arg] = arguments; + const [arg] = arguments; return arg.slice(-1) === '/' ? arg : `${arg}/`; } return '/'; diff --git a/apps/ember-admin/app/utils/link-component.js b/apps/ember-admin/app/utils/link-component.js index 2121ad8edf8..cf1f50136c6 100644 --- a/apps/ember-admin/app/utils/link-component.js +++ b/apps/ember-admin/app/utils/link-component.js @@ -5,7 +5,7 @@ LinkComponent.reopen({ attributeBindings: ['ariaCurrent:aria-current'], active: computed('attrs.params', '_routing.currentState', function () { - let isActive = this._super(...arguments); + const isActive = this._super(...arguments); if (typeof this.alternateActive === 'function') { this.alternateActive(isActive); diff --git a/apps/ember-admin/app/validators/invite-user.js b/apps/ember-admin/app/validators/invite-user.js index 469793e2800..b6eaa00f1f4 100644 --- a/apps/ember-admin/app/validators/invite-user.js +++ b/apps/ember-admin/app/validators/invite-user.js @@ -6,7 +6,7 @@ export default BaseValidator.create({ properties: ['email', 'role'], email(model) { - let email = model.email; + const email = model.email; if (isBlank(email)) { model.errors.add('email', 'Please enter an email.'); @@ -18,7 +18,7 @@ export default BaseValidator.create({ }, role(model) { - let role = model.role; + const role = model.role; if (isBlank(role)) { model.errors.add('role', 'Please select a role.'); diff --git a/apps/ember-admin/app/validators/member.js b/apps/ember-admin/app/validators/member.js index 99ced51b009..c4f16f89bee 100644 --- a/apps/ember-admin/app/validators/member.js +++ b/apps/ember-admin/app/validators/member.js @@ -13,7 +13,7 @@ export default BaseValidator.create({ }, email(model) { - let email = model.email; + const email = model.email; if (isBlank(email)) { model.errors.add('email', 'Please enter an email.'); @@ -31,7 +31,7 @@ export default BaseValidator.create({ }, note(model) { - let note = model.note; + const note = model.note; if (!validator.isLength(note || '', {max: 500})) { model.errors.add('note', 'Note is too long.'); diff --git a/apps/ember-admin/app/validators/mixins/password.js b/apps/ember-admin/app/validators/mixins/password.js index 76d256dddad..8f12fd68a29 100644 --- a/apps/ember-admin/app/validators/mixins/password.js +++ b/apps/ember-admin/app/validators/mixins/password.js @@ -21,11 +21,11 @@ export default Mixin.create({ * @return {boolean} */ _characterOccurance(stringToTest) { - let chars = {}; - let allowedOccurancy; + const chars = {}; + let valid = true; - allowedOccurancy = stringToTest.length / 2; + const allowedOccurancy = stringToTest.length / 2; // Loop through string and accumulate character counts for (let i = 0; i < stringToTest.length; i += 1) { @@ -38,7 +38,7 @@ export default Mixin.create({ // check if any of the accumulated chars exceed the allowed occurancy // of 50% of the words' length. - for (let charCount in chars) { + for (const charCount in chars) { if (chars[charCount] >= allowedOccurancy) { valid = false; return valid; @@ -51,7 +51,6 @@ export default Mixin.create({ passwordValidation(model, password, errorTarget) { let blogUrl = model.config?.blogUrl || window.location.host; let blogTitle = model.blogTitle || model.config?.blogTitle; - let blogUrlWithSlash; // the password that needs to be validated can differ from the password in the // passed model, e. g. for password changes or reset. @@ -59,7 +58,7 @@ export default Mixin.create({ errorTarget = errorTarget || 'password'; blogUrl = blogUrl.replace(/^http(s?):\/\//, ''); - blogUrlWithSlash = blogUrl.match(/\/$/) ? blogUrl : `${blogUrl}/`; + const blogUrlWithSlash = blogUrl.match(/\/$/) ? blogUrl : `${blogUrl}/`; blogTitle = blogTitle ? blogTitle.trim().toLowerCase() : blogTitle; diff --git a/apps/ember-admin/app/validators/nav-item.js b/apps/ember-admin/app/validators/nav-item.js index 5d9ea5a78e3..9fdfa22ee98 100644 --- a/apps/ember-admin/app/validators/nav-item.js +++ b/apps/ember-admin/app/validators/nav-item.js @@ -6,9 +6,9 @@ export default BaseValidator.create({ properties: ['label', 'url'], label(model) { - let label = model.label; - let icon = model.icon; - let hasValidated = model.hasValidated; + const label = model.label; + const icon = model.icon; + const hasValidated = model.hasValidated; if (isBlank(label) && isBlank(icon)) { model.errors.add('label', 'You must specify a label or icon'); @@ -19,10 +19,10 @@ export default BaseValidator.create({ }, url(model) { - let url = model.url; - let hasValidated = model.hasValidated; - let validatorOptions = {require_protocol: true}; - let urlRegex = new RegExp(/^(\/|#|[a-zA-Z0-9-]+:)/); + const url = model.url; + const hasValidated = model.hasValidated; + const validatorOptions = {require_protocol: true}; + const urlRegex = new RegExp(/^(\/|#|[a-zA-Z0-9-]+:)/); if (isBlank(url)) { model.errors.add('url', 'You must specify a URL or relative path'); diff --git a/apps/ember-admin/app/validators/new-user.js b/apps/ember-admin/app/validators/new-user.js index 85f3c306da6..d0faccea79b 100644 --- a/apps/ember-admin/app/validators/new-user.js +++ b/apps/ember-admin/app/validators/new-user.js @@ -10,7 +10,7 @@ export default BaseValidator.extend(PasswordValidatorMixin, { }, name(model) { - let name = model.name; + const name = model.name; if (!validator.isLength(name || '', {min: 1})) { model.errors.add('name', 'Please enter a name.'); @@ -20,7 +20,7 @@ export default BaseValidator.extend(PasswordValidatorMixin, { }, email(model) { - let email = model.email; + const email = model.email; if (isBlank(email)) { model.errors.add('email', 'Please enter an email.'); diff --git a/apps/ember-admin/app/validators/post.js b/apps/ember-admin/app/validators/post.js index 3f2ac1987c2..2e9bddbb89e 100644 --- a/apps/ember-admin/app/validators/post.js +++ b/apps/ember-admin/app/validators/post.js @@ -43,9 +43,9 @@ export default BaseValidator.create({ }, canonicalUrl(model) { - let validatorOptions = {require_protocol: true}; - let urlRegex = new RegExp(/^(\/|[a-zA-Z0-9-]+:)/); - let url = model.canonicalUrl; + const validatorOptions = {require_protocol: true}; + const urlRegex = new RegExp(/^(\/|[a-zA-Z0-9-]+:)/); + const url = model.canonicalUrl; if (isBlank(url)) { return; @@ -162,7 +162,7 @@ export default BaseValidator.create({ }, publishedAtBlogTime(model) { - let timeRegex = /^(([0-1]?[0-9])|([2][0-3])):([0-5][0-9])$/; + const timeRegex = /^(([0-1]?[0-9])|([2][0-3])):([0-5][0-9])$/; if (!timeRegex.test(model.publishedAtBlogTime) && this._shouldValidatePublishedAtBlog(model)) { model.errors.add('publishedAtBlogTime', 'Must be in format: "15:00"'); @@ -171,8 +171,8 @@ export default BaseValidator.create({ }, publishedAtBlogDate(model) { - let publishedAtBlogDate = model.publishedAtBlogDate; - let publishedAtBlogTime = model.publishedAtBlogTime; + const publishedAtBlogDate = model.publishedAtBlogDate; + const publishedAtBlogTime = model.publishedAtBlogTime; if (!this._shouldValidatePublishedAtBlog(model)) { return; @@ -186,10 +186,10 @@ export default BaseValidator.create({ // don't validate the date if the time format is incorrect if (isEmpty(model.errors.errorsFor('publishedAtBlogTime'))) { - let status = model.status; - let now = moment(); - let publishedAtBlogTZ = model.publishedAtBlogTZ; - let isInFuture = publishedAtBlogTZ.isSameOrAfter(now); + const status = model.status; + const now = moment(); + const publishedAtBlogTZ = model.publishedAtBlogTZ; + const isInFuture = publishedAtBlogTZ.isSameOrAfter(now); // draft/published must be in past if ((status === 'draft' || status === 'published') && publishedAtBlogTZ.isSameOrAfter(now)) { diff --git a/apps/ember-admin/app/validators/reset.js b/apps/ember-admin/app/validators/reset.js index e9d74bc9676..f48c8bfe230 100644 --- a/apps/ember-admin/app/validators/reset.js +++ b/apps/ember-admin/app/validators/reset.js @@ -10,8 +10,8 @@ const resetValidator = BaseValidator.extend(PasswordValidatorMixin, { }, newPassword(model) { - let p1 = model.newPassword; - let p2 = model.ne2Password; + const p1 = model.newPassword; + const p2 = model.ne2Password; if (isBlank(p1)) { model.errors.add('newPassword', 'Please enter a password.'); diff --git a/apps/ember-admin/app/validators/setting.js b/apps/ember-admin/app/validators/setting.js index 6e71108f632..abe46103482 100644 --- a/apps/ember-admin/app/validators/setting.js +++ b/apps/ember-admin/app/validators/setting.js @@ -5,7 +5,7 @@ import {isBlank} from '@ember/utils'; export default BaseValidator.create({ properties: ['title', 'description', 'password', 'slackUrl'], title(model) { - let title = model.title; + const title = model.title; if (!validator.isLength(title || '', {max: 150})) { model.errors.add('title', 'Title is too long'); @@ -14,7 +14,7 @@ export default BaseValidator.create({ }, description(model) { - let desc = model.description; + const desc = model.description; if (!validator.isLength(desc || '', {max: 200})) { model.errors.add('description', 'Description is too long'); @@ -23,8 +23,8 @@ export default BaseValidator.create({ }, password(model) { - let isPrivate = model.isPrivate; - let password = model.password; + const isPrivate = model.isPrivate; + const password = model.password; if (isPrivate && password === '') { model.errors.add('password', 'Password must be supplied'); @@ -33,7 +33,7 @@ export default BaseValidator.create({ }, slackUrl(model) { - let slackUrl = model.slackUrl; + const slackUrl = model.slackUrl; if (!isBlank(slackUrl) && !validator.isURL(slackUrl, {require_protocol: true})) { model.errors.add( diff --git a/apps/ember-admin/app/validators/setup.js b/apps/ember-admin/app/validators/setup.js index ecf9bec37f4..c3c139e4335 100644 --- a/apps/ember-admin/app/validators/setup.js +++ b/apps/ember-admin/app/validators/setup.js @@ -5,7 +5,7 @@ export default NewUserValidator.create({ properties: ['name', 'email', 'password', 'blogTitle'], blogTitle(model) { - let blogTitle = model.blogTitle; + const blogTitle = model.blogTitle; if (!validator.isLength(blogTitle || '', {min: 1})) { model.errors.add('blogTitle', 'Please enter a site title.'); diff --git a/apps/ember-admin/app/validators/signin.js b/apps/ember-admin/app/validators/signin.js index 2b326b83f98..8fd80e1ef30 100644 --- a/apps/ember-admin/app/validators/signin.js +++ b/apps/ember-admin/app/validators/signin.js @@ -7,7 +7,7 @@ export default BaseValidator.create({ invalidMessage: 'Email address is not valid', identification(model) { - let id = model.identification; + const id = model.identification; if (!isBlank(id) && !validator.isEmail(id)) { model.errors.add('identification', this.invalidMessage); @@ -16,8 +16,8 @@ export default BaseValidator.create({ }, signin(model) { - let id = model.identification; - let password = model.password; + const id = model.identification; + const password = model.password; model.errors.clear(); @@ -38,7 +38,7 @@ export default BaseValidator.create({ }, forgotPassword(model) { - let id = model.identification; + const id = model.identification; model.errors.clear(); diff --git a/apps/ember-admin/app/validators/snippet.js b/apps/ember-admin/app/validators/snippet.js index d52aaf4ad41..a77539282fb 100644 --- a/apps/ember-admin/app/validators/snippet.js +++ b/apps/ember-admin/app/validators/snippet.js @@ -6,7 +6,7 @@ export default BaseValidator.create({ properties: ['name', 'mobiledoc'], name(model) { - let {name} = model; + const {name} = model; if (!validator.isLength(name || '', {max: 191})) { model.errors.add('name', 'Name cannot be longer than 191 characters'); diff --git a/apps/ember-admin/app/validators/subscriber.js b/apps/ember-admin/app/validators/subscriber.js index 803c639cbd7..ece4cc97a42 100644 --- a/apps/ember-admin/app/validators/subscriber.js +++ b/apps/ember-admin/app/validators/subscriber.js @@ -6,7 +6,7 @@ export default BaseValidator.create({ properties: ['email'], email(model) { - let email = model.email; + const email = model.email; if (isBlank(email)) { model.errors.add('email', 'Please enter an email.'); diff --git a/apps/ember-admin/app/validators/tag-settings.js b/apps/ember-admin/app/validators/tag-settings.js index 809ea9e91a6..34f6e7e88fb 100644 --- a/apps/ember-admin/app/validators/tag-settings.js +++ b/apps/ember-admin/app/validators/tag-settings.js @@ -6,7 +6,7 @@ export default BaseValidator.create({ properties: ['name', 'slug', 'description', 'metaTitle', 'metaDescription'], name(model) { - let name = model.name; + const name = model.name; if (isBlank(name)) { model.errors.add('name', 'You must specify a name for the tag.'); @@ -21,7 +21,7 @@ export default BaseValidator.create({ }, slug(model) { - let slug = model.slug; + const slug = model.slug; if (!validator.isLength(slug || '', {max: 191})) { model.errors.add('slug', 'URL cannot be longer than 191 characters.'); @@ -30,7 +30,7 @@ export default BaseValidator.create({ }, description(model) { - let description = model.description; + const description = model.description; if (!validator.isLength(description || '', {max: 500})) { model.errors.add('description', 'Description cannot be longer than 500 characters.'); @@ -39,7 +39,7 @@ export default BaseValidator.create({ }, metaTitle(model) { - let metaTitle = model.metaTitle; + const metaTitle = model.metaTitle; if (!validator.isLength(metaTitle || '', {max: 300})) { model.errors.add('metaTitle', 'Meta Title cannot be longer than 300 characters.'); @@ -48,7 +48,7 @@ export default BaseValidator.create({ }, metaDescription(model) { - let metaDescription = model.metaDescription; + const metaDescription = model.metaDescription; if (!validator.isLength(metaDescription || '', {max: 500})) { model.errors.add('metaDescription', 'Meta Description cannot be longer than 500 characters.'); diff --git a/apps/ember-admin/app/validators/tier-benefit-item.js b/apps/ember-admin/app/validators/tier-benefit-item.js index 41aa211183f..2245e3272bc 100644 --- a/apps/ember-admin/app/validators/tier-benefit-item.js +++ b/apps/ember-admin/app/validators/tier-benefit-item.js @@ -5,8 +5,8 @@ export default BaseValidator.create({ properties: ['name'], name(model) { - let name = model.name; - let hasValidated = model.hasValidated; + const name = model.name; + const hasValidated = model.hasValidated; if (isBlank(name)) { model.errors.add('name', 'Please enter a benefit'); diff --git a/apps/ember-admin/app/validators/user.js b/apps/ember-admin/app/validators/user.js index fcff14224f5..98d0bee4256 100644 --- a/apps/ember-admin/app/validators/user.js +++ b/apps/ember-admin/app/validators/user.js @@ -14,7 +14,7 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { }, name(model) { - let name = model.name; + const name = model.name; if (this.isActive(model)) { if (isBlank(name)) { @@ -28,7 +28,7 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { }, bio(model) { - let bio = model.bio; + const bio = model.bio; if (this.isActive(model)) { if (!validator.isLength(bio || '', {max: 250})) { @@ -39,7 +39,7 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { }, email(model) { - let email = model.email; + const email = model.email; if (!validator.isEmail(email || '')) { model.errors.add('email', 'Please supply a valid email address'); @@ -53,7 +53,7 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { }, location(model) { - let location = model.location; + const location = model.location; if (this.isActive(model)) { if (!validator.isLength(location || '', {max: 150})) { @@ -64,8 +64,8 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { }, website(model) { - let website = model.website; - let isInvalidWebsite = !validator.isURL(website || '', {require_protocol: false}) + const website = model.website; + const isInvalidWebsite = !validator.isURL(website || '', {require_protocol: false}) || !validator.isLength(website || '', {max: 2000}); if (this.isActive(model)) { @@ -78,7 +78,7 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { roles(model) { if (!this.isActive(model)) { - let roles = model.roles; + const roles = model.roles; if (roles.length < 1) { model.errors.add('role', 'Please select a role'); @@ -88,8 +88,8 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { }, passwordChange(model) { - let newPassword = model.newPassword; - let ne2Password = model.ne2Password; + const newPassword = model.newPassword; + const ne2Password = model.ne2Password; // validation only marks the requested property as validated so we // have to add properties manually @@ -110,7 +110,7 @@ const userValidator = BaseValidator.extend(PasswordValidatorMixin, { }, ownPasswordChange(model) { - let oldPassword = model.password; + const oldPassword = model.password; this.passwordChange(model); diff --git a/apps/ember-admin/ember-cli-build.js b/apps/ember-admin/ember-cli-build.js index 03253675bd1..38a8581b3a3 100644 --- a/apps/ember-admin/ember-cli-build.js +++ b/apps/ember-admin/ember-cli-build.js @@ -26,7 +26,7 @@ const cssnano = require('cssnano'); const targets = require('./config/targets'); const codemirrorAssets = function () { - let codemirrorFiles = [ + const codemirrorFiles = [ 'lib/codemirror.js', 'mode/htmlmixed/htmlmixed.js', 'mode/xml/xml.js', @@ -38,7 +38,7 @@ const codemirrorAssets = function () { return {import: codemirrorFiles}; } - let config = {}; + const config = {}; config.public = { include: codemirrorFiles, @@ -55,7 +55,7 @@ const codemirrorAssets = function () { jsTree = new Terser(jsTree); } - let mergedTree = mergeTrees([tree, jsTree]); + const mergedTree = mergeTrees([tree, jsTree]); return new Funnel(mergedTree, {include: ['assets/**/*', 'theme/**/*']}); } }; @@ -68,7 +68,7 @@ const codemirrorAssets = function () { return config; }; -let denylist = []; +const denylist = []; if (process.env.CI) { denylist.push('ember-cli-eslint'); } @@ -131,7 +131,7 @@ if (isProduction) { } module.exports = function (defaults) { - let app = new EmberApp(defaults, { + const app = new EmberApp(defaults, { addons: {denylist}, tests: includeTestAssets, hinting: includeTestAssets, diff --git a/apps/ember-admin/lib/ember-power-calendar-utils/addon/index.js b/apps/ember-admin/lib/ember-power-calendar-utils/addon/index.js index c7f54c94109..19e6f43fe42 100644 --- a/apps/ember-admin/lib/ember-power-calendar-utils/addon/index.js +++ b/apps/ember-admin/lib/ember-power-calendar-utils/addon/index.js @@ -104,7 +104,7 @@ export function normalizeCalendarDay(day) { export function withLocale(locale, fn) { let returnValue; if (locale) { - let previousLocale = moment.locale(); + const previousLocale = moment.locale(); moment.locale(locale); returnValue = fn(); moment.locale(previousLocale); @@ -143,9 +143,9 @@ export function getDefaultLocale() { } export function localeStartOfWeek(locale) { - let now = new Date(); - let day = withLocale(locale, () => formatDate(startOf(now, 'week'), 'dddd')); - let idx = withLocale(locale, getWeekdays).indexOf(day); + const now = new Date(); + const day = withLocale(locale, () => formatDate(startOf(now, 'week'), 'dddd')); + const idx = withLocale(locale, getWeekdays).indexOf(day); return idx >= 0 ? idx : 0; } @@ -157,7 +157,7 @@ export function startOfWeek(day, _startOfWeek) { } export function endOfWeek(day, _startOfWeek) { - let eow = (_startOfWeek + 6) % 7; + const eow = (_startOfWeek + 6) % 7; while (isoWeekday(day) % 7 !== eow) { day = add(day, 1, 'day'); } diff --git a/apps/ember-admin/mirage/config.js b/apps/ember-admin/mirage/config.js index a6a68a205a9..6b3dac1279c 100644 --- a/apps/ember-admin/mirage/config.js +++ b/apps/ember-admin/mirage/config.js @@ -7,7 +7,7 @@ import devRoutes from './routes-dev'; import testRoutes from './routes-test'; export default function (config) { - let finalConfig = { + const finalConfig = { ...config, models: {...discoverEmberDataModels(), ...config.models}, serializers: applyEmberDataSerializers(config.serializers), diff --git a/apps/ember-admin/mirage/config/authentication.js b/apps/ember-admin/mirage/config/authentication.js index 61b7a055f06..df3c78edcdb 100644 --- a/apps/ember-admin/mirage/config/authentication.js +++ b/apps/ember-admin/mirage/config/authentication.js @@ -25,8 +25,8 @@ export default function mockAuthentication(server) { }); server.post('/authentication/password_reset', function (schema, request) { - let {password_reset} = JSON.parse(request.requestBody); - let email = password_reset[0].email; + const {password_reset} = JSON.parse(request.requestBody); + const email = password_reset[0].email; if (email === 'unknown@example.com') { return new Response(404, {}, { @@ -47,9 +47,9 @@ export default function mockAuthentication(server) { }); server.get('/authentication/invitation/', function (schema, request) { - let {email} = request.queryParams; - let invite = schema.invites.findBy({email}); - let valid = !!invite; + const {email} = request.queryParams; + const invite = schema.invites.findBy({email}); + const valid = !!invite; return { invitation: [{ @@ -61,7 +61,7 @@ export default function mockAuthentication(server) { /* Setup ---------------------------------------------------------------- */ server.post('/authentication/setup', function (schema, request) { - let [attrs] = JSON.parse(request.requestBody).setup; + const [attrs] = JSON.parse(request.requestBody).setup; let role = schema.roles.findBy({name: 'Owner'}); // create owner role unless already exists diff --git a/apps/ember-admin/mirage/config/integrations.js b/apps/ember-admin/mirage/config/integrations.js index dc7002ab478..4baa074cef9 100644 --- a/apps/ember-admin/mirage/config/integrations.js +++ b/apps/ember-admin/mirage/config/integrations.js @@ -6,8 +6,8 @@ export default function mockIntegrations(server) { server.get('/integrations/', paginatedResponse('integrations')); server.post('/integrations/', function ({integrations}, {requestBody}) { - let body = JSON.parse(requestBody); - let [params] = body.integrations; + const body = JSON.parse(requestBody); + const [params] = body.integrations; // all integrations created via the API have a type of 'custom' params.type = 'custom'; @@ -38,11 +38,11 @@ export default function mockIntegrations(server) { }); server.put('/integrations/:id/', function (schema, {params}) { - let {integrations, apiKeys, webhooks} = schema; - let attrs = this.normalizedRequestAttrs(); - let integration = integrations.find(params.id); - let _apiKeys = []; - let _webhooks = []; + const {integrations, apiKeys, webhooks} = schema; + const attrs = this.normalizedRequestAttrs(); + const integration = integrations.find(params.id); + const _apiKeys = []; + const _webhooks = []; // this is required to work around an issue with ember-cli-mirage and // embedded records. The `attrs` object will contain POJOs of the diff --git a/apps/ember-admin/mirage/config/invites.js b/apps/ember-admin/mirage/config/invites.js index aa45ed3f3a0..9b9b70c39a5 100644 --- a/apps/ember-admin/mirage/config/invites.js +++ b/apps/ember-admin/mirage/config/invites.js @@ -6,8 +6,8 @@ export default function mockInvites(server) { server.get('/invites/', paginatedResponse('invites')); server.get('/invites/:id', function (schema, request) { - let {id} = request.params; - let invite = schema.invites.find(id); + const {id} = request.params; + const invite = schema.invites.find(id); return invite || new Response(404, {}, { errors: [{ @@ -18,8 +18,8 @@ export default function mockInvites(server) { }); server.post('/invites/', function ({invites}) { - let attrs = this.normalizedRequestAttrs(); - let oldInvite = invites.findBy({email: attrs.email}); + const attrs = this.normalizedRequestAttrs(); + const oldInvite = invites.findBy({email: attrs.email}); if (oldInvite) { oldInvite.destroy(); diff --git a/apps/ember-admin/mirage/config/labels.js b/apps/ember-admin/mirage/config/labels.js index f12fb4b2e8b..872c1f96b95 100644 --- a/apps/ember-admin/mirage/config/labels.js +++ b/apps/ember-admin/mirage/config/labels.js @@ -4,9 +4,9 @@ export default function mockLabels(server) { server.post('/labels/'); server.get('/labels/', function ({labels}, request) { - let page = +request.queryParams.page || 1; + const page = +request.queryParams.page || 1; let limit = request.queryParams.limit; - let collection = labels.all(); + const collection = labels.all(); // Handle filter param for server-side search (e.g. filter=name:~'term') const nameFilter = extractFilterParam('name', request.queryParams.filter); @@ -25,8 +25,8 @@ export default function mockLabels(server) { }); server.get('/labels/:id/', function ({labels}, {params}) { - let {id} = params; - let label = labels.find(id); + const {id} = params; + const label = labels.find(id); return label || new Response(404, {}, { errors: [{ diff --git a/apps/ember-admin/mirage/config/members.js b/apps/ember-admin/mirage/config/members.js index e9cc46a5126..2c0d70379ff 100644 --- a/apps/ember-admin/mirage/config/members.js +++ b/apps/ember-admin/mirage/config/members.js @@ -19,7 +19,7 @@ export function mockMembersStats(server) { server.get('/members/stats/count', withPermissionsCheck(ALLOWED_ROLES, function (db, {queryParams}) { let {days} = queryParams; - let firstSubscriberDays = faker.number.int({min: 30, max: 600}); + const firstSubscriberDays = faker.number.int({min: 30, max: 600}); if (days === 'all-time') { days = firstSubscriberDays; @@ -33,11 +33,11 @@ export function mockMembersStats(server) { } // simulate sql GROUP BY where days with 0 subscribers are missing - let dateCounts = {}; + const dateCounts = {}; let i = 0; while (i < days) { - let date = moment().subtract(i, 'days').format('YYYY-MM-DD'); - let count = faker.number.int({min: 0, max: 30}); + const date = moment().subtract(i, 'days').format('YYYY-MM-DD'); + const count = faker.number.int({min: 0, max: 30}); if (count !== 0) { dateCounts[date] = count; @@ -47,10 +47,10 @@ export function mockMembersStats(server) { } // similar to what we'll need to do on the server - let totalOnDate = {}; + const totalOnDate = {}; let j = days - 1; while (j >= 0) { - let date = moment().subtract(j, 'days').format('YYYY-MM-DD'); + const date = moment().subtract(j, 'days').format('YYYY-MM-DD'); totalOnDate[date] = total + (dateCounts[date] || 0); total += (dateCounts[date] || 0); j -= 1; @@ -157,7 +157,7 @@ export default function mockMembers(server) { let membersToDelete = members.all(); if (queryParams.filter) { - let labelFilter = extractFilterParam('label', queryParams.filter); + const labelFilter = extractFilterParam('label', queryParams.filter); membersToDelete = membersToDelete.filter((member) => { let matches = false; @@ -170,7 +170,7 @@ export default function mockMembers(server) { }); } - let count = membersToDelete.length; + const count = membersToDelete.length; membersToDelete.destroy(); return { @@ -183,8 +183,8 @@ export default function mockMembers(server) { })); server.get('/members/:id/', withPermissionsCheck(ALLOWED_ROLES, function ({members}, {params}) { - let {id} = params; - let member = members.find(id); + const {id} = params; + const member = members.find(id); return member || new Response(404, {}, { errors: [{ diff --git a/apps/ember-admin/mirage/config/pages.js b/apps/ember-admin/mirage/config/pages.js index 4c6976f3363..bd9eba6aa9d 100644 --- a/apps/ember-admin/mirage/config/pages.js +++ b/apps/ember-admin/mirage/config/pages.js @@ -25,7 +25,7 @@ function extractTags(pageAttrs, tags) { export default function mockPages(server) { server.post('/pages', function ({pages, users, tags}) { - let attrs = this.normalizedRequestAttrs(); + const attrs = this.normalizedRequestAttrs(); attrs.authors = extractAuthors(attrs, users); attrs.tags = extractTags(attrs, tags); @@ -40,8 +40,8 @@ export default function mockPages(server) { server.get('/pages/', getPages); server.get('/pages/:id/', function ({pages}, {params}) { - let {id} = params; - let page = pages.find(id); + const {id} = params; + const page = pages.find(id); return page || new Response(404, {}, { errors: [{ @@ -52,8 +52,8 @@ export default function mockPages(server) { }); server.put('/pages/:id/', function ({pages, users, tags}, {params}) { - let attrs = this.normalizedRequestAttrs(); - let page = pages.find(params.id); + const attrs = this.normalizedRequestAttrs(); + const page = pages.find(params.id); attrs.authors = extractAuthors(attrs, users); attrs.tags = extractTags(attrs, tags); diff --git a/apps/ember-admin/mirage/config/posts.js b/apps/ember-admin/mirage/config/posts.js index 678261ce2f5..f1b1035256b 100644 --- a/apps/ember-admin/mirage/config/posts.js +++ b/apps/ember-admin/mirage/config/posts.js @@ -38,12 +38,12 @@ export function getPostsOrPages(modelName, db, {queryParams}) { page = +page || 1; limit = +limit || 15; - let statusFilter = extractFilterParam('status', filter); - let authorsFilter = extractFilterParam('authors', filter); - let visibilityFilter = extractFilterParam('visibility', filter); - let tags = extractFilterParam('tag', filter); + const statusFilter = extractFilterParam('status', filter); + const authorsFilter = extractFilterParam('authors', filter); + const visibilityFilter = extractFilterParam('visibility', filter); + const tags = extractFilterParam('tag', filter); - let collection = model.all().filter((post) => { + const collection = model.all().filter((post) => { let matchesStatus = true; let matchesAuthors = true; let matchesVisibility = true; @@ -79,7 +79,7 @@ export function getPostsOrPages(modelName, db, {queryParams}) { export default function mockPosts(server) { server.post('/posts', function ({posts, users, tags}) { - let attrs = this.normalizedRequestAttrs(); + const attrs = this.normalizedRequestAttrs(); attrs.authors = extractAuthors(attrs, users); attrs.tags = extractTags(attrs, tags); @@ -98,8 +98,8 @@ export default function mockPosts(server) { server.get('/posts/', getPosts); server.get('/posts/:id/', function ({posts}, {params}) { - let {id} = params; - let post = posts.find(id); + const {id} = params; + const post = posts.find(id); return post || new Response(404, {}, { errors: [{ @@ -134,14 +134,14 @@ export default function mockPosts(server) { server.del('/posts/:id/'); server.del('/posts/', function ({posts}, {queryParams}) { - let ids = extractFilterParam('id', queryParams.filter); + const ids = extractFilterParam('id', queryParams.filter); posts.find(ids).destroy(); }); server.post('/posts/:id/copy/', function ({posts}, {params}) { - let post = posts.find(params.id); - let attrs = post.attrs; + const post = posts.find(params.id); + const attrs = post.attrs; return posts.create(attrs); }); diff --git a/apps/ember-admin/mirage/config/settings.js b/apps/ember-admin/mirage/config/settings.js index 3a81e2ce206..6ad46144b0c 100644 --- a/apps/ember-admin/mirage/config/settings.js +++ b/apps/ember-admin/mirage/config/settings.js @@ -1,8 +1,8 @@ export default function mockSettings(server) { server.get('/settings/', function ({db}, {queryParams}) { - let {group} = queryParams; - let filters = group.split(','); - let settings = []; + const {group} = queryParams; + const filters = group.split(','); + const settings = []; if (!db.settings.length) { server.loadFixtures('settings'); @@ -19,10 +19,10 @@ export default function mockSettings(server) { }); server.put('/settings/', function ({db}, {requestBody}) { - let newSettings = JSON.parse(requestBody).settings; + const newSettings = JSON.parse(requestBody).settings; newSettings.forEach((newSetting) => { - let {key} = newSetting; + const {key} = newSetting; if (db.settings.where({key}).length > 0) { db.settings.update({key}, newSetting); diff --git a/apps/ember-admin/mirage/config/tags.js b/apps/ember-admin/mirage/config/tags.js index cf07ed22cb5..8df7a9c7062 100644 --- a/apps/ember-admin/mirage/config/tags.js +++ b/apps/ember-admin/mirage/config/tags.js @@ -4,7 +4,7 @@ import {isBlank} from '@ember/utils'; export default function mockTags(server) { server.post('/tags/', function ({tags}) { - let attrs = this.normalizedRequestAttrs(); + const attrs = this.normalizedRequestAttrs(); if (isBlank(attrs.slug) && !isBlank(attrs.name)) { attrs.slug = dasherize(attrs.name); diff --git a/apps/ember-admin/mirage/config/themes.js b/apps/ember-admin/mirage/config/themes.js index 7e44178bf00..59c35b16c3b 100644 --- a/apps/ember-admin/mirage/config/themes.js +++ b/apps/ember-admin/mirage/config/themes.js @@ -37,7 +37,7 @@ export default function mockThemes(server) { server.put('/themes/:theme/activate/', function ({themes}, {params}) { themes.all().update('active', false); - let theme = themes.findBy({name: params.theme}).update({active: true}); + const theme = themes.findBy({name: params.theme}).update({active: true}); return {themes: [theme]}; }); diff --git a/apps/ember-admin/mirage/config/tiers.js b/apps/ember-admin/mirage/config/tiers.js index 2c5865af3c1..e4c69b1882e 100644 --- a/apps/ember-admin/mirage/config/tiers.js +++ b/apps/ember-admin/mirage/config/tiers.js @@ -23,8 +23,8 @@ export default function mockTiers(server) { server.get('/tiers/', withPermissionsCheck(ALLOWED_READ_ROLES, paginatedResponse('tiers'))); server.get('/tiers/:id/', withPermissionsCheck(ALLOWED_READ_ROLES, function ({tiers}, {params}) { - let {id} = params; - let tier = tiers.find(id); + const {id} = params; + const tier = tiers.find(id); return tier || new Response(404, {}, { errors: [{ diff --git a/apps/ember-admin/mirage/config/uploads.js b/apps/ember-admin/mirage/config/uploads.js index de909e294cb..c8c1e6b47f6 100644 --- a/apps/ember-admin/mirage/config/uploads.js +++ b/apps/ember-admin/mirage/config/uploads.js @@ -1,9 +1,9 @@ const fileUploadResponse = function (db, {requestBody}) { // let [ref] = requestBody.getAll('ref'); - let [purpose] = requestBody.getAll('purpose'); - let [file] = requestBody.getAll('file'); - let now = new Date(); - let year = now.getFullYear(); + const [purpose] = requestBody.getAll('purpose'); + const [file] = requestBody.getAll('file'); + const now = new Date(); + const year = now.getFullYear(); let month = `${now.getMonth()}`; if (month.length === 1) { diff --git a/apps/ember-admin/mirage/config/users.js b/apps/ember-admin/mirage/config/users.js index da4a81cdc95..44e386d72da 100644 --- a/apps/ember-admin/mirage/config/users.js +++ b/apps/ember-admin/mirage/config/users.js @@ -5,7 +5,7 @@ import {paginateModelCollection} from '../utils'; export default function mockUsers(server) { // /users/me = Always return the user with ID=1 server.get('/users/me/', function ({users}) { - let user = users.find(1); + const user = users.find(1); if (user) { return user; @@ -17,8 +17,8 @@ export default function mockUsers(server) { }); server.get('/users/', function ({users}, {queryParams}) { - let page = +queryParams.page || 1; - let filter = queryParams.filter || ''; + const page = +queryParams.page || 1; + const filter = queryParams.filter || ''; // NOTE: this is naive and only set up to work with queries that are // actually used - if you use a different filter in the app, add it here! @@ -44,26 +44,26 @@ export default function mockUsers(server) { }); server.get('/users/slug/:slug/', function ({users}, {params, queryParams}) { - let user = users.findBy({slug: params.slug}); + const user = users.findBy({slug: params.slug}); user.postCount = queryParams.include.match(/count\.posts/); return user; }); server.get('/users/:id', function ({users}, {params, queryParams}) { - let user = users.find(params.id); + const user = users.find(params.id); user.postCount = queryParams.include.match(/count\.posts/); return user; }); server.put('/users/:id/', function ({users}, {params}) { - let {id} = params; + const {id} = params; if (id === 'password') { return { password: [{message: 'Password changed successfully.'}] }; } else { - let attrs = this.normalizedRequestAttrs(); + const attrs = this.normalizedRequestAttrs(); // TODO: why is our custom serializer causing .update to throw // children.update is not a function? diff --git a/apps/ember-admin/mirage/config/webhooks.js b/apps/ember-admin/mirage/config/webhooks.js index b1331def260..ba539771e72 100644 --- a/apps/ember-admin/mirage/config/webhooks.js +++ b/apps/ember-admin/mirage/config/webhooks.js @@ -6,8 +6,8 @@ export default function mockWebhooks(server) { server.get('/webhooks/', paginatedResponse('webhooks')); server.post('/webhooks/', function ({webhooks}) { - let attrs = this.normalizedRequestAttrs(); - let errors = []; + const attrs = this.normalizedRequestAttrs(); + const errors = []; if (!attrs.name) { errors.push({ diff --git a/apps/ember-admin/mirage/factories/integration.js b/apps/ember-admin/mirage/factories/integration.js index 52ab6360c3a..fd2feb22a9d 100644 --- a/apps/ember-admin/mirage/factories/integration.js +++ b/apps/ember-admin/mirage/factories/integration.js @@ -12,8 +12,8 @@ export default Factory.extend({ updatedAt() { return moment.utc().format(); }, afterCreate(integration, server) { - let contentKey = server.create('api-key', {type: 'content', integration}); - let adminKey = server.create('api-key', {type: 'admin', integration}); + const contentKey = server.create('api-key', {type: 'content', integration}); + const adminKey = server.create('api-key', {type: 'admin', integration}); integration.apiKeyIds = [contentKey.id, adminKey.id]; integration.save(); diff --git a/apps/ember-admin/mirage/factories/member.js b/apps/ember-admin/mirage/factories/member.js index 723310027b5..b9919260285 100644 --- a/apps/ember-admin/mirage/factories/member.js +++ b/apps/ember-admin/mirage/factories/member.js @@ -2,7 +2,7 @@ import moment from 'moment-timezone'; import {Factory, trait} from 'miragejs'; import {faker} from '@faker-js/faker'; -let randomDate = function randomDate(start = moment().subtract(30, 'days').toDate(), end = new Date()) { +const randomDate = function randomDate(start = moment().subtract(30, 'days').toDate(), end = new Date()) { return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())); }; diff --git a/apps/ember-admin/mirage/factories/page.js b/apps/ember-admin/mirage/factories/page.js index 70c4350e09e..cb2ff4cacd6 100644 --- a/apps/ember-admin/mirage/factories/page.js +++ b/apps/ember-admin/mirage/factories/page.js @@ -22,7 +22,7 @@ export default Factory.extend({ publishedAt: '2015-12-19T16:25:07.000Z', publishedBy: 1, status(i) { - let statuses = ['draft', 'published', 'scheduled']; + const statuses = ['draft', 'published', 'scheduled']; return statuses[i % statuses.length]; }, title(i) { return `Page ${i}`; }, @@ -41,7 +41,7 @@ export default Factory.extend({ let user = server.schema.users.find(1); if (!user) { - let role = server.schema.roles.find({name: 'Administrator'}) || server.create('role', {name: 'Administrator'}); + const role = server.schema.roles.find({name: 'Administrator'}) || server.create('role', {name: 'Administrator'}); user = server.create('user', {roles: [role]}); } diff --git a/apps/ember-admin/mirage/factories/post.js b/apps/ember-admin/mirage/factories/post.js index 2962b6f56b2..31de1206756 100644 --- a/apps/ember-admin/mirage/factories/post.js +++ b/apps/ember-admin/mirage/factories/post.js @@ -23,7 +23,7 @@ export default Factory.extend({ publishedAt: '2015-12-19T16:25:07.000Z', publishedBy: 1, status(i) { - let statuses = ['draft', 'published', 'scheduled','sent']; + const statuses = ['draft', 'published', 'scheduled','sent']; return statuses[i % statuses.length]; }, title(i) { return `Post ${i}`; }, @@ -43,7 +43,7 @@ export default Factory.extend({ let user = server.schema.users.find(1); if (!user) { - let role = server.schema.roles.find({name: 'Administrator'}) || server.create('role', {name: 'Administrator'}); + const role = server.schema.roles.find({name: 'Administrator'}) || server.create('role', {name: 'Administrator'}); user = server.create('user', {roles: [role]}); } diff --git a/apps/ember-admin/mirage/factories/webhook.js b/apps/ember-admin/mirage/factories/webhook.js index fe7cf0bada0..e3fbeef32e6 100644 --- a/apps/ember-admin/mirage/factories/webhook.js +++ b/apps/ember-admin/mirage/factories/webhook.js @@ -5,7 +5,7 @@ import {Factory} from 'miragejs'; export default Factory.extend({ name(i) { return `Integration ${i + 1}`;}, event(i) { - let event = AVAILABLE_EVENTS[i % 3]; + const event = AVAILABLE_EVENTS[i % 3]; return event.event; }, target(i) { return `https://example.com/${i + 1}`; }, diff --git a/apps/ember-admin/mirage/serializers/application.js b/apps/ember-admin/mirage/serializers/application.js index 1cc58e128aa..1a63df27a7c 100644 --- a/apps/ember-admin/mirage/serializers/application.js +++ b/apps/ember-admin/mirage/serializers/application.js @@ -28,7 +28,7 @@ export default RestSerializer.extend({ object = new Collection(object.modelName, [object]); } - let json = RestSerializer.prototype.serialize.call(this, object, request); + const json = RestSerializer.prototype.serialize.call(this, object, request); if (this.isCollection(object) && object.meta) { json.meta = object.meta; @@ -44,7 +44,7 @@ export default RestSerializer.extend({ // sometimes mirage doesn't include a modelName, so we extrapolate it from // the first element of Object.keys modelName = pluralize(modelName) || Object.keys(body)[0]; - let [attributes] = body[modelName] || [{}]; + const [attributes] = body[modelName] || [{}]; return {data: {attributes}}; } }); diff --git a/apps/ember-admin/mirage/serializers/label.js b/apps/ember-admin/mirage/serializers/label.js index dc3b9d7ab7d..2800380a52f 100644 --- a/apps/ember-admin/mirage/serializers/label.js +++ b/apps/ember-admin/mirage/serializers/label.js @@ -3,7 +3,7 @@ import BaseSerializer from './application'; export default BaseSerializer.extend({ // make the label.count.members value dynamic serialize(labelModelOrCollection, request) { - let updateMemberCount = (label) => { + const updateMemberCount = (label) => { label.update('count', {members: label.memberIds.length}); }; diff --git a/apps/ember-admin/mirage/serializers/member.js b/apps/ember-admin/mirage/serializers/member.js index bd19f527fa4..23bb9860a38 100644 --- a/apps/ember-admin/mirage/serializers/member.js +++ b/apps/ember-admin/mirage/serializers/member.js @@ -4,7 +4,7 @@ export default BaseSerializer.extend({ embed: true, include(request) { - let queryIncludes = (request.queryParams.include || '').split(',').compact(); + const queryIncludes = (request.queryParams.include || '').split(',').compact(); const includes = new Set(queryIncludes); // embedded records that are included by default in the API diff --git a/apps/ember-admin/mirage/serializers/subscription.js b/apps/ember-admin/mirage/serializers/subscription.js index bede70ffeb3..1d7608dcd49 100644 --- a/apps/ember-admin/mirage/serializers/subscription.js +++ b/apps/ember-admin/mirage/serializers/subscription.js @@ -5,7 +5,7 @@ export default BaseSerializer.extend({ embed: true, include(/*request*/) { - let includes = []; + const includes = []; includes.push('tier'); diff --git a/apps/ember-admin/mirage/serializers/tag.js b/apps/ember-admin/mirage/serializers/tag.js index 76f90f85edc..cdd78b72220 100644 --- a/apps/ember-admin/mirage/serializers/tag.js +++ b/apps/ember-admin/mirage/serializers/tag.js @@ -3,7 +3,7 @@ import BaseSerializer from './application'; export default BaseSerializer.extend({ // make the tag.count.posts and url values dynamic serialize(tagModelOrCollection, request) { - let updatePost = (tag) => { + const updatePost = (tag) => { tag.update('count', {posts: tag.postIds.length}); tag.update('url', `http://localhost:4200/tag/${tag.slug}/`); }; diff --git a/apps/ember-admin/mirage/serializers/tier.js b/apps/ember-admin/mirage/serializers/tier.js index d663c419059..882d4237abe 100644 --- a/apps/ember-admin/mirage/serializers/tier.js +++ b/apps/ember-admin/mirage/serializers/tier.js @@ -5,7 +5,7 @@ export default BaseSerializer.extend({ embed: true, include(/*request*/) { - let includes = []; + const includes = []; includes.push('tierBenefits'); diff --git a/apps/ember-admin/mirage/utils.js b/apps/ember-admin/mirage/utils.js index 3a979b29d04..663284559fb 100644 --- a/apps/ember-admin/mirage/utils.js +++ b/apps/ember-admin/mirage/utils.js @@ -3,9 +3,9 @@ import {isArray} from '@ember/array'; export function paginatedResponse(modelName) { return function (schema, request) { - let page = +request.queryParams.page || 1; + const page = +request.queryParams.page || 1; let limit = request.queryParams.limit; - let collection = schema[modelName].all(); + const collection = schema[modelName].all(); if (limit !== 'all') { limit = +request.queryParams.limit || 15; @@ -26,8 +26,8 @@ export function paginateModelCollection(modelName, collection, page, limit) { } else { limit = +limit; - let start = (page - 1) * limit; - let end = start + limit; + const start = (page - 1) * limit; + const end = start + limit; pages = Math.ceil(collection.models.length / limit); models = collection.models.slice(start, end); @@ -107,10 +107,10 @@ function normalizeStringParams(arr) { // TODO: use GQL to parse filter string? export function extractFilterParam(param, filter = '') { - let filterRegex = new RegExp(`${param}:(.*?)(?:\\+|$)`); + const filterRegex = new RegExp(`${param}:(.*?)(?:\\+|$)`); let match; - let [, result] = filter.match(filterRegex) || []; + const [, result] = filter.match(filterRegex) || []; if (!result) { return; diff --git a/apps/ember-admin/testem.js b/apps/ember-admin/testem.js index 3f482cb023b..fc23953ce56 100644 --- a/apps/ember-admin/testem.js +++ b/apps/ember-admin/testem.js @@ -1,7 +1,7 @@ /* eslint-env node */ /* eslint-disable camelcase */ -let launch_in_ci = [process.env.BROWSER || 'Chrome']; +const launch_in_ci = [process.env.BROWSER || 'Chrome']; module.exports = { framework: 'mocha', diff --git a/apps/ember-admin/tests/acceptance/authentication-test.js b/apps/ember-admin/tests/acceptance/authentication-test.js index 3913e978fd4..a42a7c22b90 100644 --- a/apps/ember-admin/tests/acceptance/authentication-test.js +++ b/apps/ember-admin/tests/acceptance/authentication-test.js @@ -54,7 +54,7 @@ function setupResendFailure(server, {responseCode = 400, timing = 0, message} = }, {timing}); } describe('Acceptance: Authentication', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { @@ -117,7 +117,7 @@ describe('Acceptance: Authentication', function () { sinon.stub(windowProxy, 'replaceLocation'); sinon.stub(windowProxy, 'changeLocation'); - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [role], slug: 'test-user'}); }); @@ -315,8 +315,8 @@ describe('Acceptance: Authentication', function () { }); describe('editor', function () { - let origDebounce = run.debounce; - let origThrottle = run.throttle; + const origDebounce = run.debounce; + const origThrottle = run.throttle; // we don't want the autosave interfering in this test beforeEach(function () { @@ -325,14 +325,14 @@ describe('Acceptance: Authentication', function () { }); it('displays re-auth modal attempting to save with invalid session', async function () { - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [role]}); let testOn = 'save'; // use marker for different type of server.put result // simulate an invalid session when saving the edited post this.server.put('/posts/:id/', function ({posts, db}, {params}) { - let post = posts.find(params.id); - let attrs = db.posts.find(params.id); // use attribute from db.posts to avoid hasInverseFor error + const post = posts.find(params.id); + const attrs = db.posts.find(params.id); // use attribute from db.posts to avoid hasInverseFor error if (testOn === 'edit') { return new Response(401, {}, { diff --git a/apps/ember-admin/tests/acceptance/content-test.js b/apps/ember-admin/tests/acceptance/content-test.js index 915c0331771..198e919b0d5 100644 --- a/apps/ember-admin/tests/acceptance/content-test.js +++ b/apps/ember-admin/tests/acceptance/content-test.js @@ -22,7 +22,7 @@ const findButton = (text, buttons) => { // NOTE: With accommodations for faster loading of posts in the UI, the requests to fetch the posts have been split into separate requests based // on the status of the post. This means that the tests for filtering by status will have multiple requests to check against. describe('Acceptance: Posts / Pages', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { @@ -44,7 +44,7 @@ describe('Acceptance: Posts / Pages', function () { describe('as contributor', function () { beforeEach(async function () { - let contributorRole = this.server.create('role', {name: 'Contributor'}); + const contributorRole = this.server.create('role', {name: 'Contributor'}); this.server.create('user', {roles: [contributorRole]}); await authenticateSession(); @@ -90,7 +90,7 @@ describe('Acceptance: Posts / Pages', function () { await triggerEvent(post, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); + const contextMenu = find('.gh-posts-context-menu'); expect(contextMenu, 'context menu').to.not.be.visible; }); }); @@ -100,10 +100,10 @@ describe('Acceptance: Posts / Pages', function () { let author, authorPost; beforeEach(async function () { - let authorRole = this.server.create('role', {name: 'Author'}); + const authorRole = this.server.create('role', {name: 'Author'}); author = this.server.create('user', {roles: [authorRole]}); - let adminRole = this.server.create('role', {name: 'Administrator'}); - let admin = this.server.create('user', {roles: [adminRole]}); + const adminRole = this.server.create('role', {name: 'Administrator'}); + const admin = this.server.create('user', {roles: [adminRole]}); // create posts authorPost = this.server.create('post', {authors: [author], status: 'published', title: 'Author Post'}); @@ -119,8 +119,8 @@ describe('Acceptance: Posts / Pages', function () { // API request includes author filter // Find the posts API request - let postsRequests = this.server.pretender.handledRequests.filter(r => r.url.includes('/posts/') && r.method === 'GET'); - let lastPostsRequest = postsRequests[postsRequests.length - 1]; + const postsRequests = this.server.pretender.handledRequests.filter(r => r.url.includes('/posts/') && r.method === 'GET'); + const lastPostsRequest = postsRequests[postsRequests.length - 1]; expect(lastPostsRequest.queryParams.filter).to.have.string(`authors:${author.slug}`); // only author's post is shown @@ -138,7 +138,7 @@ describe('Acceptance: Posts / Pages', function () { await triggerEvent(post, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); + const contextMenu = find('.gh-posts-context-menu'); expect(contextMenu, 'context menu').to.not.be.visible; }); }); @@ -148,7 +148,7 @@ describe('Acceptance: Posts / Pages', function () { let editor, editorPost; beforeEach(async function () { - let editorRole = this.server.create('role', {name: 'Editor'}); + const editorRole = this.server.create('role', {name: 'Editor'}); editor = this.server.create('user', {roles: [editorRole]}); editorPost = this.server.create('post', {authors: [editor], status: 'published', title: 'Editor Post'}); @@ -188,9 +188,9 @@ describe('Acceptance: Posts / Pages', function () { beforeEach(async function () { this.server.loadFixtures('tiers'); - let adminRole = this.server.create('role', {name: 'Administrator'}); + const adminRole = this.server.create('role', {name: 'Administrator'}); admin = this.server.create('user', {roles: [adminRole]}); - let editorRole = this.server.create('role', {name: 'Editor'}); + const editorRole = this.server.create('role', {name: 'Editor'}); editor = this.server.create('user', {roles: [editorRole]}); publishedPost = this.server.create('post', {authors: [admin], status: 'published', title: 'Published Post', visibility: 'paid'}); @@ -219,7 +219,7 @@ describe('Acceptance: Posts / Pages', function () { expect(posts[3].querySelector('.gh-content-entry-title').textContent, 'post 4 title').to.contain('Editor Published Post'); // check API requests - let lastRequests = this.server.pretender.handledRequests.filter(request => request.url.includes('/posts/')); + const lastRequests = this.server.pretender.handledRequests.filter(request => request.url.includes('/posts/')); expect(lastRequests[0].queryParams.filter, 'scheduled request filter').to.have.string('status:scheduled'); expect(lastRequests[1].queryParams.filter, 'drafts request filter').to.have.string('status:draft'); expect(lastRequests[2].queryParams.filter, 'published request filter').to.have.string('status:[published,sent]'); @@ -255,8 +255,8 @@ describe('Acceptance: Posts / Pages', function () { await selectChoose('[data-test-type-select]', 'Scheduled posts'); // API request is correct - let scheduledPostsRequests = this.server.pretender.handledRequests.filter(r => r.url.includes('/posts/') && r.method === 'GET'); - let lastScheduledRequest = scheduledPostsRequests[scheduledPostsRequests.length - 1]; + const scheduledPostsRequests = this.server.pretender.handledRequests.filter(r => r.url.includes('/posts/') && r.method === 'GET'); + const lastScheduledRequest = scheduledPostsRequests[scheduledPostsRequests.length - 1]; expect(lastScheduledRequest.queryParams.filter, '"scheduled" request status filter').to.have.string('status:scheduled'); // Displays scheduled post expect(findAll('[data-test-post-id]').length, 'scheduled count').to.equal(1); @@ -270,8 +270,8 @@ describe('Acceptance: Posts / Pages', function () { await selectChoose('[data-test-author-select]', editor.name); // API request is correct - let postsRequests = this.server.pretender.handledRequests.filter(r => r.url.includes('/posts/') && r.method === 'GET'); - let lastPostsRequest = postsRequests[postsRequests.length - 1]; + const postsRequests = this.server.pretender.handledRequests.filter(r => r.url.includes('/posts/') && r.method === 'GET'); + const lastPostsRequest = postsRequests[postsRequests.length - 1]; expect(lastPostsRequest.queryParams.allFilter, '"editor" request status filter') .to.have.string('status:[draft,scheduled,published,sent]'); expect(lastPostsRequest.queryParams.allFilter, '"editor" request filter param') @@ -380,7 +380,7 @@ describe('Acceptance: Posts / Pages', function () { // select one await selectChoose('[data-test-tag-select]', 'B - Second'); // affirm request - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.queryParams.allFilter, '"posts" request filter param').to.have.string('tag:second'); }); @@ -392,13 +392,13 @@ describe('Acceptance: Posts / Pages', function () { await selectSearch('[data-test-tag-select]', 'Last'); - let options = findAll('.ember-power-select-option'); + const options = findAll('.ember-power-select-option'); expect(options.length, 'options count').to.equal(1); expect(options[0].textContent.trim()).to.equal('Z - Last'); await selectChoose('[data-test-tag-select]', 'Z - Last'); - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.queryParams.allFilter, '"posts" request filter param').to.have.string('tag:last'); }); @@ -430,9 +430,9 @@ describe('Acceptance: Posts / Pages', function () { await triggerEvent(post, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); // this is a