diff --git a/.editorconfig b/.editorconfig index 219985c..c35a002 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,6 @@ root = true - [*] end_of_line = lf charset = utf-8 diff --git a/.eslintignore b/.eslintignore index 72df373..701947e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -13,6 +13,8 @@ # misc /coverage/ !.* +.*/ +.eslintcache # ember-try /.node_modules.ember-try/ diff --git a/.eslintrc.js b/.eslintrc.js index 1b1281d..c0d4aa3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,43 +1,59 @@ +'use strict'; + module.exports = { root: true, + parser: 'babel-eslint', parserOptions: { - ecmaVersion: 2017, - sourceType: 'module' + ecmaVersion: 2018, + sourceType: 'module', + ecmaFeatures: { + legacyDecorators: true, + }, }, - plugins: [ - 'ember' - ], + plugins: ['ember'], extends: [ 'eslint:recommended', - 'plugin:ember/recommended' + 'plugin:ember/recommended', + 'plugin:prettier/recommended', ], env: { - browser: true - }, - rules: { + browser: true, }, + rules: {}, overrides: [ // node files { files: [ 'fastboot-server.js', - '.eslintrc.js', - '.template-lintrc.js', - 'ember-cli-build.js', - 'testem.js', - 'blueprints/*/index.js', - 'config/**/*.js', - 'lib/*/index.js', - 'server/**/*.js' + './.eslintrc.js', + './.prettierrc.js', + './.template-lintrc.js', + './ember-cli-build.js', + './testem.js', + './blueprints/*/index.js', + './config/**/*.js', + './lib/*/index.js', + './server/**/*.js', ], parserOptions: { sourceType: 'script', - ecmaVersion: 2015 }, env: { browser: false, - node: true - } - } - ] + node: true, + }, + plugins: ['node'], + extends: ['plugin:node/recommended'], + rules: { + // this can be removed once the following is fixed + // https://github.com/mysticatea/eslint-plugin-node/issues/77 + 'node/no-unpublished-require': 'off', + }, + }, + { + // Test files: + files: ['tests/**/*-test.{js,ts}'], + extends: ['plugin:qunit/recommended'], + }, + ], }; diff --git a/.gitignore b/.gitignore index 9a1cc8c..ceb5eb2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ /.env* /.pnp* /.sass-cache +/.eslintcache /connect.lock /coverage/ /libpeerconnection.log diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..1e3e05f --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +use-node-version=20.18.1 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..9221655 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,21 @@ +# unconventional js +/blueprints/*/files/ +/vendor/ + +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ +/node_modules/ + +# misc +/coverage/ +!.* +.eslintcache + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/package.json.ember-try diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..534e6d3 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + singleQuote: true, +}; diff --git a/.template-lintrc.js b/.template-lintrc.js index b45e96f..f35f61c 100644 --- a/.template-lintrc.js +++ b/.template-lintrc.js @@ -1,5 +1,5 @@ 'use strict'; module.exports = { - extends: 'recommended' + extends: 'recommended', }; diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6a11b22..0000000 --- a/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: node_js -node_js: -- '10' -sudo: false -dist: trusty - -addons: - chrome: stable - -cache: - yarn: true - directories: - - $HOME/.npm - -env: - global: - # See https://git.io/vdao3 for details. - - JOBS=1 - - -install: - - npm install - -script: - - npm run lint:js - - npm test diff --git a/README.md b/README.md index 7145770..6fc3751 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,11 @@ To run the website locally: * `ember test` * `ember test --server` +### Linting + +* `npm run lint` +* `npm run lint:fix` + ### Building * `ember build` (development) diff --git a/app/adapters/application.js b/app/adapters/application.js new file mode 100644 index 0000000..733ffd8 --- /dev/null +++ b/app/adapters/application.js @@ -0,0 +1,14 @@ +/* eslint-disable ember/no-classic-classes, ember/use-ember-data-rfc-395-imports, prettier/prettier */ +import DS from 'ember-data'; + +export default DS.JSONAPIAdapter.extend({ + urlForFindAll(modelName) { + const path = this.pathForType(modelName); + return `/${path}/all.json`; + }, + + urlForFindRecord(id, modelName) { + const path = this.pathForType(modelName); + return `/${path}/${id}.json`; + } +}); diff --git a/app/app.js b/app/app.js index b3b2bd6..bd9d56c 100644 --- a/app/app.js +++ b/app/app.js @@ -1,14 +1,12 @@ import Application from '@ember/application'; -import Resolver from './resolver'; +import Resolver from 'ember-resolver'; import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; +import config from 'fastboot-website/config/environment'; -const App = Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver -}); +export default class App extends Application { + modulePrefix = config.modulePrefix; + podModulePrefix = config.podModulePrefix; + Resolver = Resolver; +} loadInitializers(App, config.modulePrefix); - -export default App; diff --git a/app/components/command-prompt/component.js b/app/components/command-prompt/component.js index daf432b..a2fb198 100644 --- a/app/components/command-prompt/component.js +++ b/app/components/command-prompt/component.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-classic-classes, ember/no-classic-components, ember/require-tagless-components, prettier/prettier */ import Component from '@ember/component'; export default Component.extend({ diff --git a/app/components/fastboot-logo/component.js b/app/components/fastboot-logo/component.js index ff7f250..171d627 100644 --- a/app/components/fastboot-logo/component.js +++ b/app/components/fastboot-logo/component.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-classic-classes, ember/no-classic-components, ember/require-tagless-components, prettier/prettier */ import Component from '@ember/component'; export default Component.extend({ diff --git a/app/components/main-hero-terminal/component.js b/app/components/main-hero-terminal/component.js index 3c58b3c..972f843 100644 --- a/app/components/main-hero-terminal/component.js +++ b/app/components/main-hero-terminal/component.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-classic-classes, ember/no-classic-components, ember/require-tagless-components, prettier/prettier */ import Component from '@ember/component'; export default Component.extend({ diff --git a/app/components/main-hero/component.js b/app/components/main-hero/component.js index 0848e90..5a3ed66 100644 --- a/app/components/main-hero/component.js +++ b/app/components/main-hero/component.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-classic-classes, ember/no-classic-components, ember/require-tagless-components, prettier/prettier */ import Component from '@ember/component'; export default Component.extend({ diff --git a/app/components/main-hero/meetup/template.hbs b/app/components/main-hero/meetup/template.hbs index 32ae2c2..1de61e8 100644 --- a/app/components/main-hero/meetup/template.hbs +++ b/app/components/main-hero/meetup/template.hbs @@ -1,3 +1,4 @@ +{{! template-lint-disable link-rel-noopener }}
{{fastboot-logo}} diff --git a/app/components/main-nav.js b/app/components/main-nav.js index 6a069d4..a06fb54 100644 --- a/app/components/main-nav.js +++ b/app/components/main-nav.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-classic-classes, ember/no-classic-components, ember/require-tagless-components, prettier/prettier */ import Component from '@ember/component'; export default Component.extend({ diff --git a/app/components/nav-bar.js b/app/components/nav-bar.js index c2deee8..929b8dc 100644 --- a/app/components/nav-bar.js +++ b/app/components/nav-bar.js @@ -1,3 +1,4 @@ +/* eslint-disable ember/no-classic-classes, ember/no-classic-components, ember/no-component-lifecycle-hooks, ember/no-jquery, ember/require-tagless-components, prettier/prettier */ import $ from 'jquery'; import Component from "@ember/component"; diff --git a/app/components/route-error.js b/app/components/route-error.js index 8940528..77ca9c1 100644 --- a/app/components/route-error.js +++ b/app/components/route-error.js @@ -1,25 +1,14 @@ +/* eslint-disable ember/no-classic-classes, ember/no-classic-components, ember/require-tagless-components */ import Component from '@ember/component'; import { computed } from '@ember/object'; -import markdownFiles from 'ember-fr-markdown-file/markdownFiles'; export default Component.extend({ - _parseObj(obj, dir) { - let prefix = dir || ''; - let result = []; - let that = this; - for (let prop in obj) { - let value = obj[prop]; - if (typeof value === 'object') { - result.push(that._parseObj(value, prop)); - } else { - if (prop !== 'intro') { - result.push(`${prefix}/${prop}`.replace(/^\//, '')); - } - } - } - return result; - }, - availablePages: computed(function() { - return [].concat.apply([], this._parseObj(markdownFiles)); - }) + availablePages: computed(function () { + return [ + 'quickstart', + 'docs/user-guide', + 'docs/deploying', + 'docs/addon-author-guide', + ]; + }), }); diff --git a/app/models/markdown.js b/app/models/markdown.js new file mode 100644 index 0000000..d400f37 --- /dev/null +++ b/app/models/markdown.js @@ -0,0 +1,7 @@ +/* eslint-disable ember/use-ember-data-rfc-395-imports, prettier/prettier */ +import DS from 'ember-data'; +const { Model, attr } = DS; + +export default Model.extend({ + content: attr() +}); diff --git a/app/resolver.js b/app/resolver.js deleted file mode 100644 index 2fb563d..0000000 --- a/app/resolver.js +++ /dev/null @@ -1,3 +0,0 @@ -import Resolver from 'ember-resolver'; - -export default Resolver; diff --git a/app/router.js b/app/router.js index 7245ef6..a856722 100644 --- a/app/router.js +++ b/app/router.js @@ -1,14 +1,16 @@ +/* eslint-disable ember/classic-decorator-no-classic-methods, ember/no-ember-super-in-es-classes, ember/no-get, ember/no-get-with-default, ember/no-incorrect-calls-with-inline-anonymous-functions, prettier/prettier */ import { get } from '@ember/object'; import { run } from '@ember/runloop'; import EmberRouter from '@ember/routing/router'; -import config from './config/environment'; -import { inject as injectService } from '@ember/service'; +import config from 'fastboot-website/config/environment'; +import { inject as service } from '@ember/service'; -const Router = EmberRouter.extend({ - location: config.locationType, - rootURL: config.rootURL, - metrics: injectService(), - fastboot: injectService(), +export default class Router extends EmberRouter { + location = config.locationType; + rootURL = config.rootURL; + + @service metrics; + @service fastboot; didTransition() { this._super(...arguments); @@ -16,7 +18,7 @@ const Router = EmberRouter.extend({ this._scrollPage(); this._trackPage(); } - }, + } _scrollPage() { if (this.fastboot.isFastBoot) { @@ -35,13 +37,13 @@ const Router = EmberRouter.extend({ } window.scrollTo(0, position); }); - }, + } _trackPage() { if (this.fastboot.isFastBoot) { return; } - + run.scheduleOnce('afterRender', this, () => { let page = document.location.pathname; let title = this.getWithDefault('currentRouteName', 'unknown'); @@ -49,10 +51,8 @@ const Router = EmberRouter.extend({ this.metrics.trackPage({ page, title }); }); } -}); +}; Router.map(function() { this.route('page', { path: '*path' }); }); - -export default Router; diff --git a/app/routes/application.js b/app/routes/application.js index c907276..0f1bd9e 100644 --- a/app/routes/application.js +++ b/app/routes/application.js @@ -1,9 +1,8 @@ +/* eslint-disable ember/no-classic-classes, prettier/prettier */ import Route from '@ember/routing/route'; -import { get } from '@ember/object'; -import markdownFiles from 'ember-fr-markdown-file/markdownFiles'; export default Route.extend({ model() { - return get(markdownFiles, 'intro'); + return this.store.find('markdown', 'intro'); } }); diff --git a/app/routes/page.js b/app/routes/page.js index 5441eb2..d00ef84 100644 --- a/app/routes/page.js +++ b/app/routes/page.js @@ -1,9 +1,12 @@ +/* eslint-disable ember/no-classic-classes */ import Route from '@ember/routing/route'; -import { get } from '@ember/object'; -import markdownFiles from 'ember-fr-markdown-file/markdownFiles'; export default Route.extend({ model(params) { - return get(markdownFiles, params.path.replace(/\//g, '.')) || null; - } + return this.store.findAll('markdown', { reload: true }).then((result) => { + return result.toArray().find((m) => { + return m.id === params.path; + }); + }); + }, }); diff --git a/app/styles/app.css b/app/styles/app.css index b290c9b..1e0004b 100644 --- a/app/styles/app.css +++ b/app/styles/app.css @@ -3,13 +3,11 @@ @import "base/reboot"; -@import "components/command-prompt"; @import "components/fastboot-logo"; @import "components/main-hero"; @import "components/main-hero-meetup"; @import "components/main-hero-terminal"; @import "components/main-nav"; -@import "components/syntax"; :root { --dark-gray: #111; diff --git a/app/styles/components/command-prompt.css b/app/styles/components/command-prompt.css deleted file mode 100644 index b2056d3..0000000 --- a/app/styles/components/command-prompt.css +++ /dev/null @@ -1,16 +0,0 @@ -.command-prompt, pre, code { - background: #EFF3F6; - border-radius: 0.25em; - font-family: var(--monospace-font-family); -} - -pre { - overflow: auto; - padding: 1rem; - white-space: pre; -} - -.command-prompt-body:before, .language-sh:before { - color: #C6D1DA; - content: '$ '; -} diff --git a/app/styles/components/syntax.css b/app/styles/components/syntax.css deleted file mode 100644 index 4959eef..0000000 --- a/app/styles/components/syntax.css +++ /dev/null @@ -1,69 +0,0 @@ -/* Base16 Atelier Lakeside Light - Theme */ -/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ -/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ - -/* Atelier-Lakeside Comment */ -.hljs-comment, -.hljs-quote { - color: #5a7b8c; -} - -/* Atelier-Lakeside Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d22d72; -} - -/* Atelier-Lakeside Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #935c25; -} - -/* Atelier-Lakeside Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #568c3b; -} - -/* Atelier-Lakeside Blue */ -.hljs-title, -.hljs-section { - color: #257fad; -} - -/* Atelier-Lakeside Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #6b6bb8; -} - -.hljs { - display: block; - overflow-x: auto; - background: #EFF3F6; - color: #516d7b; - padding: 0.5em; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} diff --git a/app/styles/old.css b/app/styles/old.css index 8755b59..930493a 100644 --- a/app/styles/old.css +++ b/app/styles/old.css @@ -71,12 +71,6 @@ img { max-width: 100%; } -pre { - max-width: 100%; - white-space: pre-wrap; - overflow-wrap: break-word; -} - .buttons button, .buttons a { display: flex; justify-content: center; diff --git a/app/templates/application.hbs b/app/templates/application.hbs index b832490..d0a8dbc 100644 --- a/app/templates/application.hbs +++ b/app/templates/application.hbs @@ -1 +1,2 @@ +{{! template-lint-disable no-curly-component-invocation no-implicit-this }} {{liquid-outlet}} diff --git a/app/templates/components/.gitkeep b/app/templates/components/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/app/templates/components/main-nav.hbs b/app/templates/components/main-nav.hbs index 2091816..f5ba74e 100644 --- a/app/templates/components/main-nav.hbs +++ b/app/templates/components/main-nav.hbs @@ -1,3 +1,4 @@ +{{! template-lint-disable no-curly-component-invocation no-implicit-this no-link-to-positional-params }} {{fastboot-logo}}