diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 035cc7d3e..1fadb5cb0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,5 +82,5 @@ jobs: env: PERCY_PARALLEL_NONCE: ${{ env.PERCY_PARALLEL_NONCE }} PERCY_PARALLEL_TOTAL: ${{ env.PERCY_PARALLEL_TOTAL }} - PERCY_TOKEN: 5ad6687f6b1ad3dec2b964f94d3d59ff3880baccf1492c0663e85c1ce79c1a52 + PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} run: yarn run percy exec -- yarn test:ember diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 000000000..d02ab46d9 --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,24 @@ +name: github pages + +on: + push: + branches: + - master + - main + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: '14' + - run: npm install -g npm@7 + - run: npm install + - run: npx lint-to-the-future output -o lttfOutput --rootUrl ember-api-docs --previous-results https://ember-learn.github.io/ember-api-docs/data.json + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./lttfOutput diff --git a/.gitignore b/.gitignore index 09aee3a30..994ee8b09 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,6 @@ terraform.tfstate.backup public/json-docs/ public/rev-index/ -jsconfig.json package-lock.json diff --git a/app/adapters/application.js b/app/adapters/application.js index e812534e1..3b3e27202 100644 --- a/app/adapters/application.js +++ b/app/adapters/application.js @@ -1,21 +1,23 @@ -import JSONAPIAdapter from '@ember-data/adapter/json-api'; +/* eslint-disable ember/classic-decorator-hooks, ember/classic-decorator-no-classic-methods */ import { inject as service } from '@ember/service'; +import JSONAPIAdapter from '@ember-data/adapter/json-api'; import fetch from 'fetch'; import ENV from 'ember-api-docs/config/environment'; import { pluralize } from 'ember-inflector'; import { isBlank } from '@ember/utils'; -export default JSONAPIAdapter.extend({ - host: ENV.API_HOST, - - currentProject: '', +export default class Application extends JSONAPIAdapter { + host = ENV.API_HOST; + currentProject = ''; + currentProjectVersion = ''; - currentProjectVersion: '', + @service + metaStore; - metaStore: service(), - projectService: service('project'), + @service('project') + projectService; - ids: null, + ids = null; shouldReloadRecord(store, { modelName, id }) { if (modelName === 'project') { @@ -24,10 +26,12 @@ export default JSONAPIAdapter.extend({ this.currentProjectVersion = id; } return; // return undefined so auto determinated - }, + } + shouldBackgroundReloadAll() { return false; - }, + } + shouldBackgroundReloadRecord(store, { modelName, id }) { let key = `${modelName}-${id}`; let hasId = this.ids[key]; @@ -35,12 +39,12 @@ export default JSONAPIAdapter.extend({ this.ids[key] = true; } return !hasId; - }, + } init() { - this._super(...arguments); + super.init(...arguments); this.ids = {}; - }, + } async findRecord(store, { modelName }, id) { let url; @@ -87,5 +91,5 @@ export default JSONAPIAdapter.extend({ let response = await fetch(url); let json = await response.json(); return json; - }, -}); + } +} diff --git a/app/components/api-index-filter.js b/app/components/api-index-filter.js index 82641b6cf..92fdeba68 100644 --- a/app/components/api-index-filter.js +++ b/app/components/api-index-filter.js @@ -1,3 +1,5 @@ +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-no-classic-methods */ +import { classNames } from '@ember-decorators/component'; import { computed } from '@ember/object'; import Component from '@ember/component'; import sortBy from 'lodash.sortby'; @@ -5,32 +7,22 @@ import sortBy from 'lodash.sortby'; const filterDataComputedParams = 'filterData.{showInherited,showProtected,showPrivate,showDeprecated}'; -export default Component.extend({ - classNames: ['api-index-filter'], +@classNames('api-index-filter') +export default class ApiIndexFilter extends Component { + @computed('model.methods.[]', filterDataComputedParams) + get filteredMethods() { + return this.filterItems('methods'); + } - filteredMethods: computed( - 'model.methods.[]', - filterDataComputedParams, - function () { - return this.filterItems('methods'); - } - ), - - filteredEvents: computed( - 'model.events.[]', - filterDataComputedParams, - function () { - return this.filterItems('events'); - } - ), + @computed('model.events.[]', filterDataComputedParams) + get filteredEvents() { + return this.filterItems('events'); + } - filteredProperties: computed( - 'model.properties.[]', - filterDataComputedParams, - function () { - return this.filterItems('properties'); - } - ), + @computed('model.properties.[]', filterDataComputedParams) + get filteredProperties() { + return this.filterItems('properties'); + } filterItems(itemType) { let items = @@ -52,20 +44,16 @@ export default Component.extend({ let sortedItems = sortBy(items, (item) => item.name); return this.filterMultipleInheritance(sortedItems); - }, + } - filteredData: computed( - 'filteredMethods', - 'filteredProperties', - 'filteredEvents', - function () { - return { - methods: this.filteredMethods, - properties: this.filteredProperties, - events: this.filteredEvents, - }; - } - ), + @computed('filteredMethods', 'filteredProperties', 'filteredEvents') + get filteredData() { + return { + methods: this.filteredMethods, + properties: this.filteredProperties, + events: this.filteredEvents, + }; + } /** * Returns an array where duplicate methods (by name) are removed. @@ -94,7 +82,8 @@ export default Component.extend({ } } return dedupedArray; - }, + } + /** * Returns whichever item is most local. * What is "most local" is determined by looking at the file path for the @@ -114,5 +103,5 @@ export default Component.extend({ // otherwise, the next item must be "more local" return nextItem; } - }, -}); + } +} diff --git a/app/components/api-index.js b/app/components/api-index.js index efab75bbd..6191109e3 100644 --- a/app/components/api-index.js +++ b/app/components/api-index.js @@ -1,8 +1,10 @@ +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-no-classic-methods */ import { computed } from '@ember/object'; import Component from '@ember/component'; -export default Component.extend({ - sections: computed('itemData.{methods,properties,events}', function () { +export default class ApiIndex extends Component { + @computed('itemData.{methods,properties,events}') + get sections() { return [ { title: 'Methods', @@ -26,5 +28,5 @@ export default Component.extend({ routeSuffix: '.events.event', }, ]; - }), -}); + } +} diff --git a/app/components/class-field-description.js b/app/components/class-field-description.js index 74be7e6c1..50373b8d1 100644 --- a/app/components/class-field-description.js +++ b/app/components/class-field-description.js @@ -1,16 +1,19 @@ -import Component from '@ember/component'; -import { inject as service } from '@ember/service'; +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-no-classic-methods */ import { computed } from '@ember/object'; +import { inject as service } from '@ember/service'; +import Component from '@ember/component'; -export default Component.extend({ - legacyModuleMappings: service(), +export default class ClassFieldDescription extends Component { + @service + legacyModuleMappings; - hasImportExample: computed('field.{name,class}', function () { + @computed('field.{name,class}') + get hasImportExample() { return this.legacyModuleMappings.hasFunctionMapping( this.get('field.name'), this.get('field.class') ); - }), + } /** * Callback for updating the anchor with the field name that was clicked by a user. @@ -18,5 +21,5 @@ export default Component.extend({ * @method updateAnchor * @method fieldName String The name representing the field that was clicked. */ - updateAnchor() {}, -}); + updateAnchor() {} +} diff --git a/app/components/ember-anchor.js b/app/components/ember-anchor.js index 43f41ab7d..0122fe2ad 100644 --- a/app/components/ember-anchor.js +++ b/app/components/ember-anchor.js @@ -1,9 +1,10 @@ +/* eslint-disable ember/classic-decorator-no-classic-methods */ import { get } from '@ember/object'; import AnchorComponent from 'ember-anchor/components/ember-anchor'; import config from 'ember-api-docs/config/environment'; import getOffset from 'ember-api-docs/utils/get-offset'; -export default AnchorComponent.extend({ +export default class EmberAnchor extends AnchorComponent { // This overrides Ember Anchor to support scrolling within a fixed position element _scrollToElemPosition() { let qp = this.anchorQueryParam; @@ -25,5 +26,5 @@ export default AnchorComponent.extend({ scrollContainer.scrollTop = offsetToScroll; } } - }, -}); + } +} diff --git a/app/components/import-example.js b/app/components/import-example.js index 82372a4ac..efc997444 100644 --- a/app/components/import-example.js +++ b/app/components/import-example.js @@ -1,11 +1,12 @@ +/* eslint-disable ember/classic-decorator-no-classic-methods */ +import { action } from '@ember/object'; import Component from '@ember/component'; import { later } from '@ember/runloop'; -export default Component.extend({ - actions: { - showSuccess() { - this.toggleProperty('showClipboardSuccessIcon'); - later(this, () => this.toggleProperty('showClipboardSuccessIcon'), 950); - }, - }, -}); +export default class ImportExample extends Component { + @action + showSuccess() { + this.toggleProperty('showClipboardSuccessIcon'); + later(this, () => this.toggleProperty('showClipboardSuccessIcon'), 950); + } +} diff --git a/app/components/loading-spinner.js b/app/components/loading-spinner.js index 3e885803f..45bf59629 100644 --- a/app/components/loading-spinner.js +++ b/app/components/loading-spinner.js @@ -1,5 +1,5 @@ +import { classNames } from '@ember-decorators/component'; import Component from '@ember/component'; -export default Component.extend({ - classNames: ['loading-spinner'], -}); +@classNames('loading-spinner') +export default class LoadingSpinner extends Component {} diff --git a/app/components/search-input/dropdown-header.js b/app/components/search-input/dropdown-header.js index b9b88f152..9879c9ac1 100644 --- a/app/components/search-input/dropdown-header.js +++ b/app/components/search-input/dropdown-header.js @@ -1,5 +1,5 @@ +import { classNames } from '@ember-decorators/component'; import Component from '@ember/component'; -export default Component.extend({ - classNames: ['ds-suggestion'], -}); +@classNames('ds-suggestion') +export default class DropdownHeader extends Component {} diff --git a/app/components/search-input/dropdown.js b/app/components/search-input/dropdown.js index aa125e4f7..20f03d9bf 100644 --- a/app/components/search-input/dropdown.js +++ b/app/components/search-input/dropdown.js @@ -1,22 +1,26 @@ -import { set } from '@ember/object'; +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-hooks */ +import { + classNames, + attributeBindings, + tagName, +} from '@ember-decorators/component'; +import { set, get, computed } from '@ember/object'; import Component from '@ember/component'; -import { get, computed } from '@ember/object'; import { A } from '@ember/array'; -export default Component.extend({ +@tagName('span') +@classNames('ds-dropdown-menu', 'ds-with-1') +@attributeBindings('role') +export default class Dropdown extends Component { // Public API - role: 'listbox', - isVisible: false, + role = 'listbox'; - // Private API - tagName: 'span', - classNames: ['ds-dropdown-menu', 'ds-with-1'], - attributeBindings: ['role'], + isVisible = false; init() { - this._super(...arguments); + super.init(...arguments); set(this, 'results', A()); - }, + } // show // Massage data to make it easier for displaying on the template @@ -28,7 +32,8 @@ export default Component.extend({ * } * } */ - _groupedResults: computed('results.[]', function () { + @computed('results.[]') + get _groupedResults() { if (!get(this, 'results.length')) { return {}; } @@ -72,5 +77,5 @@ export default Component.extend({ return lvl0Result; }, {}); - }), -}); + } +} diff --git a/app/components/table-of-contents.js b/app/components/table-of-contents.js index fcd820409..4ad98d435 100644 --- a/app/components/table-of-contents.js +++ b/app/components/table-of-contents.js @@ -1,10 +1,10 @@ +import { action } from '@ember/object'; import Component from '@ember/component'; -export default Component.extend({ - actions: { - toggle(type) { - const tableElement = document.querySelector(`ol.toc-level-1.${type}`); - tableElement.classList.toggle('selected'); - }, - }, -}); +export default class TableOfContents extends Component { + @action + toggle(type) { + const tableElement = document.querySelector(`ol.toc-level-1.${type}`); + tableElement.classList.toggle('selected'); + } +} diff --git a/app/controllers/application.js b/app/controllers/application.js index 2e7ef0f54..b89f2f299 100644 --- a/app/controllers/application.js +++ b/app/controllers/application.js @@ -169,6 +169,6 @@ const links = [ }, ]; -export default Controller.extend({ - links, -}); +export default class ApplicationController extends Controller { + links = links; +} diff --git a/app/controllers/class.js b/app/controllers/class.js index e29069c46..177515231 100644 --- a/app/controllers/class.js +++ b/app/controllers/class.js @@ -1,5 +1,5 @@ import Controller from '@ember/controller'; -export default Controller.extend({ - queryParams: ['anchor', 'type'], -}); +export default class ClassController extends Controller { + queryParams = ['anchor', 'type']; +} diff --git a/app/controllers/events.js b/app/controllers/events.js index 9d0e4a2e7..1f953be92 100644 --- a/app/controllers/events.js +++ b/app/controllers/events.js @@ -2,7 +2,11 @@ import { inject as service } from '@ember/service'; import Controller from '@ember/controller'; import AnchorControllerSupport from 'ember-anchor/mixins/controller-support'; -export default Controller.extend(AnchorControllerSupport, { - filterData: service(), - queryParams: ['anchor'], -}); +export default class EventsController extends Controller.extend( + AnchorControllerSupport +) { + @service + filterData; + + queryParams = ['anchor']; +} diff --git a/app/controllers/methods.js b/app/controllers/methods.js index d0e8d4d01..34204de92 100644 --- a/app/controllers/methods.js +++ b/app/controllers/methods.js @@ -1,12 +1,17 @@ +/* eslint-disable ember/classic-decorator-no-classic-methods */ import { inject as service } from '@ember/service'; import Controller from '@ember/controller'; import AnchorControllerSupport from 'ember-anchor/mixins/controller-support'; -export default Controller.extend(AnchorControllerSupport, { - filterData: service(), - queryParams: ['anchor'], +export default class MethodsController extends Controller.extend( + AnchorControllerSupport +) { + @service + filterData; + + queryParams = ['anchor']; updateAnchor(fieldName) { this.set('anchor', fieldName); - }, -}); + } +} diff --git a/app/controllers/project-version.js b/app/controllers/project-version.js index 09797e707..914d29b28 100644 --- a/app/controllers/project-version.js +++ b/app/controllers/project-version.js @@ -1,45 +1,56 @@ -import Controller from '@ember/controller'; +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-no-classic-methods */ import { computed } from '@ember/object'; -import { alias, readOnly } from '@ember/object/computed'; -import { A } from '@ember/array'; import { inject as service } from '@ember/service'; +import { readOnly, alias } from '@ember/object/computed'; +import Controller from '@ember/controller'; +import { A } from '@ember/array'; import values from 'lodash.values'; import groupBy from 'lodash.groupby'; import semverCompare from 'semver-compare'; import getCompactVersion from '../utils/get-compact-version'; -export default Controller.extend({ - filterData: service(), +export default class ProjectVersionController extends Controller { + @service + filterData; - metaStore: service(), + @service + metaStore; - project: service(), + @service + project; - showPrivateClasses: alias('filterData.sideNav.showPrivate'), + @alias('filterData.sideNav.showPrivate') + showPrivateClasses; - classesIDs: computed('model', function () { + @computed('model') + get classesIDs() { return this.getRelationshipIDs('classes'); - }), + } - publicClassesIDs: computed('model', function () { + @computed('model') + get publicClassesIDs() { return this.getRelationshipIDs('public-classes'); - }), + } - namespaceIDs: computed('model', function () { + @computed('model') + get namespaceIDs() { return this.getRelationshipIDs('namespaces'); - }), + } - publicNamespaceIDs: computed('model', function () { + @computed('model') + get publicNamespaceIDs() { return this.getRelationshipIDs('public-namespaces'); - }), + } - moduleIDs: computed('model.id', function () { + @computed('model.id') + get moduleIDs() { return this.getModuleRelationships(this.get('model.id'), 'modules'); - }), + } - publicModuleIDs: computed('model.id', function () { + @computed('model.id') + get publicModuleIDs() { return this.getModuleRelationships(this.get('model.id'), 'public-modules'); - }), + } getModuleRelationships(versionId, moduleType) { let relations = this.getRelations(moduleType); @@ -47,11 +58,11 @@ export default Controller.extend({ return relations .map((id) => id.substring(versionId.length + 1)) .filter((id) => id !== 'ember-data-overview'); - }, + } getRelations(relationship) { return this.model.hasMany(relationship).ids().sort(); - }, + } getRelationshipIDs(relationship) { const splitPoint = 2 + this.get('model.project.id').split('-').length - 1; @@ -62,70 +73,54 @@ export default Controller.extend({ return A(sorted) .toArray() .map((id) => id.split('-').slice(splitPoint).join('-')); - }, - - shownClassesIDs: computed( - 'showPrivateClasses', - 'classesIDs', - 'publicClassesIDs', - function () { - return this.showPrivateClasses ? this.classesIDs : this.publicClassesIDs; - } - ), - - shownModuleIDs: computed( - 'showPrivateClasses', - 'moduleIDs', - 'publicModuleIDs', - function () { - return this.showPrivateClasses ? this.moduleIDs : this.publicModuleIDs; - } - ), - - shownNamespaceIDs: computed( - 'showPrivateClasses', - 'namespaceIDs', - 'publicNamespaceIDs', - function () { - return this.showPrivateClasses - ? this.namespaceIDs - : this.publicNamespaceIDs; - } - ), - - projectVersions: computed( - 'metaStore.availableProjectVersions', - 'model.project.id', - function () { - const projectVersions = this.get('metaStore.availableProjectVersions')[ - this.get('model.project.id') - ]; - let versions = projectVersions.sort((a, b) => semverCompare(b, a)); - - versions = versions.map((version) => { - const compactVersion = getCompactVersion(version); - return { id: version, compactVersion }; - }); - let groupedVersions = groupBy( - versions, - (version) => version.compactVersion - ); - - return values(groupedVersions).map((groupedVersion) => groupedVersion[0]); - } - ), - - urlVersion: alias('project.urlVersion'), - - selectedProjectVersion: computed( - 'projectVersions.[]', - 'model.version', - function () { - return this.projectVersions.filter( - (pV) => pV.id === this.get('model.version') - )[0]; - } - ), - - activeProject: readOnly('model.project.id'), -}); + } + + @computed('showPrivateClasses', 'classesIDs', 'publicClassesIDs') + get shownClassesIDs() { + return this.showPrivateClasses ? this.classesIDs : this.publicClassesIDs; + } + + @computed('showPrivateClasses', 'moduleIDs', 'publicModuleIDs') + get shownModuleIDs() { + return this.showPrivateClasses ? this.moduleIDs : this.publicModuleIDs; + } + + @computed('showPrivateClasses', 'namespaceIDs', 'publicNamespaceIDs') + get shownNamespaceIDs() { + return this.showPrivateClasses + ? this.namespaceIDs + : this.publicNamespaceIDs; + } + + @computed('metaStore.availableProjectVersions', 'model.project.id') + get projectVersions() { + const projectVersions = this.get('metaStore.availableProjectVersions')[ + this.get('model.project.id') + ]; + let versions = projectVersions.sort((a, b) => semverCompare(b, a)); + + versions = versions.map((version) => { + const compactVersion = getCompactVersion(version); + return { id: version, compactVersion }; + }); + let groupedVersions = groupBy( + versions, + (version) => version.compactVersion + ); + + return values(groupedVersions).map((groupedVersion) => groupedVersion[0]); + } + + @alias('project.urlVersion') + urlVersion; + + @computed('projectVersions.[]', 'model.version') + get selectedProjectVersion() { + return this.projectVersions.filter( + (pV) => pV.id === this.get('model.version') + )[0]; + } + + @readOnly('model.project.id') + activeProject; +} diff --git a/app/controllers/project-version/classes/class.js b/app/controllers/project-version/classes/class.js index 3ea58ae1e..0f3ea2682 100644 --- a/app/controllers/project-version/classes/class.js +++ b/app/controllers/project-version/classes/class.js @@ -1,49 +1,48 @@ +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-no-classic-methods */ +import { action, computed } from '@ember/object'; import { inject as service } from '@ember/service'; -import { computed } from '@ember/object'; import Controller from '@ember/controller'; import ParentNameMixin from 'ember-api-docs/mixins/parent-name'; import FilterParams from 'ember-api-docs/mixins/filter-params'; -export default Controller.extend(ParentNameMixin, FilterParams, { - filterData: service(), - legacyModuleMappings: service(), - metaStore: service(), +export default class ClassController extends Controller.extend( + ParentNameMixin, + FilterParams +) { + @service + filterData; - hasImportExample: computed( - 'legacyModuleMappings.mappings', - 'model.{module,name}', - function () { - return this.legacyModuleMappings.hasClassMapping( - this.get('model.name'), - this.get('model.module') - ); - } - ), + @service + legacyModuleMappings; - module: computed( - 'legacyModulemappings.mappings', - 'model.{module,name}', - function () { - return this.legacyModuleMappings.getModule( - this.get('model.name'), - this.get('model.module') - ); - } - ), + @service + metaStore; - allVersions: computed( - 'metaStore.availableProjectVersions', - 'model.project.id', - function () { - return this.get('metaStore.availableProjectVersions')[ - this.get('model.project.id') - ]; - } - ), + @computed('legacyModuleMappings.mappings', 'model.{module,name}') + get hasImportExample() { + return this.legacyModuleMappings.hasClassMapping( + this.get('model.name'), + this.get('model.module') + ); + } - actions: { - updateFilter(filter) { - this.toggleProperty(`filterData.${filter}`); - }, - }, -}); + @computed('legacyModulemappings.mappings', 'model.{module,name}') + get module() { + return this.legacyModuleMappings.getModule( + this.get('model.name'), + this.get('model.module') + ); + } + + @computed('metaStore.availableProjectVersions', 'model.project.id') + get allVersions() { + return this.get('metaStore.availableProjectVersions')[ + this.get('model.project.id') + ]; + } + + @action + updateFilter(filter) { + this.toggleProperty(`filterData.${filter}`); + } +} diff --git a/app/controllers/project-version/classes/class/index.js b/app/controllers/project-version/classes/class/index.js index 520f4482a..27c0a8639 100644 --- a/app/controllers/project-version/classes/class/index.js +++ b/app/controllers/project-version/classes/class/index.js @@ -2,6 +2,9 @@ import { inject as service } from '@ember/service'; import Controller from '@ember/controller'; import ParentNameMixin from 'ember-api-docs/mixins/parent-name'; -export default Controller.extend(ParentNameMixin, { - filterData: service(), -}); +export default class IndexController extends Controller.extend( + ParentNameMixin +) { + @service + filterData; +} diff --git a/app/controllers/project-version/functions/function.js b/app/controllers/project-version/functions/function.js deleted file mode 100644 index 3910d17d2..000000000 --- a/app/controllers/project-version/functions/function.js +++ /dev/null @@ -1,7 +0,0 @@ -import Controller from '@ember/controller'; -import { alias } from '@ember/object/computed'; - -export default Controller.extend({ - fn: alias('model.fn'), - fnModule: alias('model.fnModule'), -}); diff --git a/app/controllers/project-version/modules/module.js b/app/controllers/project-version/modules/module.js index 5273bbcb0..071e7890b 100644 --- a/app/controllers/project-version/modules/module.js +++ b/app/controllers/project-version/modules/module.js @@ -1,60 +1,58 @@ -import { alias } from '@ember/object/computed'; +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-no-classic-methods */ import { computed } from '@ember/object'; import { inject as service } from '@ember/service'; +import { alias } from '@ember/object/computed'; import ClassController from '../classes/class'; import uniq from 'lodash.uniq'; import union from 'lodash.union'; -export default ClassController.extend({ - filterData: service(), - showPrivateClasses: alias('filterData.sideNav.showPrivate'), +export default class ModuleController extends ClassController { + @service + filterData; + + @alias('filterData.sideNav.showPrivate') + showPrivateClasses; - submodules: computed('model.submodules', function () { + @computed('model.submodules') + get submodules() { return Object.keys(this.get('model.submodules')); - }), + } - namespaces: computed('model.namespaces', function () { + @computed('model.namespaces') + get namespaces() { return Object.keys(this.get('model.namespaces')); - }), - - classes: computed( - 'model.{privateclasses,publicclasses}', - 'showPrivateClasses', - function () { - if (this.showPrivateClasses) { - return this.get('model.publicclasses').concat( - this.get('model.privateclasses') - ); - } - return this.get('model.publicclasses'); + } + + @computed('model.{privateclasses,publicclasses}', 'showPrivateClasses') + get classes() { + if (this.showPrivateClasses) { + return this.get('model.publicclasses').concat( + this.get('model.privateclasses') + ); } - ), + return this.get('model.publicclasses'); + } - classesAndNamespaces: computed('classes', 'namespaces', function () { + @computed('classes', 'namespaces') + get classesAndNamespaces() { return uniq(union(this.namespaces, this.classes).sort(), true); - }), - - functionHeadings: computed( - 'model.{allstaticfunctions,staticfunctions}', - 'showPrivateClasses', - function () { - if (this.get('model.allstaticfunctions') && this.showPrivateClasses) { - return Object.keys(this.get('model.allstaticfunctions')).sort(); - } else if (this.get('model.staticfunctions')) { - return Object.keys(this.get('model.staticfunctions')).sort(); - } - return {}; + } + + @computed('model.{allstaticfunctions,staticfunctions}', 'showPrivateClasses') + get functionHeadings() { + if (this.get('model.allstaticfunctions') && this.showPrivateClasses) { + return Object.keys(this.get('model.allstaticfunctions')).sort(); + } else if (this.get('model.staticfunctions')) { + return Object.keys(this.get('model.staticfunctions')).sort(); } - ), - - functions: computed( - 'model.{allstaticfunctions,staticfunctions}', - 'showPrivateClasses', - function () { - if (this.showPrivateClasses && this.get('model.allstaticfunctions')) { - return this.get('model.allstaticfunctions'); - } - return this.get('model.staticfunctions'); + return {}; + } + + @computed('model.{allstaticfunctions,staticfunctions}', 'showPrivateClasses') + get functions() { + if (this.showPrivateClasses && this.get('model.allstaticfunctions')) { + return this.get('model.allstaticfunctions'); } - ), -}); + return this.get('model.staticfunctions'); + } +} diff --git a/app/controllers/project-version/namespaces/namespace.js b/app/controllers/project-version/namespaces/namespace.js index 9623bc1f0..76760e409 100644 --- a/app/controllers/project-version/namespaces/namespace.js +++ b/app/controllers/project-version/namespaces/namespace.js @@ -1,3 +1,3 @@ import ClassController from '../classes/class'; -export default ClassController.extend(); +export default class NamespaceController extends ClassController {} diff --git a/app/controllers/project-version/namespaces/namespace/index.js b/app/controllers/project-version/namespaces/namespace/index.js index c764a8f1e..ba6f71f5c 100644 --- a/app/controllers/project-version/namespaces/namespace/index.js +++ b/app/controllers/project-version/namespaces/namespace/index.js @@ -1,3 +1,3 @@ import ClassIndexController from '../../classes/class/index'; -export default ClassIndexController.extend(); +export default class IndexController extends ClassIndexController {} diff --git a/app/controllers/properties.js b/app/controllers/properties.js index babbe7780..0d4e51073 100644 --- a/app/controllers/properties.js +++ b/app/controllers/properties.js @@ -1,14 +1,19 @@ +/* eslint-disable ember/classic-decorator-no-classic-methods */ +import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import Controller from '@ember/controller'; import AnchorControllerSupport from 'ember-anchor/mixins/controller-support'; -export default Controller.extend(AnchorControllerSupport, { - filterData: service(), - queryParams: ['anchor'], +export default class PropertiesController extends Controller.extend( + AnchorControllerSupport +) { + @service + filterData; - actions: { - updateAnchor(fieldName) { - this.set('anchor', fieldName); - }, - }, -}); + queryParams = ['anchor']; + + @action + updateAnchor(fieldName) { + this.set('anchor', fieldName); + } +} diff --git a/app/models/class.js b/app/models/class.js index d4e6951ff..1024cc799 100644 --- a/app/models/class.js +++ b/app/models/class.js @@ -1,5 +1,6 @@ -import Model, { belongsTo, attr } from '@ember-data/model'; +/* eslint-disable ember/no-computed-properties-in-native-classes, ember/classic-decorator-no-classic-methods */ import { computed } from '@ember/object'; +import Model, { belongsTo, attr } from '@ember-data/model'; const projectNameFromClassName = (key) => { return computed(key, 'project.id', function () { @@ -34,40 +35,80 @@ const guessVersionFor = (key) => { ); }; -export default Model.extend({ - name: attr(), - methods: attr(), - properties: attr(), - access: attr(), - events: attr(), - description: attr(), - ogDescription: attr(), - extends: attr(), - uses: attr(), - since: attr(), - file: attr(), - line: attr(), - module: attr(), - parentClass: belongsTo('class', { async: true, inverse: null }), - projectVersion: belongsTo('project-version', { inverse: 'classes' }), - project: computed('projectVersion.id', function () { +export default class Class extends Model { + @attr() + name; + + @attr() + methods; + + @attr() + properties; + + @attr() + access; + + @attr() + events; + + @attr() + description; + + @attr() + ogDescription; + + @attr() + extends; + + @attr() + uses; + + @attr() + since; + + @attr() + file; + + @attr() + line; + + @attr() + module; + + @belongsTo('class', { async: true, inverse: null }) + parentClass; + + @belongsTo('project-version', { inverse: 'classes' }) + projectVersion; + + @computed('projectVersion.id') + get project() { return this.projectVersion.get('project'); - }), + } + + @projectNameFromClassName('extends') + extendedClassProjectName; + + @guessVersionFor('extends') + extendedClassVersion; + + @projectNameFromClassName('uses') + usedClassProjectName; - extendedClassProjectName: projectNameFromClassName('extends'), - extendedClassVersion: guessVersionFor('extends'), - usedClassProjectName: projectNameFromClassName('uses'), - usedClassVersion: guessVersionFor('uses'), + @guessVersionFor('uses') + usedClassVersion; - extendedClassShortName: computed('extends', function () { + @computed('extends') + get extendedClassShortName() { let extendedClassName = this['extends']; if (extendedClassName.substr(0, 6) === 'Ember.') { return extendedClassName.substr(6); } return extendedClassName; - }), + } - usesObjects: computed('project.id', 'uses', function () { + @computed('project.id', 'uses') + get usesObjects() { return this.uses.map((className) => ({ name: className, shortName: @@ -79,5 +120,5 @@ export default Model.extend({ ? 'ember-data' : this.get('project.id'), })); - }), -}); + } +} diff --git a/app/models/missing.js b/app/models/missing.js index f08d5ead7..0dba61b6b 100644 --- a/app/models/missing.js +++ b/app/models/missing.js @@ -1,5 +1,6 @@ import Model, { attr } from '@ember-data/model'; -export default Model.extend({ - name: attr(), -}); +export default class Missing extends Model { + @attr() + name; +} diff --git a/app/models/module.js b/app/models/module.js index 71f52e940..e24b9ff1b 100644 --- a/app/models/module.js +++ b/app/models/module.js @@ -1,13 +1,28 @@ import { belongsTo, attr } from '@ember-data/model'; import ClassModel from './class'; -export default ClassModel.extend({ - submodules: attr(), - publicclasses: attr(), - privateclasses: attr(), - namespaces: attr(), - parent: attr(), - staticfunctions: attr(), - allstaticfunctions: attr(), - projectVersion: belongsTo('project-version', { inverse: 'modules' }), -}); +export default class Module extends ClassModel { + @attr() + submodules; + + @attr() + publicclasses; + + @attr() + privateclasses; + + @attr() + namespaces; + + @attr() + parent; + + @attr() + staticfunctions; + + @attr() + allstaticfunctions; + + @belongsTo('project-version', { inverse: 'modules' }) + projectVersion; +} diff --git a/app/models/namespace.js b/app/models/namespace.js index b8d54ae82..230dc8668 100644 --- a/app/models/namespace.js +++ b/app/models/namespace.js @@ -1,6 +1,7 @@ import { belongsTo } from '@ember-data/model'; import ClassModel from './class'; -export default ClassModel.extend({ - projectVersion: belongsTo('project-version', { inverse: 'namespaces' }), -}); +export default class Namespace extends ClassModel { + @belongsTo('project-version', { inverse: 'namespaces' }) + projectVersion; +} diff --git a/app/models/project.js b/app/models/project.js index 15adf957c..93082b2b9 100644 --- a/app/models/project.js +++ b/app/models/project.js @@ -1,7 +1,12 @@ import Model, { hasMany, attr } from '@ember-data/model'; -export default Model.extend({ - name: attr(), - githubUrl: attr(), - projectVersions: hasMany('project-version', { async: true }), -}); +export default class Project extends Model { + @attr() + name; + + @attr() + githubUrl; + + @hasMany('project-version', { async: true }) + projectVersions; +} diff --git a/app/routes/application.js b/app/routes/application.js index c9558fae7..db93918c6 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -1,12 +1,15 @@ +import { inject as service } from '@ember/service'; import Route from '@ember/routing/route'; import { set } from '@ember/object'; -import { inject as service } from '@ember/service'; import ENV from 'ember-api-docs/config/environment'; import getCompactVersion from 'ember-api-docs/utils/get-compact-version'; -export default Route.extend({ - headData: service(), - legacyModuleMappings: service(), +export default class ApplicationRoute extends Route { + @service + headData; + + @service + legacyModuleMappings; title(tokens) { let [version, entity] = tokens; @@ -22,10 +25,11 @@ export default Route.extend({ return title; } return ''; - }, + } + async afterModel() { set(this, 'headData.cdnDomain', ENV.API_HOST); await this.legacyModuleMappings.initMappings(); - return this._super(...arguments); - }, -}); + return super.afterModel(...arguments); + } +} diff --git a/app/routes/class.js b/app/routes/class.js index 7c5ba8bfb..c9c3006b6 100644 --- a/app/routes/class.js +++ b/app/routes/class.js @@ -1,23 +1,25 @@ -import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; +import Route from '@ember/routing/route'; -export default Route.extend({ - legacyModuleMappings: service(), +export default class ClassRoute extends Route { + @service + legacyModuleMappings; model(params) { return this.legacyModuleMappings .fetch() .then((response) => response.json()) .then((mappings) => { - return { + let ret = { mappings: this.legacyModuleMappings.buildMappings(mappings), className: params['class'].substr( 0, params['class'].lastIndexOf('.') ), }; + return ret; }); - }, + } redirect(model) { let mappedInfo = this.legacyModuleMappings.getNewClassFromOld( @@ -44,5 +46,5 @@ export default Route.extend({ } } return this.transitionTo('project-version', 'ember', 'release'); - }, -}); + } +} diff --git a/app/routes/data-class.js b/app/routes/data-class.js index 4dec9381c..9d6984700 100644 --- a/app/routes/data-class.js +++ b/app/routes/data-class.js @@ -1,8 +1,9 @@ -import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; +import Route from '@ember/routing/route'; -export default Route.extend({ - legacyModuleMappings: service(), +export default class DataClassRoute extends Route { + @service + legacyModuleMappings; model(params) { return this.legacyModuleMappings @@ -17,7 +18,7 @@ export default Route.extend({ ), }; }); - }, + } redirect(model) { let mappingInfo = this.legacyModuleMappings.getNewClassFromOld( @@ -38,5 +39,5 @@ export default Route.extend({ } else { return this.transitionTo('project-version', 'ember', 'release'); } - }, -}); + } +} diff --git a/app/routes/data-module.js b/app/routes/data-module.js index 948f6188d..97c353115 100644 --- a/app/routes/data-module.js +++ b/app/routes/data-module.js @@ -1,8 +1,9 @@ -import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; +import Route from '@ember/routing/route'; -export default Route.extend({ - legacyModuleMappings: service(), +export default class DataModuleRoute extends Route { + @service + legacyModuleMappings; model(params) { return this.legacyModuleMappings @@ -14,7 +15,7 @@ export default Route.extend({ mappings: this.legacyModuleMappings.buildMappings(mappings), }; }); - }, + } redirect(model) { let { moduleName, mappings } = model; @@ -35,5 +36,5 @@ export default Route.extend({ mappingInfo.module ); } - }, -}); + } +} diff --git a/app/routes/ember-cli.js b/app/routes/ember-cli.js index c247d9f65..a5caef6fa 100644 --- a/app/routes/ember-cli.js +++ b/app/routes/ember-cli.js @@ -1,7 +1,7 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class EmberCliRoute extends Route { title() { return 'Ember CLI - Ember API Documentation'; - }, -}); + } +} diff --git a/app/routes/index.js b/app/routes/index.js index 3b92e58fe..5c937a9c7 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -1,7 +1,7 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class IndexRoute extends Route { redirect() { return this.transitionTo('project', 'ember'); - }, -}); + } +} diff --git a/app/routes/module.js b/app/routes/module.js index ccfff4efa..d583b843b 100644 --- a/app/routes/module.js +++ b/app/routes/module.js @@ -1,8 +1,9 @@ -import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; +import Route from '@ember/routing/route'; -export default Route.extend({ - legacyModuleMappings: service(), +export default class ModuleRoute extends Route { + @service + legacyModuleMappings; model(params) { return this.legacyModuleMappings @@ -14,7 +15,7 @@ export default Route.extend({ mappings: this.legacyModuleMappings.buildMappings(mappings), }; }); - }, + } redirect(model) { let mappingInfo = this.legacyModuleMappings.getNewModuleFromOld( @@ -30,5 +31,5 @@ export default Route.extend({ ); } return this.transitionTo('project-version', 'ember', 'release'); - }, -}); + } +} diff --git a/app/routes/project-version.js b/app/routes/project-version.js index 1f845830c..194d58825 100644 --- a/app/routes/project-version.js +++ b/app/routes/project-version.js @@ -1,3 +1,4 @@ +import { action } from '@ember/object'; import { inject as service } from '@ember/service'; import Route from '@ember/routing/route'; import semverCompare from 'semver-compare'; @@ -6,16 +7,25 @@ import getFullVersion from 'ember-api-docs/utils/get-full-version'; import getLastVersion from 'ember-api-docs/utils/get-last-version'; import config from 'ember-api-docs/config/environment'; -export default Route.extend({ - fastboot: service(), - headData: service(), - metaStore: service(), - router: service(), - projectService: service('project'), +export default class ProjectVersionRoute extends Route { + @service + fastboot; - titleToken: function (model) { - return model.get('version'); - }, + @service + headData; + + @service + metaStore; + + @service + router; + + @service('project') + projectService; + + titleToken(model) { + return model.version; + } async model({ project, project_version }) { let projectObj = await this.store.findRecord('project', project); @@ -31,7 +41,7 @@ export default Route.extend({ return this.store.findRecord('project-version', id, { includes: 'project', }); - }, + } // Using redirect instead of afterModel so transition succeeds and returns 307 redirect(model, transition) { @@ -58,8 +68,7 @@ export default Route.extend({ ); let isLatestVersion = transitionVersion === latestVersion || transitionVersion === 'release'; - let shouldConvertPackages = - semverCompare(model.get('version'), '2.16') < 0; + let shouldConvertPackages = semverCompare(model.version, '2.16') < 0; if (!shouldConvertPackages || isLatestVersion) { // ... and the transition version is the latest release, // display the landing page at @@ -98,123 +107,123 @@ export default Route.extend({ ); } } - }, + } _gatherHeadDataFromVersion(model, projectVersion) { - this.set('headData.isRelease', projectVersion === 'release'); - this.set('headData.compactVersion', model.get('compactVersion')); - this.set('headData.urlVersion', projectVersion); - if (!this.get('headData.isRelease')) { - let request = this.get('fastboot.request'); - let href = this.get('fastboot.isFastBoot') + this.headData.isRelease = projectVersion === 'release'; + this.headData.compactVersion = model.get('compactVersion'); + this.headData.urlVersion = projectVersion; + if (!this.headData.isRelease) { + let request = this.fastboot.request; + let href = this.fastboot.isFastBoot ? `${config.APP.domain}/${request.path}` : window.location.href; let version = new RegExp(model.get('compactVersion'), 'g'); let canonicalUrl = href.replace(version, 'release'); - this.set('headData.canonicalUrl', canonicalUrl); + this.headData.canonicalUrl = canonicalUrl; } - }, + } _getEncodedNameForCurrentClass() { // escape any reserved characters for url, like slashes return encodeURIComponent( this.modelFor('project-version.classes.class').get('name') ); - }, + } serialize(model) { return { project: model.get('project.id'), project_version: model.get('compactVersion'), }; - }, - - actions: { - updateProject(project, ver /*, component */) { - let projectVersionID = ver.compactVersion; - let endingRoute; - switch (this.router.currentRouteName) { - case 'project-version.classes.class': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}`; - break; - } - case 'project-version.classes.class.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}`; - break; - } - case 'project-version.modules.module.index': { - let moduleName = encodeURIComponent( - this.paramsFor('project-version.modules.module').module - ); - endingRoute = `modules/${moduleName}`; - break; - } - case 'project-version.namespaces.namespace.index': { - let namespaceName = this.paramsFor( - 'project-version.namespaces.namespace' - ).namespace; - endingRoute = `namespaces/${namespaceName}`; - break; - } - case 'project-version.classes.class.methods.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}/methods`; - break; - } - case 'project-version.classes.class.events.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}/events`; - break; - } - case 'project-version.classes.class.properties.index': { - let className = this._getEncodedNameForCurrentClass(); - endingRoute = `classes/${className}/properties`; - break; - } - case 'project-version.classes.class.methods.method': { - let className = this._getEncodedNameForCurrentClass(); - let methodName = this.paramsFor( - 'project-version.classes.class.methods.method' - ).method; - endingRoute = `classes/${className}/methods/${methodName}?anchor=${methodName}`; - break; - } - case 'project-version.classes.class.events.event': { - let className = this._getEncodedNameForCurrentClass(); - let eventName = this.paramsFor( - 'project-version.classes.class.events.event' - ).event; - endingRoute = `classes/${className}/events/${eventName}?anchor=${eventName}`; - break; - } - case 'project-version.classes.class.properties.property': { - let className = this._getEncodedNameForCurrentClass(); - let propertyName = this.paramsFor( - 'project-version.classes.class.properties.property' - ).property; - endingRoute = `classes/${className}/properties/${propertyName}?anchor=${propertyName}`; - break; - } - default: - endingRoute = ''; - break; + } + + @action + updateProject(project, ver /*, component */) { + let projectVersionID = ver.compactVersion; + let endingRoute; + switch (this.router.currentRouteName) { + case 'project-version.classes.class': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}`; + break; } - // if the user is navigating to/from api versions >= 2.16, take them - // to the home page instead of trying to translate the url - let shouldConvertPackages = this.shouldConvertPackages( - ver, - this.get('projectService.version') - ); - let isEmberProject = project === 'ember'; - if (!isEmberProject || !shouldConvertPackages) { - this.transitionTo(`/${project}/${projectVersionID}/${endingRoute}`); - } else { - this.transitionTo(`/${project}/${projectVersionID}`); + case 'project-version.classes.class.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}`; + break; + } + case 'project-version.modules.module.index': { + let moduleName = encodeURIComponent( + this.paramsFor('project-version.modules.module').module + ); + endingRoute = `modules/${moduleName}`; + break; + } + case 'project-version.namespaces.namespace.index': { + let namespaceName = this.paramsFor( + 'project-version.namespaces.namespace' + ).namespace; + endingRoute = `namespaces/${namespaceName}`; + break; + } + case 'project-version.classes.class.methods.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}/methods`; + break; + } + case 'project-version.classes.class.events.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}/events`; + break; + } + case 'project-version.classes.class.properties.index': { + let className = this._getEncodedNameForCurrentClass(); + endingRoute = `classes/${className}/properties`; + break; } - }, - }, + case 'project-version.classes.class.methods.method': { + let className = this._getEncodedNameForCurrentClass(); + let methodName = this.paramsFor( + 'project-version.classes.class.methods.method' + ).method; + endingRoute = `classes/${className}/methods/${methodName}?anchor=${methodName}`; + break; + } + case 'project-version.classes.class.events.event': { + let className = this._getEncodedNameForCurrentClass(); + let eventName = this.paramsFor( + 'project-version.classes.class.events.event' + ).event; + endingRoute = `classes/${className}/events/${eventName}?anchor=${eventName}`; + break; + } + case 'project-version.classes.class.properties.property': { + let className = this._getEncodedNameForCurrentClass(); + let propertyName = this.paramsFor( + 'project-version.classes.class.properties.property' + ).property; + endingRoute = `classes/${className}/properties/${propertyName}?anchor=${propertyName}`; + break; + } + default: + endingRoute = ''; + break; + } + // if the user is navigating to/from api versions >= 2.16, take them + // to the home page instead of trying to translate the url + let shouldConvertPackages = this.shouldConvertPackages( + ver, + this.projectService.version + ); + let isEmberProject = project === 'ember'; + if (!isEmberProject || !shouldConvertPackages) { + this.transitionTo(`/${project}/${projectVersionID}/${endingRoute}`); + } else { + this.transitionTo(`/${project}/${projectVersionID}`); + } + } + // Input some version info, returns a boolean based on // whether the user is switching versions for a 2.16 docs release or later. // The urls for pre-2.16 classes and later packages are quite different @@ -227,7 +236,7 @@ export default Route.extend({ (previousComparison < 0 && targetComparison >= 0) || (previousComparison >= 0 && targetComparison < 0) ); - }, + } /** splits the first encoded revision string in the list and takes the string after the version (which is the encoded name), then decodes the result. @@ -236,11 +245,11 @@ export default Route.extend({ let encodedModule = moduleRevs[0] .split('-') .reduce((result, val, index, arry) => { - if (val === this.get('projectService.version')) { + if (val === this.projectService.version) { return arry.slice(index + 1).join('-'); } return result; }); return decodeURIComponent(encodedModule); - }, -}); + } +} diff --git a/app/routes/project-version/classes/class.js b/app/routes/project-version/classes/class.js index 09ede2ded..a473aaae0 100644 --- a/app/routes/project-version/classes/class.js +++ b/app/routes/project-version/classes/class.js @@ -1,19 +1,22 @@ +import { inject as service } from '@ember/service'; import { resolve, all } from 'rsvp'; import Route from '@ember/routing/route'; import { set } from '@ember/object'; import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker'; -import { inject as service } from '@ember/service'; import { pluralize } from 'ember-inflector'; import getFullVersion from 'ember-api-docs/utils/get-full-version'; import createExcerpt from 'ember-api-docs/utils/create-excerpt'; -export default Route.extend(ScrollTracker, { - headData: service(), - metaStore: service(), +export default class ClassRoute extends Route.extend(ScrollTracker) { + @service + headData; + + @service + metaStore; - titleToken: function (model) { + titleToken(model) { return model.name; - }, + } async model(params) { const { project, project_version: compactVersion } = @@ -27,7 +30,7 @@ export default Route.extend(ScrollTracker, { ); const klass = params['class']; return this.find('class', `${project}-${projectVersion}-${klass}`); - }, + } find(typeName, param) { return this.store.find(typeName, param).catch((e1) => { @@ -50,7 +53,7 @@ export default Route.extend(ScrollTracker, { status: 404, }); }); - }, + } redirect(model, transition) { const lookupParams = (routeName) => { @@ -76,7 +79,7 @@ export default Route.extend(ScrollTracker, { if (model.isError) { this.transitionTo('404'); } - }, + } afterModel(klass) { if (!klass.isError) { @@ -97,11 +100,11 @@ export default Route.extend(ScrollTracker, { ); return all(promises); } - }, + } serialize(model) { return { class: model.name, }; - }, -}); + } +} diff --git a/app/routes/project-version/classes/class/events.js b/app/routes/project-version/classes/class/events.js index 5b1d5bda5..316783ffa 100644 --- a/app/routes/project-version/classes/class/events.js +++ b/app/routes/project-version/classes/class/events.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'events', -}); +export default class EventsRoute extends Route { + templateName = 'events'; +} diff --git a/app/routes/project-version/classes/class/index.js b/app/routes/project-version/classes/class/index.js index 68b7f2d36..84cc3c0c4 100644 --- a/app/routes/project-version/classes/class/index.js +++ b/app/routes/project-version/classes/class/index.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'class-index', -}); +export default class IndexRoute extends Route { + templateName = 'class-index'; +} diff --git a/app/routes/project-version/classes/class/methods.js b/app/routes/project-version/classes/class/methods.js index 439ce907c..c7e69e924 100644 --- a/app/routes/project-version/classes/class/methods.js +++ b/app/routes/project-version/classes/class/methods.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'methods', -}); +export default class MethodsRoute extends Route { + templateName = 'methods'; +} diff --git a/app/routes/project-version/classes/class/properties.js b/app/routes/project-version/classes/class/properties.js index ed2133a75..8558fa9d0 100644 --- a/app/routes/project-version/classes/class/properties.js +++ b/app/routes/project-version/classes/class/properties.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'properties', -}); +export default class PropertiesRoute extends Route { + templateName = 'properties'; +} diff --git a/app/routes/project-version/functions/function.js b/app/routes/project-version/functions/function.js index 8d7cdd5a5..f0dd7caca 100644 --- a/app/routes/project-version/functions/function.js +++ b/app/routes/project-version/functions/function.js @@ -1,21 +1,26 @@ +import { inject as service } from '@ember/service'; import Route from '@ember/routing/route'; import getFullVersion from 'ember-api-docs/utils/get-full-version'; -import { inject as service } from '@ember/service'; import { set } from '@ember/object'; import createExcerpt from 'ember-api-docs/utils/create-excerpt'; -export default Route.extend({ - headData: service(), - metaStore: service(), - scrollPositionReset: service(), +export default class FunctionRoute extends Route { + @service + headData; + + @service + metaStore; + + @service + scrollPositionReset; titleToken(model) { return model?.fn?.name; - }, + } async model(params) { - const { project, project_version: compactVersion } = - this.paramsFor('project-version'); + const pVParams = this.paramsFor('project-version'); + const { project, project_version: compactVersion } = pVParams; let projectObj = await this.store.findRecord('project', project); let projectVersion = getFullVersion( @@ -44,22 +49,22 @@ export default Route.extend({ fnModule, fn: fnModule.get('methods').find((fn) => fn.name === functionName), }; - }, + } afterModel(model) { let description = model.fn.description; if (description) { set(this, 'headData.description', createExcerpt(description)); } - }, + } getFunctionObjFromList(classObj, functionName) { return classObj.get('methods').find((fn) => { return fn.name === functionName; }); - }, + } activate() { this.scrollPositionReset.doReset(); - }, -}); + } +} diff --git a/app/routes/project-version/index.js b/app/routes/project-version/index.js index 9185a685d..467ff0cc7 100644 --- a/app/routes/project-version/index.js +++ b/app/routes/project-version/index.js @@ -1,9 +1,9 @@ import Route from '@ember/routing/route'; -export default Route.extend({ +export default class IndexRoute extends Route { async model() { const projectVersion = this.modelFor('project-version'); const project = await projectVersion.project; return project; - }, -}); + } +} diff --git a/app/routes/project-version/modules/module.js b/app/routes/project-version/modules/module.js index e4c2a1180..f57093e50 100644 --- a/app/routes/project-version/modules/module.js +++ b/app/routes/project-version/modules/module.js @@ -2,7 +2,7 @@ import ClassRoute from '../classes/class'; import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker'; import getFullVersion from 'ember-api-docs/utils/get-full-version'; -export default ClassRoute.extend(ScrollTracker, { +export default class ModuleRoute extends ClassRoute.extend(ScrollTracker) { async model(params) { const { project, project_version: compactVersion } = this.paramsFor('project-version'); @@ -25,11 +25,11 @@ export default ClassRoute.extend(ScrollTracker, { } return this.find('module', `${project}-${projectVersion}-${klass}`); - }, + } serialize(model) { return { module: model.get('name'), }; - }, -}); + } +} diff --git a/app/routes/project-version/modules/module/events.js b/app/routes/project-version/modules/module/events.js index 5b1d5bda5..316783ffa 100644 --- a/app/routes/project-version/modules/module/events.js +++ b/app/routes/project-version/modules/module/events.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'events', -}); +export default class EventsRoute extends Route { + templateName = 'events'; +} diff --git a/app/routes/project-version/modules/module/methods.js b/app/routes/project-version/modules/module/methods.js index 439ce907c..c7e69e924 100644 --- a/app/routes/project-version/modules/module/methods.js +++ b/app/routes/project-version/modules/module/methods.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'methods', -}); +export default class MethodsRoute extends Route { + templateName = 'methods'; +} diff --git a/app/routes/project-version/modules/module/properties.js b/app/routes/project-version/modules/module/properties.js index ed2133a75..8558fa9d0 100644 --- a/app/routes/project-version/modules/module/properties.js +++ b/app/routes/project-version/modules/module/properties.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'properties', -}); +export default class PropertiesRoute extends Route { + templateName = 'properties'; +} diff --git a/app/routes/project-version/namespaces/namespace.js b/app/routes/project-version/namespaces/namespace.js index 20846fc1c..dc8e31d05 100644 --- a/app/routes/project-version/namespaces/namespace.js +++ b/app/routes/project-version/namespaces/namespace.js @@ -2,8 +2,8 @@ import ClassRoute from '../classes/class'; import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker'; import getFullVersion from 'ember-api-docs/utils/get-full-version'; -export default ClassRoute.extend(ScrollTracker, { - templateName: 'project-version/classes/class', +export default class NamespaceRoute extends ClassRoute.extend(ScrollTracker) { + templateName = 'project-version/classes/class'; async model(params) { const { project, project_version: compactVersion } = @@ -18,11 +18,11 @@ export default ClassRoute.extend(ScrollTracker, { ); const klass = params['namespace']; return this.find('namespace', `${project}-${projectVersion}-${klass}`); - }, + } serialize(model) { return { namespace: model.get('name'), }; - }, -}); + } +} diff --git a/app/routes/project-version/namespaces/namespace/events.js b/app/routes/project-version/namespaces/namespace/events.js index 5b1d5bda5..316783ffa 100644 --- a/app/routes/project-version/namespaces/namespace/events.js +++ b/app/routes/project-version/namespaces/namespace/events.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'events', -}); +export default class EventsRoute extends Route { + templateName = 'events'; +} diff --git a/app/routes/project-version/namespaces/namespace/index.js b/app/routes/project-version/namespaces/namespace/index.js index 68b7f2d36..84cc3c0c4 100644 --- a/app/routes/project-version/namespaces/namespace/index.js +++ b/app/routes/project-version/namespaces/namespace/index.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'class-index', -}); +export default class IndexRoute extends Route { + templateName = 'class-index'; +} diff --git a/app/routes/project-version/namespaces/namespace/methods.js b/app/routes/project-version/namespaces/namespace/methods.js index 439ce907c..c7e69e924 100644 --- a/app/routes/project-version/namespaces/namespace/methods.js +++ b/app/routes/project-version/namespaces/namespace/methods.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'methods', -}); +export default class MethodsRoute extends Route { + templateName = 'methods'; +} diff --git a/app/routes/project-version/namespaces/namespace/properties.js b/app/routes/project-version/namespaces/namespace/properties.js index ed2133a75..8558fa9d0 100644 --- a/app/routes/project-version/namespaces/namespace/properties.js +++ b/app/routes/project-version/namespaces/namespace/properties.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -export default Route.extend({ - templateName: 'properties', -}); +export default class PropertiesRoute extends Route { + templateName = 'properties'; +} diff --git a/app/routes/project.js b/app/routes/project.js index 4380af584..507933c5c 100644 --- a/app/routes/project.js +++ b/app/routes/project.js @@ -1,7 +1,7 @@ import Route from '@ember/routing/route'; import ScrollTracker from 'ember-api-docs/mixins/scroll-tracker'; -export default Route.extend(ScrollTracker, { +export default class ProjectRoute extends Route.extend(ScrollTracker) { model({ project: projectName }) { let projectNameToLookUp = 'ember'; @@ -17,10 +17,10 @@ export default Route.extend(ScrollTracker, { return this.store.findRecord('project', projectNameToLookUp, { includes: 'project-version', }); - }, + } // Using redirect instead of afterModel so transition succeeds and returns 307 in fastboot redirect(project /*, transition */) { return this.transitionTo('project-version', project.get('id'), 'release'); - }, -}); + } +} diff --git a/app/serializers/application.js b/app/serializers/application.js index e6ba21043..2f6670a8d 100644 --- a/app/serializers/application.js +++ b/app/serializers/application.js @@ -1,11 +1,12 @@ -import JSONAPISerializer from '@ember-data/serializer/json-api'; import { inject as service } from '@ember/service'; +import JSONAPISerializer from '@ember-data/serializer/json-api'; -export default JSONAPISerializer.extend({ - metaStore: service(), +export default class Application extends JSONAPISerializer { + @service + metaStore; normalizeFindRecordResponse(store, primaryModelClass, payload, id) { - let normalizedDocument = this._super(...arguments); + let normalizedDocument = super.normalizeFindRecordResponse(...arguments); // We do this because ember data doesn't handle meta data in accordance to json-api spec yet if (primaryModelClass.modelName === 'project') { @@ -16,5 +17,5 @@ export default JSONAPISerializer.extend({ } return normalizedDocument; - }, -}); + } +} diff --git a/app/services/algolia.js b/app/services/algolia.js index 2276d151c..e6bdbde4b 100644 --- a/app/services/algolia.js +++ b/app/services/algolia.js @@ -1,9 +1,10 @@ +/* eslint-disable ember/classic-decorator-hooks */ import Service from '@ember/service'; import algoliasearch from 'algoliasearch'; import config from 'ember-api-docs/config/environment'; import { denodeify } from 'rsvp'; -export default Service.extend({ +export default class AlgoliaService extends Service { _search(query, params, callback) { if (!callback) { callback = params; @@ -23,22 +24,22 @@ export default Service.extend({ } else { callback(new Error(`Could not search algolia for query "${query}"`)); } - }, + } accessIndex(IndexName) { if (!this._indices[IndexName]) { this._indices[IndexName] = this._client.initIndex(IndexName); } return this._indices[IndexName]; - }, + } init() { - this._super(...arguments); + super.init(...arguments); this._client = algoliasearch( config.algolia.algoliaId, config.algolia.algoliaKey ); this._indices = {}; this.search = denodeify(this._search.bind(this)); - }, -}); + } +} diff --git a/app/services/filter-data.js b/app/services/filter-data.js index b0f3572c0..d5f05e8ba 100644 --- a/app/services/filter-data.js +++ b/app/services/filter-data.js @@ -1,16 +1,14 @@ import Service from '@ember/service'; -export default Service.extend({ - showInherited: false, - showProtected: false, - showPrivate: false, - showDeprecated: false, - sideNav: null, +export default class FilterDataService extends Service { + // These attributes are not @tracked because they are used in computed + // properties and not directly in templates. + showInherited = false; + showProtected = false; + showPrivate = false; + showDeprecated = false; - init() { - this.sideNav = { - showPrivate: false, - }; - this._super(...arguments); - }, -}); + sideNav = { + showPrivate: false, + }; +} diff --git a/app/services/head-data.js b/app/services/head-data.js new file mode 100644 index 000000000..de8bf244c --- /dev/null +++ b/app/services/head-data.js @@ -0,0 +1,12 @@ +import Service from '@ember/service'; +import { tracked } from '@glimmer/tracking'; + +export default class HeadDataService extends Service { + @tracked title; + @tracked isRelease; + @tracked compactVersion; + @tracked urlVersion; + @tracked canonicalUrl; + @tracked description; + @tracked cdnDomain; +} diff --git a/app/services/legacy-module-mappings.js b/app/services/legacy-module-mappings.js index b035314f3..9b535230e 100644 --- a/app/services/legacy-module-mappings.js +++ b/app/services/legacy-module-mappings.js @@ -1,5 +1,6 @@ import fetch from 'fetch'; import Service from '@ember/service'; +import { tracked } from '@glimmer/tracking'; const LOCALNAME_CONVERSIONS = { Object: 'EmberObject', @@ -7,17 +8,19 @@ const LOCALNAME_CONVERSIONS = { Error: 'EmberError', }; -export default Service.extend({ +export default class LegacyModuleMappingsService extends Service { + @tracked mappings; + async initMappings() { try { let response = await this.fetch(); let mappings = await response.json(); let newMappings = this.buildMappings(mappings); - this.set('mappings', newMappings); + this.mappings = newMappings; } catch (e) { - this.set('mappings', []); + this.mappings = []; } - }, + } buildMappings(mappings) { return mappings.map((item) => { @@ -27,11 +30,11 @@ export default Service.extend({ } return newItem; }); - }, + } fetch() { return fetch('/assets/mappings.json'); - }, + } getModule(name, documentedModule) { if (!this.mappings) { @@ -39,7 +42,7 @@ export default Service.extend({ } let matches = this.mappings.filter((element) => element.localName === name); return matches.length > 0 ? matches[0].module : documentedModule; - }, + } getNewClassFromOld(oldClassName, mappings) { let matches = mappings.filter((element) => element.global === oldClassName); @@ -63,7 +66,7 @@ export default Service.extend({ newName: oldClassName, }; } - }, + } getNewModuleFromOld(oldModuleName, mappings) { let matches = mappings.filter( @@ -78,7 +81,7 @@ export default Service.extend({ module: oldModuleName, }; } - }, + } hasFunctionMapping(name, module) { if (!this.mappings) { @@ -88,7 +91,7 @@ export default Service.extend({ (element) => element.export === name && element.module === module ); return filtered.length > 0; - }, + } hasClassMapping(name) { if (!this.mappings) { @@ -97,5 +100,5 @@ export default Service.extend({ return ( this.mappings.filter((element) => element.localName === name).length > 0 ); - }, -}); + } +} diff --git a/app/services/meta-store.js b/app/services/meta-store.js index 491cba497..85f1167d6 100644 --- a/app/services/meta-store.js +++ b/app/services/meta-store.js @@ -4,19 +4,14 @@ import { set } from '@ember/object'; import { A } from '@ember/array'; import getCompactVersion from 'ember-api-docs/utils/get-compact-version'; import getLastVersion from 'ember-api-docs/utils/get-last-version'; +import { tracked } from '@glimmer/tracking'; -export default Service.extend({ - availableProjectVersions: null, - projectRevMap: null, - - init() { - this.availableProjectVersions = { - ember: A(), - 'ember-data': A(), - }; - this.projectRevMap = {}; - this._super(...arguments); - }, +export default class MetaStoreService extends Service { + @tracked availableProjectVersions = { + ember: A(), + 'ember-data': A(), + }; + @tracked projectRevMap = {}; addToProjectRevMap(projectVersionKey, projectRevDoc) { let projectRevMap = this.projectRevMap; @@ -24,31 +19,27 @@ export default Service.extend({ projectRevMap[projectVersionKey] = projectRevDoc; set(this, 'projectRevMap', projectRevMap); } - }, + } getRevId(project, version, type, id) { let encodedId = encodeURIComponent(id); return this.projectRevMap[`${project}-${version}`][type][encodedId]; - }, + } getEncodedModulesFromProjectRev(id) { return Object.keys(this.projectRevMap[id].module).sort(); - }, + } initializeStore(availableProjectVersions, projectRevMap) { - this.setProperties({ - availableProjectVersions: { - ember: A(availableProjectVersions['ember']), - 'ember-data': A(availableProjectVersions['ember-data']), - }, - projectRevMap: projectRevMap, - }); - }, + this.availableProjectVersions = { + ember: A(availableProjectVersions['ember']), + 'ember-data': A(availableProjectVersions['ember-data']), + }; + this.projectRevMap = projectRevMap; + } getFullVersion(projectName, compactProjVersion) { - const availProjVersions = this.get( - `availableProjectVersions.${projectName}` - ); + const availProjVersions = this.availableProjectVersions[projectName]; let filtered = availProjVersions.filter( (v) => getCompactVersion(v) === getCompactVersion(compactProjVersion) ); @@ -57,5 +48,5 @@ export default Service.extend({ } // since there can be multiple full versions that match the compact version, use the most recent one. return getLastVersion(filtered); - }, -}); + } +} diff --git a/app/services/project.js b/app/services/project.js index c22ec471d..0562d277a 100644 --- a/app/services/project.js +++ b/app/services/project.js @@ -1,17 +1,19 @@ import Service from '@ember/service'; +import { tracked } from '@glimmer/tracking'; -export default Service.extend({ - version: '0.0.0', +export default class ProjectService extends Service { + @tracked version = '0.0.0'; + @tracked urlVersion; setVersion(version) { - this.set('version', version); - }, + this.version = version; + } setUrlVersion(version) { - this.set('urlVersion', version); - }, + this.urlVersion = version; + } getUrlVersion() { return this.urlVersion; - }, -}); + } +} diff --git a/app/templates/404.hbs b/app/templates/404.hbs index 3079cda38..9590124be 100644 --- a/app/templates/404.hbs +++ b/app/templates/404.hbs @@ -3,7 +3,7 @@
No documented items
{{/if}} {{/each}} - {{/api-index}} -{{/api-index-filter}} +- {{#if field.inherited}} +
+ {{#if this.field.inherited}} Inherited from - - {{field.inheritedFrom}} {{field.file}}:{{field.line}} + + {{this.field.inheritedFrom}} {{this.field.file}}:{{this.field.line}} {{else}} Defined in - - {{field.file}}:{{field.line}} + + {{this.field.file}}:{{this.field.line}} {{/if}}
- {{#if field.since}} + {{#if this.field.since}}- Available since v{{field.since}} + Available since v{{this.field.since}}
{{/if}} - {{#if (and (eq field.static 1) (eq field.itemtype "method") hasImportExample)}} - {{import-example item=(concat "{ " field.name " }") package=field.class}} + {{#if (and (eq this.field.static 1) (eq this.field.itemtype "method") this.hasImportExample)}} +import {{item}} from '{{package}}'; |
+ import {{item}} from '{{this.package}}'; |
Try searching the deprecations guide.
@@ -11,22 +11,18 @@ {{else}} {{!-- Level 0 hierarchy --}} - {{#each-in _groupedResults as |lvl0section _lvl0results|}} + {{#each-in this._groupedResults as |lvl0section _lvl0results|}} {{!-- Dropdown header --}} - {{#search-input/dropdown-header}} +