├── vendor └── .gitkeep ├── app ├── components │ ├── .gitkeep │ └── book-cover.js ├── helpers │ └── .gitkeep ├── models │ ├── .gitkeep │ ├── publishing-house.js │ ├── publisher.js │ ├── book.js │ └── author.js ├── routes │ ├── .gitkeep │ ├── author.js │ ├── application.js │ └── books.js ├── controllers │ ├── .gitkeep │ └── books.js ├── templates │ ├── components │ │ ├── .gitkeep │ │ └── book-cover.hbs │ ├── application.hbs │ ├── books.hbs │ └── author.hbs ├── resolver.js ├── router.js ├── app.js ├── adapters │ └── author.js ├── index.html └── styles │ └── app.css ├── tests ├── helpers │ └── .gitkeep ├── unit │ ├── .gitkeep │ ├── routes │ │ ├── books-test.js │ │ ├── author-test.js │ │ └── application-test.js │ ├── adapters │ │ └── author-test.js │ ├── controllers │ │ └── books-test.js │ └── models │ │ ├── book-test.js │ │ ├── author-test.js │ │ ├── publisher-test.js │ │ └── publishing-house-test.js ├── integration │ ├── .gitkeep │ └── components │ │ └── book-cover-test.js ├── test-helper.js └── index.html ├── public └── robots.txt ├── .gitignore ├── config ├── targets.js └── environment.js ├── testem.js ├── ember-cli-build.js ├── package.json └── README.md /vendor/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/helpers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/models/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/routes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/helpers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/controllers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/templates/components/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # http://www.robotstxt.org 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /app/resolver.js: -------------------------------------------------------------------------------- 1 | import Resolver from 'ember-resolver'; 2 | 3 | export default Resolver; 4 | -------------------------------------------------------------------------------- /app/models/publishing-house.js: -------------------------------------------------------------------------------- 1 | import Publisher from './publisher'; 2 | 3 | export default Publisher.extend(); -------------------------------------------------------------------------------- /app/templates/application.hbs: -------------------------------------------------------------------------------- 1 |

2 | {{link-to "Our Awesome Bookstore" 'books'}} 3 |

4 | 5 |
6 | {{outlet}} 7 |
-------------------------------------------------------------------------------- /app/routes/author.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | model(params) { 5 | return this.store.findRecord('author', params.author_id); 6 | } 7 | }); -------------------------------------------------------------------------------- /app/templates/books.hbs: -------------------------------------------------------------------------------- 1 | 6 | 7 | {{#if showAll}} 8 | 9 | {{/if}} -------------------------------------------------------------------------------- /app/routes/application.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | 5 | actions: { 6 | blurBackground(blur) { 7 | this.controllerFor('application').set('blur', blur); 8 | } 9 | } 10 | 11 | }); 12 | -------------------------------------------------------------------------------- /tests/test-helper.js: -------------------------------------------------------------------------------- 1 | import Application from '../app'; 2 | import config from '../config/environment'; 3 | import { setApplication } from '@ember/test-helpers'; 4 | import { start } from 'ember-qunit'; 5 | 6 | setApplication(Application.create(config.APP)); 7 | 8 | start(); 9 | -------------------------------------------------------------------------------- /app/models/publisher.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { hasMany } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | name: attr(), 7 | discount: attr('number'), 8 | published: hasMany('book') 9 | }); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | 7 | # dependencies 8 | /node_modules 9 | /bower_components 10 | 11 | # misc 12 | /.sass-cache 13 | /connect.lock 14 | /coverage/* 15 | /libpeerconnection.log 16 | npm-debug.log 17 | testem.log 18 | -------------------------------------------------------------------------------- /tests/unit/routes/books-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | 4 | module('Unit | Route | books', function(hooks) { 5 | setupTest(hooks); 6 | 7 | test('it exists', function(assert) { 8 | let route = this.owner.lookup('route:books'); 9 | assert.ok(route); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /tests/unit/routes/author-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | 4 | module('Unit | Route | author', function(hooks) { 5 | setupTest(hooks); 6 | 7 | test('it exists', function(assert) { 8 | let route = this.owner.lookup('route:author'); 9 | assert.ok(route); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /tests/unit/routes/application-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | 4 | module('Unit | Route | application', function(hooks) { 5 | setupTest(hooks); 6 | 7 | test('it exists', function(assert) { 8 | let route = this.owner.lookup('route:application'); 9 | assert.ok(route); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /app/models/book.js: -------------------------------------------------------------------------------- 1 | import Model from 'ember-data/model'; 2 | import attr from 'ember-data/attr'; 3 | import { belongsTo } from 'ember-data/relationships'; 4 | 5 | export default Model.extend({ 6 | title: attr(), 7 | price: attr('number'), 8 | author: belongsTo('author', { inverse: 'books' }), 9 | publisher: belongsTo('publisher', { polymorphic: true, inverse: 'published' }) 10 | }); -------------------------------------------------------------------------------- /config/targets.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const browsers = [ 4 | 'last 1 Chrome versions', 5 | 'last 1 Firefox versions', 6 | 'last 1 Safari versions' 7 | ]; 8 | 9 | const isCI = !!process.env.CI; 10 | const isProduction = process.env.EMBER_ENV === 'production'; 11 | 12 | if (isCI || isProduction) { 13 | browsers.push('ie 11'); 14 | } 15 | 16 | module.exports = { 17 | browsers 18 | }; 19 | -------------------------------------------------------------------------------- /app/models/author.js: -------------------------------------------------------------------------------- 1 | import Publisher from './publisher'; 2 | import attr from 'ember-data/attr'; 3 | import { hasMany } from 'ember-data/relationships'; 4 | import { on } from '@ember/object/evented'; 5 | 6 | export default Publisher.extend({ 7 | name: attr(), 8 | books: hasMany(), 9 | 10 | onDidLoad: on('didLoad', function() { 11 | this.set('loadedAt', new Date()); 12 | }) 13 | 14 | }); -------------------------------------------------------------------------------- /tests/unit/adapters/author-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | 4 | module('Unit | Adapter | author', function(hooks) { 5 | setupTest(hooks); 6 | 7 | // Replace this with your real tests. 8 | test('it exists', function(assert) { 9 | let adapter = this.owner.lookup('adapter:author'); 10 | assert.ok(adapter); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /app/router.js: -------------------------------------------------------------------------------- 1 | import EmberRouter from '@ember/routing/router'; 2 | import config from './config/environment'; 3 | 4 | const Router = EmberRouter.extend({ 5 | location: config.locationType, 6 | rootURL: config.rootURL 7 | }); 8 | 9 | Router.map(function() { 10 | this.route('books', { path: '/' }); 11 | this.route('author', { path: '/authors/:author_id' }); 12 | }); 13 | 14 | export default Router; 15 | -------------------------------------------------------------------------------- /tests/unit/controllers/books-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | 4 | module('Unit | Controller | books', function(hooks) { 5 | setupTest(hooks); 6 | 7 | // Replace this with your real tests. 8 | test('it exists', function(assert) { 9 | let controller = this.owner.lookup('controller:books'); 10 | assert.ok(controller); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /app/app.js: -------------------------------------------------------------------------------- 1 | import Application from '@ember/application'; 2 | import Resolver from './resolver'; 3 | import loadInitializers from 'ember-load-initializers'; 4 | import config from './config/environment'; 5 | 6 | const App = Application.extend({ 7 | modulePrefix: config.modulePrefix, 8 | podModulePrefix: config.podModulePrefix, 9 | Resolver 10 | }); 11 | 12 | loadInitializers(App, config.modulePrefix); 13 | 14 | export default App; 15 | -------------------------------------------------------------------------------- /app/controllers/books.js: -------------------------------------------------------------------------------- 1 | import Controller from '@ember/controller'; 2 | import { computed } from '@ember/object'; 3 | 4 | export default Controller.extend({ 5 | 6 | queryParams: ['limit'], 7 | limit: 5, 8 | 9 | total: computed('model.meta', function() { 10 | return this.get('model.meta').total; 11 | }), 12 | 13 | showAll: computed('total', 'model.[]', function() { 14 | return this.get('total') > this.get('model.length'); 15 | }) 16 | 17 | }); -------------------------------------------------------------------------------- /app/components/book-cover.js: -------------------------------------------------------------------------------- 1 | import Component from '@ember/component'; 2 | 3 | export default Component.extend({ 4 | 5 | actions: { 6 | 7 | open() { 8 | this.get('book').reload().then(() => { 9 | this.set('isShowingModal', true); 10 | this.get('blurBackground')(true); 11 | }); 12 | }, 13 | 14 | close() { 15 | this.set('isShowingModal', false); 16 | this.get('blurBackground')(false); 17 | } 18 | 19 | } 20 | 21 | }); 22 | -------------------------------------------------------------------------------- /tests/unit/models/book-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | import { run } from '@ember/runloop'; 4 | 5 | module('Unit | Model | book', function(hooks) { 6 | setupTest(hooks); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let store = this.owner.lookup('service:store'); 11 | let model = run(() => store.createRecord('book', {})); 12 | assert.ok(model); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /tests/unit/models/author-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | import { run } from '@ember/runloop'; 4 | 5 | module('Unit | Model | author', function(hooks) { 6 | setupTest(hooks); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let store = this.owner.lookup('service:store'); 11 | let model = run(() => store.createRecord('author', {})); 12 | assert.ok(model); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /app/routes/books.js: -------------------------------------------------------------------------------- 1 | import Route from '@ember/routing/route'; 2 | 3 | export default Route.extend({ 4 | 5 | queryParams: { 6 | limit: { 7 | refreshModel: true 8 | } 9 | }, 10 | 11 | model(params) { 12 | return this.store.query('book', params); 13 | }, 14 | 15 | actions: { 16 | 17 | showAll() { 18 | const total = this.controllerFor('books').get('total'); 19 | this.transitionTo({ queryParams: { limit: total }}); 20 | } 21 | 22 | } 23 | 24 | }); 25 | -------------------------------------------------------------------------------- /tests/unit/models/publisher-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | import { run } from '@ember/runloop'; 4 | 5 | module('Unit | Model | publisher', function(hooks) { 6 | setupTest(hooks); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let store = this.owner.lookup('service:store'); 11 | let model = run(() => store.createRecord('publisher', {})); 12 | assert.ok(model); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /tests/unit/models/publishing-house-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupTest } from 'ember-qunit'; 3 | import { run } from '@ember/runloop'; 4 | 5 | module('Unit | Model | publishing house', function(hooks) { 6 | setupTest(hooks); 7 | 8 | // Replace this with your real tests. 9 | test('it exists', function(assert) { 10 | let store = this.owner.lookup('service:store'); 11 | let model = run(() => store.createRecord('publishing-house', {})); 12 | assert.ok(model); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /app/adapters/author.js: -------------------------------------------------------------------------------- 1 | import JSONAPIAdapter from 'ember-data/adapters/json-api'; 2 | 3 | export default JSONAPIAdapter.extend({ 4 | 5 | shouldReloadRecord() { 6 | return false; 7 | }, 8 | 9 | shouldBackgroundReloadRecord(store, snapshot) { 10 | 11 | console.log("Calling shouldBackgroundReloadRecord"); 12 | const loadedAt = snapshot.record.get('loadedAt'); 13 | 14 | // if it was loaded more than an hour ago 15 | if (Date.now() - loadedAt > 3600000) { 16 | return true; 17 | } else { 18 | return false; 19 | } 20 | } 21 | 22 | }); 23 | -------------------------------------------------------------------------------- /testem.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | test_page: 'tests/index.html?hidepassed', 3 | disable_watching: true, 4 | launch_in_ci: [ 5 | 'Chrome' 6 | ], 7 | launch_in_dev: [ 8 | 'Chrome' 9 | ], 10 | browser_args: { 11 | Chrome: { 12 | mode: 'ci', 13 | args: [ 14 | // --no-sandbox is needed when running Chrome inside a container 15 | process.env.TRAVIS ? '--no-sandbox' : null, 16 | 17 | '--disable-gpu', 18 | '--headless', 19 | '--remote-debugging-port=0', 20 | '--window-size=1440,900' 21 | ].filter(Boolean) 22 | } 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /app/templates/author.hbs: -------------------------------------------------------------------------------- 1 |

{{model.name}}

2 | 3 | Biography: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 4 | 5 |

Published titles:

6 | -------------------------------------------------------------------------------- /app/templates/components/book-cover.hbs: -------------------------------------------------------------------------------- 1 |
  • 2 | {{book.title}}

    3 | by 4 | {{link-to book.author.name 'author' book.author.id class="author" }} 5 |
  • 6 | 7 | {{#if isShowingModal}} 8 | {{#modal-dialog onClose=(action 'close') clickOutsideToClose=true}} 9 | 10 | 23 | 24 | {{/modal-dialog}} 25 | {{/if}} -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Bookstore 7 | 8 | 9 | 10 | {{content-for "head"}} 11 | 12 | 13 | 14 | 15 | {{content-for "head-footer"}} 16 | 17 | 18 | {{content-for "body"}} 19 | 20 | 21 | 22 | 23 | {{content-for "body-footer"}} 24 | 25 | 26 | -------------------------------------------------------------------------------- /ember-cli-build.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const EmberApp = require('ember-cli/lib/broccoli/ember-app'); 4 | 5 | module.exports = function(defaults) { 6 | let app = new EmberApp(defaults, { 7 | // Add options here 8 | }); 9 | 10 | // Use `app.import` to add additional libraries to the generated 11 | // output files. 12 | // 13 | // If you need to use different assets in different 14 | // environments, specify an object as the first parameter. That 15 | // object's keys should be the environment name and the values 16 | // should be the asset to use in that environment. 17 | // 18 | // If the library that you are including contains AMD or ES6 19 | // modules that you would like to import into your application 20 | // please specify an object with the list of modules as keys 21 | // along with the exports of each module as its value. 22 | 23 | return app.toTree(); 24 | }; 25 | -------------------------------------------------------------------------------- /tests/integration/components/book-cover-test.js: -------------------------------------------------------------------------------- 1 | import { module, test } from 'qunit'; 2 | import { setupRenderingTest } from 'ember-qunit'; 3 | import { render } from '@ember/test-helpers'; 4 | import hbs from 'htmlbars-inline-precompile'; 5 | 6 | module('Integration | Component | book-cover', function(hooks) { 7 | setupRenderingTest(hooks); 8 | 9 | test('it renders', async function(assert) { 10 | // Set any properties with this.set('myProperty', 'value'); 11 | // Handle any actions with this.set('myAction', function(val) { ... }); 12 | 13 | await render(hbs`{{book-cover}}`); 14 | 15 | assert.equal(this.element.textContent.trim(), ''); 16 | 17 | // Template block usage: 18 | await render(hbs` 19 | {{#book-cover}} 20 | template block text 21 | {{/book-cover}} 22 | `); 23 | 24 | assert.equal(this.element.textContent.trim(), 'template block text'); 25 | }); 26 | }); 27 | -------------------------------------------------------------------------------- /tests/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Bookstore Tests 7 | 8 | 9 | 10 | {{content-for "head"}} 11 | {{content-for "test-head"}} 12 | 13 | 14 | 15 | 16 | 17 | {{content-for "head-footer"}} 18 | {{content-for "test-head-footer"}} 19 | 20 | 21 | {{content-for "body"}} 22 | {{content-for "test-body"}} 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {{content-for "body-footer"}} 31 | {{content-for "test-body-footer"}} 32 | 33 | 34 | -------------------------------------------------------------------------------- /config/environment.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function(environment) { 4 | let ENV = { 5 | modulePrefix: 'bookstore', 6 | environment, 7 | rootURL: '/', 8 | locationType: 'auto', 9 | EmberENV: { 10 | FEATURES: { 11 | // Here you can enable experimental features on an ember canary build 12 | // e.g. 'with-controller': true 13 | }, 14 | EXTEND_PROTOTYPES: { 15 | // Prevent Ember Data from overriding Date.parse. 16 | Date: false 17 | } 18 | }, 19 | 20 | APP: { 21 | // Here you can pass flags/options to your application instance 22 | // when it is created 23 | } 24 | }; 25 | 26 | if (environment === 'development') { 27 | // ENV.APP.LOG_RESOLVER = true; 28 | // ENV.APP.LOG_ACTIVE_GENERATION = true; 29 | // ENV.APP.LOG_TRANSITIONS = true; 30 | // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; 31 | // ENV.APP.LOG_VIEW_LOOKUPS = true; 32 | } 33 | 34 | if (environment === 'test') { 35 | // Testem prefers this... 36 | ENV.locationType = 'none'; 37 | 38 | // keep test console output quieter 39 | ENV.APP.LOG_ACTIVE_GENERATION = false; 40 | ENV.APP.LOG_VIEW_LOOKUPS = false; 41 | 42 | ENV.APP.rootElement = '#ember-testing'; 43 | ENV.APP.autoboot = false; 44 | } 45 | 46 | if (environment === 'production') { 47 | // here you can enable a production-specific feature 48 | } 49 | 50 | return ENV; 51 | }; 52 | -------------------------------------------------------------------------------- /app/styles/app.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: Courier, monospace; 3 | font-size: 1.2em; 4 | margin-left: 2em; 5 | } 6 | 7 | ul { 8 | margin: 0; 9 | padding: 0; 10 | list-style-type: none; 11 | } 12 | 13 | ul div { 14 | display: inline-block; 15 | vertical-align: top; 16 | height: 250px; 17 | width: 200px; 18 | text-align: center; 19 | padding: 0 1em 3em; 20 | } 21 | 22 | ul li { 23 | padding: 1em; 24 | border: 6px solid #AFAFAF; 25 | background: #E9E9E9; 26 | height: 90%; 27 | cursor: pointer; 28 | } 29 | 30 | a { 31 | text-decoration: none; 32 | color: inherit; 33 | } 34 | 35 | a.author { 36 | text-decoration: underline; 37 | color: #111; 38 | } 39 | 40 | .modal { 41 | width: 20em; 42 | height: 15em; 43 | position: fixed; 44 | top: 50%; 45 | left: 50%; 46 | margin-top: -7.5em; 47 | margin-left: -10em; 48 | padding: 1em; 49 | background-color: #f1c40f; 50 | border-radius: 5px; 51 | text-align: center; 52 | z-index: 11; /* 1px higher than the overlay layer */ 53 | opacity: 1 !important; 54 | -webkit-border-radius: 4px; 55 | -moz-border-radius: 4px; 56 | border-radius: 4px; 57 | -webkit-box-shadow: 0px 0px 5px 3px rgba(0,0,0,0.28); 58 | -moz-box-shadow: 0px 0px 5px 3px rgba(0,0,0,0.28); 59 | box-shadow: 0px 0px 5px 3px rgba(0,0,0,0.28); 60 | -webkit-transition: opacity 400ms ease-in; 61 | -moz-transition: opacity 400ms ease-in; 62 | transition: opacity 400ms ease-in; 63 | } 64 | 65 | .blur-background { 66 | z-index: -999; 67 | opacity: 0.3; 68 | pointer-events: none; 69 | filter: blur(3px); 70 | -webkit-filter: blur(3px); 71 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bookstore", 3 | "version": "0.0.0", 4 | "private": true, 5 | "description": "Small description for bookstore goes here", 6 | "license": "MIT", 7 | "author": "", 8 | "directories": { 9 | "doc": "doc", 10 | "test": "tests" 11 | }, 12 | "repository": "", 13 | "scripts": { 14 | "build": "ember build", 15 | "lint:js": "eslint ./*.js app config lib server tests", 16 | "start": "ember serve", 17 | "test": "ember test" 18 | }, 19 | "devDependencies": { 20 | "broccoli-asset-rev": "^2.4.5", 21 | "ember-ajax": "^3.0.0", 22 | "ember-cli": "~3.1.2", 23 | "ember-cli-app-version": "^3.0.0", 24 | "ember-cli-babel": "^6.6.0", 25 | "ember-cli-dependency-checker": "^2.0.0", 26 | "ember-cli-eslint": "^4.2.1", 27 | "ember-cli-htmlbars": "^2.0.1", 28 | "ember-cli-htmlbars-inline-precompile": "^1.0.0", 29 | "ember-cli-inject-live-reload": "^1.4.1", 30 | "ember-cli-qunit": "^4.1.1", 31 | "ember-cli-shims": "^1.2.0", 32 | "ember-cli-sri": "^2.1.0", 33 | "ember-cli-uglify": "^2.0.0", 34 | "ember-data": "~3.1.0", 35 | "ember-export-application-global": "^2.0.0", 36 | "ember-load-initializers": "^1.0.0", 37 | "ember-maybe-import-regenerator": "^0.1.6", 38 | "ember-modal-dialog": "^3.0.0-beta.0", 39 | "ember-resolver": "^4.0.0", 40 | "ember-route-action-helper": "^2.0.6", 41 | "ember-source": "~3.1.0", 42 | "ember-welcome-page": "^3.0.0", 43 | "eslint-plugin-ember": "^5.0.0", 44 | "loader.js": "^4.2.3" 45 | }, 46 | "engines": { 47 | "node": "^4.5 || 6.* || >= 7.*" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bookstore 2 | 3 | This README outlines the details of collaborating on this Ember application. 4 | A short introduction of this app could easily go here. 5 | 6 | ## Prerequisites 7 | 8 | You will need the following things properly installed on your computer. 9 | 10 | * [Git](https://git-scm.com/) 11 | * [Node.js](https://nodejs.org/) (with npm) 12 | * [Ember CLI](https://ember-cli.com/) 13 | * [Google Chrome](https://google.com/chrome/) 14 | 15 | ## Installation 16 | 17 | * `git clone ` this repository 18 | * `cd bookstore` 19 | * `npm install` 20 | 21 | ## Running / Development 22 | 23 | * `ember serve` 24 | * Visit your app at [http://localhost:4200](http://localhost:4200). 25 | * Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). 26 | 27 | ### Code Generators 28 | 29 | Make use of the many generators for code, try `ember help generate` for more details 30 | 31 | ### Running Tests 32 | 33 | * `ember test` 34 | * `ember test --server` 35 | 36 | ### Linting 37 | 38 | * `npm run lint:js` 39 | * `npm run lint:js -- --fix` 40 | 41 | ### Building 42 | 43 | * `ember build` (development) 44 | * `ember build --environment production` (production) 45 | 46 | ### Deploying 47 | 48 | Specify what it takes to deploy your app. 49 | 50 | ## Further Reading / Useful Links 51 | 52 | * [ember.js](https://emberjs.com/) 53 | * [ember-cli](https://ember-cli.com/) 54 | * Development Browser Extensions 55 | * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) 56 | * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) 57 | --------------------------------------------------------------------------------