From d66470b2ffa9a1f7878ab7e60ca39e8a2a309e0e Mon Sep 17 00:00:00 2001 From: Evan Hahn Date: Fri, 18 Sep 2026 05:16:52 -0500 Subject: [PATCH 1/4] Update dependency Sinon to v22.1.0 (#30900) no ref --- .changeset/sweet-eggs-joke.md | 5 +++++ pnpm-lock.yaml | 29 +++++++++++++---------------- pnpm-workspace.yaml | 2 +- 3 files changed, 19 insertions(+), 17 deletions(-) create mode 100644 .changeset/sweet-eggs-joke.md 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/pnpm-lock.yaml b/pnpm-lock.yaml index 31bbc0a3387..4e991e9399e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -627,8 +627,8 @@ catalogs: specifier: 1.10.0 version: 1.10.0 sinon: - specifier: 22.0.0 - version: 22.0.0 + specifier: 22.1.0 + version: 22.1.0 sonner: specifier: 2.0.7 version: 2.0.7 @@ -1459,7 +1459,7 @@ importers: version: 16.1.1(postcss@8.5.26) sinon: specifier: 'catalog:' - version: 22.0.0 + version: 22.1.0 tailwindcss: specifier: catalog:tailwind3 version: 3.4.19(tsx@4.23.12)(yaml@2.9.0) @@ -3093,7 +3093,7 @@ importers: version: 6.15.3 sinon: specifier: 'catalog:' - version: 22.0.0 + version: 22.1.0 supertest: specifier: 'catalog:' version: 7.2.2(supports-color@10.2.2) @@ -4141,7 +4141,7 @@ importers: version: 9.39.4(jiti@2.7.0)(supports-color@10.2.2) sinon: specifier: 'catalog:' - version: 22.0.0 + version: 22.1.0 typescript: specifier: 'catalog:' version: '@typescript/typescript6@6.0.2' @@ -4298,7 +4298,7 @@ importers: version: 9.39.4(jiti@2.7.0)(supports-color@10.2.2) sinon: specifier: 'catalog:' - version: 22.0.0 + version: 22.1.0 vitest: specifier: 'catalog:' version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.0.0)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(@vitest/ui@4.1.10)(jsdom@30.0.1(@noble/hashes@1.8.0))(msw@2.14.6(@types/node@26.0.0)(@typescript/typescript6@6.0.2))(vite@8.1.3(@types/node@26.0.0)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(tsx@4.23.12)(yaml@2.9.0)) @@ -16852,6 +16852,7 @@ packages: mysql2: '*' pg: '*' pg-native: '*' + sqlite3: '*' tedious: '*' peerDependenciesMeta: better-sqlite3: @@ -16864,6 +16865,8 @@ packages: optional: true pg-native: optional: true + sqlite3: + optional: true tedious: optional: true @@ -16877,6 +16880,7 @@ packages: mysql2: '*' pg: '*' pg-native: '*' + sqlite3: '*' tedious: '*' peerDependenciesMeta: better-sqlite3: @@ -16889,6 +16893,8 @@ packages: optional: true pg-native: optional: true + sqlite3: + optional: true tedious: optional: true @@ -20905,9 +20911,6 @@ packages: chai: ^5.0.0 || ^6.0.0 sinon: '>=4.0.0' - sinon@22.0.0: - resolution: {integrity: sha512-sq/6DpdXOrLyfbKlXLg/Usc7xu8YXPeLkOFZRvA3bNUSA2lhbrZ06yuXbH1fkzBPCbz9O10+7hznzUsjaYNm0Q==} - sinon@22.1.0: resolution: {integrity: sha512-n1ajF2rBWMTtEwbKcw4UdFg4nCnDdq/U6RDoxtOd7oapOlRoJ5ynwFx60owROyhDpA9QhMZi0pCO/xtmwFjG7w==} @@ -28976,6 +28979,7 @@ snapshots: - mysql2 - pg - pg-native + - sqlite3 - supports-color - tedious @@ -44708,13 +44712,6 @@ snapshots: chai: 4.5.0 sinon: 22.1.0 - sinon@22.0.0: - dependencies: - '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 15.4.0 - '@sinonjs/samsam': 10.0.2 - diff: 9.0.0 - sinon@22.1.0: dependencies: '@sinonjs/commons': 3.0.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5a027052633..b2bd692ec06 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -168,7 +168,7 @@ catalog: react-router: 7.18.1 semver: 7.8.5 should: 13.2.3 - sinon: 22.0.0 + sinon: 22.1.0 sonner: 2.0.7 storybook: 10.4.6 stylelint: 17.14.1 From f47a30af4468deab4a1ef0352ec563646a001c6e Mon Sep 17 00:00:00 2001 From: Evan Hahn Date: Fri, 18 Sep 2026 05:31:59 -0500 Subject: [PATCH 2/4] TypeScriptified better-sqlite3 patches tests (#30902) no ref --- ...test.js => better-sqlite3-patches.test.ts} | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) rename ghost/core/test/unit/server/data/db/{better-sqlite3-patches.test.js => better-sqlite3-patches.test.ts} (88%) diff --git a/ghost/core/test/unit/server/data/db/better-sqlite3-patches.test.js b/ghost/core/test/unit/server/data/db/better-sqlite3-patches.test.ts similarity index 88% rename from ghost/core/test/unit/server/data/db/better-sqlite3-patches.test.js rename to ghost/core/test/unit/server/data/db/better-sqlite3-patches.test.ts index f0e93ea91d9..1091c77d8bc 100644 --- a/ghost/core/test/unit/server/data/db/better-sqlite3-patches.test.js +++ b/ghost/core/test/unit/server/data/db/better-sqlite3-patches.test.ts @@ -1,14 +1,17 @@ -const assert = require('node:assert/strict'); - -const patches = require('../../../../../core/server/data/db/better-sqlite3-patches'); -const { +import assert from 'node:assert/strict'; +import { SQLITE_PRIMARY_RESULT_CODES, - getPrimarySqliteCode, - normalizeSqliteError, + applyBetterSqlite3Patches, expandArrayBindings, formatBindings, - applyBetterSqlite3Patches, -} = patches; + getPrimarySqliteCode, + normalizeSqliteError, + // @ts-expect-error This module lacks type definitions. +} from '../../../../../core/server/data/db/better-sqlite3-patches'; +// @ts-expect-error This module lacks type definitions. +import BetterSqlite3Client from 'knex/lib/dialects/better-sqlite3/index.js'; + +type SqliteError = Error & { code?: string; errno?: number }; describe('better-sqlite3 patches', function () { describe('getPrimarySqliteCode', function () { @@ -36,7 +39,7 @@ describe('better-sqlite3 patches', function () { describe('normalizeSqliteError', function () { it('adds a numeric errno and primary code to a better-sqlite3 error', function () { - const err = new Error('UNIQUE constraint failed'); + const err: SqliteError = new Error('UNIQUE constraint failed'); err.code = 'SQLITE_CONSTRAINT_UNIQUE'; const result = normalizeSqliteError(err); @@ -48,7 +51,7 @@ describe('better-sqlite3 patches', function () { }); it('normalizes a primary code error', function () { - const err = new Error('no such column'); + const err: SqliteError = new Error('no such column'); err.code = 'SQLITE_ERROR'; normalizeSqliteError(err); @@ -58,7 +61,7 @@ describe('better-sqlite3 patches', function () { }); it('leaves an error that already has an errno untouched', function () { - const err = new Error('already normalized'); + const err: SqliteError = new Error('already normalized'); err.code = 'SQLITE_CONSTRAINT'; err.errno = 19; @@ -69,7 +72,7 @@ describe('better-sqlite3 patches', function () { }); it('leaves a non-SQLITE error untouched', function () { - const err = new Error('some other error'); + const err: SqliteError = new Error('some other error'); err.code = 'ECONNREFUSED'; normalizeSqliteError(err); @@ -79,7 +82,7 @@ describe('better-sqlite3 patches', function () { }); it('leaves an unknown SQLITE code untouched (no errno set)', function () { - const err = new Error('mystery'); + const err: SqliteError = new Error('mystery'); err.code = 'SQLITE_MYSTERY'; normalizeSqliteError(err); @@ -94,7 +97,7 @@ describe('better-sqlite3 patches', function () { }); it('ignores an error without a string code', function () { - const err = new Error('no code'); + const err: SqliteError = new Error('no code'); normalizeSqliteError(err); @@ -216,14 +219,12 @@ describe('better-sqlite3 patches', function () { }); describe('applyBetterSqlite3Patches', function () { - let BetterSqlite3Client; - let originalQuery; - let originalFormatBindings; + let originalQuery: unknown; + let originalFormatBindings: unknown; beforeAll(function () { // Capture the unpatched dialect methods so we can restore them after, // since the patch mutates the shared prototype. - BetterSqlite3Client = require('knex/lib/dialects/better-sqlite3/index.js'); originalQuery = BetterSqlite3Client.prototype._query; originalFormatBindings = BetterSqlite3Client.prototype._formatBindings; }); @@ -251,10 +252,10 @@ describe('better-sqlite3 patches', function () { }); it('patched _query expands array bindings before delegating to the original', async function () { - let seen; + let seen: unknown; // Install a stub as the "original" _query that records what it receives, // then patch on top of it. - BetterSqlite3Client.prototype._query = function (connection, queryObj) { + BetterSqlite3Client.prototype._query = function (_connection: unknown, queryObj: unknown) { seen = queryObj; return Promise.resolve(); }; @@ -263,6 +264,9 @@ describe('better-sqlite3 patches', function () { const obj = { sql: 'select * from posts where id in (?)', bindings: [[1, 2, 3]] }; await BetterSqlite3Client.prototype._query.call({}, {}, obj); + assert(seen && typeof seen === 'object'); + assert('sql' in seen); + assert('bindings' in seen); assert.equal(seen.sql, 'select * from posts where id in (?, ?, ?)'); assert.deepEqual(seen.bindings, [1, 2, 3]); }); @@ -271,7 +275,7 @@ describe('better-sqlite3 patches', function () { // Re-establish a clean baseline original that rejects with a raw // better-sqlite3-style error. BetterSqlite3Client.prototype._query = function () { - const err = new Error('UNIQUE constraint failed'); + const err: SqliteError = new Error('UNIQUE constraint failed'); err.code = 'SQLITE_CONSTRAINT_PRIMARYKEY'; return Promise.reject(err); }; @@ -279,7 +283,7 @@ describe('better-sqlite3 patches', function () { await assert.rejects( BetterSqlite3Client.prototype._query.call({}, {}, { sql: 'insert', bindings: [] }), - (err) => { + (err: SqliteError) => { assert.equal(err.code, 'SQLITE_CONSTRAINT'); assert.equal(err.errno, 19); return true; From 4b8ba024c10da32937338900b3dab034e7d0b293 Mon Sep 17 00:00:00 2001 From: Evan Hahn Date: Fri, 18 Sep 2026 05:47:27 -0500 Subject: [PATCH 3/4] TypeScriptified Gravatar unit test (#30903) no ref --- .../{gravatar.test.js => gravatar.test.ts} | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) rename ghost/core/test/unit/server/lib/image/{gravatar.test.js => gravatar.test.ts} (83%) diff --git a/ghost/core/test/unit/server/lib/image/gravatar.test.js b/ghost/core/test/unit/server/lib/image/gravatar.test.ts similarity index 83% rename from ghost/core/test/unit/server/lib/image/gravatar.test.js rename to ghost/core/test/unit/server/lib/image/gravatar.test.ts index ecbe1d9851f..c62b97db75c 100644 --- a/ghost/core/test/unit/server/lib/image/gravatar.test.js +++ b/ghost/core/test/unit/server/lib/image/gravatar.test.ts @@ -1,6 +1,7 @@ -const assert = require('node:assert/strict'); -const { assertExists } = require('../../../../utils/assertions'); -const Gravatar = require('../../../../../core/server/lib/image/gravatar'); +import assert from 'node:assert/strict'; +import { assertExists } from '../../../../utils/assertions'; +// @ts-expect-error This module lacks type definitions. +import Gravatar from '../../../../../core/server/lib/image/gravatar'; describe('lib/image: gravatar', function () { const gravatarUrl = 'https://www.gravatar.com/avatar/{hash}?s={size}&r={rating}&d={_default}'; @@ -9,7 +10,7 @@ describe('lib/image: gravatar', function () { const gravatar = new Gravatar({ config: { isPrivacyDisabled: () => false, - get: (config) => { + get: (config: string) => { return config === 'gravatar' ? { url: gravatarUrl, @@ -33,7 +34,7 @@ describe('lib/image: gravatar', function () { const gravatar = new Gravatar({ config: { isPrivacyDisabled: () => false, - get: (config) => { + get: (config: string) => { return config === 'gravatar' ? { url: gravatarUrl, @@ -57,7 +58,7 @@ describe('lib/image: gravatar', function () { const gravatar = new Gravatar({ config: { isPrivacyDisabled: () => false, - get: (config) => { + get: (config: string) => { return config === 'gravatar' ? { url: gravatarUrl, @@ -80,7 +81,7 @@ describe('lib/image: gravatar', function () { const gravatar = new Gravatar({ config: { isPrivacyDisabled: () => false, - get: (config) => { + get: (config: string) => { return config === 'gravatar' ? { url: gravatarUrl, @@ -88,7 +89,7 @@ describe('lib/image: gravatar', function () { : null; }, }, - request: (url, options) => { + request: (_url: string, options: { timeout: { request: number } }) => { assert.equal(options.timeout.request, delay); }, }); From f2286c6de0fad599c07cdcb49a96012c5fad5e8f Mon Sep 17 00:00:00 2001 From: Evan Hahn Date: Fri, 18 Sep 2026 05:59:59 -0500 Subject: [PATCH 4/4] Used `const` instead of `let` where possible (#30904) no ref This change should have no user impact. This enforces the `prefer-const` in more places. This makes our code a little more uniform, and makes it easier to migrate files to TypeScript where this lint rule is already enforced. --- .github/scripts/i18n-review/eslint.config.mjs | 1 + apps/admin-toolbar/src/index.js | 4 +- .../src/components/announcement-bar.jsx | 2 +- apps/announcement-bar/src/utils/api.js | 2 +- apps/ember-admin/app/adapters/api-key.js | 2 +- apps/ember-admin/app/adapters/base.js | 4 +- apps/ember-admin/app/adapters/collection.js | 2 +- apps/ember-admin/app/adapters/email.js | 2 +- .../app/adapters/embedded-relation-adapter.js | 30 ++-- apps/ember-admin/app/adapters/label.js | 2 +- apps/ember-admin/app/adapters/member.js | 8 +- apps/ember-admin/app/adapters/setting.js | 6 +- apps/ember-admin/app/adapters/tag.js | 2 +- apps/ember-admin/app/adapters/theme.js | 4 +- apps/ember-admin/app/adapters/tier.js | 8 +- apps/ember-admin/app/adapters/user.js | 4 +- apps/ember-admin/app/app.js | 2 +- .../components/editor/modals/preview/email.js | 16 +-- .../modals/preview/email/email-subject.js | 6 +- .../editor/modals/re-authenticate.js | 2 +- .../app/components/gh-cm-editor.js | 10 +- .../app/components/gh-context-menu.js | 2 +- .../app/components/gh-date-time-picker.js | 26 ++-- .../ember-admin/app/components/gh-dropdown.js | 12 +- .../app/components/gh-editor-feature-image.js | 2 +- apps/ember-admin/app/components/gh-editor.js | 6 +- .../app/components/gh-error-message.js | 4 +- .../app/components/gh-fullscreen-modal.js | 8 +- .../app/components/gh-image-uploader.js | 34 ++--- .../components/gh-input-with-select/index.js | 2 +- .../gh-input-with-select/trigger.js | 2 +- .../components/gh-koenig-editor-lexical.js | 4 +- .../app/components/gh-member-avatar.js | 10 +- .../app/components/gh-post-settings-menu.js | 52 +++---- .../visibility-segment-select.js | 4 +- .../app/components/gh-progress-bar.js | 4 +- .../app/components/gh-psm-template-select.js | 18 +-- .../app/components/gh-scroll-trigger.js | 4 +- .../app/components/gh-search-input.js | 8 +- .../app/components/gh-skip-link.js | 4 +- .../app/components/gh-tags-token-input.js | 8 +- .../app/components/gh-task-button.js | 20 +-- .../ember-admin/app/components/gh-textarea.js | 2 +- .../app/components/gh-token-input.js | 18 +-- .../app/components/gh-token-input/trigger.js | 10 +- .../app/components/gh-trim-focus-input.js | 2 +- .../ember-admin/app/components/gh-unsplash.js | 4 +- .../ember-admin/app/components/gh-uploader.js | 50 +++---- .../app/components/gh-url-preview.js | 10 +- .../app/components/koenig-image-editor.js | 6 +- .../app/components/koenig-lexical-editor.js | 4 +- .../components/modal-members-label-form.js | 12 +- .../app/components/modal-post-history.js | 8 +- .../app/components/modals/email-preview.js | 14 +- .../modals/new-custom-integration.js | 4 +- .../components/posts-list/content-filter.js | 14 +- .../app/components/posts-list/context-menu.js | 4 +- .../posts-list/list-item-analytics.js | 4 +- .../app/components/posts-list/list-item.js | 4 +- .../ember-admin/app/components/posts/debug.js | 24 ++-- .../app/components/tags/tag-form.js | 2 +- .../app/controllers/application.js | 2 +- .../app/controllers/lexical-editor.js | 108 +++++++-------- apps/ember-admin/app/controllers/reset.js | 2 +- apps/ember-admin/app/controllers/setup.js | 12 +- apps/ember-admin/app/controllers/signin.js | 12 +- apps/ember-admin/app/controllers/tag.js | 2 +- apps/ember-admin/app/decorators/inject.js | 2 +- .../app/helpers/background-image-style.js | 2 +- apps/ember-admin/app/helpers/event-name.js | 2 +- .../app/helpers/gh-count-characters.js | 6 +- .../app/helpers/gh-count-down-characters.js | 6 +- .../app/helpers/gh-format-post-time.js | 8 +- apps/ember-admin/app/helpers/gh-pluralize.js | 2 +- .../app/helpers/gh-price-amount.js | 2 +- .../app/helpers/highlighted-text.js | 8 +- .../app/helpers/history-event-filter.js | 2 +- .../app/helpers/humanize-recipient-filter.js | 2 +- .../app/helpers/integration-icon-style.js | 2 +- .../app/helpers/members-event-filter.js | 2 +- .../app/helpers/parse-member-event.js | 2 +- apps/ember-admin/app/helpers/split-number.js | 8 +- .../app/initializers/ember-simple-auth.js | 2 +- .../app/initializers/trailing-hash.js | 8 +- apps/ember-admin/app/mixins/shortcuts.js | 8 +- apps/ember-admin/app/mixins/text-input.js | 6 +- .../app/mixins/validation-engine.js | 14 +- .../app/mixins/validation-state.js | 6 +- apps/ember-admin/app/models/email.js | 2 +- apps/ember-admin/app/models/invite.js | 4 +- apps/ember-admin/app/models/member.js | 10 +- .../ember-admin/app/models/navigation-item.js | 4 +- apps/ember-admin/app/models/post.js | 64 ++++----- apps/ember-admin/app/models/tag.js | 2 +- apps/ember-admin/app/models/theme.js | 4 +- .../app/models/tier-benefit-item.js | 4 +- apps/ember-admin/app/models/user.js | 10 +- apps/ember-admin/app/modifiers/ratio-zoom.js | 4 +- apps/ember-admin/app/routes/application.js | 5 +- apps/ember-admin/app/routes/lexical-editor.js | 24 ++-- .../app/routes/lexical-editor/edit.js | 8 +- .../app/routes/lexical-editor/new.js | 4 +- apps/ember-admin/app/routes/posts.js | 20 +-- apps/ember-admin/app/routes/posts/debug.js | 4 +- apps/ember-admin/app/routes/pro.js | 2 +- apps/ember-admin/app/routes/setup.js | 6 +- apps/ember-admin/app/routes/signup.js | 6 +- .../ember-admin/app/routes/unauthenticated.js | 4 +- .../app/serializers/application.js | 10 +- apps/ember-admin/app/serializers/label.js | 6 +- apps/ember-admin/app/serializers/member.js | 2 +- apps/ember-admin/app/serializers/page.js | 2 +- apps/ember-admin/app/serializers/post.js | 2 +- apps/ember-admin/app/serializers/setting.js | 12 +- apps/ember-admin/app/serializers/tag.js | 6 +- apps/ember-admin/app/serializers/tier.js | 2 +- apps/ember-admin/app/serializers/user.js | 4 +- apps/ember-admin/app/services/ajax.js | 10 +- apps/ember-admin/app/services/clock.js | 2 +- .../app/services/config-manager.js | 2 +- apps/ember-admin/app/services/custom-views.js | 22 +-- apps/ember-admin/app/services/dropdown.js | 2 +- apps/ember-admin/app/services/feature.js | 18 +-- apps/ember-admin/app/services/lazy-loader.js | 8 +- apps/ember-admin/app/services/limit.js | 2 +- .../app/services/local-revisions.js | 4 +- .../ember-admin/app/services/members-stats.js | 42 +++--- apps/ember-admin/app/services/migrate.js | 2 +- .../ember-admin/app/services/notifications.js | 16 +-- apps/ember-admin/app/services/session.js | 2 +- .../app/services/slug-generator.js | 6 +- apps/ember-admin/app/services/state-bridge.js | 4 +- apps/ember-admin/app/services/ui.js | 10 +- .../app/services/unsaved-changes.js | 2 +- apps/ember-admin/app/services/unsplash.js | 30 ++-- .../app/services/upgrade-status.js | 2 +- .../app/session-stores/application.js | 2 +- .../app/transforms/facebook-url-user.js | 4 +- .../ember-admin/app/transforms/json-string.js | 2 +- .../app/transforms/member-subscription.js | 5 +- .../ember-admin/app/transforms/member-tier.js | 5 +- .../app/transforms/navigation-settings.js | 12 +- .../app/transforms/tier-benefits.js | 7 +- .../app/transforms/twitter-url-user.js | 4 +- apps/ember-admin/app/transitions/wormhole.js | 2 +- apps/ember-admin/app/utils/caja-sanitizers.js | 4 +- apps/ember-admin/app/utils/ghost-paths.js | 22 +-- apps/ember-admin/app/utils/link-component.js | 2 +- .../ember-admin/app/validators/invite-user.js | 4 +- apps/ember-admin/app/validators/member.js | 4 +- .../app/validators/mixins/password.js | 11 +- apps/ember-admin/app/validators/nav-item.js | 14 +- apps/ember-admin/app/validators/new-user.js | 4 +- apps/ember-admin/app/validators/post.js | 20 +-- apps/ember-admin/app/validators/reset.js | 4 +- apps/ember-admin/app/validators/setting.js | 10 +- apps/ember-admin/app/validators/setup.js | 2 +- apps/ember-admin/app/validators/signin.js | 8 +- apps/ember-admin/app/validators/snippet.js | 2 +- apps/ember-admin/app/validators/subscriber.js | 2 +- .../app/validators/tag-settings.js | 10 +- .../app/validators/tier-benefit-item.js | 4 +- apps/ember-admin/app/validators/user.js | 20 +-- apps/ember-admin/ember-cli-build.js | 10 +- .../ember-power-calendar-utils/addon/index.js | 10 +- apps/ember-admin/mirage/config.js | 2 +- .../mirage/config/authentication.js | 12 +- .../ember-admin/mirage/config/integrations.js | 14 +- apps/ember-admin/mirage/config/invites.js | 8 +- apps/ember-admin/mirage/config/labels.js | 8 +- apps/ember-admin/mirage/config/members.js | 20 +-- apps/ember-admin/mirage/config/pages.js | 10 +- apps/ember-admin/mirage/config/posts.js | 22 +-- apps/ember-admin/mirage/config/settings.js | 10 +- apps/ember-admin/mirage/config/tags.js | 2 +- apps/ember-admin/mirage/config/themes.js | 2 +- apps/ember-admin/mirage/config/tiers.js | 4 +- apps/ember-admin/mirage/config/uploads.js | 8 +- apps/ember-admin/mirage/config/users.js | 14 +- apps/ember-admin/mirage/config/webhooks.js | 4 +- .../mirage/factories/integration.js | 4 +- apps/ember-admin/mirage/factories/member.js | 2 +- apps/ember-admin/mirage/factories/page.js | 4 +- apps/ember-admin/mirage/factories/post.js | 4 +- apps/ember-admin/mirage/factories/webhook.js | 2 +- .../mirage/serializers/application.js | 4 +- apps/ember-admin/mirage/serializers/label.js | 2 +- apps/ember-admin/mirage/serializers/member.js | 2 +- .../mirage/serializers/subscription.js | 2 +- apps/ember-admin/mirage/serializers/tag.js | 2 +- apps/ember-admin/mirage/serializers/tier.js | 2 +- apps/ember-admin/mirage/utils.js | 12 +- apps/ember-admin/testem.js | 2 +- .../tests/acceptance/authentication-test.js | 14 +- .../tests/acceptance/content-test.js | 130 +++++++++--------- .../acceptance/custom-post-templates-test.js | 10 +- .../acceptance/editor-react-flag-test.js | 6 +- .../tests/acceptance/editor-test.js | 88 ++++++------ .../acceptance/editor/feature-image-test.js | 2 +- .../tests/acceptance/editor/lexical-test.js | 2 +- .../editor/post-email-preview-test.js | 2 +- .../acceptance/editor/post-preview-test.js | 2 +- .../acceptance/editor/post-revisions-test.js | 2 +- .../editor/post-settings-menu-test.js | 6 +- .../acceptance/editor/publish-flow-test.js | 2 +- .../editor/super-editor-lexical-test.js | 4 +- .../acceptance/editor/unsaved-changes-test.js | 2 +- .../acceptance/editor/visibility-test.js | 16 +-- .../tests/acceptance/error-handling-test.js | 8 +- .../tests/acceptance/members-activity-test.js | 2 +- .../tests/acceptance/password-reset-test.js | 2 +- .../acceptance/posts-list-react-flag-test.js | 4 +- .../tests/acceptance/restore-post-test.js | 4 +- .../tests/acceptance/setup-test.js | 4 +- .../tests/acceptance/signin-test.js | 12 +- .../tests/acceptance/signup-test.js | 6 +- .../tests/acceptance/tag-react-flag-test.js | 4 +- apps/ember-admin/tests/helpers/file-upload.js | 6 +- .../tests/integration/adapters/user-test.js | 2 +- .../integration/components/gh-alert-test.js | 8 +- .../integration/components/gh-alerts-test.js | 8 +- .../components/gh-basic-dropdown-test.js | 2 +- .../components/gh-cm-editor-test.js | 4 +- .../components/gh-form-group-test.js | 2 +- .../components/gh-image-uploader-test.js | 42 +++--- .../gh-image-uploader-with-preview-test.js | 4 +- .../components/gh-member-avatar-test.js | 2 +- .../gh-members-recipient-select-test.js | 8 +- .../gh-members-segment-select-test.js | 14 +- .../components/gh-notification-test.js | 8 +- .../components/gh-notifications-test.js | 6 +- .../components/gh-psm-authors-input-test.js | 2 +- .../components/gh-psm-tags-input-test.js | 24 ++-- .../gh-psm-visibility-input-test.js | 2 +- .../components/gh-uploader-test.js | 32 ++--- .../components/tags/tag-form-test.js | 30 ++-- .../helpers/gh-format-post-time-test.js | 32 ++--- .../helpers/gh-url-preview-test.js | 2 +- .../modifiers/validation-status-test.js | 2 +- .../tests/integration/services/ajax-test.js | 32 ++--- .../tests/integration/services/config-test.js | 2 +- .../integration/services/feature-test.js | 78 +++++------ .../integration/services/lazy-loader-test.js | 6 +- .../services/slug-generator-test.js | 10 +- .../tests/unit/authenticators/cookie-test.js | 12 +- .../tests/unit/controllers/editor-test.js | 58 ++++---- .../unit/helpers/gh-count-characters-test.js | 10 +- .../helpers/gh-count-down-characters-test.js | 8 +- .../unit/helpers/gh-user-can-admin-test.js | 8 +- .../unit/helpers/highlighted-text-test.js | 4 +- .../tests/unit/models/invite-test.js | 10 +- .../tests/unit/models/member-test.js | 2 +- .../tests/unit/models/navigation-item-test.js | 16 +-- .../tests/unit/models/post-test.js | 20 +-- .../tests/unit/models/role-test.js | 2 +- .../tests/unit/models/setting-test.js | 2 +- .../ember-admin/tests/unit/models/tag-test.js | 2 +- .../tests/unit/models/user-test.js | 34 ++--- .../tests/unit/serializers/member-test.js | 24 ++-- .../unit/serializers/notification-test.js | 4 +- .../unit/services/local-revisions-test.js | 8 +- .../tests/unit/services/migrate-test.js | 4 +- .../tests/unit/services/notifications-test.js | 88 ++++++------ .../tests/unit/services/unsplash-test.js | 10 +- .../unit/transforms/facebook-url-user-test.js | 12 +- .../tests/unit/transforms/json-string-test.js | 10 +- .../transforms/navigation-settings-test.js | 12 +- .../unit/transforms/twitter-url-user-test.js | 12 +- .../tests/unit/utils/ghost-paths-test.js | 2 +- .../tests/unit/validators/nav-item-test.js | 18 +-- .../tests/unit/validators/post-test.js | 24 ++-- .../unit/validators/tag-settings-test.js | 49 +++---- apps/portal/src/app.jsx | 8 +- .../src/components/common/action-button.jsx | 4 +- .../src/components/common/member-gravatar.jsx | 2 +- .../common/newsletter-management.jsx | 2 +- .../components/common/products-section.jsx | 4 +- .../components/email-newsletter-action.jsx | 4 +- .../components/paid-account-actions.jsx | 2 +- .../components/pages/account-plan-page.jsx | 2 +- .../pages/newsletter-selection-page.jsx | 2 +- .../src/components/pages/signup-page.jsx | 2 +- apps/portal/src/components/popup-modal.jsx | 2 +- apps/portal/src/components/trigger-button.jsx | 2 +- apps/portal/src/data-attributes.js | 50 +++---- apps/portal/src/utils/api.js | 6 +- apps/portal/src/utils/fixtures.js | 4 +- apps/portal/src/utils/helpers.js | 10 +- apps/portal/src/utils/notifications.js | 2 +- apps/portal/test/data-attributes.test.jsx | 6 +- apps/portal/test/portal-links.test.jsx | 22 +-- apps/portal/test/signin-flow.test.jsx | 4 +- apps/portal/test/signup-flow.test.jsx | 8 +- .../pages/account-email-page.test.jsx | 10 +- apps/portal/test/utils/helpers.test.js | 30 ++-- .../src/components/popup-modal.jsx | 10 +- apps/sodo-search/src/search-index.js | 2 +- .../test/acceptance/search-index.test.js | 8 +- configs/eslint/index.mjs | 1 + ghost/core/core/boot.js | 4 +- ghost/core/core/bridge.js | 2 +- .../frontend/apps/private-blogging/index.js | 4 +- .../apps/private-blogging/lib/middleware.js | 2 +- .../apps/private-blogging/lib/router.js | 2 +- .../core/core/frontend/helpers/cancel_link.js | 6 +- ghost/core/core/frontend/helpers/content.js | 4 +- .../core/frontend/helpers/content_api_url.js | 2 +- ghost/core/core/frontend/helpers/date.js | 2 +- ghost/core/core/frontend/helpers/foreach.js | 2 +- ghost/core/core/frontend/helpers/get.js | 2 +- .../core/core/frontend/helpers/ghost_head.js | 4 +- ghost/core/core/frontend/helpers/has.js | 4 +- ghost/core/core/frontend/helpers/link.js | 14 +- .../core/core/frontend/helpers/link_class.js | 4 +- .../core/core/frontend/helpers/navigation.js | 3 +- .../core/frontend/helpers/recommendations.js | 11 +- ghost/core/core/frontend/helpers/tiers.js | 2 +- .../core/frontend/helpers/total_members.js | 2 +- .../frontend/helpers/total_paid_members.js | 2 +- ghost/core/core/frontend/meta/author-url.js | 2 +- .../core/core/frontend/meta/modified-date.js | 2 +- .../core/core/frontend/meta/published-date.js | 2 +- ghost/core/core/frontend/meta/schema.js | 11 +- .../core/frontend/meta/structured-data.js | 3 +- .../services/assets-minification/minifier.js | 2 +- .../frontend/services/data/entry-lookup.js | 2 +- .../core/frontend/services/data/fetch-data.js | 4 +- .../services/rendering/format-response.js | 2 +- .../services/routing/controllers/static.js | 2 +- .../services/routing/parent-router.js | 2 +- .../frontend/services/routing/registry.js | 2 +- .../services/theme-engine/handlebars/utils.js | 16 +-- .../services/theme-engine/i18n/i18n.js | 9 +- .../update-global-template-options.js | 2 +- .../frontend/services/theme-engine/preview.js | 2 +- .../core/core/frontend/utils/member-count.js | 4 +- .../frontend/web/routers/serve-public-file.js | 2 +- ghost/core/core/server/api/endpoints/db.js | 2 +- ghost/core/core/server/api/endpoints/mail.js | 2 +- .../api/endpoints/member-signin-urls.js | 2 +- .../core/core/server/api/endpoints/members.js | 6 +- .../core/core/server/api/endpoints/oembed.js | 2 +- ghost/core/core/server/api/endpoints/posts.js | 2 +- .../core/server/api/endpoints/settings.js | 4 +- .../core/core/server/api/endpoints/themes.js | 10 +- .../utils/serializers/input/pages.js | 4 +- .../utils/serializers/input/posts.js | 4 +- .../endpoints/utils/serializers/input/tags.js | 2 +- .../input/utils/slug-filter-order.js | 8 +- .../utils/serializers/output/mappers/posts.js | 2 +- .../utils/serializers/output/pages.js | 8 +- .../utils/serializers/output/posts.js | 8 +- .../utils/serializers/output/search-index.js | 22 +-- .../utils/serializers/output/settings.js | 2 +- .../serializers/output/utils/extra-attrs.js | 6 +- .../server/data/importer/handlers/image.js | 3 +- .../server/data/importer/handlers/json.js | 4 +- .../server/data/importer/handlers/markdown.js | 12 +- .../server/data/importer/import-manager.js | 2 +- .../importers/content-file-importer.js | 12 +- .../data/importer/importers/data/base.js | 18 +-- .../data/custom-theme-settings-importer.js | 2 +- .../importer/importers/data/data-importer.js | 7 +- .../importer/importers/data/posts-importer.js | 16 +-- .../importers/data/products-importer.js | 6 +- .../importers/data/settings-importer.js | 4 +- .../importers/data/stripe-prices-importer.js | 2 +- .../data/stripe-products-importer.js | 2 +- .../importer/importers/data/tags-importer.js | 2 +- .../importer/importers/data/users-importer.js | 2 +- .../data/importer/importers/json-to-html.js | 21 +-- .../5.0/2022-05-11-13-12-rename-settings.js | 2 +- .../importers/email-recipients-importer.js | 4 +- .../members-login-events-importer.js | 2 +- .../importers/members-newsletters-importer.js | 2 +- ...mbers-paid-subscription-events-importer.js | 2 +- .../members-status-events-importer.js | 2 +- .../members-stripe-customers-importer.js | 2 +- ...stripe-customers-subscriptions-importer.js | 2 +- .../members-subscribe-events-importer.js | 4 +- ...rs-subscription-created-events-importer.js | 2 +- .../scripts/docker-analytics-manager.js | 4 +- .../core/core/server/lib/image/image-size.js | 4 +- .../server/models/base/plugins/actions.js | 2 +- .../core/server/models/base/plugins/crud.js | 3 +- .../core/server/models/base/plugins/events.js | 2 +- .../server/models/base/plugins/raw-knex.js | 6 +- ghost/core/core/server/models/benefit.js | 2 +- ghost/core/core/server/models/collection.js | 2 +- ghost/core/core/server/models/comment.js | 6 +- ghost/core/core/server/models/invite.js | 7 +- ghost/core/core/server/models/label.js | 9 +- ghost/core/core/server/models/member.js | 5 +- ghost/core/core/server/models/newsletter.js | 2 +- ghost/core/core/server/models/permission.js | 9 +- ghost/core/core/server/models/post.js | 43 +++--- ghost/core/core/server/models/product.js | 5 +- .../core/server/models/relations/authors.js | 21 ++- ghost/core/core/server/models/role.js | 7 +- ghost/core/core/server/models/settings.js | 4 +- ghost/core/core/server/models/tag.js | 7 +- ghost/core/core/server/models/user.js | 18 ++- ghost/core/core/server/models/webhook.js | 6 +- ghost/core/core/server/notify.js | 4 +- .../legacy-api-path-match.js | 4 +- .../server/services/auth/api-key/admin.js | 4 +- .../server/services/auth/api-key/content.js | 2 +- .../server/services/auth/passwordreset.js | 2 +- ghost/core/core/server/services/auth/setup.js | 4 +- .../comments-service-email-renderer.js | 2 +- .../comments/comments-service-emails.js | 2 +- .../comments/comments-stats-service.js | 2 +- .../email-service/batch-sending-service.js | 4 +- .../services/email-service/email-renderer.js | 4 +- .../services/email-service/email-service.js | 2 +- .../core/server/services/gifts/jobs/index.js | 2 +- .../server/services/invitations/accept.js | 4 +- ghost/core/core/server/services/limits.js | 2 +- .../core/server/services/mail/ghost-mailer.js | 2 +- .../member-attribution-service.js | 2 +- .../member-attribution/referrer-translator.js | 2 +- .../services/members-events/event-storage.js | 4 +- .../core/core/server/services/members/api.js | 2 +- .../server/services/members/jobs/index.js | 2 +- .../controllers/member-controller.js | 4 +- .../members/members-api/members-api.js | 4 +- .../repositories/event-repository.js | 2 +- .../repositories/member-repository.js | 6 +- .../repositories/product-repository.js | 2 +- .../services/members/stats/members-stats.js | 4 +- .../mentions/mention-sending-service.js | 4 +- .../core/server/services/mentions/mention.js | 7 +- .../server/services/mentions/mentions-api.js | 5 +- .../services/milestones/milestones-service.js | 2 +- .../newsletters/newsletters-service.js | 2 +- .../services/notifications/notifications.js | 4 +- .../server/services/oembed/oembed-service.js | 6 +- .../server/services/permissions/can-this.js | 3 +- .../settings-helpers/settings-helpers.js | 2 +- .../settings/settings-bread-service.js | 6 +- .../services/settings/settings-utils.js | 2 +- .../services/staff/staff-service-emails.js | 18 +-- .../services/stats/posts-stats-service.js | 20 +-- .../services/stats/referrers-stats-service.js | 2 +- .../stats/subscription-stats-service.js | 6 +- .../core/server/services/stripe/stripe-api.js | 6 +- .../services/stripe/stripe-migrations.js | 12 +- .../core/server/services/themes/storage.js | 2 +- .../server/services/themes/theme-storage.js | 4 +- ghost/core/core/server/services/tiers/tier.js | 30 ++-- .../update-check/update-check-service.js | 2 +- .../server/services/webhooks/serialize.js | 2 +- .../shared/middleware/api/spam-prevention.js | 4 +- .../custom-theme-settings-service.js | 2 +- ghost/core/core/shared/labs.js | 3 +- .../shared/settings-cache/cache-manager.js | 2 +- ghost/core/eslint.config.mjs | 1 + .../test/e2e-api/admin/activity-feed.test.js | 6 +- .../e2e-api/admin/members-exporter.test.js | 6 +- ghost/core/test/e2e-api/admin/oembed.test.js | 2 +- ghost/core/test/e2e-api/admin/offers.test.js | 16 +-- .../test/e2e-api/admin/posts-legacy.test.js | 8 +- ghost/core/test/e2e-api/admin/tiers.test.js | 4 +- .../e2e-api/members-comments/comments.test.js | 2 +- .../core/test/e2e-api/members/signin.test.js | 2 +- .../test/e2e-api/members/webhooks.test.js | 18 +-- ghost/core/test/e2e-frontend/members.test.js | 4 +- .../test/e2e-server/services/mentions.test.js | 20 +-- .../core/test/integration/importer/v2.test.js | 16 +-- .../test/legacy/api/admin/identities.test.js | 2 +- .../test/legacy/api/admin/settings.test.js | 2 +- .../test/legacy/api/admin/webhooks.test.js | 10 +- .../mock-express-style/utils/mock-express.js | 4 +- .../test/legacy/models/model-members.test.js | 2 +- .../utils/validators/input/pages.test.js | 2 +- .../utils/validators/input/posts.test.js | 2 +- .../utils/validators/input/tags.test.js | 2 +- .../test/unit/frontend/helpers/concat.test.js | 68 ++++----- .../frontend/helpers/content-api-url.test.js | 16 +-- .../test/unit/frontend/helpers/date.test.js | 2 +- .../unit/frontend/helpers/ghost-head.test.js | 34 ++--- .../unit/frontend/helpers/navigation.test.js | 46 +++---- .../test/unit/frontend/helpers/t-new.test.js | 16 +-- .../core/test/unit/frontend/helpers/t.test.js | 16 +-- .../test/unit/frontend/meta/blog-logo.test.js | 8 +- .../core/test/unit/frontend/meta/url.test.js | 4 +- .../assets-minification/minifier.test.js | 20 +-- .../services/rendering/templates.test.js | 2 +- .../routing/controllers/channel.test.js | 12 +- .../unit/frontend/services/rss/cache.test.js | 3 +- .../services/sitemap/generator.test.js | 10 +- .../frontend/services/sitemap/manager.test.js | 13 +- .../services/theme-engine/i18n.test.js | 2 +- .../services/theme-engine/preview.test.js | 8 +- .../unit/server/data/schema/integrity.test.js | 12 +- .../image/cached-image-size-from-url.test.js | 6 +- .../server/lib/package-json/filter.test.js | 21 +-- .../unit/server/lib/package-json/read.test.js | 35 ++--- .../unit/server/models/base/index.test.js | 2 +- .../models/custom-theme-setting.test.js | 2 +- .../core/test/unit/server/models/user.test.js | 2 +- ghost/core/test/unit/server/notify.test.js | 4 +- .../unit/server/services/auth/setup.test.js | 6 +- .../batch-sending-service.test.js | 3 +- .../email-service/email-renderer.test.js | 81 ++++++----- .../email-service/email-segmenter.test.js | 4 +- .../lib/dynamic-redirect-manager.test.js | 2 +- .../mention-discovery-service.test.js | 8 +- .../services/permissions/can-this.test.js | 4 +- .../services/permissions/providers.test.js | 2 +- .../services/public-config/config.test.js | 30 ++-- .../settings-helpers/settings-helpers.test.js | 2 +- .../settings/settings-service.test.js | 4 +- .../unit/server/services/staff/index.test.js | 6 +- .../services/staff/staff-service.test.js | 6 +- .../server/services/stripe/stripe-api.test.js | 2 +- .../unit/server/services/tiers/tier.test.js | 4 +- .../test/unit/shared/config/utils.test.js | 2 +- .../test/unit/shared/settings-cache.test.js | 10 +- .../test/utils/agents/admin-api-test-agent.js | 2 +- ghost/core/test/utils/api.js | 4 +- .../test/utils/e2e-framework-mock-manager.js | 4 +- ghost/core/test/utils/fixture-utils.js | 16 +-- .../test/utils/fixtures/data-generator.js | 12 +- ghost/core/test/utils/mock-knex.js | 2 +- ghost/core/test/utils/stripe-mocker.js | 2 +- packages/api-framework/lib/headers.js | 4 +- .../api-framework/lib/validators/input/all.js | 2 +- 528 files changed, 2189 insertions(+), 2308 deletions(-) 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
    element + const contextMenu = find('.gh-posts-context-menu'); // this is a
      element - let buttons = contextMenu.querySelectorAll('button'); + const buttons = contextMenu.querySelectorAll('button'); expect(contextMenu, 'context menu').to.exist; expect(buttons.length, 'context menu buttons').to.equal(7); @@ -449,7 +449,7 @@ describe('Acceptance: Posts / Pages', function () { const posts = findAll('[data-test-post-id]'); expect(posts.length, 'all posts count').to.equal(5); - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.url, 'request url').to.match(new RegExp(`/posts/${publishedPost.id}/copy/`)); }); @@ -553,9 +553,9 @@ describe('Acceptance: Posts / Pages', function () { await triggerEvent(post, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); // this is a
        element + const contextMenu = find('.gh-posts-context-menu'); // this is a
          element - let buttons = contextMenu.querySelectorAll('button'); + const buttons = contextMenu.querySelectorAll('button'); expect(contextMenu, 'context menu').to.exist; expect(buttons.length, 'context menu buttons').to.equal(7); @@ -589,9 +589,9 @@ describe('Acceptance: Posts / Pages', function () { await triggerEvent(post, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); // this is a
            element + const contextMenu = find('.gh-posts-context-menu'); // this is a
              element - let buttons = contextMenu.querySelectorAll('button'); + const buttons = contextMenu.querySelectorAll('button'); expect(contextMenu, 'context menu').to.exist; expect(buttons.length, 'context menu buttons').to.equal(5); @@ -694,12 +694,12 @@ describe('Acceptance: Posts / Pages', function () { // contextmenu is the event triggered - https://developer.mozilla.org/en-US/docs/Web/API/Element/contextmenu_event await triggerEvent(postFourContainer, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); // this is a
                element + const contextMenu = find('.gh-posts-context-menu'); // this is a
                  element expect(contextMenu, 'context menu').to.exist; // add a tag to the posts - let buttons = contextMenu.querySelectorAll('button'); - let addTagButton = findButton('Add a tag', buttons); + const buttons = contextMenu.querySelectorAll('button'); + const addTagButton = findButton('Add a tag', buttons); expect(addTagButton, 'add tag button').to.exist; await click(addTagButton); @@ -713,7 +713,7 @@ describe('Acceptance: Posts / Pages', function () { await click('[data-test-button="confirm"]'); // API request is correct - note, we don't mock the actual model updates - let [lastRequest] = this.server.pretender.handledRequests.slice(-2); + const [lastRequest] = this.server.pretender.handledRequests.slice(-2); expect(lastRequest.queryParams.filter, 'add tag request id').to.equal(`id:['${publishedPost.id}','${authorPost.id}']`); expect(JSON.parse(lastRequest.requestBody).bulk.action, 'add tag request action').to.equal('addTag'); }); @@ -745,8 +745,8 @@ describe('Acceptance: Posts / Pages', function () { const settingsService = this.owner.lookup('service:settings'); await settingsService.set('membersEnabled', true); - let posts = findAll('[data-test-post-id]'); - let postThreeContainer = posts[2].parentElement; // published post + const posts = findAll('[data-test-post-id]'); + const postThreeContainer = posts[2].parentElement; // published post let postFourContainer = posts[3].parentElement; // author post await click(postThreeContainer, {metaKey: ctrlOrCmd === 'command', ctrlKey: ctrlOrCmd === 'ctrl'}); @@ -766,7 +766,7 @@ describe('Acceptance: Posts / Pages', function () { await click('[data-test-button="confirm"]'); // check API request - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.queryParams.filter, 'change access request id').to.equal(`id:['${publishedPost.id}','${authorPost.id}']`); expect(JSON.parse(lastRequest.requestBody).bulk.action, 'change access request action').to.equal('access'); @@ -817,7 +817,7 @@ describe('Acceptance: Posts / Pages', function () { await click(`${modalSelector} [data-test-button="confirm"]`); // check API request - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.queryParams.filter, 'change access request id').to.equal(`id:['${publishedPost.id}']`); expect(JSON.parse(lastRequest.requestBody).bulk.action, 'change access request action').to.equal('access'); expect(JSON.parse(lastRequest.requestBody).bulk.meta.visibility, 'change access request visibility').to.equal('tiers'); @@ -851,12 +851,12 @@ describe('Acceptance: Posts / Pages', function () { // contextmenu is the event triggered - https://developer.mozilla.org/en-US/docs/Web/API/Element/contextmenu_event await triggerEvent(postFourContainer, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); // this is a
                    element + const contextMenu = find('.gh-posts-context-menu'); // this is a
                      element expect(contextMenu, 'context menu').to.exist; // unpublish the posts - let buttons = contextMenu.querySelectorAll('button'); - let unpublishButton = findButton('Unpublish', buttons); + const buttons = contextMenu.querySelectorAll('button'); + const unpublishButton = findButton('Unpublish', buttons); expect(unpublishButton, 'unpublish button').to.exist; await click(unpublishButton); @@ -866,7 +866,7 @@ describe('Acceptance: Posts / Pages', function () { await click('[data-test-button="confirm"]'); // API request is correct - note, we don't mock the actual model updates - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.queryParams.filter, 'unpublish request id').to.equal(`id:['${publishedPost.id}','${authorPost.id}']`); expect(JSON.parse(lastRequest.requestBody).bulk.action, 'unpublish request action').to.equal('unpublish'); @@ -892,12 +892,12 @@ describe('Acceptance: Posts / Pages', function () { // contextmenu is the event triggered - https://developer.mozilla.org/en-US/docs/Web/API/Element/contextmenu_event await triggerEvent(postOneContainer, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); // this is a
                        element + const contextMenu = find('.gh-posts-context-menu'); // this is a
                          element expect(contextMenu, 'context menu').to.exist; // unschedule the post - let buttons = contextMenu.querySelectorAll('button'); - let unscheduleButton = findButton('Unschedule', buttons); + const buttons = contextMenu.querySelectorAll('button'); + const unscheduleButton = findButton('Unschedule', buttons); expect(unscheduleButton, 'unschedule button').to.exist; await click(unscheduleButton); @@ -907,7 +907,7 @@ describe('Acceptance: Posts / Pages', function () { await click('[data-test-button="confirm"]'); // API request is correct - note, we don't mock the actual model updates - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.queryParams.filter, 'unschedule request id').to.equal(`id:['${scheduledPost.id}']`); expect(JSON.parse(lastRequest.requestBody).bulk.action, 'unschedule request action').to.equal('unschedule'); @@ -935,12 +935,12 @@ describe('Acceptance: Posts / Pages', function () { // contextmenu is the event triggered - https://developer.mozilla.org/en-US/docs/Web/API/Element/contextmenu_event await triggerEvent(postFourContainer, 'contextmenu'); - let contextMenu = find('.gh-posts-context-menu'); // this is a
                            element + const contextMenu = find('.gh-posts-context-menu'); // this is a
                              element expect(contextMenu, 'context menu').to.exist; // delete the posts - let buttons = contextMenu.querySelectorAll('button'); - let deleteButton = findButton('Delete', buttons); + const buttons = contextMenu.querySelectorAll('button'); + const deleteButton = findButton('Delete', buttons); expect(deleteButton, 'delete button').to.exist; await click(deleteButton); @@ -950,7 +950,7 @@ describe('Acceptance: Posts / Pages', function () { await click('[data-test-button="confirm"]'); // API request is correct - note, we don't mock the actual model updates - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); expect(lastRequest.queryParams.filter, 'delete request id').to.equal(`id:['${publishedPost.id}','${authorPost.id}']`); expect(lastRequest.method, 'delete request method').to.equal('DELETE'); @@ -965,7 +965,7 @@ describe('Acceptance: Posts / Pages', function () { let publishedPost; beforeEach(async function () { - let adminRole = this.server.create('role', {name: 'Administrator'}); + const adminRole = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [adminRole]}); publishedPost = this.server.create('post', { @@ -990,7 +990,7 @@ describe('Acceptance: Posts / Pages', function () { await visit('/posts'); // Check that visitor count column is not visible - let visitorsText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'visitors'); + const visitorsText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'visitors'); expect(visitorsText, 'visitor count column').to.not.exist; }); @@ -1001,7 +1001,7 @@ describe('Acceptance: Posts / Pages', function () { await visit('/posts'); // Check that member conversions column is not visible - let membersText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'members'); + const membersText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'members'); expect(membersText, 'member conversions column').to.not.exist; }); @@ -1024,8 +1024,8 @@ describe('Acceptance: Posts / Pages', function () { await visit('/posts'); // Check that neither analytics column is visible - let visitorsText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'visitors'); - let membersText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'members'); + const visitorsText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'visitors'); + const membersText = findAll('.gh-content-email-stats').find(el => el.textContent.trim() === 'members'); expect(visitorsText, 'visitor count column').to.not.exist; expect(membersText, 'member conversions column').to.not.exist; }); @@ -1060,7 +1060,7 @@ describe('Acceptance: Posts / Pages', function () { // in the test environment, but that's beyond the scope of this template change. beforeEach(async function () { - let adminRole = this.server.create('role', {name: 'Administrator'}); + const adminRole = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [adminRole]}); await authenticateSession(); @@ -1068,7 +1068,7 @@ describe('Acceptance: Posts / Pages', function () { it('shows/hides email analytics section based on post.email', async function () { // Create a post with email data - let email1 = this.server.create('email', { + const email1 = this.server.create('email', { emailCount: 1500 }); @@ -1087,23 +1087,23 @@ describe('Acceptance: Posts / Pages', function () { await visit('/posts'); - let postElements = findAll('.gh-posts-list-item'); + const postElements = findAll('.gh-posts-list-item'); expect(postElements.length).to.equal(2); // First post should show email analytics section - let firstPost = postElements[0]; - let emailSection = firstPost.querySelector('.gh-post-analytics-email-metrics'); + const firstPost = postElements[0]; + const emailSection = firstPost.querySelector('.gh-post-analytics-email-metrics'); expect(emailSection, 'email analytics section for post with email').to.exist; // Second post should not show email analytics section - let secondPost = postElements[1]; - let noEmailSection = secondPost.querySelector('.gh-post-analytics-email-metrics'); + const secondPost = postElements[1]; + const noEmailSection = secondPost.querySelector('.gh-post-analytics-email-metrics'); expect(noEmailSection, 'email analytics section for post without email').to.not.exist; }); it('displays newsletter columns based on email tracking settings', async function () { // Test 1: When both tracking options are disabled, show sent column - let email1 = this.server.create('email', { + const email1 = this.server.create('email', { emailCount: 15000, trackOpens: false, trackClicks: false @@ -1138,9 +1138,9 @@ describe('Acceptance: Posts / Pages', function () { let admin, editor; beforeEach(async function () { - 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]}); // posts shouldn't show in the pages list @@ -1228,7 +1228,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, '"pages" request filter param').to.have.string('tag:second'); }); @@ -1240,13 +1240,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, '"pages" request filter param').to.have.string('tag:last'); }); diff --git a/apps/ember-admin/tests/acceptance/custom-post-templates-test.js b/apps/ember-admin/tests/acceptance/custom-post-templates-test.js index 351d7735389..34b1ba2aadf 100644 --- a/apps/ember-admin/tests/acceptance/custom-post-templates-test.js +++ b/apps/ember-admin/tests/acceptance/custom-post-templates-test.js @@ -10,13 +10,13 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; const KEY_S = 83; describe('Acceptance: Custom Post Templates', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { this.server.loadFixtures('settings','configs'); - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [role]}); await authenticateSession(); @@ -61,7 +61,7 @@ describe('Acceptance: Custom Post Templates', function () { }); it('can change selected template', async function () { - let post = this.server.create('post', {customTemplate: 'custom-news-bulletin.hbs'}); + const post = this.server.create('post', {customTemplate: 'custom-news-bulletin.hbs'}); await visit('/editor/post/1'); await click('[data-test-psm-trigger]'); @@ -70,7 +70,7 @@ describe('Acceptance: Custom Post Templates', function () { expect(find('[data-test-custom-template-form]')).to.exist; // custom template should be selected - let select = find('[data-test-select="custom-template"]'); + const select = find('[data-test-select="custom-template"]'); expect(select.value, 'selected value').to.equal('custom-news-bulletin.hbs'); // templates list should contain default and custom templates in alphabetical order @@ -100,7 +100,7 @@ describe('Acceptance: Custom Post Templates', function () { it('disables template selector if slug matches slug-based template'); it('doesn\'t query themes endpoint unncessarily', async function () { - let themeRequests = () => { + const themeRequests = () => { return this.server.pretender.handledRequests.filter(function (request) { return request.url.match(/\/themes\//); }); diff --git a/apps/ember-admin/tests/acceptance/editor-react-flag-test.js b/apps/ember-admin/tests/acceptance/editor-react-flag-test.js index 6a6fe6db0f5..73185f2431d 100644 --- a/apps/ember-admin/tests/acceptance/editor-react-flag-test.js +++ b/apps/ember-admin/tests/acceptance/editor-react-flag-test.js @@ -30,15 +30,15 @@ async function visitExpectingAbort(url) { } describe('Acceptance: editor React flag', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { this.server.loadFixtures('configs'); this.server.loadFixtures('settings'); - let role = this.server.create('role', {name: 'Administrator'}); - let user = this.server.create('user', {roles: [role]}); + const role = this.server.create('role', {name: 'Administrator'}); + const user = this.server.create('user', {roles: [role]}); this.server.create('post', {authors: [user]}); return await authenticateSession(); diff --git a/apps/ember-admin/tests/acceptance/editor-test.js b/apps/ember-admin/tests/acceptance/editor-test.js index ce2f3e65aef..a6df38f6511 100644 --- a/apps/ember-admin/tests/acceptance/editor-test.js +++ b/apps/ember-admin/tests/acceptance/editor-test.js @@ -18,7 +18,7 @@ import {visit} from '../helpers/visit'; // https://github.com/cibernox/ember-power-datepicker/issues/30 describe('Acceptance: Editor', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { @@ -26,7 +26,7 @@ describe('Acceptance: Editor', function () { }); it('redirects to signin when not authenticated', async function () { - let author = this.server.create('user'); // necessary for post-author association + const author = this.server.create('user'); // necessary for post-author association this.server.create('post', {authors: [author]}); await invalidateSession(); @@ -36,8 +36,8 @@ describe('Acceptance: Editor', function () { }); it('does not redirect to staff page when authenticated as contributor', async function () { - let role = this.server.create('role', {name: 'Contributor'}); - let author = this.server.create('user', {roles: [role], slug: 'test-user'}); + const role = this.server.create('role', {name: 'Contributor'}); + const author = this.server.create('user', {roles: [role], slug: 'test-user'}); this.server.create('post', {authors: [author]}); await authenticateSession(); @@ -47,8 +47,8 @@ describe('Acceptance: Editor', function () { }); it('does not redirect to staff page when authenticated as author', async function () { - let role = this.server.create('role', {name: 'Author'}); - let author = this.server.create('user', {roles: [role], slug: 'test-user'}); + const role = this.server.create('role', {name: 'Author'}); + const author = this.server.create('user', {roles: [role], slug: 'test-user'}); this.server.create('post', {authors: [author]}); await authenticateSession(); @@ -58,8 +58,8 @@ describe('Acceptance: Editor', function () { }); it('does not redirect to staff page when authenticated as editor', async function () { - let role = this.server.create('role', {name: 'Editor'}); - let author = this.server.create('user', {roles: [role], slug: 'test-user'}); + const role = this.server.create('role', {name: 'Editor'}); + const author = this.server.create('user', {roles: [role], slug: 'test-user'}); this.server.create('post', {authors: [author]}); await authenticateSession(); @@ -69,8 +69,8 @@ describe('Acceptance: Editor', function () { }); it('does not redirect to staff page when authenticated as super editor', async function () { - let role = this.server.create('role', {name: 'Super Editor'}); - let author = this.server.create('user', {roles: [role], slug: 'test-user'}); + const role = this.server.create('role', {name: 'Super Editor'}); + const author = this.server.create('user', {roles: [role], slug: 'test-user'}); this.server.create('post', {authors: [author]}); await authenticateSession(); @@ -80,7 +80,7 @@ describe('Acceptance: Editor', function () { }); it('displays 404 when post does not exist', async function () { - let role = this.server.create('role', {name: 'Editor'}); + const role = this.server.create('role', {name: 'Editor'}); this.server.create('user', {roles: [role], slug: 'test-user'}); await authenticateSession(); @@ -92,8 +92,8 @@ describe('Acceptance: Editor', function () { }); it('when logged in as a contributor, renders a save button instead of a publish menu & hides tags input', async function () { - let role = this.server.create('role', {name: 'Contributor'}); - let author = this.server.create('user', {roles: [role]}); + const role = this.server.create('role', {name: 'Contributor'}); + const author = this.server.create('user', {roles: [role]}); this.server.createList('post', 2, {authors: [author]}); this.server.loadFixtures('settings'); await authenticateSession(); @@ -129,7 +129,7 @@ describe('Acceptance: Editor', function () { beforeEach(async function () { this.server.loadFixtures(); - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); author = this.server.create('user', {roles: [role]}); await authenticateSession(); @@ -137,8 +137,8 @@ describe('Acceptance: Editor', function () { describe('post settings menu', function () { it('can set publish date', async function () { - let [post1] = this.server.createList('post', 2, {authors: [author]}); - let futureTime = moment().tz('Etc/UTC').add(10, 'minutes'); + const [post1] = this.server.createList('post', 2, {authors: [author]}); + const futureTime = moment().tz('Etc/UTC').add(10, 'minutes'); // sanity check expect( @@ -190,7 +190,7 @@ describe('Acceptance: Editor', function () { ).to.equal(moment(post1.publishedAt).tz('Etc/UTC').format('HH:mm')); // saves the post with the new date - let validTime = moment('2017-04-09 12:00'); + const validTime = moment('2017-04-09 12:00'); await fillIn('[data-test-date-time-picker-time-input]', validTime.format('HH:mm')); await blur('[data-test-date-time-picker-time-input]'); await datepickerSelect('[data-test-date-time-picker-datepicker]', validTime.toDate()); @@ -224,10 +224,10 @@ describe('Acceptance: Editor', function () { }); it('renders first countdown notification before scheduled time', async function () { - let clock = sinon.useFakeTimers(moment().valueOf()); - let compareDate = moment().tz('Etc/UTC').add(4, 'minutes'); - let compareDateString = compareDate.format('YYYY-MM-DD'); - let compareTimeString = compareDate.format('HH:mm'); + const clock = sinon.useFakeTimers(moment().valueOf()); + const compareDate = moment().tz('Etc/UTC').add(4, 'minutes'); + const compareDateString = compareDate.format('YYYY-MM-DD'); + const compareTimeString = compareDate.format('HH:mm'); this.server.create('post', {publishedAt: moment.utc().add(4, 'minutes'), status: 'scheduled', authors: [author]}); this.server.create('setting', {timezone: 'Europe/Dublin'}); clock.restore(); @@ -250,9 +250,9 @@ describe('Acceptance: Editor', function () { }); it('shows author token input and allows changing of authors in PSM', async function () { - let adminRole = this.server.create('role', {name: 'Administrator'}); - let authorRole = this.server.create('role', {name: 'Author'}); - let user1 = this.server.create('user', {name: 'Primary', roles: [adminRole]}); + const adminRole = this.server.create('role', {name: 'Administrator'}); + const authorRole = this.server.create('role', {name: 'Author'}); + const user1 = this.server.create('user', {name: 'Primary', roles: [adminRole]}); this.server.create('user', {name: 'Waldo', roles: [authorRole]}); this.server.create('post', {authors: [user1]}); @@ -263,14 +263,14 @@ describe('Acceptance: Editor', function () { await click('[data-test-psm-trigger]'); - let tokens = findAll('[data-test-input="authors"] .ember-power-select-multiple-option'); + const tokens = findAll('[data-test-input="authors"] .ember-power-select-multiple-option'); expect(tokens.length).to.equal(1); expect(tokens[0].textContent.trim()).to.have.string('Primary'); await selectChoose('[data-test-input="authors"]', 'Waldo'); - let savedAuthors = this.server.schema.posts.find('1').authors.models; + const savedAuthors = this.server.schema.posts.find('1').authors.models; expect(savedAuthors.length).to.equal(2); expect(savedAuthors[0].name).to.equal('Primary'); @@ -278,7 +278,7 @@ describe('Acceptance: Editor', function () { }); it('saves post settings fields', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit(`/editor/post/${post.id}`); @@ -315,7 +315,7 @@ describe('Acceptance: Editor', function () { await click('[data-test-button="codeinjection"]'); // header injection has validation - let headerCM = find('[data-test-field="codeinjection-head"] .CodeMirror').CodeMirror; + const headerCM = find('[data-test-field="codeinjection-head"] .CodeMirror').CodeMirror; await headerCM.setValue(Array(65540).join('a')); await click(headerCM.getInputField()); await blur(headerCM.getInputField()); @@ -341,7 +341,7 @@ describe('Acceptance: Editor', function () { ).to.equal(''); // footer injection has validation - let footerCM = find('[data-test-field="codeinjection-foot"] .CodeMirror').CodeMirror; + const footerCM = find('[data-test-field="codeinjection-foot"] .CodeMirror').CodeMirror; await footerCM.setValue(Array(65540).join('a')); await click(footerCM.getInputField()); await blur(footerCM.getInputField()); @@ -508,7 +508,7 @@ describe('Acceptance: Editor', function () { it('handles in-editor excerpt update and validation', async function () { enableLabsFlag(this.server, 'editorExcerpt'); - let post = this.server.create('post', {authors: [author], customExcerpt: 'Existing excerpt'}); + const post = this.server.create('post', {authors: [author], customExcerpt: 'Existing excerpt'}); await visit(`/editor/post/${post.id}`); @@ -540,7 +540,7 @@ describe('Acceptance: Editor', function () { // https://github.com/TryGhost/Ghost/issues/11786 // NOTE: Flaky test with moving to Lexical editor, skipping for now it.skip('save shortcut works when tags/authors field is focused', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit(`/editor/post/${post.id}`); await fillIn('[data-test-editor-title-input]', 'CMD-S Test'); @@ -555,15 +555,15 @@ describe('Acceptance: Editor', function () { }); // Check if save request has been sent correctly. - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); - let body = JSON.parse(lastRequest.requestBody); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const body = JSON.parse(lastRequest.requestBody); expect(body.posts[0].title).to.equal('CMD-S Test'); }); // https://github.com/TryGhost/Ghost/issues/15391 it('can handle many tags in PSM tags input', async function () { this.server.createList('tag', 1000); - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit(`/editor/post/${post.id}`); await click('[data-test-psm-trigger]'); @@ -579,7 +579,7 @@ describe('Acceptance: Editor', function () { }); it('renders a breadcrumb back to the post list', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit(`/editor/post/${post.id}`); @@ -595,7 +595,7 @@ describe('Acceptance: Editor', function () { }); it('renders a breadcrumb back to post analytics root if that\'s where we came from', async function () { - let post = this.server.create('post', { + const post = this.server.create('post', { authors: [author], status: 'published', title: 'Published Post' @@ -619,7 +619,7 @@ describe('Acceptance: Editor', function () { }); it('renders a breadcrumb back to the post analytics subpage if that\'s where we came from', async function () { - let post = this.server.create('post', { + const post = this.server.create('post', { authors: [author], status: 'published', title: 'Published Post' @@ -640,7 +640,7 @@ describe('Acceptance: Editor', function () { }); it('renders a breadcrumb back to stats root if that\'s where we came from', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit('/analytics'); await visit(`/editor/post/${post.id}`); @@ -657,7 +657,7 @@ describe('Acceptance: Editor', function () { }); it('renders a breadcrumb back to the stats subpage if that\'s where we came from', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit('/analytics/web'); await visit(`/editor/post/${post.id}`); @@ -674,7 +674,7 @@ describe('Acceptance: Editor', function () { }); it('renders a breadcrumb with stats query params if that\'s where we came from', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit('/analytics/growth?tab=total-members'); await visit(`/editor/post/${post.id}`); @@ -708,7 +708,7 @@ describe('Acceptance: Editor', function () { }); it('updates slug when title changes without blur', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit(`/editor/post/${post.id}`); await fillIn('[data-test-editor-title-input]', 'Test Title'); @@ -719,14 +719,14 @@ describe('Acceptance: Editor', function () { ctrlKey: ctrlOrCmd === 'ctrl' }); - let [lastRequest] = this.server.pretender.handledRequests.slice(-1); - let body = JSON.parse(lastRequest.requestBody); + const [lastRequest] = this.server.pretender.handledRequests.slice(-1); + const body = JSON.parse(lastRequest.requestBody); expect(body.posts[0].slug).to.equal('test-title'); expect(post.slug).to.equal('test-title'); }); it('handles TKs in title', async function () { - let post = this.server.create('post', {authors: [author]}); + const post = this.server.create('post', {authors: [author]}); await visit(`/editor/post/${post.id}`); diff --git a/apps/ember-admin/tests/acceptance/editor/feature-image-test.js b/apps/ember-admin/tests/acceptance/editor/feature-image-test.js index 25bda0329c6..24ab115f336 100644 --- a/apps/ember-admin/tests/acceptance/editor/feature-image-test.js +++ b/apps/ember-admin/tests/acceptance/editor/feature-image-test.js @@ -6,7 +6,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../../helpers/visit'; describe('Acceptance: Feature Image', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { diff --git a/apps/ember-admin/tests/acceptance/editor/lexical-test.js b/apps/ember-admin/tests/acceptance/editor/lexical-test.js index 27b98bfaf87..25b9b062ed0 100644 --- a/apps/ember-admin/tests/acceptance/editor/lexical-test.js +++ b/apps/ember-admin/tests/acceptance/editor/lexical-test.js @@ -8,7 +8,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../../helpers/visit'; describe('Acceptance: Lexical editor', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { diff --git a/apps/ember-admin/tests/acceptance/editor/post-email-preview-test.js b/apps/ember-admin/tests/acceptance/editor/post-email-preview-test.js index 4b7713e6aba..82711ebe7ce 100644 --- a/apps/ember-admin/tests/acceptance/editor/post-email-preview-test.js +++ b/apps/ember-admin/tests/acceptance/editor/post-email-preview-test.js @@ -9,7 +9,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../../helpers/visit'; describe('Acceptance: Post email preview', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { diff --git a/apps/ember-admin/tests/acceptance/editor/post-preview-test.js b/apps/ember-admin/tests/acceptance/editor/post-preview-test.js index 4726f2284b4..4ec102f226c 100644 --- a/apps/ember-admin/tests/acceptance/editor/post-preview-test.js +++ b/apps/ember-admin/tests/acceptance/editor/post-preview-test.js @@ -9,7 +9,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../../helpers/visit'; describe('Acceptance: Post preview', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { diff --git a/apps/ember-admin/tests/acceptance/editor/post-revisions-test.js b/apps/ember-admin/tests/acceptance/editor/post-revisions-test.js index 262a7641376..a5e839c3c2f 100644 --- a/apps/ember-admin/tests/acceptance/editor/post-revisions-test.js +++ b/apps/ember-admin/tests/acceptance/editor/post-revisions-test.js @@ -8,7 +8,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../../helpers/visit'; describe('Acceptance: Post revisions', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { diff --git a/apps/ember-admin/tests/acceptance/editor/post-settings-menu-test.js b/apps/ember-admin/tests/acceptance/editor/post-settings-menu-test.js index d98ada5808e..1801e537966 100644 --- a/apps/ember-admin/tests/acceptance/editor/post-settings-menu-test.js +++ b/apps/ember-admin/tests/acceptance/editor/post-settings-menu-test.js @@ -7,7 +7,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../../helpers/visit'; describe('Acceptance: Editor / Post Settings Menu', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); let author; @@ -15,7 +15,7 @@ describe('Acceptance: Editor / Post Settings Menu', function () { beforeEach(async function () { this.server.loadFixtures(); - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); author = this.server.create('user', {roles: [role]}); await authenticateSession(); @@ -23,7 +23,7 @@ describe('Acceptance: Editor / Post Settings Menu', function () { it('displays publish time converted to site timezone', async function () { // Create a published post at 12:00 UTC on Jan 15 - let post = this.server.create('post', { + const post = this.server.create('post', { authors: [author], status: 'published', publishedAt: '2024-01-15T12:00:00.000Z' diff --git a/apps/ember-admin/tests/acceptance/editor/publish-flow-test.js b/apps/ember-admin/tests/acceptance/editor/publish-flow-test.js index 26dd08c3d6c..27f58d3109f 100644 --- a/apps/ember-admin/tests/acceptance/editor/publish-flow-test.js +++ b/apps/ember-admin/tests/acceptance/editor/publish-flow-test.js @@ -33,7 +33,7 @@ function lexicalWithPublicPreview({before = 'Public preview content', after = 'F } describe('Acceptance: Publish flow', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(function () { diff --git a/apps/ember-admin/tests/acceptance/editor/super-editor-lexical-test.js b/apps/ember-admin/tests/acceptance/editor/super-editor-lexical-test.js index 64ffe879564..d5cc8886d1b 100644 --- a/apps/ember-admin/tests/acceptance/editor/super-editor-lexical-test.js +++ b/apps/ember-admin/tests/acceptance/editor/super-editor-lexical-test.js @@ -26,7 +26,7 @@ async function selectTextWithHover(element, start = 0, end = element.textContent } describe('Editor tests with roles', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); describe('Super Editor tests', function () { beforeEach(async function () { @@ -44,7 +44,7 @@ describe('Editor tests with roles', function () { await selectTextWithHover(find('.kg-prose p span')); await settled(); await waitUntil(() => document.querySelectorAll('[data-kg-toolbar-button="snippet"]').length > 0); - let snippetButton = document.querySelector('[data-kg-toolbar-button="snippet"]'); + const snippetButton = document.querySelector('[data-kg-toolbar-button="snippet"]'); expect(snippetButton).to.not.be.null; expect(snippetButton.textContent.trim()).to.equal('Save as snippet'); }); diff --git a/apps/ember-admin/tests/acceptance/editor/unsaved-changes-test.js b/apps/ember-admin/tests/acceptance/editor/unsaved-changes-test.js index 6f230af68fa..ad7c0711f4b 100644 --- a/apps/ember-admin/tests/acceptance/editor/unsaved-changes-test.js +++ b/apps/ember-admin/tests/acceptance/editor/unsaved-changes-test.js @@ -10,7 +10,7 @@ const unsavedModalSelector = '[data-test-modal="unsaved-post-changes"]'; const backToPostsSelector = '[data-test-link="posts"]'; describe('Acceptance: Editor: Unsaved changes', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { diff --git a/apps/ember-admin/tests/acceptance/editor/visibility-test.js b/apps/ember-admin/tests/acceptance/editor/visibility-test.js index 16162e29d65..4864f06021c 100644 --- a/apps/ember-admin/tests/acceptance/editor/visibility-test.js +++ b/apps/ember-admin/tests/acceptance/editor/visibility-test.js @@ -24,7 +24,7 @@ const PAYWALL_LEXICAL = JSON.stringify({ }); describe('Acceptance: Editor / Visibility', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); let author; @@ -32,7 +32,7 @@ describe('Acceptance: Editor / Visibility', function () { beforeEach(async function () { this.server.loadFixtures(); - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); author = this.server.create('user', {roles: [role]}); enableMembers(this.server); @@ -46,7 +46,7 @@ describe('Acceptance: Editor / Visibility', function () { await visit(`/editor/post/${post.id}`); await click('[data-test-psm-trigger]'); - let visibilitySelect = find('[data-test-select="post-visibility"]'); + const visibilitySelect = find('[data-test-select="post-visibility"]'); expect(visibilitySelect.value, 'initial visibility').to.equal('public'); await fillIn('[data-test-select="post-visibility"]', 'members'); @@ -69,7 +69,7 @@ describe('Acceptance: Editor / Visibility', function () { it('shows tier selector when visibility is set to tiers', async function () { enableStripe(this.server); - let post = this.server.create('post', {authors: [author], status: 'draft'}); + const post = this.server.create('post', {authors: [author], status: 'draft'}); await visit(`/editor/post/${post.id}`); await click('[data-test-psm-trigger]'); @@ -82,18 +82,18 @@ describe('Acceptance: Editor / Visibility', function () { }); it('saves visibility change to API', async function () { - let post = this.server.create('post', {authors: [author], status: 'draft'}); + const post = this.server.create('post', {authors: [author], status: 'draft'}); await visit(`/editor/post/${post.id}`); await click('[data-test-psm-trigger]'); await fillIn('[data-test-select="post-visibility"]', 'paid'); // Verify the PUT request was made with the correct visibility - let putRequests = this.server.pretender.handledRequests.filter( + const putRequests = this.server.pretender.handledRequests.filter( req => req.method === 'PUT' && req.url.includes('/posts/') ); - let lastPut = putRequests[putRequests.length - 1]; - let requestBody = JSON.parse(lastPut.requestBody); + const lastPut = putRequests[putRequests.length - 1]; + const requestBody = JSON.parse(lastPut.requestBody); expect(requestBody.posts[0].visibility, 'visibility in PUT request').to.equal('paid'); }); diff --git a/apps/ember-admin/tests/acceptance/error-handling-test.js b/apps/ember-admin/tests/acceptance/error-handling-test.js index 99fa8d6244a..96ababef7e6 100644 --- a/apps/ember-admin/tests/acceptance/error-handling-test.js +++ b/apps/ember-admin/tests/acceptance/error-handling-test.js @@ -7,7 +7,7 @@ import {setupApplicationTest} from 'ember-mocha'; import {setupMirage} from 'ember-cli-mirage/test-support'; import {versionMismatchResponse} from 'ghost-admin/mirage/utils'; -let htmlErrorResponse = function () { +const htmlErrorResponse = function () { return new Response( 504, {'Content-Type': 'text/html'}, @@ -16,13 +16,13 @@ let htmlErrorResponse = function () { }; describe('Acceptance: Error Handling', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); describe('VersionMismatch errors', function () { describe('logged in', function () { beforeEach(async function () { - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [role]}); await authenticateSession(); @@ -71,7 +71,7 @@ describe('Acceptance: Error Handling', function () { beforeEach(async function () { this.server.loadFixtures(); - let roles = this.server.schema.roles.where({name: 'Administrator'}); + const roles = this.server.schema.roles.where({name: 'Administrator'}); this.server.create('user', {roles}); await authenticateSession(); diff --git a/apps/ember-admin/tests/acceptance/members-activity-test.js b/apps/ember-admin/tests/acceptance/members-activity-test.js index 6dbb16976bb..768656929b1 100644 --- a/apps/ember-admin/tests/acceptance/members-activity-test.js +++ b/apps/ember-admin/tests/acceptance/members-activity-test.js @@ -166,7 +166,7 @@ describe('Acceptance: Members activity', function () { const events = findAll('.gh-members-activity-event'); let donationEvent = null; - for (let event of events) { + for (const event of events) { if (event.textContent.includes('homepage')) { donationEvent = event; break; diff --git a/apps/ember-admin/tests/acceptance/password-reset-test.js b/apps/ember-admin/tests/acceptance/password-reset-test.js index 2c86c75611f..44653bc9ed3 100644 --- a/apps/ember-admin/tests/acceptance/password-reset-test.js +++ b/apps/ember-admin/tests/acceptance/password-reset-test.js @@ -6,7 +6,7 @@ import {setupApplicationTest} from 'ember-mocha'; import {setupMirage} from 'ember-cli-mirage/test-support'; describe('Acceptance: Password Reset', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); describe('request reset', function () { diff --git a/apps/ember-admin/tests/acceptance/posts-list-react-flag-test.js b/apps/ember-admin/tests/acceptance/posts-list-react-flag-test.js index 3d251a41ed1..ddb48b7a958 100644 --- a/apps/ember-admin/tests/acceptance/posts-list-react-flag-test.js +++ b/apps/ember-admin/tests/acceptance/posts-list-react-flag-test.js @@ -28,14 +28,14 @@ async function visitExpectingAbort(url) { } describe('Acceptance: posts/pages React flag', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { this.server.loadFixtures('configs'); this.server.loadFixtures('settings'); - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [role]}); return await authenticateSession(); diff --git a/apps/ember-admin/tests/acceptance/restore-post-test.js b/apps/ember-admin/tests/acceptance/restore-post-test.js index 26eb1ebeac4..6753b590631 100644 --- a/apps/ember-admin/tests/acceptance/restore-post-test.js +++ b/apps/ember-admin/tests/acceptance/restore-post-test.js @@ -7,12 +7,12 @@ import {setupApplicationTest} from 'ember-mocha'; import {setupMirage} from 'ember-cli-mirage/test-support'; describe('Acceptance: Restore', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { // Create a user and authenticate the session - let role = this.server.create('role', {name: 'Owner'}); + const role = this.server.create('role', {name: 'Owner'}); this.server.create('user', {roles: [role], slug: 'owner'}); await authenticateSession(); }); diff --git a/apps/ember-admin/tests/acceptance/setup-test.js b/apps/ember-admin/tests/acceptance/setup-test.js index 0ea5315cacf..54250104bb9 100644 --- a/apps/ember-admin/tests/acceptance/setup-test.js +++ b/apps/ember-admin/tests/acceptance/setup-test.js @@ -8,7 +8,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../helpers/visit'; describe('Acceptance: Setup', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); // Helper function to setup the setup flow @@ -47,7 +47,7 @@ describe('Acceptance: Setup', function () { } it('redirects if already authenticated', async function () { - let role = this.server.create('role', {name: 'Author'}); + const role = this.server.create('role', {name: 'Author'}); this.server.create('user', {roles: [role], slug: 'test-user'}); await authenticateSession(); diff --git a/apps/ember-admin/tests/acceptance/signin-test.js b/apps/ember-admin/tests/acceptance/signin-test.js index 9acadeda326..289b32596f7 100644 --- a/apps/ember-admin/tests/acceptance/signin-test.js +++ b/apps/ember-admin/tests/acceptance/signin-test.js @@ -12,7 +12,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../helpers/visit'; describe('Acceptance: Signin', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); async function setupSigninFlow(server, {role = 'Administrator', fillForm = true} = {}) { @@ -23,11 +23,11 @@ describe('Acceptance: Signin', function () { server.loadFixtures('settings'); } - let roleObj = server.create('role', {name: role}); + const roleObj = server.create('role', {name: role}); server.create('user', {roles: [roleObj], slug: 'test-user'}); server.post('/session', function (schema, {requestBody}) { - let { + const { username, password } = JSON.parse(requestBody); @@ -56,7 +56,7 @@ describe('Acceptance: Signin', function () { } it('redirects if already authenticated', async function () { - let role = this.server.create('role', {name: 'Author'}); + const role = this.server.create('role', {name: 'Author'}); this.server.create('user', {roles: [role], slug: 'test-user'}); await authenticateSession(); @@ -69,11 +69,11 @@ describe('Acceptance: Signin', function () { describe('when attempting to signin', function () { beforeEach(function () { - 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'}); this.server.post('/session', function (schema, {requestBody}) { - let { + const { username, password } = JSON.parse(requestBody); diff --git a/apps/ember-admin/tests/acceptance/signup-test.js b/apps/ember-admin/tests/acceptance/signup-test.js index 0b01082d50d..b26c5d42de1 100644 --- a/apps/ember-admin/tests/acceptance/signup-test.js +++ b/apps/ember-admin/tests/acceptance/signup-test.js @@ -7,7 +7,7 @@ import {setupMirage} from 'ember-cli-mirage/test-support'; import {visit} from '../helpers/visit'; describe('Acceptance: Signup', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); // Helper function to setup signup flow @@ -19,7 +19,7 @@ describe('Acceptance: Signup', function () { }); server.post('/authentication/invitation/', function ({users}, {requestBody}) { - let params = JSON.parse(requestBody); + const params = JSON.parse(requestBody); expect(params.invitation[0].name).to.equal('Test User'); expect(params.invitation[0].email, 'token email is sent for older Core versions').to.equal('kevin+test2@ghost.org'); expect(params.invitation[0].password).to.equal('thisissupersafe'); @@ -171,7 +171,7 @@ describe('Acceptance: Signup', function () { }; }); - let role = this.server.create('role', {name: 'Author'}); + const role = this.server.create('role', {name: 'Author'}); this.server.create('user', {roles: [role], slug: 'test-user'}); await authenticateSession(); diff --git a/apps/ember-admin/tests/acceptance/tag-react-flag-test.js b/apps/ember-admin/tests/acceptance/tag-react-flag-test.js index 202b91151cc..3085306b28b 100644 --- a/apps/ember-admin/tests/acceptance/tag-react-flag-test.js +++ b/apps/ember-admin/tests/acceptance/tag-react-flag-test.js @@ -28,14 +28,14 @@ async function visitExpectingAbort(url) { } describe('Acceptance: tag React flag', function () { - let hooks = setupApplicationTest(); + const hooks = setupApplicationTest(); setupMirage(hooks); beforeEach(async function () { this.server.loadFixtures('configs'); this.server.loadFixtures('settings'); - let role = this.server.create('role', {name: 'Administrator'}); + const role = this.server.create('role', {name: 'Administrator'}); this.server.create('user', {roles: [role]}); this.server.create('tag', {name: 'My tag', slug: 'my-tag'}); diff --git a/apps/ember-admin/tests/helpers/file-upload.js b/apps/ember-admin/tests/helpers/file-upload.js index 265a091bb31..5fe5b1b784f 100644 --- a/apps/ember-admin/tests/helpers/file-upload.js +++ b/apps/ember-admin/tests/helpers/file-upload.js @@ -1,19 +1,19 @@ import {triggerEvent} from '@ember/test-helpers'; export function createFile(content = ['test'], options = {}) { - let { + const { name, type } = options; - let file = new Blob(content, {type: type ? type : 'text/plain'}); + const file = new Blob(content, {type: type ? type : 'text/plain'}); file.name = name ? name : 'test.txt'; return file; } export function fileUpload(target, content, options) { - let file = createFile(content, options); + const file = createFile(content, options); return triggerEvent( target, diff --git a/apps/ember-admin/tests/integration/adapters/user-test.js b/apps/ember-admin/tests/integration/adapters/user-test.js index cfe0ae83010..434712f2c14 100644 --- a/apps/ember-admin/tests/integration/adapters/user-test.js +++ b/apps/ember-admin/tests/integration/adapters/user-test.js @@ -60,7 +60,7 @@ describe('Integration: Adapter: user', function () { it('handles "include" parameter when querying single user via slug', function (done) { server.get(`${ghostPaths().apiRoot}/users/slug/user-1/`, (request) => { - let params = request.queryParams; + const params = request.queryParams; expect(params.include, 'include query').to.equal('roles,count.posts'); return [200, {'Content-Type': 'application/json'}, JSON.stringify({users: [ diff --git a/apps/ember-admin/tests/integration/components/gh-alert-test.js b/apps/ember-admin/tests/integration/components/gh-alert-test.js index 64863ea3e13..da9233bda0f 100644 --- a/apps/ember-admin/tests/integration/components/gh-alert-test.js +++ b/apps/ember-admin/tests/integration/components/gh-alert-test.js @@ -24,7 +24,7 @@ describe('Integration: Component: gh-alert', function () { await render(hbs``); - let alert = this.element.querySelector('article.gh-alert'); + const alert = this.element.querySelector('article.gh-alert'); expect(alert).to.exist; expect(alert).to.contain.text('Test message'); }); @@ -33,7 +33,7 @@ describe('Integration: Component: gh-alert', function () { this.set('message', new Message({message: 'Test message', type: 'success'})); await render(hbs``); - let alert = this.element.querySelector('article.gh-alert'); + const alert = this.element.querySelector('article.gh-alert'); this.message.type = 'success'; await settled(); @@ -53,13 +53,13 @@ describe('Integration: Component: gh-alert', function () { }); it('closes notification through notifications service', async function () { - let message = new Message({message: 'Test close', type: 'success'}); + const message = new Message({message: 'Test close', type: 'success'}); this.set('message', message); await render(hbs``); expect(find('article.gh-alert')).to.exist; - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.closeNotification = sinon.stub(); await click('[data-test-button="close-notification"]'); diff --git a/apps/ember-admin/tests/integration/components/gh-alerts-test.js b/apps/ember-admin/tests/integration/components/gh-alerts-test.js index 8ea42450b32..338fc416e46 100644 --- a/apps/ember-admin/tests/integration/components/gh-alerts-test.js +++ b/apps/ember-admin/tests/integration/components/gh-alerts-test.js @@ -6,7 +6,7 @@ import {expect} from 'chai'; import {find, findAll, render, settled} from '@ember/test-helpers'; import {setupRenderingTest} from 'ember-mocha'; -let notificationsStub = Service.extend({ +const notificationsStub = Service.extend({ alerts: emberA() }); @@ -15,7 +15,7 @@ describe('Integration: Component: gh-alerts', function () { beforeEach(function () { this.owner.register('service:notifications', notificationsStub); - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.set('alerts', [ {message: 'First', type: 'error'}, @@ -24,7 +24,7 @@ describe('Integration: Component: gh-alerts', function () { }); it('renders', async function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); await render(hbs``); expect(findAll('.gh-alerts').length).to.equal(1); @@ -36,7 +36,7 @@ describe('Integration: Component: gh-alerts', function () { }); it('triggers "notify" action when message count changes', async function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); let expectedCount = 0; // test double for notify action diff --git a/apps/ember-admin/tests/integration/components/gh-basic-dropdown-test.js b/apps/ember-admin/tests/integration/components/gh-basic-dropdown-test.js index ddd7fc1d740..2fe60f5b207 100644 --- a/apps/ember-admin/tests/integration/components/gh-basic-dropdown-test.js +++ b/apps/ember-admin/tests/integration/components/gh-basic-dropdown-test.js @@ -9,7 +9,7 @@ describe('Integration: Component: gh-basic-dropdown', function () { setupRenderingTest(); it('closes when dropdown service fires close event', async function () { - let dropdownService = this.owner.lookup('service:dropdown'); + const dropdownService = this.owner.lookup('service:dropdown'); await render(hbs` diff --git a/apps/ember-admin/tests/integration/components/gh-cm-editor-test.js b/apps/ember-admin/tests/integration/components/gh-cm-editor-test.js index a15926239b1..a5b67bdbddc 100644 --- a/apps/ember-admin/tests/integration/components/gh-cm-editor-test.js +++ b/apps/ember-admin/tests/integration/components/gh-cm-editor-test.js @@ -19,7 +19,7 @@ describe('Integration: Component: gh-cm-editor', function () { await render(hbs``); // access CodeMirror directly as it doesn't pick up changes to the textarea - let cm = find('.gh-input .CodeMirror').CodeMirror; + const cm = find('.gh-input .CodeMirror').CodeMirror; cm.setValue('Testing'); await settled(); @@ -32,7 +32,7 @@ describe('Integration: Component: gh-cm-editor', function () { // CodeMirror's events are triggered outside of anything we can watch for // in the tests so let's run the class check when we know the event has // been fired and timeout if it's not fired as we expect - let onFocus = async () => { + const onFocus = async () => { // wait for runloop to finish so that the new class has been rendered await settled(); expect(find('.gh-input').classList.contains('focus'), 'has focused class on first render with autofocus') diff --git a/apps/ember-admin/tests/integration/components/gh-form-group-test.js b/apps/ember-admin/tests/integration/components/gh-form-group-test.js index a1249f819e4..8abebcf776c 100644 --- a/apps/ember-admin/tests/integration/components/gh-form-group-test.js +++ b/apps/ember-admin/tests/integration/components/gh-form-group-test.js @@ -12,7 +12,7 @@ describe('Integration: Component: gh-form-group', function () { setupRenderingTest(); beforeEach(function () { - let testObject = EmberObject.create(); + const testObject = EmberObject.create(); testObject.name = 'Test'; testObject.hasValidated = []; testObject.errors = Errors.create(); diff --git a/apps/ember-admin/tests/integration/components/gh-image-uploader-test.js b/apps/ember-admin/tests/integration/components/gh-image-uploader-test.js index e693bf00f6b..d14fb267c80 100644 --- a/apps/ember-admin/tests/integration/components/gh-image-uploader-test.js +++ b/apps/ember-admin/tests/integration/components/gh-image-uploader-test.js @@ -24,7 +24,7 @@ const sessionStub = Service.extend({ init() { this._super(...arguments); - let authenticated = {access_token: 'AccessMe123'}; + const authenticated = {access_token: 'AccessMe123'}; this.authenticated = authenticated; this.data = {authenticated}; } @@ -85,7 +85,7 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('fires update action on successful upload', async function () { - let update = sinon.spy(); + const update = sinon.spy(); this.set('update', update); stubSuccessfulUpload(server); @@ -98,7 +98,7 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('doesn\'t fire update action on failed upload', async function () { - let update = sinon.spy(); + const update = sinon.spy(); this.set('update', update); stubFailedUpload(server, 500); @@ -110,7 +110,7 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('fires fileSelected action on file selection', async function () { - let fileSelected = sinon.spy(); + const fileSelected = sinon.spy(); this.set('fileSelected', fileSelected); stubSuccessfulUpload(server); @@ -123,7 +123,7 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('fires uploadStarted action on upload start', async function () { - let uploadStarted = sinon.spy(); + const uploadStarted = sinon.spy(); this.set('uploadStarted', uploadStarted); stubSuccessfulUpload(server); @@ -135,7 +135,7 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('fires uploadFinished action on successful upload', async function () { - let uploadFinished = sinon.spy(); + const uploadFinished = sinon.spy(); this.set('uploadFinished', uploadFinished); stubSuccessfulUpload(server); @@ -147,7 +147,7 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('fires uploadFinished action on failed upload', async function () { - let uploadFinished = sinon.spy(); + const uploadFinished = sinon.spy(); this.set('uploadFinished', uploadFinished); stubFailedUpload(server); @@ -210,8 +210,8 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('triggers notifications.showAPIError for VersionMismatchError', async function () { - let showAPIError = sinon.spy(); - let notifications = this.owner.lookup('service:notifications'); + const showAPIError = sinon.spy(); + const notifications = this.owner.lookup('service:notifications'); notifications.set('showAPIError', showAPIError); stubFailedUpload(server, 400, 'VersionMismatchError'); @@ -223,8 +223,8 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('doesn\'t trigger notifications.showAPIError for other errors', async function () { - let showAPIError = sinon.spy(); - let notifications = this.owner.lookup('service:notifications'); + const showAPIError = sinon.spy(); + const notifications = this.owner.lookup('service:notifications'); notifications.set('showAPIError', showAPIError); stubFailedUpload(server, 400, 'UnknownError'); @@ -249,7 +249,7 @@ describe('Integration: Component: gh-image-uploader', function () { await render(hbs``); run(() => { - let dragover = $.Event('dragover', { + const dragover = $.Event('dragover', { dataTransfer: { files: [] } @@ -266,8 +266,8 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('triggers file upload on file drop', async function () { - let uploadSuccess = sinon.spy(); - let drop = $.Event('drop', { + const uploadSuccess = sinon.spy(); + const drop = $.Event('drop', { dataTransfer: { files: [createFile(['test'], {name: 'test.png'})] } @@ -288,8 +288,8 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('validates extension by default', async function () { - let uploadSuccess = sinon.spy(); - let uploadFailed = sinon.spy(); + const uploadSuccess = sinon.spy(); + const uploadFailed = sinon.spy(); this.set('uploadSuccess', uploadSuccess); this.set('uploadFailed', uploadFailed); @@ -309,8 +309,8 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('uploads if validate action supplied and returns true', async function () { - let validate = sinon.stub().returns(true); - let uploadSuccess = sinon.spy(); + const validate = sinon.stub().returns(true); + const uploadSuccess = sinon.spy(); this.set('validate', validate); this.set('uploadSuccess', uploadSuccess); @@ -328,9 +328,9 @@ describe('Integration: Component: gh-image-uploader', function () { }); it('skips upload and displays error if validate action supplied and doesn\'t return true', async function () { - let validate = sinon.stub().returns(new UnsupportedMediaTypeError()); - let uploadSuccess = sinon.spy(); - let uploadFailed = sinon.spy(); + const validate = sinon.stub().returns(new UnsupportedMediaTypeError()); + const uploadSuccess = sinon.spy(); + const uploadFailed = sinon.spy(); this.set('validate', validate); this.set('uploadSuccess', uploadSuccess); diff --git a/apps/ember-admin/tests/integration/components/gh-image-uploader-with-preview-test.js b/apps/ember-admin/tests/integration/components/gh-image-uploader-with-preview-test.js index c53c14dcb81..6b95ee2ef56 100644 --- a/apps/ember-admin/tests/integration/components/gh-image-uploader-with-preview-test.js +++ b/apps/ember-admin/tests/integration/components/gh-image-uploader-with-preview-test.js @@ -9,7 +9,7 @@ describe('Integration: Component: gh-image-uploader-with-preview', function () { setupRenderingTest(); it('renders image if provided', async function () { - let remove = sinon.spy(); + const remove = sinon.spy(); this.set('remove', remove); this.set('image', 'http://example.com/test.png'); @@ -26,7 +26,7 @@ describe('Integration: Component: gh-image-uploader-with-preview', function () { }); it('triggers remove action when delete icon is clicked', async function () { - let remove = sinon.spy(); + const remove = sinon.spy(); this.set('remove', remove); this.set('image', 'http://example.com/test.png'); diff --git a/apps/ember-admin/tests/integration/components/gh-member-avatar-test.js b/apps/ember-admin/tests/integration/components/gh-member-avatar-test.js index 2f69f54fd24..198deee45b7 100644 --- a/apps/ember-admin/tests/integration/components/gh-member-avatar-test.js +++ b/apps/ember-admin/tests/integration/components/gh-member-avatar-test.js @@ -17,7 +17,7 @@ describe('Integration: Component: gh-member-avatar', function () { }); await render(hbs``); - let avatar = this.element; + const avatar = this.element; expect(avatar).to.exist; }); }); diff --git a/apps/ember-admin/tests/integration/components/gh-members-recipient-select-test.js b/apps/ember-admin/tests/integration/components/gh-members-recipient-select-test.js index 50d0e98b283..7ad8a73bd21 100644 --- a/apps/ember-admin/tests/integration/components/gh-members-recipient-select-test.js +++ b/apps/ember-admin/tests/integration/components/gh-members-recipient-select-test.js @@ -69,7 +69,7 @@ describe('Integration: Component: gh-members-recipient-select', function () { await timeout(100); // Should have Specific checkbox - let specificCheckbox = this.element.querySelector('[data-test-checkbox="specific-members"]'); + const specificCheckbox = this.element.querySelector('[data-test-checkbox="specific-members"]'); expect(specificCheckbox).to.exist; // Click specific @@ -83,8 +83,8 @@ describe('Integration: Component: gh-members-recipient-select', function () { await clickTrigger('[data-test-select="specific-members"]'); await timeout(100); - let options = findAll('.ember-power-select-option'); - let optionTexts = options.map(o => o.textContent.trim()); + const options = findAll('.ember-power-select-option'); + const optionTexts = options.map(o => o.textContent.trim()); expect(optionTexts).to.include('VIP'); }); @@ -190,7 +190,7 @@ describe('Integration: Component: gh-members-recipient-select', function () { // The label should appear as a selected token, proving it was registered // with labelsManager via addLabel so selectedOptions resolves it - let tokens = findAll('.ember-power-select-multiple-option'); + const tokens = findAll('.ember-power-select-multiple-option'); expect(tokens.some(t => t.textContent.includes('Outlier Label'))).to.be.true; }); }); diff --git a/apps/ember-admin/tests/integration/components/gh-members-segment-select-test.js b/apps/ember-admin/tests/integration/components/gh-members-segment-select-test.js index fc6f960aa84..d4021f38a97 100644 --- a/apps/ember-admin/tests/integration/components/gh-members-segment-select-test.js +++ b/apps/ember-admin/tests/integration/components/gh-members-segment-select-test.js @@ -31,8 +31,8 @@ describe('Integration: Component: gh-members-segment-select', function () { await clickTrigger(); await waitUntil(() => findAll('.ember-power-select-option').length >= 4); - let options = findAll('.ember-power-select-option'); - let optionTexts = options.map(o => o.textContent.trim()); + const options = findAll('.ember-power-select-option'); + const optionTexts = options.map(o => o.textContent.trim()); expect(optionTexts).to.include('Free members'); expect(optionTexts).to.include('Paid members'); @@ -70,7 +70,7 @@ describe('Integration: Component: gh-members-segment-select', function () { await render(hbs``); await waitUntil(() => findAll('.ember-power-select-multiple-option').length > 0); - let tokens = findAll('.ember-power-select-multiple-option'); + const tokens = findAll('.ember-power-select-multiple-option'); expect(tokens.length).to.equal(1); expect(tokens[0].textContent).to.include('Free members'); }); @@ -89,7 +89,7 @@ describe('Integration: Component: gh-members-segment-select', function () { await waitUntil(() => findAll('.ember-power-select-option').length > 0); // Verify first page loaded - let labelRequests = server.pretender.handledRequests.filter(r => r.url.includes('/labels')); + const labelRequests = server.pretender.handledRequests.filter(r => r.url.includes('/labels')); expect(labelRequests.length).to.be.at.least(1); // Scroll to bottom to trigger second page @@ -166,7 +166,7 @@ describe('Integration: Component: gh-members-segment-select', function () { // The label should appear as a selected token — this proves it was // registered with labelsManager via addLabel so selectedOptions resolves it - let tokens = findAll('.ember-power-select-multiple-option'); + const tokens = findAll('.ember-power-select-multiple-option'); expect(tokens.length).to.equal(1); expect(tokens[0].textContent).to.include('Unique Outlier'); }); @@ -182,8 +182,8 @@ describe('Integration: Component: gh-members-segment-select', function () { await clickTrigger(); await waitUntil(() => findAll('.ember-power-select-option').length > 0); - let options = findAll('.ember-power-select-option'); - let optionTexts = options.map(o => o.textContent.trim()); + const options = findAll('.ember-power-select-option'); + const optionTexts = options.map(o => o.textContent.trim()); expect(optionTexts).to.not.include('Hidden'); expect(optionTexts).to.include('Free members'); diff --git a/apps/ember-admin/tests/integration/components/gh-notification-test.js b/apps/ember-admin/tests/integration/components/gh-notification-test.js index 2adf7ee2d03..74c78239027 100644 --- a/apps/ember-admin/tests/integration/components/gh-notification-test.js +++ b/apps/ember-admin/tests/integration/components/gh-notification-test.js @@ -26,7 +26,7 @@ describe('Integration: Component: gh-notification', function () { expect(find('article.gh-notification')).to.exist; - let notification = find('.gh-notification'); + const notification = find('.gh-notification'); expect(notification).to.have.class('gh-notification-passive'); expect(notification).to.contain.text('Test message'); }); @@ -35,7 +35,7 @@ describe('Integration: Component: gh-notification', function () { this.set('message', new Message({message: 'Test message', type: 'success'})); await render(hbs``); - let notification = find('.gh-notification'); + const notification = find('.gh-notification'); this.message.type = 'error'; await settled(); @@ -49,10 +49,10 @@ describe('Integration: Component: gh-notification', function () { }); it('closes notification through notifications service', async function () { - let message = new Message({message: 'Test close', type: 'success'}); + const message = new Message({message: 'Test close', type: 'success'}); this.set('message', message); - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.closeNotification = sinon.stub(); await render(hbs``); diff --git a/apps/ember-admin/tests/integration/components/gh-notifications-test.js b/apps/ember-admin/tests/integration/components/gh-notifications-test.js index 7bd18c72340..44fa89a64ef 100644 --- a/apps/ember-admin/tests/integration/components/gh-notifications-test.js +++ b/apps/ember-admin/tests/integration/components/gh-notifications-test.js @@ -6,7 +6,7 @@ import {expect} from 'chai'; import {find, render, settled} from '@ember/test-helpers'; import {setupRenderingTest} from 'ember-mocha'; -let notificationsStub = Service.extend({ +const notificationsStub = Service.extend({ notifications: emberA() }); @@ -15,7 +15,7 @@ describe('Integration: Component: gh-notifications', function () { beforeEach(function () { this.owner.register('service:notifications', notificationsStub); - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.set('notifications', [ {message: 'First', type: 'error'}, @@ -29,7 +29,7 @@ describe('Integration: Component: gh-notifications', function () { expect(find('.gh-notifications').children.length).to.equal(2); - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.set('notifications', emberA()); await settled(); expect(find('.gh-notifications').children.length).to.equal(0); diff --git a/apps/ember-admin/tests/integration/components/gh-psm-authors-input-test.js b/apps/ember-admin/tests/integration/components/gh-psm-authors-input-test.js index 5b306af6dd7..cba01dcdcd4 100644 --- a/apps/ember-admin/tests/integration/components/gh-psm-authors-input-test.js +++ b/apps/ember-admin/tests/integration/components/gh-psm-authors-input-test.js @@ -199,7 +199,7 @@ describe('Integration: Component: gh-psm-authors-input', function () { await selectChoose('.ember-power-select-trigger', 'Remote Match'); await settled(); - let removeBtns = findAll('.ember-power-select-multiple-remove-btn'); + const removeBtns = findAll('.ember-power-select-multiple-remove-btn'); await click(removeBtns[0]); await clickTrigger(); diff --git a/apps/ember-admin/tests/integration/components/gh-psm-tags-input-test.js b/apps/ember-admin/tests/integration/components/gh-psm-tags-input-test.js index 726d06ed7c4..a62c48e986f 100644 --- a/apps/ember-admin/tests/integration/components/gh-psm-tags-input-test.js +++ b/apps/ember-admin/tests/integration/components/gh-psm-tags-input-test.js @@ -13,8 +13,8 @@ import {timeout} from 'ember-concurrency'; // to :post-id/?include=tags all ordering information is lost so we // need to build the tags array manually const assignPostWithTags = async function postWithTags(context, ...slugs) { - let post = await context.store.findRecord('post', 1); - let tags = await context.store.findAll('tag'); + const post = await context.store.findRecord('post', 1); + const tags = await context.store.findAll('tag'); slugs.forEach((slug) => { post.get('tags').pushObject(tags.findBy('slug', slug)); @@ -31,7 +31,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { beforeEach(function () { server = startMirage(); - let author = server.create('user'); + const author = server.create('user'); mockPosts(server); mockTags(server); @@ -53,7 +53,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { await assignPostWithTags(this, 'one', 'three'); await render(hbs``); - let selected = findAll('.tag-token'); + const selected = findAll('.tag-token'); expect(selected.length).to.equal(2); expect(selected[0]).to.contain.text('Tag 1'); expect(selected[1]).to.contain.text('Tag 3'); @@ -71,7 +71,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { // unsure why settled() is sometimes not catching the update await timeout(100); - let options = findAll('.ember-power-select-option'); + const options = findAll('.ember-power-select-option'); expect(options.length).to.equal(4); expect(options[0]).to.contain.text('Tag 1'); expect(options[1]).to.contain.text('#Tag 2'); @@ -166,7 +166,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { // unsure why settled() is sometimes not catching the update await timeout(100); - let options = findAll('.ember-power-select-option'); + const options = findAll('.ember-power-select-option'); expect(options.length).to.equal(2); expect(options[0]).to.contain.text('Add "2"...'); expect(options[1]).to.contain.text('Tag 2'); @@ -183,7 +183,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { // unsure why settled() is sometimes not catching the update await timeout(100); - let options = findAll('.ember-power-select-option'); + const options = findAll('.ember-power-select-option'); expect(options.length).to.equal(1); expect(options[0]).to.contain.text('#Tag 2'); }); @@ -199,7 +199,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { await typeInSearch(`O'`); await settled(); - let options = findAll('.ember-power-select-option'); + const options = findAll('.ember-power-select-option'); expect(options.length).to.equal(2); expect(options[0]).to.contain.text(`Add "O'"...`); expect(options[1]).to.contain.text(`O'Nolan`); @@ -217,7 +217,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { await typeInSearch('Alph'); await settled(); - let options = findAll('.ember-power-select-option'); + const options = findAll('.ember-power-select-option'); expect(options.length).to.equal(1); expect(options[0]).to.contain.text('Add "Alph"...'); }); @@ -227,7 +227,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { await assignPostWithTags(this, 'two', 'three'); await render(hbs``); - let selected = findAll('.tag-token'); + const selected = findAll('.tag-token'); expect(selected.length).to.equal(2); expect(selected[0]).to.have.class('tag-token--internal'); expect(selected[1]).to.not.have.class('tag-token--internal'); @@ -258,7 +258,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { let tags = await this.store.peekAll('tag'); expect(tags.length).to.equal(5); - let removeBtns = findAll('.ember-power-select-multiple-remove-btn'); + const removeBtns = findAll('.ember-power-select-multiple-remove-btn'); await click(removeBtns[removeBtns.length - 1]); tags = await this.store.peekAll('tag'); @@ -278,7 +278,7 @@ describe('Integration: Component: gh-psm-tags-input', function () { await settled(); await selectChoose('.ember-power-select-trigger', '.ember-power-select-option', 0); - let tags = await this.store.peekAll('tag'); + const tags = await this.store.peekAll('tag'); expect(tags.length).to.equal(6); expect(tags.findBy('name', 'New One').isNew).to.be.true; diff --git a/apps/ember-admin/tests/integration/components/gh-psm-visibility-input-test.js b/apps/ember-admin/tests/integration/components/gh-psm-visibility-input-test.js index 74d7002f3f3..bc4092fe67a 100644 --- a/apps/ember-admin/tests/integration/components/gh-psm-visibility-input-test.js +++ b/apps/ember-admin/tests/integration/components/gh-psm-visibility-input-test.js @@ -21,7 +21,7 @@ describe('Integration: Component: gh-psm-visibility-input', function () { }); it('updates post visibility on change', async function () { - let setVisibility = sinon.spy(); + const setVisibility = sinon.spy(); this.set('post', { visibility: 'public', diff --git a/apps/ember-admin/tests/integration/components/gh-uploader-test.js b/apps/ember-admin/tests/integration/components/gh-uploader-test.js index 7c3dfcfeda8..f7e7eb4bab6 100644 --- a/apps/ember-admin/tests/integration/components/gh-uploader-test.js +++ b/apps/ember-admin/tests/integration/components/gh-uploader-test.js @@ -49,7 +49,7 @@ describe('Integration: Component: gh-uploader', function () { this.set('files', [createFile()]); await settled(); - let [lastRequest] = server.handledRequests; + const [lastRequest] = server.handledRequests; expect(server.handledRequests.length).to.equal(1); expect(lastRequest.url).to.equal(`${ghostPaths().apiRoot}/images/upload/`); // requestBody is a FormData object @@ -88,7 +88,7 @@ describe('Integration: Component: gh-uploader', function () { expect(this.fileUploaded.calledTwice).to.be.true; // filename and url is passed in arg - let firstCall = this.fileUploaded.getCall(0); + const firstCall = this.fileUploaded.getCall(0); expect(firstCall.args[0].fileName).to.equal('file1.png'); expect(firstCall.args[0].url).to.equal('/content/images/test.png'); }); @@ -106,7 +106,7 @@ describe('Integration: Component: gh-uploader', function () { expect(this.uploadsFinished.calledOnce).to.be.true; // array of filenames and urls is passed in arg - let [result] = this.uploadsFinished.getCall(0).args; + const [result] = this.uploadsFinished.getCall(0).args; expect(result.length).to.equal(2); expect(result[0].fileName).to.equal('file1.png'); expect(result[0].url).to.equal('/content/images/test.png'); @@ -129,7 +129,7 @@ describe('Integration: Component: gh-uploader', function () { await settled(); - let [results] = this.uploadsFinished.getCall(1).args; + const [results] = this.uploadsFinished.getCall(1).args; expect(results.length).to.equal(1); expect(results[0].fileName).to.equal('file2.png'); }); @@ -152,13 +152,13 @@ describe('Integration: Component: gh-uploader', function () { ]); await settled(); - let [results] = this.uploadsFinished.getCall(0).args; + const [results] = this.uploadsFinished.getCall(0).args; expect(results.length).to.equal(2); expect(results[0].fileName).to.equal('file1.png'); }); it('doesn\'t allow new files to be set whilst uploading', async function () { - let errorSpy = sinon.spy(console, 'error'); + const errorSpy = sinon.spy(console, 'error'); stubSuccessfulUpload(server, 100); await render(hbs``); @@ -208,14 +208,14 @@ describe('Integration: Component: gh-uploader', function () { this.set('files', [createFile(), createFile()]); await waitFor('[data-test-progress-bar]', {timeout: 150}); - let progressBar = find('[data-test-progress-bar]'); + const progressBar = find('[data-test-progress-bar]'); await waitUntil(() => { - let width = parseInt(progressBar.style.width); + const width = parseInt(progressBar.style.width); return width > 50; }, {timeout: 150}); await settled(); - let finalProgressWidth = parseInt(find('[data-test-progress-bar]').style.width); + const finalProgressWidth = parseInt(find('[data-test-progress-bar]').style.width); expect(finalProgressWidth, 'final progress width').to.equal(100); }); @@ -266,7 +266,7 @@ describe('Integration: Component: gh-uploader', function () { this.set('files', [createFile()]); await settled(); - let [lastRequest] = server.handledRequests; + const [lastRequest] = server.handledRequests; expect(lastRequest.url).to.equal(`${ghostPaths().apiRoot}/images/`); }); @@ -275,7 +275,7 @@ describe('Integration: Component: gh-uploader', function () { this.set('files', [createFile()]); await settled(); - let [lastRequest] = server.handledRequests; + const [lastRequest] = server.handledRequests; // requestBody is a FormData object // this will fail in anything other than Chrome and Firefox // https://developer.mozilla.org/en-US/docs/Web/API/FormData#Browser_compatibility @@ -293,7 +293,7 @@ describe('Integration: Component: gh-uploader', function () { this.set('files', [createFile(['test'], {name: 'test.png'})]); await settled(); - let [onFailedResult] = this.onFailed.firstCall.args; + const [onFailedResult] = this.onFailed.firstCall.args; expect(onFailedResult.length).to.equal(1); expect(onFailedResult[0].fileName, 'onFailed file name').to.equal('test.png'); expect(onFailedResult[0].message, 'onFailed message').to.match(/not supported/); @@ -311,7 +311,7 @@ describe('Integration: Component: gh-uploader', function () { this.set('files', [createFile(['test'], {name: 'test.png'})]); await settled(); - let [onFailedResult] = this.onFailed.firstCall.args; + const [onFailedResult] = this.onFailed.firstCall.args; expect(onFailedResult.length).to.equal(1); expect(onFailedResult[0].fileName).to.equal('test.png'); expect(onFailedResult[0].message).to.equal('test.png failed test validation'); @@ -356,7 +356,7 @@ describe('Integration: Component: gh-uploader', function () { expect(this.uploadFailed.calledOnce).to.be.true; expect(this.uploadComplete.calledOnce).to.be.true; - let [failures] = this.uploadFailed.firstCall.args; + const [failures] = this.uploadFailed.firstCall.args; expect(failures.length).to.equal(2); expect(failures[0].fileName).to.equal('file1.png'); expect(failures[0].message).to.equal('Error: No upload for you'); @@ -377,11 +377,11 @@ describe('Integration: Component: gh-uploader', function () { expect(this.uploadFail.calledTwice).to.be.true; - let [firstFailure] = this.uploadFail.firstCall.args; + const [firstFailure] = this.uploadFail.firstCall.args; expect(firstFailure.fileName).to.equal('file1.png'); expect(firstFailure.message).to.equal('Error: No upload for you'); - let [secondFailure] = this.uploadFail.secondCall.args; + const [secondFailure] = this.uploadFail.secondCall.args; expect(secondFailure.fileName).to.equal('file2.png'); expect(secondFailure.message).to.equal('Error: No upload for you'); }); diff --git a/apps/ember-admin/tests/integration/components/tags/tag-form-test.js b/apps/ember-admin/tests/integration/components/tags/tag-form-test.js index 36675b69f5e..64590fb6f34 100644 --- a/apps/ember-admin/tests/integration/components/tags/tag-form-test.js +++ b/apps/ember-admin/tests/integration/components/tags/tag-form-test.js @@ -11,7 +11,7 @@ import {setupRenderingTest} from 'ember-mocha'; const {Errors} = DS; -let configStub = Service.extend({ +const configStub = Service.extend({ blogUrl: 'http://localhost:2368' }); @@ -19,7 +19,7 @@ describe.skip('Integration: Component: tags/tag-form', function () { setupRenderingTest(); beforeEach(function () { - let tag = EmberObject.create({ + const tag = EmberObject.create({ id: 1, name: 'Test', slug: 'test', @@ -113,7 +113,7 @@ describe.skip('Integration: Component: tags/tag-form', function () { lastSeenValue = value; }); - let testSetProperty = async (selector, expectedProperty, expectedValue) => { + const testSetProperty = async (selector, expectedProperty, expectedValue) => { await click(selector); await fillIn(selector, expectedValue); await blur(selector); @@ -133,8 +133,8 @@ describe.skip('Integration: Component: tags/tag-form', function () { }); it('displays error messages for validated fields', async function () { - let errors = this.get('tag.errors'); - let hasValidated = this.get('tag.hasValidated'); + const errors = this.get('tag.errors'); + const hasValidated = this.get('tag.hasValidated'); errors.add('name', 'must be present'); hasValidated.push('name'); @@ -155,22 +155,22 @@ describe.skip('Integration: Component: tags/tag-form', function () { `); - let nameFormGroup = find('input[name="name"]').closest('.form-group'); + const nameFormGroup = find('input[name="name"]').closest('.form-group'); expect(nameFormGroup, 'name form group has error state').to.have.class('error'); expect(nameFormGroup.querySelector('.response'), 'name form group has error message').to.exist; - let slugFormGroup = find('input[name="slug"]').closest('.form-group'); + const slugFormGroup = find('input[name="slug"]').closest('.form-group'); expect(slugFormGroup, 'slug form group has error state').to.have.class('error'); expect(slugFormGroup.querySelector('.response'), 'slug form group has error message').to.exist; - let descriptionFormGroup = find('textarea[name="description"]').closest('.form-group'); + const descriptionFormGroup = find('textarea[name="description"]').closest('.form-group'); expect(descriptionFormGroup, 'description form group has error state').to.have.class('error'); - let metaTitleFormGroup = find('input[name="metaTitle"]').closest('.form-group'); + const metaTitleFormGroup = find('input[name="metaTitle"]').closest('.form-group'); expect(metaTitleFormGroup, 'metaTitle form group has error state').to.have.class('error'); expect(metaTitleFormGroup.querySelector('.response'), 'metaTitle form group has error message').to.exist; - let metaDescriptionFormGroup = find('textarea[name="metaDescription"]').closest('.form-group'); + const metaDescriptionFormGroup = find('textarea[name="metaDescription"]').closest('.form-group'); expect(metaDescriptionFormGroup, 'metaDescription form group has error state').to.have.class('error'); expect(metaDescriptionFormGroup.querySelector('.response'), 'metaDescription form group has error message').to.exist; }); @@ -180,10 +180,10 @@ describe.skip('Integration: Component: tags/tag-form', function () { `); - let descriptionFormGroup = find('textarea[name="description"]').closest('.form-group'); + const descriptionFormGroup = find('textarea[name="description"]').closest('.form-group'); expect(descriptionFormGroup.querySelector('.word-count'), 'description char count').to.have.trimmed.text('12'); - let metaDescriptionFormGroup = find('textarea[name="metaDescription"]').closest('.form-group'); + const metaDescriptionFormGroup = find('textarea[name="metaDescription"]').closest('.form-group'); expect(metaDescriptionFormGroup.querySelector('.word-count'), 'description char count').to.have.trimmed.text('16'); }); @@ -197,7 +197,7 @@ describe.skip('Integration: Component: tags/tag-form', function () { expect(find('.seo-preview-title').textContent, 'falls back to tag name without metaTitle').to.equal('Test'); this.set('tag.name', (new Array(151).join('x'))); - let expectedLength = 70 + '…'.length; + const expectedLength = 70 + '…'.length; expect(find('.seo-preview-title').textContent.length, 'cuts title to max 70 chars').to.equal(expectedLength); }); @@ -208,7 +208,7 @@ describe.skip('Integration: Component: tags/tag-form', function () { expect(find('.seo-preview-link').textContent, 'adds url and tag prefix').to.equal('http://localhost:2368/tag/test/'); this.set('tag.slug', (new Array(151).join('x'))); - let expectedLength = 70 + '…'.length; + const expectedLength = 70 + '…'.length; expect(find('.seo-preview-link').textContent.length, 'cuts slug to max 70 chars').to.equal(expectedLength); }); @@ -222,7 +222,7 @@ describe.skip('Integration: Component: tags/tag-form', function () { expect(find('.seo-preview-description').textContent, 'falls back to tag description without metaDescription').to.equal('Description.'); this.set('tag.description', (new Array(500).join('x'))); - let expectedLength = 156 + '…'.length; + const expectedLength = 156 + '…'.length; expect(find('.seo-preview-description').textContent.length, 'cuts description to max 156 chars').to.equal(expectedLength); }); diff --git a/apps/ember-admin/tests/integration/helpers/gh-format-post-time-test.js b/apps/ember-admin/tests/integration/helpers/gh-format-post-time-test.js index 772a53f02f1..4625721e722 100644 --- a/apps/ember-admin/tests/integration/helpers/gh-format-post-time-test.js +++ b/apps/ember-admin/tests/integration/helpers/gh-format-post-time-test.js @@ -12,10 +12,10 @@ const timezoneForTest = 'Iceland'; describe('Integration: Helper: gh-format-post-time', function () { setupRenderingTest(); - let sandbox = sinon.createSandbox(); + const sandbox = sinon.createSandbox(); beforeEach(function () { - let settings = this.owner.lookup('service:settings'); + const settings = this.owner.lookup('service:settings'); settings.settingsModel = {}; settings.timezone = timezoneForTest; }); @@ -25,13 +25,13 @@ describe('Integration: Helper: gh-format-post-time', function () { }); function setupMockDate({date, utcDate}) { - let mockDate = moment(date); + const mockDate = moment(date); // compute expectedTime before we override - let expectedTime = moment.tz(mockDate, timezoneForTest).format('HH:mm'); + const expectedTime = moment.tz(mockDate, timezoneForTest).format('HH:mm'); // stub moment.utc to return our provided utcDate - let utcStub = sandbox.stub(moment, 'utc'); + const utcStub = sandbox.stub(moment, 'utc'); utcStub.returns(moment(utcDate)); utcStub.onFirstCall().returns(mockDate); @@ -39,7 +39,7 @@ describe('Integration: Helper: gh-format-post-time', function () { } it('returns basic time difference if post is draft', async function () { - let mockDate = moment.utc().subtract(1, 'hour'); + const mockDate = moment.utc().subtract(1, 'hour'); this.set('mockDate', mockDate); await render(hbs`{{gh-format-post-time mockDate relative=true}}`); @@ -47,7 +47,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns difference if post was published less than 2 minutes ago', async function () { - let mockDate = moment.utc().subtract(13, 'minutes'); + const mockDate = moment.utc().subtract(13, 'minutes'); this.set('mockDate', mockDate); await render(hbs`{{gh-format-post-time mockDate absolute=true}}`); @@ -55,7 +55,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns difference if post is scheduled for less than 2 minutes from now', async function () { - let mockDate = moment.utc().add(13, 'minutes'); + const mockDate = moment.utc().add(13, 'minutes'); this.set('mockDate', mockDate); await render(hbs`{{gh-format-post-time mockDate scheduled=true}}`); @@ -64,7 +64,7 @@ describe('Integration: Helper: gh-format-post-time', function () { it('returns correct format if post was published on the same day', async function () { // needs to be outside of 12 hours - let {mockDate, expectedTime} = setupMockDate({ + const {mockDate, expectedTime} = setupMockDate({ date: '2017-09-06T06:00:00Z', utcDate: '2017-09-06T19:00:00Z' }); @@ -76,7 +76,7 @@ describe('Integration: Helper: gh-format-post-time', function () { it('returns correct format if post is scheduled for the same day', async function () { // needs to be outside of 12 hours - let {mockDate, expectedTime} = setupMockDate({ + const {mockDate, expectedTime} = setupMockDate({ date: '2017-09-06T06:00:00Z', utcDate: '2017-09-06T19:00:00Z' }); @@ -87,7 +87,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns correct format if post was published yesterday', async function () { - let {mockDate, expectedTime} = setupMockDate({ + const {mockDate, expectedTime} = setupMockDate({ date: '2017-09-05T16:00:00Z', utcDate: '2017-09-06T18:00:00Z' }); @@ -98,7 +98,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns correct short format if post was published yesterday', async function () { - let {mockDate} = setupMockDate({ + const {mockDate} = setupMockDate({ date: '2017-09-05T16:00:00Z', utcDate: '2017-09-06T18:00:00Z' }); @@ -109,7 +109,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns correct format if post is scheduled for tomorrow', async function () { - let {mockDate, expectedTime} = setupMockDate({ + const {mockDate, expectedTime} = setupMockDate({ date: '2017-09-07T18:00:00Z', utcDate: '2017-09-06T16:00:00Z' }); @@ -120,7 +120,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns correct format if post was published prior to yesterday', async function () { - let {mockDate} = setupMockDate({ + const {mockDate} = setupMockDate({ date: '2017-09-02T16:00:00Z', utcDate: '2017-09-06T18:00:00Z' }); @@ -131,7 +131,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns correct short format if post was published prior to yesterday', async function () { - let {mockDate} = setupMockDate({ + const {mockDate} = setupMockDate({ date: '2017-09-02T16:00:00Z', utcDate: '2017-09-06T18:00:00Z' }); @@ -142,7 +142,7 @@ describe('Integration: Helper: gh-format-post-time', function () { }); it('returns correct format if post is scheduled for later than tomorrow', async function () { - let {mockDate, expectedTime} = setupMockDate({ + const {mockDate, expectedTime} = setupMockDate({ date: '2017-09-10T18:00:00Z', utcDate: '2017-09-06T16:00:00Z' }); diff --git a/apps/ember-admin/tests/integration/helpers/gh-url-preview-test.js b/apps/ember-admin/tests/integration/helpers/gh-url-preview-test.js index 16096f75258..baaff2393c3 100644 --- a/apps/ember-admin/tests/integration/helpers/gh-url-preview-test.js +++ b/apps/ember-admin/tests/integration/helpers/gh-url-preview-test.js @@ -8,7 +8,7 @@ describe('Unit: Component: gh-url-preview', function () { setupRenderingTest(); beforeEach(function () { - let configStub = { + const configStub = { blogUrl: 'http://my-ghost-blog.com' }; this.owner.register('config:main', configStub, {instantiate: false}); diff --git a/apps/ember-admin/tests/integration/modifiers/validation-status-test.js b/apps/ember-admin/tests/integration/modifiers/validation-status-test.js index fe12a2aab4d..0c15869345b 100644 --- a/apps/ember-admin/tests/integration/modifiers/validation-status-test.js +++ b/apps/ember-admin/tests/integration/modifiers/validation-status-test.js @@ -12,7 +12,7 @@ describe('Integration: Modifier: validation-status', function () { setupRenderingTest(); this.beforeEach(function () { - let testObject = EmberObject.create(); + const testObject = EmberObject.create(); testObject.name = 'Test'; testObject.hasValidated = []; testObject.errors = Errors.create(); diff --git a/apps/ember-admin/tests/integration/services/ajax-test.js b/apps/ember-admin/tests/integration/services/ajax-test.js index e62b3a81bfe..694fc4f0c06 100644 --- a/apps/ember-admin/tests/integration/services/ajax-test.js +++ b/apps/ember-admin/tests/integration/services/ajax-test.js @@ -39,10 +39,10 @@ describe('Integration: Service: ajax', function () { }); it('correctly parses single message response text', function (done) { - let errorResponse = {message: 'Test Error'}; + const errorResponse = {message: 'Test Error'}; stubAjaxEndpoint(server, errorResponse, 500); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true(); @@ -54,10 +54,10 @@ describe('Integration: Service: ajax', function () { }); it('correctly parses single error response text', function (done) { - let errorResponse = {error: 'Test Error'}; + const errorResponse = {error: 'Test Error'}; stubAjaxEndpoint(server, errorResponse, 500); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true(); @@ -69,10 +69,10 @@ describe('Integration: Service: ajax', function () { }); it('correctly parses multiple error messages', function (done) { - let errorResponse = {errors: ['First Error', 'Second Error']}; + const errorResponse = {errors: ['First Error', 'Second Error']}; stubAjaxEndpoint(server, errorResponse, 500); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true(); @@ -87,7 +87,7 @@ describe('Integration: Service: ajax', function () { it('returns default error object for non built-in error', function (done) { stubAjaxEndpoint(server, {}, 500); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -100,7 +100,7 @@ describe('Integration: Service: ajax', function () { it('handles error checking for built-in errors', function (done) { stubAjaxEndpoint(server, '', 401); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -124,7 +124,7 @@ describe('Integration: Service: ajax', function () { ]; }); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -137,7 +137,7 @@ describe('Integration: Service: ajax', function () { it('handles error checking for RequestEntityTooLargeError on 413 errors', function (done) { stubAjaxEndpoint(server, {}, 413); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -150,7 +150,7 @@ describe('Integration: Service: ajax', function () { it('handles error checking for UnsupportedMediaTypeError on 415 errors', function (done) { stubAjaxEndpoint(server, {}, 415); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -163,7 +163,7 @@ describe('Integration: Service: ajax', function () { it('handles error checking for MaintenanceError on 503 errors', function (done) { stubAjaxEndpoint(server, {}, 503); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -180,7 +180,7 @@ describe('Integration: Service: ajax', function () { }] }, 403); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -198,7 +198,7 @@ describe('Integration: Service: ajax', function () { }] }, 403); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -216,7 +216,7 @@ describe('Integration: Service: ajax', function () { }] }, 403); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; @@ -233,7 +233,7 @@ describe('Integration: Service: ajax', function () { }] }, 403); - let ajax = this.owner.lookup('service:ajax'); + const ajax = this.owner.lookup('service:ajax'); ajax.request('/test/').then(() => { expect(false).to.be.true; diff --git a/apps/ember-admin/tests/integration/services/config-test.js b/apps/ember-admin/tests/integration/services/config-test.js index 9dc6af94001..a36dc78cf6d 100644 --- a/apps/ember-admin/tests/integration/services/config-test.js +++ b/apps/ember-admin/tests/integration/services/config-test.js @@ -30,7 +30,7 @@ describe('Integration: Service: config-manager', function () { }); it('normalizes blogUrl to non-trailing-slash', function (done) { - let stubBlogUrl = function stubBlogUrl(url) { + const stubBlogUrl = function stubBlogUrl(url) { server.get(`${ghostPaths().apiRoot}/config/`, function () { return [ 200, diff --git a/apps/ember-admin/tests/integration/services/feature-test.js b/apps/ember-admin/tests/integration/services/feature-test.js index 1a5a35d6920..868185421a5 100644 --- a/apps/ember-admin/tests/integration/services/feature-test.js +++ b/apps/ember-admin/tests/integration/services/feature-test.js @@ -30,8 +30,8 @@ function stubSettings(server, labs, validSave = true) { }); server.put(`${ghostPaths().apiRoot}/settings/`, function (request) { - let statusCode = (validSave) ? 200 : 400; - let response = (validSave) ? request.requestBody : JSON.stringify({ + const statusCode = (validSave) ? 200 : 400; + const response = (validSave) ? request.requestBody : JSON.stringify({ errors: [{ message: 'Test Error' }] @@ -42,7 +42,7 @@ function stubSettings(server, labs, validSave = true) { } function stubUser(server, accessibility, validSave = true) { - let users = [{ + const users = [{ id: '1', // Add extra properties for the validations name: 'Test User', @@ -60,8 +60,8 @@ function stubUser(server, accessibility, validSave = true) { }); server.put(`${ghostPaths().apiRoot}/users/1/`, function (request) { - let statusCode = (validSave) ? 200 : 400; - let response = (validSave) ? request.requestBody : JSON.stringify({ + const statusCode = (validSave) ? 200 : 400; + const response = (validSave) ? request.requestBody : JSON.stringify({ errors: [{ message: 'Test Error' }] @@ -114,10 +114,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); await service.fetch(); expect(service.get('labs.testFlag')).to.be.false; expect(service.get('testFlag')).to.be.false; @@ -134,10 +134,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); await service.fetch(); expect(service.get('testFlag')).to.be.true; @@ -150,10 +150,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); service.config.testFlag = false; await service.fetch(); @@ -167,10 +167,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); service.config.testFlag = true; await service.fetch(); @@ -184,10 +184,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); service.config.testFlag = {key: 'value'}; await service.fetch(); @@ -201,10 +201,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); service.config.testFlag = true; await service.fetch(); @@ -218,10 +218,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); await service.fetch(); expect(service.get('accessibility.testUserFlag')).to.be.false; @@ -234,10 +234,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); await service.fetch(); expect(service.get('accessibility.testUserFlag')).to.be.true; @@ -248,10 +248,10 @@ describe('Integration: Service: feature', function () { stubSettings(server, {}); stubUser(server, {nightShift: 'system'}); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); sinon.stub(service.lazyLoader, 'loadStyle').resolves(); stubMatchMedia({ matches: true, @@ -270,10 +270,10 @@ describe('Integration: Service: feature', function () { stubSettings(server, {}); stubUser(server, {nightShift: 'system'}); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); let changeHandler; sinon.stub(service.lazyLoader, 'loadStyle').resolves(); stubMatchMedia({ @@ -297,10 +297,10 @@ describe('Integration: Service: feature', function () { stubSettings(server, {}); stubUser(server, {}); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); sinon.stub(service.lazyLoader, 'loadStyle').resolves(); stubMatchMedia({ matches: true, @@ -319,10 +319,10 @@ describe('Integration: Service: feature', function () { stubSettings(server, {}); stubUser(server, {nightShift: true}); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); sinon.stub(service.lazyLoader, 'loadStyle').resolves(); await service.fetch(); @@ -338,10 +338,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); service.config.testFlag = {key: 'value'}; await service.fetch(); @@ -363,10 +363,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); await service.fetch(); expect(service.get('testUserFlag')).to.be.false; @@ -386,10 +386,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); service.config.testFlag = false; await service.fetch(); @@ -419,10 +419,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let session = this.owner.lookup('service:session'); + const session = this.owner.lookup('service:session'); await session.populateUser(); - let service = this.owner.lookup('service:feature'); + const service = this.owner.lookup('service:feature'); await service.fetch(); expect(service.get('testUserFlag')).to.be.false; @@ -451,10 +451,10 @@ describe('Integration: Service: feature', function () { addTestFlag(); - let sessionService = this.owner.lookup('service:session'); + const sessionService = this.owner.lookup('service:session'); await sessionService.populateUser(); - let featureService = this.owner.lookup('service:feature'); + const featureService = this.owner.lookup('service:feature'); featureService.config.testFlag = false; await featureService.fetch(); diff --git a/apps/ember-admin/tests/integration/services/lazy-loader-test.js b/apps/ember-admin/tests/integration/services/lazy-loader-test.js index 994e1bd0927..f440d1e3100 100644 --- a/apps/ember-admin/tests/integration/services/lazy-loader-test.js +++ b/apps/ember-admin/tests/integration/services/lazy-loader-test.js @@ -17,7 +17,7 @@ describe('Integration: Service: lazy-loader', function () { }); it('loads a script correctly and only once', async function () { - let subject = this.owner.lookup('service:lazy-loader'); + const subject = this.owner.lookup('service:lazy-loader'); subject.setProperties({ scriptPromises: {}, @@ -44,7 +44,7 @@ describe('Integration: Service: lazy-loader', function () { }); it('loads styles correctly', function () { - let subject = this.owner.lookup('service:lazy-loader'); + const subject = this.owner.lookup('service:lazy-loader'); subject.setProperties({ testing: false @@ -63,7 +63,7 @@ describe('Integration: Service: lazy-loader', function () { // broccoli-asset-rev rewrites string literals in compiled JS at build // time, prepending the CDN origin. When the lazy-loader receives an // already-absolute URL it must use it as-is. - let subject = this.owner.lookup('service:lazy-loader'); + const subject = this.owner.lookup('service:lazy-loader'); subject.setProperties({ scriptPromises: {}, diff --git a/apps/ember-admin/tests/integration/services/slug-generator-test.js b/apps/ember-admin/tests/integration/services/slug-generator-test.js index 452c856f615..c7638f7e298 100644 --- a/apps/ember-admin/tests/integration/services/slug-generator-test.js +++ b/apps/ember-admin/tests/integration/services/slug-generator-test.js @@ -46,7 +46,7 @@ describe('Integration: Service: slug-generator', function () { }); it('returns empty if no slug is provided', function (done) { - let service = this.owner.lookup('service:slug-generator'); + const service = this.owner.lookup('service:slug-generator'); service.generateSlug('post', '').then(function (slug) { expect(slug).to.equal(''); @@ -55,10 +55,10 @@ describe('Integration: Service: slug-generator', function () { }); it('calls correct endpoint and returns correct data', function (done) { - let rawSlug = 'a test post'; + const rawSlug = 'a test post'; stubSlugEndpoint(server, 'post', 'a-test-post'); - let service = this.owner.lookup('service:slug-generator'); + const service = this.owner.lookup('service:slug-generator'); service.generateSlug('post', rawSlug).then(function (slug) { expect(slug).to.equal(dasherize(rawSlug)); @@ -67,10 +67,10 @@ describe('Integration: Service: slug-generator', function () { }); it('calls correct endpoint and returns correct data when passed an id', function (done) { - let rawSlug = 'a test post'; + const rawSlug = 'a test post'; stubSlugEndpoint(server, 'post', 'a-test-post', 'a-test-id'); - let service = this.owner.lookup('service:slug-generator'); + const service = this.owner.lookup('service:slug-generator'); service.generateSlug('post', rawSlug, 'a-test-id').then(function (slug) { expect(slug).to.equal(dasherize(rawSlug)); diff --git a/apps/ember-admin/tests/unit/authenticators/cookie-test.js b/apps/ember-admin/tests/unit/authenticators/cookie-test.js index 8cab8f1b4b5..a60bd1c2c64 100644 --- a/apps/ember-admin/tests/unit/authenticators/cookie-test.js +++ b/apps/ember-admin/tests/unit/authenticators/cookie-test.js @@ -59,8 +59,8 @@ describe('Unit: Authenticator: cookie', () => { describe('#authenticate', function () { it('posts the username and password to the sessionEndpoint and returns the promise', function () { - let authenticator = this.owner.lookup('authenticator:cookie'); - let post = authenticator.ajax.post; + const authenticator = this.owner.lookup('authenticator:cookie'); + const post = authenticator.ajax.post; return authenticator.authenticate({identification: 'AzureDiamond', password: 'hunter2'}).then(() => { expect(post.args[0][0]).to.equal(`${ghostPaths().apiRoot}/session`); @@ -80,8 +80,8 @@ describe('Unit: Authenticator: cookie', () => { }); it('puts the token to the sessionVerifyEndpoint and returns the promise', function () { - let authenticator = this.owner.lookup('authenticator:cookie'); - let put = authenticator.ajax.put; + const authenticator = this.owner.lookup('authenticator:cookie'); + const put = authenticator.ajax.put; return authenticator.authenticate({token: '123456'}).then(() => { expect(put.args[0][0]).to.equal(`${ghostPaths().apiRoot}/session/verify`); @@ -102,8 +102,8 @@ describe('Unit: Authenticator: cookie', () => { describe('#invalidate', function () { it('makes a delete request to the sessionEndpoint', function () { - let authenticator = this.owner.lookup('authenticator:cookie'); - let del = authenticator.ajax.del; + const authenticator = this.owner.lookup('authenticator:cookie'); + const del = authenticator.ajax.del; return authenticator.invalidate().then(() => { expect(del.args[0][0]).to.equal(`${ghostPaths().apiRoot}/session`); diff --git a/apps/ember-admin/tests/unit/controllers/editor-test.js b/apps/ember-admin/tests/unit/controllers/editor-test.js index 4c203fc2665..68c14c2addf 100644 --- a/apps/ember-admin/tests/unit/controllers/editor-test.js +++ b/apps/ember-admin/tests/unit/controllers/editor-test.js @@ -24,7 +24,7 @@ describe('Unit: Controller: lexical-editor', function () { describe('generateSlug', function () { it('should generate a slug and set it on the post, passing the id if it exists', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('slugGenerator', EmberObject.create({ generateSlug(slugType, str, id) { if (id !== 'fake-id') { @@ -46,7 +46,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should generate a slug and set it on the post', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('slugGenerator', EmberObject.create({ generateSlug(slugType, str) { return RSVP.resolve(`${str}-slug`); @@ -65,7 +65,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should not set the destination if the title is "(Untitled)" and the post already has a slug', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('slugGenerator', EmberObject.create({ generateSlug(slugType, str) { return RSVP.resolve(`${str}-slug`); @@ -82,7 +82,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should generate a new slug if the previous title was (Untitled)', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('slugGenerator', EmberObject.create({ generateSlug(slugType, str) { return RSVP.resolve(`${str}-slug`); @@ -100,7 +100,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should generate a new slug if the previous title ended with (Copy)', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('slugGenerator', EmberObject.create({ generateSlug(slugType, str) { return RSVP.resolve(`${str}-slug`); @@ -119,7 +119,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should not generate a new slug if it appears a custom slug was set', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('slugGenerator', EmberObject.create({ generateSlug(slugType, str) { return RSVP.resolve(`${str}-slug`); @@ -141,7 +141,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should generate new slugs if the title changes', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('slugGenerator', EmberObject.create({ generateSlug(slugType, str) { return RSVP.resolve(`${str}-slug`); @@ -169,7 +169,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should invoke generateSlug if the post is not published', async function () { - let {controller} = this; + const {controller} = this; controller.set('target', {send() {}}); defineProperty(controller, 'generateSlugTask', task(function * () { @@ -190,7 +190,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should not invoke generateSlug if the post is published', async function () { - let {controller} = this; + const {controller} = this; controller.set('target', {send() {}}); controller.set('post', createPost({ @@ -212,7 +212,7 @@ describe('Unit: Controller: lexical-editor', function () { describe('TK count in title', function () { it('should have count 0 for no TK', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('post', createPost({titleScratch: 'this is a title'})); @@ -220,7 +220,7 @@ describe('Unit: Controller: lexical-editor', function () { }); it('should count TK reminders in the title', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('post', createPost({titleScratch: 'this is a TK'})); @@ -232,7 +232,7 @@ describe('Unit: Controller: lexical-editor', function () { it('detects new post with changed attributes as dirty (autosave)', async function () { const initialLexicalString = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content","type": "extended-text","version": 1}],"direction": null,"format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; const lexicalScratch = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content updated","type": "extended-text","version": 1}],"direction": null,"format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('post', createPost({ title: '', titleScratch: '', @@ -242,7 +242,7 @@ describe('Unit: Controller: lexical-editor', function () { secondaryLexicalState: initialLexicalString })); - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.true; }); @@ -253,14 +253,14 @@ describe('Unit: Controller: lexical-editor', function () { post.lexicalScratch = post.lexical; controller.set('post', post); - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.false; }); it('marks isNew post as dirty when lexicalScratch differs from lexical and secondaryLexical', async function () { const initialLexicalString = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content","type": "extended-text","version": 1}],"direction": null,"format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; const lexicalScratch = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content scratch","type": "extended-text","version": 1}],"direction": null,"format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('post', createPost({ title: '', titleScratch: '', @@ -271,12 +271,12 @@ describe('Unit: Controller: lexical-editor', function () { changedAttributes: () => ({title: ['', 'New Title']}) })); - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.true; }); it('Changes in the direction field in the lexical string are not considered dirty', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); const initialLexicalString = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content","type": "extended-text","version": 1}],"direction": null,"format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; const lexicalStringNoNullDirection = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content","type": "extended-text","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; @@ -320,7 +320,7 @@ describe('Unit: Controller: lexical-editor', function () { const lexicalScratch = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content","type": "extended-text","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; const secondLexicalInstance = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Here's some new text","type": "extended-text","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); const post = createPost({ title: 'this is a title', @@ -340,7 +340,7 @@ describe('Unit: Controller: lexical-editor', function () { savedPost.secondaryLexicalState = secondLexicalInstance; controller.set('post', savedPost); - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.false; }); @@ -350,7 +350,7 @@ describe('Unit: Controller: lexical-editor', function () { const lexicalScratch = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Sample content1234","type": "extended-text","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; const secondLexicalInstance = `{"root":{"children":[{"children": [{"detail": 0,"format": 0,"mode": "normal","style": "","text": "Here's some new text","type": "extended-text","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "paragraph","version": 1}],"direction": "ltr","format": "","indent": 0,"type": "root","version": 1}}`; - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); const post = createPost({ title: 'this is a title', @@ -372,22 +372,22 @@ describe('Unit: Controller: lexical-editor', function () { controller.send('updateScratch',JSON.parse(lexicalScratch)); - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.true; }); it('dirty is false if no Post', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); controller.set('post', null); - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.false; }); it('returns true if current tags differ from previous tags', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); const tag1 = this.owner.lookup('service:store').createRecord('tag', {id: 1, name: 'test'}); const tag2 = this.owner.lookup('service:store').createRecord('tag', {id: 2, name: 'changed'}); const post = createPost({ @@ -404,13 +404,13 @@ describe('Unit: Controller: lexical-editor', function () { savedPost.tags = [tag1, tag2]; - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.true; }); it('returns false when the post is new but has no changed attributes', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); // no attrs = defaults = empty changedAttributes const post = createPost({}); controller.set('post', post); @@ -418,12 +418,12 @@ describe('Unit: Controller: lexical-editor', function () { post.titleScratch = post.title; post.lexicalScratch = post.lexical; - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; expect(isDirty).to.be.false; }); it('skips new post check if post is not new', async function () { - let controller = this.owner.lookup('controller:lexical-editor'); + const controller = this.owner.lookup('controller:lexical-editor'); const post = createPost({ title: 'Sample Title', status: 'draft', @@ -442,7 +442,7 @@ describe('Unit: Controller: lexical-editor', function () { savedPost.secondaryLexicalState = ''; controller.set('post', savedPost); - let isDirty = controller.hasDirtyAttributes; + const isDirty = controller.hasDirtyAttributes; // The test passes if no errors occur and it doesn't return true for new post condition expect(isDirty).to.be.false; }); diff --git a/apps/ember-admin/tests/unit/helpers/gh-count-characters-test.js b/apps/ember-admin/tests/unit/helpers/gh-count-characters-test.js index f9e07fc9d59..7777047a021 100644 --- a/apps/ember-admin/tests/unit/helpers/gh-count-characters-test.js +++ b/apps/ember-admin/tests/unit/helpers/gh-count-characters-test.js @@ -3,23 +3,23 @@ import {describe, it} from 'mocha'; import {expect} from 'chai'; describe('Unit: Helper: gh-count-characters', function () { - let defaultStyle = 'color: rgb(69, 195, 46);'; - let errorStyle = 'color: rgb(240, 82, 48);'; + const defaultStyle = 'color: rgb(69, 195, 46);'; + const errorStyle = 'color: rgb(240, 82, 48);'; it('counts remaining chars', function () { - let result = countCharacters(['test']); + const result = countCharacters(['test']); expect(result.string) .to.equal(`196`); }); it('warns when nearing limit', function () { - let result = countCharacters([Array(195 + 1).join('x')]); + const result = countCharacters([Array(195 + 1).join('x')]); expect(result.string) .to.equal(`5`); }); it('indicates too many chars', function () { - let result = countCharacters([Array(205 + 1).join('x')]); + const result = countCharacters([Array(205 + 1).join('x')]); expect(result.string) .to.equal(`-5`); }); diff --git a/apps/ember-admin/tests/unit/helpers/gh-count-down-characters-test.js b/apps/ember-admin/tests/unit/helpers/gh-count-down-characters-test.js index 85efc1ebd29..2e983ad3927 100644 --- a/apps/ember-admin/tests/unit/helpers/gh-count-down-characters-test.js +++ b/apps/ember-admin/tests/unit/helpers/gh-count-down-characters-test.js @@ -3,17 +3,17 @@ import {describe, it} from 'mocha'; import {expect} from 'chai'; describe('Unit: Helper: gh-count-down-characters', function () { - let validStyle = 'color: rgb(48, 207, 67); font-weight: bold;'; - let errorStyle = 'color: rgb(226, 84, 64); font-weight: bold;'; + const validStyle = 'color: rgb(48, 207, 67); font-weight: bold;'; + const errorStyle = 'color: rgb(226, 84, 64); font-weight: bold;'; it('counts chars', function () { - let result = countDownCharacters(['test', 200]); + const result = countDownCharacters(['test', 200]); expect(result.string) .to.equal(`4`); }); it('warns with too many chars', function () { - let result = countDownCharacters([Array(205 + 1).join('x'), 200]); + const result = countDownCharacters([Array(205 + 1).join('x'), 200]); expect(result.string) .to.equal(`205`); }); diff --git a/apps/ember-admin/tests/unit/helpers/gh-user-can-admin-test.js b/apps/ember-admin/tests/unit/helpers/gh-user-can-admin-test.js index dd65cc163d1..1de3b568248 100644 --- a/apps/ember-admin/tests/unit/helpers/gh-user-can-admin-test.js +++ b/apps/ember-admin/tests/unit/helpers/gh-user-can-admin-test.js @@ -5,7 +5,7 @@ import {ghUserCanAdmin} from 'ghost-admin/helpers/gh-user-can-admin'; describe('Unit: Helper: gh-user-can-admin', function () { // Mock up roles and test for truthy describe('Owner or admin roles', function () { - let user = { + const user = { get(role) { if (role === 'isAdmin') { return true; @@ -15,13 +15,13 @@ describe('Unit: Helper: gh-user-can-admin', function () { }; it(' - can be Admin', function () { - let result = ghUserCanAdmin([user]); + const result = ghUserCanAdmin([user]); expect(result).to.equal(true); }); }); describe('Editor, Author & Contributor roles', function () { - let user = { + const user = { get(role) { if (role === 'isAdmin') { return false; @@ -31,7 +31,7 @@ describe('Unit: Helper: gh-user-can-admin', function () { }; it(' - cannot be Admin', function () { - let result = ghUserCanAdmin([user]); + const result = ghUserCanAdmin([user]); expect(result).to.equal(false); }); }); diff --git a/apps/ember-admin/tests/unit/helpers/highlighted-text-test.js b/apps/ember-admin/tests/unit/helpers/highlighted-text-test.js index 6130219fe2a..566cdf43085 100644 --- a/apps/ember-admin/tests/unit/helpers/highlighted-text-test.js +++ b/apps/ember-admin/tests/unit/helpers/highlighted-text-test.js @@ -9,13 +9,13 @@ import { describe('Unit: Helper: highlighted-text', function () { it('works', function () { - let result = highlightedText(['Test', 'e']); + const result = highlightedText(['Test', 'e']); expect(result).to.be.an('object'); expect(result.string).to.equal('Test'); }); it('escapes html', function () { - let result = highlightedText(['', 'oops']); + const result = highlightedText(['', 'oops']); expect(result).to.be.an('object'); expect(result.string).to.equal('<script>alert("oops")</script>'); }); diff --git a/apps/ember-admin/tests/unit/models/invite-test.js b/apps/ember-admin/tests/unit/models/invite-test.js index 1ffb5dd9f0a..60767549d8e 100644 --- a/apps/ember-admin/tests/unit/models/invite-test.js +++ b/apps/ember-admin/tests/unit/models/invite-test.js @@ -21,8 +21,8 @@ describe('Unit: Model: invite', function () { }); it('resend hits correct endpoints', async function () { - let store = this.owner.lookup('service:store'); - let model = store.createRecord('invite', { + const store = this.owner.lookup('service:store'); + const model = store.createRecord('invite', { id: 42 }); let role; @@ -47,9 +47,9 @@ describe('Unit: Model: invite', function () { server.handledRequests.length, 'number of requests' ).to.equal(2); - let [, lastRequest] = server.handledRequests; - let requestBody = JSON.parse(lastRequest.requestBody); - let [invite] = requestBody.invites; + const [, lastRequest] = server.handledRequests; + const requestBody = JSON.parse(lastRequest.requestBody); + const [invite] = requestBody.invites; expect( requestBody.invites.length, diff --git a/apps/ember-admin/tests/unit/models/member-test.js b/apps/ember-admin/tests/unit/models/member-test.js index 490ac9a5858..ae07706a29a 100644 --- a/apps/ember-admin/tests/unit/models/member-test.js +++ b/apps/ember-admin/tests/unit/models/member-test.js @@ -12,7 +12,7 @@ describe('Unit: Model: member', function () { }); it('has a validation type of "member"', function () { - let model = store.createRecord('member'); + const model = store.createRecord('member'); expect(model.get('validationType')).to.equal('member'); }); diff --git a/apps/ember-admin/tests/unit/models/navigation-item-test.js b/apps/ember-admin/tests/unit/models/navigation-item-test.js index e68c6799100..49a3a34f356 100644 --- a/apps/ember-admin/tests/unit/models/navigation-item-test.js +++ b/apps/ember-admin/tests/unit/models/navigation-item-test.js @@ -6,7 +6,7 @@ describe('Unit: Model: navigation-item', function () { setupTest(); it('isComplete is true when label and url are filled', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', 'test'); model.set('url', 'test'); @@ -15,7 +15,7 @@ describe('Unit: Model: navigation-item', function () { }); it('isComplete is true when icon and url are filled', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', ''); model.set('icon', 'https://example.com/icon.svg'); @@ -25,7 +25,7 @@ describe('Unit: Model: navigation-item', function () { }); it('isComplete is false when label and icon are blank', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', ''); model.set('icon', ''); @@ -35,7 +35,7 @@ describe('Unit: Model: navigation-item', function () { }); it('isComplete is false when url is blank', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', 'test'); model.set('url', ''); @@ -44,7 +44,7 @@ describe('Unit: Model: navigation-item', function () { }); it('isBlank is true when label, url, and icon are blank', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', ''); model.set('url', ''); @@ -54,7 +54,7 @@ describe('Unit: Model: navigation-item', function () { }); it('isBlank is false when label is present', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', 'test'); model.set('url', ''); @@ -63,7 +63,7 @@ describe('Unit: Model: navigation-item', function () { }); it('isBlank is false when url is present', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', ''); model.set('url', 'test'); @@ -72,7 +72,7 @@ describe('Unit: Model: navigation-item', function () { }); it('isBlank is false when icon is present', function () { - let model = this.owner.lookup('model:navigation-item'); + const model = this.owner.lookup('model:navigation-item'); model.set('label', ''); model.set('url', ''); diff --git a/apps/ember-admin/tests/unit/models/post-test.js b/apps/ember-admin/tests/unit/models/post-test.js index 50b9620342c..477632eeecc 100644 --- a/apps/ember-admin/tests/unit/models/post-test.js +++ b/apps/ember-admin/tests/unit/models/post-test.js @@ -13,13 +13,13 @@ describe('Unit: Model: post', function () { }); it('has a validation type of "post"', function () { - let model = store.createRecord('post'); + const model = store.createRecord('post'); expect(model.validationType).to.equal('post'); }); it('isPublished, isDraft and isScheduled are correct', function () { - let model = store.createRecord('post', { + const model = store.createRecord('post', { status: 'published' }); @@ -45,10 +45,10 @@ describe('Unit: Model: post', function () { }); it('isAuthoredByUser is correct', function () { - let user1 = store.createRecord('user', {id: 'abcd1234'}); - let user2 = store.createRecord('user', {id: 'wxyz9876'}); + const user1 = store.createRecord('user', {id: 'abcd1234'}); + const user2 = store.createRecord('user', {id: 'wxyz9876'}); - let model = store.createRecord('post', { + const model = store.createRecord('post', { authors: [user1] }); @@ -62,13 +62,13 @@ describe('Unit: Model: post', function () { }); it('updateTags removes and deletes old tags', function () { - let model = store.createRecord('post'); + const model = store.createRecord('post'); run(this, function () { - let modelTags = model.get('tags'); - let tag1 = store.createRecord('tag', {id: '1'}); - let tag2 = store.createRecord('tag', {id: '2'}); - let tag3 = store.createRecord('tag'); + const modelTags = model.get('tags'); + const tag1 = store.createRecord('tag', {id: '1'}); + const tag2 = store.createRecord('tag', {id: '2'}); + const tag3 = store.createRecord('tag'); // During testing a record created without an explicit id will get // an id of 'fixture-n' instead of null diff --git a/apps/ember-admin/tests/unit/models/role-test.js b/apps/ember-admin/tests/unit/models/role-test.js index 0fca413a911..298a6dde6c7 100644 --- a/apps/ember-admin/tests/unit/models/role-test.js +++ b/apps/ember-admin/tests/unit/models/role-test.js @@ -7,7 +7,7 @@ describe('Unit: Model: role', function () { setupTest(); it('provides a lowercase version of the name', function () { - let model = this.owner.lookup('service:store').createRecord('role', { + const model = this.owner.lookup('service:store').createRecord('role', { name: 'Author' }); diff --git a/apps/ember-admin/tests/unit/models/setting-test.js b/apps/ember-admin/tests/unit/models/setting-test.js index 54bcfcc3f16..1d5732c22d1 100644 --- a/apps/ember-admin/tests/unit/models/setting-test.js +++ b/apps/ember-admin/tests/unit/models/setting-test.js @@ -6,7 +6,7 @@ describe('Unit: Model: setting', function () { setupTest(); it('has a validation type of "setting"', function () { - let model = this.owner.lookup('service:store').createRecord('setting'); + const model = this.owner.lookup('service:store').createRecord('setting'); expect(model.get('validationType')).to.equal('setting'); }); diff --git a/apps/ember-admin/tests/unit/models/tag-test.js b/apps/ember-admin/tests/unit/models/tag-test.js index d33ad23e9b0..a22ca8a7929 100644 --- a/apps/ember-admin/tests/unit/models/tag-test.js +++ b/apps/ember-admin/tests/unit/models/tag-test.js @@ -6,7 +6,7 @@ describe('Unit: Model: tag', function () { setupTest(); it('has a validation type of "tag"', function () { - let model = this.owner.lookup('service:store').createRecord('tag'); + const model = this.owner.lookup('service:store').createRecord('tag'); expect(model.get('validationType')).to.equal('tag'); }); diff --git a/apps/ember-admin/tests/unit/models/user-test.js b/apps/ember-admin/tests/unit/models/user-test.js index 05516b4b297..3add92cb773 100644 --- a/apps/ember-admin/tests/unit/models/user-test.js +++ b/apps/ember-admin/tests/unit/models/user-test.js @@ -13,13 +13,13 @@ describe('Unit: Model: user', function () { }); it('has a validation type of "user"', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); expect(model.get('validationType')).to.equal('user'); }); it('isActive/isSuspended properties are correct', function () { - let model = store.createRecord('user', { + const model = store.createRecord('user', { status: 'active' }); @@ -42,26 +42,26 @@ describe('Unit: Model: user', function () { }); it('role property is correct', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Author'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Author'}}}); model.get('roles').pushObject(role); }); expect(model.get('role.name')).to.equal('Author'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Editor'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Editor'}}}); model.set('role', role); }); expect(model.get('role.name')).to.equal('Editor'); }); it('Contributor properties are correct', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Contributor'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Contributor'}}}); model.set('role', role); }); expect(model.get('isContributor')).to.be.ok; @@ -77,10 +77,10 @@ describe('Unit: Model: user', function () { }); it('Author properties are correct', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Author'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Author'}}}); model.set('role', role); }); expect(model.get('isAuthor')).to.be.ok; @@ -96,10 +96,10 @@ describe('Unit: Model: user', function () { }); it('Editor properties are correct', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Editor'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Editor'}}}); model.set('role', role); }); expect(model.get('isEditor')).to.be.ok; @@ -115,10 +115,10 @@ describe('Unit: Model: user', function () { }); it('Owner properties are correct', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Owner'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Owner'}}}); model.set('role', role); }); expect(model.get('isOwnerOnly')).to.be.ok; @@ -134,10 +134,10 @@ describe('Unit: Model: user', function () { }); it('Admin properties are correct', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Administrator'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Administrator'}}}); model.set('role', role); }); expect(model.get('isAdminOnly')).to.be.ok; @@ -153,10 +153,10 @@ describe('Unit: Model: user', function () { }); it('isSuperEditor properties are correct', function () { - let model = store.createRecord('user'); + const model = store.createRecord('user'); run(() => { - let role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Super Editor'}}}); + const role = store.push({data: {id: 1, type: 'role', attributes: {name: 'Super Editor'}}}); model.set('role', role); }); expect(model.get('isSuperEditor')).to.be.ok; diff --git a/apps/ember-admin/tests/unit/serializers/member-test.js b/apps/ember-admin/tests/unit/serializers/member-test.js index 11cca8f0eaf..bf7bbb4a3c1 100644 --- a/apps/ember-admin/tests/unit/serializers/member-test.js +++ b/apps/ember-admin/tests/unit/serializers/member-test.js @@ -14,59 +14,59 @@ describe('Unit: Serializer: member', function () { }); it('does not include stripe in serialized payload', function () { - let member = store.createRecord('member', { + const member = store.createRecord('member', { email: 'test@example.com' }); - let serialized = serializer.serialize(member._createSnapshot()); + const serialized = serializer.serialize(member._createSnapshot()); expect(serialized.stripe).to.be.undefined; }); it('does not include geolocation in serialized payload', function () { - let member = store.createRecord('member', { + const member = store.createRecord('member', { email: 'test@example.com', geolocation: '{"country": "US"}' }); - let serialized = serializer.serialize(member._createSnapshot()); + const serialized = serializer.serialize(member._createSnapshot()); expect(serialized.geolocation).to.be.undefined; }); it('does not include status in serialized payload', function () { - let member = store.createRecord('member', { + const member = store.createRecord('member', { email: 'test@example.com', status: 'paid' }); - let serialized = serializer.serialize(member._createSnapshot()); + const serialized = serializer.serialize(member._createSnapshot()); expect(serialized.status).to.be.undefined; }); it('does not include last_seen_at in serialized payload', function () { - let member = store.createRecord('member', { + const member = store.createRecord('member', { email: 'test@example.com' }); - let serialized = serializer.serialize(member._createSnapshot()); + const serialized = serializer.serialize(member._createSnapshot()); expect(serialized.last_seen_at).to.be.undefined; }); it('does not include comped in serialized payload', function () { - let member = store.createRecord('member', { + const member = store.createRecord('member', { email: 'test@example.com', comped: true }); - let serialized = serializer.serialize(member._createSnapshot()); + const serialized = serializer.serialize(member._createSnapshot()); expect(serialized.comped).to.be.undefined; }); it('does not include tiers in serialized payload', function () { - let member = store.createRecord('member', { + const member = store.createRecord('member', { email: 'test@example.com', tiers: [{id: 'tier-1', name: 'Premium'}] }); - let serialized = serializer.serialize(member._createSnapshot()); + const serialized = serializer.serialize(member._createSnapshot()); expect(serialized.tiers).to.be.undefined; }); diff --git a/apps/ember-admin/tests/unit/serializers/notification-test.js b/apps/ember-admin/tests/unit/serializers/notification-test.js index 47ebd3c56b5..143f9c2d145 100644 --- a/apps/ember-admin/tests/unit/serializers/notification-test.js +++ b/apps/ember-admin/tests/unit/serializers/notification-test.js @@ -19,7 +19,7 @@ describe('Unit: Serializer: notification', function () { it('converts location->key when deserializing', function () { server.get(`${ghostPaths().apiRoot}/notifications`, function () { - let response = { + const response = { notifications: [{ id: 1, dismissible: false, @@ -33,7 +33,7 @@ describe('Unit: Serializer: notification', function () { return [200, {'Content-Type': 'application/json'}, JSON.stringify(response)]; }); - let store = this.owner.lookup('service:store'); + const store = this.owner.lookup('service:store'); return store.findAll('notification').then((notifications) => { expect(notifications.get('length')).to.equal(1); diff --git a/apps/ember-admin/tests/unit/services/local-revisions-test.js b/apps/ember-admin/tests/unit/services/local-revisions-test.js index d5566175363..6bc70f17794 100644 --- a/apps/ember-admin/tests/unit/services/local-revisions-test.js +++ b/apps/ember-admin/tests/unit/services/local-revisions-test.js @@ -385,10 +385,10 @@ describe('Unit: Service: local-revisions', function () { describe('restore', function () { it('creates a new post based on the revision data', async function () { // stub out the store service - let saveStub = sinon.stub().resolves({id: 'test-id'}); - let setStub = sinon.stub(); - let getStub = sinon.stub().returns('post'); - let queryRecordStub = sinon.stub().resolves({id: '1'}); + const saveStub = sinon.stub().resolves({id: 'test-id'}); + const setStub = sinon.stub(); + const getStub = sinon.stub().returns('post'); + const queryRecordStub = sinon.stub().resolves({id: '1'}); this.owner.register('service:store', Service.extend({ createRecord: () => { return { diff --git a/apps/ember-admin/tests/unit/services/migrate-test.js b/apps/ember-admin/tests/unit/services/migrate-test.js index 64ec100de58..8e48470f6dc 100644 --- a/apps/ember-admin/tests/unit/services/migrate-test.js +++ b/apps/ember-admin/tests/unit/services/migrate-test.js @@ -40,7 +40,7 @@ describe('Unit: Service: migrate', function () { csvContentImporter: false })); - let payload = await migrateService.postMessagePayload(); + const payload = await migrateService.postMessagePayload(); expect(payload).to.be.an('object').that.has.all.keys('apiUrl', 'apiKey', 'stripe', 'csvContentImporter', 'ghostVersion', 'ownerEmail'); expect(isValidUrl(payload.apiUrl)).to.be.true; @@ -67,7 +67,7 @@ describe('Unit: Service: migrate', function () { csvContentImporter: true })); - let payload = await migrateService.postMessagePayload(); + const payload = await migrateService.postMessagePayload(); expect(payload.csvContentImporter).to.be.true; }); diff --git a/apps/ember-admin/tests/unit/services/notifications-test.js b/apps/ember-admin/tests/unit/services/notifications-test.js index 3d5013fb492..c13f55a45f0 100644 --- a/apps/ember-admin/tests/unit/services/notifications-test.js +++ b/apps/ember-admin/tests/unit/services/notifications-test.js @@ -24,7 +24,7 @@ describe('Unit: Service: notifications', function () { }); it('filters alerts/notifications', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); // wrapped in run-loop to enure alerts/notifications CPs are updated run(() => { @@ -40,7 +40,7 @@ describe('Unit: Service: notifications', function () { }); it('#handleNotification deals with DS.Notification notifications', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); let notification = NotificationStub.create({message: '

                              Test

                              ', status: 'alert'}); notifications.handleNotification(notification); @@ -52,7 +52,7 @@ describe('Unit: Service: notifications', function () { }); it('#handleNotification defaults to notification if no status supplied', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.handleNotification({message: 'Test'}, false); @@ -61,7 +61,7 @@ describe('Unit: Service: notifications', function () { }); it('#handleNotification shows generic error message when a word matches built-in error type', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.handleNotification({message: 'TypeError test'}); expect(notifications.content[0].message).to.equal(GENERIC_ERROR_MESSAGE); @@ -78,7 +78,7 @@ describe('Unit: Service: notifications', function () { }); it('#showAlert adds POJO alerts', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showAlert('Test Alert', {type: 'error'}); @@ -89,7 +89,7 @@ describe('Unit: Service: notifications', function () { }); it('#showAlert adds delayed notifications', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showNotification('Test Alert', {type: 'error', delayed: true}); @@ -103,7 +103,7 @@ describe('Unit: Service: notifications', function () { // we split on the second period and treat the resulting base as // the key for duplicate checking it('#showAlert clears duplicates using keys', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showAlert('Kept'); @@ -121,7 +121,7 @@ describe('Unit: Service: notifications', function () { }); it('#showAlert clears duplicates using message text', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.showAlert('Not duplicate'); notifications.showAlert('Duplicate', {key: 'duplicate'}); @@ -132,7 +132,7 @@ describe('Unit: Service: notifications', function () { }); it('#showNotification adds POJO notifications', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showNotification('Test Notification', {type: 'success'}); @@ -143,7 +143,7 @@ describe('Unit: Service: notifications', function () { }); it('#showNotification adds delayed notifications', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showNotification('Test Notification', {delayed: true}); @@ -154,14 +154,14 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError handles single json response error', function () { - let notifications = this.owner.lookup('service:notifications'); - let error = new AjaxError({errors: [{message: 'Single error'}]}); + const notifications = this.owner.lookup('service:notifications'); + const error = new AjaxError({errors: [{message: 'Single error'}]}); run(() => { notifications.showAPIError(error); }); - let [alert] = notifications.alerts; + const [alert] = notifications.alerts; expect(alert.message).to.equal('Single error'); expect(alert.status).to.equal('alert'); expect(alert.type).to.equal('error'); @@ -169,8 +169,8 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError handles multiple json response errors', function () { - let notifications = this.owner.lookup('service:notifications'); - let error = new AjaxError({errors: [ + const notifications = this.owner.lookup('service:notifications'); + const error = new AjaxError({errors: [ {title: 'First error', message: 'First error message'}, {title: 'Second error', message: 'Second error message'} ]}); @@ -180,14 +180,14 @@ describe('Unit: Service: notifications', function () { }); expect(notifications.alerts.length).to.equal(2); - let [alert1, alert2] = notifications.alerts; + const [alert1, alert2] = notifications.alerts; expect(alert1).to.deep.equal({message: 'First error message', status: 'alert', type: 'error', key: 'api-error.first-error', actions: undefined, description: undefined, icon: undefined}); expect(alert2).to.deep.equal({message: 'Second error message', status: 'alert', type: 'error', key: 'api-error.second-error', actions: undefined, description: undefined, icon: undefined}); }); it('#showAPIError displays default error text if response has no error/message', function () { - let notifications = this.owner.lookup('service:notifications'); - let resp = false; + const notifications = this.owner.lookup('service:notifications'); + const resp = false; run(() => { notifications.showAPIError(resp); @@ -207,7 +207,7 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError sets correct key when passed a base key', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showAPIError('Test', {key: 'test.alert'}); @@ -217,7 +217,7 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError sets correct key when not passed a key', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showAPIError('Test'); @@ -227,14 +227,14 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError parses default ember-ajax errors correctly', function () { - let notifications = this.owner.lookup('service:notifications'); - let error = new InvalidError(); + const notifications = this.owner.lookup('service:notifications'); + const error = new InvalidError(); run(() => { notifications.showAPIError(error); }); - let notification = notifications.alerts.firstObject; + const notification = notifications.alerts.firstObject; expect(notification.message).to.equal('Request was rejected because it was invalid'); expect(notification.status).to.equal('alert'); expect(notification.type).to.equal('error'); @@ -242,14 +242,14 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError parses custom ember-ajax errors correctly', function () { - let notifications = this.owner.lookup('service:notifications'); - let error = new ServerUnreachableError(); + const notifications = this.owner.lookup('service:notifications'); + const error = new ServerUnreachableError(); run(() => { notifications.showAPIError(error); }); - let notification = notifications.alerts.firstObject; + const notification = notifications.alerts.firstObject; expect(notification.message).to.equal('Server was unreachable'); expect(notification.status).to.equal('alert'); expect(notification.type).to.equal('error'); @@ -257,8 +257,8 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError adds error context to message if available', function () { - let notifications = this.owner.lookup('service:notifications'); - let error = new AjaxError({errors: [{ + const notifications = this.owner.lookup('service:notifications'); + const error = new AjaxError({errors: [{ message: 'Authorization Error.', context: 'Please sign in.' }]}); @@ -267,7 +267,7 @@ describe('Unit: Service: notifications', function () { notifications.showAPIError(error); }); - let [alert] = notifications.alerts; + const [alert] = notifications.alerts; expect(alert.message).to.equal('Authorization Error. Please sign in.'); expect(alert.status).to.equal('alert'); expect(alert.type).to.equal('error'); @@ -275,8 +275,8 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError does not add context to message if it duplicates the message', function () { - let notifications = this.owner.lookup('service:notifications'); - let error = new AjaxError({errors: [{ + const notifications = this.owner.lookup('service:notifications'); + const error = new AjaxError({errors: [{ message: 'Authorization Error.', context: 'Authorization Error.' }]}); @@ -285,7 +285,7 @@ describe('Unit: Service: notifications', function () { notifications.showAPIError(error); }); - let [alert] = notifications.alerts; + const [alert] = notifications.alerts; expect(alert.message).to.equal('Authorization Error.'); expect(alert.status).to.equal('alert'); expect(alert.type).to.equal('error'); @@ -293,7 +293,7 @@ describe('Unit: Service: notifications', function () { }); it('#showAPIError shows generic error for built-in error types', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); const error = new TypeError('Testing'); notifications.showAPIError(error); @@ -302,7 +302,7 @@ describe('Unit: Service: notifications', function () { }); it('#displayDelayed moves delayed notifications into content', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showNotification('First', {delayed: true}); @@ -319,8 +319,8 @@ describe('Unit: Service: notifications', function () { }); it('#closeNotification removes POJO notifications', function () { - let notification = {message: 'Close test', status: 'notification'}; - let notifications = this.owner.lookup('service:notifications'); + const notification = {message: 'Close test', status: 'notification'}; + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.handleNotification(notification); @@ -338,8 +338,8 @@ describe('Unit: Service: notifications', function () { }); it('#closeNotification removes and deletes DS.Notification records', function () { - let notifications = this.owner.lookup('service:notifications'); - let notification = NotificationStub.create({message: 'Close test', status: 'alert'}); + const notifications = this.owner.lookup('service:notifications'); + const notification = NotificationStub.create({message: 'Close test', status: 'alert'}); notification.deleteRecord = function () {}; sinon.spy(notification, 'deleteRecord'); @@ -369,7 +369,7 @@ describe('Unit: Service: notifications', function () { }); it('#closeNotifications only removes notifications', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showAlert('First alert'); @@ -389,7 +389,7 @@ describe('Unit: Service: notifications', function () { }); it('#closeNotifications only closes notifications with specified key', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); run(() => { notifications.showAlert('First alert'); @@ -409,8 +409,8 @@ describe('Unit: Service: notifications', function () { }); it('#clearAll removes everything without deletion', function () { - let notifications = this.owner.lookup('service:notifications'); - let notificationModel = EmberObject.create({message: 'model'}); + const notifications = this.owner.lookup('service:notifications'); + const notificationModel = EmberObject.create({message: 'model'}); notificationModel.deleteRecord = function () {}; sinon.spy(notificationModel, 'deleteRecord'); @@ -434,7 +434,7 @@ describe('Unit: Service: notifications', function () { }); it('#closeAlerts only removes alerts', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.showNotification('First notification'); notifications.showAlert('First alert'); @@ -449,7 +449,7 @@ describe('Unit: Service: notifications', function () { }); it('#closeAlerts closes only alerts with specified key', function () { - let notifications = this.owner.lookup('service:notifications'); + const notifications = this.owner.lookup('service:notifications'); notifications.showNotification('First notification'); notifications.showAlert('First alert', {key: 'test.close'}); diff --git a/apps/ember-admin/tests/unit/services/unsplash-test.js b/apps/ember-admin/tests/unit/services/unsplash-test.js index a5644435be2..5cea3f86238 100644 --- a/apps/ember-admin/tests/unit/services/unsplash-test.js +++ b/apps/ember-admin/tests/unit/services/unsplash-test.js @@ -39,7 +39,7 @@ describe('Unit: Service: unsplash', function () { }, JSON.stringify({results: [{id: 'cat-photo', width: 100, height: 100}]})]; }); - let service = this.owner.lookup('service:unsplash'); + const service = this.owner.lookup('service:unsplash'); await settled(); // response for "cat" arrives after the term has changed to "dog" @@ -61,7 +61,7 @@ describe('Unit: Service: unsplash', function () { }, JSON.stringify({results: [{id: 'cat-photo', width: 100, height: 100}]})]; }); - let service = this.owner.lookup('service:unsplash'); + const service = this.owner.lookup('service:unsplash'); await settled(); service.set('searchTerm', 'cat'); @@ -83,7 +83,7 @@ describe('Unit: Service: unsplash', function () { return [403, {'x-ratelimit-remaining': '0'}, 'Rate Limit Exceeded']; }); - let service = this.owner.lookup('service:unsplash'); + const service = this.owner.lookup('service:unsplash'); run(() => { service.loadNextPage(); @@ -100,7 +100,7 @@ describe('Unit: Service: unsplash', function () { })]; }); - let service = this.owner.lookup('service:unsplash'); + const service = this.owner.lookup('service:unsplash'); run(() => { service.loadNextPage(); @@ -115,7 +115,7 @@ describe('Unit: Service: unsplash', function () { return [500, {'Content-Type': 'text/xml'}, 'Unsplash text error']; }); - let service = this.owner.lookup('service:unsplash'); + const service = this.owner.lookup('service:unsplash'); run(() => { service.loadNextPage(); diff --git a/apps/ember-admin/tests/unit/transforms/facebook-url-user-test.js b/apps/ember-admin/tests/unit/transforms/facebook-url-user-test.js index 07fa4f5b499..bdeb4366685 100644 --- a/apps/ember-admin/tests/unit/transforms/facebook-url-user-test.js +++ b/apps/ember-admin/tests/unit/transforms/facebook-url-user-test.js @@ -6,17 +6,17 @@ describe('Unit: Transform: facebook-url-user', function () { setupTest(); it('deserializes facebook url', function () { - let transform = this.owner.lookup('transform:facebook-url-user'); - let serialized = 'testuser'; - let result = transform.deserialize(serialized); + const transform = this.owner.lookup('transform:facebook-url-user'); + const serialized = 'testuser'; + const result = transform.deserialize(serialized); expect(result).to.equal('https://www.facebook.com/testuser'); }); it('serializes url to facebook username', function () { - let transform = this.owner.lookup('transform:facebook-url-user'); - let deserialized = 'https://www.facebook.com/testuser'; - let result = transform.serialize(deserialized); + const transform = this.owner.lookup('transform:facebook-url-user'); + const deserialized = 'https://www.facebook.com/testuser'; + const result = transform.serialize(deserialized); expect(result).to.equal('testuser'); }); diff --git a/apps/ember-admin/tests/unit/transforms/json-string-test.js b/apps/ember-admin/tests/unit/transforms/json-string-test.js index ddcff467202..486b2e2275b 100644 --- a/apps/ember-admin/tests/unit/transforms/json-string-test.js +++ b/apps/ember-admin/tests/unit/transforms/json-string-test.js @@ -6,19 +6,19 @@ describe('Unit: Transform: json-string', function () { setupTest(); it('serialises an Object to a JSON String', function () { - let transform = this.owner.lookup('transform:json-string'); - let obj = {one: 'one', two: 'two'}; + const transform = this.owner.lookup('transform:json-string'); + const obj = {one: 'one', two: 'two'}; expect(transform.serialize(obj)).to.equal(JSON.stringify(obj)); }); it('deserialises a JSON String to an Object', function () { - let transform = this.owner.lookup('transform:json-string'); - let obj = {one: 'one', two: 'two'}; + const transform = this.owner.lookup('transform:json-string'); + const obj = {one: 'one', two: 'two'}; expect(transform.deserialize(JSON.stringify(obj))).to.deep.equal(obj); }); it('handles deserializing a blank string', function () { - let transform = this.owner.lookup('transform:json-string'); + const transform = this.owner.lookup('transform:json-string'); expect(transform.deserialize('')).to.equal(null); }); }); diff --git a/apps/ember-admin/tests/unit/transforms/navigation-settings-test.js b/apps/ember-admin/tests/unit/transforms/navigation-settings-test.js index 2df57e4363d..ddf3dceefb1 100644 --- a/apps/ember-admin/tests/unit/transforms/navigation-settings-test.js +++ b/apps/ember-admin/tests/unit/transforms/navigation-settings-test.js @@ -8,9 +8,9 @@ describe('Unit: Transform: navigation-settings', function () { setupTest(); it('deserializes navigation json', function () { - let transform = this.owner.lookup('transform:navigation-settings'); - let serialized = '[{"label":"One","url":"/one","icon":"https://example.com/one.svg","visibility":"members"},{"label":"Two","url":"/two"},{"label":"Three","url":"/three","visibility":"public_free"},{"label":"Four","url":"/four","visibility":"none"}]'; - let result = transform.deserialize(serialized); + const transform = this.owner.lookup('transform:navigation-settings'); + const serialized = '[{"label":"One","url":"/one","icon":"https://example.com/one.svg","visibility":"members"},{"label":"Two","url":"/two"},{"label":"Three","url":"/three","visibility":"public_free"},{"label":"Four","url":"/four","visibility":"none"}]'; + const result = transform.deserialize(serialized); expect(result.length).to.equal(4); expect(result[0]).to.be.instanceof(NavigationItem); @@ -33,14 +33,14 @@ describe('Unit: Transform: navigation-settings', function () { }); it('serializes array of NavigationItems', function () { - let transform = this.owner.lookup('transform:navigation-settings'); - let deserialized = emberA([ + const transform = this.owner.lookup('transform:navigation-settings'); + const deserialized = emberA([ NavigationItem.create({label: 'One', url: '/one', icon: 'https://example.com/one.svg', visibility: 'members'}), NavigationItem.create({label: 'Two', url: '/two', visibility: 'public'}), NavigationItem.create({label: 'Three', url: '/three', visibility: 'public_free'}), NavigationItem.create({label: 'Four', url: '/four', visibility: 'none'}) ]); - let result = transform.serialize(deserialized); + const result = transform.serialize(deserialized); expect(result).to.equal('[{"label":"One","url":"/one","icon":"https://example.com/one.svg","visibility":"members"},{"label":"Two","url":"/two"},{"label":"Three","url":"/three","visibility":"public_free"},{"label":"Four","url":"/four","visibility":"none"}]'); }); diff --git a/apps/ember-admin/tests/unit/transforms/twitter-url-user-test.js b/apps/ember-admin/tests/unit/transforms/twitter-url-user-test.js index 09613557039..45944a41d76 100644 --- a/apps/ember-admin/tests/unit/transforms/twitter-url-user-test.js +++ b/apps/ember-admin/tests/unit/transforms/twitter-url-user-test.js @@ -6,17 +6,17 @@ describe('Unit: Transform: twitter-url-user', function () { setupTest(); it('deserializes twitter url', function () { - let transform = this.owner.lookup('transform:twitter-url-user'); - let serialized = '@testuser'; - let result = transform.deserialize(serialized); + const transform = this.owner.lookup('transform:twitter-url-user'); + const serialized = '@testuser'; + const result = transform.deserialize(serialized); expect(result).to.equal('https://twitter.com/testuser'); }); it('serializes url to twitter username', function () { - let transform = this.owner.lookup('transform:twitter-url-user'); - let deserialized = 'https://twitter.com/testuser'; - let result = transform.serialize(deserialized); + const transform = this.owner.lookup('transform:twitter-url-user'); + const deserialized = 'https://twitter.com/testuser'; + const result = transform.serialize(deserialized); expect(result).to.equal('@testuser'); }); diff --git a/apps/ember-admin/tests/unit/utils/ghost-paths-test.js b/apps/ember-admin/tests/unit/utils/ghost-paths-test.js index 0731b2fa77b..7cedf5e64e6 100644 --- a/apps/ember-admin/tests/unit/utils/ghost-paths-test.js +++ b/apps/ember-admin/tests/unit/utils/ghost-paths-test.js @@ -4,7 +4,7 @@ import {expect} from 'chai'; describe('Unit: Util: ghost-paths', function () { describe('join', function () { - let {join} = ghostPaths().url; + const {join} = ghostPaths().url; it('should join two or more paths, normalizing slashes', function () { let path; diff --git a/apps/ember-admin/tests/unit/validators/nav-item-test.js b/apps/ember-admin/tests/unit/validators/nav-item-test.js index e3022357bf2..dd72b009358 100644 --- a/apps/ember-admin/tests/unit/validators/nav-item-test.js +++ b/apps/ember-admin/tests/unit/validators/nav-item-test.js @@ -7,7 +7,7 @@ import { import {expect} from 'chai'; const testInvalidUrl = function (url) { - let navItem = NavItem.create({url}); + const navItem = NavItem.create({url}); validator.check(navItem, 'url'); @@ -20,7 +20,7 @@ const testInvalidUrl = function (url) { }; const testValidUrl = function (url) { - let navItem = NavItem.create({url}); + const navItem = NavItem.create({url}); validator.check(navItem, 'url'); @@ -30,7 +30,7 @@ const testValidUrl = function (url) { describe('Unit: Validator: nav-item', function () { it('requires label or icon presence', function () { - let navItem = NavItem.create(); + const navItem = NavItem.create(); validator.check(navItem, 'label'); @@ -43,7 +43,7 @@ describe('Unit: Validator: nav-item', function () { }); it('allows blank label when icon is present', function () { - let navItem = NavItem.create({icon: 'https://example.com/icon.svg'}); + const navItem = NavItem.create({icon: 'https://example.com/icon.svg'}); validator.check(navItem, 'label'); @@ -53,7 +53,7 @@ describe('Unit: Validator: nav-item', function () { }); it('requires url presence', function () { - let navItem = NavItem.create(); + const navItem = NavItem.create(); validator.check(navItem, 'url'); @@ -66,7 +66,7 @@ describe('Unit: Validator: nav-item', function () { }); it('fails on invalid url values', function () { - let invalidUrls = [ + const invalidUrls = [ 'test@example.com', '/has spaces', 'no-leading-slash', @@ -79,7 +79,7 @@ describe('Unit: Validator: nav-item', function () { }); it('passes on valid url values', function () { - let validUrls = [ + const validUrls = [ 'http://localhost:2368', 'http://localhost:2368/some-path', 'https://localhost:2368/some-path', @@ -99,7 +99,7 @@ describe('Unit: Validator: nav-item', function () { }); it('validates url and label by default', function () { - let navItem = NavItem.create(); + const navItem = NavItem.create(); validator.check(navItem); @@ -109,7 +109,7 @@ describe('Unit: Validator: nav-item', function () { }); it('validates url and icon-only item by default', function () { - let navItem = NavItem.create({icon: 'https://example.com/icon.svg', url: '/icon-only/'}); + const navItem = NavItem.create({icon: 'https://example.com/icon.svg', url: '/icon-only/'}); validator.check(navItem); diff --git a/apps/ember-admin/tests/unit/validators/post-test.js b/apps/ember-admin/tests/unit/validators/post-test.js index 255dceb51cf..0407b0be106 100644 --- a/apps/ember-admin/tests/unit/validators/post-test.js +++ b/apps/ember-admin/tests/unit/validators/post-test.js @@ -15,49 +15,49 @@ const Post = EmberObject.extend(ValidationEngine, { describe('Unit: Validator: post', function () { describe('canonicalUrl', function () { it('can be blank', async function () { - let post = Post.create({canonicalUrl: ''}); - let passed = await post.validate({property: 'canonicalUrl'}).then(() => true); + const post = Post.create({canonicalUrl: ''}); + const passed = await post.validate({property: 'canonicalUrl'}).then(() => true); expect(passed, 'passed').to.be.true; expect(post.hasValidated).to.include('canonicalUrl'); }); it('can be an absolute URL', async function () { - let post = Post.create({canonicalUrl: 'http://example.com'}); - let passed = await post.validate({property: 'canonicalUrl'}).then(() => true); + const post = Post.create({canonicalUrl: 'http://example.com'}); + const passed = await post.validate({property: 'canonicalUrl'}).then(() => true); expect(passed, 'passed').to.be.true; expect(post.hasValidated).to.include('canonicalUrl'); }); it('can be a relative URL', async function () { - let post = Post.create({canonicalUrl: '/my-other-post'}); - let passed = await post.validate({property: 'canonicalUrl'}).then(() => true); + const post = Post.create({canonicalUrl: '/my-other-post'}); + const passed = await post.validate({property: 'canonicalUrl'}).then(() => true); expect(passed, 'passed').to.be.true; expect(post.hasValidated).to.include('canonicalUrl'); }); it('cannot be a random string', async function () { - let post = Post.create({canonicalUrl: 'asdfghjk'}); - let passed = await post.validate({property: 'canonicalUrl'}).then(() => true).catch(() => false); + const post = Post.create({canonicalUrl: 'asdfghjk'}); + const passed = await post.validate({property: 'canonicalUrl'}).then(() => true).catch(() => false); expect(passed, 'passed').to.be.false; expect(post.hasValidated).to.include('canonicalUrl'); - let error = post.errors.errorsFor('canonicalUrl').get(0); + const error = post.errors.errorsFor('canonicalUrl').get(0); expect(error.attribute).to.equal('canonicalUrl'); expect(error.message).to.equal('Please enter a valid URL'); }); it('cannot be too long', async function () { - let post = Post.create({canonicalUrl: `http://example.com/${(new Array(1983).join('x'))}`}); - let passed = await post.validate({property: 'canonicalUrl'}).then(() => true).catch(() => false); + const post = Post.create({canonicalUrl: `http://example.com/${(new Array(1983).join('x'))}`}); + const passed = await post.validate({property: 'canonicalUrl'}).then(() => true).catch(() => false); expect(passed, 'passed').to.be.false; expect(post.hasValidated).to.include('canonicalUrl'); - let error = post.errors.errorsFor('canonicalUrl').get(0); + const error = post.errors.errorsFor('canonicalUrl').get(0); expect(error.attribute).to.equal('canonicalUrl'); expect(error.message).to.equal('Canonical URL is too long, max 2000 chars'); }); diff --git a/apps/ember-admin/tests/unit/validators/tag-settings-test.js b/apps/ember-admin/tests/unit/validators/tag-settings-test.js index af0ad29110c..ea76280d411 100644 --- a/apps/ember-admin/tests/unit/validators/tag-settings-test.js +++ b/apps/ember-admin/tests/unit/validators/tag-settings-test.js @@ -25,8 +25,8 @@ const Tag = EmberObject.extend(ValidationEngine, { describe('Unit: Validator: tag-settings', function () { it('validates all fields by default', function () { - let tag = Tag.create({}); - let properties = tag.get('validators.tag.properties'); + const tag = Tag.create({}); + const properties = tag.get('validators.tag.properties'); // TODO: This is checking implementation details rather than expected // behaviour. Replace once we have consistent behaviour (see below) @@ -52,7 +52,7 @@ describe('Unit: Validator: tag-settings', function () { it('passes with valid name', function () { // longest valid name - let tag = Tag.create({name: (new Array(192).join('x'))}); + const tag = Tag.create({name: (new Array(192).join('x'))}); let passed = false; expect(tag.get('name').length, 'name length').to.equal(191); @@ -68,9 +68,8 @@ describe('Unit: Validator: tag-settings', function () { }); it('validates name presence', function () { - let tag = Tag.create(); + const tag = Tag.create(); let passed = false; - let nameErrors; // TODO: validator is currently a singleton meaning state leaks // between all objects that use it. Each object should either @@ -86,7 +85,7 @@ describe('Unit: Validator: tag-settings', function () { }); }); - nameErrors = tag.get('errors').errorsFor('name').get(0); + const nameErrors = tag.get('errors').errorsFor('name').get(0); expect(nameErrors.attribute, 'errors.name.attribute').to.equal('name'); expect(nameErrors.message, 'errors.name.message').to.equal('You must specify a name for the tag.'); @@ -95,9 +94,8 @@ describe('Unit: Validator: tag-settings', function () { }); it('validates names starting with a comma', function () { - let tag = Tag.create({name: ',test'}); + const tag = Tag.create({name: ',test'}); let passed = false; - let nameErrors; run(() => { tag.validate({property: 'name'}).then(() => { @@ -105,7 +103,7 @@ describe('Unit: Validator: tag-settings', function () { }); }); - nameErrors = tag.get('errors').errorsFor('name').get(0); + const nameErrors = tag.get('errors').errorsFor('name').get(0); expect(nameErrors.attribute, 'errors.name.attribute').to.equal('name'); expect(nameErrors.message, 'errors.name.message').to.equal('Tag names can\'t start with commas.'); @@ -115,9 +113,8 @@ describe('Unit: Validator: tag-settings', function () { it('validates name length', function () { // shortest invalid name - let tag = Tag.create({name: (new Array(193).join('x'))}); + const tag = Tag.create({name: (new Array(193).join('x'))}); let passed = false; - let nameErrors; expect(tag.get('name').length, 'name length').to.equal(192); @@ -127,7 +124,7 @@ describe('Unit: Validator: tag-settings', function () { }); }); - nameErrors = tag.get('errors').errorsFor('name')[0]; + const nameErrors = tag.get('errors').errorsFor('name')[0]; expect(nameErrors.attribute, 'errors.name.attribute').to.equal('name'); expect(nameErrors.message, 'errors.name.message').to.equal('Tag names cannot be longer than 191 characters.'); @@ -137,7 +134,7 @@ describe('Unit: Validator: tag-settings', function () { it('passes with valid slug', function () { // longest valid slug - let tag = Tag.create({slug: (new Array(192).join('x'))}); + const tag = Tag.create({slug: (new Array(192).join('x'))}); let passed = false; expect(tag.get('slug').length, 'slug length').to.equal(191); @@ -154,9 +151,8 @@ describe('Unit: Validator: tag-settings', function () { it('validates slug length', function () { // shortest invalid slug - let tag = Tag.create({slug: (new Array(193).join('x'))}); + const tag = Tag.create({slug: (new Array(193).join('x'))}); let passed = false; - let slugErrors; expect(tag.get('slug').length, 'slug length').to.equal(192); @@ -166,7 +162,7 @@ describe('Unit: Validator: tag-settings', function () { }); }); - slugErrors = tag.get('errors').errorsFor('slug')[0]; + const slugErrors = tag.get('errors').errorsFor('slug')[0]; expect(slugErrors.attribute, 'errors.slug.attribute').to.equal('slug'); expect(slugErrors.message, 'errors.slug.message').to.equal('URL cannot be longer than 191 characters.'); @@ -176,7 +172,7 @@ describe('Unit: Validator: tag-settings', function () { it('passes with a valid description', function () { // longest valid description - let tag = Tag.create({description: (new Array(501).join('x'))}); + const tag = Tag.create({description: (new Array(501).join('x'))}); let passed = false; expect(tag.get('description').length, 'description length').to.equal(500); @@ -193,9 +189,8 @@ describe('Unit: Validator: tag-settings', function () { it('validates description length', function () { // shortest invalid description - let tag = Tag.create({description: (new Array(502).join('x'))}); + const tag = Tag.create({description: (new Array(502).join('x'))}); let passed = false; - let errors; expect(tag.get('description').length, 'description length').to.equal(501); @@ -205,7 +200,7 @@ describe('Unit: Validator: tag-settings', function () { }); }); - errors = tag.get('errors').errorsFor('description')[0]; + const errors = tag.get('errors').errorsFor('description')[0]; expect(errors.attribute, 'errors.description.attribute').to.equal('description'); expect(errors.message, 'errors.description.message').to.equal('Description cannot be longer than 500 characters.'); @@ -223,7 +218,7 @@ describe('Unit: Validator: tag-settings', function () { // model/validator respectively - this should be standardised it('passes with a valid metaTitle', function () { // longest valid metaTitle - let tag = Tag.create({metaTitle: (new Array(301).join('x'))}); + const tag = Tag.create({metaTitle: (new Array(301).join('x'))}); let passed = false; expect(tag.get('metaTitle').length, 'metaTitle length').to.equal(300); @@ -240,9 +235,8 @@ describe('Unit: Validator: tag-settings', function () { it('validates metaTitle length', function () { // shortest invalid metaTitle - let tag = Tag.create({metaTitle: (new Array(302).join('x'))}); + const tag = Tag.create({metaTitle: (new Array(302).join('x'))}); let passed = false; - let errors; expect(tag.get('metaTitle').length, 'metaTitle length').to.equal(301); @@ -252,7 +246,7 @@ describe('Unit: Validator: tag-settings', function () { }); }); - errors = tag.get('errors').errorsFor('metaTitle')[0]; + const errors = tag.get('errors').errorsFor('metaTitle')[0]; expect(errors.attribute, 'errors.metaTitle.attribute').to.equal('metaTitle'); expect(errors.message, 'errors.metaTitle.message').to.equal('Meta Title cannot be longer than 300 characters.'); @@ -264,7 +258,7 @@ describe('Unit: Validator: tag-settings', function () { // the model/validator respectively - this should be standardised it('passes with a valid metaDescription', function () { // longest valid description - let tag = Tag.create({metaDescription: (new Array(501).join('x'))}); + const tag = Tag.create({metaDescription: (new Array(501).join('x'))}); let passed = false; expect(tag.get('metaDescription').length, 'metaDescription length').to.equal(500); @@ -281,9 +275,8 @@ describe('Unit: Validator: tag-settings', function () { it('validates metaDescription length', function () { // shortest invalid metaDescription - let tag = Tag.create({metaDescription: (new Array(502).join('x'))}); + const tag = Tag.create({metaDescription: (new Array(502).join('x'))}); let passed = false; - let errors; expect(tag.get('metaDescription').length, 'metaDescription length').to.equal(501); @@ -293,7 +286,7 @@ describe('Unit: Validator: tag-settings', function () { }); }); - errors = tag.get('errors').errorsFor('metaDescription')[0]; + const errors = tag.get('errors').errorsFor('metaDescription')[0]; expect(errors.attribute, 'errors.metaDescription.attribute').to.equal('metaDescription'); expect(errors.message, 'errors.metaDescription.message').to.equal('Meta Description cannot be longer than 500 characters.'); diff --git a/apps/portal/src/app.jsx b/apps/portal/src/app.jsx index b28a67935e8..7a1379191e9 100644 --- a/apps/portal/src/app.jsx +++ b/apps/portal/src/app.jsx @@ -389,7 +389,7 @@ export default class App extends React.Component { : linkData; const { site: previewSiteData, ...restPreviewData } = this.fetchPreviewData(); const { site: notificationSiteData, ...restNotificationData } = this.fetchNotificationData(); - let page = ''; + const page = ''; return { member, offers, @@ -435,7 +435,7 @@ export default class App extends React.Component { const qsParams = new URLSearchParams(qs); const data = {}; // Handle the query params key/value pairs - for (let pair of qsParams.entries()) { + for (const pair of qsParams.entries()) { const key = pair[0]; const value = decodeURIComponent(pair[1]); if (key === 'name') { @@ -502,7 +502,7 @@ export default class App extends React.Component { let portalProducts = null; let monthlyPrice, yearlyPrice, currency; // Handle the query params key/value pairs - for (let pair of qsParams.entries()) { + for (const pair of qsParams.entries()) { const key = pair[0]; // Note: this needs to be cleaned up, there is no reason why we need to double encode/decode @@ -973,7 +973,7 @@ export default class App extends React.Component { fpScript.async = !0; fpScript.src = 'https://cdn.firstpromoter.com/fprom.js'; fpScript.onload = fpScript.onreadystatechange = function () { - let _t = this.readyState; + const _t = this.readyState; if (!_t || 'complete' === _t || 'loaded' === _t) { try { window.$FPROM.init(firstPromoterId, siteDomain); diff --git a/apps/portal/src/components/common/action-button.jsx b/apps/portal/src/components/common/action-button.jsx index bac0cd2798d..ce65c9bf431 100644 --- a/apps/portal/src/components/common/action-button.jsx +++ b/apps/portal/src/components/common/action-button.jsx @@ -76,7 +76,7 @@ export const ActionButtonStyles = ` `; const Styles = ({ brandColor, disabled, style = {}, isPrimary }) => { - let backgroundColor = brandColor || '#3eb0ef'; + const backgroundColor = brandColor || '#3eb0ef'; let opacity = '1.0'; let pointerEvents = 'auto'; @@ -109,7 +109,7 @@ function ActionButton({ tabIndex = undefined, dataTestId, }) { - let Style = Styles({ disabled, retry, brandColor, style, isPrimary }); + const Style = Styles({ disabled, retry, brandColor, style, isPrimary }); let className = 'gh-portal-btn'; if (isPrimary) { diff --git a/apps/portal/src/components/common/member-gravatar.jsx b/apps/portal/src/components/common/member-gravatar.jsx index 76c67e654a9..3f7c6c91fd9 100644 --- a/apps/portal/src/components/common/member-gravatar.jsx +++ b/apps/portal/src/components/common/member-gravatar.jsx @@ -43,7 +43,7 @@ const Styles = ({ style = {} }) => { }; function MemberGravatar({ gravatar, style }) { - let Style = Styles({ style }); + const Style = Styles({ style }); return (
                              diff --git a/apps/portal/src/components/common/newsletter-management.jsx b/apps/portal/src/components/common/newsletter-management.jsx index 6ad606ba370..964ee4f83e0 100644 --- a/apps/portal/src/components/common/newsletter-management.jsx +++ b/apps/portal/src/components/common/newsletter-management.jsx @@ -303,7 +303,7 @@ export default function NewsletterManagement({ hasNewslettersEnabled={hasNewslettersEnabled} subscribedNewsletters={subscribedNewsletters} setSubscribedNewsletters={(updatedNewsletters) => { - let newsletters = updatedNewsletters.map((d) => { + const newsletters = updatedNewsletters.map((d) => { return { id: d.id, }; diff --git a/apps/portal/src/components/common/products-section.jsx b/apps/portal/src/components/common/products-section.jsx index 8c619774ecf..e2462bf0a6f 100644 --- a/apps/portal/src/components/common/products-section.jsx +++ b/apps/portal/src/components/common/products-section.jsx @@ -576,7 +576,7 @@ function ProductBenefitsContainer({ product, hide = false }) { return null; } - let className = 'gh-portal-product-benefits'; + const className = 'gh-portal-product-benefits'; return (
                              @@ -1052,7 +1052,7 @@ function ProductsSection({ onPlanSelect, products, type = null, handleChooseSign className += ' gh-portal-upgrade-product'; } - let finalProduct = + const finalProduct = products.find((p) => p.id === selectedProduct)?.id || products.find((p) => p.type === 'paid')?.id; return ( diff --git a/apps/portal/src/components/pages/AccountHomePage/components/email-newsletter-action.jsx b/apps/portal/src/components/pages/AccountHomePage/components/email-newsletter-action.jsx index 498af538cf3..29037777ea9 100644 --- a/apps/portal/src/components/pages/AccountHomePage/components/email-newsletter-action.jsx +++ b/apps/portal/src/components/pages/AccountHomePage/components/email-newsletter-action.jsx @@ -6,10 +6,10 @@ import { t } from '../../../../utils/i18n'; function EmailNewsletterAction() { const { member, site, doAction } = useContext(AppContext); - let { newsletters } = member; + const { newsletters } = member; const subscribed = !!newsletters?.length; - let label = subscribed ? t('Subscribed') : t('Unsubscribed'); + const label = subscribed ? t('Subscribed') : t('Unsubscribed'); const onToggleSubscription = () => { const siteNewsletters = getSiteNewsletters({ site }); const subscribedNewsletters = !member?.newsletters?.length ? siteNewsletters : []; diff --git a/apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx b/apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx index 47c893e514b..1517bbbedff 100644 --- a/apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx +++ b/apps/portal/src/components/pages/AccountHomePage/components/paid-account-actions.jsx @@ -80,7 +80,7 @@ const PaidAccountActions = () => { ); } - let offerLabelStr = getOfferLabel({ nextPayment }); + const offerLabelStr = getOfferLabel({ nextPayment }); if (offerLabelStr) { oldPriceClassName = 'gh-portal-account-old-price'; diff --git a/apps/portal/src/components/pages/account-plan-page.jsx b/apps/portal/src/components/pages/account-plan-page.jsx index b02e7d371c9..0c30d56491c 100644 --- a/apps/portal/src/components/pages/account-plan-page.jsx +++ b/apps/portal/src/components/pages/account-plan-page.jsx @@ -657,7 +657,7 @@ export default class AccountPlanPage extends React.Component { const { member, site } = this.context; this.prices = getAvailablePrices({ site }); - let activePrice = getMemberActivePrice({ member }); + const activePrice = getMemberActivePrice({ member }); // Only filter by currency for real Stripe subscriptions. Synthetic // complimentary/gift subscriptions have an empty price_id and a diff --git a/apps/portal/src/components/pages/newsletter-selection-page.jsx b/apps/portal/src/components/pages/newsletter-selection-page.jsx index ce161106057..80525595d0c 100644 --- a/apps/portal/src/components/pages/newsletter-selection-page.jsx +++ b/apps/portal/src/components/pages/newsletter-selection-page.jsx @@ -135,7 +135,7 @@ export default function NewsletterSelectionPage({ pageData, onBack }) { retry={retry} disabled={disabled} onClick={() => { - let newsletters = subscribedNewsletters.map((d) => { + const newsletters = subscribedNewsletters.map((d) => { return { id: d.id, name: d.name, diff --git a/apps/portal/src/components/pages/signup-page.jsx b/apps/portal/src/components/pages/signup-page.jsx index ee0c4a1c4b3..2b6cd701673 100644 --- a/apps/portal/src/components/pages/signup-page.jsx +++ b/apps/portal/src/components/pages/signup-page.jsx @@ -949,7 +949,7 @@ class SignupPage extends React.Component { } render() { - let { sectionClass } = this.getClassNames(); + const { sectionClass } = this.getClassNames(); return ( <>
                              diff --git a/apps/portal/src/components/popup-modal.jsx b/apps/portal/src/components/popup-modal.jsx index f7ba6946e48..37a1c91842b 100644 --- a/apps/portal/src/components/popup-modal.jsx +++ b/apps/portal/src/components/popup-modal.jsx @@ -163,7 +163,7 @@ export class PopupContent extends React.Component { const pageStyle = { ...Styles.page[page], }; - let popupWidthStyle = ''; + const popupWidthStyle = ''; let popupSize = 'regular'; let cookieBannerText = ''; diff --git a/apps/portal/src/components/trigger-button.jsx b/apps/portal/src/components/trigger-button.jsx index 99b3ef07dd8..d0f6146d5ea 100644 --- a/apps/portal/src/components/trigger-button.jsx +++ b/apps/portal/src/components/trigger-button.jsx @@ -88,7 +88,7 @@ class TriggerButtonContent extends React.Component { componentDidUpdate() { if (this.container) { const height = this.container.current && this.container.current.offsetHeight; - let width = this.container.current && this.container.current.offsetWidth; + const width = this.container.current && this.container.current.offsetWidth; if (height !== this.height) { this.height = height; this.updateHeight(this.height); diff --git a/apps/portal/src/data-attributes.js b/apps/portal/src/data-attributes.js index 58dfb65d337..c3a014f4dc8 100644 --- a/apps/portal/src/data-attributes.js +++ b/apps/portal/src/data-attributes.js @@ -30,21 +30,21 @@ export async function formSubmitHandler({ errorEl.innerText = ''; } form.classList.remove('success', 'invalid', 'error'); - let emailInput = event.target.querySelector('input[data-members-email]'); - let nameInput = event.target.querySelector('input[data-members-name]'); - let autoRedirect = form?.dataset?.membersAutoredirect || 'true'; - let email = emailInput?.value; - let name = (nameInput?.value || '').trim() || undefined; + const emailInput = event.target.querySelector('input[data-members-email]'); + const nameInput = event.target.querySelector('input[data-members-name]'); + const autoRedirect = form?.dataset?.membersAutoredirect || 'true'; + const email = emailInput?.value; + const name = (nameInput?.value || '').trim() || undefined; let emailType = undefined; - let labels = []; - let newsletters = []; + const labels = []; + const newsletters = []; - let labelInputs = event.target.querySelectorAll('input[data-members-label]') || []; + const labelInputs = event.target.querySelectorAll('input[data-members-label]') || []; for (let i = 0; i < labelInputs.length; ++i) { labels.push(labelInputs[i].value); } - let newsletterInputs = + const newsletterInputs = event.target.querySelectorAll( 'input[type=hidden][data-members-newsletter], input[type=checkbox][data-members-newsletter]:checked, input[type=radio][data-members-newsletter]:checked', ) || []; @@ -139,10 +139,10 @@ export async function formSubmitHandler({ export function planClickHandler({ event, el, errorEl, siteUrl, site, member, clickHandler }) { el.removeEventListener('click', clickHandler); event.preventDefault(); - let plan = el.dataset.membersPlan; - let requestData = getCheckoutSessionDataFromPlanAttribute(site, plan.toLowerCase()); - let successUrl = el.dataset.membersSuccess; - let cancelUrl = el.dataset.membersCancel; + const plan = el.dataset.membersPlan; + const requestData = getCheckoutSessionDataFromPlanAttribute(site, plan.toLowerCase()); + const successUrl = el.dataset.membersSuccess; + const cancelUrl = el.dataset.membersCancel; let checkoutSuccessUrl; let checkoutCancelUrl; @@ -240,7 +240,7 @@ export function handleDataAttributes({ Array.prototype.forEach.call( document.querySelectorAll('form[data-members-form]'), function (form) { - let errorEl = form.querySelector('[data-members-error]'); + const errorEl = form.querySelector('[data-members-error]'); function submitHandler(event) { formSubmitHandler({ event, @@ -257,7 +257,7 @@ export function handleDataAttributes({ ); Array.prototype.forEach.call(document.querySelectorAll('[data-members-plan]'), function (el) { - let errorEl = el.querySelector('[data-members-error]'); + const errorEl = el.querySelector('[data-members-error]'); function clickHandler(event) { planClickHandler({ el, event, errorEl, member, site, siteUrl, clickHandler }); } @@ -267,9 +267,9 @@ export function handleDataAttributes({ Array.prototype.forEach.call( document.querySelectorAll('[data-members-edit-billing]'), function (el) { - let errorEl = el.querySelector('[data-members-error]'); - let membersSuccess = el.dataset.membersSuccess; - let membersCancel = el.dataset.membersCancel; + const errorEl = el.querySelector('[data-members-error]'); + const membersSuccess = el.dataset.membersSuccess; + const membersCancel = el.dataset.membersCancel; let successUrl; let cancelUrl; @@ -317,7 +317,7 @@ export function handleDataAttributes({ }); }) .then(function (result) { - let stripe = window.Stripe(result.publicKey); + const stripe = window.Stripe(result.publicKey); return stripe.redirectToCheckout({ sessionId: result.sessionId, }); @@ -344,8 +344,8 @@ export function handleDataAttributes({ Array.prototype.forEach.call( document.querySelectorAll('[data-members-manage-billing]'), function (el) { - let errorEl = el.querySelector('[data-members-error]'); - let membersReturn = el.dataset.membersReturn; + const errorEl = el.querySelector('[data-members-error]'); + const membersReturn = el.dataset.membersReturn; let returnUrl; if (membersReturn) { @@ -429,11 +429,11 @@ export function handleDataAttributes({ Array.prototype.forEach.call( document.querySelectorAll('[data-members-cancel-subscription]'), function (el) { - let errorEl = el.parentElement.querySelector('[data-members-error]'); + const errorEl = el.parentElement.querySelector('[data-members-error]'); function clickHandler(event) { event.preventDefault(); - let subscriptionId = el.dataset.membersCancelSubscription; + const subscriptionId = el.dataset.membersCancelSubscription; // If retention offer is available, open Portal to show the offer if (hasRetentionOffers) { @@ -501,14 +501,14 @@ export function handleDataAttributes({ Array.prototype.forEach.call( document.querySelectorAll('[data-members-continue-subscription]'), function (el) { - let errorEl = el.parentElement.querySelector('[data-members-error]'); + const errorEl = el.parentElement.querySelector('[data-members-error]'); function clickHandler(event) { el.removeEventListener('click', clickHandler); event.preventDefault(); el.classList.remove('error'); el.classList.add('loading'); - let subscriptionId = el.dataset.membersContinueSubscription; + const subscriptionId = el.dataset.membersContinueSubscription; if (errorEl) { errorEl.innerText = ''; diff --git a/apps/portal/src/utils/api.js b/apps/portal/src/utils/api.js index 4cce3cff191..53748be3e12 100644 --- a/apps/portal/src/utils/api.js +++ b/apps/portal/src/utils/api.js @@ -231,7 +231,7 @@ function setupGhostApi({ siteUrl = window.location.origin, apiUrl, apiKey }) { api.recommendations = { trackClicked({ recommendationId }) { - let url = endpointFor({ + const url = endpointFor({ type: 'members', resource: 'recommendations/' + recommendationId + '/clicked', }); @@ -239,7 +239,7 @@ function setupGhostApi({ siteUrl = window.location.origin, apiUrl, apiKey }) { }, trackSubscribed({ recommendationId }) { - let url = endpointFor({ + const url = endpointFor({ type: 'members', resource: 'recommendations/' + recommendationId + '/subscribed', }); @@ -1062,7 +1062,7 @@ function setupGhostApi({ siteUrl = window.location.origin, apiUrl, apiKey }) { }; api.init = async () => { - let [member] = await Promise.all([api.member.sessionData()]); + const [member] = await Promise.all([api.member.sessionData()]); let site = {}; let newsletters = []; let tiers = []; diff --git a/apps/portal/src/utils/fixtures.js b/apps/portal/src/utils/fixtures.js index 6da9f28591c..777d553105c 100644 --- a/apps/portal/src/utils/fixtures.js +++ b/apps/portal/src/utils/fixtures.js @@ -215,8 +215,8 @@ export function paidMemberOnTier() { if (!products || !products[1]) { return null; } - let price = site?.products?.[1].monthlyPrice; - let updatedMember = getMemberData({ + const price = site?.products?.[1].monthlyPrice; + const updatedMember = getMemberData({ paid: true, status: 'paid', subscriptions: [ diff --git a/apps/portal/src/utils/helpers.js b/apps/portal/src/utils/helpers.js index 028894591c1..30332001ae6 100644 --- a/apps/portal/src/utils/helpers.js +++ b/apps/portal/src/utils/helpers.js @@ -660,7 +660,7 @@ export function getAvailablePrices({ site, products = null }) { export function getFreePriceCurrency({ site }) { const stripePrices = getAvailablePrices({ site }); - let freePriceCurrencyDetail = { + const freePriceCurrencyDetail = { currency: 'usd', currency_symbol: '$', }; @@ -983,13 +983,13 @@ export const transformApiTiersData = ({ tiers }) => { let priceId = 0; return tiers.map((tier) => { - let monthlyPrice = createMonthlyPrice({ tier, priceId }); + const monthlyPrice = createMonthlyPrice({ tier, priceId }); priceId += 1; - let yearlyPrice = createYearlyPrice({ tier, priceId }); + const yearlyPrice = createYearlyPrice({ tier, priceId }); priceId += 1; - let benefits = createBenefits({ tier }); + const benefits = createBenefits({ tier }); return { ...tier, benefits: benefits, @@ -1041,7 +1041,7 @@ export function addMonths(date, numberOfMonths = 1) { const originalSeconds = originalDate.getUTCSeconds(); const originalMilliseconds = originalDate.getUTCMilliseconds(); let targetMonth = originalDate.getUTCMonth() + numberOfMonths; - let targetYear = originalDate.getUTCFullYear() + Math.floor(targetMonth / 12); + const targetYear = originalDate.getUTCFullYear() + Math.floor(targetMonth / 12); targetMonth = targetMonth % 12; const daysInTargetMonth = new Date(Date.UTC(targetYear, targetMonth + 1, 0)).getUTCDate(); diff --git a/apps/portal/src/utils/notifications.js b/apps/portal/src/utils/notifications.js index 892ba87e3a1..89a88a1d8b1 100644 --- a/apps/portal/src/utils/notifications.js +++ b/apps/portal/src/utils/notifications.js @@ -89,7 +89,7 @@ export default function NotificationParser({ billingOnly = false } = {}) { const successStatus = getURLParam({ searchParams, hashParams }, 'success'); const stripeStatus = getURLParam({ searchParams, hashParams }, 'stripe'); const giftRedemption = getURLParam({ searchParams, hashParams }, 'giftRedemption') === 'true'; - let notificationData = null; + const notificationData = null; if (!action && !successStatus && !stripeStatus && !giftRedemption) { return null; diff --git a/apps/portal/test/data-attributes.test.jsx b/apps/portal/test/data-attributes.test.jsx index d6c1717279b..d76c1e4539b 100644 --- a/apps/portal/test/data-attributes.test.jsx +++ b/apps/portal/test/data-attributes.test.jsx @@ -158,7 +158,7 @@ describe('Member Data attributes:', () => { }); // Mock window.location - let locationMock = vi.fn(); + const locationMock = vi.fn(); delete window.location; window.location = { assign: locationMock }; window.location.href = new URL('https://portal.localhost').href; @@ -881,7 +881,7 @@ describe('Portal Data attributes:', () => { }); // Mock window.location - let locationMock = vi.fn(); + const locationMock = vi.fn(); delete window.location; window.location = { assign: locationMock }; window.location.href = new URL('https://portal.localhost').href; @@ -1010,7 +1010,7 @@ describe('Portal Data attributes:', () => { `; - let { ghostApi, popupFrame, ...utils } = await setup({ + const { ghostApi, popupFrame, ...utils } = await setup({ site: FixturesSite.singleTier.basic, member: FixtureMember.paid, showPopup: false, diff --git a/apps/portal/test/portal-links.test.jsx b/apps/portal/test/portal-links.test.jsx index 5cb2bbb1054..0b26c464ab7 100644 --- a/apps/portal/test/portal-links.test.jsx +++ b/apps/portal/test/portal-links.test.jsx @@ -142,7 +142,7 @@ describe('Portal Data links:', () => { }); // Mock window.location - let locationMock = vi.fn(); + const locationMock = vi.fn(); delete window.location; window.location = { assign: locationMock }; window.location.href = new URL('https://portal.localhost').href; @@ -199,7 +199,7 @@ describe('Portal Data links:', () => { describe('with only a free plan', () => { test('renders invite-only message and does not allow signups', async () => { window.location.hash = '#/portal/signup'; - let { popupFrame } = await setup({ + const { popupFrame } = await setup({ site: { ...FixtureSite.singleTier.onlyFreePlan, members_signup_access: 'paid' }, member: null, }); @@ -218,7 +218,7 @@ describe('Portal Data links:', () => { window.location.hash = '#/portal/signup'; // Set up a paid-members only site with a free tier + 3 paid tiers - let { popupFrame } = await setup({ + const { popupFrame } = await setup({ site: { ...FixtureSite.multipleTiers.basic, members_signup_access: 'paid' }, member: null, }); @@ -262,7 +262,7 @@ describe('Portal Data links:', () => { test('does not open Portal when a paid member opens an offer link directly', async () => { window.location.hash = `#/portal/offers/${FixtureOffer.id}`; - let { ghostApi, popupFrame, triggerButtonFrame, ...utils } = await setup({ + const { ghostApi, popupFrame, triggerButtonFrame, ...utils } = await setup({ site: FixtureSite.singleTier.basic, member: FixtureMember.paid, showPopup: false, @@ -331,7 +331,7 @@ describe('Portal Data links:', () => { describe('on a paid-members only site', () => { test('renders paid-members only message and does not allow signups', async () => { window.location.hash = '#/portal/signup/free'; - let { popupFrame } = await setup({ + const { popupFrame } = await setup({ site: { ...FixtureSite.multipleTiers.basic, members_signup_access: 'paid' }, member: null, }); @@ -550,7 +550,7 @@ describe('Portal Data links:', () => { test('does not open when Stripe is disconnected', async () => { window.location.hash = '#/portal/gift'; - let { popupFrame, triggerButtonFrame } = await setup({ + const { popupFrame, triggerButtonFrame } = await setup({ site: FixtureSite.singleTier.withoutStripe, showPopup: false, }); @@ -591,7 +591,7 @@ describe('Portal Data links:', () => { }; test('renders a toast error when gift has expired', async () => { - let { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ + const { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ giftError: Object.assign(new Error('This gift has expired.'), { code: 'GIFT_EXPIRED' }), }); @@ -605,7 +605,7 @@ describe('Portal Data links:', () => { }); test('renders a toast error when gift has already been redeemed', async () => { - let { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ + const { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ giftError: Object.assign(new Error('This gift has already been redeemed.'), { code: 'GIFT_REDEEMED', }), @@ -621,7 +621,7 @@ describe('Portal Data links:', () => { }); test('renders a toast error when logged-in member already has an active subscription', async () => { - let { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ + const { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ giftError: Object.assign(new Error('You already have an active subscription.'), { code: 'GIFT_PAID_MEMBER', }), @@ -637,7 +637,7 @@ describe('Portal Data links:', () => { }); test('renders a toast error when gift link is invalid', async () => { - let { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ + const { ghostApi, triggerButtonFrame, ...utils } = await setupGiftRedemption({ giftError: Object.assign(new Error('Gift not found'), { code: 'GIFT_NOT_FOUND' }), }); @@ -778,7 +778,7 @@ describe('Portal Data links:', () => { window.location.pathname = '/'; window.sessionStorage.setItem(GIFT_FORM_STATE_KEY, 'saved-draft'); - let { popupFrame, triggerButtonFrame } = await setup({ + const { popupFrame, triggerButtonFrame } = await setup({ site: FixtureSite.singleTier.basic, showPopup: false, }); diff --git a/apps/portal/test/signin-flow.test.jsx b/apps/portal/test/signin-flow.test.jsx index fc7329011c3..b46265f495a 100644 --- a/apps/portal/test/signin-flow.test.jsx +++ b/apps/portal/test/signin-flow.test.jsx @@ -222,7 +222,7 @@ describe('Signin', () => { }); test('with only free plan', async () => { - let { + const { ghostApi, popupFrame, triggerButtonFrame, @@ -351,7 +351,7 @@ describe('Signin', () => { }); test('with only free plan available', async () => { - let { + const { ghostApi, popupFrame, triggerButtonFrame, diff --git a/apps/portal/test/signup-flow.test.jsx b/apps/portal/test/signup-flow.test.jsx index 4f4ece764c3..c1afc22793f 100644 --- a/apps/portal/test/signup-flow.test.jsx +++ b/apps/portal/test/signup-flow.test.jsx @@ -618,7 +618,7 @@ describe('Signup', () => { }); test('with only paid plans available', async () => { - let { + const { ghostApi, popupFrame, popupIframeDocument, @@ -927,7 +927,7 @@ describe('Signup', () => { }); test('should not show free plan if it is hidden', async () => { - let { popupFrame, triggerButtonFrame, emailInput, nameInput, siteTitle, freePlanTitle } = + const { popupFrame, triggerButtonFrame, emailInput, nameInput, siteTitle, freePlanTitle } = await multiTierSetup({ site: FixtureSite.multipleTiers.onlyPaidPlans, }); @@ -1024,7 +1024,7 @@ describe('Signup', () => { describe('on a paid-members only site', () => { describe('with only a free plan', () => { test('the trigger button redirects to signin instead of signup', async () => { - let { + const { popupFrame, emailInput, freePlanTitle, @@ -1054,7 +1054,7 @@ describe('Signup', () => { test('does not render the free tier, only paid tiers', async () => { // Setup paid-members only site with 4 tiers: free + 3 paid - let { + const { popupFrame, emailInput, nameInput, diff --git a/apps/portal/test/unit/components/pages/account-email-page.test.jsx b/apps/portal/test/unit/components/pages/account-email-page.test.jsx index 6180526b778..8a8ea292ce5 100644 --- a/apps/portal/test/unit/components/pages/account-email-page.test.jsx +++ b/apps/portal/test/unit/components/pages/account-email-page.test.jsx @@ -81,8 +81,8 @@ describe('Account Email Page', () => { member: getMemberData({ newsletters: newsletterData }), }); let checkboxes = container.querySelectorAll('input[type="checkbox"]'); - let newsletter1Checkbox = checkboxes[0]; - let newsletter2Checkbox = checkboxes[1]; + const newsletter1Checkbox = checkboxes[0]; + const newsletter2Checkbox = checkboxes[1]; // each newsletter should have the checked class (this is how we know they're enabled/subscribed to) expect(newsletter1Checkbox).toBeChecked(); expect(newsletter2Checkbox).toBeChecked(); @@ -123,11 +123,11 @@ describe('Account Email Page', () => { site: siteData, member: getMemberData({ newsletters: newsletterData }), }); - let checkboxes = container.querySelectorAll('input[type="checkbox"]'); - let newsletter1Checkbox = checkboxes[0]; + const checkboxes = container.querySelectorAll('input[type="checkbox"]'); + const newsletter1Checkbox = checkboxes[0]; // each newsletter should have the checked class (this is how we know they're enabled/subscribed to) expect(newsletter1Checkbox).toBeChecked(); - let subscriptionToggles = getAllByTestId('switch-input'); + const subscriptionToggles = getAllByTestId('switch-input'); fireEvent.click(subscriptionToggles[0]); expect(mockDoActionFn).toHaveBeenCalledWith('updateNewsletterPreference', { newsletters: [{ id: newsletterData[1].id }], diff --git a/apps/portal/test/utils/helpers.test.js b/apps/portal/test/utils/helpers.test.js index 9a4837de640..280c8bb3ace 100644 --- a/apps/portal/test/utils/helpers.test.js +++ b/apps/portal/test/utils/helpers.test.js @@ -245,18 +245,18 @@ describe('Helpers - ', () => { describe('isSameCurrency - ', () => { test('can match two currencies correctly ', () => { - let currency1 = 'USD'; - let currency2 = 'USD'; + const currency1 = 'USD'; + const currency2 = 'USD'; expect(isSameCurrency(currency1, currency2)).toBe(true); }); test('can match currencies with case mismatch', () => { - let currency1 = 'USD'; - let currency2 = 'usd'; + const currency1 = 'USD'; + const currency2 = 'usd'; expect(isSameCurrency(currency1, currency2)).toBe(true); }); test('can match currencies with case mismatch', () => { - let currency1 = 'eur'; - let currency2 = 'usd'; + const currency1 = 'eur'; + const currency2 = 'usd'; expect(isSameCurrency(currency1, currency2)).toBe(false); }); }); @@ -537,7 +537,7 @@ describe('Helpers - ', () => { describe('getSupportAddress -', () => { describe('when the calculated support address is available', () => { test('returns the calculated support email address, if available', () => { - let site = { + const site = { support_email_address: 'support@example.com', members_support_address: 'noreply@example.com', }; @@ -549,7 +549,7 @@ describe('Helpers - ', () => { describe('[Deprecated] when the calculated support address is not available', () => { test('returns expected support address for non sub domain', () => { - let site = { + const site = { members_support_address: 'jamie@example.com', }; const supportAddress = getSupportAddress({ site }); @@ -558,7 +558,7 @@ describe('Helpers - ', () => { }); test('returns expected support address for non www sub domain', () => { - let site = { + const site = { members_support_address: 'jamie@blog.example.com', }; const supportAddress = getSupportAddress({ site }); @@ -567,7 +567,7 @@ describe('Helpers - ', () => { }); test('returns expected support address for www domain', () => { - let site = { + const site = { members_support_address: 'jamie@www.example.com', }; const supportAddress = getSupportAddress({ site }); @@ -576,7 +576,7 @@ describe('Helpers - ', () => { }); test('returns expected support address for default noreply value', () => { - let site = { + const site = { members_support_address: 'noreply', url: 'https://www.example.com', }; @@ -586,7 +586,7 @@ describe('Helpers - ', () => { }); test('returns empty string for missing support address', () => { - let site = { + const site = { members_support_address: null, url: 'https://www.example.com', }; @@ -599,7 +599,7 @@ describe('Helpers - ', () => { describe('getDefaultNewsletterSender - ', () => { test('returns the sender_email from the first newsletter when available', () => { - let site = { + const site = { default_email_address: 'default@example.com', url: 'https://example.com', newsletters: [ @@ -614,7 +614,7 @@ describe('Helpers - ', () => { }); test('otherwise, fallbacks to the calculated default_email_address when available', () => { - let site = { + const site = { default_email_address: 'default@example.com', url: 'https://example.com', }; @@ -624,7 +624,7 @@ describe('Helpers - ', () => { }); test('otherwise, fallbacks to noreply@sitedomain.com', () => { - let site = { + const site = { url: 'https://example.com', }; const defaultAddress = getDefaultNewsletterSender({ site }); diff --git a/apps/sodo-search/src/components/popup-modal.jsx b/apps/sodo-search/src/components/popup-modal.jsx index ce6636ae4f0..73e09fd1293 100644 --- a/apps/sodo-search/src/components/popup-modal.jsx +++ b/apps/sodo-search/src/components/popup-modal.jsx @@ -74,7 +74,7 @@ function SearchBox() { inputRef?.current?.focus(); }, 150); - let keyUphandler = (event) => { + const keyUphandler = (event) => { if (event.key === 'Escape') { dispatch('update', { showPopup: false, @@ -252,7 +252,7 @@ function getMatchIndexes({ text, highlight }) { } }); const matchRegex = new RegExp(`${highlightRegexText}`, 'ig'); - let matches = text?.matchAll(matchRegex); + const matches = text?.matchAll(matchRegex); const indexes = []; for (const match of matches) { indexes.push({ @@ -504,7 +504,7 @@ export function Results({ posts, authors, tags }) { }, [allResults]); useEffect(() => { - let keyDownHandler = (event) => { + const keyDownHandler = (event) => { // keyCode 229 is the IME composition key for legacy browsers if (event.isComposing || event.keyCode === 229) { return; @@ -512,8 +512,8 @@ export function Results({ posts, authors, tags }) { const selectedResultIdx = allResults.findIndex((d) => { return d.id === selectedResult; }); - let nextResult = allResults[selectedResultIdx + 1]; - let prevResult = allResults[selectedResultIdx - 1]; + const nextResult = allResults[selectedResultIdx + 1]; + const prevResult = allResults[selectedResultIdx - 1]; if (event.key === 'ArrowUp' && prevResult) { setSelectedResult(prevResult?.id); } else if (event.key === 'ArrowDown' && nextResult) { diff --git a/apps/sodo-search/src/search-index.js b/apps/sodo-search/src/search-index.js index a0e7e50b408..d0ac6b50409 100644 --- a/apps/sodo-search/src/search-index.js +++ b/apps/sodo-search/src/search-index.js @@ -2,7 +2,7 @@ import Flexsearch, { Charset } from 'flexsearch'; const cjkEncoderPresetCodepoint = { finalize: (terms) => { - let results = []; + const results = []; for (const term of terms) { results.push(...tokenizeCjkByCodePoint(term)); diff --git a/apps/sodo-search/test/acceptance/search-index.test.js b/apps/sodo-search/test/acceptance/search-index.test.js index 992c995a54b..6cb4dd0bd41 100644 --- a/apps/sodo-search/test/acceptance/search-index.test.js +++ b/apps/sodo-search/test/acceptance/search-index.test.js @@ -112,10 +112,10 @@ describe('search index', function () { expect(searchResults.posts.length).toEqual(0); // confirms that search works in the forward direction for ltr languages: - let searchWithStartResults = searchIndex.search('Barce'); + const searchWithStartResults = searchIndex.search('Barce'); expect(searchWithStartResults.posts.length).toEqual(1); - let searchWithEndResults = searchIndex.search('celona'); + const searchWithEndResults = searchIndex.search('celona'); expect(searchWithEndResults.posts.length).toEqual(0); }); @@ -198,11 +198,11 @@ describe('search index', function () { // reverse tokenisation is what rtl languages get: a word matches from either // end, where the ltr index above only matches from the start. - let searchWithStartResults = searchIndex.search('المثا'); + const searchWithStartResults = searchIndex.search('المثا'); expect(searchWithStartResults.posts.length).toEqual(1); expect(searchWithStartResults.posts[0].title).toEqual('أُظهر المثابرة كل يوم'); - let searchWithEndResults = searchIndex.search('ثابرة'); + const searchWithEndResults = searchIndex.search('ثابرة'); expect(searchWithEndResults.posts.length).toEqual(1); expect(searchWithEndResults.posts[0].title).toEqual('أُظهر المثابرة كل يوم'); }); diff --git a/configs/eslint/index.mjs b/configs/eslint/index.mjs index cdfd93405f3..9a1118433e0 100644 --- a/configs/eslint/index.mjs +++ b/configs/eslint/index.mjs @@ -27,6 +27,7 @@ export const correctnessRules = { 'dot-notation': 'error', eqeqeq: ['error', 'always'], 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], + 'prefer-const': ['error', { destructuring: 'all' }], 'no-eval': 'error', 'no-useless-call': 'error', 'no-console': 'error', diff --git a/ghost/core/core/boot.js b/ghost/core/core/boot.js index 8efc26cfde0..e6e3203eafe 100644 --- a/ghost/core/core/boot.js +++ b/ghost/core/core/boot.js @@ -31,7 +31,7 @@ class BootLogger { * @returns {void} */ log(message) { - let { logging, startTime } = this; + const { logging, startTime } = this; logging.info(`Ghost ${message} in ${(Date.now() - startTime) / 1000}s`); } /** @@ -40,7 +40,7 @@ class BootLogger { * @returns {void} */ metric(name, initialTime) { - let { metrics, startTime } = this; + const { metrics, startTime } = this; if (!initialTime) { initialTime = startTime; diff --git a/ghost/core/core/bridge.js b/ghost/core/core/bridge.js index 237901e2767..ce9a5fa1aea 100644 --- a/ghost/core/core/bridge.js +++ b/ghost/core/core/bridge.js @@ -77,7 +77,7 @@ class Bridge { } async activateTheme(loadedTheme, checkedTheme) { - let settings = { + const settings = { locale: settingsCache.get('locale'), }; // no need to check the score, activation should be used in combination with validate.check diff --git a/ghost/core/core/frontend/apps/private-blogging/index.js b/ghost/core/core/frontend/apps/private-blogging/index.js index d67f24a7982..a8f06c6f7c2 100644 --- a/ghost/core/core/frontend/apps/private-blogging/index.js +++ b/ghost/core/core/frontend/apps/private-blogging/index.js @@ -16,7 +16,7 @@ const messages = { // routeKeywords.private: 'private' const PRIVATE_KEYWORD = 'private'; -let checkSubdir = function checkSubdir() { +const checkSubdir = function checkSubdir() { if (urlUtils.getSubdir()) { const paths = urlUtils.getSubdir().split('/'); @@ -37,7 +37,7 @@ let checkSubdir = function checkSubdir() { module.exports = { activate: function activate(ghost) { - let privateRoute = `/${PRIVATE_KEYWORD}/`; + const privateRoute = `/${PRIVATE_KEYWORD}/`; checkSubdir(); diff --git a/ghost/core/core/frontend/apps/private-blogging/lib/middleware.js b/ghost/core/core/frontend/apps/private-blogging/lib/middleware.js index 5ccf132ae61..f1f41c1963b 100644 --- a/ghost/core/core/frontend/apps/private-blogging/lib/middleware.js +++ b/ghost/core/core/frontend/apps/private-blogging/lib/middleware.js @@ -78,7 +78,7 @@ const privateBlogging = { // CASE: Allow private RSS feed urls. // If the path matches the private rss feed URL we rewrite the url. Even Express uses rewriting when using `app.use()`. - let isPrivateRSS = new RegExp(`/${settingsCache.get('public_hash')}/rss(/)?$`); + const isPrivateRSS = new RegExp(`/${settingsCache.get('public_hash')}/rss(/)?$`); if (isPrivateRSS.test(req.path)) { req.url = req.url.replace(settingsCache.get('public_hash') + '/', ''); return next(); diff --git a/ghost/core/core/frontend/apps/private-blogging/lib/router.js b/ghost/core/core/frontend/apps/private-blogging/lib/router.js index e5c2976b347..d3cb1c112eb 100644 --- a/ghost/core/core/frontend/apps/private-blogging/lib/router.js +++ b/ghost/core/core/frontend/apps/private-blogging/lib/router.js @@ -16,7 +16,7 @@ function _renderer(req, res) { // Renderer begin // Format data - let data = {}; + const data = {}; if (res.error) { data.error = res.error; diff --git a/ghost/core/core/frontend/helpers/cancel_link.js b/ghost/core/core/frontend/helpers/cancel_link.js index a048db4d792..a0851a2034b 100644 --- a/ghost/core/core/frontend/helpers/cancel_link.js +++ b/ghost/core/core/frontend/helpers/cancel_link.js @@ -18,7 +18,7 @@ const messages = { // eslint-disable-next-line camelcase function cancel_link(options) { - let truncateOptions = (options || {}).hash || {}; + const truncateOptions = (options || {}).hash || {}; if (this.id === undefined || this.cancel_at_period_end === undefined) { throw new errors.IncorrectUsageError({ message: tpl(messages.invalidData) }); @@ -37,8 +37,8 @@ function cancel_link(options) { } module.exports = function cancelLabsWrapper() { - let self = this; - let args = arguments; + const self = this; + const args = arguments; return labs.enabledHelper( { diff --git a/ghost/core/core/frontend/helpers/content.js b/ghost/core/core/frontend/helpers/content.js index 1e2d65d5f35..a0d82726b6b 100644 --- a/ghost/core/core/frontend/helpers/content.js +++ b/ghost/core/core/frontend/helpers/content.js @@ -29,8 +29,8 @@ function restrictedCta(options) { } module.exports = function content(options = {}) { - let self = this; - let args = arguments; + const self = this; + const args = arguments; const hash = options.hash || {}; const truncateOptions = {}; diff --git a/ghost/core/core/frontend/helpers/content_api_url.js b/ghost/core/core/frontend/helpers/content_api_url.js index 3f1495c21ed..2bfefdd007d 100644 --- a/ghost/core/core/frontend/helpers/content_api_url.js +++ b/ghost/core/core/frontend/helpers/content_api_url.js @@ -8,7 +8,7 @@ module.exports = function content_api_url(options) { const absoluteUrlRequested = getAbsoluteOption(options); try { - let path = urlUtils.urlFor('api', { type: 'content' }, absoluteUrlRequested); + const path = urlUtils.urlFor('api', { type: 'content' }, absoluteUrlRequested); result = new SafeString(path); } catch (error) { logging.error(error); diff --git a/ghost/core/core/frontend/helpers/date.js b/ghost/core/core/frontend/helpers/date.js index 13430c9205b..6ba67127e92 100644 --- a/ghost/core/core/frontend/helpers/date.js +++ b/ghost/core/core/frontend/helpers/date.js @@ -34,7 +34,7 @@ module.exports = function (...attrs) { const timeNow = moment().tz(timezone); // Our date might be user input - let testDateInput = Date.parse(date); + const testDateInput = Date.parse(date); let dateMoment; if (isNaN(testDateInput) === false) { dateMoment = moment.parseZone(date); diff --git a/ghost/core/core/frontend/helpers/foreach.js b/ghost/core/core/frontend/helpers/foreach.js index 30a9b2618a0..30efa5ce504 100644 --- a/ghost/core/core/frontend/helpers/foreach.js +++ b/ghost/core/core/frontend/helpers/foreach.js @@ -49,7 +49,7 @@ module.exports = function foreach(items, options) { // Initial values set based on parameters sent through. If nothing sent, set to defaults const { fn, inverse, hash, data, ids } = options; let { columns, limit, from, to } = hash; - let length = _.size(items); + const length = _.size(items); let output = ''; let frame; let contextPath; diff --git a/ghost/core/core/frontend/helpers/get.js b/ghost/core/core/frontend/helpers/get.js index 84184107309..da7329addf0 100644 --- a/ghost/core/core/frontend/helpers/get.js +++ b/ghost/core/core/frontend/helpers/get.js @@ -300,7 +300,7 @@ function optimiseFilterCacheability(resource, options) { */ async function makeAPICall(resource, controllerName, action, apiOptions) { const controller = api[controllerName]; - let makeRequest = (options) => controller[action](options); + const makeRequest = (options) => controller[action](options); const { options, parseResult } = optimiseFilterCacheability(resource, apiOptions); diff --git a/ghost/core/core/frontend/helpers/ghost_head.js b/ghost/core/core/frontend/helpers/ghost_head.js index c31fa5ddfd2..4b3135bb70b 100644 --- a/ghost/core/core/frontend/helpers/ghost_head.js +++ b/ghost/core/core/frontend/helpers/ghost_head.js @@ -186,7 +186,7 @@ function getSearchHelper(frontendKey) { locale: settingsCache.get('locale') || 'en', }; const dataAttrs = getDataAttributes(attrs); - let helper = ``; + const helper = ``; return helper; } @@ -226,7 +226,7 @@ function getAnnouncementBarHelper(data) { } const dataAttrs = getDataAttributes(attrs); - let helper = ``; + const helper = ``; return helper; } diff --git a/ghost/core/core/frontend/helpers/has.js b/ghost/core/core/frontend/helpers/has.js index 94557688f34..fbf9a7fe48e 100644 --- a/ghost/core/core/frontend/helpers/has.js +++ b/ghost/core/core/frontend/helpers/has.js @@ -167,14 +167,12 @@ module.exports = function has(options) { }, }; - let result; - if (_.isEmpty(attrs)) { logging.warn(tpl(messages.invalidAttribute)); return; } - result = _.some(attrs, function (value, attr) { + const result = _.some(attrs, function (value, attr) { return checks[attr](); }); diff --git a/ghost/core/core/frontend/helpers/link.js b/ghost/core/core/frontend/helpers/link.js index 2c00ed58f7f..63f3146ca10 100644 --- a/ghost/core/core/frontend/helpers/link.js +++ b/ghost/core/core/frontend/helpers/link.js @@ -41,10 +41,10 @@ module.exports = function link(options) { options.hash.href = ''; } - let href = options.hash.href.string || options.hash.href; + const href = options.hash.href.string || options.hash.href; // Calculate dynamic properties - let classes = buildLinkClasses(config.get('url'), href, options); + const classes = buildLinkClasses(config.get('url'), href, options); // Remove all the attributes we don't want to do a one-to-one mapping of managedAttributes.forEach((attr) => { @@ -52,14 +52,14 @@ module.exports = function link(options) { }); // Setup our one-to-one mapping of attributes; - let attributes = options.hash; + const attributes = options.hash; // Prepare output - let classString = classes.length > 0 ? `class="${classes.join(' ')}"` : ''; - let hrefString = `href="${href}"`; - let attributeString = _.size(attributes) > 0 ? _formatAttrs(attributes) : ''; + const classString = classes.length > 0 ? `class="${classes.join(' ')}"` : ''; + const hrefString = `href="${href}"`; + const attributeString = _.size(attributes) > 0 ? _formatAttrs(attributes) : ''; let openingTag = ``; - let closingTag = ``; + const closingTag = ``; // Clean up any extra spaces openingTag = openingTag.replace(/\s{2,}/g, ' ').replace(/\s>/, '>'); diff --git a/ghost/core/core/frontend/helpers/link_class.js b/ghost/core/core/frontend/helpers/link_class.js index 9781574ead7..a64a69f3e0f 100644 --- a/ghost/core/core/frontend/helpers/link_class.js +++ b/ghost/core/core/frontend/helpers/link_class.js @@ -32,8 +32,8 @@ module.exports = function link_class(options) { options.hash.for = ''; } - let href = options.hash.for.string || options.hash.for; - let classes = buildLinkClasses(config.get('url'), href, options); + const href = options.hash.for.string || options.hash.for; + const classes = buildLinkClasses(config.get('url'), href, options); return new SafeString(classes.join(' ')); }; diff --git a/ghost/core/core/frontend/helpers/navigation.js b/ghost/core/core/frontend/helpers/navigation.js index 34572a6b024..813fa223723 100644 --- a/ghost/core/core/frontend/helpers/navigation.js +++ b/ghost/core/core/frontend/helpers/navigation.js @@ -110,7 +110,6 @@ module.exports = function navigation(options) { const navigationData = options.data.site[key]; const currentUrl = options.data.root.relativeUrl; const member = options.data.member || options.data.root.member; - let output; if (!Array.isArray(navigationData)) { throw new errors.IncorrectUsageError({ @@ -154,7 +153,7 @@ module.exports = function navigation(options) { const navigationIconsEnabled = labs.isSet('navigationIcons'); - output = navigationData + const output = navigationData .filter((item) => (navigationIconsEnabled ? isNavigationItemVisible(item, member) : true)) .map(function (e) { const out = {}; diff --git a/ghost/core/core/frontend/helpers/recommendations.js b/ghost/core/core/frontend/helpers/recommendations.js index 9419d8e1d2b..df670fb9dee 100644 --- a/ghost/core/core/frontend/helpers/recommendations.js +++ b/ghost/core/core/frontend/helpers/recommendations.js @@ -24,7 +24,6 @@ async function fetchRecommendations(apiOptions) { try { const controller = api.recommendationsPublic; - let response; const logLevel = config.get('optimization:getHelper:timeout:level') || 'error'; const threshold = config.get('optimization:getHelper:timeout:threshold') || 5000; @@ -47,7 +46,7 @@ async function fetchRecommendations(apiOptions) { }, threshold); }); - response = await Promise.race([apiResponse, timeout]); + const response = await Promise.race([apiResponse, timeout]); clearTimeout(timer); return response; @@ -64,10 +63,10 @@ async function fetchRecommendations(apiOptions) { * @returns {*} */ function parseOptions(options) { - let limit = options.limit ?? 5; - let order = options.order ?? 'created_at desc'; - let filter = options.filter ?? ''; - let page = options.page ?? 1; + const limit = options.limit ?? 5; + const order = options.order ?? 'created_at desc'; + const filter = options.filter ?? ''; + const page = options.page ?? 1; return { limit, diff --git a/ghost/core/core/frontend/helpers/tiers.js b/ghost/core/core/frontend/helpers/tiers.js index 8f27b4ad4fa..d4211e780d0 100644 --- a/ghost/core/core/frontend/helpers/tiers.js +++ b/ghost/core/core/frontend/helpers/tiers.js @@ -18,7 +18,7 @@ module.exports = function tiers(options = {}) { let output = ''; - let accessProductsList = this.tiers; + const accessProductsList = this.tiers; if (accessProductsList && accessProductsList.length > 0) { const tierNames = accessProductsList.map((tier) => { diff --git a/ghost/core/core/frontend/helpers/total_members.js b/ghost/core/core/frontend/helpers/total_members.js index 9283448d5c2..11a6cf51171 100644 --- a/ghost/core/core/frontend/helpers/total_members.js +++ b/ghost/core/core/frontend/helpers/total_members.js @@ -9,7 +9,7 @@ module.exports = async function total_members() { if (this.total) { return new SafeString(memberCountRounding(this.total)); } else { - let memberStats = await getMemberStats(); + const memberStats = await getMemberStats(); const { total } = memberStats; return new SafeString(total > 0 ? memberCountRounding(total) : 0); } diff --git a/ghost/core/core/frontend/helpers/total_paid_members.js b/ghost/core/core/frontend/helpers/total_paid_members.js index 7116761f6ea..a29198595d1 100644 --- a/ghost/core/core/frontend/helpers/total_paid_members.js +++ b/ghost/core/core/frontend/helpers/total_paid_members.js @@ -8,7 +8,7 @@ module.exports = async function total_paid_members() { if (this.paid) { return new SafeString(memberCountRounding(this.paid)); } else { - let memberStats = await getMemberStats(); + const memberStats = await getMemberStats(); const { paid } = memberStats; return new SafeString(paid > 0 ? memberCountRounding(paid) : 0); } diff --git a/ghost/core/core/frontend/meta/author-url.js b/ghost/core/core/frontend/meta/author-url.js index e2bb337b6d3..d333431029f 100644 --- a/ghost/core/core/frontend/meta/author-url.js +++ b/ghost/core/core/frontend/meta/author-url.js @@ -2,7 +2,7 @@ const { urlService } = require('../services/proxy'); const getContextObject = require('./context-object.js'); function getAuthorUrl(data, absolute) { - let context = data.context ? data.context[0] : null; + const context = data.context ? data.context[0] : null; const contextObject = getContextObject(data, context); diff --git a/ghost/core/core/frontend/meta/modified-date.js b/ghost/core/core/frontend/meta/modified-date.js index 2091801c6e6..13778e3c1b3 100644 --- a/ghost/core/core/frontend/meta/modified-date.js +++ b/ghost/core/core/frontend/meta/modified-date.js @@ -1,7 +1,7 @@ const getContextObject = require('./context-object.js'); function getModifiedDate(data) { - let context = data.context ? data.context : null; + const context = data.context ? data.context : null; let modDate; const contextObject = getContextObject(data, context); diff --git a/ghost/core/core/frontend/meta/published-date.js b/ghost/core/core/frontend/meta/published-date.js index 64b70757f9e..71c3c53e037 100644 --- a/ghost/core/core/frontend/meta/published-date.js +++ b/ghost/core/core/frontend/meta/published-date.js @@ -1,7 +1,7 @@ const getContextObject = require('./context-object.js'); function getPublishedDate(data) { - let context = data.context ? data.context[0] : null; + const context = data.context ? data.context[0] : null; const contextObject = getContextObject(data, context); diff --git a/ghost/core/core/frontend/meta/schema.js b/ghost/core/core/frontend/meta/schema.js index b7e96d4ed88..7649e646768 100644 --- a/ghost/core/core/frontend/meta/schema.js +++ b/ghost/core/core/frontend/meta/schema.js @@ -11,12 +11,11 @@ const _ = require('lodash'); // literal `Tom & Jerry`. function schemaImageObject(metaDataVal) { - let imageObject; if (!metaDataVal || !metaDataVal.url) { return null; } - imageObject = { + const imageObject = { '@type': 'ImageObject', url: metaDataVal.url, }; @@ -30,9 +29,7 @@ function schemaImageObject(metaDataVal) { } function schemaPublisherObject(metaDataVal) { - let publisherObject; - - publisherObject = { + const publisherObject = { '@type': 'Organization', name: metaDataVal.site.title, url: metaDataVal.site.url || null, @@ -118,11 +115,9 @@ function getPostSchema(metaData, data) { // or the automated excerpt of 50 words. It is empty for any other context. const description = metaData.excerpt || null; - let schema; - const context = data.page ? 'page' : 'post'; - schema = { + const schema = { '@context': 'https://schema.org', '@type': 'Article', publisher: schemaPublisherObject(metaData), diff --git a/ghost/core/core/frontend/meta/structured-data.js b/ghost/core/core/frontend/meta/structured-data.js index 6f4e5b96adf..84b743abe67 100644 --- a/ghost/core/core/frontend/meta/structured-data.js +++ b/ghost/core/core/frontend/meta/structured-data.js @@ -1,14 +1,13 @@ const socialUrls = require('@tryghost/social-urls'); function getStructuredData(metaData) { - let structuredData; let card = 'summary'; if (metaData.twitterImage || metaData.coverImage.url) { card = 'summary_large_image'; } - structuredData = { + const structuredData = { 'og:site_name': metaData.site.title, 'og:type': metaData.ogType, 'og:title': metaData.ogTitle, diff --git a/ghost/core/core/frontend/services/assets-minification/minifier.js b/ghost/core/core/frontend/services/assets-minification/minifier.js index 2784733f9ad..8cc478742ca 100644 --- a/ghost/core/core/frontend/services/assets-minification/minifier.js +++ b/ghost/core/core/frontend/services/assets-minification/minifier.js @@ -126,7 +126,7 @@ class Minifier { async writeFile(contents, dest) { if (contents) { - let writePath = this.getFullDest(dest); + const writePath = this.getFullDest(dest); // Ensure the output folder exists await fs.mkdir(this.destPath, { recursive: true }); // Create the file diff --git a/ghost/core/core/frontend/services/data/entry-lookup.js b/ghost/core/core/frontend/services/data/entry-lookup.js index a1ab72f827d..e0037f06363 100644 --- a/ghost/core/core/frontend/services/data/entry-lookup.js +++ b/ghost/core/core/frontend/services/data/entry-lookup.js @@ -38,7 +38,7 @@ function entryLookup(postUrl, routerOptions, locals, { giftToken } = {}) { isEditURL = true; } - let options = { + const options = { include: 'authors,tags,tiers', }; diff --git a/ghost/core/core/frontend/services/data/fetch-data.js b/ghost/core/core/frontend/services/data/fetch-data.js index 2b471f2693f..e81c143537c 100644 --- a/ghost/core/core/frontend/services/data/fetch-data.js +++ b/ghost/core/core/frontend/services/data/fetch-data.js @@ -64,8 +64,8 @@ async function fetchData(pathOptions, routerOptions, locals) { pathOptions = pathOptions || {}; routerOptions = routerOptions || {}; - let postQuery = _.cloneDeep(defaultPostQuery); - let promises = []; + const postQuery = _.cloneDeep(defaultPostQuery); + const promises = []; if (routerOptions.filter) { postQuery.options.filter = routerOptions.filter; diff --git a/ghost/core/core/frontend/services/rendering/format-response.js b/ghost/core/core/frontend/services/rendering/format-response.js index 6dace6b8693..671dbfea0ad 100644 --- a/ghost/core/core/frontend/services/rendering/format-response.js +++ b/ghost/core/core/frontend/services/rendering/format-response.js @@ -90,7 +90,7 @@ function formatResponse(post, context, locals = {}) { prepareContextResource(post); - let entry = { + const entry = { post: post, }; diff --git a/ghost/core/core/frontend/services/routing/controllers/static.js b/ghost/core/core/frontend/services/routing/controllers/static.js index 374b0b987a0..b0e07d30f78 100644 --- a/ghost/core/core/frontend/services/routing/controllers/static.js +++ b/ghost/core/core/frontend/services/routing/controllers/static.js @@ -44,7 +44,7 @@ module.exports = function staticController(req, res, next) { return Promise.all(promises) .then(function handleResult(result) { - let response = {}; + const response = {}; if (res.routerOptions.data) { response.data = {}; diff --git a/ghost/core/core/frontend/services/routing/parent-router.js b/ghost/core/core/frontend/services/routing/parent-router.js index b51eb195738..1238e097487 100644 --- a/ghost/core/core/frontend/services/routing/parent-router.js +++ b/ghost/core/core/frontend/services/routing/parent-router.js @@ -83,7 +83,7 @@ class ParentRouter { * @private */ _respectDominantRouter(req, res, next, slug) { - let siteRouter = this._getSiteRouter(req); + const siteRouter = this._getSiteRouter(req); let targetRoute = null; // CASE: iterate over routers and check whether a router has a redirect for the target slug enabled. diff --git a/ghost/core/core/frontend/services/routing/registry.js b/ghost/core/core/frontend/services/routing/registry.js index bf9373bd044..8f4ad3bcd48 100644 --- a/ghost/core/core/frontend/services/routing/registry.js +++ b/ghost/core/core/frontend/services/routing/registry.js @@ -71,7 +71,7 @@ class Registry { * @returns {ParentRouter|undefined} */ getRouterByName(name) { - for (let routerKey in this.routers) { + for (const routerKey in this.routers) { if (this.routers[routerKey].name === name) { return this.routers[routerKey]; } diff --git a/ghost/core/core/frontend/services/theme-engine/handlebars/utils.js b/ghost/core/core/frontend/services/theme-engine/handlebars/utils.js index a1b2807b7a6..461776f86b7 100644 --- a/ghost/core/core/frontend/services/theme-engine/handlebars/utils.js +++ b/ghost/core/core/frontend/services/theme-engine/handlebars/utils.js @@ -1,7 +1,7 @@ const _ = require('lodash'); module.exports.findKey = function findKey(key /* ...objects... */) { - let objects = Array.prototype.slice.call(arguments, 1); + const objects = Array.prototype.slice.call(arguments, 1); return _.reduceRight( objects, @@ -40,8 +40,8 @@ function _urlParentMatch(href, location) { } let parent = false; - let locParts = _urlClean(location).split('/'); - let hrefParts = _urlClean(href).split('/'); + const locParts = _urlClean(location).split('/'); + const hrefParts = _urlClean(href).split('/'); if (locParts.length <= hrefParts.length) { return false; @@ -55,11 +55,11 @@ function _urlParentMatch(href, location) { } module.exports.buildLinkClasses = function buildLinkClasses(siteUrl, href, options) { - let relativeHref = href.replace(siteUrl, ''); - let location = options.data.root.relativeUrl; - let classes = options.hash.class ? options.hash.class.toString().split(' ') : []; - let activeClass = _.has(options.hash, 'activeClass') ? options.hash.activeClass : 'nav-current'; - let parentActiveClass = _.has(options.hash, 'parentActiveClass') + const relativeHref = href.replace(siteUrl, ''); + const location = options.data.root.relativeUrl; + const classes = options.hash.class ? options.hash.class.toString().split(' ') : []; + const activeClass = _.has(options.hash, 'activeClass') ? options.hash.activeClass : 'nav-current'; + const parentActiveClass = _.has(options.hash, 'parentActiveClass') ? options.hash.parentActiveClass : `${activeClass || 'nav-current'}-parent`; diff --git a/ghost/core/core/frontend/services/theme-engine/i18n/i18n.js b/ghost/core/core/frontend/services/theme-engine/i18n/i18n.js index c8e02c18468..d7a0e88b965 100644 --- a/ghost/core/core/frontend/services/theme-engine/i18n/i18n.js +++ b/ghost/core/core/frontend/services/theme-engine/i18n/i18n.js @@ -62,10 +62,9 @@ class I18n { * @returns {string} */ t(translationPath, bindings) { - let string; let msg; - string = this._findString(translationPath); + const string = this._findString(translationPath); // If the path returns an array (as in the case with anything that has multiple paragraphs such as emails), then // loop through them and return an array of translated/formatted strings. Otherwise, just return the normal @@ -153,7 +152,7 @@ class I18n { */ _findString(msgPath, opts) { const options = merge({ log: true }, opts || {}); - let candidateString; + let matchingString; // no path? no string @@ -167,7 +166,7 @@ class I18n { this._handleUninitialisedError(msgPath); } - candidateString = this._getCandidateString(msgPath); + const candidateString = this._getCandidateString(msgPath); matchingString = candidateString || {}; @@ -219,7 +218,7 @@ class I18n { * @param {Object} bindings */ _formatMessage(string, bindings) { - let currentLocale = this.locale(); + const currentLocale = this.locale(); let msg = new MessageFormat(string, currentLocale); try { diff --git a/ghost/core/core/frontend/services/theme-engine/middleware/update-global-template-options.js b/ghost/core/core/frontend/services/theme-engine/middleware/update-global-template-options.js index ddf2328c7dd..61423d4a772 100644 --- a/ghost/core/core/frontend/services/theme-engine/middleware/update-global-template-options.js +++ b/ghost/core/core/frontend/services/theme-engine/middleware/update-global-template-options.js @@ -6,7 +6,7 @@ const labs = require('../../../../shared/labs'); const activeTheme = require('../active'); function getSiteData() { - let siteData = settingsCache.getPublic(); + const siteData = settingsCache.getPublic(); // theme-only computed property added to @site if (settingsCache.get('members_signup_access') === 'none') { diff --git a/ghost/core/core/frontend/services/theme-engine/preview.js b/ghost/core/core/frontend/services/theme-engine/preview.js index 201c9faa968..2dd8a8f62c4 100644 --- a/ghost/core/core/frontend/services/theme-engine/preview.js +++ b/ghost/core/core/frontend/services/theme-engine/preview.js @@ -27,7 +27,7 @@ function getPreviewData(previewHeader, customThemeSettingKeys = []) { hf: 'heading_font', }; - let opts = new URLSearchParams(previewHeader); + const opts = new URLSearchParams(previewHeader); const previewData = {}; diff --git a/ghost/core/core/frontend/utils/member-count.js b/ghost/core/core/frontend/utils/member-count.js index 8ad39b770cf..85272308340 100644 --- a/ghost/core/core/frontend/utils/member-count.js +++ b/ghost/core/core/frontend/utils/member-count.js @@ -11,9 +11,9 @@ const { api } = require('../services/proxy'); * }>} */ async function getMemberStats() { - let memberStats = this.data || (await api.stats.memberCountHistory.query()); + const memberStats = this.data || (await api.stats.memberCountHistory.query()); const { free, paid, comped, gift } = memberStats.meta.totals; - let total = free + paid + comped + gift; + const total = free + paid + comped + gift; return { free, paid, comped, gift, total }; } diff --git a/ghost/core/core/frontend/web/routers/serve-public-file.js b/ghost/core/core/frontend/web/routers/serve-public-file.js index 433b7d528f0..3612a1339b1 100644 --- a/ghost/core/core/frontend/web/routers/serve-public-file.js +++ b/ghost/core/core/frontend/web/routers/serve-public-file.js @@ -36,7 +36,7 @@ function createPublicFileMiddleware(location, file, mime, maxAge, options = {}) // These files are built on the fly, and must be saved in the content folder const builtFilePath = config.getContentPath('public'); - let locationPath = location === 'static' ? staticFilePath : builtFilePath; + const locationPath = location === 'static' ? staticFilePath : builtFilePath; const filePath = file.match(/^public/) ? path.join(locationPath, file.replace(/^public/, '')) diff --git a/ghost/core/core/server/api/endpoints/db.js b/ghost/core/core/server/api/endpoints/db.js index 48ac0d6a960..31db6913256 100644 --- a/ghost/core/core/server/api/endpoints/db.js +++ b/ghost/core/core/server/api/endpoints/db.js @@ -66,7 +66,7 @@ const controller = { // eslint-disable-next-line ghost/ghost-custom/max-api-complexity async query(frame) { if (frame.options.filename) { - let backup = await dbBackup.readBackup(frame.options.filename); + const backup = await dbBackup.readBackup(frame.options.filename); if (!backup) { throw new errors.NotFoundError(); diff --git a/ghost/core/core/server/api/endpoints/mail.js b/ghost/core/core/server/api/endpoints/mail.js index 7fa13818681..7e325c1ed94 100644 --- a/ghost/core/core/server/api/endpoints/mail.js +++ b/ghost/core/core/server/api/endpoints/mail.js @@ -2,7 +2,7 @@ const tpl = require('@tryghost/tpl'); const mailService = require('../../services/mail'); const api = require('./'); let mailer; -let _private = {}; +const _private = {}; const messages = { unableToSendEmail: 'Ghost is currently unable to send email.', diff --git a/ghost/core/core/server/api/endpoints/member-signin-urls.js b/ghost/core/core/server/api/endpoints/member-signin-urls.js index 0380b07a2b4..90cf97b0f89 100644 --- a/ghost/core/core/server/api/endpoints/member-signin-urls.js +++ b/ghost/core/core/server/api/endpoints/member-signin-urls.js @@ -17,7 +17,7 @@ const controller = { data: ['id'], permissions: true, async query(frame) { - let model = await membersService.api.members.get(frame.data, frame.options); + const model = await membersService.api.members.get(frame.data, frame.options); if (!model) { throw new errors.NotFoundError({ diff --git a/ghost/core/core/server/api/endpoints/members.js b/ghost/core/core/server/api/endpoints/members.js index 60cf8837af6..d59c3b23239 100644 --- a/ghost/core/core/server/api/endpoints/members.js +++ b/ghost/core/core/server/api/endpoints/members.js @@ -230,7 +230,7 @@ const controller = { }, }); } - let model = await membersService.api.memberBREADService.read( + const model = await membersService.api.memberBREADService.read( { id: frame.options.id }, { metafieldsFor: ADMIN }, ); @@ -273,7 +273,7 @@ const controller = { stripe_price_id: frame.data.stripe_price_id, }, }); - let model = await membersService.api.memberBREADService.read( + const model = await membersService.api.memberBREADService.read( { id: frame.options.id }, { metafieldsFor: ADMIN }, ); @@ -431,7 +431,7 @@ const controller = { async query() { const memberStats = await membersService.api.events.getStatuses(); const last = _.last(memberStats); - let totalMembers = last ? last.paid + last.free + last.comped + last.gift : 0; + const totalMembers = last ? last.paid + last.free + last.comped + last.gift : 0; return { resource: 'members', diff --git a/ghost/core/core/server/api/endpoints/oembed.js b/ghost/core/core/server/api/endpoints/oembed.js index 274a7ce34a5..bf63f6fce15 100644 --- a/ghost/core/core/server/api/endpoints/oembed.js +++ b/ghost/core/core/server/api/endpoints/oembed.js @@ -12,7 +12,7 @@ const controller = { data: ['url', 'type'], options: [], query({ data }) { - let { url, type } = data; + const { url, type } = data; return oembed.fetchOembedDataFromUrl(url, type); }, diff --git a/ghost/core/core/server/api/endpoints/posts.js b/ghost/core/core/server/api/endpoints/posts.js index c2230ba1923..f5a3c102091 100644 --- a/ghost/core/core/server/api/endpoints/posts.js +++ b/ghost/core/core/server/api/endpoints/posts.js @@ -231,7 +231,7 @@ const controller = { unsafeAttrs: unsafeAttrs, }, async query(frame) { - let model = await postsService.editPost(frame, { + const model = await postsService.editPost(frame, { eventHandler: (event, dto) => { const cacheInvalidate = getCacheHeaderFromEventString(event, dto); if (cacheInvalidate === true) { diff --git a/ghost/core/core/server/api/endpoints/settings.js b/ghost/core/core/server/api/endpoints/settings.js index f309f67b9fc..8415c3afa90 100644 --- a/ghost/core/core/server/api/endpoints/settings.js +++ b/ghost/core/core/server/api/endpoints/settings.js @@ -146,9 +146,9 @@ const controller = { }, }, async query(frame) { - let stripeConnectData = await getStripeConnectData(frame); + const stripeConnectData = await getStripeConnectData(frame); - let result = await settingsBREADService.edit( + const result = await settingsBREADService.edit( frame.data.settings, frame.options, stripeConnectData, diff --git a/ghost/core/core/server/api/endpoints/themes.js b/ghost/core/core/server/api/endpoints/themes.js index 90f6592cb69..dc1ba2b3e75 100644 --- a/ghost/core/core/server/api/endpoints/themes.js +++ b/ghost/core/core/server/api/endpoints/themes.js @@ -26,7 +26,7 @@ const controller = { }, permissions: true, async query() { - let themeName = settingsCache.get('active_theme'); + const themeName = settingsCache.get('active_theme'); const themeErrors = await themeService.api.getThemeErrors(themeName); return themeService.api.getJSON(themeName, themeErrors); }, @@ -46,7 +46,7 @@ const controller = { }, permissions: true, async query(frame) { - let themeName = frame.options.name; + const themeName = frame.options.name; if (limitService.isLimited('customThemes')) { await limitService.errorIfWouldGoOverLimit('customThemes', { value: themeName }); @@ -118,7 +118,7 @@ const controller = { // @NOTE: consistent filename uploads frame.options.originalname = frame.file.originalname.toLowerCase(); - let zip = { + const zip = { path: frame.file.path, name: frame.file.originalname, }; @@ -150,7 +150,7 @@ const controller = { method: 'read', }, query(frame) { - let themeName = frame.options.name; + const themeName = frame.options.name; return themeService.api.getZip(themeName); }, @@ -171,7 +171,7 @@ const controller = { }, permissions: true, query(frame) { - let themeName = frame.options.name; + const themeName = frame.options.name; return themeService.api.destroy(themeName); }, diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/input/pages.js b/ghost/core/core/server/api/endpoints/utils/serializers/input/pages.js index 8f600667bb0..c8d861677cc 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/input/pages.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/input/pages.js @@ -98,8 +98,8 @@ function defaultFormat(frame) { } function handlePostsMeta(frame) { - let metaAttrs = _.keys(_.omit(postsMetaSchema, ['id', 'post_id'])); - let meta = _.pick(frame.data.pages[0], metaAttrs); + const metaAttrs = _.keys(_.omit(postsMetaSchema, ['id', 'post_id'])); + const meta = _.pick(frame.data.pages[0], metaAttrs); frame.data.pages[0].posts_meta = meta; } diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js b/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js index a8b478612cb..05542114cd4 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/input/posts.js @@ -127,8 +127,8 @@ function defaultFormat(frame) { } function handlePostsMeta(frame) { - let metaAttrs = _.keys(_.omit(postsMetaSchema, ['id', 'post_id'])); - let meta = _.pick(frame.data.posts[0], metaAttrs); + const metaAttrs = _.keys(_.omit(postsMetaSchema, ['id', 'post_id'])); + const meta = _.pick(frame.data.posts[0], metaAttrs); frame.data.posts[0].posts_meta = meta; } diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/input/tags.js b/ghost/core/core/server/api/endpoints/utils/serializers/input/tags.js index 003dee46aa5..066278cec37 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/input/tags.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/input/tags.js @@ -5,7 +5,7 @@ const utils = require('../../index'); const { rejectTagsRestrictedOrderFields } = require('../../api-filter-utils'); function setDefaultOrder(frame) { - let defaultOrder = 'name asc'; + const defaultOrder = 'name asc'; if (!frame.options.order && frame.options.filter) { frame.options.autoOrder = slugFilterOrder('tags', frame.options.filter); diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js b/ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js index 1fcd5e2765b..9e0622818ff 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/input/utils/slug-filter-order.js @@ -1,10 +1,10 @@ const slugFilterOrder = (table, filter) => { - let orderMatch = filter.match(/slug:\s?\[(.*)\]/); + const orderMatch = filter.match(/slug:\s?\[(.*)\]/); if (orderMatch) { - let orderSlugs = orderMatch[1].split(','); - let caseParts = []; - let bindings = []; + const orderSlugs = orderMatch[1].split(','); + const caseParts = []; + const bindings = []; orderSlugs.forEach((slug, index) => { caseParts.push(`WHEN \`${table}\`.\`slug\` = ? THEN ?`); diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js b/ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js index d93bf4166d2..8d23aa2b4d4 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/output/mappers/posts.js @@ -121,7 +121,7 @@ module.exports = async (model, frame, options = {}) => { } // Transforms post/page metadata to flat structure - let metaAttrs = _.keys(_.omit(postsMetaSchema, ['id', 'post_id'])); + const metaAttrs = _.keys(_.omit(postsMetaSchema, ['id', 'post_id'])); _(metaAttrs) .filter((k) => { return !frame.options.columns || (frame.options.columns && frame.options.columns.includes(k)); diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/output/pages.js b/ghost/core/core/server/api/endpoints/utils/serializers/output/pages.js index 80bbb2c36e1..c67f35c70f5 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/output/pages.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/output/pages.js @@ -17,7 +17,7 @@ module.exports = { if (!models) { return; } - let pages = []; + const pages = []; const tiersPage = await tiersService.api.browse({}); const tiers = @@ -44,8 +44,8 @@ module.exports = { }) || []; if (models.meta) { - for (let model of models.data) { - let page = await mappers.pages(model, frame, { tiers }); + for (const model of models.data) { + const page = await mappers.pages(model, frame, { tiers }); pages.push(page); } frame.response = { @@ -55,7 +55,7 @@ module.exports = { return; } - let page = await mappers.pages(models, frame, { tiers }); + const page = await mappers.pages(models, frame, { tiers }); frame.response = { pages: [page], }; diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/output/posts.js b/ghost/core/core/server/api/endpoints/utils/serializers/output/posts.js index 7301eb3252f..9532c1ef448 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/output/posts.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/output/posts.js @@ -21,7 +21,7 @@ module.exports = { if (!models) { return; } - let posts = []; + const posts = []; const tiersPage = await tiersService.api.browse({}); const tiers = @@ -47,8 +47,8 @@ module.exports = { }; }) || []; if (models.meta) { - for (let model of models.data) { - let post = await mappers.posts(model, frame, { tiers }); + for (const model of models.data) { + const post = await mappers.posts(model, frame, { tiers }); posts.push(post); } frame.response = { @@ -58,7 +58,7 @@ module.exports = { return; } - let post = await mappers.posts(models, frame, { tiers }); + const post = await mappers.posts(models, frame, { tiers }); frame.response = { posts: [post], }; diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/output/search-index.js b/ghost/core/core/server/api/endpoints/utils/serializers/output/search-index.js index a230d4d6e6e..f48ad9b78e1 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/output/search-index.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/output/search-index.js @@ -8,8 +8,8 @@ module.exports = { async fetchPosts(models, apiConfig, frame) { debug('fetchPosts'); - let posts = []; - let keys = []; + const posts = []; + const keys = []; if (utils.isContentAPI(frame)) { keys.push('id', 'slug', 'title', 'excerpt', 'url', 'updated_at', 'visibility'); @@ -17,7 +17,7 @@ module.exports = { keys.push('id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility'); } - for (let model of models.data) { + for (const model of models.data) { let post = await mappers.posts(model, frame, {}); post = _.pick(post, keys); posts.push(post); @@ -31,11 +31,11 @@ module.exports = { async fetchPages(models, apiConfig, frame) { debug('fetchPages'); - let pages = []; + const pages = []; const keys = ['id', 'uuid', 'url', 'title', 'slug', 'status', 'published_at', 'visibility']; - for (let model of models.data) { + for (const model of models.data) { let page = await mappers.pages(model, frame, {}); page = _.pick(page, keys); pages.push(page); @@ -49,11 +49,11 @@ module.exports = { async fetchTags(models, apiConfig, frame) { debug('fetchTags'); - let tags = []; + const tags = []; const keys = ['id', 'slug', 'name', 'url']; - for (let model of models.data) { + for (const model of models.data) { let tag = await mappers.tags(model, frame); tag = _.pick(tag, keys); tags.push(tag); @@ -67,11 +67,11 @@ module.exports = { async fetchAuthors(models, apiConfig, frame) { debug('fetchAuthors'); - let authors = []; + const authors = []; const keys = ['id', 'slug', 'name', 'url', 'profile_image']; - for (let model of models.data) { + for (const model of models.data) { let author = await mappers.authors(model, frame); author = _.pick(author, keys); authors.push(author); @@ -85,11 +85,11 @@ module.exports = { async fetchUsers(models, apiConfig, frame) { debug('fetchUsers'); - let users = []; + const users = []; const keys = ['id', 'slug', 'name', 'url', 'profile_image']; - for (let model of models.data) { + for (const model of models.data) { let user = await mappers.users(model, frame); user = _.pick(user, keys); users.push(user); diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/output/settings.js b/ghost/core/core/server/api/endpoints/utils/serializers/output/settings.js index edcf3864088..3a434ba00e4 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/output/settings.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/output/settings.js @@ -12,7 +12,7 @@ const mappers = require('./mappers'); * @returns {*} */ function settingsFilter(settings, filter) { - let filteredGroups = filter ? filter.split(',') : []; + const filteredGroups = filter ? filter.split(',') : []; return _.filter(settings, (setting) => { if (filteredGroups.length > 0) { return _.includes(filteredGroups, setting.group); diff --git a/ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js b/ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js index a34420a1f4b..790c0a5e7ac 100644 --- a/ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js +++ b/ghost/core/core/server/api/endpoints/utils/serializers/output/utils/extra-attrs.js @@ -23,7 +23,7 @@ module.exports.forPost = (options, model, attrs) => { // 1. Gets excerpt from post's plaintext. If custom_excerpt exists, it overrides the excerpt but the key remains excerpt. if (columnsIncludesExcerpt) { if (!attrs.custom_excerpt) { - let plaintext = model.get('plaintext'); + const plaintext = model.get('plaintext'); if (plaintext) { attrs.excerpt = plaintext.substring(0, 500); } else { @@ -39,7 +39,7 @@ module.exports.forPost = (options, model, attrs) => { } if (columnsIncludesPlaintext || formatsIncludesPlaintext) { - let plaintext = model.get('plaintext'); + const plaintext = model.get('plaintext'); if (plaintext) { attrs.plaintext = plaintext; } else { @@ -49,7 +49,7 @@ module.exports.forPost = (options, model, attrs) => { // 3. Displays excerpt if no columns was requested - specifically needed for the Admin Posts API if (noColumnsRequested) { - let customExcerpt = model.get('custom_excerpt'); + const customExcerpt = model.get('custom_excerpt'); if (customExcerpt !== null) { attrs.excerpt = customExcerpt; diff --git a/ghost/core/core/server/data/importer/handlers/image.js b/ghost/core/core/server/data/importer/handlers/image.js index 6740546bfaa..736dd3c10ba 100644 --- a/ghost/core/core/server/data/importer/handlers/image.js +++ b/ghost/core/core/server/data/importer/handlers/image.js @@ -3,9 +3,8 @@ const path = require('path'); const config = require('../../../../shared/config'); const urlUtils = require('../../../../shared/url-utils').default; const adapterManager = require('../../../services/adapter-manager').default; -let ImageHandler; -ImageHandler = { +const ImageHandler = { type: 'images', extensions: config.get('uploads').images.extensions, contentTypes: config.get('uploads').images.contentTypes, diff --git a/ghost/core/core/server/data/importer/handlers/json.js b/ghost/core/core/server/data/importer/handlers/json.js index f316afa5499..2a4493423c3 100644 --- a/ghost/core/core/server/data/importer/handlers/json.js +++ b/ghost/core/core/server/data/importer/handlers/json.js @@ -9,9 +9,7 @@ const messages = { checkImportJsonIsValid: 'check that the import file is valid JSON.', }; -let JSONHandler; - -JSONHandler = { +const JSONHandler = { type: 'data', extensions: ['.json'], contentTypes: ['application/octet-stream', 'application/json'], diff --git a/ghost/core/core/server/data/importer/handlers/markdown.js b/ghost/core/core/server/data/importer/handlers/markdown.js index 177d348be2f..626fa14bb84 100644 --- a/ghost/core/core/server/data/importer/handlers/markdown.js +++ b/ghost/core/core/server/data/importer/handlers/markdown.js @@ -5,13 +5,9 @@ const featuredImageRegex = /^(!\[]\(([^)]*?)\)\s+)(?=#)/; const titleRegex = /^#\s?([\w\W]*?)(?=\n)/; const statusRegex = /(published||draft)-/; const dateRegex = /(\d{4}-\d{2}-\d{2})-/; -let processDateTime; -let processFileName; -let processMarkdownFile; -let MarkdownHandler; // Takes a date from the filename in y-m-d-h-m form, and converts it into a Date ready to import -processDateTime = function (post, datetime) { +const processDateTime = function (post, datetime) { const format = 'YYYY-MM-DD-HH-mm'; datetime = moment.utc(datetime, format).valueOf(); @@ -24,7 +20,7 @@ processDateTime = function (post, datetime) { return post; }; -processFileName = function (filename) { +const processFileName = function (filename) { let post = {}; let name = filename.split('.')[0]; let match; @@ -50,7 +46,7 @@ processFileName = function (filename) { return post; }; -processMarkdownFile = function (filename, content) { +const processMarkdownFile = function (filename, content) { const post = processFileName(filename); let match; @@ -77,7 +73,7 @@ processMarkdownFile = function (filename, content) { return post; }; -MarkdownHandler = { +const MarkdownHandler = { type: 'data', extensions: ['.md', '.markdown'], contentTypes: ['application/octet-stream', 'text/plain'], diff --git a/ghost/core/core/server/data/importer/import-manager.js b/ghost/core/core/server/data/importer/import-manager.js index 4763144405b..221b6afdd03 100644 --- a/ghost/core/core/server/data/importer/import-manager.js +++ b/ghost/core/core/server/data/importer/import-manager.js @@ -29,7 +29,7 @@ const messages = { zipContainsMultipleDataFormats: 'Zip file contains multiple data formats. Please split up and import separately.', }; -let defaults = { +const defaults = { extensions: ['.zip'], contentTypes: ['application/zip', 'application/x-zip-compressed'], directories: [], diff --git a/ghost/core/core/server/data/importer/importers/content-file-importer.js b/ghost/core/core/server/data/importer/importers/content-file-importer.js index 0538e2b8cff..6134686647f 100644 --- a/ghost/core/core/server/data/importer/importers/content-file-importer.js +++ b/ghost/core/core/server/data/importer/importers/content-file-importer.js @@ -1,11 +1,7 @@ const _ = require('lodash'); const path = require('node:path'); -let replaceImage; -let preProcessPosts; -let preProcessTags; -let preProcessUsers; -replaceImage = function (markdown, image) { +const replaceImage = function (markdown, image) { if (!markdown) { return; } @@ -34,7 +30,7 @@ replaceImage = function (markdown, image) { * @param {string} contentFile.originalPath * @param {string} contentFile.newPath */ -preProcessPosts = function (data, contentFile) { +const preProcessPosts = function (data, contentFile) { _.each(data.posts, function (post) { post.markdown = replaceImage(post.markdown, contentFile); if (post.html) { @@ -52,7 +48,7 @@ preProcessPosts = function (data, contentFile) { }); }; -preProcessTags = function (data, image) { +const preProcessTags = function (data, image) { _.each(data.tags, function (tag) { if (tag.feature_image) { tag.feature_image = replaceImage(tag.feature_image, image); @@ -60,7 +56,7 @@ preProcessTags = function (data, image) { }); }; -preProcessUsers = function (data, image) { +const preProcessUsers = function (data, image) { _.each(data.users, function (user) { if (user.cover_image) { user.cover_image = replaceImage(user.cover_image, image); diff --git a/ghost/core/core/server/data/importer/importers/data/base.js b/ghost/core/core/server/data/importer/importers/data/base.js index 56ec6315d4e..9686af830e9 100644 --- a/ghost/core/core/server/data/importer/importers/data/base.js +++ b/ghost/core/core/server/data/importer/importers/data/base.js @@ -70,7 +70,7 @@ class Base { sanitizeValues() { _.each(this.dataToImport, (obj) => { _.each(_.pick(obj, ['updated_at', 'created_at', 'published_at']), (value, key) => { - let temporaryDate = new Date(value); + const temporaryDate = new Date(value); if (isNaN(temporaryDate)) { this.problems.push({ @@ -109,8 +109,8 @@ class Base { } handleError(errs, obj) { - let errorsToReject = []; - let problems = []; + const errorsToReject = []; + const problems = []; // CASE: validation errors, see models/base/events.js onValidate if (!Array.isArray(errs)) { @@ -190,7 +190,7 @@ class Base { } }).id; - let userReferenceProblems = {}; + const userReferenceProblems = {}; const handleObject = (obj, key) => { if (!Object.prototype.hasOwnProperty.call(obj, key)) { @@ -214,11 +214,11 @@ class Base { } // CASE: first match the user reference with in the imported file - let userFromFile = _.find(this.requiredFromFile.users, { id: obj[key] }); + const userFromFile = _.find(this.requiredFromFile.users, { id: obj[key] }); if (!userFromFile) { // CASE: if user does not exist in file, try to lookup the existing db users - let existingUser = _.find(this.requiredExistingData.users, { id: obj[key].toString() }); + const existingUser = _.find(this.requiredExistingData.users, { id: obj[key].toString() }); // CASE: fallback to owner if (!existingUser) { @@ -240,7 +240,7 @@ class Base { // Result: `this.requiredImportedData.users` will be empty. // We already generate identifiers for each object in the importer layer. Accessible via `dataToImport`. if (this.modelName === 'User' && !this.requiredImportedData.users.length) { - let userToImport = _.find(this.dataToImport, { slug: userFromFile.slug }); + const userToImport = _.find(this.dataToImport, { slug: userFromFile.slug }); if (userToImport) { obj[key] = userToImport.id; @@ -253,7 +253,7 @@ class Base { // CASE: user exists in the file, let's find his db id // NOTE: lookup by email, because slug can change on insert - let importedUser = _.find(this.requiredImportedData.users, { email: userFromFile.email }); + const importedUser = _.find(this.requiredImportedData.users, { email: userFromFile.email }); // CASE: found. let's assign the new ID if (importedUser) { @@ -320,7 +320,7 @@ class Base { async doImport(options, importOptions) { debug('doImport', this.modelName, this.dataToImport.length); - let ops = []; + const ops = []; _.each(this.dataToImport, (obj, index) => { ops.push(async () => { diff --git a/ghost/core/core/server/data/importer/importers/data/custom-theme-settings-importer.js b/ghost/core/core/server/data/importer/importers/data/custom-theme-settings-importer.js index dc9f3eb603a..6a5dc009886 100644 --- a/ghost/core/core/server/data/importer/importers/data/custom-theme-settings-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/custom-theme-settings-importer.js @@ -20,7 +20,7 @@ class CustomThemeSettingsImporter extends BaseImporter { async doImport(options, importOptions) { debug('doImport', this.modelName, this.dataToImport.length); - let ops = []; + const ops = []; _.each(this.dataToImport, (item) => { ops.push(async () => { diff --git a/ghost/core/core/server/data/importer/importers/data/data-importer.js b/ghost/core/core/server/data/importer/importers/data/data-importer.js index e74a4e16dff..8fb32724cc6 100644 --- a/ghost/core/core/server/data/importer/importers/data/data-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/data-importer.js @@ -17,10 +17,9 @@ const RevueSubscriberImporter = require('./revue-subscriber-importer'); const RolesImporter = require('./roles-importer'); const { slugify } = require('@tryghost/string/lib'); -let importers = {}; -let DataImporter; +const importers = {}; -DataImporter = { +const DataImporter = { type: 'data', preProcess: function preProcess(importData) { @@ -78,7 +77,7 @@ DataImporter = { const ops = []; let problems = []; let errors = []; - let importedData = {}; + const importedData = {}; const modelOptions = { importing: true, diff --git a/ghost/core/core/server/data/importer/importers/data/posts-importer.js b/ghost/core/core/server/data/importer/importers/data/posts-importer.js index a7162855459..799cc90bc65 100644 --- a/ghost/core/core/server/data/importer/importers/data/posts-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/posts-importer.js @@ -57,9 +57,9 @@ class PostsImporter extends BaseImporter { * Sanitizes post metadata, picking data from sepearate table(for >= v3) or post itself(for < v3) */ sanitizePostsMeta(model) { - let postsMetaFromFile = + const postsMetaFromFile = _.find(this.requiredFromFile.posts_meta, { post_id: model.id }) || _.pick(model, metaAttrs); - let postsMetaData = Object.assign( + const postsMetaData = Object.assign( {}, _.mapValues(postsMetaSchema, (value) => { return Reflect.has(value, 'defaultTo') ? value.defaultTo : null; @@ -103,7 +103,7 @@ class PostsImporter extends BaseImporter { return; } - let postToImport = _.find(this.dataToImport, { id: relation.post_id }); + const postToImport = _.find(this.dataToImport, { id: relation.post_id }); // CASE: we won't import a relation when the target post does not exist if (!postToImport) { @@ -143,13 +143,13 @@ class PostsImporter extends BaseImporter { return; } - let indexesToRemove = []; + const indexesToRemove = []; _.each(postToImport[targetProperty], (object, index) => { // this is the original relational object (old id) - let objectInFile = _.find(this.requiredFromFile[tableName], { id: object.id }); + const objectInFile = _.find(this.requiredFromFile[tableName], { id: object.id }); if (!objectInFile) { - let existingObject = _.find(this.requiredExistingData[tableName], { id: object.id }); + const existingObject = _.find(this.requiredExistingData[tableName], { id: object.id }); // CASE: is not in file, is not in db if (!existingObject) { @@ -177,7 +177,7 @@ class PostsImporter extends BaseImporter { } // CASE: search through existing data by unique attribute - let existingObject = _.find(this.requiredExistingData[tableName], { + const existingObject = _.find(this.requiredExistingData[tableName], { slug: objectInFile.slug, }); @@ -317,7 +317,7 @@ class PostsImporter extends BaseImporter { // NOTE: We only support removing duplicate posts within the file to import. // For any further future duplication detection, see https://github.com/TryGhost/Ghost/issues/8717. - let slugs = []; + const slugs = []; this.dataToImport = _.filter(this.dataToImport, (post) => { if (!!post.slug && slugs.indexOf(post.slug) !== -1) { this.problems.push({ diff --git a/ghost/core/core/server/data/importer/importers/data/products-importer.js b/ghost/core/core/server/data/importer/importers/data/products-importer.js index 7c0c1a81a57..b45a866b84c 100644 --- a/ghost/core/core/server/data/importer/importers/data/products-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/products-importer.js @@ -63,7 +63,7 @@ class ProductsImporter extends BaseImporter { validateStripePrice() { // the stripe price either needs to exist in the current db, // or be imported as part of the same import - let invalidProducts = []; + const invalidProducts = []; _.each(['monthly_price_id', 'yearly_price_id'], (field) => { _.each(this.dataToImport, (objectInFile) => { const importedObject = _.find(this.requiredFromFile.stripe_prices, { @@ -90,7 +90,7 @@ class ProductsImporter extends BaseImporter { preventDuplicates() { debug('preventDuplicates'); - let duplicateProducts = []; + const duplicateProducts = []; _.each(this.dataToImport, (objectInFile) => { const existingObject = _.find(this.requiredExistingData.products, { name: objectInFile.name, @@ -114,7 +114,7 @@ class ProductsImporter extends BaseImporter { } preventInvalidFree() { - let invalidFreeProducts = []; + const invalidFreeProducts = []; _.each(this.dataToImport, (product) => { // A free product must not have any pricing data (otherwise it wouldn't be free, duh!) if ( diff --git a/ghost/core/core/server/data/importer/importers/data/settings-importer.js b/ghost/core/core/server/data/importer/importers/data/settings-importer.js index 7ca5f4dc486..a2a605b0fc5 100644 --- a/ghost/core/core/server/data/importer/importers/data/settings-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/settings-importer.js @@ -145,7 +145,7 @@ class SettingsImporter extends BaseImporter { if (deprecatedSettingValue) { deprecatedSupportedSettingsOneToManyMap[key].forEach(({ from, to }) => { - let value = _.isObject(deprecatedSettingValue) + const value = _.isObject(deprecatedSettingValue) ? _.get(deprecatedSettingValue, from) : deprecatedSetting.value; @@ -274,7 +274,7 @@ class SettingsImporter extends BaseImporter { async doImport(options) { debug('doImport', this.dataToImport.length); - let ops = []; + const ops = []; _.each(this.dataToImport, (model) => { ops.push(async () => { diff --git a/ghost/core/core/server/data/importer/importers/data/stripe-prices-importer.js b/ghost/core/core/server/data/importer/importers/data/stripe-prices-importer.js index 885d65d4ff8..8692c92eb10 100644 --- a/ghost/core/core/server/data/importer/importers/data/stripe-prices-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/stripe-prices-importer.js @@ -23,7 +23,7 @@ class StripePricesImporter extends BaseImporter { validateStripeProduct() { // ensure we have a valid stripe_product_id in the stripe_products table - let invalidPrices = []; + const invalidPrices = []; _.each(this.dataToImport, (objectInFile) => { const importedObject = _.find(this.requiredImportedData.stripe_products, { stripe_product_id: objectInFile.stripe_product_id, diff --git a/ghost/core/core/server/data/importer/importers/data/stripe-products-importer.js b/ghost/core/core/server/data/importer/importers/data/stripe-products-importer.js index ebf1dccd852..15d29dba01e 100644 --- a/ghost/core/core/server/data/importer/importers/data/stripe-products-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/stripe-products-importer.js @@ -34,7 +34,7 @@ class StripeProductsImporter extends BaseImporter { debug('replaceIdentifiers'); // map product_id -> product.id - let invalidProducts = []; + const invalidProducts = []; _.each(this.dataToImport, (objectInFile) => { const importedObject = _.find(this.requiredImportedData.products, { originalId: objectInFile.product_id, diff --git a/ghost/core/core/server/data/importer/importers/data/tags-importer.js b/ghost/core/core/server/data/importer/importers/data/tags-importer.js index e82abdfcb74..966a9766ce7 100644 --- a/ghost/core/core/server/data/importer/importers/data/tags-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/tags-importer.js @@ -36,7 +36,7 @@ class TagsImporter extends BaseImporter { async doImport(options, importOptions) { debug('doImport', this.modelName, this.dataToImport.length); - let ops = []; + const ops = []; _.each(this.dataToImport, (obj) => { ops.push(async () => { diff --git a/ghost/core/core/server/data/importer/importers/data/users-importer.js b/ghost/core/core/server/data/importer/importers/data/users-importer.js index e339deae952..4b02783d0cc 100644 --- a/ghost/core/core/server/data/importer/importers/data/users-importer.js +++ b/ghost/core/core/server/data/importer/importers/data/users-importer.js @@ -33,7 +33,7 @@ class UsersImporter extends BaseImporter { debug('beforeImport'); let role; - let lookup = {}; + const lookup = {}; // NOTE: sort out duplicated roles based on incremental id _.each(this.requiredFromFile.roles_users, (attachedRole) => { diff --git a/ghost/core/core/server/data/importer/importers/json-to-html.js b/ghost/core/core/server/data/importer/importers/json-to-html.js index 1c9e270ffb6..841f15f0813 100644 --- a/ghost/core/core/server/data/importer/importers/json-to-html.js +++ b/ghost/core/core/server/data/importer/importers/json-to-html.js @@ -25,9 +25,9 @@ const getValidURL = (url) => { // Take the array of items for a specific post and return the converted HTML const itemsToHtml = (items) => { - let itemHTMLChunks = []; + const itemHTMLChunks = []; items.forEach((item) => { - let type = item.item_type; + const type = item.item_type; if (type === 'header') { itemHTMLChunks.push(`

                              ${item.title}

                              `); @@ -37,7 +37,7 @@ const itemsToHtml = (items) => { // We have 2 values to work with here. `image` is smaller and most suitable, and `original_image_url` is the full-res that would need to be resized // - item.image (https://s3.amazonaws.com/revue/items/images/019/005/542/web/anita-austvika-C-JUrfmYqcw-unsplash.jpg?1667924147) // - item.original_image_url (https://s3.amazonaws.com/revue/items/images/019/005/542/original/anita-austvika-C-JUrfmYqcw-unsplash.jpg?1667924147) - let cardOpts = { + const cardOpts = { env: { dom: new SimpleDom.Document() }, payload: { src: item.image, @@ -50,7 +50,7 @@ const itemsToHtml = (items) => { // This could be a bookmark, or it could be a paragraph of text with a linked header, there's no way to tell // The safest option here is to output an image with text under it const itemURL = getValidURL(item.url); - let cardOpts = { + const cardOpts = { env: { dom: new SimpleDom.Document() }, payload: { src: item.image, @@ -62,7 +62,7 @@ const itemsToHtml = (items) => { const linkTitleHTML = itemURL ? `${item.title}` : item.title; - let linkHTML = `

                              ${linkTitleHTML}

                              ${item.description}`; + const linkHTML = `

                              ${linkTitleHTML}

                              ${item.description}`; itemHTMLChunks.push(linkHTML); } else if (type === 'tweet') { // Should this be an oEmbed call? Probably. @@ -76,19 +76,22 @@ const itemsToHtml = (items) => { const isVimeo = /vimeo.com/.test(item.url); let videoHTML = ''; if (isLongYouTube) { - let videoID = item.url.replace( + const videoID = item.url.replace( /https?:\/\/(?:www\.)?youtube\.com\/watch\?v=([a-zA-Z0-9_-]*)/gi, '$1', ); videoHTML = ``; } else if (isShortYouTube) { - let videoID = item.url.replace(/https?:\/\/(?:www\.)?youtu\.be\/([a-zA-Z0-9_-]*)/gi, '$1'); + const videoID = item.url.replace( + /https?:\/\/(?:www\.)?youtu\.be\/([a-zA-Z0-9_-]*)/gi, + '$1', + ); videoHTML = ``; } else if (isVimeo) { - let videoID = item.url.replace(/https?:\/\/(?:www\.)?vimeo\.com\/([0-9]+)/gi, '$1'); + const videoID = item.url.replace(/https?:\/\/(?:www\.)?vimeo\.com\/([0-9]+)/gi, '$1'); videoHTML = ``; } - let cardOpts = { + const cardOpts = { env: { dom: new SimpleDom.Document() }, payload: { html: videoHTML, diff --git a/ghost/core/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js b/ghost/core/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js index 3879e2e4ced..362c35bc8da 100644 --- a/ghost/core/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js +++ b/ghost/core/core/server/data/migrations/versions/5.0/2022-05-11-13-12-rename-settings.js @@ -27,7 +27,7 @@ module.exports = createTransactionalMigration( _.find(settings, { key: renameMapping.to }) && _.find(settings, { key: renameMapping.from }) ) { - let updatedValue = _.find(settings, { key: renameMapping.from }).value; + const updatedValue = _.find(settings, { key: renameMapping.from }).value; // CASE: default settings were added already, update them with old values & remove old settings logging.info(`Updating ${renameMapping.to} with value from ${renameMapping.from}`); await knex('settings').where('key', renameMapping.to).update('value', updatedValue); diff --git a/ghost/core/core/server/data/seeders/importers/email-recipients-importer.js b/ghost/core/core/server/data/seeders/importers/email-recipients-importer.js index 01d005498ba..513d6302154 100644 --- a/ghost/core/core/server/data/seeders/importers/email-recipients-importer.js +++ b/ghost/core/core/server/data/seeders/importers/email-recipients-importer.js @@ -18,7 +18,7 @@ function findFirstHigherIndex(arr, target) { let result = -1; while (start <= end) { - let mid = Math.floor((start + end) / 2); + const mid = Math.floor((start + end) / 2); if (arr[mid] >= target) { result = mid; @@ -162,7 +162,7 @@ class EmailRecipientsImporter extends TableImporter { failedCount: this.model.failed_count, }; - let offset = this.batchIndex * 1000; + const offset = this.batchIndex * 1000; // We always first create the failures, then the opened, then the delivered, so we need to remove those from the meta so we don't generate them multiple times this.emailMeta = { diff --git a/ghost/core/core/server/data/seeders/importers/members-login-events-importer.js b/ghost/core/core/server/data/seeders/importers/members-login-events-importer.js index a7e0dd37384..12a7a194ceb 100644 --- a/ghost/core/core/server/data/seeders/importers/members-login-events-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-login-events-importer.js @@ -17,7 +17,7 @@ class MembersLoginEventsImporter extends TableImporter { } let offset = 0; - let limit = 100000; + const limit = 100000; while (true) { const members = await this.transaction diff --git a/ghost/core/core/server/data/seeders/importers/members-newsletters-importer.js b/ghost/core/core/server/data/seeders/importers/members-newsletters-importer.js index 697d5e31437..ed6538c4dad 100644 --- a/ghost/core/core/server/data/seeders/importers/members-newsletters-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-newsletters-importer.js @@ -10,7 +10,7 @@ class MembersNewslettersImporter extends TableImporter { async import(quantity) { let offset = 0; - let limit = 100000; + const limit = 100000; while (true) { const membersSubscribeEvents = await this.transaction diff --git a/ghost/core/core/server/data/seeders/importers/members-paid-subscription-events-importer.js b/ghost/core/core/server/data/seeders/importers/members-paid-subscription-events-importer.js index a2b66f1dc75..aa79133c10b 100644 --- a/ghost/core/core/server/data/seeders/importers/members-paid-subscription-events-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-paid-subscription-events-importer.js @@ -10,7 +10,7 @@ class MembersPaidSubscriptionEventsImporter extends TableImporter { async import() { let offset = 0; - let limit = 1000; + const limit = 1000; while (true) { const subscriptions = await this.transaction diff --git a/ghost/core/core/server/data/seeders/importers/members-status-events-importer.js b/ghost/core/core/server/data/seeders/importers/members-status-events-importer.js index fa94b04bd8a..9623ac94284 100644 --- a/ghost/core/core/server/data/seeders/importers/members-status-events-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-status-events-importer.js @@ -12,7 +12,7 @@ class MembersStatusEventsImporter extends TableImporter { async import(quantity) { let offset = 0; - let limit = 100000; + const limit = 100000; while (true) { const members = await this.transaction diff --git a/ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js b/ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js index 132caa85d5e..0f27374ee41 100644 --- a/ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-stripe-customers-importer.js @@ -16,7 +16,7 @@ class MembersStripeCustomersImporter extends TableImporter { } let offset = 0; - let limit = 100000; + const limit = 100000; while (true) { const members = await this.transaction diff --git a/ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js b/ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js index 936e4664562..acaa38d2d50 100644 --- a/ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-stripe-customers-subscriptions-importer.js @@ -21,7 +21,7 @@ class MembersStripeCustomersSubscriptionsImporter extends TableImporter { async import() { let offset = 0; - let limit = 5000; + const limit = 5000; this.products = await this.transaction .select('id', 'name') .from('products') diff --git a/ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js b/ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js index 58ee7f187c2..5aa36328409 100644 --- a/ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-subscribe-events-importer.js @@ -16,7 +16,7 @@ class MembersSubscribeEventsImporter extends TableImporter { } let offset = 0; - let limit = 100000; + const limit = 100000; this.newsletters = await this.transaction .select('id') .from('newsletters') @@ -54,7 +54,7 @@ class MembersSubscribeEventsImporter extends TableImporter { return null; } - let subscribed = luck(80); + const subscribed = luck(80); if (!subscribed) { return null; diff --git a/ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js b/ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js index a422a14e2be..41d518b1212 100644 --- a/ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js +++ b/ghost/core/core/server/data/seeders/importers/members-subscription-created-events-importer.js @@ -18,7 +18,7 @@ class MembersSubscriptionCreatedEventsImporter extends TableImporter { async import(quantity) { let offset = 0; - let limit = 1000; + const limit = 1000; this.posts = await this.transaction .select('id', 'published_at', 'visibility', 'type', 'slug') .from('posts') diff --git a/ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js b/ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js index 8df2dec8b56..1325ea32cc3 100644 --- a/ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js +++ b/ghost/core/core/server/data/tinybird/scripts/docker-analytics-manager.js @@ -361,7 +361,7 @@ class DockerAnalyticsManager { const userSessionData = this.userSessions.get(userKey); - for (let session of userSessionData) { + for (const session of userSessionData) { const timeDiff = (timestamp.getTime() - session.startTime.getTime()) / (1000 * 60 * 60); if (timeDiff <= 3 && timeDiff >= 0) { return session.sessionId; @@ -571,7 +571,7 @@ class DockerAnalyticsManager { // Generate base timestamp for this session const firstContent = this.selectContent(); - let baseTimestamp = this.generateTimestamp(firstContent.published_at); + const baseTimestamp = this.generateTimestamp(firstContent.published_at); // Generate consistent session attributes const memberStatus = this.weightedChoice(this.memberStatusWeights); diff --git a/ghost/core/core/server/lib/image/image-size.js b/ghost/core/core/server/lib/image/image-size.js index bcdae3bd647..634c9ad4382 100644 --- a/ghost/core/core/server/lib/image/image-size.js +++ b/ghost/core/core/server/lib/image/image-size.js @@ -273,12 +273,10 @@ class ImageSize { * @returns {object} imageObject or error */ getImageSizeFromStoragePath(imagePath) { - let filePath; - imagePath = this.urlUtils.urlFor('image', { image: imagePath }, true); // get the storage readable filePath - filePath = this.storageUtils.getLocalImagesStoragePath(imagePath); + const filePath = this.storageUtils.getLocalImagesStoragePath(imagePath); return this.imageStore .read({ path: filePath }) diff --git a/ghost/core/core/server/models/base/plugins/actions.js b/ghost/core/core/server/models/base/plugins/actions.js index 816a65c5ec8..a8f39d5cd07 100644 --- a/ghost/core/core/server/models/base/plugins/actions.js +++ b/ghost/core/core/server/models/base/plugins/actions.js @@ -98,7 +98,7 @@ module.exports = function (Bookshelf) { return; } - let context = { + const context = { action_name: options.actionName, }; diff --git a/ghost/core/core/server/models/base/plugins/crud.js b/ghost/core/core/server/models/base/plugins/crud.js index c386a1f025a..a87adac8995 100644 --- a/ghost/core/core/server/models/base/plugins/crud.js +++ b/ghost/core/core/server/models/base/plugins/crud.js @@ -302,10 +302,9 @@ module.exports = function (Bookshelf) { */ add: function add(data, unfilteredOptions) { const options = this.filterOptions(unfilteredOptions, 'add'); - let model; data = this.filterData(data); - model = this.forge(data); + const model = this.forge(data); // We allow you to disable timestamps when importing posts so that the new posts `updated_at` value is the same // as the import json blob. More details refer to https://github.com/TryGhost/Ghost/issues/1696 diff --git a/ghost/core/core/server/models/base/plugins/events.js b/ghost/core/core/server/models/base/plugins/events.js index 68474cc2272..ed5e9bb7f8b 100644 --- a/ghost/core/core/server/models/base/plugins/events.js +++ b/ghost/core/core/server/models/base/plugins/events.js @@ -8,7 +8,7 @@ const schema = require('../../../data/schema'); const events = require('../../../lib/common/events'); // Run tests or development with NUMERIC_IDS=1 to enable numeric object IDs -let forceNumericObjectIds = process.env.NODE_ENV !== 'production' && !!process.env.NUMERIC_IDS; +const forceNumericObjectIds = process.env.NODE_ENV !== 'production' && !!process.env.NUMERIC_IDS; let numberGenerator = 0; module.exports = function (Bookshelf) { diff --git a/ghost/core/core/server/models/base/plugins/raw-knex.js b/ghost/core/core/server/models/base/plugins/raw-knex.js index 5381e95ccca..4e24bc0ff45 100644 --- a/ghost/core/core/server/models/base/plugins/raw-knex.js +++ b/ghost/core/core/server/models/base/plugins/raw-knex.js @@ -66,7 +66,7 @@ module.exports = function (Bookshelf) { }, }; - let query = Bookshelf.knex(tableNames[modelName]); + const query = Bookshelf.knex(tableNames[modelName]); if (orderBy) { query.orderBy(orderBy); @@ -111,7 +111,7 @@ module.exports = function (Bookshelf) { return []; } - let props = {}; + const props = {}; if (!withRelated) { return _.map(objects, (object) => { @@ -136,7 +136,7 @@ module.exports = function (Bookshelf) { props[relation.name] = (async () => { debug('fetch withRelated', relation.name); - let relationQuery = Bookshelf.knex(relation.targetTable); + const relationQuery = Bookshelf.knex(relation.targetTable); // default fields to select _.each(relation.select, (fieldToSelect) => { diff --git a/ghost/core/core/server/models/benefit.js b/ghost/core/core/server/models/benefit.js index 29c1684c179..5c48407a5fe 100644 --- a/ghost/core/core/server/models/benefit.js +++ b/ghost/core/core/server/models/benefit.js @@ -7,7 +7,7 @@ const Benefit = ghostBookshelf.Model.extend( async onSaving(model, attr, options) { ghostBookshelf.Model.prototype.onSaving.call(this, model, attr, options); // Make sure name is trimmed of extra spaces - let name = this.get('name') && this.get('name').trim(); + const name = this.get('name') && this.get('name').trim(); this.set('name', name); if (this.hasChanged('slug') || (!this.get('slug') && this.get('name'))) { // Pass the new slug through the generator to strip illegal characters, detect duplicates diff --git a/ghost/core/core/server/models/collection.js b/ghost/core/core/server/models/collection.js index 4d1e2dcbf4e..3f91afcd006 100644 --- a/ghost/core/core/server/models/collection.js +++ b/ghost/core/core/server/models/collection.js @@ -92,7 +92,7 @@ const Collection = ghostBookshelf.Model.extend({ }, permittedAttributes() { - let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments); + const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments); this.relationships.forEach((key) => { filteredKeys.push(key); diff --git a/ghost/core/core/server/models/comment.js b/ghost/core/core/server/models/comment.js index 4f86bafe39f..a5abbbccccc 100644 --- a/ghost/core/core/server/models/comment.js +++ b/ghost/core/core/server/models/comment.js @@ -180,7 +180,7 @@ const Comment = ghostBookshelf.Model.extend( }, orderAttributes: function orderAttributes() { - let keys = ghostBookshelf.Model.prototype.orderAttributes.call(this, arguments); + const keys = ghostBookshelf.Model.prototype.orderAttributes.call(this, arguments); keys.push('count__likes'); keys.push('count__net_score'); keys.push('count__reports'); @@ -209,7 +209,7 @@ const Comment = ghostBookshelf.Model.extend( }, { destroy: function destroy(unfilteredOptions) { - let options = this.filterOptions(unfilteredOptions, 'destroy', { + const options = this.filterOptions(unfilteredOptions, 'destroy', { extraAllowedProperties: ['id'], }); @@ -492,7 +492,7 @@ const Comment = ghostBookshelf.Model.extend( * @return {Array} Keys allowed in the `options` hash of the model's method. */ permittedOptions: function permittedOptions(methodName) { - let options = ghostBookshelf.Model.permittedOptions.call(this, methodName); + const options = ghostBookshelf.Model.permittedOptions.call(this, methodName); options.push('parentId'); options.push('isAdmin'); options.push('browseAll'); diff --git a/ghost/core/core/server/models/invite.js b/ghost/core/core/server/models/invite.js index 65ac79514fa..7b56f5f1ede 100644 --- a/ghost/core/core/server/models/invite.js +++ b/ghost/core/core/server/models/invite.js @@ -15,10 +15,7 @@ const messages = { notAllowedToInvite: 'Not allowed to invite this role.', }; -let Invite; -let Invites; - -Invite = ghostBookshelf.Model.extend( +const Invite = ghostBookshelf.Model.extend( { tableName: 'invites', @@ -142,7 +139,7 @@ Invite = ghostBookshelf.Model.extend( }, ); -Invites = ghostBookshelf.Collection.extend({ +const Invites = ghostBookshelf.Collection.extend({ model: Invite, }); diff --git a/ghost/core/core/server/models/label.js b/ghost/core/core/server/models/label.js index de7371cf4af..7ffaa252975 100644 --- a/ghost/core/core/server/models/label.js +++ b/ghost/core/core/server/models/label.js @@ -6,10 +6,7 @@ const messages = { labelNotFound: 'Label not found.', }; -let Label; -let Labels; - -Label = ghostBookshelf.Model.extend( +const Label = ghostBookshelf.Model.extend( { tableName: 'labels', @@ -50,7 +47,7 @@ Label = ghostBookshelf.Model.extend( ghostBookshelf.Model.prototype.onSaving.apply(this, arguments); // Make sure name is trimmed of extra spaces - let name = this.get('name') && this.get('name').trim(); + const name = this.get('name') && this.get('name').trim(); this.set('name', name); if (this.hasChanged('slug') || (!this.get('slug') && this.get('name'))) { // Pass the new slug through the generator to strip illegal characters, detect duplicates @@ -139,7 +136,7 @@ Label = ghostBookshelf.Model.extend( }, ); -Labels = ghostBookshelf.Collection.extend({ +const Labels = ghostBookshelf.Collection.extend({ model: Label, }); diff --git a/ghost/core/core/server/models/member.js b/ghost/core/core/server/models/member.js index ff0569599d3..3c490d0578e 100644 --- a/ghost/core/core/server/models/member.js +++ b/ghost/core/core/server/models/member.js @@ -588,7 +588,10 @@ const Member = ghostBookshelf.Model.extend( * has no access to the nested relations, which should be updated. */ permittedAttributes: function permittedAttributes() { - let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments); + const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply( + this, + arguments, + ); this.relationships.forEach((key) => { filteredKeys.push(key); diff --git a/ghost/core/core/server/models/newsletter.js b/ghost/core/core/server/models/newsletter.js index 5fa4c544081..2fe7bbcc723 100644 --- a/ghost/core/core/server/models/newsletter.js +++ b/ghost/core/core/server/models/newsletter.js @@ -85,7 +85,7 @@ const Newsletter = ghostBookshelf.Model.extend( }, subscribeMembersById(memberIds, unfilteredOptions = {}) { - let pivotRows = []; + const pivotRows = []; for (const memberId of memberIds) { pivotRows.push({ id: ObjectID().toHexString(), diff --git a/ghost/core/core/server/models/permission.js b/ghost/core/core/server/models/permission.js index 51b21d6d00b..4c028dc90b7 100644 --- a/ghost/core/core/server/models/permission.js +++ b/ghost/core/core/server/models/permission.js @@ -1,9 +1,6 @@ const ghostBookshelf = require('./base'); -let Permission; -let Permissions; - -Permission = ghostBookshelf.Model.extend({ +const Permission = ghostBookshelf.Model.extend({ tableName: 'permissions', relationships: ['roles'], @@ -17,7 +14,7 @@ Permission = ghostBookshelf.Model.extend({ * has no access to the nested relations, which should be updated. */ permittedAttributes: function permittedAttributes() { - let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments); + const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments); this.relationships.forEach((key) => { filteredKeys.push(key); @@ -35,7 +32,7 @@ Permission = ghostBookshelf.Model.extend({ }, }); -Permissions = ghostBookshelf.Collection.extend({ +const Permissions = ghostBookshelf.Collection.extend({ model: Permission, }); diff --git a/ghost/core/core/server/models/post.js b/ghost/core/core/server/models/post.js index 1b21a5b8407..ae71894d85f 100644 --- a/ghost/core/core/server/models/post.js +++ b/ghost/core/core/server/models/post.js @@ -40,7 +40,6 @@ const POST_REVISIONS_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes const ALL_STATUSES = ['published', 'draft', 'scheduled', 'sent']; let Post; -let Posts; Post = ghostBookshelf.Model.extend( { @@ -253,7 +252,10 @@ Post = ghostBookshelf.Model.extend( * has no access to the nested relations, which should be updated. */ permittedAttributes: function permittedAttributes() { - let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments); + const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply( + this, + arguments, + ); this.relationships.forEach((key) => { filteredKeys.push(key); @@ -263,10 +265,10 @@ Post = ghostBookshelf.Model.extend( }, orderAttributes: function orderAttributes() { - let keys = ghostBookshelf.Model.prototype.orderAttributes.apply(this, arguments); + const keys = ghostBookshelf.Model.prototype.orderAttributes.apply(this, arguments); // extend ordered keys with post_meta keys - let postsMetaKeys = _.without( + const postsMetaKeys = _.without( ghostBookshelf.model('PostsMeta').prototype.orderAttributes(), 'posts_meta.id', 'posts_meta.post_id', @@ -379,14 +381,13 @@ Post = ghostBookshelf.Model.extend( }, emitChange: function emitChange(event, options = {}) { - let eventToTrigger; let resourceType = this.get('type'); if (options.usePreviousAttribute) { resourceType = this.previous('type'); } - eventToTrigger = resourceType + '.' + event; + const eventToTrigger = resourceType + '.' + event; ghostBookshelf.Model.prototype.emitChange.bind(this)(this, eventToTrigger, options); }, @@ -694,9 +695,9 @@ Post = ghostBookshelf.Model.extend( * CASE: Don't create new posts_meta entry if post meta is empty */ if (!_.isUndefined(this.get('posts_meta')) && !_.isNull(this.get('posts_meta'))) { - let postsMetaData = this.get('posts_meta'); - let relatedModelId = model.related('posts_meta').get('id'); - let hasNoData = !_.values(postsMetaData).some((x) => !!x); + const postsMetaData = this.get('posts_meta'); + const relatedModelId = model.related('posts_meta').get('id'); + const hasNoData = !_.values(postsMetaData).some((x) => !!x); if (relatedModelId && !_.isEmpty(postsMetaData)) { postsMetaData.id = relatedModelId; this.set('posts_meta', postsMetaData); @@ -1163,7 +1164,7 @@ Post = ghostBookshelf.Model.extend( toJSON: function toJSON(unfilteredOptions) { const options = Post.filterOptions(unfilteredOptions, 'toJSON'); - let attrs = ghostBookshelf.Model.prototype.toJSON.call(this, options); + const attrs = ghostBookshelf.Model.prototype.toJSON.call(this, options); // CASE: never expose the mobiledoc revisions delete attrs.mobiledoc_revisions; @@ -1402,7 +1403,7 @@ Post = ghostBookshelf.Model.extend( * **See:** [ghostBookshelf.Model.edit](base.js.html#edit) */ edit: function edit(data, unfilteredOptions) { - let options = this.filterOptions(unfilteredOptions, 'edit', { + const options = this.filterOptions(unfilteredOptions, 'edit', { extraAllowedProperties: ['id'], }); @@ -1458,7 +1459,7 @@ Post = ghostBookshelf.Model.extend( * **See:** [ghostBookshelf.Model.add](base.js.html#add) */ add: function add(data, unfilteredOptions) { - let options = this.filterOptions(unfilteredOptions, 'add', { + const options = this.filterOptions(unfilteredOptions, 'add', { extraAllowedProperties: ['id'], }); @@ -1486,7 +1487,7 @@ Post = ghostBookshelf.Model.extend( }, destroy: function destroy(unfilteredOptions) { - let options = this.filterOptions(unfilteredOptions, 'destroy', { + const options = this.filterOptions(unfilteredOptions, 'destroy', { extraAllowedProperties: ['id'], }); @@ -1528,11 +1529,7 @@ Post = ghostBookshelf.Model.extend( hasUserPermission, hasApiKeyPermission, ) { - let { isContributor, isOwner, isAdmin, isEitherEditor } = setIsRoles(loadedPermissions); - let isIntegration; - let isEdit; - let isAdd; - let isDestroy; + const { isContributor, isOwner, isAdmin, isEitherEditor } = setIsRoles(loadedPermissions); function isChanging(attr) { return unsafeAttrs[attr] && unsafeAttrs[attr] !== postModel.get(attr); @@ -1546,13 +1543,13 @@ Post = ghostBookshelf.Model.extend( return postModel.get('status') === 'draft'; } - isIntegration = + const isIntegration = loadedPermissions.apiKey && _.some(loadedPermissions.apiKey.roles, { name: 'Admin Integration' }); - isEdit = action === 'edit'; - isAdd = action === 'add'; - isDestroy = action === 'destroy'; + const isEdit = action === 'edit'; + const isAdd = action === 'add'; + const isDestroy = action === 'destroy'; if (limitService.isLimited('members')) { // You can't publish a post if you're over your member limit @@ -1671,7 +1668,7 @@ Post = ghostBookshelf.Model.extend( }, ); -Posts = ghostBookshelf.Collection.extend({ +const Posts = ghostBookshelf.Collection.extend({ model: Post, }); diff --git a/ghost/core/core/server/models/product.js b/ghost/core/core/server/models/product.js index c9a5061f345..a99c112ed33 100644 --- a/ghost/core/core/server/models/product.js +++ b/ghost/core/core/server/models/product.js @@ -105,7 +105,10 @@ const Product = ghostBookshelf.Model.extend( * has no access to the nested relations, which should be updated. */ permittedAttributes: function permittedAttributes() { - let filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply(this, arguments); + const filteredKeys = ghostBookshelf.Model.prototype.permittedAttributes.apply( + this, + arguments, + ); this.relationships.forEach((key) => { filteredKeys.push(key); diff --git a/ghost/core/core/server/models/relations/authors.js b/ghost/core/core/server/models/relations/authors.js index 671cf7512d6..52e764873e9 100644 --- a/ghost/core/core/server/models/relations/authors.js +++ b/ghost/core/core/server/models/relations/authors.js @@ -139,7 +139,7 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) { }, serialize: function serialize(options) { - let attrs = proto.serialize.call(this, options); + const attrs = proto.serialize.call(this, options); // CASE: e.g. you stub model response in the test // CASE: you delete a model without fetching before @@ -209,7 +209,7 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) { .where(query) .fetch(Object.assign({ columns: ['id'] }, _.pick(options, 'transacting'))) .then((user) => { - let userId = user ? user.id : ownerUser.id; + const userId = user ? user.id : ownerUser.id; // CASE: avoid attaching duplicate authors relation const userExists = _.find(authorsToSet, { id: userId.id }); @@ -243,10 +243,10 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) { * @param {Object} unfilteredOptions.transacting */ reassignByAuthor: async function reassignByAuthor(unfilteredOptions) { - let options = this.filterOptions(unfilteredOptions, 'reassignByAuthor', { + const options = this.filterOptions(unfilteredOptions, 'reassignByAuthor', { extraAllowedProperties: ['id'], }); - let authorId = options.id; + const authorId = options.id; if (!authorId) { return Promise.reject( @@ -257,8 +257,8 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) { } const reassignPost = async () => { - let trx = options.transacting; - let knex = ghostBookshelf.knex; + const trx = options.transacting; + const knex = ghostBookshelf.knex; try { // There's only one possible owner per Ghost instance @@ -350,9 +350,6 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) { const postModel = postModelOrId; let origArgs; const { isContributor, isAuthor } = setIsRoles(loadedPermissions); - let isEdit; - let isAdd; - let isDestroy; // If we passed in an id instead of a model, get the model // then check the permissions @@ -377,9 +374,9 @@ module.exports.extendModel = function extendModel(Post, Posts, ghostBookshelf) { }); } - isEdit = action === 'edit'; - isAdd = action === 'add'; - isDestroy = action === 'destroy'; + const isEdit = action === 'edit'; + const isAdd = action === 'add'; + const isDestroy = action === 'destroy'; function isChangingAuthors() { if (!unsafeAttrs.authors) { diff --git a/ghost/core/core/server/models/role.js b/ghost/core/core/server/models/role.js index 53736dd44a5..e7f5e322c61 100644 --- a/ghost/core/core/server/models/role.js +++ b/ghost/core/core/server/models/role.js @@ -9,10 +9,7 @@ const messages = { notEnoughPermission: 'You do not have permission to perform this action', }; -let Role; -let Roles; - -Role = ghostBookshelf.Model.extend( +const Role = ghostBookshelf.Model.extend( { tableName: 'roles', @@ -130,7 +127,7 @@ Role = ghostBookshelf.Model.extend( }, ); -Roles = ghostBookshelf.Collection.extend({ +const Roles = ghostBookshelf.Collection.extend({ model: Role, }); diff --git a/ghost/core/core/server/models/settings.js b/ghost/core/core/server/models/settings.js index 5269f13bb2c..af3aaca9f43 100644 --- a/ghost/core/core/server/models/settings.js +++ b/ghost/core/core/server/models/settings.js @@ -16,7 +16,7 @@ const messages = { }; const internalContext = { context: { internal: true } }; -let Settings; + let defaultSettings; const imageSettingKeys = [ 'cover_image', @@ -146,7 +146,7 @@ function transformNavigationIconUrls(value, transformUrl) { // Each setting is saved as a separate row in the database, // but the overlying API treats them as a single key:value mapping -Settings = ghostBookshelf.Model.extend( +const Settings = ghostBookshelf.Model.extend( { tableName: 'settings', diff --git a/ghost/core/core/server/models/tag.js b/ghost/core/core/server/models/tag.js index e869ea95643..8b90bd76cee 100644 --- a/ghost/core/core/server/models/tag.js +++ b/ghost/core/core/server/models/tag.js @@ -7,10 +7,7 @@ const messages = { tagNotFound: 'Tag not found.', }; -let Tag; -let Tags; - -Tag = ghostBookshelf.Model.extend( +const Tag = ghostBookshelf.Model.extend( { tableName: 'tags', @@ -221,7 +218,7 @@ Tag = ghostBookshelf.Model.extend( }, ); -Tags = ghostBookshelf.Collection.extend({ +const Tags = ghostBookshelf.Collection.extend({ model: Tag, }); diff --git a/ghost/core/core/server/models/user.js b/ghost/core/core/server/models/user.js index 8a7329f9a0d..0fce6a2c214 100644 --- a/ghost/core/core/server/models/user.js +++ b/ghost/core/core/server/models/user.js @@ -55,10 +55,8 @@ const messages = { const inactiveStates = ['inactive', 'locked']; const allStates = activeStates.concat(inactiveStates); -let User; -let Users; -User = ghostBookshelf.Model.extend( +const User = ghostBookshelf.Model.extend( { tableName: 'users', @@ -506,7 +504,7 @@ User = ghostBookshelf.Model.extend( findOne: function findOne(dataToClone, unfilteredOptions) { const options = this.filterOptions(unfilteredOptions, 'findOne'); let query; - let status; + let data = JSON.parse(JSON.stringify(dataToClone)); const lookupRole = data.role; @@ -520,7 +518,7 @@ User = ghostBookshelf.Model.extend( delete data.role; data = Object.assign({}, { status: 'all' }, data || {}); - status = data.status; + const status = data.status; delete data.status; data = this.filterData(data); @@ -988,11 +986,11 @@ User = ghostBookshelf.Model.extend( // CASE: i want to edit roles if (action === 'edit' && unsafeAttrs.roles && unsafeAttrs.roles[0]) { - let role = unsafeAttrs.roles[0]; - let roleId = role.id || role; - let editedUserId = userModel.id; + const role = unsafeAttrs.roles[0]; + const roleId = role.id || role; + const editedUserId = userModel.id; // @NOTE: role id of logged in user - let contextRoleId = loadedPermissions.user.roles[0].id; + const contextRoleId = loadedPermissions.user.roles[0].id; if (roleId !== contextRoleId && editedUserId === context.user) { return Promise.reject( @@ -1298,7 +1296,7 @@ User = ghostBookshelf.Model.extend( }, ); -Users = ghostBookshelf.Collection.extend({ +const Users = ghostBookshelf.Collection.extend({ model: User, }); diff --git a/ghost/core/core/server/models/webhook.js b/ghost/core/core/server/models/webhook.js index 30452600657..609ee55ff58 100644 --- a/ghost/core/core/server/models/webhook.js +++ b/ghost/core/core/server/models/webhook.js @@ -1,9 +1,7 @@ const ghostBookshelf = require('./base'); const ghostVersion = require('@tryghost/version'); -let Webhook; -let Webhooks; -Webhook = ghostBookshelf.Model.extend( +const Webhook = ghostBookshelf.Model.extend( { tableName: 'webhooks', @@ -87,7 +85,7 @@ Webhook = ghostBookshelf.Model.extend( }, ); -Webhooks = ghostBookshelf.Collection.extend({ +const Webhooks = ghostBookshelf.Collection.extend({ model: Webhook, }); diff --git a/ghost/core/core/server/notify.js b/ghost/core/core/server/notify.js index 7221c76b2c5..407a5f114d9 100644 --- a/ghost/core/core/server/notify.js +++ b/ghost/core/core/server/notify.js @@ -40,7 +40,7 @@ async function notify(type, error = null) { // Build our message // - if there's an error then the server is not ready, include the errors // - if there's no error then the server has started - let message = {}; + const message = {}; if (error) { message[type] = false; message.error = error; @@ -56,7 +56,7 @@ async function notify(type, error = null) { } // CASE: use bootstrap socket to communicate with CLI for systemd - let socketAddress = config.get('bootstrap-socket'); + const socketAddress = config.get('bootstrap-socket'); if (socketAddress) { const bootstrapSocket = require('./lib/bootstrap-socket'); return bootstrapSocket.connectAndSend(socketAddress, message); diff --git a/ghost/core/core/server/services/api-version-compatibility/legacy-api-path-match.js b/ghost/core/core/server/services/api-version-compatibility/legacy-api-path-match.js index 6094ee1dd16..82da061ba73 100644 --- a/ghost/core/core/server/services/api-version-compatibility/legacy-api-path-match.js +++ b/ghost/core/core/server/services/api-version-compatibility/legacy-api-path-match.js @@ -1,8 +1,8 @@ const pathMatch = require('path-match')(); module.exports = (url) => { - let basePath = 'ghost/api'; - let apiRouteMatcher = '/:version(v2|v3|v4|canary)?/:api(admin|content)/*'; + const basePath = 'ghost/api'; + const apiRouteMatcher = '/:version(v2|v3|v4|canary)?/:api(admin|content)/*'; let urlToMatch = url; if (url.includes(basePath)) { diff --git a/ghost/core/core/server/services/auth/api-key/admin.js b/ghost/core/core/server/services/auth/api-key/admin.js index 579e71cfd90..0d72155046d 100644 --- a/ghost/core/core/server/services/auth/api-key/admin.js +++ b/ghost/core/core/server/services/auth/api-key/admin.js @@ -16,7 +16,7 @@ const messages = { invalidApiKeyType: 'Invalid API Key type', }; -let JWT_OPTIONS_DEFAULTS = { +const JWT_OPTIONS_DEFAULTS = { /** @type import('jsonwebtoken').Algorithm[] */ algorithms: ['HS256'], maxAge: '5m', @@ -202,7 +202,7 @@ const authenticateWithToken = async function apiKeyAuthenticateWithToken( } // authenticated OK - let result = { + const result = { user: null, apiKey: apiKey, }; diff --git a/ghost/core/core/server/services/auth/api-key/content.js b/ghost/core/core/server/services/auth/api-key/content.js index 1d1c8767b9e..feba1f9c02f 100644 --- a/ghost/core/core/server/services/auth/api-key/content.js +++ b/ghost/core/core/server/services/auth/api-key/content.js @@ -24,7 +24,7 @@ const authenticateContentApiKey = async function authenticateContentApiKey(req, ); } - let key = req.query.key; + const key = req.query.key; try { const apiKey = await models.ApiKey.findOne({ secret: key }, { withRelated: ['integration'] }); diff --git a/ghost/core/core/server/services/auth/passwordreset.js b/ghost/core/core/server/services/auth/passwordreset.js index 9fbb67257be..5279d762bb1 100644 --- a/ghost/core/core/server/services/auth/passwordreset.js +++ b/ghost/core/core/server/services/auth/passwordreset.js @@ -115,7 +115,7 @@ function doReset(options, tokenParts, settingsAPI) { require: true, }); - let compareResult = security.tokens.resetToken.compare({ + const compareResult = security.tokens.resetToken.compare({ token: resetToken, dbHash: dbHash, password: user.get('password'), diff --git a/ghost/core/core/server/services/auth/setup.js b/ghost/core/core/server/services/auth/setup.js index 731c980c8e1..009463de54a 100644 --- a/ghost/core/core/server/services/auth/setup.js +++ b/ghost/core/core/server/services/auth/setup.js @@ -87,13 +87,11 @@ async function doSettings(data, settingsAPI) { const blogTitle = data.userData.blogTitle; const description = data.userData.description ? data.userData.description.trim() : null; - let userSettings; - if (!blogTitle || typeof blogTitle !== 'string') { return user; } - userSettings = [ + const userSettings = [ { key: 'title', value: blogTitle.trim() }, { key: 'description', value: description || tpl(messages.sampleBlogDescription) }, ]; diff --git a/ghost/core/core/server/services/comments/comments-service-email-renderer.js b/ghost/core/core/server/services/comments/comments-service-email-renderer.js index 652114f927e..3c8d0d8bf28 100644 --- a/ghost/core/core/server/services/comments/comments-service-email-renderer.js +++ b/ghost/core/core/server/services/comments/comments-service-email-renderer.js @@ -7,7 +7,7 @@ class CommentsServiceEmailRenderer { this.Handlebars = require('handlebars').create(); this.Handlebars.registerHelper('t', function (key, options) { - let hash = options?.hash; + const hash = options?.hash; const params = hash || options || {}; return t(key, { diff --git a/ghost/core/core/server/services/comments/comments-service-emails.js b/ghost/core/core/server/services/comments/comments-service-emails.js index e9a534cb888..dd54026d86c 100644 --- a/ghost/core/core/server/services/comments/comments-service-emails.js +++ b/ghost/core/core/server/services/comments/comments-service-emails.js @@ -277,7 +277,7 @@ class CommentsServiceEmails { this.logging.warn(message.text); } - let msg = Object.assign( + const msg = Object.assign( { from: this.notificationFromAddress, forceTextContent: true, diff --git a/ghost/core/core/server/services/comments/comments-stats-service.js b/ghost/core/core/server/services/comments/comments-stats-service.js index cbecf17b451..0109b00cfca 100644 --- a/ghost/core/core/server/services/comments/comments-stats-service.js +++ b/ghost/core/core/server/services/comments/comments-stats-service.js @@ -37,7 +37,7 @@ module.exports = class CommentsStatsService { .groupBy('post_id'); /** @type Object */ - let counts = {}; + const counts = {}; for (const row of results) { counts[row.post_id] = row.count; diff --git a/ghost/core/core/server/services/email-service/batch-sending-service.js b/ghost/core/core/server/services/email-service/batch-sending-service.js index e7c687a56a1..85b1fb395be 100644 --- a/ghost/core/core/server/services/email-service/batch-sending-service.js +++ b/ghost/core/core/server/services/email-service/batch-sending-service.js @@ -819,7 +819,7 @@ class BatchSendingService { let succeeded = false; try { - let members = await this.retryDb( + const members = await this.retryDb( async () => { const m = await this.getBatchMembers(batch.id); @@ -957,7 +957,7 @@ class BatchSendingService { * @returns {Promise} */ async getBatchMembers(batchId) { - let models = await this.#models.EmailRecipient.findAll({ + const models = await this.#models.EmailRecipient.findAll({ filter: `batch_id:'${batchId}'`, withRelated: ['member', 'member.stripeSubscriptions', 'member.products'], }); diff --git a/ghost/core/core/server/services/email-service/email-renderer.js b/ghost/core/core/server/services/email-service/email-renderer.js index 79fe106e567..75a32abedff 100644 --- a/ghost/core/core/server/services/email-service/email-renderer.js +++ b/ghost/core/core/server/services/email-service/email-renderer.js @@ -813,7 +813,7 @@ class EmailRenderer { isMemberTrialing(member) { // Do we have an active subscription? if (member.status === 'paid') { - let activeSubscription = member.subscriptions.find((subscription) => { + const activeSubscription = member.subscriptions.find((subscription) => { return subscription.status === 'trialing'; }); @@ -1183,7 +1183,7 @@ class EmailRenderer { */ #getEmailPreheader(postModel, audience, html) { let plaintext = postModel.get('plaintext'); - let customExcerpt = postModel.get('custom_excerpt'); + const customExcerpt = postModel.get('custom_excerpt'); if (customExcerpt) { return customExcerpt; } else { diff --git a/ghost/core/core/server/services/email-service/email-service.js b/ghost/core/core/server/services/email-service/email-service.js index 07956e5f0e7..591f5025969 100644 --- a/ghost/core/core/server/services/email-service/email-service.js +++ b/ghost/core/core/server/services/email-service/email-service.js @@ -509,7 +509,7 @@ class EmailService { const exampleMember = await this.getExampleMember(null, audience.status); const subject = this.#emailRenderer.getSubject(post); - let { html, plaintext, replacements } = await this.#emailRenderer.renderBody( + const { html, plaintext, replacements } = await this.#emailRenderer.renderBody( post, newsletter, renderSegment, diff --git a/ghost/core/core/server/services/gifts/jobs/index.js b/ghost/core/core/server/services/gifts/jobs/index.js index 4eb7481e709..48eadf96783 100644 --- a/ghost/core/core/server/services/gifts/jobs/index.js +++ b/ghost/core/core/server/services/gifts/jobs/index.js @@ -2,7 +2,7 @@ const logging = require('@tryghost/logging'); const CleanGiftsJob = require('./clean-gifts-job').default; const SendGiftRemindersJob = require('./send-gift-reminders-job').default; -let hasScheduled = { +const hasScheduled = { cleanup: false, reminders: false, }; diff --git a/ghost/core/core/server/services/invitations/accept.js b/ghost/core/core/server/services/invitations/accept.js index 96374cbd533..6ecfc7f3fb1 100644 --- a/ghost/core/core/server/services/invitations/accept.js +++ b/ghost/core/core/server/services/invitations/accept.js @@ -20,7 +20,7 @@ async function accept(invitation) { return models.Base.transaction(async (transacting) => { const options = { context: { internal: true }, transacting, forUpdate: true }; - let invite = await models.Invite.findOne({ token: inviteToken, status: 'sent' }, options); + const invite = await models.Invite.findOne({ token: inviteToken, status: 'sent' }, options); if (!invite) { throw new errors.NotFoundError({ message: tpl(messages.inviteNotFound) }); @@ -32,7 +32,7 @@ async function accept(invitation) { const email = invite.get('email'); - let user = await models.User.findOne({ email }, options); + const user = await models.User.findOne({ email }, options); if (user) { throw new errors.ValidationError({ message: tpl(messages.inviteEmailAlreadyExist.message), diff --git a/ghost/core/core/server/services/limits.js b/ghost/core/core/server/services/limits.js index 456e23867f8..ddd8c25c7ce 100644 --- a/ghost/core/core/server/services/limits.js +++ b/ghost/core/core/server/services/limits.js @@ -3,7 +3,7 @@ const config = require('../../shared/config'); const db = require('../data/db'); const logging = require('@tryghost/logging'); const { LimitService } = require('@tryghost/limit-service'); -let limitService = new LimitService(); +const limitService = new LimitService(); const init = () => { let helpLink; diff --git a/ghost/core/core/server/services/mail/ghost-mailer.js b/ghost/core/core/server/services/mail/ghost-mailer.js index 026d86be0f6..09e83f5c6f0 100644 --- a/ghost/core/core/server/services/mail/ghost-mailer.js +++ b/ghost/core/core/server/services/mail/ghost-mailer.js @@ -105,7 +105,7 @@ function createMailError({ message, err, ignoreDefaultMessage } = { message: '' const defaultErrorMessage = tpl(messages.failedSendingEmailError); const fullErrorMessage = defaultErrorMessage + message; - let statusCode = err && err.name === 'RecipientError' ? 400 : 500; + const statusCode = err && err.name === 'RecipientError' ? 400 : 500; return new errors.EmailError({ message: ignoreDefaultMessage ? message : fullErrorMessage, err: err, diff --git a/ghost/core/core/server/services/member-attribution/member-attribution-service.js b/ghost/core/core/server/services/member-attribution/member-attribution-service.js index eb9e2a91df6..8f86753e68c 100644 --- a/ghost/core/core/server/services/member-attribution/member-attribution-service.js +++ b/ghost/core/core/server/services/member-attribution/member-attribution-service.js @@ -34,7 +34,7 @@ class MemberAttributionService { // We consider only select internal context sources if (['import', 'api', 'admin'].includes(source)) { - let attribution = { + const attribution = { id: null, type: null, url: null, diff --git a/ghost/core/core/server/services/member-attribution/referrer-translator.js b/ghost/core/core/server/services/member-attribution/referrer-translator.js index 33a44ab55e1..10ae91f5b61 100644 --- a/ghost/core/core/server/services/member-attribution/referrer-translator.js +++ b/ghost/core/core/server/services/member-attribution/referrer-translator.js @@ -76,7 +76,7 @@ class ReferrerTranslator { // In finding the 'content' that got the user to sign up, we want the latest entry with referrer data for (const item of history) { - let refUrl = this.getUrlFromStr(item.referrerUrl); + const refUrl = this.getUrlFromStr(item.referrerUrl); if (refUrl?.hostname === 'checkout.stripe.com') { // Ignore stripe, because second try payments should not be attributed to Stripe continue; diff --git a/ghost/core/core/server/services/members-events/event-storage.js b/ghost/core/core/server/services/members-events/event-storage.js index 372be2b4e32..828bb337aeb 100644 --- a/ghost/core/core/server/services/members-events/event-storage.js +++ b/ghost/core/core/server/services/members-events/event-storage.js @@ -23,7 +23,7 @@ class EventStorage { */ subscribe(domainEvents) { domainEvents.subscribe(MemberCreatedEvent, async (event) => { - let attribution = event.data.attribution; + const attribution = event.data.attribution; await this.models.MemberCreatedEvent.add({ member_id: event.data.memberId, @@ -45,7 +45,7 @@ class EventStorage { }); domainEvents.subscribe(SubscriptionCreatedEvent, async (event) => { - let attribution = event.data.attribution; + const attribution = event.data.attribution; await this.models.SubscriptionCreatedEvent.add({ member_id: event.data.memberId, diff --git a/ghost/core/core/server/services/members/api.js b/ghost/core/core/server/services/members/api.js index 5daf5dc1c91..c47d41357b2 100644 --- a/ghost/core/core/server/services/members/api.js +++ b/ghost/core/core/server/services/members/api.js @@ -76,7 +76,7 @@ function createApiInstance(config) { if (process.env.NODE_ENV !== 'production') { logging.warn(message.text); } - let msg = Object.assign( + const msg = Object.assign( { from: config.getEmailSupportAddress(), subject: 'Signin', diff --git a/ghost/core/core/server/services/members/jobs/index.js b/ghost/core/core/server/services/members/jobs/index.js index 33b89911518..f72a3fc535e 100644 --- a/ghost/core/core/server/services/members/jobs/index.js +++ b/ghost/core/core/server/services/members/jobs/index.js @@ -5,7 +5,7 @@ const CleanExpiredCompedJob = require('./clean-expired-comped-job').default; const cleanTokensTask = require('./clean-tokens-task').default; const cleanExpiredCompedTask = require('./clean-expired-comped-task').default; -let hasScheduled = { +const hasScheduled = { expiredComped: false, tokens: false, }; diff --git a/ghost/core/core/server/services/members/members-api/controllers/member-controller.js b/ghost/core/core/server/services/members/members-api/controllers/member-controller.js index 7069c644749..7279d141f99 100644 --- a/ghost/core/core/server/services/members/members-api/controllers/member-controller.js +++ b/ghost/core/core/server/services/members/members-api/controllers/member-controller.js @@ -57,7 +57,7 @@ module.exports = class MemberController { }); } - let tokenData = {}; + const tokenData = {}; try { const member = await this._memberRepository.getByToken(identity); tokenData.oldEmail = member.get('email'); @@ -88,7 +88,7 @@ module.exports = class MemberController { const cancelAtPeriodEnd = req.body.cancel_at_period_end; const smartCancel = req.body.smart_cancel; const cancellationReason = req.body.cancellation_reason; - let ghostPriceId = req.body.priceId; + const ghostPriceId = req.body.priceId; const tierId = req.body.tierId; const cadence = req.body.cadence; diff --git a/ghost/core/core/server/services/members/members-api/members-api.js b/ghost/core/core/server/services/members/members-api/members-api.js index feb151ae169..a94b44258c3 100644 --- a/ghost/core/core/server/services/members/members-api/members-api.js +++ b/ghost/core/core/server/services/members/members-api/members-api.js @@ -285,7 +285,7 @@ module.exports = function MembersAPI({ return null; } - let member = oldEmail + const member = oldEmail ? await getMemberIdentityData(oldEmail) : await getMemberIdentityData(email); @@ -434,7 +434,7 @@ module.exports = function MembersAPI({ } // max request time is 500ms so shouldn't slow requests down too much - let geolocation = JSON.stringify(await geolocationService.getGeolocationFromIP(ip)); + const geolocation = JSON.stringify(await geolocationService.getGeolocationFromIP(ip)); if (geolocation) { await users.update({ geolocation }, { id: member.id }); } diff --git a/ghost/core/core/server/services/members/members-api/repositories/event-repository.js b/ghost/core/core/server/services/members/members-api/repositories/event-repository.js index 6f4e8ce33d7..5913520a0ed 100644 --- a/ghost/core/core/server/services/members/members-api/repositories/event-repository.js +++ b/ghost/core/core/server/services/members/members-api/repositories/event-repository.js @@ -656,7 +656,7 @@ module.exports = class EventRepository { filter = this.removePostIdFilter(otherFilter); //Remove post_id filter as we don't need it in the query - let postClicksQuery = postId + const postClicksQuery = postId ? `SELECT mce.id, mce.member_id, diff --git a/ghost/core/core/server/services/members/members-api/repositories/member-repository.js b/ghost/core/core/server/services/members/members-api/repositories/member-repository.js index c8da868b1d5..f203ca616c5 100644 --- a/ghost/core/core/server/services/members/members-api/repositories/member-repository.js +++ b/ghost/core/core/server/services/members/members-api/repositories/member-repository.js @@ -717,7 +717,7 @@ module.exports = class MemberRepository { } // Fetch the member - let initialMember = await this._Member.findOne( + const initialMember = await this._Member.findOne( { id: options.id, }, @@ -1335,7 +1335,7 @@ module.exports = class MemberRepository { logging.error(e); } - let stripeCouponId = stripeSubscriptionData.discount?.coupon?.id; + const stripeCouponId = stripeSubscriptionData.discount?.coupon?.id; // For trial offers, offer id is passed from metadata as there is no stripe coupon let offerId = data.offerId || null; @@ -1432,7 +1432,7 @@ module.exports = class MemberRepository { return 'inactive'; }; - let eventData = {}; + const eventData = {}; const isIncomplete = ['incomplete', 'incomplete_expired'].includes( stripeSubscriptionData.status, ); diff --git a/ghost/core/core/server/services/members/members-api/repositories/product-repository.js b/ghost/core/core/server/services/members/members-api/repositories/product-repository.js index 869b8625a79..ddde1fc0474 100644 --- a/ghost/core/core/server/services/members/members-api/repositories/product-repository.js +++ b/ghost/core/core/server/services/members/members-api/repositories/product-repository.js @@ -418,7 +418,7 @@ class ProductRepository { const existingProduct = await this._Product.findOne({ id: productId }, options); - let productData = { + const productData = { name: data.name, visibility: data.visibility, description: data.description, diff --git a/ghost/core/core/server/services/members/stats/members-stats.js b/ghost/core/core/server/services/members/stats/members-stats.js index fc66428ed66..90ac072b387 100644 --- a/ghost/core/core/server/services/members/stats/members-stats.js +++ b/ghost/core/core/server/services/members/stats/members-stats.js @@ -135,11 +135,11 @@ class MembersStats { currentRangeDate = moment.tz(siteTimezone).subtract(days - 1, 'days'); } - let endDate = moment.tz(siteTimezone).add(1, 'hour'); + const endDate = moment.tz(siteTimezone).add(1, 'hour'); const output = {}; while (currentRangeDate.isBefore(endDate)) { - let dateStr = currentRangeDate.format('YYYY-MM-DD'); + const dateStr = currentRangeDate.format('YYYY-MM-DD'); runningTotal += resultObject[dateStr] || 0; output[dateStr] = runningTotal; diff --git a/ghost/core/core/server/services/mentions/mention-sending-service.js b/ghost/core/core/server/services/mentions/mention-sending-service.js index 64bd07c8946..f1fb3fee3f4 100644 --- a/ghost/core/core/server/services/mentions/mention-sending-service.js +++ b/ghost/core/core/server/services/mentions/mention-sending-service.js @@ -81,8 +81,8 @@ module.exports = class MentionSendingService { return; } // make sure we have something to parse before we create a job - let html = post.get('status') === 'published' ? post.get('html') : null; - let previousHtml = post.previous('status') === 'published' ? post.previous('html') : null; + const html = post.get('status') === 'published' ? post.get('html') : null; + const previousHtml = post.previous('status') === 'published' ? post.previous('html') : null; if (html || previousHtml) { // Capture the source URL now, from the event's data, rather than // deferring the model into the job. diff --git a/ghost/core/core/server/services/mentions/mention.js b/ghost/core/core/server/services/mentions/mention.js index 682abcb15ca..9506b8fd55e 100644 --- a/ghost/core/core/server/services/mentions/mention.js +++ b/ghost/core/core/server/services/mentions/mention.js @@ -309,12 +309,11 @@ module.exports = class Mention { timestamp = new Date(); } - let payload; - payload = data.payload ? JSON.parse(JSON.stringify(data.payload)) : null; + const payload = data.payload ? JSON.parse(JSON.stringify(data.payload)) : null; /** @type boolean */ - let verified; - verified = isNew ? false : !!data.verified; + + const verified = isNew ? false : !!data.verified; /** @type {ObjectID | null} */ let resourceId = null; diff --git a/ghost/core/core/server/services/mentions/mentions-api.js b/ghost/core/core/server/services/mentions/mentions-api.js index de0217045bc..b70dc21c5eb 100644 --- a/ghost/core/core/server/services/mentions/mentions-api.js +++ b/ghost/core/core/server/services/mentions/mentions-api.js @@ -321,7 +321,10 @@ module.exports = class MentionsAPI { * @returns {Promise} */ async processWebmention(webmention) { - let mention = await this.#repository.getBySourceAndTarget(webmention.source, webmention.target); + const mention = await this.#repository.getBySourceAndTarget( + webmention.source, + webmention.target, + ); return await this.#updateWebmention(mention, webmention); } diff --git a/ghost/core/core/server/services/milestones/milestones-service.js b/ghost/core/core/server/services/milestones/milestones-service.js index 53a19143655..9478b55de13 100644 --- a/ghost/core/core/server/services/milestones/milestones-service.js +++ b/ghost/core/core/server/services/milestones/milestones-service.js @@ -300,7 +300,7 @@ module.exports = class MilestonesService { const membersMilestones = this.#milestonesConfig.members; // get the closest milestone we're over now - let achievedMilestones = this.#getMatchedMilestones(membersMilestones, membersCount); + const achievedMilestones = this.#getMatchedMilestones(membersMilestones, membersCount); // check for previously achieved milestones. We do not send an email when no // previous milestones exist diff --git a/ghost/core/core/server/services/newsletters/newsletters-service.js b/ghost/core/core/server/services/newsletters/newsletters-service.js index 2f090fa0653..7e9a78e2973 100644 --- a/ghost/core/core/server/services/newsletters/newsletters-service.js +++ b/ghost/core/core/server/services/newsletters/newsletters-service.js @@ -391,7 +391,7 @@ class NewslettersService { if (process.env.NODE_ENV !== 'production') { logging.warn(message.text); } - let msg = Object.assign( + const msg = Object.assign( { from: fromEmail, subject: 'Verify email address', diff --git a/ghost/core/core/server/services/notifications/notifications.js b/ghost/core/core/server/services/notifications/notifications.js index e12ffc51c6e..37bff68f8e3 100644 --- a/ghost/core/core/server/services/notifications/notifications.js +++ b/ghost/core/core/server/services/notifications/notifications.js @@ -37,7 +37,7 @@ class Notifications { * @returns {Object[]} - all notifications */ fetchAllNotifications() { - let allNotifications = this.settingsCache.get('notifications'); + const allNotifications = this.settingsCache.get('notifications'); // @TODO: this check can be removed to improve read operation perf. It's here only because // reads are done often and this gives a possibility to self-heal any broken records. @@ -151,7 +151,7 @@ class Notifications { addedAt: moment().toDate(), }; - let notificationsToCheck = notifications; + const notificationsToCheck = notifications; let notificationsToAdd = []; const allNotifications = this.fetchAllNotifications(); diff --git a/ghost/core/core/server/services/oembed/oembed-service.js b/ghost/core/core/server/services/oembed/oembed-service.js index cbd76820def..193de53ed8e 100644 --- a/ghost/core/core/server/services/oembed/oembed-service.js +++ b/ghost/core/core/server/services/oembed/oembed-service.js @@ -90,15 +90,15 @@ const findUrlWithProvider = (url) => { // build up a list of URL variations to test against because the oembed // providers list is not always up to date with scheme or www vs non-www - let baseUrl = url.replace(/^\/\/|^https?:\/\/(?:www\.)?/, ''); - let testUrls = [ + const baseUrl = url.replace(/^\/\/|^https?:\/\/(?:www\.)?/, ''); + const testUrls = [ `https://${baseUrl}`, `https://www.${baseUrl}`, `http://${baseUrl}`, `http://www.${baseUrl}`, ]; - for (let testUrl of testUrls) { + for (const testUrl of testUrls) { provider = hasProvider(testUrl); if (provider) { url = testUrl; diff --git a/ghost/core/core/server/services/permissions/can-this.js b/ghost/core/core/server/services/permissions/can-this.js index 2727a63a154..22b3e961087 100644 --- a/ghost/core/core/server/services/permissions/can-this.js +++ b/ghost/core/core/server/services/permissions/can-this.js @@ -132,7 +132,6 @@ class CanThisResult { const self = this; let userPermissionLoad; let apiKeyPermissionLoad; - let permissionsLoad; // Get context.user, context.api_key and context.app context = parseContext(context); @@ -158,7 +157,7 @@ class CanThisResult { } // Wait for both user and api key permissions to load - permissionsLoad = Promise.all([userPermissionLoad, apiKeyPermissionLoad]).then( + const permissionsLoad = Promise.all([userPermissionLoad, apiKeyPermissionLoad]).then( function (result) { return { user: result[0], diff --git a/ghost/core/core/server/services/settings-helpers/settings-helpers.js b/ghost/core/core/server/services/settings-helpers/settings-helpers.js index e42ddfebaec..3283d0bd56c 100644 --- a/ghost/core/core/server/services/settings-helpers/settings-helpers.js +++ b/ghost/core/core/server/services/settings-helpers/settings-helpers.js @@ -125,7 +125,7 @@ class SettingsHelpers { } getMembersSupportAddress() { - let supportAddress = this.settingsCache.get('members_support_address'); + const supportAddress = this.settingsCache.get('members_support_address'); if (!supportAddress) { // In the new flow, we make a difference between an empty setting (= use default) and a 'noreply' setting (=use noreply @ domain) diff --git a/ghost/core/core/server/services/settings/settings-bread-service.js b/ghost/core/core/server/services/settings/settings-bread-service.js index fd1d4449d35..fff5685a8b3 100644 --- a/ghost/core/core/server/services/settings/settings-bread-service.js +++ b/ghost/core/core/server/services/settings/settings-bread-service.js @@ -128,7 +128,7 @@ class SettingsBREADService { * @returns */ browse(context) { - let settings = this.settingsCache.getAll(); + const settings = this.settingsCache.getAll(); return this._formatBrowse(settings, context); } @@ -199,7 +199,7 @@ class SettingsBREADService { * @returns */ async edit(settings, options, stripeConnectData) { - let filteredSettings = settings.filter((setting) => { + const filteredSettings = settings.filter((setting) => { // The `stripe_connect_integration_token` "setting" is only used to set the `stripe_connect_*` settings. return ( ![ @@ -488,7 +488,7 @@ class SettingsBREADService { if (process.env.NODE_ENV !== 'production') { logging.warn(message.text); } - let msg = Object.assign( + const msg = Object.assign( { from: fromEmail, subject: 'Verify email address', diff --git a/ghost/core/core/server/services/settings/settings-utils.js b/ghost/core/core/server/services/settings/settings-utils.js index 926cabceb83..472fa9260d9 100644 --- a/ghost/core/core/server/services/settings/settings-utils.js +++ b/ghost/core/core/server/services/settings/settings-utils.js @@ -41,7 +41,7 @@ let SITE_UUID; function getOrGenerateSiteUuid() { if (!SITE_UUID) { try { - let configuredSiteUuid = config.get('site_uuid'); + const configuredSiteUuid = config.get('site_uuid'); if (configuredSiteUuid && validator.isUUID(configuredSiteUuid)) { SITE_UUID = configuredSiteUuid.toLowerCase(); logging.info(`Setting site_uuid to configured value: ${SITE_UUID}`); diff --git a/ghost/core/core/server/services/staff/staff-service-emails.js b/ghost/core/core/server/services/staff/staff-service-emails.js index a14927d2b1e..b19299e826b 100644 --- a/ghost/core/core/server/services/staff/staff-service-emails.js +++ b/ghost/core/core/server/services/staff/staff-service-emails.js @@ -44,7 +44,7 @@ class StaffServiceEmails { attributionTitle = 'Homepage'; } - let staffUrl = this.urlUtils.urlJoin( + const staffUrl = this.urlUtils.urlJoin( this.urlUtils.urlFor('admin', true), '#', `/settings/staff/${user.slug}/email-notifications`, @@ -101,7 +101,7 @@ class StaffServiceEmails { startedOn: this.getFormattedDate(subscription.startDate), }; - let offerData = this.getOfferData(offer); + const offerData = this.getOfferData(offer); if (!offerData && subscription?.trialEnd) { const trialEnd = moment(subscription.trialEnd); @@ -118,7 +118,7 @@ class StaffServiceEmails { attributionTitle = 'Homepage'; } - let staffUrl = this.urlUtils.urlJoin( + const staffUrl = this.urlUtils.urlJoin( this.urlUtils.urlFor('admin', true), '#', `/settings/staff/${user.slug}/email-notifications`, @@ -180,7 +180,7 @@ class StaffServiceEmails { cancellationReason: subscription.cancellationReason || '', }; - let staffUrl = this.urlUtils.urlJoin( + const staffUrl = this.urlUtils.urlJoin( this.urlUtils.urlFor('admin', true), '#', `/settings/staff/${user.slug}/email-notifications`, @@ -217,7 +217,7 @@ class StaffServiceEmails { * @param {string} recipient.slug */ async getSharedData(recipient) { - let staffUrl = this.urlUtils.urlJoin( + const staffUrl = this.urlUtils.urlJoin( this.urlUtils.urlFor('admin', true), '#', `/settings/staff/${recipient.slug}/email-notifications`, @@ -273,7 +273,7 @@ class StaffServiceEmails { for (const user of users) { const to = user.email; - let staffUrl = this.urlUtils.urlJoin( + const staffUrl = this.urlUtils.urlJoin( this.urlUtils.urlFor('admin', true), '#', `/settings/staff/${user.slug}/email-notifications`, @@ -442,7 +442,7 @@ class StaffServiceEmails { for (const user of users) { const to = user.email; - let staffUrl = this.urlUtils.urlJoin( + const staffUrl = this.urlUtils.urlJoin( this.urlUtils.urlFor('admin', true), '#', `/settings/staff/${user.slug}/email-notifications`, @@ -485,7 +485,7 @@ class StaffServiceEmails { /** @private */ getMemberData(member) { - let name = member?.name || member?.email; + const name = member?.name || member?.email; return { name, email: member?.email, @@ -607,7 +607,7 @@ class StaffServiceEmails { this.logging.warn(message.text); } - let msg = Object.assign( + const msg = Object.assign( { from: this.fromEmailAddress, forceTextContent: true, diff --git a/ghost/core/core/server/services/stats/posts-stats-service.js b/ghost/core/core/server/services/stats/posts-stats-service.js index 85b308818d9..94c77917270 100644 --- a/ghost/core/core/server/services/stats/posts-stats-service.js +++ b/ghost/core/core/server/services/stats/posts-stats-service.js @@ -355,7 +355,7 @@ class PostsStatsService { .groupBy('source'); // Now join all the data - let query = this.knex + const query = this.knex .with('free_referrers', freeReferrersCTE) .with('paid_referrers', paidReferrersCTE) .with('mrr_referrers', mrrReferrersCTE) @@ -657,7 +657,7 @@ class PostsStatsService { const { dateFrom, dateTo } = getDateBoundaries(options); // Simpler approach mirroring _buildFreeMembersSubquery - let subquery = knex('members_created_events as mce') + const subquery = knex('members_created_events as mce') .select('mce.referrer_source as source') .countDistinct('mce.member_id as free_members') .leftJoin('members_subscription_created_events as msce', function () { @@ -686,7 +686,7 @@ class PostsStatsService { _buildPaidReferrersSubquery(postId, options) { const knex = this.knex; const { dateFrom, dateTo } = getDateBoundaries(options); - let subquery = knex('members_subscription_created_events as msce') + const subquery = knex('members_subscription_created_events as msce') .select('msce.referrer_source as source') .countDistinct('msce.member_id as paid_members') .where('msce.attribution_id', postId) @@ -708,7 +708,7 @@ class PostsStatsService { _buildMrrReferrersSubquery(postId, options) { const knex = this.knex; const { dateFrom, dateTo } = getDateBoundaries(options); - let subquery = knex('members_subscription_created_events as msce') + const subquery = knex('members_subscription_created_events as msce') .select('msce.referrer_source as source') .sum('mpse.mrr_delta as mrr') .join('members_paid_subscription_events as mpse', function () { @@ -744,7 +744,7 @@ class PostsStatsService { const { dateFrom, dateTo } = getDateBoundaries(options); // Parse order field and direction - let [orderField, orderDirection = 'desc'] = order.split(' '); + const [orderField, orderDirection = 'desc'] = order.split(' '); // Map frontend order fields to database fields (simplified for ORDER BY) const orderFieldMap = { @@ -834,7 +834,7 @@ class PostsStatsService { const { dateFrom, dateTo } = getDateBoundaries(options); // Parse order field and direction - let [orderField, orderDirection = 'desc'] = order.split(' '); + const [orderField, orderDirection = 'desc'] = order.split(' '); // Map frontend order fields to database fields (simplified for ORDER BY) const orderFieldMap = { @@ -1095,7 +1095,7 @@ class PostsStatsService { const { dateFrom, dateTo } = getDateBoundaries(options); // Build optimized deltas query - avoid expensive JOIN - let deltasQuery = this.knex('members_subscribe_events as mse') + const deltasQuery = this.knex('members_subscribe_events as mse') .select( this.knex.raw(`DATE(mse.created_at) as date`), this.knex.raw(`SUM(CASE WHEN mse.subscribed = 1 THEN 1 ELSE -1 END) as value`), @@ -1150,7 +1150,7 @@ class PostsStatsService { // Build complete time series with all dates const completeValues = []; let lastValue = startingValue; // Use provided starting value - let currentDate = rangeStart.clone(); + const currentDate = rangeStart.clone(); while (currentDate.isSameOrBefore(rangeEnd)) { const dateKey = currentDate.format('YYYY-MM-DD'); @@ -1507,7 +1507,7 @@ class PostsStatsService { try { // Build free members query (modeled after _buildFreeMembersSubquery) // Members who signed up on post but paid elsewhere/never - let freeMembersQuery = this.knex('members_created_events as mce') + const freeMembersQuery = this.knex('members_created_events as mce') .select('mce.attribution_id as post_id') .countDistinct('mce.member_id as free_members') .leftJoin('members_subscription_created_events as msce', function () { @@ -1525,7 +1525,7 @@ class PostsStatsService { // Build paid members query (modeled after _buildPaidMembersSubquery) // Members whose paid conversion was attributed to this post - let paidMembersQuery = this.knex('members_subscription_created_events as msce') + const paidMembersQuery = this.knex('members_subscription_created_events as msce') .select('msce.attribution_id as post_id') .countDistinct('msce.member_id as paid_members') .whereIn('msce.attribution_type', ['post', 'page']) diff --git a/ghost/core/core/server/services/stats/referrers-stats-service.js b/ghost/core/core/server/services/stats/referrers-stats-service.js index 761fd77c687..7fcfeaf381c 100644 --- a/ghost/core/core/server/services/stats/referrers-stats-service.js +++ b/ghost/core/core/server/services/stats/referrers-stats-service.js @@ -226,7 +226,7 @@ class ReferrersStatsService { const { dateFrom: startDateTime, dateTo: endDateTime } = getDateBoundaries(options); // Join subscription created events with paid subscription events to get MRR changes - let query = knex('members_subscription_created_events as msce') + const query = knex('members_subscription_created_events as msce') .join('members_paid_subscription_events as mpse', function () { this.on('msce.member_id', '=', 'mpse.member_id').andOn( 'msce.subscription_id', diff --git a/ghost/core/core/server/services/stats/subscription-stats-service.js b/ghost/core/core/server/services/stats/subscription-stats-service.js index a39daf36398..c6880b320cc 100644 --- a/ghost/core/core/server/services/stats/subscription-stats-service.js +++ b/ghost/core/core/server/services/stats/subscription-stats-service.js @@ -25,12 +25,12 @@ class SubscriptionStatsService { }); /** @type {SubscriptionHistoryEntry[]} */ - let subscriptionHistoryEntries = []; + const subscriptionHistoryEntries = []; /** @type {string[]} */ - let cadences = []; + const cadences = []; /** @type {string[]} */ - let tiers = []; + const tiers = []; for (let index = subscriptionDeltaEntries.length - 1; index >= 0; index -= 1) { const entry = subscriptionDeltaEntries[index]; diff --git a/ghost/core/core/server/services/stripe/stripe-api.js b/ghost/core/core/server/services/stripe/stripe-api.js index 4d03d003b41..a2a3a684edf 100644 --- a/ghost/core/core/server/services/stripe/stripe-api.js +++ b/ghost/core/core/server/services/stripe/stripe-api.js @@ -367,7 +367,7 @@ module.exports = class StripeAPI { let latestCustomer = customers[0]; let latestSubscriptionTime = 0; - for (let customer of customers) { + for (const customer of customers) { // skip customers with no subscriptions if ( !customer.subscriptions || @@ -378,7 +378,7 @@ module.exports = class StripeAPI { } // find the customer with the most recent subscription - for (let subscription of customer.subscriptions.data) { + for (const subscription of customer.subscriptions.data) { if ( subscription.current_period_end && subscription.current_period_end > latestSubscriptionTime @@ -606,7 +606,7 @@ module.exports = class StripeAPI { subscriptionData.trial_period_days = options.trialDays; } - let stripeSessionOptions = { + const stripeSessionOptions = { payment_method_types: this.PAYMENT_METHOD_TYPES, managed_payments: MANAGED_PAYMENTS_DISABLED, success_url: options.successUrl || this._config.checkoutSessionSuccessUrl, diff --git a/ghost/core/core/server/services/stripe/stripe-migrations.js b/ghost/core/core/server/services/stripe/stripe-migrations.js index 4269d581b06..35f3e19eec9 100644 --- a/ghost/core/core/server/services/stripe/stripe-migrations.js +++ b/ghost/core/core/server/services/stripe/stripe-migrations.js @@ -69,7 +69,7 @@ module.exports = class StripeMigrations { logging.info(`Populating products and prices for existing stripe customers`); const uniquePlans = _.uniq(subscriptions.map((d) => _.get(d, 'plan.id'))); - let stripePrices = []; + const stripePrices = []; for (const plan of uniquePlans) { try { const stripePrice = await this.api.getPrice(plan, { @@ -356,9 +356,9 @@ module.exports = class StripeMigrations { if (!monthlyPrice) { logging.info('Could not any active Monthly price - creating a new one'); - let defaultStripeProduct; + const stripeProductsPage = await this.models.StripeProduct.findPage({ ...options, limit: 1 }); - defaultStripeProduct = stripeProductsPage.data[0]; + const defaultStripeProduct = stripeProductsPage.data[0]; const price = await this.api.createPrice({ currency: 'usd', amount: 5000, @@ -445,9 +445,9 @@ module.exports = class StripeMigrations { if (!yearlyPrice) { logging.info('Could not any active yearly price - creating a new one'); - let defaultStripeProduct; + const stripeProductsPage = await this.models.StripeProduct.findPage({ ...options, limit: 1 }); - defaultStripeProduct = stripeProductsPage.data[0]; + const defaultStripeProduct = stripeProductsPage.data[0]; const price = await this.api.createPrice({ currency: 'usd', amount: 500, @@ -621,7 +621,7 @@ module.exports = class StripeMigrations { }); if (invalidSubscriptions.length > 0) { logging.warn(`Deleting ${invalidSubscriptions.length} invalid subscription(s)`); - for (let sub of invalidSubscriptions) { + for (const sub of invalidSubscriptions) { logging.warn(`Deleting subscription - ${sub.id} - no price found`); await sub.destroy(options); } diff --git a/ghost/core/core/server/services/themes/storage.js b/ghost/core/core/server/services/themes/storage.js index 9eab065537c..2c08efe0aee 100644 --- a/ghost/core/core/server/services/themes/storage.js +++ b/ghost/core/core/server/services/themes/storage.js @@ -202,7 +202,7 @@ module.exports = { }); } - let result = await getStorage().delete(themeName); + const result = await getStorage().delete(themeName); list.del(themeName); return result; }, diff --git a/ghost/core/core/server/services/themes/theme-storage.js b/ghost/core/core/server/services/themes/theme-storage.js index a447eb668d0..e5a66c73899 100644 --- a/ghost/core/core/server/services/themes/theme-storage.js +++ b/ghost/core/core/server/services/themes/theme-storage.js @@ -78,8 +78,8 @@ class ThemeStorage extends LocalStorageBase { * @param {string} destName */ rename(srcName, destName) { - let src = path.join(this.getTargetDir(), srcName); - let dest = path.join(this.getTargetDir(), destName); + const src = path.join(this.getTargetDir(), srcName); + const dest = path.join(this.getTargetDir(), destName); return fs.move(src, dest); } diff --git a/ghost/core/core/server/services/tiers/tier.js b/ghost/core/core/server/services/tiers/tier.js index 085c6289702..0471678c795 100644 --- a/ghost/core/core/server/services/tiers/tier.js +++ b/ghost/core/core/server/services/tiers/tier.js @@ -251,21 +251,21 @@ module.exports = class Tier { }); } - let name = validateName(data.name); - - let slug = validateSlug(data.slug); - let description = validateDescription(data.description); - let welcomePageURL = validateWelcomePageURL(data.welcomePageURL); - let status = validateStatus(data.status || 'active'); - let visibility = validateVisibility(data.visibility || 'public'); - let type = validateType(data.type || 'paid'); - let currency = validateCurrency(data.currency || null, type); - let trialDays = validateTrialDays(data.trialDays || 0, type); - let monthlyPrice = validateMonthlyPrice(data.monthlyPrice || null, type); - let yearlyPrice = validateYearlyPrice(data.yearlyPrice || null, type); - let createdAt = validateCreatedAt(data.createdAt); - let updatedAt = validateUpdatedAt(data.updatedAt); - let benefits = validateBenefits(data.benefits); + const name = validateName(data.name); + + const slug = validateSlug(data.slug); + const description = validateDescription(data.description); + const welcomePageURL = validateWelcomePageURL(data.welcomePageURL); + const status = validateStatus(data.status || 'active'); + const visibility = validateVisibility(data.visibility || 'public'); + const type = validateType(data.type || 'paid'); + const currency = validateCurrency(data.currency || null, type); + const trialDays = validateTrialDays(data.trialDays || 0, type); + const monthlyPrice = validateMonthlyPrice(data.monthlyPrice || null, type); + const yearlyPrice = validateYearlyPrice(data.yearlyPrice || null, type); + const createdAt = validateCreatedAt(data.createdAt); + const updatedAt = validateUpdatedAt(data.updatedAt); + const benefits = validateBenefits(data.benefits); const tier = new Tier({ id, diff --git a/ghost/core/core/server/services/update-check/update-check-service.js b/ghost/core/core/server/services/update-check/update-check-service.js index f5a045872a5..a42c71e8e4e 100644 --- a/ghost/core/core/server/services/update-check/update-check-service.js +++ b/ghost/core/core/server/services/update-check/update-check-service.js @@ -230,7 +230,7 @@ class UpdateCheckService { * @return {Promise} */ async updateCheckResponse(response) { - let notificationGroups = (this.config.notificationGroups || []).concat(['all']); + const notificationGroups = (this.config.notificationGroups || []).concat(['all']); debug('Notification Groups', notificationGroups); debug('Response Update Check Service', response); diff --git a/ghost/core/core/server/services/webhooks/serialize.js b/ghost/core/core/server/services/webhooks/serialize.js index 7b53a914abd..5e9bc7bbc5d 100644 --- a/ghost/core/core/server/services/webhooks/serialize.js +++ b/ghost/core/core/server/services/webhooks/serialize.js @@ -42,7 +42,7 @@ module.exports = const changed = model._changed ? Object.keys(model._changed) : []; if (Object.keys(model.attributes).length) { - let frame = { options: { previous: false, context: { user: true } } }; + const frame = { options: { previous: false, context: { user: true } } }; // @NOTE: below options are lost during event processing, a more holistic approach would be // to pass them somehow along with the model diff --git a/ghost/core/core/server/web/shared/middleware/api/spam-prevention.js b/ghost/core/core/server/web/shared/middleware/api/spam-prevention.js index 4fb6ee6d285..3739e8cd7dc 100644 --- a/ghost/core/core/server/web/shared/middleware/api/spam-prevention.js +++ b/ghost/core/core/server/web/shared/middleware/api/spam-prevention.js @@ -42,8 +42,8 @@ let spamMemberLogin = spam.member_login || {}; let spamCheckoutSessionGlobal = spam.checkout_session_global || {}; let spamCheckoutSessionEmail = spam.checkout_session_email || {}; let spamContentApiKey = spam.content_api_key || {}; -let spamWebmentionsBlock = spam.webmentions_block || {}; -let spamEmailPreviewBlock = spam.email_preview_block || {}; +const spamWebmentionsBlock = spam.webmentions_block || {}; +const spamEmailPreviewBlock = spam.email_preview_block || {}; let spamOtcVerificationEnumeration = spam.otc_verification_enumeration || {}; let spamOtcVerification = spam.otc_verification || {}; diff --git a/ghost/core/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js b/ghost/core/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js index 18ae301d928..67f8118e4c2 100644 --- a/ghost/core/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js +++ b/ghost/core/core/shared/custom-theme-settings-cache/custom-theme-settings-service.js @@ -238,7 +238,7 @@ module.exports = class CustomThemeSettingsService { return []; } - let removedIds = []; + const removedIds = []; // sync any knownSettings that have changed in the theme for (const knownSetting of knownSettings) { diff --git a/ghost/core/core/shared/labs.js b/ghost/core/core/shared/labs.js index 91eb4dddb17..69991aa4fe2 100644 --- a/ghost/core/core/shared/labs.js +++ b/ghost/core/core/shared/labs.js @@ -121,7 +121,6 @@ module.exports.isSet = function isSet(flag) { */ module.exports.enabledHelper = function enabledHelper(options, callback) { const errDetails = {}; - let errString; if (module.exports.isSet(options.flagKey) === true) { // helper is active, use the callback @@ -147,7 +146,7 @@ module.exports.enabledHelper = function enabledHelper(options, callback) { ); const { SafeString } = require('express-hbs'); - errString = new SafeString( + const errString = new SafeString( ``, ); diff --git a/ghost/core/core/shared/settings-cache/cache-manager.js b/ghost/core/core/shared/settings-cache/cache-manager.js index 209e0cd435f..7c076b1439a 100644 --- a/ghost/core/core/shared/settings-cache/cache-manager.js +++ b/ghost/core/core/shared/settings-cache/cache-manager.js @@ -240,7 +240,7 @@ class CacheManager { getPublic() { // This block correctly builds the type signature for the return value /** @type {PublicSettingsCache} */ - let settings = Object.fromEntries( + const settings = Object.fromEntries( Object.keys(this.publicSettings).map((key) => [this.publicSettings[key], null]), ); diff --git a/ghost/core/eslint.config.mjs b/ghost/core/eslint.config.mjs index 7455d5bc04c..b77e3b8f641 100644 --- a/ghost/core/eslint.config.mjs +++ b/ghost/core/eslint.config.mjs @@ -129,6 +129,7 @@ export default tseslint.config( }, rules: { ...ghostBaseRules, + 'prefer-const': 'error', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': [ 'error', diff --git a/ghost/core/test/e2e-api/admin/activity-feed.test.js b/ghost/core/test/e2e-api/admin/activity-feed.test.js index 29559dcccf1..c6a86cada7d 100644 --- a/ghost/core/test/e2e-api/admin/activity-feed.test.js +++ b/ghost/core/test/e2e-api/admin/activity-feed.test.js @@ -63,7 +63,7 @@ async function testPagination(skippedTypes, postId, totalExpected, limit) { 'Expected total of ' + totalExpected + ' at limit ' + limit, ); }); - let previousPage = firstPage; + const previousPage = firstPage; let page = 1; const allEvents = previousPage.events; @@ -72,8 +72,8 @@ async function testPagination(skippedTypes, postId, totalExpected, limit) { page += 1; // Calculate next page - let lastId = previousPage.events[previousPage.events.length - 1].data.id; - let lastCreatedAt = moment( + const lastId = previousPage.events[previousPage.events.length - 1].data.id; + const lastCreatedAt = moment( previousPage.events[previousPage.events.length - 1].data.created_at, ).format('YYYY-MM-DD HH:mm:ss'); diff --git a/ghost/core/test/e2e-api/admin/members-exporter.test.js b/ghost/core/test/e2e-api/admin/members-exporter.test.js index a3c13d2d2c2..3bf8a7884ed 100644 --- a/ghost/core/test/e2e-api/admin/members-exporter.test.js +++ b/ghost/core/test/e2e-api/admin/members-exporter.test.js @@ -49,7 +49,7 @@ async function testOutput(member, asserts, filters = []) { for (const filter of filters) { // Test all - let res = await agent + const res = await agent .get(`/members/upload/?${filter}`) .expectStatus(200) .expectEmptyBody() @@ -63,8 +63,8 @@ async function testOutput(member, asserts, filters = []) { /id,email,name,note,subscribed_to_emails,complimentary_plan,stripe_customer_id,created_at,deleted_at,labels,tiers,gift_id/, ); - let csv = Papa.parse(res.text, { header: true }); - let row = csv.data.find((r) => r.id === member.id); + const csv = Papa.parse(res.text, { header: true }); + const row = csv.data.find((r) => r.id === member.id); assertExists(row); asserts(row); diff --git a/ghost/core/test/e2e-api/admin/oembed.test.js b/ghost/core/test/e2e-api/admin/oembed.test.js index f1f2bf5feeb..154313cfdc8 100644 --- a/ghost/core/test/e2e-api/admin/oembed.test.js +++ b/ghost/core/test/e2e-api/admin/oembed.test.js @@ -205,7 +205,7 @@ describe('Oembed API', function () { it('errors when fetched url is an IP address', async function () { // in order to follow the 302, we need to stub differently; externalRequest will block the internal IP dnsPromises.lookup.restore(); - let dnsStub = sinon.stub(dnsPromises, 'lookup'); + const dnsStub = sinon.stub(dnsPromises, 'lookup'); dnsStub.onCall(0).returns(Promise.resolve({ address: '123.123.123.123' })); dnsStub.onCall(1).returns(Promise.resolve({ address: '0.0.0.0' })); diff --git a/ghost/core/test/e2e-api/admin/offers.test.js b/ghost/core/test/e2e-api/admin/offers.test.js index ec6c9d569c0..e6d2af739f0 100644 --- a/ghost/core/test/e2e-api/admin/offers.test.js +++ b/ghost/core/test/e2e-api/admin/offers.test.js @@ -508,7 +508,7 @@ describe('Offers API', function () { it('Can edit an offer', async function () { // We can change all fields except discount related fields - let updatedOffer = { + const updatedOffer = { name: 'Cyber Monday', code: 'cyber monday', display_title: 'Cyber Monday Sale!', @@ -542,7 +542,7 @@ describe('Offers API', function () { sinon.stub(logging, 'warn'); // We can change all fields except discount related fields - let updatedOffer = { + const updatedOffer = { code: '4th', }; @@ -565,7 +565,7 @@ describe('Offers API', function () { sinon.stub(logging, 'warn'); // We can change all fields except discount related fields - let updatedOffer = { + const updatedOffer = { code: 'Summer sale', }; @@ -588,7 +588,7 @@ describe('Offers API', function () { sinon.stub(logging, 'warn'); // We can change all fields except discount related fields - let updatedOffer = { + const updatedOffer = { name: 'Easter Sales', }; @@ -609,7 +609,7 @@ describe('Offers API', function () { it('Can archive an offer', async function () { // We can change all fields except discount related fields - let updatedOffer = { + const updatedOffer = { status: 'archived', }; @@ -711,7 +711,7 @@ describe('Offers API', function () { it('Cannot update offer cadence', async function () { // We can change all fields except discount related fields - let updatedOffer = { + const updatedOffer = { cadence: 'month', }; @@ -739,7 +739,7 @@ describe('Offers API', function () { it('Cannot update offer amount', async function () { // We can change all fields except discount related fields - let updatedOffer = { + const updatedOffer = { amount: 20, }; @@ -769,7 +769,7 @@ describe('Offers API', function () { it('Cannot update offer tier', async function () { // We can change all fields except discount related fields const freeTier = await getFreeProduct(); - let updatedOffer = { + const updatedOffer = { tier: { id: freeTier.id, }, diff --git a/ghost/core/test/e2e-api/admin/posts-legacy.test.js b/ghost/core/test/e2e-api/admin/posts-legacy.test.js index 337cdcd988e..f9d6f201193 100644 --- a/ghost/core/test/e2e-api/admin/posts-legacy.test.js +++ b/ghost/core/test/e2e-api/admin/posts-legacy.test.js @@ -1177,7 +1177,7 @@ describe('Posts API', function () { assert.equal(publishedPost.status, 'sent'); assert.equal(publishedPost.newsletter_id, undefined); - let model = await models.Post.findOne( + const model = await models.Post.findOne( { id, status: 'all', @@ -1261,7 +1261,7 @@ describe('Posts API', function () { assert.equal(publishedPost.status, 'sent'); assert.equal(publishedPost.newsletter_id, undefined); - let model = await models.Post.findOne( + const model = await models.Post.findOne( { id, status: 'all', @@ -1345,7 +1345,7 @@ describe('Posts API', function () { assert.equal(publishedPost.status, 'sent'); assert.equal(publishedPost.newsletter_id, undefined); - let model = await models.Post.findOne( + const model = await models.Post.findOne( { id, status: 'all', @@ -2160,7 +2160,7 @@ describe('Posts API', function () { assert.equal(publishedPost.status, 'sent'); assert.equal(publishedPost.newsletter_id, undefined); - let model = await models.Post.findOne( + const model = await models.Post.findOne( { id, status: 'all', diff --git a/ghost/core/test/e2e-api/admin/tiers.test.js b/ghost/core/test/e2e-api/admin/tiers.test.js index aeab2b98bc4..b9582cb734a 100644 --- a/ghost/core/test/e2e-api/admin/tiers.test.js +++ b/ghost/core/test/e2e-api/admin/tiers.test.js @@ -164,7 +164,7 @@ describe('Tiers API', function () { }); it('Can edit tier properties and relations', async function () { - let { + const { body: { tiers: [tier], }, @@ -242,7 +242,7 @@ describe('Tiers API', function () { benefits: ['TEST BENEFIT'], }; - let { + const { body: { tiers: [tier], }, diff --git a/ghost/core/test/e2e-api/members-comments/comments.test.js b/ghost/core/test/e2e-api/members-comments/comments.test.js index 87cfc3a6cce..2fe7903ac24 100644 --- a/ghost/core/test/e2e-api/members-comments/comments.test.js +++ b/ghost/core/test/e2e-api/members-comments/comments.test.js @@ -1080,7 +1080,7 @@ describe('Comments API', function () { .expectStatus(200); // get the LAST comment from data2 - let lastComment = data2.body.comments[data2.body.comments.length - 1]; + const lastComment = data2.body.comments[data2.body.comments.length - 1]; assert.equal(lastComment.id, oldestComment.id); }); diff --git a/ghost/core/test/e2e-api/members/signin.test.js b/ghost/core/test/e2e-api/members/signin.test.js index c9e292ef9b7..5a78e1216fa 100644 --- a/ghost/core/test/e2e-api/members/signin.test.js +++ b/ghost/core/test/e2e-api/members/signin.test.js @@ -233,7 +233,7 @@ describe('Members Signin', function () { describe('Validity Period', function () { let clock; - let startDate = new Date(); + const startDate = new Date(); const email = 'validity-period-member1@test.com'; beforeEach(async function () { diff --git a/ghost/core/test/e2e-api/members/webhooks.test.js b/ghost/core/test/e2e-api/members/webhooks.test.js index 883ec8729e5..c2ec691e35d 100644 --- a/ghost/core/test/e2e-api/members/webhooks.test.js +++ b/ghost/core/test/e2e-api/members/webhooks.test.js @@ -2785,7 +2785,7 @@ describe('Members API', function () { describe('Discounts', function () { const beforeNow = Math.floor((Date.now() - 2000) / 1000) * 1000; let offer; - let couponId = 'testCoupon123'; + const couponId = 'testCoupon123'; beforeAll(async function () { const agents = await agentProvider.getAgentsForMembers(); @@ -3491,7 +3491,7 @@ describe('Members API', function () { }, }); - let webhookPayload = JSON.stringify({ + const webhookPayload = JSON.stringify({ type: 'checkout.session.completed', data: { object: { @@ -3503,7 +3503,7 @@ describe('Members API', function () { }, }); - let webhookSignature = stripe.webhooks.generateTestHeaderString({ + const webhookSignature = stripe.webhooks.generateTestHeaderString({ payload: webhookPayload, secret: process.env.WEBHOOK_SECRET, }); @@ -3691,7 +3691,7 @@ describe('Members API', function () { }, }); - let webhookPayload = JSON.stringify({ + const webhookPayload = JSON.stringify({ type: 'checkout.session.completed', data: { object: { @@ -3717,7 +3717,7 @@ describe('Members API', function () { }, }); - let webhookSignature = stripe.webhooks.generateTestHeaderString({ + const webhookSignature = stripe.webhooks.generateTestHeaderString({ payload: webhookPayload, secret: process.env.WEBHOOK_SECRET, }); @@ -4083,14 +4083,14 @@ describe('Members API', function () { .expectStatus(201); let member = res.body.members[0]; - let webhookPayload = JSON.stringify({ + const webhookPayload = JSON.stringify({ type: 'customer.subscription.created', data: { object: subscription, }, }); - let webhookSignature = stripe.webhooks.generateTestHeaderString({ + const webhookSignature = stripe.webhooks.generateTestHeaderString({ payload: webhookPayload, secret: process.env.WEBHOOK_SECRET, }); @@ -4181,7 +4181,7 @@ describe('Members API', function () { }, }); - let webhookPayload = JSON.stringify({ + const webhookPayload = JSON.stringify({ type: 'checkout.session.completed', data: { object: { @@ -4192,7 +4192,7 @@ describe('Members API', function () { }, }); - let webhookSignature = stripe.webhooks.generateTestHeaderString({ + const webhookSignature = stripe.webhooks.generateTestHeaderString({ payload: webhookPayload, secret: process.env.WEBHOOK_SECRET, }); diff --git a/ghost/core/test/e2e-frontend/members.test.js b/ghost/core/test/e2e-frontend/members.test.js index b2a739eb127..5246be438e9 100644 --- a/ghost/core/test/e2e-frontend/members.test.js +++ b/ghost/core/test/e2e-frontend/members.test.js @@ -460,10 +460,10 @@ describe('Front-end members behavior', function () { const memberHmac = crypto.createHmac('sha256', 'test').update(memberUUID).digest('hex'); // Can fetch newsletter subscriptions - let getRes = await request + const getRes = await request .get(`/members/api/member/newsletters?uuid=${memberUUID}&key=${memberHmac}`) .expect(200); - let getJsonResponse = getRes.body; + const getJsonResponse = getRes.body; assert.equal(getJsonResponse.newsletters.length, 1); await request diff --git a/ghost/core/test/e2e-server/services/mentions.test.js b/ghost/core/test/e2e-server/services/mentions.test.js index 3841dcd4f5d..b14e1e52aa3 100644 --- a/ghost/core/test/e2e-server/services/mentions.test.js +++ b/ghost/core/test/e2e-server/services/mentions.test.js @@ -9,14 +9,14 @@ const urlService = require('../../../core/server/services/url'); const events = require('../../../core/server/lib/common/events'); let agent; -let mentionUrl = new URL('https://www.otherghostsite.com/'); -let mentionUrl2 = new URL('https://www.otherghostsite2.com/'); -let mentionHtml = `Check out this really cool other site.`; -let mentionHtml2 = `Check out this really cool other site.`; -let endpointUrl = new URL('https://www.endpoint.com/'); -let endpointUrl2 = new URL('https://www.endpoint2.com/'); -let targetHtml = `Some content`; -let targetHtml2 = `Some content`; +const mentionUrl = new URL('https://www.otherghostsite.com/'); +const mentionUrl2 = new URL('https://www.otherghostsite2.com/'); +const mentionHtml = `Check out this really cool other site.`; +const mentionHtml2 = `Check out this really cool other site.`; +const endpointUrl = new URL('https://www.endpoint.com/'); +const endpointUrl2 = new URL('https://www.endpoint2.com/'); +const targetHtml = `Some content`; +const targetHtml2 = `Some content`; let mentionMock; let endpointMock; const DomainEvents = require('@tryghost/domain-events'); @@ -204,7 +204,7 @@ describe('Mentions Service', function () { describe(`does send when we expect it to send`, function () { it('Newly published post (post.published)', async function () { - let publishedPost = { status: 'published', ...mentionsPost }; + const publishedPost = { status: 'published', ...mentionsPost }; await agent .post('posts/') .body({ posts: [publishedPost] }) @@ -380,7 +380,7 @@ describe('Mentions Service', function () { }); it('Newly published page (page.published)', async function () { - let publishedPage = { status: 'published', ...mentionsPost }; + const publishedPage = { status: 'published', ...mentionsPost }; await agent .post('pages/') .body({ pages: [publishedPage] }) diff --git a/ghost/core/test/integration/importer/v2.test.js b/ghost/core/test/integration/importer/v2.test.js index efdcec7a419..2dde39a7ec8 100644 --- a/ghost/core/test/integration/importer/v2.test.js +++ b/ghost/core/test/integration/importer/v2.test.js @@ -52,7 +52,7 @@ describe('Importer', function () { }); it('cares about invalid dates and date formats', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.posts[0] = testUtils.DataGenerator.forKnex.createPost({ created_at: '00-00-0000 00:00:00', @@ -108,7 +108,7 @@ describe('Importer', function () { }); it('warning that theme was not imported', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.settings[0] = testUtils.DataGenerator.forKnex.createSetting({ key: 'active_theme', @@ -134,7 +134,7 @@ describe('Importer', function () { }); it('removes duplicate users', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.users[0] = testUtils.DataGenerator.forKnex.createUser({ name: 'Joe Bloggs', @@ -158,7 +158,7 @@ describe('Importer', function () { }); it('removes duplicate posts', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.posts[0] = testUtils.DataGenerator.forKnex.createPost({ slug: 'same', @@ -182,7 +182,7 @@ describe('Importer', function () { }); it('does not treat posts without slug as duplicate', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.posts[0] = { title: 'duplicate title', @@ -206,7 +206,7 @@ describe('Importer', function () { }); it('can import user with missing allowed fields', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.users[0] = testUtils.DataGenerator.forKnex.createUser(); delete exportData.data.users[0].website; @@ -223,7 +223,7 @@ describe('Importer', function () { }); it('removes duplicate tags and updates associations', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.posts[0] = testUtils.DataGenerator.forKnex.createPost(); @@ -265,7 +265,7 @@ describe('Importer', function () { }); it('removes broken tags from post (not in db, not in file)', function () { - let exportData = exportedBodyV2().db[0]; + const exportData = exportedBodyV2().db[0]; exportData.data.posts[0] = testUtils.DataGenerator.forKnex.createPost({ slug: 'welcome-to-ghost-2', diff --git a/ghost/core/test/legacy/api/admin/identities.test.js b/ghost/core/test/legacy/api/admin/identities.test.js index 7126eeab49c..395f29fcf65 100644 --- a/ghost/core/test/legacy/api/admin/identities.test.js +++ b/ghost/core/test/legacy/api/admin/identities.test.js @@ -17,7 +17,7 @@ const verifyJWKS = (endpoint, token) => { async function getKey(header, callback) { const key = await client.getSigningKey(header.kid); - let signingKey = key.publicKey || key.rsaPublicKey; + const signingKey = key.publicKey || key.rsaPublicKey; callback(null, signingKey); } diff --git a/ghost/core/test/legacy/api/admin/settings.test.js b/ghost/core/test/legacy/api/admin/settings.test.js index ad6c450c2c6..c09fe38d755 100644 --- a/ghost/core/test/legacy/api/admin/settings.test.js +++ b/ghost/core/test/legacy/api/admin/settings.test.js @@ -662,7 +662,7 @@ describe('Settings API', function () { throw new Error('Invalid key or unchanged value'); } - let jsonResponse = await api.settings.edit( + const jsonResponse = await api.settings.edit( { settings: [{ key: 'email_verification_required', value: true }], }, diff --git a/ghost/core/test/legacy/api/admin/webhooks.test.js b/ghost/core/test/legacy/api/admin/webhooks.test.js index 6f92d381245..f403fc8e6f4 100644 --- a/ghost/core/test/legacy/api/admin/webhooks.test.js +++ b/ghost/core/test/legacy/api/admin/webhooks.test.js @@ -18,7 +18,7 @@ describe('Webhooks API', function () { }); it('Can create a webhook using integration', function () { - let webhookData = { + const webhookData = { event: 'test.create', target_url: 'http://example.com/webhooks/test/extra/canary', integration_id: 'ignore_me', @@ -64,7 +64,7 @@ describe('Webhooks API', function () { }); it('Fails validation for when integration_id is missing', function () { - let webhookData = { + const webhookData = { event: 'test.create', target_url: 'http://example.com/webhooks/test/extra/1', name: 'test', @@ -82,7 +82,7 @@ describe('Webhooks API', function () { }); it('Fails validation for non-lowercase event name', function () { - let webhookData = { + const webhookData = { event: 'tEst.evenT', target_url: 'http://example.com/webhooks/test/extra/1', name: 'test', @@ -100,7 +100,7 @@ describe('Webhooks API', function () { }); it('Fails validation when required fields are not present', function () { - let webhookData = { + const webhookData = { api_version: API_VERSION, integration_id: 'dummy', }; @@ -209,7 +209,7 @@ describe('Webhooks API', function () { }); it('Cannot edit webhooks using content api keys', function () { - let webhookData = { + const webhookData = { event: 'post.create', target_url: 'http://example.com/webhooks/test/extra/2', }; diff --git a/ghost/core/test/legacy/mock-express-style/utils/mock-express.js b/ghost/core/test/legacy/mock-express-style/utils/mock-express.js index 5a61ee66275..7048d06e089 100644 --- a/ghost/core/test/legacy/mock-express-style/utils/mock-express.js +++ b/ghost/core/test/legacy/mock-express-style/utils/mock-express.js @@ -2,8 +2,8 @@ const http = require('http'); module.exports = { invoke: function (app, reqParams) { - let req = new http.IncomingMessage(); - let res = new http.ServerResponse({ + const req = new http.IncomingMessage(); + const res = new http.ServerResponse({ method: reqParams.method, }); diff --git a/ghost/core/test/legacy/models/model-members.test.js b/ghost/core/test/legacy/models/model-members.test.js index 629422302fb..f1400c893c4 100644 --- a/ghost/core/test/legacy/models/model-members.test.js +++ b/ghost/core/test/legacy/models/model-members.test.js @@ -736,7 +736,7 @@ describe('Member Model', function run() { it('Should allow filtering on offers redeemed', async function () { const context = testUtils.context.admin; - let email = 'test@offers.com'; + const email = 'test@offers.com'; const member = await Member.add( { email: email, diff --git a/ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js b/ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js index 8f892365a05..0885f5aaf10 100644 --- a/ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js +++ b/ghost/core/test/unit/api/canary/utils/validators/input/pages.test.js @@ -136,7 +136,7 @@ describe('Unit: endpoints/utils/validators/input/pages', function () { }, }; - let result = validators.input.pages.add(apiConfig, frame); + const result = validators.input.pages.add(apiConfig, frame); assert(frame.data.pages[0].title); assert(frame.data.pages[0].authors); diff --git a/ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js b/ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js index 7ae2075afc8..b29d9daeb5e 100644 --- a/ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js +++ b/ghost/core/test/unit/api/canary/utils/validators/input/posts.test.js @@ -136,7 +136,7 @@ describe('Unit: endpoints/utils/validators/input/posts', function () { }, }; - let result = validators.input.posts.add(apiConfig, frame); + const result = validators.input.posts.add(apiConfig, frame); assert(frame.data.posts[0].title); assert(frame.data.posts[0].authors); diff --git a/ghost/core/test/unit/api/canary/utils/validators/input/tags.test.js b/ghost/core/test/unit/api/canary/utils/validators/input/tags.test.js index 7945562c375..ea37886598f 100644 --- a/ghost/core/test/unit/api/canary/utils/validators/input/tags.test.js +++ b/ghost/core/test/unit/api/canary/utils/validators/input/tags.test.js @@ -156,7 +156,7 @@ describe('Unit: endpoints/utils/validators/input/tags', function () { }, }; - let result = validators.input.tags.add(apiConfig, frame); + const result = validators.input.tags.add(apiConfig, frame); assert(frame.data.tags[0].name); assert.equal(frame.data.tags[0].parent, undefined); diff --git a/ghost/core/test/unit/frontend/helpers/concat.test.js b/ghost/core/test/unit/frontend/helpers/concat.test.js index bd5374f9013..b6dbb76c75e 100644 --- a/ghost/core/test/unit/frontend/helpers/concat.test.js +++ b/ghost/core/test/unit/frontend/helpers/concat.test.js @@ -37,70 +37,70 @@ describe('{{concat}} helper', function () { }); it('can correctly concat nothing', function () { - let templateString = '{{concat}}'; - let expected = ''; + const templateString = '{{concat}}'; + const expected = ''; shouldCompileToExpected(templateString, {}, expected); }); it('can correctly concat things that resolve to empty', function () { - let templateString = '{{concat tag.slug slug}}'; - let expected = ''; + const templateString = '{{concat tag.slug slug}}'; + const expected = ''; shouldCompileToExpected(templateString, { tag: {} }, expected); }); it('can concat simple strings', function () { - let templateString = '{{concat "hello" "world"}}'; - let expected = 'helloworld'; + const templateString = '{{concat "hello" "world"}}'; + const expected = 'helloworld'; shouldCompileToExpected(templateString, {}, expected); }); it('can concat simple strings with a custom separator', function () { - let templateString = '{{concat "hello" "world" separator=" "}}'; - let expected = 'hello world'; + const templateString = '{{concat "hello" "world" separator=" "}}'; + const expected = 'hello world'; shouldCompileToExpected(templateString, {}, expected); }); it('can concat strings and numbers', function () { - let templateString = '{{concat "abcd" 1234}}'; - let expected = 'abcd1234'; + const templateString = '{{concat "abcd" 1234}}'; + const expected = 'abcd1234'; shouldCompileToExpected(templateString, {}, expected); }); it('can concat strings and global variables', function () { - let templateString = '{{concat @site.url "?my=param"}}'; - let expected = 'https://siteurl.com?my=param'; + const templateString = '{{concat @site.url "?my=param"}}'; + const expected = 'https://siteurl.com?my=param'; shouldCompileToExpectedWithGlobals(templateString, {}, expected, defaultGlobals); }); it('can concat strings and local variables', function () { - let templateString = '{{concat tag.slug "?my=param"}}'; - let expected = 'my-tag?my=param'; + const templateString = '{{concat tag.slug "?my=param"}}'; + const expected = 'my-tag?my=param'; shouldCompileToExpected(templateString, { tag: { slug: 'my-tag' } }, expected); }); it('can concat strings from custom helpers (SafeStrings)', function () { // Simulate a post - using a draft to prove url helper gets called // because published posts get their urls from a cache that we don't have access to, so we just get 404 - let templateString = '{{concat (url) "?my=param"}}'; - let expected = '/p/1234/?my=param'; + const templateString = '{{concat (url) "?my=param"}}'; + const expected = '/p/1234/?my=param'; shouldCompileToExpected(templateString, draftPostData, expected); }); it('can concat mixed args', function () { - let templateString = '{{concat @site.url (url) "?slug=" slug}}'; - let expected = 'https://siteurl.com/p/1234/?slug=my-post'; + const templateString = '{{concat @site.url (url) "?slug=" slug}}'; + const expected = 'https://siteurl.com/p/1234/?slug=my-post'; shouldCompileToExpectedWithGlobals(templateString, draftPostData, expected, defaultGlobals); }); it('will output object Object for sill args', function () { - let templateString = '{{concat @site "?my=param"}}'; - let expected = '[object Object]?my=param'; + const templateString = '{{concat @site "?my=param"}}'; + const expected = '[object Object]?my=param'; shouldCompileToExpectedWithGlobals(templateString, {}, expected, defaultGlobals); }); it('can concat empty safestrings', function () { - let templateString = '{{concat non_empty_safe_string empty_safe_string}}'; - let expected = 'non_empty_safe_string'; + const templateString = '{{concat non_empty_safe_string empty_safe_string}}'; + const expected = 'non_empty_safe_string'; shouldCompileToExpected( templateString, { @@ -113,44 +113,44 @@ describe('{{concat}} helper', function () { it('can concat arrays with default separator', function () { const testArray = [new SafeString('hello'), new SafeString('world'), new SafeString('test')]; - let templateString = '{{concat test_array}}'; - let expected = 'helloworldtest'; + const templateString = '{{concat test_array}}'; + const expected = 'helloworldtest'; shouldCompileToExpected(templateString, { test_array: testArray }, expected); }); it('can concat arrays with custom separator', function () { const testArray = [new SafeString('hello'), new SafeString('world'), new SafeString('test')]; - let templateString = '{{concat test_array separator="|"}}'; - let expected = 'hello|world|test'; + const templateString = '{{concat test_array separator="|"}}'; + const expected = 'hello|world|test'; shouldCompileToExpected(templateString, { test_array: testArray }, expected); }); it('can concat arrays with empty strings', function () { const testArray = [new SafeString('hello'), new SafeString(''), new SafeString('world')]; - let templateString = '{{concat test_array separator="|"}}'; - let expected = 'hello||world'; + const templateString = '{{concat test_array separator="|"}}'; + const expected = 'hello||world'; shouldCompileToExpected(templateString, { test_array: testArray }, expected); }); it('can concat mixed arrays and strings', function () { const testArray = [new SafeString('array1'), new SafeString('array2')]; - let templateString = '{{concat "prefix" test_array "suffix" separator="-"}}'; - let expected = 'prefix-array1-array2-suffix'; + const templateString = '{{concat "prefix" test_array "suffix" separator="-"}}'; + const expected = 'prefix-array1-array2-suffix'; shouldCompileToExpected(templateString, { test_array: testArray }, expected); }); it('can concat multiple arrays', function () { const array1 = [new SafeString('a'), new SafeString('b')]; const array2 = [new SafeString('c'), new SafeString('d')]; - let templateString = '{{concat array1 array2 separator="|"}}'; - let expected = 'a|b|c|d'; + const templateString = '{{concat array1 array2 separator="|"}}'; + const expected = 'a|b|c|d'; shouldCompileToExpected(templateString, { array1: array1, array2: array2 }, expected); }); it('can concat arrays with trailing empty strings', function () { const testArray = [new SafeString('hello'), new SafeString('world'), new SafeString('')]; - let templateString = '{{concat test_array separator="|"}}'; - let expected = 'hello|world|'; + const templateString = '{{concat test_array separator="|"}}'; + const expected = 'hello|world|'; shouldCompileToExpected(templateString, { test_array: testArray }, expected); }); it('can concatenate an array produced by the split helper', function () { diff --git a/ghost/core/test/unit/frontend/helpers/content-api-url.test.js b/ghost/core/test/unit/frontend/helpers/content-api-url.test.js index e5f09454259..ceed6d0e4d9 100644 --- a/ghost/core/test/unit/frontend/helpers/content-api-url.test.js +++ b/ghost/core/test/unit/frontend/helpers/content-api-url.test.js @@ -27,19 +27,19 @@ describe('{{content_api_url}} helper', function () { }); it('should output an absolute url', async function () { - let result = content_api_url(); + const result = content_api_url(); const rendered = String(result); assert.equal(rendered, 'https://admin.tld:65535/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); }); it('should output an absolute url when passed true', async function () { - let result = content_api_url(true); + const result = content_api_url(true); const rendered = String(result); assert.equal(rendered, 'https://admin.tld:65535/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); }); it('should output a relative url when passed false', async function () { - let result = content_api_url(false); + const result = content_api_url(false); const rendered = String(result); assert.equal(rendered, '/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); @@ -58,19 +58,19 @@ describe('{{content_api_url}} helper', function () { }); it('should output an absolute url', async function () { - let result = content_api_url(); + const result = content_api_url(); const rendered = String(result); assert.equal(rendered, 'https://admin.tld:65535/blog/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); }); it('should output an absolute url when passed true', async function () { - let result = content_api_url(true); + const result = content_api_url(true); const rendered = String(result); assert.equal(rendered, 'https://admin.tld:65535/blog/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); }); it('should output a relative url when passed false', async function () { - let result = content_api_url(false); + const result = content_api_url(false); const rendered = String(result); assert.equal(rendered, '/blog/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); @@ -86,14 +86,14 @@ describe('{{content_api_url}} helper', function () { }); it('gives the site url without a subdirectory', async function () { - let result = content_api_url(); + const result = content_api_url(); const rendered = String(result); assert.equal(rendered, 'http://localhost:65535/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); }); it('gives the site url with a subdirectory', async function () { configUtils.set({ url: 'http://localhost:65535/blog', 'admin:url': undefined }); - let result = content_api_url(); + const result = content_api_url(); const rendered = String(result); assert.equal(rendered, 'http://localhost:65535/blog/ghost/api/content/'); sinon.assert.notCalled(logWarnStub); diff --git a/ghost/core/test/unit/frontend/helpers/date.test.js b/ghost/core/test/unit/frontend/helpers/date.test.js index 0da52d45913..76cbb107ac7 100644 --- a/ghost/core/test/unit/frontend/helpers/date.test.js +++ b/ghost/core/test/unit/frontend/helpers/date.test.js @@ -206,7 +206,7 @@ describe('{{date}} helper', function () { }, }; - let invalidDate = 'Fred'; + const invalidDate = 'Fred'; let rendered; rendered = date.call({ published_at: invalidDate }, context); diff --git a/ghost/core/test/unit/frontend/helpers/ghost-head.test.js b/ghost/core/test/unit/frontend/helpers/ghost-head.test.js index 40ba1f8e384..826809a0424 100644 --- a/ghost/core/test/unit/frontend/helpers/ghost-head.test.js +++ b/ghost/core/test/unit/frontend/helpers/ghost-head.test.js @@ -56,10 +56,10 @@ async function testGhostHead(options) { } describe('{{ghost_head}} helper', function () { - let posts = []; - let tags = []; - let authors = []; - let users = []; + const posts = []; + const tags = []; + const authors = []; + const users = []; let getStub; let routingRegistryGetRssUrlStub; @@ -1880,7 +1880,7 @@ describe('{{ghost_head}} helper', function () { getStub.withArgs('members_enabled').returns(true); getStub.withArgs('paid_members_enabled').returns(true); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: '' }, ...testUtils.createHbsResponse({ locals: { @@ -1898,7 +1898,7 @@ describe('{{ghost_head}} helper', function () { getStub.withArgs('members_enabled').returns(true); getStub.withArgs('paid_members_enabled').returns(true); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: 'search' }, ...testUtils.createHbsResponse({ locals: { @@ -1916,7 +1916,7 @@ describe('{{ghost_head}} helper', function () { getStub.withArgs('members_enabled').returns(true); getStub.withArgs('paid_members_enabled').returns(true); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: 'portal' }, ...testUtils.createHbsResponse({ locals: { @@ -1934,7 +1934,7 @@ describe('{{ghost_head}} helper', function () { getStub.withArgs('members_enabled').returns(true); getStub.withArgs('paid_members_enabled').returns(true); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: 'portal,search' }, ...testUtils.createHbsResponse({ locals: { @@ -1955,7 +1955,7 @@ describe('{{ghost_head}} helper', function () { getStub.withArgs('announcement_content').returns('Hello world'); getStub.withArgs('announcement_visibility').returns('visitors'); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: '' }, ...testUtils.createHbsResponse({ locals: { @@ -1976,7 +1976,7 @@ describe('{{ghost_head}} helper', function () { getStub.withArgs('announcement_content').returns('Hello world'); getStub.withArgs('announcement_visibility').returns('visitors'); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: 'announcement' }, ...testUtils.createHbsResponse({ locals: { @@ -1995,7 +1995,7 @@ describe('{{ghost_head}} helper', function () { it('does not load the comments script when exclude contains comment_counts', async function () { getStub.withArgs('comments_enabled').returns('all'); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: 'comment_counts' }, ...testUtils.createHbsResponse({ locals: { @@ -2195,7 +2195,7 @@ describe('{{ghost_head}} helper', function () { // mock the card assets cardAssets.hasFile('js', 'cards.min.js').returns(true); sinon.stub(cardAssets, 'hasFile').returns(true); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ ...testUtils.createHbsResponse({ locals: { relativeUrl: '/', @@ -2209,7 +2209,7 @@ describe('{{ghost_head}} helper', function () { }); it('does not load card assets when excluded with card_assets', async function () { sinon.stub(cardAssets, 'hasFile').returns(true); - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: 'card_assets' }, ...testUtils.createHbsResponse({ locals: { @@ -2223,7 +2223,7 @@ describe('{{ghost_head}} helper', function () { assert.doesNotMatch(rendered, /cards.min.css/); }); it('does not load meta tags when excluded with metadata', async function () { - let rendered = await testGhostHead({ + const rendered = await testGhostHead({ hash: { exclude: 'metadata' }, ...testUtils.createHbsResponse({ locals: { @@ -2236,7 +2236,7 @@ describe('{{ghost_head}} helper', function () { assert.doesNotMatch(rendered, /alert("gotcha")' }; - let rendered; optionsData.data.site.navigation = [firstItem]; - rendered = runHelper(optionsData); + const rendered = runHelper(optionsData); assertExists(rendered); assert(rendered.string.includes('foo=space%20bar')); @@ -261,10 +253,9 @@ describe('{{navigation}} helper', function () { it("doesn't double-encode URLs", function () { const firstItem = { label: 'Foo', url: '/?foo=space%20bar' }; - let rendered; optionsData.data.site.navigation = [firstItem]; - rendered = runHelper(optionsData); + const rendered = runHelper(optionsData); assertExists(rendered); assert(!rendered.string.includes('foo=space%2520bar')); @@ -414,11 +405,10 @@ describe('{{navigation}} helper', function () { it('can render one item', function () { const singleItem = { label: 'Foo', url: '/foo' }; const testUrl = 'href="' + configUtils.config.get('url') + '/foo"'; - let rendered; optionsData.data.site.secondary_navigation = [singleItem]; optionsData.hash = { type: 'secondary' }; - rendered = runHelper(optionsData); + const rendered = runHelper(optionsData); assertExists(rendered); assert(rendered.string.includes('li')); @@ -431,11 +421,10 @@ describe('{{navigation}} helper', function () { const secondItem = { label: 'Bar Baz Qux', url: '/qux' }; const testUrl = 'href="' + configUtils.config.get('url') + '/foo"'; const testUrl2 = 'href="' + configUtils.config.get('url') + '/qux"'; - let rendered; optionsData.data.site.secondary_navigation = [firstItem, secondItem]; optionsData.hash = { type: 'secondary' }; - rendered = runHelper(optionsData); + const rendered = runHelper(optionsData); assertExists(rendered); assert(rendered.string.includes('nav-foo')); @@ -472,12 +461,11 @@ describe('{{navigation}} helper with custom template', function () { it('can render one item and @site title', function () { const testUrl = 'href="' + configUtils.config.get('url') + '/foo"'; - let rendered; // Set @site.title optionsData.data.site.title = 'Chaos is a ladder.'; - rendered = runHelper(optionsData); + const rendered = runHelper(optionsData); assertExists(rendered); assert(rendered.string.includes('Chaos is a ladder')); @@ -489,12 +477,11 @@ describe('{{navigation}} helper with custom template', function () { it('can pass attributes through', function () { const testUrl = 'href="' + configUtils.config.get('url') + '/foo"'; - let rendered; // Simulate {{navigation isHeader=true}} optionsData.hash = { isHeader: true }; - rendered = runHelper(optionsData); + const rendered = runHelper(optionsData); assertExists(rendered); assert(!rendered.string.includes('Chaos is a ladder')); @@ -506,12 +493,11 @@ describe('{{navigation}} helper with custom template', function () { it('sets isSecondary for type=secondary', function () { const testUrl = 'href="' + configUtils.config.get('url') + '/foo"'; - let rendered; // Simulate {{navigation type="secondary"}} optionsData.hash = { type: 'secondary' }; - rendered = runHelper(optionsData); + const rendered = runHelper(optionsData); assertExists(rendered); assert(!rendered.string.includes('Chaos is a ladder')); diff --git a/ghost/core/test/unit/frontend/helpers/t-new.test.js b/ghost/core/test/unit/frontend/helpers/t-new.test.js index ebd53dca21d..6160f7709a6 100644 --- a/ghost/core/test/unit/frontend/helpers/t-new.test.js +++ b/ghost/core/test/unit/frontend/helpers/t-new.test.js @@ -6,7 +6,7 @@ const themeI18next = require('../../../../core/frontend/services/theme-engine/i1 const labs = require('../../../../core/shared/labs'); describe('NEW{{t}} helper', function () { - let ogBasePath = themeI18next.basePath; + const ogBasePath = themeI18next.basePath; beforeAll(function () { sinon.stub(labs, 'isSet').withArgs('themeTranslation').returns(true); @@ -26,7 +26,7 @@ describe('NEW{{t}} helper', function () { it('theme translation is DE', function () { themeI18next.init({ activeTheme: 'locale-theme', locale: 'de' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -36,7 +36,7 @@ describe('NEW{{t}} helper', function () { it('theme translation is EN', function () { themeI18next.init({ activeTheme: 'locale-theme', locale: 'en' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -46,7 +46,7 @@ describe('NEW{{t}} helper', function () { it('[fallback] no theme translation file found for FR', function () { themeI18next.init({ activeTheme: 'locale-theme', locale: 'fr' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -56,7 +56,7 @@ describe('NEW{{t}} helper', function () { it('[fallback] no theme files at all, use key as translation', function () { themeI18next.init({ activeTheme: 'locale-theme-1.4', locale: 'de' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -64,7 +64,7 @@ describe('NEW{{t}} helper', function () { }); it('returns an empty string if translation key is an empty string', function () { - let rendered = t.call({}, '', { + const rendered = t.call({}, '', { hash: {}, }); @@ -72,7 +72,7 @@ describe('NEW{{t}} helper', function () { }); it('returns an empty string if translation key is missing', function () { - let rendered = t.call({}, undefined, { + const rendered = t.call({}, undefined, { hash: {}, }); @@ -82,7 +82,7 @@ describe('NEW{{t}} helper', function () { it('returns a translated string even if no options are passed', function () { themeI18next.init({ activeTheme: 'locale-theme', locale: 'en' }); - let rendered = t.call({}, 'Top left Button'); + const rendered = t.call({}, 'Top left Button'); assert.equal(rendered, 'Left Button on Top'); }); diff --git a/ghost/core/test/unit/frontend/helpers/t.test.js b/ghost/core/test/unit/frontend/helpers/t.test.js index c6fc2f3cbf2..89df58b233a 100644 --- a/ghost/core/test/unit/frontend/helpers/t.test.js +++ b/ghost/core/test/unit/frontend/helpers/t.test.js @@ -4,7 +4,7 @@ const t = require('../../../../core/frontend/helpers/t'); const themeI18n = require('../../../../core/frontend/services/theme-engine/i18n'); describe('{{t}} helper', function () { - let ogBasePath = themeI18n.basePath; + const ogBasePath = themeI18n.basePath; beforeAll(function () { themeI18n.basePath = path.join(__dirname, '../../../utils/fixtures/themes/'); @@ -17,7 +17,7 @@ describe('{{t}} helper', function () { it('theme translation is DE', function () { themeI18n.init({ activeTheme: 'locale-theme', locale: 'de' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -27,7 +27,7 @@ describe('{{t}} helper', function () { it('theme translation is EN', function () { themeI18n.init({ activeTheme: 'locale-theme', locale: 'en' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -37,7 +37,7 @@ describe('{{t}} helper', function () { it('[fallback] no theme translation file found for FR', function () { themeI18n.init({ activeTheme: 'locale-theme', locale: 'fr' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -47,7 +47,7 @@ describe('{{t}} helper', function () { it('[fallback] no theme files at all, use key as translation', function () { themeI18n.init({ activeTheme: 'locale-theme-1.4', locale: 'de' }); - let rendered = t.call({}, 'Top left Button', { + const rendered = t.call({}, 'Top left Button', { hash: {}, }); @@ -55,7 +55,7 @@ describe('{{t}} helper', function () { }); it('returns an empty string if translation key is an empty string', function () { - let rendered = t.call({}, '', { + const rendered = t.call({}, '', { hash: {}, }); @@ -63,7 +63,7 @@ describe('{{t}} helper', function () { }); it('returns an empty string if translation key is missing', function () { - let rendered = t.call({}, undefined, { + const rendered = t.call({}, undefined, { hash: {}, }); @@ -73,7 +73,7 @@ describe('{{t}} helper', function () { it('returns a translated string even if no options are passed', function () { themeI18n.init({ activeTheme: 'locale-theme', locale: 'en' }); - let rendered = t.call({}, 'Top left Button'); + const rendered = t.call({}, 'Top left Button'); assert.equal(rendered, 'Left Button on Top'); }); diff --git a/ghost/core/test/unit/frontend/meta/blog-logo.test.js b/ghost/core/test/unit/frontend/meta/blog-logo.test.js index b67cf9fd5a4..ccc6a5c38bc 100644 --- a/ghost/core/test/unit/frontend/meta/blog-logo.test.js +++ b/ghost/core/test/unit/frontend/meta/blog-logo.test.js @@ -11,8 +11,6 @@ describe('getBlogLogo', function () { }); it('should return logo if uploaded', function () { - let blogLogo; - sinon.stub(settingsCache, 'get').callsFake(function (key) { return { logo: '/content/images/logo.png', @@ -20,14 +18,12 @@ describe('getBlogLogo', function () { }[key]; }); - blogLogo = getBlogLogo(); + const blogLogo = getBlogLogo(); assertExists(blogLogo); assert.equal(blogLogo.url, `${config.get('url')}/content/images/logo.png`); }); it('should return custom uploaded png icon if no logo given', function () { - let blogLogo; - sinon.stub(settingsCache, 'get').callsFake(function (key) { return { logo: null, @@ -35,7 +31,7 @@ describe('getBlogLogo', function () { }[key]; }); - blogLogo = getBlogLogo(); + const blogLogo = getBlogLogo(); assertExists(blogLogo); assert.equal(blogLogo.url, `${config.get('url')}/content/images/size/w256h256/favicon.png`); }); diff --git a/ghost/core/test/unit/frontend/meta/url.test.js b/ghost/core/test/unit/frontend/meta/url.test.js index 5bf8a7535fd..8849c9207fc 100644 --- a/ghost/core/test/unit/frontend/meta/url.test.js +++ b/ghost/core/test/unit/frontend/meta/url.test.js @@ -166,7 +166,7 @@ describe('getUrl', function () { urlUtilsUrlForStub .withArgs({ relativeUrl: '/p/' + post.uuid + '/' }, null, undefined) .returns('relative'); - let url = getUrl(post); + const url = getUrl(post); sinon.assert.calledOnce(urlServiceGetUrlForResourceStub); sinon.assert.calledOnce( @@ -184,7 +184,7 @@ describe('getUrl', function () { urlUtilsUrlForStub .withArgs({ relativeUrl: '/p/' + post.uuid + '/' }, null, true) .returns('absolute'); - let url = getUrl(post, true); + const url = getUrl(post, true); sinon.assert.calledOnce(urlServiceGetUrlForResourceStub); sinon.assert.calledOnce( diff --git a/ghost/core/test/unit/frontend/services/assets-minification/minifier.test.js b/ghost/core/test/unit/frontend/services/assets-minification/minifier.test.js index 38ae0b0cedf..2725f8c2698 100644 --- a/ghost/core/test/unit/frontend/services/assets-minification/minifier.test.js +++ b/ghost/core/test/unit/frontend/services/assets-minification/minifier.test.js @@ -32,7 +32,7 @@ describe('Minifier', function () { describe('getMatchingFiles expands globs correctly', function () { it('star glob e.g. css/*.css', async function () { - let result = await minifier.getMatchingFiles('css/*.css'); + const result = await minifier.getMatchingFiles('css/*.css'); assert(Array.isArray(result)); assert.equal(result.length, 3); @@ -42,7 +42,7 @@ describe('Minifier', function () { }); it('match glob range e.g. css/bookmark.css and css/empty.css (css/@(bookmark|empty).css)', async function () { - let result = await minifier.getMatchingFiles('css/@(bookmark|empty).css'); + const result = await minifier.getMatchingFiles('css/@(bookmark|empty).css'); assert(Array.isArray(result)); assert.equal(result.length, 2); @@ -51,7 +51,7 @@ describe('Minifier', function () { }); it('reverse match glob e.g. css/!(bookmark).css', async function () { - let result = await minifier.getMatchingFiles('css/!(bookmark).css'); + const result = await minifier.getMatchingFiles('css/!(bookmark).css'); assert(Array.isArray(result)); assert.equal(result.length, 2); @@ -59,7 +59,7 @@ describe('Minifier', function () { assert.equal(result[1], expectedFixturePath('gallery.css')); }); it('reverse match glob e.g. css/!(bookmark|gallery).css', async function () { - let result = await minifier.getMatchingFiles('css/!(bookmark|gallery).css'); + const result = await minifier.getMatchingFiles('css/!(bookmark|gallery).css'); assert(Array.isArray(result)); assert.equal(result.length, 1); @@ -69,7 +69,7 @@ describe('Minifier', function () { describe('Minify', function () { it('single type, single file', async function () { - let result = await minifier.minify({ + const result = await minifier.minify({ 'card.min.js': 'js/*.js', }); assert(Array.isArray(result)); @@ -77,7 +77,7 @@ describe('Minifier', function () { }); it('single type, multi file', async function () { - let result = await minifier.minify({ + const result = await minifier.minify({ 'card.min.css': 'css/*.css', }); assert(Array.isArray(result)); @@ -85,7 +85,7 @@ describe('Minifier', function () { }); it('both css and js types + multiple files', async function () { - let result = await minifier.minify({ + const result = await minifier.minify({ 'card.min.js': 'js/*.js', 'card.min.css': 'css/*.css', }); @@ -95,7 +95,7 @@ describe('Minifier', function () { }); it('can replace the content', async function () { - let result = await minifier.minify( + const result = await minifier.minify( { 'card.min.js': 'js/*.js', }, @@ -161,7 +161,7 @@ describe('Minifier', function () { }); it('can minify empty js correctly to no result', async function () { - let result = await minifier.minify({ + const result = await minifier.minify({ 'card.min.js': 'js/empty.js', }); @@ -169,7 +169,7 @@ describe('Minifier', function () { }); it('can minify empty css correctly to no result', async function () { - let result = await minifier.minify({ + const result = await minifier.minify({ 'card.min.css': 'css/empty.css', }); diff --git a/ghost/core/test/unit/frontend/services/rendering/templates.test.js b/ghost/core/test/unit/frontend/services/rendering/templates.test.js index d143e8ff047..0ce86f405ec 100644 --- a/ghost/core/test/unit/frontend/services/rendering/templates.test.js +++ b/ghost/core/test/unit/frontend/services/rendering/templates.test.js @@ -7,7 +7,7 @@ const themeEngine = require('../../../../../core/frontend/services/theme-engine' describe('templates', function () { let getActiveThemeStub; let hasTemplateStub; - let templateHelpers = templates; + const templateHelpers = templates; afterEach(function () { sinon.restore(); diff --git a/ghost/core/test/unit/frontend/services/routing/controllers/channel.test.js b/ghost/core/test/unit/frontend/services/routing/controllers/channel.test.js index dac10ee014f..524cc9dedc9 100644 --- a/ghost/core/test/unit/frontend/services/routing/controllers/channel.test.js +++ b/ghost/core/test/unit/frontend/services/routing/controllers/channel.test.js @@ -58,7 +58,7 @@ describe('Unit - services/routing/controllers/channel', function () { }); it('no params', async function () { - let next = sinon.stub(); + const next = sinon.stub(); fetchDataStub .withArgs({ page: 1, slug: undefined, limit: postsPerPage }, res.routerOptions) @@ -79,7 +79,7 @@ describe('Unit - services/routing/controllers/channel', function () { }); it('pass page param', async function () { - let next = sinon.stub(); + const next = sinon.stub(); req.params.page = 2; fetchDataStub @@ -101,7 +101,7 @@ describe('Unit - services/routing/controllers/channel', function () { }); it('update hbs engine: router defines limit', async function () { - let next = sinon.stub(); + const next = sinon.stub(); res.routerOptions.limit = 3; req.params.page = 2; @@ -127,7 +127,7 @@ describe('Unit - services/routing/controllers/channel', function () { }); it('page param too big', async function () { - let next = sinon.stub(); + const next = sinon.stub(); req.params.page = 6; fetchDataStub @@ -149,7 +149,7 @@ describe('Unit - services/routing/controllers/channel', function () { }); it('slug param', async function () { - let next = sinon.stub(); + const next = sinon.stub(); req.params.slug = 'unsafe'; fetchDataStub @@ -171,7 +171,7 @@ describe('Unit - services/routing/controllers/channel', function () { }); it('invalid posts per page', async function () { - let next = sinon.stub(); + const next = sinon.stub(); postsPerPage = -1; fetchDataStub.withArgs({ page: 1, slug: undefined }, res.routerOptions).resolves({ diff --git a/ghost/core/test/unit/frontend/services/rss/cache.test.js b/ghost/core/test/unit/frontend/services/rss/cache.test.js index 5c7507e8011..23e27101073 100644 --- a/ghost/core/test/unit/frontend/services/rss/cache.test.js +++ b/ghost/core/test/unit/frontend/services/rss/cache.test.js @@ -26,13 +26,12 @@ describe('RSS: Cache', function () { posts: [], meta: { pagination: { pages: 1 } }, }; - let xmlData1; const baseUrl = `/rss-${crypto.randomUUID()}/`; const _xmlData = await rssCache.getXML(baseUrl, data); - xmlData1 = _xmlData; + const xmlData1 = _xmlData; sinon.assert.notCalled(loggingInfoSpy); diff --git a/ghost/core/test/unit/frontend/services/sitemap/generator.test.js b/ghost/core/test/unit/frontend/services/sitemap/generator.test.js index 885e86dee7c..a6da43fbf5b 100644 --- a/ghost/core/test/unit/frontend/services/sitemap/generator.test.js +++ b/ghost/core/test/unit/frontend/services/sitemap/generator.test.js @@ -408,10 +408,6 @@ describe('Generators', function () { }); it('compare content output', function () { - let idxFirst; - let idxSecond; - let idxThird; - urlUtilsUrlForStub .withArgs('image', { image: 'post-100.jpg' }, true) .returns('http://my-ghost-blog.com/images/post-100.jpg'); @@ -471,9 +467,9 @@ describe('Generators', function () { assert(xml.includes('http://my-ghost-blog.com/images/post-300.jpg')); // Validate order newest to oldest - idxFirst = xml.indexOf('http://my-ghost-blog.com/url/300/'); - idxSecond = xml.indexOf('http://my-ghost-blog.com/url/200/'); - idxThird = xml.indexOf('http://my-ghost-blog.com/url/100/'); + const idxFirst = xml.indexOf('http://my-ghost-blog.com/url/300/'); + const idxSecond = xml.indexOf('http://my-ghost-blog.com/url/200/'); + const idxThird = xml.indexOf('http://my-ghost-blog.com/url/100/'); assert(idxFirst < idxSecond); assert(idxSecond < idxThird); diff --git a/ghost/core/test/unit/frontend/services/sitemap/manager.test.js b/ghost/core/test/unit/frontend/services/sitemap/manager.test.js index 5bf3d88adc9..e578bbd1260 100644 --- a/ghost/core/test/unit/frontend/services/sitemap/manager.test.js +++ b/ghost/core/test/unit/frontend/services/sitemap/manager.test.js @@ -18,15 +18,10 @@ describe('Unit: sitemap/manager', function () { let eventsToRemember; const makeStubManager = function () { - let posts; - let pages; - let tags; - let authors; - - posts = new PostGenerator(); - pages = new PageGenerator(); - tags = new TagGenerator(); - authors = new UserGenerator(); + const posts = new PostGenerator(); + const pages = new PageGenerator(); + const tags = new TagGenerator(); + const authors = new UserGenerator(); // The index is built from the url service on first read, so even the // legacy render tests need one injected. diff --git a/ghost/core/test/unit/frontend/services/theme-engine/i18n.test.js b/ghost/core/test/unit/frontend/services/theme-engine/i18n.test.js index 16d8785a731..cc8e5ec9fbe 100644 --- a/ghost/core/test/unit/frontend/services/theme-engine/i18n.test.js +++ b/ghost/core/test/unit/frontend/services/theme-engine/i18n.test.js @@ -23,7 +23,7 @@ describe('I18n Class behavior', function () { it('will fallback to en file correctly without changing locale', function () { const i18n = new I18n({ locale: 'fr' }); - let fileSpy = sinon.spy(i18n, '_readTranslationsFile'); + const fileSpy = sinon.spy(i18n, '_readTranslationsFile'); assert.equal(i18n.locale(), 'fr'); i18n.init(); diff --git a/ghost/core/test/unit/frontend/services/theme-engine/preview.test.js b/ghost/core/test/unit/frontend/services/theme-engine/preview.test.js index 28db9aaf1bb..4dada7ee976 100644 --- a/ghost/core/test/unit/frontend/services/theme-engine/preview.test.js +++ b/ghost/core/test/unit/frontend/services/theme-engine/preview.test.js @@ -18,7 +18,7 @@ describe('Theme Preview', function () { it('can handle empty strings', function () { previewString = 'logo='; - let siteData = preview.handle(req, {}); + const siteData = preview.handle(req, {}); assert.equal(siteData.logo, null); }); @@ -26,7 +26,7 @@ describe('Theme Preview', function () { it('can handle nulls', function () { previewString = 'cover=null'; - let siteData = preview.handle(req, {}); + const siteData = preview.handle(req, {}); assert.equal(siteData.cover_image, null); }); @@ -34,7 +34,7 @@ describe('Theme Preview', function () { it('can handle URIEncoded accent colors', function () { previewString = 'c=%23f02d2d'; - let siteData = preview.handle(req, {}); + const siteData = preview.handle(req, {}); assert.equal(siteData.accent_color, '#f02d2d'); }); @@ -42,7 +42,7 @@ describe('Theme Preview', function () { it('can handle multiple values', function () { previewString = 'c=%23f02d2d&icon=&logo=&cover=null'; - let siteData = preview.handle(req, {}); + const siteData = preview.handle(req, {}); assert.equal(siteData.accent_color, '#f02d2d'); assert.equal(siteData.icon, null); diff --git a/ghost/core/test/unit/server/data/schema/integrity.test.js b/ghost/core/test/unit/server/data/schema/integrity.test.js index 15dd8acca19..3809127c273 100644 --- a/ghost/core/test/unit/server/data/schema/integrity.test.js +++ b/ghost/core/test/unit/server/data/schema/integrity.test.js @@ -56,10 +56,6 @@ describe('DB version integrity', function () { ); const tablesNoValidation = _.cloneDeep(schema); - let schemaHash; - let fixturesHash; - let settingsHash; - let routesHash; _.each(tablesNoValidation, function (table) { return _.each(table, function (column, name) { @@ -67,19 +63,19 @@ describe('DB version integrity', function () { }); }); - schemaHash = crypto + const schemaHash = crypto .createHash('md5') .update(JSON.stringify(tablesNoValidation), 'binary') .digest('hex'); - fixturesHash = crypto + const fixturesHash = crypto .createHash('md5') .update(JSON.stringify(fixtures), 'binary') .digest('hex'); - settingsHash = crypto + const settingsHash = crypto .createHash('md5') .update(JSON.stringify(defaultSettings), 'binary') .digest('hex'); - routesHash = crypto + const routesHash = crypto .createHash('md5') .update(JSON.stringify(defaultRoutes), 'binary') .digest('hex'); diff --git a/ghost/core/test/unit/server/lib/image/cached-image-size-from-url.test.js b/ghost/core/test/unit/server/lib/image/cached-image-size-from-url.test.js index 94f985a9fd1..4165b686d88 100644 --- a/ghost/core/test/unit/server/lib/image/cached-image-size-from-url.test.js +++ b/ghost/core/test/unit/server/lib/image/cached-image-size-from-url.test.js @@ -19,7 +19,6 @@ describe('lib/image: image size cache', function () { it('should read from cache, if dimensions for image are fetched already', async function () { const url = 'http://mysite.com/content/image/mypostcoverimage.jpg'; - let imageSizeSpy; sizeOfStub.resolves({ width: 50, @@ -33,7 +32,7 @@ describe('lib/image: image size cache', function () { cache: cacheStore, }); - imageSizeSpy = sizeOfStub; + const imageSizeSpy = sizeOfStub; await cachedImageSizeFromUrl.getCachedImageSizeFromUrl(url); @@ -176,9 +175,8 @@ describe('lib/image: image size cache', function () { cache: new InMemoryCache(), }); const url = null; - let result; - result = await cachedImageSizeFromUrl.getCachedImageSizeFromUrl(url); + const result = await cachedImageSizeFromUrl.getCachedImageSizeFromUrl(url); assert.equal(result, null); }); diff --git a/ghost/core/test/unit/server/lib/package-json/filter.test.js b/ghost/core/test/unit/server/lib/package-json/filter.test.js index 9b9a6f2443a..b20fc38e5fb 100644 --- a/ghost/core/test/unit/server/lib/package-json/filter.test.js +++ b/ghost/core/test/unit/server/lib/package-json/filter.test.js @@ -42,11 +42,10 @@ describe('package-json filter', function () { it('should filter packages correctly', function () { const result = packageJSON.filter({ casper: casper }); - let package1; assert(Array.isArray(result)); assert.equal(result.length, 1); - package1 = result[0]; + const package1 = result[0]; assert(package1 && typeof package1 === 'object'); assert('name' in package1); @@ -63,13 +62,11 @@ describe('package-json filter', function () { it('should filter packages and handle a single active package string', function () { const result = packageJSON.filter({ casper: casper, simple: simplePackage }, 'casper'); - let package1; - let package2; assert(Array.isArray(result)); assert.equal(result.length, 2); - package1 = result[0]; - package2 = result[1]; + const package1 = result[0]; + const package2 = result[1]; assert(package1 && typeof package1 === 'object'); assert('name' in package1); @@ -101,13 +98,11 @@ describe('package-json filter', function () { 'casper', 'simple', ]); - let package1; - let package2; assert(Array.isArray(result)); assert.equal(result.length, 2); - package1 = result[0]; - package2 = result[1]; + const package1 = result[0]; + const package2 = result[1]; assert(package1 && typeof package1 === 'object'); assert('name' in package1); @@ -136,13 +131,11 @@ describe('package-json filter', function () { it('handles packages with no package.json even though this makes us sad', function () { const result = packageJSON.filter({ casper: casper, missing: missingPackageJson }, ['casper']); - let package1; - let package2; assert(Array.isArray(result)); assert.equal(result.length, 2); - package1 = result[0]; - package2 = result[1]; + const package1 = result[0]; + const package2 = result[1]; assert(package1 && typeof package1 === 'object'); assert('name' in package1); diff --git a/ghost/core/test/unit/server/lib/package-json/read.test.js b/ghost/core/test/unit/server/lib/package-json/read.test.js index 1c38693e0d6..de541a326cc 100644 --- a/ghost/core/test/unit/server/lib/package-json/read.test.js +++ b/ghost/core/test/unit/server/lib/package-json/read.test.js @@ -35,11 +35,8 @@ describe('package-json read', function () { }); it('should read directory and parse package.json files', async function () { - let packagePath; - let pkgJson; - - packagePath = tmp.dirSync({ unsafeCleanup: true }); - pkgJson = JSON.stringify({ + const packagePath = tmp.dirSync({ unsafeCleanup: true }); + const pkgJson = JSON.stringify({ name: 'test', version: '0.0.0', }); @@ -67,11 +64,8 @@ describe('package-json read', function () { }); it('should read directory and ignore invalid package.json files', async function () { - let packagePath; - let pkgJson; - - packagePath = tmp.dirSync({ unsafeCleanup: true }); - pkgJson = JSON.stringify({ + const packagePath = tmp.dirSync({ unsafeCleanup: true }); + const pkgJson = JSON.stringify({ name: 'test', }); @@ -95,11 +89,8 @@ describe('package-json read', function () { }); it('should read directory and include symlinked directories', async function () { - let packagePath; - let pkgJson; - - packagePath = tmp.dirSync({ unsafeCleanup: true }); - pkgJson = JSON.stringify({ + const packagePath = tmp.dirSync({ unsafeCleanup: true }); + const pkgJson = JSON.stringify({ name: 'test', }); @@ -188,11 +179,8 @@ describe('package-json read', function () { }); it('should read directory and parse package.json files', async function () { - let packagePath; - let pkgJson; - - packagePath = tmp.dirSync({ unsafeCleanup: true }); - pkgJson = JSON.stringify({ + const packagePath = tmp.dirSync({ unsafeCleanup: true }); + const pkgJson = JSON.stringify({ name: 'test', version: '0.0.0', }); @@ -220,11 +208,8 @@ describe('package-json read', function () { }); it('should read directory and ignore invalid package.json files', async function () { - let packagePath; - let pkgJson; - - packagePath = tmp.dirSync({ unsafeCleanup: true }); - pkgJson = JSON.stringify({ + const packagePath = tmp.dirSync({ unsafeCleanup: true }); + const pkgJson = JSON.stringify({ name: 'test', }); diff --git a/ghost/core/test/unit/server/models/base/index.test.js b/ghost/core/test/unit/server/models/base/index.test.js index ae61b9f97a0..2d4c3a71cc4 100644 --- a/ghost/core/test/unit/server/models/base/index.test.js +++ b/ghost/core/test/unit/server/models/base/index.test.js @@ -12,7 +12,7 @@ describe('Models: base', function () { describe('generateSlug', function () { let Model; - let options = {}; + const options = {}; let securityStringSafeStub; beforeEach(function () { securityStringSafeStub = sinon.stub(security.string, 'safe'); diff --git a/ghost/core/test/unit/server/models/custom-theme-setting.test.js b/ghost/core/test/unit/server/models/custom-theme-setting.test.js index e79394456eb..1287ac3477c 100644 --- a/ghost/core/test/unit/server/models/custom-theme-setting.test.js +++ b/ghost/core/test/unit/server/models/custom-theme-setting.test.js @@ -73,7 +73,7 @@ describe('Unit: models/custom-theme-setting', function () { it('transforms urls when persisting to db', function () { const setting = CustomThemeSetting.forge(); - let returns = setting.formatOnWrite({ + const returns = setting.formatOnWrite({ theme: 'test', key: 'something', value: '/assets/image.jpg', diff --git a/ghost/core/test/unit/server/models/user.test.js b/ghost/core/test/unit/server/models/user.test.js index 898cd611e7f..11715639256 100644 --- a/ghost/core/test/unit/server/models/user.test.js +++ b/ghost/core/test/unit/server/models/user.test.js @@ -102,7 +102,7 @@ describe('Unit: models/user', function () { }); it('email cannot be blank', function () { - let data = { name: 'name' }; + const data = { name: 'name' }; sinon.stub(models.User, 'findOne').resolves(null); return models.User.add(data) diff --git a/ghost/core/test/unit/server/notify.test.js b/ghost/core/test/unit/server/notify.test.js index 1ab38969ea8..c9f352fa74f 100644 --- a/ghost/core/test/unit/server/notify.test.js +++ b/ghost/core/test/unit/server/notify.test.js @@ -26,7 +26,7 @@ describe('Notify', function () { sinon.assert.calledOnce(process.send); - let message = process.send.firstCall.args[0]; + const message = process.send.firstCall.args[0]; assert(message && typeof message === 'object'); assert('debug' in message); assert(!('error' in message)); @@ -38,7 +38,7 @@ describe('Notify', function () { sinon.assert.calledOnce(process.send); - let message = process.send.firstCall.args[0]; + const message = process.send.firstCall.args[0]; assert(message && typeof message === 'object'); assert('debug' in message); assert.equal(message.started, false); diff --git a/ghost/core/test/unit/server/services/auth/setup.test.js b/ghost/core/test/unit/server/services/auth/setup.test.js index 86006063309..449a8249680 100644 --- a/ghost/core/test/unit/server/services/auth/setup.test.js +++ b/ghost/core/test/unit/server/services/auth/setup.test.js @@ -36,11 +36,11 @@ describe('Auth Service: setup', function () { }, ], }); - let tiersAPI = { + const tiersAPI = { browse: tierBrowseStub, edit: tierEditStub, }; - let newslettersApi = { + const newslettersApi = { browse: newsletterBrowseStub, edit: newsletterEditStub, }; @@ -48,7 +48,7 @@ describe('Auth Service: setup', function () { tiers: tiersAPI, newsletters: newslettersApi, }; - let data = { + const data = { user: { id: 'user-1', }, diff --git a/ghost/core/test/unit/server/services/email-service/batch-sending-service.test.js b/ghost/core/test/unit/server/services/email-service/batch-sending-service.test.js index d3df061eeb0..77da022e101 100644 --- a/ghost/core/test/unit/server/services/email-service/batch-sending-service.test.js +++ b/ghost/core/test/unit/server/services/email-service/batch-sending-service.test.js @@ -914,7 +914,6 @@ describe('Batch Sending Service', function () { }); }); - let service; let fetchCount = 0; const Member = createModelClass({}); Member.getFilteredCollectionQuery = ({ filter }) => { @@ -933,7 +932,7 @@ describe('Batch Sending Service', function () { const db = createDb({ all: [] }); const insert = sinon.spy(db, 'insert'); - service = new BatchSendingService({ + const service = new BatchSendingService({ models: { Member, EmailBatch: createModelClass({}) }, domainWarmingService: { isEnabled: () => false }, emailRenderer: { diff --git a/ghost/core/test/unit/server/services/email-service/email-renderer.test.js b/ghost/core/test/unit/server/services/email-service/email-renderer.test.js index 7b80ed76268..e8e40b5c125 100644 --- a/ghost/core/test/unit/server/services/email-service/email-renderer.test.js +++ b/ghost/core/test/unit/server/services/email-service/email-renderer.test.js @@ -1053,7 +1053,7 @@ describe('Email renderer', function () { title: 'Sample Post', loaded: ['posts_meta'], }); - let response = emailRenderer.getSubject(post); + const response = emailRenderer.getSubject(post); assert.equal(response, 'Test Newsletter'); }); @@ -1065,7 +1065,7 @@ describe('Email renderer', function () { title: 'Sample Post', loaded: ['posts_meta'], }); - let response = emailRenderer.getSubject(post); + const response = emailRenderer.getSubject(post); assert.equal(response, 'Sample Post'); }); @@ -1077,14 +1077,14 @@ describe('Email renderer', function () { title: 'Sample Post', loaded: ['posts_meta'], }); - let response = emailRenderer.getSubject(post, true); + const response = emailRenderer.getSubject(post, true); assert.equal(response, '[TEST] Sample Post'); }); }); describe('getFromAddress', function () { let siteTitle = 'Test Blog'; - let emailRenderer = new EmailRenderer({ + const emailRenderer = new EmailRenderer({ settingsCache: { get: (key) => { if (key === 'title') { @@ -1146,13 +1146,13 @@ describe('Email renderer', function () { }); describe('getReplyToAddress', function () { - let emailAddressService = { + const emailAddressService = { getAddress(addresses) { return addresses; }, managedEmailEnabled: true, }; - let emailRenderer = new EmailRenderer({ + const emailRenderer = new EmailRenderer({ settingsCache: { get: (key) => { if (key === 'title') { @@ -1331,14 +1331,14 @@ describe('Email renderer', function () { }, }); - let post = { + const post = { get: (key) => { if (key === 'lexical') { return '{}'; } }, }; - let response = await emailRenderer.getSegments(post); + const response = await emailRenderer.getSegments(post); assert.deepEqual(response, ['status:free', 'status:-free']); }); @@ -1359,14 +1359,14 @@ describe('Email renderer', function () { }, }); - let post = { + const post = { get: (key) => { if (key === 'lexical') { return '{}'; } }, }; - let response = await emailRenderer.getSegments(post); + const response = await emailRenderer.getSegments(post); assert.deepEqual(response, ['status:free', 'status:-free']); }); @@ -1813,7 +1813,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); const $ = cheerio.load(response.html); @@ -1953,7 +1953,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); const $ = cheerio.load(response.html); assert.equal($('.preheader').text(), 'Custom excerpt'); @@ -1962,7 +1962,7 @@ describe('Email renderer', function () { it('does not include members-only content in preheader for non-members', async function () { renderedPost = '
                              Lexical Test
                              some text for both finishing part only for members'; - let post = { + const post = { related: sinon.stub(), get: (key) => { if (key === 'lexical') { @@ -1979,11 +1979,11 @@ describe('Email renderer', function () { }, getLazyRelation: sinon.stub(), }; - let newsletter = { + const newsletter = { get: sinon.stub(), }; - let response = await emailRenderer.renderBody(post, newsletter, 'status:free', {}); + const response = await emailRenderer.renderBody(post, newsletter, 'status:free', {}); const $ = cheerio.load(response.html); assert.equal($('.preheader').text(), 'Lexical Test some text for both'); @@ -1992,7 +1992,7 @@ describe('Email renderer', function () { it('does not include paid segmented content in preheader for non-paying members', async function () { renderedPost = '
                              Lexical Test
                              members only section
                              some text for both'; - let post = { + const post = { related: sinon.stub(), get: (key) => { if (key === 'lexical') { @@ -2009,11 +2009,11 @@ describe('Email renderer', function () { }, getLazyRelation: sinon.stub(), }; - let newsletter = { + const newsletter = { get: sinon.stub(), }; - let response = await emailRenderer.renderBody(post, newsletter, 'status:free', {}); + const response = await emailRenderer.renderBody(post, newsletter, 'status:free', {}); const $ = cheerio.load(response.html); assert.equal($('.preheader').text(), 'Lexical Test some text for both'); @@ -2069,7 +2069,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); assert.match(response.html, /By A & 2 others/); assert.match(response.plaintext, /By A & 2 others/); }); @@ -2090,7 +2090,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); assert(response.html.includes('http://icon.example.com')); assert.match(response.html, /class="site-title"[^>]*?>Test Blog/); @@ -2113,7 +2113,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); assert(response.html.includes('http://icon.example.com')); assert.match(response.html, /class="site-title"[^>]*?>Test Newsletter/); @@ -2130,7 +2130,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); // Does include include Ghost badge assert.match(response.html, /https:\/\/ghost.org\//); @@ -2152,7 +2152,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); // Test footer assert(response.html.includes('Test footer

                              ')); // begin tag skipped because style is inlined in that tag @@ -2172,7 +2172,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); assert.doesNotMatch(response.html, /is-light-background/); }); @@ -2190,7 +2190,7 @@ describe('Email renderer', function () { const segment = null; const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); assert.doesNotMatch(response.html, /is-dark-background/); }); @@ -2213,7 +2213,7 @@ describe('Email renderer', function () { renderedPost = '

                              Lexical Test

                              HelloHelloIgnore me

                              '; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); // Check all links have domain tracked-link.com const $ = cheerio.load(response.html); @@ -2282,7 +2282,7 @@ describe('Email renderer', function () { renderedPost = '

                              Lexical Test

                              HelloIgnore me

                              '; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); // Check all links have domain tracked-link.com const $ = cheerio.load(response.html); @@ -2325,7 +2325,7 @@ describe('Email renderer', function () { renderedPost = '

                              Lexical Test

                              Hello

                              '; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); // Check all links have domain tracked-link.com const $ = cheerio.load(response.html); @@ -2387,7 +2387,7 @@ describe('Email renderer', function () { renderedPost = '

                              Lexical Test

                              Listen to episode

                              '; - let response = await emailRenderer.renderBody(post, newsletter, segment, options); + const response = await emailRenderer.renderBody(post, newsletter, segment, options); // Verify tracking was called for the Transistor link sinon.assert.called(addTrackingToUrlStub); @@ -2418,7 +2418,7 @@ describe('Email renderer', function () { it('removes data-gh-segment and renders paywall', async function () { renderedPost = '
                              Lexical Test
                              members only section
                              some text for both finishing part only for members'; - let post = { + const post = { related: () => { return null; }, @@ -2449,7 +2449,7 @@ describe('Email renderer', function () { }; }, }; - let newsletter = { + const newsletter = { get: (key) => { if (key === 'header_image') { return null; @@ -2474,9 +2474,9 @@ describe('Email renderer', function () { return false; }, }; - let options = {}; + const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, 'status:free', options); + const response = await emailRenderer.renderBody(post, newsletter, 'status:free', options); assert(response.plaintext.includes('Test Post')); assert(response.plaintext.includes('Unsubscribe [%%{unsubscribe_url}%%]')); @@ -2500,7 +2500,12 @@ describe('Email renderer', function () { assert(!response.html.includes('finishing part only for members')); assert(response.html.includes('Become a paid member of Test Blog to get access to all')); - let responsePaid = await emailRenderer.renderBody(post, newsletter, 'status:-free', options); + const responsePaid = await emailRenderer.renderBody( + post, + newsletter, + 'status:-free', + options, + ); assert(responsePaid.html.includes('members only section')); assert(responsePaid.html.includes('some text for both')); assert(responsePaid.html.includes('finishing part only for members')); @@ -4521,7 +4526,7 @@ describe('Email renderer', function () { it('correctly include the site name in the paywall (in French)', async function () { renderedPost = '
                              Lexical Test
                              members only section
                              some text for both finishing part only for members'; - let post = { + const post = { related: () => { return null; }, @@ -4552,7 +4557,7 @@ describe('Email renderer', function () { }; }, }; - let newsletter = { + const newsletter = { get: (key) => { if (key === 'header_image') { return null; @@ -4577,9 +4582,9 @@ describe('Email renderer', function () { return false; }, }; - let options = {}; + const options = {}; - let response = await emailRenderer.renderBody(post, newsletter, 'status:free', options); + const response = await emailRenderer.renderBody(post, newsletter, 'status:free', options); assert(!response.html.includes('members only section')); assert(response.html.includes('some text for both')); diff --git a/ghost/core/test/unit/server/services/email-service/email-segmenter.test.js b/ghost/core/test/unit/server/services/email-service/email-segmenter.test.js index 749d47ba283..1ff24132cc2 100644 --- a/ghost/core/test/unit/server/services/email-service/email-segmenter.test.js +++ b/ghost/core/test/unit/server/services/email-service/email-segmenter.test.js @@ -92,7 +92,7 @@ describe('Email segmenter', function () { const emailSegmenter = new EmailSegmenter({ membersRepository, }); - let response = await emailSegmenter.getMembersCount( + const response = await emailSegmenter.getMembersCount( { id: 'newsletter-123', get: (key) => { @@ -116,7 +116,7 @@ describe('Email segmenter', function () { const emailSegmenter = new EmailSegmenter({ membersRepository, }); - let response = await emailSegmenter.getMembersCount( + const response = await emailSegmenter.getMembersCount( { id: 'newsletter-123', get: (key) => { diff --git a/ghost/core/test/unit/server/services/lib/dynamic-redirect-manager.test.js b/ghost/core/test/unit/server/services/lib/dynamic-redirect-manager.test.js index c9b164ddb92..eaa986caff2 100644 --- a/ghost/core/test/unit/server/services/lib/dynamic-redirect-manager.test.js +++ b/ghost/core/test/unit/server/services/lib/dynamic-redirect-manager.test.js @@ -2,7 +2,7 @@ const assert = require('node:assert/strict'); const DynamicRedirectManager = require('../../../../../core/server/services/lib/dynamic-redirect-manager'); const urlJoin = (...parts) => { - let url = parts.join('/'); + const url = parts.join('/'); return url.replace(/(^|[^:])\/\/+/g, '$1/'); }; diff --git a/ghost/core/test/unit/server/services/mentions/mention-discovery-service.test.js b/ghost/core/test/unit/server/services/mentions/mention-discovery-service.test.js index c0e06a9dcf4..1d6a9477704 100644 --- a/ghost/core/test/unit/server/services/mentions/mention-discovery-service.test.js +++ b/ghost/core/test/unit/server/services/mentions/mention-discovery-service.test.js @@ -28,14 +28,14 @@ describe('MentionDiscoveryService', function () { it('Returns null from a bad URL', async function () { const url = new URL('http://www.notarealsite.com/'); nock(url.href).get('/').reply(404); - let endpoint = await service.getEndpoint(url); + const endpoint = await service.getEndpoint(url); assert.equal(endpoint, null); }); it('Follows redirects', async function () { - let url = new URL('http://redirector.io/'); - let nextUrl = new URL('http://testpage.com/'); + const url = new URL('http://redirector.io/'); + const nextUrl = new URL('http://testpage.com/'); nock(url.href) .intercept('/', 'HEAD') @@ -45,7 +45,7 @@ describe('MentionDiscoveryService', function () { 'content-type': 'text/html', }); - let endpoint = await service.getEndpoint(url); + const endpoint = await service.getEndpoint(url); assert(endpoint instanceof URL); }); diff --git a/ghost/core/test/unit/server/services/permissions/can-this.test.js b/ghost/core/test/unit/server/services/permissions/can-this.test.js index 35d2d2f0566..713892a6aaf 100644 --- a/ghost/core/test/unit/server/services/permissions/can-this.test.js +++ b/ghost/core/test/unit/server/services/permissions/can-this.test.js @@ -18,9 +18,9 @@ describe('Permissions', function () { findPostSpy = sinon.stub(models.Post, 'findOne').callsFake(function () { // @TODO: the test env has no concept of including relations - let post = models.Post.forge(testUtils.DataGenerator.Content.posts[0]); + const post = models.Post.forge(testUtils.DataGenerator.Content.posts[0]); - let authors = [testUtils.DataGenerator.Content.users[0]]; + const authors = [testUtils.DataGenerator.Content.users[0]]; post.related('authors').set(authors); return Promise.resolve(post); diff --git a/ghost/core/test/unit/server/services/permissions/providers.test.js b/ghost/core/test/unit/server/services/permissions/providers.test.js index dd176304efe..4931e7c93ed 100644 --- a/ghost/core/test/unit/server/services/permissions/providers.test.js +++ b/ghost/core/test/unit/server/services/permissions/providers.test.js @@ -218,7 +218,7 @@ describe('Permission Providers', function () { describe('API Key', function () { it('errors if api_key cannot be found', async function () { - let findApiKeySpy = sinon.stub(models.ApiKey, 'findOne'); + const findApiKeySpy = sinon.stub(models.ApiKey, 'findOne'); findApiKeySpy.returns(Promise.resolve()); await assert.rejects( diff --git a/ghost/core/test/unit/server/services/public-config/config.test.js b/ghost/core/test/unit/server/services/public-config/config.test.js index 98a710e85e9..8591e532140 100644 --- a/ghost/core/test/unit/server/services/public-config/config.test.js +++ b/ghost/core/test/unit/server/services/public-config/config.test.js @@ -66,7 +66,7 @@ describe('Public-config Service', function () { }); it('should return null for klipy apikey when unset', function () { - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.klipy.apiKey, null); }); @@ -74,7 +74,7 @@ describe('Public-config Service', function () { it('should return klipy apikey when set', function () { configUtils.set('klipy:apiKey', 'KLIPY_KEY'); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.klipy.apiKey, 'KLIPY_KEY'); }); @@ -84,7 +84,7 @@ describe('Public-config Service', function () { mailgun: 'exists', }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.mailgunIsConfigured, true); }); @@ -92,13 +92,13 @@ describe('Public-config Service', function () { it('should return false for mailgunIsConfigured when mailgun is not configured', function () { configUtils.set('bulkEmail', {}); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.mailgunIsConfigured, false); }); it('should NOT return stats by default', function () { - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.stats, undefined); }); @@ -113,7 +113,7 @@ describe('Public-config Service', function () { }, }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.deepEqual(configProperties.stats, { endpoint: 'xxx', @@ -131,7 +131,7 @@ describe('Public-config Service', function () { }, }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.deepEqual(configProperties.stats.id, '1234567890'); }); @@ -144,7 +144,7 @@ describe('Public-config Service', function () { }, }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.deepEqual(configProperties.stats, { endpoint: 'xxx', @@ -166,7 +166,7 @@ describe('Public-config Service', function () { }, }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.deepEqual(configProperties.stats, { endpoint: 'xxx', @@ -185,14 +185,14 @@ describe('Public-config Service', function () { url: 'xxx', }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.stats, undefined); }); it('should return emailAnalytics as boolean from nested config structure', function () { // Default config has emailAnalytics.enabled = true - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.emailAnalytics, true); assert.equal(typeof configProperties.emailAnalytics, 'boolean'); @@ -201,13 +201,13 @@ describe('Public-config Service', function () { it('should return false for emailAnalytics when disabled', function () { configUtils.set('emailAnalytics:enabled', false); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.emailAnalytics, false); }); it('should NOT return featurebase config by default', function () { - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.featurebase, undefined); }); @@ -218,7 +218,7 @@ describe('Public-config Service', function () { jwtSecret: 'super-secret-key', }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); assert.equal(configProperties.featurebase.enabled, false); assert.equal(configProperties.featurebase.organization, 'test-org'); @@ -232,7 +232,7 @@ describe('Public-config Service', function () { apiKey: 'secret-api-key', }); - let configProperties = getConfigProperties(); + const configProperties = getConfigProperties(); // Only enabled and organization should be exposed, not jwtSecret/apiKey assert.deepEqual(configProperties.featurebase, { enabled: true, organization: 'test-org' }); diff --git a/ghost/core/test/unit/server/services/settings-helpers/settings-helpers.test.js b/ghost/core/test/unit/server/services/settings-helpers/settings-helpers.test.js index 573d2f718fa..7b2126292d2 100644 --- a/ghost/core/test/unit/server/services/settings-helpers/settings-helpers.test.js +++ b/ghost/core/test/unit/server/services/settings-helpers/settings-helpers.test.js @@ -387,7 +387,7 @@ describe('Settings Helpers', function () { const config = configUtils.config; let settingsCache; let urlUtils; - let labs = {}; + const labs = {}; beforeEach(function () { settingsCache = { diff --git a/ghost/core/test/unit/server/services/settings/settings-service.test.js b/ghost/core/test/unit/server/services/settings/settings-service.test.js index 03cb9e20c65..62a440294e2 100644 --- a/ghost/core/test/unit/server/services/settings/settings-service.test.js +++ b/ghost/core/test/unit/server/services/settings/settings-service.test.js @@ -10,8 +10,8 @@ const limits = require('../../../../../core/server/services/limits'); describe('Settings Service', function () { let settingsService; let settingsCacheStub; - let originalSettingsGetter = settingsCache.get; - let originalLoggingError = logging.error; + const originalSettingsGetter = settingsCache.get; + const originalLoggingError = logging.error; let loggingStub; beforeEach(async function () { diff --git a/ghost/core/test/unit/server/services/staff/index.test.js b/ghost/core/test/unit/server/services/staff/index.test.js index 98697b6aaaf..e8c8513e6c1 100644 --- a/ghost/core/test/unit/server/services/staff/index.test.js +++ b/ghost/core/test/unit/server/services/staff/index.test.js @@ -80,7 +80,7 @@ describe('Staff Service:', function () { }); describe('free member created event:', function () { - let eventData = { + const eventData = { memberId: '1', }; @@ -136,7 +136,7 @@ describe('Staff Service:', function () { }); describe('paid subscription start event:', function () { - let eventData = { + const eventData = { memberId: '1', tierId: 'tier-1', subscriptionId: 'sub-1', @@ -199,7 +199,7 @@ describe('Staff Service:', function () { }); describe('paid subscription cancel event:', function () { - let eventData = { + const eventData = { memberId: '1', tierId: 'tier-1', subscriptionId: 'sub-1', diff --git a/ghost/core/test/unit/server/services/staff/staff-service.test.js b/ghost/core/test/unit/server/services/staff/staff-service.test.js index c644a7b07c8..14fe81377a1 100644 --- a/ghost/core/test/unit/server/services/staff/staff-service.test.js +++ b/ghost/core/test/unit/server/services/staff/staff-service.test.js @@ -110,12 +110,12 @@ describe('StaffService', function () { let subscribeStub; let getEmailAlertUsersStub; let service; - let options = { + const options = { transacting: {}, forUpdate: true, }; let stubs; - let labs = { + const labs = { isSet: () => { return false; }, @@ -644,7 +644,7 @@ describe('StaffService', function () { }); it('sends paid subscription start alert without member name', async function () { - let memberData = { + const memberData = { email: 'member@example.com', id: 'abc', }; diff --git a/ghost/core/test/unit/server/services/stripe/stripe-api.test.js b/ghost/core/test/unit/server/services/stripe/stripe-api.test.js index f6564bb6352..3b46ed6c50f 100644 --- a/ghost/core/test/unit/server/services/stripe/stripe-api.test.js +++ b/ghost/core/test/unit/server/services/stripe/stripe-api.test.js @@ -11,7 +11,7 @@ describe('StripeAPI', function () { const mockCustomerEmail = 'foo@example.com'; const mockCustomerId = 'cust_mock_123456'; const mockCustomerName = 'Example Customer'; - let mockLabs = { + const mockLabs = { isSet() { return false; }, diff --git a/ghost/core/test/unit/server/services/tiers/tier.test.js b/ghost/core/test/unit/server/services/tiers/tier.test.js index ab79f0138e4..f07c5626e75 100644 --- a/ghost/core/test/unit/server/services/tiers/tier.test.js +++ b/ghost/core/test/unit/server/services/tiers/tier.test.js @@ -77,7 +77,7 @@ describe('Tier', function () { describe('create', function () { it('Errors if passed an invalid input', async function () { for (const invalidInput of invalidInputs) { - let input = {}; + const input = {}; Object.assign(input, validInput, invalidInput); await assertError(async function () { await Tier.create(input); @@ -98,7 +98,7 @@ describe('Tier', function () { it('Does not error for valid inputs', async function () { for (const validInputItem of validInputs) { - let input = {}; + const input = {}; Object.assign(input, validInput, validInputItem); await Tier.create(input); } diff --git a/ghost/core/test/unit/shared/config/utils.test.js b/ghost/core/test/unit/shared/config/utils.test.js index 49b7088bd4f..c5bbde37b69 100644 --- a/ghost/core/test/unit/shared/config/utils.test.js +++ b/ghost/core/test/unit/shared/config/utils.test.js @@ -3,7 +3,7 @@ const _ = require('lodash'); const configUtils = require('../../../../core/shared/config/utils'); let fakeConfig = {}; -let fakeNconf = {}; +const fakeNconf = {}; let changedKey = []; describe('Config Utils', function () { diff --git a/ghost/core/test/unit/shared/settings-cache.test.js b/ghost/core/test/unit/shared/settings-cache.test.js index b8e4c45d028..16bcbc5e3e4 100644 --- a/ghost/core/test/unit/shared/settings-cache.test.js +++ b/ghost/core/test/unit/shared/settings-cache.test.js @@ -5,7 +5,7 @@ const _ = require('lodash'); const events = require('../../../core/server/lib/common/events'); // Testing the Private API -let CacheManager = require('../../../core/shared/settings-cache/cache-manager'); +const CacheManager = require('../../../core/shared/settings-cache/cache-manager'); const publicSettings = require('../../../core/shared/settings-cache/public'); const InMemoryCache = require('../../../core/server/adapters/cache/MemoryCache'); @@ -178,7 +178,7 @@ describe('settings cache', function () { ..._.mapValues(socialAccounts, (value) => ({ value })), }); - let values = _.zipObject(_.keys(publicSettings), _.fill(Array(_.size(publicSettings)), null)); + const values = _.zipObject(_.keys(publicSettings), _.fill(Array(_.size(publicSettings)), null)); values.title = 'hello world'; values.timezone = 'PST'; values.secondary_navigation = false; @@ -196,7 +196,7 @@ describe('settings cache', function () { cache.set('transistor', { value: true }); cache.set('transistor_portal_enabled', { value: true }); - let values = _.zipObject(_.keys(publicSettings), _.fill(Array(_.size(publicSettings)), null)); + const values = _.zipObject(_.keys(publicSettings), _.fill(Array(_.size(publicSettings)), null)); values.transistor_portal_enabled = false; assert.deepEqual(cache.getPublic(), values); @@ -214,7 +214,7 @@ describe('settings cache', function () { ], }; - let cacheStore = new InMemoryCache(); + const cacheStore = new InMemoryCache(); cache.init(events, settingsCollection, [], cacheStore); assert.equal(cache.get('key1'), 'init value'); @@ -228,7 +228,7 @@ describe('settings cache', function () { assert.equal(cache.get('key1'), 'first edit'); // init does a reset by default - let cacheStoreForReset = new InMemoryCache(); + const cacheStoreForReset = new InMemoryCache(); cache.init(events, settingsCollection, [], cacheStoreForReset); sinon.assert.calledThrice(setSpy); assert.equal(cache.get('key1'), 'init value'); diff --git a/ghost/core/test/utils/agents/admin-api-test-agent.js b/ghost/core/test/utils/agents/admin-api-test-agent.js index d28c9c55299..bb0a80b9457 100644 --- a/ghost/core/test/utils/agents/admin-api-test-agent.js +++ b/ghost/core/test/utils/agents/admin-api-test-agent.js @@ -59,7 +59,7 @@ class AdminAPITestAgent extends TestAgent { this.resetAuthentication(); if (role) { - let user = getRoleUserFromFixtures(role); + const user = getRoleUserFromFixtures(role); email = user.email; password = user.password; } diff --git a/ghost/core/test/utils/api.js b/ghost/core/test/utils/api.js index 1b12975979b..ca35126ac57 100644 --- a/ghost/core/test/utils/api.js +++ b/ghost/core/test/utils/api.js @@ -76,8 +76,8 @@ function checkResponse( */ const doAuth = (apiOptions) => { return async function doAuthInner() { - let API_URL = arguments[0]; - let request = arguments[1]; + const API_URL = arguments[0]; + const request = arguments[1]; // Remove API_URL & request from this list let options = Array.prototype.slice.call(arguments, 2); diff --git a/ghost/core/test/utils/e2e-framework-mock-manager.js b/ghost/core/test/utils/e2e-framework-mock-manager.js index 1e947adaa64..e3c59533b15 100644 --- a/ghost/core/test/utils/e2e-framework-mock-manager.js +++ b/ghost/core/test/utils/e2e-framework-mock-manager.js @@ -288,7 +288,7 @@ const sentEmail = (matchers) => { }); } - let spyCall = mocks.mail.getCall(emailCount); + const spyCall = mocks.mail.getCall(emailCount); assert.notEqual(spyCall, null, 'Expected at least ' + (emailCount + 1) + ' emails sent.'); @@ -298,7 +298,7 @@ const sentEmail = (matchers) => { sinon.assert.called(mocks.mail); Object.keys(matchers).forEach((key) => { - let value = matchers[key]; + const value = matchers[key]; // We use assert, rather than sinon.assert.calledWith, as we end up with much better error messaging assert.notEqual(spyCall.args[0][key], undefined, `Expected email to have property ${key}`); diff --git a/ghost/core/test/utils/fixture-utils.js b/ghost/core/test/utils/fixture-utils.js index 0e15251fd47..0f3e373cd10 100644 --- a/ghost/core/test/utils/fixture-utils.js +++ b/ghost/core/test/utils/fixture-utils.js @@ -99,7 +99,7 @@ const fixtures = { let i; let k = 0; - let posts = []; + const posts = []; // insert users of different roles return Promise.resolve(fixtures.createUsersWithRoles()) @@ -256,8 +256,8 @@ const fixtures = { models.Post.fetchAll(_.merge({ columns: ['id'], withRelated: 'tags' }, context.internal)), models.Tag.fetchAll(_.merge({ columns: ['id', 'name'] }, context.internal)), ]).then(function (results) { - let posts = results[0].toJSON(); - let tags = results[1].toJSON(); + const posts = results[0].toJSON(); + const tags = results[1].toJSON(); const injectionTagId = _.chain(tags).filter({ name: 'injection' }).map('id').value()[0]; @@ -630,7 +630,7 @@ const fixtures = { }, insertArchivedTiers: function insertArchivedTiers() { - let archivedProduct = DataGenerator.forKnex.createProduct({ + const archivedProduct = DataGenerator.forKnex.createProduct({ active: false, }); @@ -638,7 +638,7 @@ const fixtures = { }, insertHiddenTiers: function insertArchivedTiers() { - let hiddenTier = DataGenerator.forKnex.createProduct({ + const hiddenTier = DataGenerator.forKnex.createProduct({ visibility: 'none', }); @@ -657,7 +657,7 @@ const fixtures = { }, insertProducts: async function insertProducts() { - let coreProductFixtures = fixtureManager.findModelFixtures('Product').entries; + const coreProductFixtures = fixtureManager.findModelFixtures('Product').entries; await Promise.all( coreProductFixtures.map(async (product) => { const found = await models.Product.findOne(product, context.internal); @@ -688,7 +688,7 @@ const fixtures = { }), ); - let coreProductFixtures = fixtureManager.findModelFixtures('Product').entries; + const coreProductFixtures = fixtureManager.findModelFixtures('Product').entries; await Promise.all( coreProductFixtures.map(async (product) => { const found = await models.Product.findOne(product, context.internal); @@ -698,7 +698,7 @@ const fixtures = { }), ); - let testProductFixtures = DataGenerator.forKnex.products; + const testProductFixtures = DataGenerator.forKnex.products; for (const productFixture of testProductFixtures) { if (productFixture.id) { // Not currently used - this is used to add new text fixtures, e.g. a Bronze/Silver/Gold Tier diff --git a/ghost/core/test/utils/fixtures/data-generator.js b/ghost/core/test/utils/fixtures/data-generator.js index 9df2ee972ed..da80ed08aa0 100644 --- a/ghost/core/test/utils/fixtures/data-generator.js +++ b/ghost/core/test/utils/fixtures/data-generator.js @@ -2845,18 +2845,14 @@ DataGenerator.forKnex = (function () { // @TODO: this logic only exists because we are now using our models :/ DataGenerator.forModel = (function () { - let posts; - let tags; - let users; - let roles; - posts = _.map(DataGenerator.Content.posts, function (post) { + const posts = _.map(DataGenerator.Content.posts, function (post) { return _.pick(post, 'title', 'lexical'); }); - tags = DataGenerator.Content.tags; + const tags = DataGenerator.Content.tags; - users = _.map(DataGenerator.Content.users, function (user) { + const users = _.map(DataGenerator.Content.users, function (user) { user = _.pick(user, 'name', 'email'); return _.defaults({ @@ -2864,7 +2860,7 @@ DataGenerator.forModel = (function () { }, user); }); - roles = _.map(DataGenerator.Content.roles, function (role) { + const roles = _.map(DataGenerator.Content.roles, function (role) { return _.extend({}, role, {id: ObjectId().toHexString()}); }); diff --git a/ghost/core/test/utils/mock-knex.js b/ghost/core/test/utils/mock-knex.js index 6600bd22180..23da7d9677b 100644 --- a/ghost/core/test/utils/mock-knex.js +++ b/ghost/core/test/utils/mock-knex.js @@ -58,7 +58,7 @@ class Mocker { } _replace(obj, spec, replaced, path) { - let replacement = _.get(spec, path); + const replacement = _.get(spec, path); path = path.replace('._constructor.', '.constructor.').replace('._prototype.', '.prototype.'); diff --git a/ghost/core/test/utils/stripe-mocker.js b/ghost/core/test/utils/stripe-mocker.js index fb69ff8bb3f..22fae7b15ba 100644 --- a/ghost/core/test/utils/stripe-mocker.js +++ b/ghost/core/test/utils/stripe-mocker.js @@ -259,7 +259,7 @@ class StripeMocker { return parseFloat(value); } - let keywords = { + const keywords = { true: true, false: false, null: null, diff --git a/packages/api-framework/lib/headers.js b/packages/api-framework/lib/headers.js index 9aa6a4c23b9..0389494fb06 100644 --- a/packages/api-framework/lib/headers.js +++ b/packages/api-framework/lib/headers.js @@ -3,7 +3,7 @@ const debug = require('@tryghost/debug')('headers'); const INVALIDATE_ALL = '/*'; const cacheInvalidate = (result, options = {}) => { - let value = options.value; + const value = options.value; return { 'X-Cache-Invalidate': value || INVALIDATE_ALL, @@ -103,7 +103,7 @@ module.exports = { * @return {Promise} */ async get(result, apiConfigHeaders = {}, frame) { - let headers = {}; + const headers = {}; if (apiConfigHeaders.disposition) { const dispositionHeader = await disposition[apiConfigHeaders.disposition.type]( diff --git a/packages/api-framework/lib/validators/input/all.js b/packages/api-framework/lib/validators/input/all.js index 59b6081d837..914a868b51d 100644 --- a/packages/api-framework/lib/validators/input/all.js +++ b/packages/api-framework/lib/validators/input/all.js @@ -101,7 +101,7 @@ module.exports = { all(apiConfig, frame) { debug('validate all'); - let validationErrors = validate(apiConfig.options, frame.options); + const validationErrors = validate(apiConfig.options, frame.options); if (!_.isEmpty(validationErrors)) { return Promise.reject(validationErrors[0]);